Class BabelSimpleChainableLedsRGBDemo

java.lang.Object
pt.unl.fct.di.novasys.babel.core.GenericProtocol
pt.unl.fct.di.tardis.babel.iot.demos.BabelSimpleChainableLedsRGBDemo
All Implemented Interfaces:
BabelDemo

public class BabelSimpleChainableLedsRGBDemo extends pt.unl.fct.di.novasys.babel.core.GenericProtocol implements BabelDemo
Demo: the minimal way to drive a Grove chainable RGB LED strip in the RGB colour model. Every LED in the chain is set to the same colour, which sweeps smoothly around the rainbow over time.

This is the stripped-down counterpart of BabelChainableLedsRGBDemo. Where the fuller demo keeps a per-LED colour buffer and pushes the whole strip in one batched request, this one carries no per-LED state: on each tick it computes one colour and sends a separate SetChainableLEDColorRGBRequest for every LED position. Read this first to see the bare register-then-drive loop, then read the fuller demo to see the batched variant.

Devices & control protocols used. One Grove chainable RGB LED strip (DeviceType.GROVE_CHAINABLE_RGB), driven through the DigitalOutputControlProtocol (protocol id 2300).

The teaching point. The app never touches Pi4J or GPIO. It registers the device, keeps the returned DeviceHandle, and drives the strip purely by sending Babel requests; the control protocol does the GPIO bit-banging.

To run: java -jar <jar> simpleLedsRGB (see Main.java).

Configuration. The strip length is read from the rgb.led.count property (via DigitalOutputControlProtocol.RGB_LED_COUNT, default 1) and the GPIO data line from led.line (default 24) — both in paradigmshift.config.

Based on IoT-control demos originally developed at NOVA FCT for the TaRDIS project; provided and evolved independently by ParadigmShift.

  • Nested Class Summary

    Nested classes/interfaces inherited from class pt.unl.fct.di.novasys.babel.core.GenericProtocol

    pt.unl.fct.di.novasys.babel.core.GenericProtocol.ProtocolMetricsBabelMetrics
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    Config key naming the GPIO data line the LED strip is wired to.
    static final String
    Default GPIO line (BCM 24) — coexists with a seated LoRa HAT.
    static final String
    Human-readable name we register the strip under, then verify in the reply.

    Fields inherited from class pt.unl.fct.di.novasys.babel.core.GenericProtocol

    babel, babelSecurity

    Fields inherited from interface pt.unl.fct.di.tardis.babel.iot.demos.BabelDemo

    PROTO_ID, PROTO_NAME
  • Constructor Summary

    Constructors
    Constructor
    Description
    Sets the protocol identity shared by all demos (BabelDemo.PROTO_NAME / BabelDemo.PROTO_ID).
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Entry point for this demo (called from Main).
    void
    handleDemoTimer(DemoTimer t, long time)
    Periodic-timer handler: each tick simply advances the colour by repainting the strip.
    void
    handleRegisterIoTDeviceReply(pt.unl.fct.di.tardis.babel.iot.api.replies.RegisterIoTDeviceReply rep, short protocolId)
    Reply handler for the device registration.
    void
    Wires this protocol's event handlers and starts device registration.

    Methods inherited from class pt.unl.fct.di.novasys.babel.core.GenericProtocol

    addSecret, addSecret, addSecret, addSecret, cancelTimer, closeConnection, closeConnection, closeConnection, closeConnection, closeConnection, closeConnection, createChannel, createSecureChannel, createSecureChannel, createSecureChannel, createSecureChannelWithAliases, createSecureChannelWithAliases, createSecureChannelWithIdentities, createSecureChannelWithIdentities, createSecureChannelWithProtoIdentities, enableGenericMetrics, generateIdentity, generateIdentity, generateIdentity, generateIdentity, generateIdentity, generateIdentity, generateIdentity, generateSecret, generateSecret, generateSecret, generateSecret, generateSecretFromPassword, generateSecretFromPassword, generateSecretFromPassword, generateSecretFromPassword, getChannelOrThrow, getDefaultChannel, getDefaultProtoIdentity, getDefaultProtoIdentityCrypt, getDefaultProtoSecret, getMillisSinceBabelStart, getOrGenerateDefaultProtoIdentity, getProtoId, getProtoName, hasProtocolThreadStarted, openConnection, openConnection, openConnection, openConnection, registerChannelEventHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageHandler, registerMessageSerializer, registerMetric, registerReplyHandler, registerRequestHandler, registerSharedChannel, registerTimerHandler, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendMessage, sendReply, sendRequest, setDefaultChannel, setDefaultProtoIdentity, setDefaultProtoIdentity, setDefaultProtoSecret, setupPeriodicTimer, setupTimer, startEventThread, subscribeNotification, triggerNotification, unsubscribeNotification

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • LED_PORT

      public static final String LED_PORT
      Config key naming the GPIO data line the LED strip is wired to.
      See Also:
    • LED_PORT_DEFAULT

      public static final String LED_PORT_DEFAULT
      Default GPIO line (BCM 24) — coexists with a seated LoRa HAT.
      See Also:
    • ledAlias

      public static final String ledAlias
      Human-readable name we register the strip under, then verify in the reply.
      See Also:
  • Constructor Details

  • Method Details

    • init

      public void init(Properties props) throws pt.unl.fct.di.novasys.babel.exceptions.HandlerRegistrationException, IOException
      Wires this protocol's event handlers and starts device registration.

      The reply and timer handlers are registered before the request is sent, so the RegisterIoTDeviceReply cannot arrive before its handler is in place. We then ask the DigitalOutputControlProtocol to register a chainable RGB strip on deviceLine; the handle comes back asynchronously in handleRegisterIoTDeviceReply(pt.unl.fct.di.tardis.babel.iot.api.replies.RegisterIoTDeviceReply, short).

      Specified by:
      init in class pt.unl.fct.di.novasys.babel.core.GenericProtocol
      Throws:
      pt.unl.fct.di.novasys.babel.exceptions.HandlerRegistrationException
      IOException
    • handleDemoTimer

      public void handleDemoTimer(DemoTimer t, long time)
      Periodic-timer handler: each tick simply advances the colour by repainting the strip. Babel calls this on its event loop once the timer is armed in handleRegisterIoTDeviceReply(pt.unl.fct.di.tardis.babel.iot.api.replies.RegisterIoTDeviceReply, short).
    • handleRegisterIoTDeviceReply

      public void handleRegisterIoTDeviceReply(pt.unl.fct.di.tardis.babel.iot.api.replies.RegisterIoTDeviceReply rep, short protocolId)
      Reply handler for the device registration. Babel routes the RegisterIoTDeviceReply here once the control protocol has claimed the hardware.

      The pattern: check RegisterIoTDeviceReply.isSuccessful(); on failure, bail out. On success, keep the DeviceHandle (our only reference to the strip), paint an initial frame, and arm the periodic timer that drives the colour sweep. The alias check guards against a mismatched reply.

    • execute

      public void execute() throws Exception
      Entry point for this demo (called from Main). Bootstraps Babel: grab the Babel singleton, load paradigmshift.config, instantiate the one control protocol this demo needs (DigitalOutputControlProtocol), register it plus this demo, init them in dependency order (control protocol first so its handlers exist before we send to it), then start the event loop.
      Specified by:
      execute in interface BabelDemo
      Throws:
      Exception