#include "PhotonTelemetry.h" #include "../../Static.h" using namespace NSFastLED; PhotonTelemetry::PhotonTelemetry() : Task("PhotonTelemetry") {} void PhotonTelemetry::onConnected() { Log.info("Connecting photon telemetry..."); Particle.variable("frame", m_frameIdx); Particle.variable("brightness", m_currentBrightness); Particle.variable("fps", m_fps); Particle.variable("services", m_serviceList); Particle.variable("localip", m_localIP); m_online = true; } void PhotonTelemetry::loop() { m_frameIdx++; if (m_rgbPulseFrame == 1) { m_ledStatus.setActive(false); } else if (m_rgbPulseFrame > 0) { m_rgbPulseFrame--; } m_currentBrightness = NSFastLED::FastLED.getBrightness(); NSFastLED::FastLED.countFPS(); m_fps = NSFastLED::FastLED.getFPS(); if (m_online) { EVERY_N_SECONDS(30) { m_localIP = WiFi.localIP().toString(); char valueBuf[255]; snprintf(valueBuf, sizeof(valueBuf), "{\"fps\": %lu, \"localip\": \"%s\"}", m_fps, m_localIP.c_str()); Log.info("Heartbeat: %s", valueBuf); Particle.publish("renderbug/heartbeat", valueBuf); auto sched = MainLoop::instance()->scheduler; m_serviceList = String{}; for(auto task : sched.tasks) { m_serviceList.concat(task->name); m_serviceList.concat(':'); if (task->state == Task::Running) { m_serviceList.concat(1); } else { m_serviceList.concat(0); } m_serviceList.concat(','); } } } } void PhotonTelemetry::handleEvent(const InputEvent &evt) { Serial.flush(); if (evt.intent == InputEvent::NetworkStatus) { onConnected(); } if (evt.intent != InputEvent::None) { const char* sourceName; switch(evt.intent) { case InputEvent::PowerToggle: sourceName = "power-toggle"; break; case InputEvent::SetPower: sourceName = "set-power"; break; case InputEvent::PreviousPattern: sourceName = "previous-pattern"; break; case InputEvent::NextPattern: sourceName = "next-pattern"; break; case InputEvent::SetPattern: sourceName = "set-pattern"; break; case InputEvent::SetColor: sourceName = "set-color"; break; case InputEvent::Acceleration: sourceName = "acceleration"; break; case InputEvent::UserInput: sourceName = "user"; break; case InputEvent::SetBrightness: sourceName = "set-brightness"; break; case InputEvent::FirmwareUpdate: sourceName = "firmware-update"; break; case InputEvent::NetworkStatus: sourceName = "network-status"; break; case InputEvent::NetworkActivity: sourceName = "network-activity"; break; case InputEvent::StartThing: sourceName = "start-thing"; break; case InputEvent::StopThing: sourceName = "stop-thing"; break; case InputEvent::SetDisplayOffset: sourceName = "set-display-offset"; break; case InputEvent::SetDisplayLength: sourceName = "set-display-length"; break; case InputEvent::SaveConfigurationRequest: sourceName = "save-configuration"; break; default: sourceName = 0; break; } char valueBuf[255]; switch(evt.type) { case InputEvent::Null: snprintf(valueBuf, sizeof(valueBuf), "null");break; case InputEvent::Integer: snprintf(valueBuf, sizeof(valueBuf), "%d %02x", evt.asInt(), evt.asInt());break; case InputEvent::String: snprintf(valueBuf, sizeof(valueBuf), "\"%s\"", evt.asString());break; case InputEvent::Color: snprintf(valueBuf, sizeof(valueBuf), "[%d, %d, %d]", evt.asRGB().r, evt.asRGB().g, evt.asRGB().b);break; } char buf[255 * 2]; if (sourceName == 0) { snprintf(buf, sizeof(buf), "{\"intent\": %d, \"value\": %s}", evt.intent, valueBuf); } else { snprintf(buf, sizeof(buf), "{\"intent\": \"%s\", \"value\": %s}", sourceName, valueBuf); } if (m_online) { if (evt.intent != m_lastEvent.intent) { if (m_duplicateEvents > 0) { Log.info("Suppressed reporting %ld duplicate events.", m_duplicateEvents); } Log.info("Event: %s", buf); m_duplicateEvents = 0; m_lastEvent = evt; Particle.publish("renderbug/event", buf, PRIVATE); } else { m_duplicateEvents++; } } else { Log.info("[offline] Event: %s", buf); } if (evt.intent == InputEvent::SetColor) { NSFastLED::CRGB rgb {evt.asRGB()}; uint32_t color = (rgb.r << 16) + (rgb.g << 8) + (rgb.b << 0); m_ledStatus.setColor(color); m_ledStatus.setActive(true); m_rgbPulseFrame = 1000; } } } STATIC_ALLOC(PhotonTelemetry);