#include<YarrboardFramework.h>// Generated by gulp build process#include"index.html.gz.h"
#include"logo.png.gz.h"YarrboardAppyba;// Define GulpedFile structures for web assetsstaticconstGulpedFileindex_file={.data=index_html_gz,.length=index_html_gz_len,.sha256=index_html_gz_sha,.filename="index.html",.mimetype="text/html"};staticconstGulpedFilelogo_file={.data=logo_png_gz,.length=logo_png_gz_len,.sha256=logo_png_gz_sha,.filename="logo.png",.mimetype="image/png"};voidsetup(){// Set embedded web assetsyba.http.index=&index_file;yba.http.logo=&logo_file;// Configure board metadatayba.board_name="My Device";yba.default_hostname="mydevice";yba.firmware_version="1.0.0";yba.hardware_version="REV_A";yba.manufacturer="My Company";yba.hardware_url="https://github.com/myuser/myproject";yba.project_url="https://example.com/myproject";yba.project_name="My Project";// Initialize frameworkyba.setup();}voidloop(){yba.loop();}
Custom Controller
classMyController:publicBaseController{public:MyController(YarrboardApp&app):BaseController(app,"mycontroller"){}boolsetup()override{// Register protocol commands_app.protocol.registerCommand(GUEST,"my_command",this,&MyController::handleCommand);returntrue;}voidloop()override{// Controller main loop}voidgenerateUpdateHook(JsonVariantoutput)override{// Add real-time data to WebSocket updatesoutput["my_data"]=getValue();}boolloadConfigHook(JsonVariantconfig,char*error,size_tlen)override{// Load configuration from JSONsetting=config["setting"]|defaultValue;// Validate configurationif(setting<0){snprintf(error,len,"Invalid setting value: %d",setting);returnfalse;}returntrue;}voidgenerateConfigHook(JsonVariantconfig)override{// Serialize configuration to JSONconfig["setting"]=setting;}private:voidhandleCommand(JsonVariantConstinput,JsonVariantoutput,ProtocolContextcontext){// Handle protocol commandoutput["result"]=processCommand(input["param"]);// Access context information// context.mode - communication mode (WEBSOCKET, HTTP, SERIAL, MQTT)// context.role - user role (NOBODY, GUEST, ADMIN)// context.clientId - unique client identifier}intsetting;};// Register in main.cpp setup()MyControllermyController(yba);yba.registerController(myController);
Custom Channel
classMyChannel:publicBaseChannel{public:voidinit(uint8_tid)override{BaseChannel::init(id);// Hardware initialization (channels are numbered 1-N)}boolloadConfig(JsonVariantConstconfig,char*error,size_terr_size)override{if(!BaseChannel::loadConfig(config,error,err_size))returnfalse;pin=config["pin"]|-1;// Additional configurationreturntrue;}voidgenerateConfig(JsonVariantconfig)override{BaseChannel::generateConfig(config);config["pin"]=pin;}voidgenerateUpdate(JsonVariantoutput)override{output["value"]=readValue();}voidhaGenerateDiscovery(JsonVariantdoc,constchar*uuid,MQTTController*mqtt)override{// Populate discovery documentdoc["name"]=name;doc["state_topic"]="~/state";doc["device_class"]="sensor";doc["unique_id"]=ha_uuid;// Publish to Home Assistantmqtt->publishDiscovery("sensor",key,uuid,doc);}voidhaPublishState(MQTTController*mqtt)override{// Publish current state to Home AssistantJsonDocumentdoc;doc["value"]=readValue();mqtt->publishHA(key,"state",doc.as<JsonObject>());}private:intpin;intreadValue(){/* ... */}};// Use with ChannelControllerusingMyChannelController=ChannelController<MyChannel,8>;MyChannelControllermyChannels(yba,"mychannels");yba.registerController(myChannels);