| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library.
 -    Copyright (c) 2016 - ROLI Ltd.
 - 
 -    Permission is granted to use this software under the terms of the ISC license
 -    http://www.isc.org/downloads/software-support-policy/isc-license/
 - 
 -    Permission to use, copy, modify, and/or distribute this software for any
 -    purpose with or without fee is hereby granted, provided that the above
 -    copyright notice and this permission notice appear in all copies.
 - 
 -    THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
 -    TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 -    FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
 -    OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
 -    USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 -    TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 -    OF THIS SOFTWARE.
 - 
 -    -----------------------------------------------------------------------------
 - 
 -    To release a closed-source product which uses other parts of JUCE not
 -    licensed under the ISC terms, commercial licenses are available: visit
 -    www.juce.com for more information.
 - 
 -   ==============================================================================
 - */
 - 
 - 
 - /** This value is incremented when the format of the API changes in a way which
 -     breaks compatibility.
 - */
 - static constexpr uint32 currentProtocolVersion = 1;
 - 
 - using ProtocolVersion = IntegerWithBitSize<8>;
 - 
 - //==============================================================================
 - /** A timestamp for a packet, in milliseconds since device boot-up */
 - using PacketTimestamp = IntegerWithBitSize<32>;
 - 
 - /** This relative timestamp is for use inside a packet, and it represents a
 -     number of milliseconds that should be added to the packet's timestamp.
 - */
 - using PacketTimestampOffset = IntegerWithBitSize<5>;
 - 
 - 
 - //==============================================================================
 - /** Messages that a device may send to the host. */
 - enum class MessageFromDevice
 - {
 -     deviceTopology          = 0x01,
 -     packetACK               = 0x02,
 -     firmwareUpdateACK       = 0x03,
 - 
 -     touchStart              = 0x10,
 -     touchMove               = 0x11,
 -     touchEnd                = 0x12,
 - 
 -     touchStartWithVelocity  = 0x13,
 -     touchMoveWithVelocity   = 0x14,
 -     touchEndWithVelocity    = 0x15,
 - 
 -     controlButtonDown       = 0x20,
 -     controlButtonUp         = 0x21,
 - 
 -     programEventMessage     = 0x28,
 - 
 -     logMessage              = 0x30
 - };
 - 
 - /** Messages that the host may send to a device. */
 - enum class MessageFromHost
 - {
 -     deviceCommandMessage    = 0x01,
 -     sharedDataChange        = 0x02,
 -     programEventMessage     = 0x03,
 -     firmwareUpdatePacket    = 0x04
 - };
 - 
 - 
 - /** This is the first item in a BLOCKS message, identifying the message type. */
 - using MessageType = IntegerWithBitSize<7>;
 - 
 - //==============================================================================
 - /** This is a type of index identifier used to refer to a block within a group.
 -     It refers to the index of a device in the list of devices that was most recently
 -     sent via a topology change message
 -     (It's not a global UID for a block unit).
 -     NB: to send a message to all devices, pass the getDeviceIndexForBroadcast() value.
 - */
 - using TopologyIndex     = uint8;
 - 
 - static constexpr int topologyIndexBits = 7;
 - 
 - /** Use this value as the index if you want a message to be sent to all devices in
 -     the group.
 - */
 - static constexpr TopologyIndex topologyIndexForBroadcast = 63;
 - 
 - using DeviceCount       = IntegerWithBitSize<7>;
 - using ConnectionCount   = IntegerWithBitSize<8>;
 - 
 - //==============================================================================
 - /** Battery charge level. */
 - using BatteryLevel      = IntegerWithBitSize<5>;
 - 
 - /** Battery charger connection flag. */
 - using BatteryCharging   = IntegerWithBitSize<1>;
 - 
 - //==============================================================================
 - /** ConnectorPort is an index, starting at 0 for the leftmost port on the
 -     top edge, and going clockwise.
 - */
 - using ConnectorPort = IntegerWithBitSize<5>;
 - 
 - //==============================================================================
 - struct BlockSerialNumber
 - {
 -     uint8 serial[16];
 - 
 -     bool isValid() const noexcept
 -     {
 -         for (auto c : serial)
 -             if (c == 0)
 -                 return false;
 - 
 -         return isAnyControlBlock() || isPadBlock();
 -     }
 - 
 -     bool isPadBlock() const noexcept            { return hasPrefix ("LPB"); }
 -     bool isLiveBlock() const noexcept           { return hasPrefix ("LIC"); }
 -     bool isLoopBlock() const noexcept           { return hasPrefix ("LOC"); }
 -     bool isDevCtrlBlock() const noexcept        { return hasPrefix ("DCB"); }
 - 
 -     bool isAnyControlBlock() const noexcept     { return isLiveBlock() || isLoopBlock() || isDevCtrlBlock(); }
 - 
 -     bool hasPrefix (const char* prefix) const noexcept  { return memcmp (serial, prefix, 3) == 0; }
 - };
 - 
 - struct DeviceStatus
 - {
 -     BlockSerialNumber serialNumber;
 -     TopologyIndex index;
 -     BatteryLevel batteryLevel;
 -     BatteryCharging batteryCharging;
 - };
 - 
 - struct DeviceConnection
 - {
 -     TopologyIndex device1, device2;
 -     ConnectorPort port1, port2;
 - };
 - 
 - 
 - //==============================================================================
 - /** The coordinates of a touch. */
 - struct TouchPosition
 - {
 -     using Xcoord = IntegerWithBitSize<12>;
 -     using Ycoord = IntegerWithBitSize<12>;
 -     using Zcoord = IntegerWithBitSize<8>;
 - 
 -     Xcoord x;
 -     Ycoord y;
 -     Zcoord z;
 - 
 -     enum { bits = Xcoord::bits + Ycoord::bits + Zcoord::bits };
 - };
 - 
 - /** The velocities for each dimension of a touch. */
 - struct TouchVelocity
 - {
 -     using VXcoord = IntegerWithBitSize<8>;
 -     using VYcoord = IntegerWithBitSize<8>;
 -     using VZcoord = IntegerWithBitSize<8>;
 - 
 -     VXcoord vx;
 -     VYcoord vy;
 -     VZcoord vz;
 - 
 -     enum { bits = VXcoord::bits + VYcoord::bits + VZcoord::bits };
 - };
 - 
 - /** The index of a touch, i.e. finger number. */
 - using TouchIndex = IntegerWithBitSize<5>;
 - 
 - using PacketCounter = IntegerWithBitSize<10>;
 - 
 - //==============================================================================
 - enum DeviceCommands
 - {
 -     beginAPIMode                = 0x00,
 -     requestTopologyMessage      = 0x01,
 -     endAPIMode                  = 0x02,
 -     ping                        = 0x03,
 -     debugMode                   = 0x04,
 -     saveProgramAsDefault        = 0x05
 - };
 - 
 - using DeviceCommand = IntegerWithBitSize<9>;
 - 
 - //==============================================================================
 - /** An ID for a control-block button type */
 - using ControlButtonID = IntegerWithBitSize<12>;
 - 
 - //==============================================================================
 - using RotaryDialIndex = IntegerWithBitSize<7>;
 - using RotaryDialAngle = IntegerWithBitSize<14>;
 - using RotaryDialDelta = IntegerWithBitSize<14>;
 - 
 - //==============================================================================
 - enum DataChangeCommands
 - {
 -     endOfPacket                 = 0,
 -     endOfChanges                = 1,
 -     skipBytesFew                = 2,
 -     skipBytesMany               = 3,
 -     setSequenceOfBytes          = 4,
 -     setFewBytesWithValue        = 5,
 -     setFewBytesWithLastValue    = 6,
 -     setManyBytesWithValue       = 7
 - };
 - 
 - using PacketIndex            = IntegerWithBitSize<16>;
 - using DataChangeCommand      = IntegerWithBitSize<3>;
 - using ByteCountFew           = IntegerWithBitSize<4>;
 - using ByteCountMany          = IntegerWithBitSize<8>;
 - using ByteValue              = IntegerWithBitSize<8>;
 - using ByteSequenceContinues  = IntegerWithBitSize<1>;
 - 
 - using FirmwareUpdateACKCode    = IntegerWithBitSize<7>;
 - using FirmwareUpdatePacketSize = IntegerWithBitSize<7>;
 - 
 - static constexpr uint32 numProgramMessageInts = 3;
 - 
 - static constexpr uint32 apiModeHostPingTimeoutMs = 5000;
 - 
 - static constexpr uint32 padBlockProgramAndHeapSize = 7200;
 - static constexpr uint32 padBlockStackSize = 800;
 - 
 - static constexpr uint32 controlBlockProgramAndHeapSize = 3000;
 - static constexpr uint32 controlBlockStackSize = 800;
 - 
 - 
 - //==============================================================================
 - /** Contains the number of bits required to encode various items in the packets */
 - enum BitSizes
 - {
 -     topologyMessageHeader    = MessageType::bits + ProtocolVersion::bits + DeviceCount::bits + ConnectionCount::bits,
 -     topologyDeviceInfo       = sizeof (BlockSerialNumber) * 7 + BatteryLevel::bits + BatteryCharging::bits,
 -     topologyConnectionInfo   = topologyIndexBits + ConnectorPort::bits + topologyIndexBits + ConnectorPort::bits,
 - 
 -     typeDeviceAndTime        = MessageType::bits + PacketTimestampOffset::bits,
 - 
 -     touchMessage             = typeDeviceAndTime + TouchIndex::bits + TouchPosition::bits,
 -     touchMessageWithVelocity = touchMessage + TouchVelocity::bits,
 - 
 -     programEventMessage      = MessageType::bits + 32 * numProgramMessageInts,
 -     packetACK                = MessageType::bits + PacketCounter::bits,
 - 
 -     firmwareUpdateACK        = MessageType::bits + FirmwareUpdateACKCode::bits,
 - 
 -     controlButtonMessage     = typeDeviceAndTime + ControlButtonID::bits,
 - };
 - 
 - //==============================================================================
 - // These are the littlefoot functions provided for use in BLOCKS programs
 - static constexpr const char* ledProgramLittleFootFunctions[] =
 - {
 -     "min/iii",
 -     "min/fff",
 -     "max/iii",
 -     "max/fff",
 -     "clamp/iiii",
 -     "clamp/ffff",
 -     "abs/ii",
 -     "abs/ff",
 -     "map/ffffff",
 -     "map/ffff",
 -     "mod/iii",
 -     "getRandomFloat/f",
 -     "getRandomInt/ii",
 -     "getMillisecondCounter/i",
 -     "getFirmwareVersion/i",
 -     "log/vi",
 -     "logHex/vi",
 -     "getTimeInCurrentFunctionCall/i",
 -     "getBatteryLevel/f",
 -     "isBatteryCharging/b",
 -     "isMasterBlock/b",
 -     "isConnectedToHost/b",
 -     "setStatusOverlayActive/vb",
 -     "getNumBlocksInTopology/i",
 -     "getBlockIDForIndex/ii",
 -     "getBlockIDOnPort/ii",
 -     "getPortToMaster/i",
 -     "getBlockTypeForID/ii",
 -     "sendMessageToBlock/viiii",
 -     "sendMessageToHost/viii",
 -     "makeARGB/iiiii",
 -     "blendARGB/iii",
 -     "fillPixel/viii",
 -     "blendPixel/viii",
 -     "fillRect/viiiii",
 -     "blendRect/viiiii",
 -     "blendGradientRect/viiiiiiii",
 -     "addPressurePoint/vifff",
 -     "drawPressureMap/v",
 -     "fadePressureMap/v",
 -     "drawNumber/viiii",
 -     "clearDisplay/v",
 -     "clearDisplay/vi",
 -     "sendMIDI/vi",
 -     "sendMIDI/vii",
 -     "sendMIDI/viii",
 -     "sendNoteOn/viii",
 -     "sendNoteOff/viii",
 -     "sendAftertouch/viii",
 -     "sendCC/viii",
 -     "sendPitchBend/vii",
 -     "sendChannelPressure/vii",
 -     "setChannelRange/vbii",
 -     "assignChannel/ii",
 -     "deassignChannel/vii",
 -     "getControlChannel/i",
 -     "useMPEDuplicateFilter/vb",
 -     nullptr
 - };
 
 
  |