Rob Meades / CIoT_MessagingCommon
Committer:
RobMeades
Date:
Fri May 22 11:41:38 2015 +0000
Revision:
0:5c46cb3be899
Initial commit of CIoT message protocol, used for water meter demo demonstrations, to mbed cloud.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:5c46cb3be899 1 /* C027N/water-meter interface for Water Meter Demo
RobMeades 0:5c46cb3be899 2 *
RobMeades 0:5c46cb3be899 3 * Copyright (C) u-blox Melbourn Ltd
RobMeades 0:5c46cb3be899 4 * u-blox Melbourn Ltd, Melbourn, UK
RobMeades 0:5c46cb3be899 5 *
RobMeades 0:5c46cb3be899 6 * All rights reserved.
RobMeades 0:5c46cb3be899 7 *
RobMeades 0:5c46cb3be899 8 * This source file is the sole property of u-blox Melbourn Ltd.
RobMeades 0:5c46cb3be899 9 * Reproduction or utilization of this source in whole or part is
RobMeades 0:5c46cb3be899 10 * forbidden without the written consent of u-blox Melbourn Ltd.
RobMeades 0:5c46cb3be899 11 */
RobMeades 0:5c46cb3be899 12
RobMeades 0:5c46cb3be899 13 /**
RobMeades 0:5c46cb3be899 14 * @file iot_meter_msg_handler.cpp
RobMeades 0:5c46cb3be899 15 * This file implements the API to the C027N/water-meter device
RobMeades 0:5c46cb3be899 16 * for the MWC demo 2015.
RobMeades 0:5c46cb3be899 17 */
RobMeades 0:5c46cb3be899 18
RobMeades 0:5c46cb3be899 19 #include <stdint.h>
RobMeades 0:5c46cb3be899 20 #include <stdio.h>
RobMeades 0:5c46cb3be899 21 #include <stdarg.h> // for va_...
RobMeades 0:5c46cb3be899 22 #include <string.h> // for memcpy()
RobMeades 0:5c46cb3be899 23 #include <IotMeterApi.hpp>
RobMeades 0:5c46cb3be899 24
RobMeades 0:5c46cb3be899 25 #ifdef DEBUG
RobMeades 0:5c46cb3be899 26 #define MESSAGE_CODEC_LOGMSG(...) MessageCodec::logMsg(__VA_ARGS__)
RobMeades 0:5c46cb3be899 27 #else
RobMeades 0:5c46cb3be899 28 #define MESSAGE_CODEC_LOGMSG(...)
RobMeades 0:5c46cb3be899 29 #endif
RobMeades 0:5c46cb3be899 30
RobMeades 0:5c46cb3be899 31 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 32 // GENERAL COMPILE-TIME CONSTANTS
RobMeades 0:5c46cb3be899 33 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 34
RobMeades 0:5c46cb3be899 35 /// The max size of a debug message (including terminator)
RobMeades 0:5c46cb3be899 36 #define MAX_DEBUG_MESSAGE_LEN 128
RobMeades 0:5c46cb3be899 37
RobMeades 0:5c46cb3be899 38 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 39 // PRIVATE VARIABLES
RobMeades 0:5c46cb3be899 40 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 41
RobMeades 0:5c46cb3be899 42 void (*MessageCodec::mp_guiPrintToConsole) (const char*) = NULL;
RobMeades 0:5c46cb3be899 43
RobMeades 0:5c46cb3be899 44 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 45 // ON-AIR MESSAGE IDs
RobMeades 0:5c46cb3be899 46 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 47
RobMeades 0:5c46cb3be899 48 /// The message IDs in the downlink direction (i.e. to the
RobMeades 0:5c46cb3be899 49 // C027/water-meter device). Note that 'over the air' these
RobMeades 0:5c46cb3be899 50 // are cast into an uint8_t.
RobMeades 0:5c46cb3be899 51 typedef enum MsgIdDlTag_t
RobMeades 0:5c46cb3be899 52 {
RobMeades 0:5c46cb3be899 53 REBOOT_REQ_DL_MSG, //!< Reboot the C027N/water-meter
RobMeades 0:5c46cb3be899 54 //! device.
RobMeades 0:5c46cb3be899 55 SERIAL_NUMBER_GET_REQ_DL_MSG, //!< Get the serial number of the
RobMeades 0:5c46cb3be899 56 //! water-meter.
RobMeades 0:5c46cb3be899 57 READING_INTERVAL_SET_REQ_DL_MSG, //!< Set the rate at which readings
RobMeades 0:5c46cb3be899 58 //! are returned by the C027N/water-meter
RobMeades 0:5c46cb3be899 59 //! device.
RobMeades 0:5c46cb3be899 60 READING_INTERVAL_GET_REQ_DL_MSG, //!< Get the rate at which readings
RobMeades 0:5c46cb3be899 61 //! are returned by the C027N/water-meter
RobMeades 0:5c46cb3be899 62 //! device.
RobMeades 0:5c46cb3be899 63 GPIO_SET_REQ_DL_MSG, //!< Set the state of a GPIO on the
RobMeades 0:5c46cb3be899 64 //! C027N board.
RobMeades 0:5c46cb3be899 65 GPIO_GET_REQ_DL_MSG, //!< Get the state of a GPIO on the
RobMeades 0:5c46cb3be899 66 //! C027N board.
RobMeades 0:5c46cb3be899 67 LED_SET_REQ_DL_MSG, //!< Set the steady state of the red
RobMeades 0:5c46cb3be899 68 //! LED on the C027 board.
RobMeades 0:5c46cb3be899 69 LED_GET_REQ_DL_MSG, //!< Get the steady state of the red
RobMeades 0:5c46cb3be899 70 //! LED on the C027 board.
RobMeades 0:5c46cb3be899 71 FLASH_SET_REQ_DL_MSG, //!< Set the LED on the C027/water-meter
RobMeades 0:5c46cb3be899 72 //! device to flash when a reading is
RobMeades 0:5c46cb3be899 73 //! being sent (or not).
RobMeades 0:5c46cb3be899 74 FLASH_GET_REQ_DL_MSG, //!< Get whether the LED on the C027/
RobMeades 0:5c46cb3be899 75 //! flashes when a mesage is
RobMeades 0:5c46cb3be899 76 //! being sent/received (or not).
RobMeades 0:5c46cb3be899 77 MAX_NUM_DL_MSGS //!< The maximum number of downlink
RobMeades 0:5c46cb3be899 78 //! messages.
RobMeades 0:5c46cb3be899 79 } MsgIdDl_t;
RobMeades 0:5c46cb3be899 80
RobMeades 0:5c46cb3be899 81 /// The message IDs in the uplink direction (i.e. from the
RobMeades 0:5c46cb3be899 82 // C027N/water-meter device). Note that 'over the air' these are
RobMeades 0:5c46cb3be899 83 // cast into an uint8_t.
RobMeades 0:5c46cb3be899 84 typedef enum MsgIdUlTag_t
RobMeades 0:5c46cb3be899 85 {
RobMeades 0:5c46cb3be899 86 INIT_IND_UL_MSG, //!< Power on of the C027N/water meter
RobMeades 0:5c46cb3be899 87 //! device has completed.
RobMeades 0:5c46cb3be899 88 SERIAL_NUMBER_IND_UL_MSG, //!< The serial number of the water meter.
RobMeades 0:5c46cb3be899 89 VOLUME_IND_UL_MSG, //!< The current water meter reading.
RobMeades 0:5c46cb3be899 90 RSSI_IND_UL_MSG, //!< The current RSSI reading from the
RobMeades 0:5c46cb3be899 91 //! radio module.
RobMeades 0:5c46cb3be899 92 SERIAL_NUMBER_GET_CNF_UL_MSG, //!< The serial number of the water-meter.
RobMeades 0:5c46cb3be899 93 READING_INTERVAL_SET_CNF_UL_MSG, //!< The rate at which readings are
RobMeades 0:5c46cb3be899 94 //! returned by the C027/water-meter device.
RobMeades 0:5c46cb3be899 95 READING_INTERVAL_GET_CNF_UL_MSG, //!< The rate at which readings are
RobMeades 0:5c46cb3be899 96 //! returned by the C027/water-meter device.
RobMeades 0:5c46cb3be899 97 GPIO_SET_CNF_UL_MSG, //!< The state of a GPIO on the C027 board.
RobMeades 0:5c46cb3be899 98 GPIO_GET_CNF_UL_MSG, //!< The state of a GPIO on the C027 board.
RobMeades 0:5c46cb3be899 99 LED_SET_CNF_UL_MSG, //!< The steady state of the red LED on
RobMeades 0:5c46cb3be899 100 //! the C027/water-meter device.
RobMeades 0:5c46cb3be899 101 LED_GET_CNF_UL_MSG, //!< The steady state of the red LED on
RobMeades 0:5c46cb3be899 102 //! the C027/water-meter device.
RobMeades 0:5c46cb3be899 103 FLASH_SET_CNF_UL_MSG, //!< Whether the LED on the C027/water
RobMeades 0:5c46cb3be899 104 //! meter device is set to flash when a
RobMeades 0:5c46cb3be899 105 //! message is being sent/received (or not).
RobMeades 0:5c46cb3be899 106 FLASH_GET_CNF_UL_MSG, //!< Whether the LED on the C027/water
RobMeades 0:5c46cb3be899 107 //! meter device is set to flash when a
RobMeades 0:5c46cb3be899 108 //! message is being sent/received (or not).
RobMeades 0:5c46cb3be899 109 MAX_NUM_UL_MSGS //!< The maximum number of uplink messages.
RobMeades 0:5c46cb3be899 110 } MsgIdUl_t;
RobMeades 0:5c46cb3be899 111
RobMeades 0:5c46cb3be899 112 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 113 // GENERIC PRIVATE FUNCTIONS
RobMeades 0:5c46cb3be899 114 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 115
RobMeades 0:5c46cb3be899 116 /// Encode a boolean value, noting that this is contained
RobMeades 0:5c46cb3be899 117 // in a 32 bytes coded value.
RobMeades 0:5c46cb3be899 118 uint32_t MessageCodec::encodeBool (char * pBuffer, bool value)
RobMeades 0:5c46cb3be899 119 {
RobMeades 0:5c46cb3be899 120 uint32_t numBytesEncoded = 4;
RobMeades 0:5c46cb3be899 121
RobMeades 0:5c46cb3be899 122 memset (pBuffer, 0, 4);
RobMeades 0:5c46cb3be899 123 pBuffer[3] = value;
RobMeades 0:5c46cb3be899 124
RobMeades 0:5c46cb3be899 125 return numBytesEncoded;
RobMeades 0:5c46cb3be899 126 }
RobMeades 0:5c46cb3be899 127
RobMeades 0:5c46cb3be899 128 /// Decode a boolean value, noting that this is contained
RobMeades 0:5c46cb3be899 129 // in a 32 bytes coded value.
RobMeades 0:5c46cb3be899 130 bool MessageCodec::decodeBool (const char ** ppBuffer)
RobMeades 0:5c46cb3be899 131 {
RobMeades 0:5c46cb3be899 132 uint32_t value = 0;
RobMeades 0:5c46cb3be899 133 bool boolValue = false;
RobMeades 0:5c46cb3be899 134
RobMeades 0:5c46cb3be899 135 value += ((**ppBuffer) & 0xFF) << 24;
RobMeades 0:5c46cb3be899 136 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 137 value += ((**ppBuffer) & 0xFF) << 16;
RobMeades 0:5c46cb3be899 138 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 139 value += ((**ppBuffer) & 0xFF) << 8;
RobMeades 0:5c46cb3be899 140 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 141 value += ((**ppBuffer) & 0xFF) ;
RobMeades 0:5c46cb3be899 142 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 143
RobMeades 0:5c46cb3be899 144 if (value)
RobMeades 0:5c46cb3be899 145 {
RobMeades 0:5c46cb3be899 146 boolValue = true;
RobMeades 0:5c46cb3be899 147 }
RobMeades 0:5c46cb3be899 148
RobMeades 0:5c46cb3be899 149 return boolValue;
RobMeades 0:5c46cb3be899 150 }
RobMeades 0:5c46cb3be899 151
RobMeades 0:5c46cb3be899 152 /// Encode an int32
RobMeades 0:5c46cb3be899 153 uint32_t MessageCodec::encodeUint32 (char * pBuffer, uint32_t value)
RobMeades 0:5c46cb3be899 154 {
RobMeades 0:5c46cb3be899 155 uint32_t numBytesEncoded = 4;
RobMeades 0:5c46cb3be899 156
RobMeades 0:5c46cb3be899 157 pBuffer[0] = 0xff & (value >> 24);
RobMeades 0:5c46cb3be899 158 pBuffer[1] = 0xff & (value >> 16);
RobMeades 0:5c46cb3be899 159 pBuffer[2] = 0xff & (value >> 8);
RobMeades 0:5c46cb3be899 160 pBuffer[3] = 0xff & value;
RobMeades 0:5c46cb3be899 161
RobMeades 0:5c46cb3be899 162 return numBytesEncoded;
RobMeades 0:5c46cb3be899 163 }
RobMeades 0:5c46cb3be899 164
RobMeades 0:5c46cb3be899 165 /// Decode an int32
RobMeades 0:5c46cb3be899 166 uint32_t MessageCodec::decodeUint32 (const char ** ppBuffer)
RobMeades 0:5c46cb3be899 167 {
RobMeades 0:5c46cb3be899 168 uint32_t value = 0;
RobMeades 0:5c46cb3be899 169
RobMeades 0:5c46cb3be899 170 value += ((**ppBuffer) & 0xFF) << 24;
RobMeades 0:5c46cb3be899 171 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 172 value += ((**ppBuffer) & 0xFF) << 16;
RobMeades 0:5c46cb3be899 173 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 174 value += ((**ppBuffer) & 0xFF) << 8;
RobMeades 0:5c46cb3be899 175 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 176 value += ((**ppBuffer) & 0xFF);
RobMeades 0:5c46cb3be899 177 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 178
RobMeades 0:5c46cb3be899 179 return value;
RobMeades 0:5c46cb3be899 180 }
RobMeades 0:5c46cb3be899 181
RobMeades 0:5c46cb3be899 182 /// Encode GpioState
RobMeades 0:5c46cb3be899 183 uint32_t MessageCodec::encodeGpioState (char * pBuffer, GpioState_t *pGpioState)
RobMeades 0:5c46cb3be899 184
RobMeades 0:5c46cb3be899 185 {
RobMeades 0:5c46cb3be899 186 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 187
RobMeades 0:5c46cb3be899 188 pBuffer[numBytesEncoded] = 0;
RobMeades 0:5c46cb3be899 189 numBytesEncoded++;
RobMeades 0:5c46cb3be899 190 pBuffer[numBytesEncoded] = pGpioState->gpio;
RobMeades 0:5c46cb3be899 191 numBytesEncoded++;
RobMeades 0:5c46cb3be899 192 pBuffer[numBytesEncoded] = pGpioState->inputNotOutput;
RobMeades 0:5c46cb3be899 193 numBytesEncoded++;
RobMeades 0:5c46cb3be899 194 pBuffer[numBytesEncoded] = pGpioState->onNotOff;
RobMeades 0:5c46cb3be899 195 numBytesEncoded++;
RobMeades 0:5c46cb3be899 196
RobMeades 0:5c46cb3be899 197 return numBytesEncoded;
RobMeades 0:5c46cb3be899 198 }
RobMeades 0:5c46cb3be899 199
RobMeades 0:5c46cb3be899 200
RobMeades 0:5c46cb3be899 201 // Decode GpioState
RobMeades 0:5c46cb3be899 202 void MessageCodec::decodeGpioState (GpioState_t * pGpioState, const char ** ppBuffer)
RobMeades 0:5c46cb3be899 203 {
RobMeades 0:5c46cb3be899 204 // Ignore the first byte as it's empty
RobMeades 0:5c46cb3be899 205 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 206 pGpioState->gpio = (uint8_t) ((**ppBuffer) & 0xFF);
RobMeades 0:5c46cb3be899 207 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 208 pGpioState->inputNotOutput = (bool) ((**ppBuffer) & 0xFF);
RobMeades 0:5c46cb3be899 209 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 210 pGpioState->onNotOff = (bool) ((**ppBuffer) & 0xFF);
RobMeades 0:5c46cb3be899 211 (*ppBuffer)++;
RobMeades 0:5c46cb3be899 212 }
RobMeades 0:5c46cb3be899 213
RobMeades 0:5c46cb3be899 214 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 215 // MESSAGE ENCODING FUNCTIONS
RobMeades 0:5c46cb3be899 216 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 217
RobMeades 0:5c46cb3be899 218 uint32_t MessageCodec::encodeInitIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 219 InitIndUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 220 {
RobMeades 0:5c46cb3be899 221 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 222
RobMeades 0:5c46cb3be899 223 MESSAGE_CODEC_LOGMSG ("Encoding InitIndUlMsg, ID 0x%.2x, ", INIT_IND_UL_MSG);
RobMeades 0:5c46cb3be899 224 pBuffer[numBytesEncoded] = INIT_IND_UL_MSG;
RobMeades 0:5c46cb3be899 225 numBytesEncoded++;
RobMeades 0:5c46cb3be899 226 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), (uint32_t) pMsg->wakeUpCode);
RobMeades 0:5c46cb3be899 227 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 228
RobMeades 0:5c46cb3be899 229 return numBytesEncoded;
RobMeades 0:5c46cb3be899 230 }
RobMeades 0:5c46cb3be899 231
RobMeades 0:5c46cb3be899 232 uint32_t MessageCodec::encodeRebootReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 233 RebootReqDlMsg_t *pMsg)
RobMeades 0:5c46cb3be899 234 {
RobMeades 0:5c46cb3be899 235 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 236
RobMeades 0:5c46cb3be899 237 pBuffer[numBytesEncoded] = REBOOT_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 238 numBytesEncoded++;
RobMeades 0:5c46cb3be899 239 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->devModeOnNotOff);
RobMeades 0:5c46cb3be899 240 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 241
RobMeades 0:5c46cb3be899 242 return numBytesEncoded;
RobMeades 0:5c46cb3be899 243 }
RobMeades 0:5c46cb3be899 244
RobMeades 0:5c46cb3be899 245 uint32_t MessageCodec::encodeSerialNumberIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 246 SerialNumberIndUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 247 {
RobMeades 0:5c46cb3be899 248 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 249
RobMeades 0:5c46cb3be899 250 MESSAGE_CODEC_LOGMSG ("Encoding SerialNumberIndUlMsg, ID 0x%.2x, ", SERIAL_NUMBER_IND_UL_MSG);
RobMeades 0:5c46cb3be899 251 pBuffer[numBytesEncoded] = SERIAL_NUMBER_IND_UL_MSG;
RobMeades 0:5c46cb3be899 252 numBytesEncoded++;
RobMeades 0:5c46cb3be899 253 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->serialNumber);
RobMeades 0:5c46cb3be899 254 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 255
RobMeades 0:5c46cb3be899 256 return numBytesEncoded;
RobMeades 0:5c46cb3be899 257 }
RobMeades 0:5c46cb3be899 258
RobMeades 0:5c46cb3be899 259 uint32_t MessageCodec::encodeVolumeIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 260 VolumeIndUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 261 {
RobMeades 0:5c46cb3be899 262 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 263
RobMeades 0:5c46cb3be899 264 MESSAGE_CODEC_LOGMSG ("Encoding VolumeIndUlMsg, ID 0x%.2x, ", VOLUME_IND_UL_MSG);
RobMeades 0:5c46cb3be899 265 pBuffer[numBytesEncoded] = VOLUME_IND_UL_MSG;
RobMeades 0:5c46cb3be899 266 numBytesEncoded++;
RobMeades 0:5c46cb3be899 267 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->volumeLitres);
RobMeades 0:5c46cb3be899 268 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 269
RobMeades 0:5c46cb3be899 270 return numBytesEncoded;
RobMeades 0:5c46cb3be899 271 }
RobMeades 0:5c46cb3be899 272
RobMeades 0:5c46cb3be899 273 uint32_t MessageCodec::encodeRssiIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 274 RssiIndUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 275 {
RobMeades 0:5c46cb3be899 276 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 277
RobMeades 0:5c46cb3be899 278 MESSAGE_CODEC_LOGMSG ("Encoding RssiIndUlMsg, ID 0x%.2x, ", RSSI_IND_UL_MSG);
RobMeades 0:5c46cb3be899 279 pBuffer[numBytesEncoded] = RSSI_IND_UL_MSG;
RobMeades 0:5c46cb3be899 280 numBytesEncoded++;
RobMeades 0:5c46cb3be899 281 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->rssi);
RobMeades 0:5c46cb3be899 282 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 283
RobMeades 0:5c46cb3be899 284 return numBytesEncoded;
RobMeades 0:5c46cb3be899 285 }
RobMeades 0:5c46cb3be899 286
RobMeades 0:5c46cb3be899 287 uint32_t MessageCodec::encodeSerialNumberGetReqDlMsg (char * pBuffer)
RobMeades 0:5c46cb3be899 288 {
RobMeades 0:5c46cb3be899 289 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 290
RobMeades 0:5c46cb3be899 291 MESSAGE_CODEC_LOGMSG ("Encoding SerialNumberGetReqDlMsg, ID 0x%.2x, ", SERIAL_NUMBER_GET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 292 pBuffer[numBytesEncoded] = SERIAL_NUMBER_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 293 numBytesEncoded++;
RobMeades 0:5c46cb3be899 294 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), 0); // Encode packing as all
RobMeades 0:5c46cb3be899 295 // messages must have a body
RobMeades 0:5c46cb3be899 296 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 297
RobMeades 0:5c46cb3be899 298 return numBytesEncoded;
RobMeades 0:5c46cb3be899 299 }
RobMeades 0:5c46cb3be899 300
RobMeades 0:5c46cb3be899 301 uint32_t MessageCodec::encodeSerialNumberGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 302 SerialNumberGetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 303 {
RobMeades 0:5c46cb3be899 304 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 305
RobMeades 0:5c46cb3be899 306 MESSAGE_CODEC_LOGMSG ("Encoding SerialNumberGetCnfUlMsg, ID 0x%.2x, ", SERIAL_NUMBER_GET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 307 pBuffer[numBytesEncoded] = SERIAL_NUMBER_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 308 numBytesEncoded++;
RobMeades 0:5c46cb3be899 309 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->serialNumber);
RobMeades 0:5c46cb3be899 310 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 311
RobMeades 0:5c46cb3be899 312 return numBytesEncoded;
RobMeades 0:5c46cb3be899 313 }
RobMeades 0:5c46cb3be899 314
RobMeades 0:5c46cb3be899 315 uint32_t MessageCodec::encodeReadingIntervalSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 316 ReadingIntervalSetReqDlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 317 {
RobMeades 0:5c46cb3be899 318 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 319
RobMeades 0:5c46cb3be899 320 MESSAGE_CODEC_LOGMSG ("Encoding ReadingIntervalSetReqDlMsg, ID 0x%.2x, ", READING_INTERVAL_SET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 321 pBuffer[numBytesEncoded] = READING_INTERVAL_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 322 numBytesEncoded++;
RobMeades 0:5c46cb3be899 323 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->readingIntervalSeconds);
RobMeades 0:5c46cb3be899 324 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 325
RobMeades 0:5c46cb3be899 326 return numBytesEncoded;
RobMeades 0:5c46cb3be899 327 }
RobMeades 0:5c46cb3be899 328
RobMeades 0:5c46cb3be899 329 uint32_t MessageCodec::encodeReadingIntervalSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 330 ReadingIntervalSetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 331 {
RobMeades 0:5c46cb3be899 332 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 333
RobMeades 0:5c46cb3be899 334 MESSAGE_CODEC_LOGMSG ("Encoding ReadingIntervalSetCnfUlMsg, ID 0x%.2x, ", READING_INTERVAL_SET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 335 pBuffer[numBytesEncoded] = READING_INTERVAL_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 336 numBytesEncoded++;
RobMeades 0:5c46cb3be899 337 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->readingIntervalSeconds);
RobMeades 0:5c46cb3be899 338 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 339
RobMeades 0:5c46cb3be899 340 return numBytesEncoded;
RobMeades 0:5c46cb3be899 341 }
RobMeades 0:5c46cb3be899 342
RobMeades 0:5c46cb3be899 343 uint32_t MessageCodec::encodeReadingIntervalGetReqDlMsg (char * pBuffer)
RobMeades 0:5c46cb3be899 344 {
RobMeades 0:5c46cb3be899 345 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 346
RobMeades 0:5c46cb3be899 347 MESSAGE_CODEC_LOGMSG ("Encoding ReadingIntervalGetReqDlMsg, ID 0x%.2x, ", READING_INTERVAL_GET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 348 pBuffer[numBytesEncoded] = READING_INTERVAL_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 349 numBytesEncoded++;
RobMeades 0:5c46cb3be899 350 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), 0); // Encode packing as all
RobMeades 0:5c46cb3be899 351 // messages must have a body
RobMeades 0:5c46cb3be899 352 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 353
RobMeades 0:5c46cb3be899 354 return numBytesEncoded;
RobMeades 0:5c46cb3be899 355 }
RobMeades 0:5c46cb3be899 356
RobMeades 0:5c46cb3be899 357 uint32_t MessageCodec::encodeReadingIntervalGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 358 ReadingIntervalGetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 359 {
RobMeades 0:5c46cb3be899 360 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 361
RobMeades 0:5c46cb3be899 362 MESSAGE_CODEC_LOGMSG ("Encoding ReadingIntervalGetCnfUlMsg, ID 0x%.2x, ", READING_INTERVAL_GET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 363 pBuffer[numBytesEncoded] = READING_INTERVAL_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 364 numBytesEncoded++;
RobMeades 0:5c46cb3be899 365 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), pMsg->readingIntervalSeconds);
RobMeades 0:5c46cb3be899 366 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 367
RobMeades 0:5c46cb3be899 368 return numBytesEncoded;
RobMeades 0:5c46cb3be899 369 }
RobMeades 0:5c46cb3be899 370
RobMeades 0:5c46cb3be899 371 uint32_t MessageCodec::encodeGpioSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 372 GpioSetReqDlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 373 {
RobMeades 0:5c46cb3be899 374 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 375
RobMeades 0:5c46cb3be899 376 MESSAGE_CODEC_LOGMSG ("Encoding GpioSetReqDlMsg, ID 0x%.2x, ", GPIO_SET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 377 pBuffer[numBytesEncoded] = GPIO_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 378 numBytesEncoded++;
RobMeades 0:5c46cb3be899 379 numBytesEncoded += encodeGpioState (&(pBuffer[numBytesEncoded]), &(pMsg->gpioState));
RobMeades 0:5c46cb3be899 380 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 381
RobMeades 0:5c46cb3be899 382 return numBytesEncoded;
RobMeades 0:5c46cb3be899 383 }
RobMeades 0:5c46cb3be899 384
RobMeades 0:5c46cb3be899 385 uint32_t MessageCodec::encodeGpioSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 386 GpioSetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 387 {
RobMeades 0:5c46cb3be899 388 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 389
RobMeades 0:5c46cb3be899 390 MESSAGE_CODEC_LOGMSG ("Encoding GpioSetCnfUlMsg, ID 0x%.2x, ", GPIO_SET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 391 pBuffer[numBytesEncoded] = GPIO_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 392 numBytesEncoded++;
RobMeades 0:5c46cb3be899 393 numBytesEncoded += encodeGpioState (&(pBuffer[numBytesEncoded]), &(pMsg->gpioState));
RobMeades 0:5c46cb3be899 394 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 395
RobMeades 0:5c46cb3be899 396 return numBytesEncoded;
RobMeades 0:5c46cb3be899 397 }
RobMeades 0:5c46cb3be899 398
RobMeades 0:5c46cb3be899 399 uint32_t MessageCodec::encodeGpioGetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 400 GpioGetReqDlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 401 {
RobMeades 0:5c46cb3be899 402 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 403
RobMeades 0:5c46cb3be899 404 MESSAGE_CODEC_LOGMSG ("Encoding GpioGetReqDlMsg, ID 0x%.2x, ", LED_GET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 405 pBuffer[numBytesEncoded] = GPIO_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 406 numBytesEncoded++;
RobMeades 0:5c46cb3be899 407 numBytesEncoded += encodeUint32 (&(pBuffer[numBytesEncoded]), (uint32_t) pMsg->gpio);
RobMeades 0:5c46cb3be899 408 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 409
RobMeades 0:5c46cb3be899 410 return numBytesEncoded;
RobMeades 0:5c46cb3be899 411 }
RobMeades 0:5c46cb3be899 412
RobMeades 0:5c46cb3be899 413 uint32_t MessageCodec::encodeGpioGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 414 GpioGetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 415 {
RobMeades 0:5c46cb3be899 416 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 417
RobMeades 0:5c46cb3be899 418 MESSAGE_CODEC_LOGMSG ("Encoding GpioGetCnfUlMsg, ID 0x%.2x, ", LED_GET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 419 pBuffer[numBytesEncoded] = GPIO_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 420 numBytesEncoded++;
RobMeades 0:5c46cb3be899 421 numBytesEncoded += encodeGpioState (&(pBuffer[numBytesEncoded]), &(pMsg->gpioState));
RobMeades 0:5c46cb3be899 422
RobMeades 0:5c46cb3be899 423 return numBytesEncoded;
RobMeades 0:5c46cb3be899 424 }
RobMeades 0:5c46cb3be899 425
RobMeades 0:5c46cb3be899 426 uint32_t MessageCodec::encodeLedSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 427 LedSetReqDlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 428 {
RobMeades 0:5c46cb3be899 429 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 430
RobMeades 0:5c46cb3be899 431 MESSAGE_CODEC_LOGMSG ("Encoding LedSetReqDlMsg, ID 0x%.2x, ", LED_SET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 432 pBuffer[numBytesEncoded] = LED_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 433 numBytesEncoded++;
RobMeades 0:5c46cb3be899 434 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->onNotOff);
RobMeades 0:5c46cb3be899 435 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 436
RobMeades 0:5c46cb3be899 437 return numBytesEncoded;
RobMeades 0:5c46cb3be899 438 }
RobMeades 0:5c46cb3be899 439
RobMeades 0:5c46cb3be899 440 uint32_t MessageCodec::encodeLedSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 441 LedSetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 442 {
RobMeades 0:5c46cb3be899 443 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 444
RobMeades 0:5c46cb3be899 445 MESSAGE_CODEC_LOGMSG ("Encoding LedSetCnfUlMsg, ID 0x%.2x, ", LED_SET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 446 pBuffer[numBytesEncoded] = LED_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 447 numBytesEncoded++;
RobMeades 0:5c46cb3be899 448 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->onNotOff);
RobMeades 0:5c46cb3be899 449 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 450
RobMeades 0:5c46cb3be899 451 return numBytesEncoded;
RobMeades 0:5c46cb3be899 452 }
RobMeades 0:5c46cb3be899 453
RobMeades 0:5c46cb3be899 454 uint32_t MessageCodec::encodeLedGetReqDlMsg (char * pBuffer)
RobMeades 0:5c46cb3be899 455 {
RobMeades 0:5c46cb3be899 456 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 457
RobMeades 0:5c46cb3be899 458 MESSAGE_CODEC_LOGMSG ("Encoding LedGetReqDlMsg, ID 0x%.2x, ", LED_GET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 459 pBuffer[numBytesEncoded] = LED_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 460 numBytesEncoded++;
RobMeades 0:5c46cb3be899 461 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), 0); // Encode packing as all
RobMeades 0:5c46cb3be899 462 // messages must have a body
RobMeades 0:5c46cb3be899 463 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 464
RobMeades 0:5c46cb3be899 465 return numBytesEncoded;
RobMeades 0:5c46cb3be899 466 }
RobMeades 0:5c46cb3be899 467
RobMeades 0:5c46cb3be899 468 uint32_t MessageCodec::encodeLedGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 469 LedGetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 470 {
RobMeades 0:5c46cb3be899 471 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 472
RobMeades 0:5c46cb3be899 473 MESSAGE_CODEC_LOGMSG ("Encoding LedGetCnfUlMsg, ID 0x%.2x, ", LED_GET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 474 pBuffer[numBytesEncoded] = LED_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 475 numBytesEncoded++;
RobMeades 0:5c46cb3be899 476 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->onNotOff);
RobMeades 0:5c46cb3be899 477 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 478
RobMeades 0:5c46cb3be899 479 return numBytesEncoded;
RobMeades 0:5c46cb3be899 480 }
RobMeades 0:5c46cb3be899 481
RobMeades 0:5c46cb3be899 482 uint32_t MessageCodec::encodeFlashSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 483 FlashSetReqDlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 484 {
RobMeades 0:5c46cb3be899 485 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 486
RobMeades 0:5c46cb3be899 487 MESSAGE_CODEC_LOGMSG ("Encoding FlashSetReqDlMsg, ID 0x%.2x, ", FLASH_SET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 488 pBuffer[numBytesEncoded] = FLASH_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 489 numBytesEncoded++;
RobMeades 0:5c46cb3be899 490 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->onNotOff);
RobMeades 0:5c46cb3be899 491 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 492
RobMeades 0:5c46cb3be899 493 return numBytesEncoded;
RobMeades 0:5c46cb3be899 494 }
RobMeades 0:5c46cb3be899 495
RobMeades 0:5c46cb3be899 496 uint32_t MessageCodec::encodeFlashSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 497 FlashSetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 498 {
RobMeades 0:5c46cb3be899 499 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 500
RobMeades 0:5c46cb3be899 501 MESSAGE_CODEC_LOGMSG ("Encoding FlashSetCnfUlMs, ID 0x%.2x, ", FLASH_SET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 502 pBuffer[numBytesEncoded] = FLASH_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 503 numBytesEncoded++;
RobMeades 0:5c46cb3be899 504 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->onNotOff);
RobMeades 0:5c46cb3be899 505 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 506
RobMeades 0:5c46cb3be899 507 return numBytesEncoded;
RobMeades 0:5c46cb3be899 508 }
RobMeades 0:5c46cb3be899 509
RobMeades 0:5c46cb3be899 510 uint32_t MessageCodec::encodeFlashGetReqDlMsg (char * pBuffer)
RobMeades 0:5c46cb3be899 511 {
RobMeades 0:5c46cb3be899 512 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 513
RobMeades 0:5c46cb3be899 514 MESSAGE_CODEC_LOGMSG ("Encoding FlashGetReqDlMsg, ID 0x%.2x, ", FLASH_GET_REQ_DL_MSG);
RobMeades 0:5c46cb3be899 515 pBuffer[numBytesEncoded] = FLASH_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 516 numBytesEncoded++;
RobMeades 0:5c46cb3be899 517 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), 0); // Encode packing as all
RobMeades 0:5c46cb3be899 518 // messages must have a body
RobMeades 0:5c46cb3be899 519 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 520
RobMeades 0:5c46cb3be899 521 return numBytesEncoded;
RobMeades 0:5c46cb3be899 522 }
RobMeades 0:5c46cb3be899 523
RobMeades 0:5c46cb3be899 524 uint32_t MessageCodec::encodeFlashGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 525 FlashGetCnfUlMsg_t * pMsg)
RobMeades 0:5c46cb3be899 526 {
RobMeades 0:5c46cb3be899 527 uint32_t numBytesEncoded = 0;
RobMeades 0:5c46cb3be899 528
RobMeades 0:5c46cb3be899 529 MESSAGE_CODEC_LOGMSG ("Encoding FlashGetCnfUlMs, ID 0x%.2x, ", FLASH_GET_CNF_UL_MSG);
RobMeades 0:5c46cb3be899 530 pBuffer[numBytesEncoded] = FLASH_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 531 numBytesEncoded++;
RobMeades 0:5c46cb3be899 532 numBytesEncoded += encodeBool (&(pBuffer[numBytesEncoded]), pMsg->onNotOff);
RobMeades 0:5c46cb3be899 533 MESSAGE_CODEC_LOGMSG ("%d bytes encoded.\n", numBytesEncoded);
RobMeades 0:5c46cb3be899 534
RobMeades 0:5c46cb3be899 535 return numBytesEncoded;
RobMeades 0:5c46cb3be899 536 }
RobMeades 0:5c46cb3be899 537
RobMeades 0:5c46cb3be899 538 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 539 // MESSAGE DECODING FUNCTIONS
RobMeades 0:5c46cb3be899 540 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 541 MessageCodec::DecodeResult_t MessageCodec::decodeDlMsg (const char ** ppInBuffer,
RobMeades 0:5c46cb3be899 542 uint32_t sizeInBuffer,
RobMeades 0:5c46cb3be899 543 DlMsgUnion_t * pOutBuffer)
RobMeades 0:5c46cb3be899 544 {
RobMeades 0:5c46cb3be899 545 MsgIdDl_t msgId;
RobMeades 0:5c46cb3be899 546 DecodeResult_t decodeResult = DECODE_RESULT_FAILURE;
RobMeades 0:5c46cb3be899 547
RobMeades 0:5c46cb3be899 548 if (sizeInBuffer < MAX_MESSAGE_SIZE)
RobMeades 0:5c46cb3be899 549 {
RobMeades 0:5c46cb3be899 550 decodeResult = DECODE_RESULT_INPUT_TOO_SHORT;
RobMeades 0:5c46cb3be899 551 }
RobMeades 0:5c46cb3be899 552 else
RobMeades 0:5c46cb3be899 553 {
RobMeades 0:5c46cb3be899 554 decodeResult = DECODE_RESULT_UNKNOWN_MSG_ID;
RobMeades 0:5c46cb3be899 555 // First byte should be a valid DL message ID
RobMeades 0:5c46cb3be899 556 msgId = (MsgIdDl_t) **ppInBuffer;
RobMeades 0:5c46cb3be899 557 (*ppInBuffer)++;
RobMeades 0:5c46cb3be899 558 if (msgId < MAX_NUM_DL_MSGS)
RobMeades 0:5c46cb3be899 559 {
RobMeades 0:5c46cb3be899 560 switch (msgId)
RobMeades 0:5c46cb3be899 561 {
RobMeades 0:5c46cb3be899 562 case REBOOT_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 563 decodeResult = DECODE_RESULT_REBOOT_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 564 pOutBuffer->rebootReqDlMsg.devModeOnNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 565 break;
RobMeades 0:5c46cb3be899 566 case SERIAL_NUMBER_GET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 567 decodeResult = DECODE_RESULT_SERIAL_NUMBER_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 568 decodeUint32 (ppInBuffer); // Must decode the rest of the dummy message;
RobMeades 0:5c46cb3be899 569 break;
RobMeades 0:5c46cb3be899 570 case READING_INTERVAL_SET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 571 decodeResult = DECODE_RESULT_READING_INTERVAL_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 572 pOutBuffer->readingIntervalSetReqDlMsg.readingIntervalSeconds = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 573 break;
RobMeades 0:5c46cb3be899 574 case READING_INTERVAL_GET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 575 decodeResult = DECODE_RESULT_READING_INTERVAL_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 576 decodeUint32 (ppInBuffer); // Must decode the rest of the dummy message;
RobMeades 0:5c46cb3be899 577 break;
RobMeades 0:5c46cb3be899 578 case GPIO_SET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 579 decodeResult = DECODE_RESULT_GPIO_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 580 decodeGpioState (&(pOutBuffer->gpioSetReqDlMsg.gpioState), ppInBuffer);
RobMeades 0:5c46cb3be899 581 break;
RobMeades 0:5c46cb3be899 582 case GPIO_GET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 583 decodeResult = DECODE_RESULT_GPIO_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 584 pOutBuffer->gpioGetReqDlMsg.gpio = (uint8_t) decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 585 break;
RobMeades 0:5c46cb3be899 586 case LED_SET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 587 decodeResult = DECODE_RESULT_LED_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 588 pOutBuffer->ledSetReqDlMsg.onNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 589 break;
RobMeades 0:5c46cb3be899 590 case LED_GET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 591 decodeResult = DECODE_RESULT_LED_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 592 decodeUint32 (ppInBuffer); // Must decode the rest of the dummy message;
RobMeades 0:5c46cb3be899 593 break;
RobMeades 0:5c46cb3be899 594 case FLASH_SET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 595 decodeResult = DECODE_RESULT_FLASH_SET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 596 pOutBuffer->flashSetReqDlMsg.onNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 597 break;
RobMeades 0:5c46cb3be899 598 case FLASH_GET_REQ_DL_MSG:
RobMeades 0:5c46cb3be899 599 decodeResult = DECODE_RESULT_FLASH_GET_REQ_DL_MSG;
RobMeades 0:5c46cb3be899 600 decodeUint32 (ppInBuffer); // Must decode the rest of the dummy message;
RobMeades 0:5c46cb3be899 601 break;
RobMeades 0:5c46cb3be899 602 default:
RobMeades 0:5c46cb3be899 603 // The decodeResult will be left as Unknown message
RobMeades 0:5c46cb3be899 604 break;
RobMeades 0:5c46cb3be899 605 }
RobMeades 0:5c46cb3be899 606 }
RobMeades 0:5c46cb3be899 607 }
RobMeades 0:5c46cb3be899 608
RobMeades 0:5c46cb3be899 609 return decodeResult;
RobMeades 0:5c46cb3be899 610 }
RobMeades 0:5c46cb3be899 611
RobMeades 0:5c46cb3be899 612 MessageCodec::DecodeResult_t MessageCodec::decodeUlMsg (const char ** ppInBuffer,
RobMeades 0:5c46cb3be899 613 uint32_t sizeInBuffer,
RobMeades 0:5c46cb3be899 614 UlMsgUnion_t * pOutBuffer)
RobMeades 0:5c46cb3be899 615 {
RobMeades 0:5c46cb3be899 616 MsgIdUl_t msgId;
RobMeades 0:5c46cb3be899 617 DecodeResult_t decodeResult = DECODE_RESULT_FAILURE;
RobMeades 0:5c46cb3be899 618
RobMeades 0:5c46cb3be899 619 if (sizeInBuffer < MAX_MESSAGE_SIZE)
RobMeades 0:5c46cb3be899 620 {
RobMeades 0:5c46cb3be899 621 decodeResult = DECODE_RESULT_INPUT_TOO_SHORT;
RobMeades 0:5c46cb3be899 622 }
RobMeades 0:5c46cb3be899 623 else
RobMeades 0:5c46cb3be899 624 {
RobMeades 0:5c46cb3be899 625 decodeResult = DECODE_RESULT_UNKNOWN_MSG_ID;
RobMeades 0:5c46cb3be899 626 // First byte should be a valid UL message ID
RobMeades 0:5c46cb3be899 627 msgId = (MsgIdUl_t) **ppInBuffer;
RobMeades 0:5c46cb3be899 628 (*ppInBuffer)++;
RobMeades 0:5c46cb3be899 629 if (msgId < MAX_NUM_UL_MSGS)
RobMeades 0:5c46cb3be899 630 {
RobMeades 0:5c46cb3be899 631 switch (msgId)
RobMeades 0:5c46cb3be899 632 {
RobMeades 0:5c46cb3be899 633 case INIT_IND_UL_MSG:
RobMeades 0:5c46cb3be899 634 decodeResult = DECODE_RESULT_INIT_IND_UL_MSG;
RobMeades 0:5c46cb3be899 635 pOutBuffer->initIndUlMsg.wakeUpCode = (WakeUpCode_t) decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 636 break;
RobMeades 0:5c46cb3be899 637 case SERIAL_NUMBER_IND_UL_MSG:
RobMeades 0:5c46cb3be899 638 decodeResult = DECODE_RESULT_SERIAL_NUMBER_IND_UL_MSG;
RobMeades 0:5c46cb3be899 639 pOutBuffer->serialNumberIndUlMsg.serialNumber = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 640 break;
RobMeades 0:5c46cb3be899 641 case VOLUME_IND_UL_MSG:
RobMeades 0:5c46cb3be899 642 decodeResult = DECODE_RESULT_VOLUME_IND_UL_MSG;
RobMeades 0:5c46cb3be899 643 pOutBuffer->volumeIndUlMsg.volumeLitres = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 644 break;
RobMeades 0:5c46cb3be899 645 case RSSI_IND_UL_MSG:
RobMeades 0:5c46cb3be899 646 decodeResult = DECODE_RESULT_RSSI_IND_UL_MSG;
RobMeades 0:5c46cb3be899 647 pOutBuffer->rssiIndUlMsg.rssi = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 648 break;
RobMeades 0:5c46cb3be899 649 case SERIAL_NUMBER_GET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 650 decodeResult = DECODE_RESULT_SERIAL_NUMBER_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 651 pOutBuffer->serialNumberCnfUlMsg.serialNumber = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 652 break;
RobMeades 0:5c46cb3be899 653 case READING_INTERVAL_SET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 654 decodeResult = DECODE_RESULT_READING_INTERVAL_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 655 pOutBuffer->readingIntervalSetCnfUlMsg.readingIntervalSeconds = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 656 break;
RobMeades 0:5c46cb3be899 657 case READING_INTERVAL_GET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 658 decodeResult = DECODE_RESULT_READING_INTERVAL_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 659 pOutBuffer->readingIntervalGetCnfUlMsg.readingIntervalSeconds = decodeUint32 (ppInBuffer);
RobMeades 0:5c46cb3be899 660 break;
RobMeades 0:5c46cb3be899 661 case GPIO_SET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 662 decodeResult = DECODE_RESULT_GPIO_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 663 pOutBuffer->gpioSetCnfUlMsg = decodeUint32 (ppInBuffer); // Decode as an int32 for later unpacking
RobMeades 0:5c46cb3be899 664 break;
RobMeades 0:5c46cb3be899 665 case GPIO_GET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 666 decodeResult = DECODE_RESULT_GPIO_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 667 pOutBuffer->gpioGetCnfUlMsg = decodeUint32 (ppInBuffer); // Decode as an int32 for later unpacking
RobMeades 0:5c46cb3be899 668 break;
RobMeades 0:5c46cb3be899 669 case LED_SET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 670 decodeResult = DECODE_RESULT_LED_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 671 pOutBuffer->ledSetCnfUlMsg.onNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 672 break;
RobMeades 0:5c46cb3be899 673 case LED_GET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 674 decodeResult = DECODE_RESULT_LED_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 675 pOutBuffer->ledGetCnfUlMsg.onNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 676 break;
RobMeades 0:5c46cb3be899 677 case FLASH_SET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 678 decodeResult = DECODE_RESULT_FLASH_SET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 679 pOutBuffer->flashSetCnfUlMsg.onNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 680 break;
RobMeades 0:5c46cb3be899 681 case FLASH_GET_CNF_UL_MSG:
RobMeades 0:5c46cb3be899 682 decodeResult = DECODE_RESULT_FLASH_GET_CNF_UL_MSG;
RobMeades 0:5c46cb3be899 683 pOutBuffer->flashGetCnfUlMsg.onNotOff = decodeBool (ppInBuffer);
RobMeades 0:5c46cb3be899 684 break;
RobMeades 0:5c46cb3be899 685 default:
RobMeades 0:5c46cb3be899 686 // The decodeResult will be left as Unknown message
RobMeades 0:5c46cb3be899 687 break;
RobMeades 0:5c46cb3be899 688 }
RobMeades 0:5c46cb3be899 689 }
RobMeades 0:5c46cb3be899 690 }
RobMeades 0:5c46cb3be899 691
RobMeades 0:5c46cb3be899 692 return decodeResult;
RobMeades 0:5c46cb3be899 693 }
RobMeades 0:5c46cb3be899 694
RobMeades 0:5c46cb3be899 695 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 696 // MISC FUNCTIONS
RobMeades 0:5c46cb3be899 697 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 698
RobMeades 0:5c46cb3be899 699 // Log debug messages
RobMeades 0:5c46cb3be899 700 void MessageCodec::logMsg (const char * pFormat, ...)
RobMeades 0:5c46cb3be899 701 {
RobMeades 0:5c46cb3be899 702 char buffer[MAX_DEBUG_MESSAGE_LEN];
RobMeades 0:5c46cb3be899 703
RobMeades 0:5c46cb3be899 704 va_list args;
RobMeades 0:5c46cb3be899 705 va_start (args, pFormat);
RobMeades 0:5c46cb3be899 706 vsnprintf (buffer, sizeof (buffer), pFormat, args);
RobMeades 0:5c46cb3be899 707 va_end (args);
RobMeades 0:5c46cb3be899 708 #ifdef WIN32
RobMeades 0:5c46cb3be899 709 if (MessageCodec::mp_guiPrintToConsole)
RobMeades 0:5c46cb3be899 710 {
RobMeades 0:5c46cb3be899 711 (*MessageCodec::mp_guiPrintToConsole) (buffer);
RobMeades 0:5c46cb3be899 712 }
RobMeades 0:5c46cb3be899 713 #else
RobMeades 0:5c46cb3be899 714 // Must be on ARM
RobMeades 0:5c46cb3be899 715 printf (buffer);
RobMeades 0:5c46cb3be899 716 #endif
RobMeades 0:5c46cb3be899 717 }
RobMeades 0:5c46cb3be899 718
RobMeades 0:5c46cb3be899 719 void MessageCodec::initDll (void (*guiPrintToConsole) (const char *))
RobMeades 0:5c46cb3be899 720 {
RobMeades 0:5c46cb3be899 721 #ifdef WIN32
RobMeades 0:5c46cb3be899 722 mp_guiPrintToConsole = guiPrintToConsole;
RobMeades 0:5c46cb3be899 723 // This is the signal to the GUI that we're done with initialisation
RobMeades 0:5c46cb3be899 724 logMsg ("MessageCodec::ready.\n");
RobMeades 0:5c46cb3be899 725 #endif
RobMeades 0:5c46cb3be899 726 }
RobMeades 0:5c46cb3be899 727
RobMeades 0:5c46cb3be899 728 // End Of File