A TypeScript package for handling rich application-level messages for the Brilliant Labs Frame, including sprites, text, audio, IMU data, and photos.
Frame SDK documentation | GitHub Repo | API Docs | Live Examples
npm install frame-msg
import { FrameMsg, StdLua, TxCaptureSettings, RxPhoto } from 'frame-msg';
import frameApp from './lua/camera_frame_app.lua?raw';
// Take a photo using the Frame camera and display it
export async function run() {
const frame = new FrameMsg();
try {
const deviceId = await frame.connect();
// send the std lua files to Frame
await frame.uploadStdLuaLibs([StdLua.DataMin, StdLua.CameraMin]);
// Send the main lua application from this project to Frame that will run the app
await frame.uploadFrameApp(frameApp);
frame.attachPrintResponseHandler(console.log);
// "require" the main frame_app lua file to run it, and block until it has started.
// It signals that it is ready by sending something on the string response channel.
await frame.startFrameApp();
// hook up the RxPhoto receiver
const rxPhoto = new RxPhoto({});
const photoQueue = await rxPhoto.attach(frame);
// give Frame some time for the autoexposure to settle
await new Promise(resolve => setTimeout(resolve, 5000));
// Request the photo by sending a TxCaptureSettings message
await frame.sendMessage(0x0d, new TxCaptureSettings({}).pack());
const jpegBytes = await photoQueue.get();
// display the image on the web page
const img = document.createElement('img');
img.src = URL.createObjectURL(new Blob([jpegBytes], { type: 'image/jpeg' }));
document.body.appendChild(img);
// stop the photo listener and clean up its resources
rxPhoto.detach(frame);
frame.detachPrintResponseHandler()
// break out of the frame app loop and reboot Frame
await frame.stopFrameApp()
}
catch (error) {
console.error("Error:", error);
}
finally {
// Ensure the Frame is disconnected in case of an error
try {
await frame.disconnect();
console.log("Disconnected from Frame.");
} catch (disconnectError) {
console.error("Error during disconnection:", disconnectError);
}
}
};