A simple CIoT message protocol, used in the Water Meter Demos.

This library provides a small messaging protocol for a CIoT device, intended for use with the Water Meter Demo. As well as building for the C027 target, files are included for building a C DLL and, from that, a C Sharp DLL which can be linked into the PC-end of the Water Meter Demo (see the .ZIP file stored in the Wiki of the Water Meter Demo project) to provide end-to-end messaging with complete transparency. Since these PC files cannot be built inside mbed the source files are post-fixed with a ".txt" extension to keep them out of the way.

If a water pump is to be switched on/off as part of the demo, an interface circuit is required, which is described on the Wiki of the WaterMeterSupport library.

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 definition 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 #ifndef IOT_METER_API_HPP
RobMeades 0:5c46cb3be899 14 #define IOT_METER_API_HPP
RobMeades 0:5c46cb3be899 15
RobMeades 0:5c46cb3be899 16 /**
RobMeades 0:5c46cb3be899 17 * @file iot_meter_api.h
RobMeades 0:5c46cb3be899 18 * This file defines the API to the C027N/water-meter device
RobMeades 0:5c46cb3be899 19 * for the MWC demo 2015.
RobMeades 0:5c46cb3be899 20 */
RobMeades 0:5c46cb3be899 21
RobMeades 0:5c46cb3be899 22 #include <IotMeterMsgs.hpp>
RobMeades 0:5c46cb3be899 23
RobMeades 0:5c46cb3be899 24 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 25 // HARDWARE
RobMeades 0:5c46cb3be899 26 // The code in this library is setup to expect a Water Pump Relay,
RobMeades 0:5c46cb3be899 27 // a Crydom D2425, to be connected through this circuit:
RobMeades 0:5c46cb3be899 28 //
RobMeades 0:5c46cb3be899 29 // C027N board D2425 (Water Pump Relay)
RobMeades 0:5c46cb3be899 30 //
RobMeades 0:5c46cb3be899 31 // 5V o------------o
RobMeades 0:5c46cb3be899 32 // |
RobMeades 0:5c46cb3be899 33 // | |
RobMeades 0:5c46cb3be899 34 // | | 180 Ohm
RobMeades 0:5c46cb3be899 35 // | |
RobMeades 0:5c46cb3be899 36 // |
RobMeades 0:5c46cb3be899 37 // o--------------o '+3' pin
RobMeades 0:5c46cb3be899 38 // 10k Ohm |
RobMeades 0:5c46cb3be899 39 // ___ /
RobMeades 0:5c46cb3be899 40 // D7 o--|___|--| (transistor)
RobMeades 0:5c46cb3be899 41 // _\/
RobMeades 0:5c46cb3be899 42 // |
RobMeades 0:5c46cb3be899 43 // |
RobMeades 0:5c46cb3be899 44 // |
RobMeades 0:5c46cb3be899 45 // Gnd o-----------o--------------o '4' pin
RobMeades 0:5c46cb3be899 46 //
RobMeades 0:5c46cb3be899 47 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 48
RobMeades 0:5c46cb3be899 49 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 50 // GENERAL COMPILE-TIME CONSTANTS
RobMeades 0:5c46cb3be899 51 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 52
RobMeades 0:5c46cb3be899 53 /// The maximum length of a raw datagram in bytes
RobMeades 0:5c46cb3be899 54 #define MAX_DATAGRAM_SIZE_RAW 20
RobMeades 0:5c46cb3be899 55
RobMeades 0:5c46cb3be899 56 // The GPIO that the water pump is connected to on the C027N board
RobMeades 0:5c46cb3be899 57 #define GPIO_WATER_PUMP 7
RobMeades 0:5c46cb3be899 58
RobMeades 0:5c46cb3be899 59 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 60 // CLASSES
RobMeades 0:5c46cb3be899 61 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 62
RobMeades 0:5c46cb3be899 63 class MessageCodec {
RobMeades 0:5c46cb3be899 64 public:
RobMeades 0:5c46cb3be899 65
RobMeades 0:5c46cb3be899 66 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 67 // MESSAGE ENCODING FUNCTIONS
RobMeades 0:5c46cb3be899 68 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 69
RobMeades 0:5c46cb3be899 70 /// Encode an uplink message that is sent at power-on of the
RobMeades 0:5c46cb3be899 71 // device. Indicates that the device has been initialised. After
RobMeades 0:5c46cb3be899 72 // transmission of this message meter readings will be returned
RobMeades 0:5c46cb3be899 73 // at the indicated rate.
RobMeades 0:5c46cb3be899 74 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 75 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 76 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 77 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 78 uint32_t encodeInitIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 79 InitIndUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 80
RobMeades 0:5c46cb3be899 81 /// Encode a downlink message that reboots the device.
RobMeades 0:5c46cb3be899 82 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 83 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 84 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 85 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 86 uint32_t encodeRebootReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 87 RebootReqDlMsg_t *pMsg);
RobMeades 0:5c46cb3be899 88
RobMeades 0:5c46cb3be899 89 /// Encode an uplink message containing the current meter reading.
RobMeades 0:5c46cb3be899 90 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 91 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 92 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 93 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 94 uint32_t encodeVolumeIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 95 VolumeIndUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 96
RobMeades 0:5c46cb3be899 97 /// Encode an uplink message containing the current RSSI reading.
RobMeades 0:5c46cb3be899 98 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 99 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 100 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 101 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 102 uint32_t encodeRssiIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 103 RssiIndUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 104
RobMeades 0:5c46cb3be899 105 /// Encode a downlink message that sets the reading interval
RobMeades 0:5c46cb3be899 106 // of the water meter.
RobMeades 0:5c46cb3be899 107 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 108 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 109 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 110 uint32_t encodeSerialNumberGetReqDlMsg (char * pBuffer);
RobMeades 0:5c46cb3be899 111
RobMeades 0:5c46cb3be899 112 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 113 // SerialNumberGetReqDlMsg.
RobMeades 0:5c46cb3be899 114 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 115 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 116 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 117 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 118 uint32_t encodeSerialNumberGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 119 SerialNumberGetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 120
RobMeades 0:5c46cb3be899 121 /// Encode an uplink message that is sent at power-on of the
RobMeades 0:5c46cb3be899 122 // device and in response to an InitReqDlMsg. Indicates the
RobMeades 0:5c46cb3be899 123 // serial number of the device.
RobMeades 0:5c46cb3be899 124 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 125 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 126 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 127 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 128 uint32_t encodeSerialNumberIndUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 129 SerialNumberIndUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 130
RobMeades 0:5c46cb3be899 131 /// Encode a downlink message that retrieves the reading interval.
RobMeades 0:5c46cb3be899 132 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 133 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 134 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 135 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 136 uint32_t encodeReadingIntervalGetReqDlMsg (char * pBuffer);
RobMeades 0:5c46cb3be899 137
RobMeades 0:5c46cb3be899 138 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 139 // ReadingIntervalGetReqDlMsg.
RobMeades 0:5c46cb3be899 140 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 141 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 142 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 143 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 144 uint32_t encodeReadingIntervalGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 145 ReadingIntervalGetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 146
RobMeades 0:5c46cb3be899 147 /// Encode a downlink message that sets the reading interval.
RobMeades 0:5c46cb3be899 148 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 149 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 150 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 151 uint32_t encodeReadingIntervalSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 152 ReadingIntervalSetReqDlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 153
RobMeades 0:5c46cb3be899 154 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 155 // ReadingIntervalSetReqDlMsg.
RobMeades 0:5c46cb3be899 156 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 157 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 158 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 159 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 160 uint32_t encodeReadingIntervalSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 161 ReadingIntervalSetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 162
RobMeades 0:5c46cb3be899 163 /// Encode a downlink message that gets the state of a GPIO
RobMeades 0:5c46cb3be899 164 // on the C027N board.
RobMeades 0:5c46cb3be899 165 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 166 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 167 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 168 uint32_t encodeGpioGetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 169 GpioGetReqDlMsg_t *pMsg);
RobMeades 0:5c46cb3be899 170
RobMeades 0:5c46cb3be899 171 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 172 // GpioGetReqDlMsg.
RobMeades 0:5c46cb3be899 173 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 174 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 175 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 176 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 177 uint32_t encodeGpioGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 178 GpioGetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 179
RobMeades 0:5c46cb3be899 180 /// Encode a downlink message that sets the state of a GPIO
RobMeades 0:5c46cb3be899 181 // on the C027N board.
RobMeades 0:5c46cb3be899 182 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 183 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 184 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 185 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 186 uint32_t encodeGpioSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 187 GpioSetReqDlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 188
RobMeades 0:5c46cb3be899 189 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 190 // GpioSetReqDlMsg.
RobMeades 0:5c46cb3be899 191 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 192 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 193 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 194 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 195 uint32_t encodeGpioSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 196 GpioSetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 197
RobMeades 0:5c46cb3be899 198 /// Encode a downlink message that gets the steady state of the
RobMeades 0:5c46cb3be899 199 // red LED on the C027N board.
RobMeades 0:5c46cb3be899 200 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 201 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 202 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 203 uint32_t encodeLedGetReqDlMsg (char * pBuffer);
RobMeades 0:5c46cb3be899 204
RobMeades 0:5c46cb3be899 205 /// Encode an uplink message that is sent as a response to an
RobMeades 0:5c46cb3be899 206 // LedGetReqDlMsg.
RobMeades 0:5c46cb3be899 207 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 208 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 209 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 210 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 211 uint32_t encodeLedGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 212 LedGetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 213
RobMeades 0:5c46cb3be899 214 /// Encode a downlink message that sets the steady state of
RobMeades 0:5c46cb3be899 215 // the red LED.
RobMeades 0:5c46cb3be899 216 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 217 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 218 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 219 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 220 uint32_t encodeLedSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 221 LedSetReqDlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 222
RobMeades 0:5c46cb3be899 223 /// Encode an uplink message that is sent as a response to an
RobMeades 0:5c46cb3be899 224 // LedSetReqDlMsg.
RobMeades 0:5c46cb3be899 225 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 226 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 227 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 228 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 229 uint32_t encodeLedSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 230 LedSetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 231
RobMeades 0:5c46cb3be899 232 /// Encode a downlink message that sets the red LED to flash when
RobMeades 0:5c46cb3be899 233 // a message is being sent/received (or not). If LedSetReqDlMsg
RobMeades 0:5c46cb3be899 234 // has set the LED to ON the flash will be 'inverted', i.e. the
RobMeades 0:5c46cb3be899 235 // red LED will blink off when a message is being transmitted
RobMeades 0:5c46cb3be899 236 // or received instead.
RobMeades 0:5c46cb3be899 237 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 238 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 239 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 240 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 241 uint32_t encodeFlashSetReqDlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 242 FlashSetReqDlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 243
RobMeades 0:5c46cb3be899 244 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 245 // FlashSetReqDlMsg.
RobMeades 0:5c46cb3be899 246 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 247 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 248 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 249 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 250 uint32_t encodeFlashSetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 251 FlashSetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 252
RobMeades 0:5c46cb3be899 253 /// Encode a downlink message that gets the red LED to flash when
RobMeades 0:5c46cb3be899 254 // a message is being sent/received (or not). If LedSetReqDlMsg
RobMeades 0:5c46cb3be899 255 // has set the LED to ON the flash will be 'inverted', i.e. the
RobMeades 0:5c46cb3be899 256 // red LED will blink off when a message is being transmitted
RobMeades 0:5c46cb3be899 257 // or received instead.
RobMeades 0:5c46cb3be899 258 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 259 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 260 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 261 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 262 uint32_t encodeFlashGetReqDlMsg (char * pBuffer);
RobMeades 0:5c46cb3be899 263
RobMeades 0:5c46cb3be899 264 /// Encode an uplink message that is sent as a response to a
RobMeades 0:5c46cb3be899 265 // FlashGetReqDlMsg.
RobMeades 0:5c46cb3be899 266 // \param pBuffer A pointer to the buffer to encode into. The
RobMeades 0:5c46cb3be899 267 // buffer length must be at least MAX_MESSAGE_SIZE long
RobMeades 0:5c46cb3be899 268 // \param pMsg A pointer to the message to send.
RobMeades 0:5c46cb3be899 269 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 270 uint32_t encodeFlashGetCnfUlMsg (char * pBuffer,
RobMeades 0:5c46cb3be899 271 FlashGetCnfUlMsg_t * pMsg);
RobMeades 0:5c46cb3be899 272
RobMeades 0:5c46cb3be899 273 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 274 // MESSAGE DECODING FUNCTIONS
RobMeades 0:5c46cb3be899 275 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 276
RobMeades 0:5c46cb3be899 277 /// The outcome of message decoding.
RobMeades 0:5c46cb3be899 278 //
RobMeades 0:5c46cb3be899 279 // !!! When you add anything to the generic of UL sections
RobMeades 0:5c46cb3be899 280 // here (but not the DL bits as C# never decodes a DL thing),
RobMeades 0:5c46cb3be899 281 // align it with the DLL exported version in the dll wrapper files
RobMeades 0:5c46cb3be899 282 // so that the C# application can decode it.
RobMeades 0:5c46cb3be899 283 typedef enum DecodeResultTag_t
RobMeades 0:5c46cb3be899 284 {
RobMeades 0:5c46cb3be899 285 DECODE_RESULT_FAILURE = 0, //!< Generic failed decode.
RobMeades 0:5c46cb3be899 286 DECODE_RESULT_INPUT_TOO_SHORT, //!< Not enough input bytes.
RobMeades 0:5c46cb3be899 287 DECODE_RESULT_OUTPUT_TOO_SHORT, //!< Not enough room in the
RobMeades 0:5c46cb3be899 288 //! output.
RobMeades 0:5c46cb3be899 289 DECODE_RESULT_UNKNOWN_MSG_ID, //!< Rogue message ID.
RobMeades 0:5c46cb3be899 290 DECODE_RESULT_DL_MSG_BASE = 0x40, //!< From here on are the
RobMeades 0:5c46cb3be899 291 //! downlink messages.
RobMeades 0:5c46cb3be899 292 // !!! If you add one here
RobMeades 0:5c46cb3be899 293 // update the next line !!!
RobMeades 0:5c46cb3be899 294 DECODE_RESULT_REBOOT_REQ_DL_MSG = DECODE_RESULT_DL_MSG_BASE,
RobMeades 0:5c46cb3be899 295 DECODE_RESULT_SERIAL_NUMBER_GET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 296 DECODE_RESULT_READING_INTERVAL_SET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 297 DECODE_RESULT_READING_INTERVAL_GET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 298 DECODE_RESULT_GPIO_SET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 299 DECODE_RESULT_GPIO_GET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 300 DECODE_RESULT_LED_SET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 301 DECODE_RESULT_LED_GET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 302 DECODE_RESULT_FLASH_SET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 303 DECODE_RESULT_FLASH_GET_REQ_DL_MSG, // !!! If you add one here
RobMeades 0:5c46cb3be899 304 // update the next line !!!
RobMeades 0:5c46cb3be899 305 MAX_DL_REQ_MSG = DECODE_RESULT_FLASH_GET_REQ_DL_MSG,
RobMeades 0:5c46cb3be899 306 DECODE_RESULT_UL_MSG_BASE = 0x80, //!< From here on are the
RobMeades 0:5c46cb3be899 307 //! uplink messages.
RobMeades 0:5c46cb3be899 308 DECODE_RESULT_INIT_IND_UL_MSG = DECODE_RESULT_UL_MSG_BASE,
RobMeades 0:5c46cb3be899 309 DECODE_RESULT_SERIAL_NUMBER_IND_UL_MSG,
RobMeades 0:5c46cb3be899 310 DECODE_RESULT_SERIAL_NUMBER_GET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 311 DECODE_RESULT_VOLUME_IND_UL_MSG,
RobMeades 0:5c46cb3be899 312 DECODE_RESULT_RSSI_IND_UL_MSG,
RobMeades 0:5c46cb3be899 313 DECODE_RESULT_READING_INTERVAL_SET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 314 DECODE_RESULT_READING_INTERVAL_GET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 315 DECODE_RESULT_GPIO_SET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 316 DECODE_RESULT_GPIO_GET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 317 DECODE_RESULT_LED_SET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 318 DECODE_RESULT_LED_GET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 319 DECODE_RESULT_FLASH_SET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 320 DECODE_RESULT_FLASH_GET_CNF_UL_MSG, // !!! If you add one here update
RobMeades 0:5c46cb3be899 321 // the next line !!!
RobMeades 0:5c46cb3be899 322 MAX_UL_REQ_MSG = DECODE_RESULT_FLASH_GET_CNF_UL_MSG,
RobMeades 0:5c46cb3be899 323 MAX_NUM_DECODE_RESULTS //!< The maximum number of
RobMeades 0:5c46cb3be899 324 //! decode results.
RobMeades 0:5c46cb3be899 325 } DecodeResult_t;
RobMeades 0:5c46cb3be899 326
RobMeades 0:5c46cb3be899 327 /// Decode a downlink message. When a datagram has been received
RobMeades 0:5c46cb3be899 328 // this function should be called iteratively to decode all the
RobMeades 0:5c46cb3be899 329 // messages contained within it. The result, in pOutputBuffer,
RobMeades 0:5c46cb3be899 330 // should be cast by the calling function to DlMsgUnion_t and
RobMeades 0:5c46cb3be899 331 // the relevant member selected according to the
RobMeades 0:5c46cb3be899 332 // DecodeResult_t code.
RobMeades 0:5c46cb3be899 333 // \param ppInBuffer A pointer to the pointer to decode from.
RobMeades 0:5c46cb3be899 334 // On completion this is pointing to the next byte that
RobMeades 0:5c46cb3be899 335 // could be decoded, after the currently decoded message,
RobMeades 0:5c46cb3be899 336 // in the buffer.
RobMeades 0:5c46cb3be899 337 // \param sizeInBuffer The number of bytes left to decode.
RobMeades 0:5c46cb3be899 338 // \param pOutBuffer A pointer to the buffer to write the
RobMeades 0:5c46cb3be899 339 // result into.
RobMeades 0:5c46cb3be899 340 // \param pBytesDecoded A pointer to a place to write the number
RobMeades 0:5c46cb3be899 341 // of bytes decoded.
RobMeades 0:5c46cb3be899 342 // \return The result of the decoding, which hopefully says
RobMeades 0:5c46cb3be899 343 // what message has been decoded.
RobMeades 0:5c46cb3be899 344 DecodeResult_t decodeDlMsg (const char ** ppInBuffer,
RobMeades 0:5c46cb3be899 345 uint32_t sizeInBuffer,
RobMeades 0:5c46cb3be899 346 DlMsgUnion_t * pOutBuffer);
RobMeades 0:5c46cb3be899 347
RobMeades 0:5c46cb3be899 348 /// Decode an uplink message. When a datagram has been received
RobMeades 0:5c46cb3be899 349 // this function should be called iteratively to decode all the
RobMeades 0:5c46cb3be899 350 // messages contained within it. The result, in pOutputBuffer,
RobMeades 0:5c46cb3be899 351 // should be cast by the calling function to UlMsgUnion_t and
RobMeades 0:5c46cb3be899 352 // the relevant member selected according to the
RobMeades 0:5c46cb3be899 353 // DecodeResult_t code.
RobMeades 0:5c46cb3be899 354 // \param ppInBuffer A pointer to the pointer to decode from.
RobMeades 0:5c46cb3be899 355 // On completion this is pointing to the next byte that
RobMeades 0:5c46cb3be899 356 // could be decoded, after the currently decoded message,
RobMeades 0:5c46cb3be899 357 // in the buffer.
RobMeades 0:5c46cb3be899 358 // \param sizeInBuffer The number of bytes left to decode.
RobMeades 0:5c46cb3be899 359 // \param pOutBuffer A pointer to the buffer to write the
RobMeades 0:5c46cb3be899 360 // result into.
RobMeades 0:5c46cb3be899 361 // \return The result of the decoding, which hopefully says
RobMeades 0:5c46cb3be899 362 // what message has been decoded.
RobMeades 0:5c46cb3be899 363 DecodeResult_t decodeUlMsg (const char ** ppInBuffer,
RobMeades 0:5c46cb3be899 364 uint32_t sizeInBuffer,
RobMeades 0:5c46cb3be899 365 UlMsgUnion_t * pOutBuffer);
RobMeades 0:5c46cb3be899 366
RobMeades 0:5c46cb3be899 367 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 368 // MISC FUNCTIONS
RobMeades 0:5c46cb3be899 369 // ----------------------------------------------------------------
RobMeades 0:5c46cb3be899 370
RobMeades 0:5c46cb3be899 371 /// Only used in the DLL form, sets up the "printf()" function
RobMeades 0:5c46cb3be899 372 // for logging.
RobMeades 0:5c46cb3be899 373 // \param guiPrintToConsole the printf function.
RobMeades 0:5c46cb3be899 374 void initDll (void (*guiPrintToConsole) (const char *));
RobMeades 0:5c46cb3be899 375
RobMeades 0:5c46cb3be899 376 /// User callback function for "printf()" logging.
RobMeades 0:5c46cb3be899 377 static void (*mp_guiPrintToConsole) (const char *);
RobMeades 0:5c46cb3be899 378
RobMeades 0:5c46cb3be899 379 private:
RobMeades 0:5c46cb3be899 380 /// Encode a boolean value.
RobMeades 0:5c46cb3be899 381 // \param pBuffer A pointer to where the encoded
RobMeades 0:5c46cb3be899 382 // value should be placed.
RobMeades 0:5c46cb3be899 383 // \param value The Boolean value.
RobMeades 0:5c46cb3be899 384 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 385 uint32_t encodeBool (char * pBuffer, bool value);
RobMeades 0:5c46cb3be899 386 /// Decode a Boolean value.
RobMeades 0:5c46cb3be899 387 // \param ppBuffer A pointer to the pointer to decode.
RobMeades 0:5c46cb3be899 388 // On completion this points to the location after the
RobMeades 0:5c46cb3be899 389 // bool in the input buffer.
RobMeades 0:5c46cb3be899 390 // \return The decoded value.
RobMeades 0:5c46cb3be899 391 bool decodeBool (const char ** ppBuffer);
RobMeades 0:5c46cb3be899 392 /// Encode a uint32_t value.
RobMeades 0:5c46cb3be899 393 // \param pBuffer A pointer to the value to decode.
RobMeades 0:5c46cb3be899 394 // \param value The value.
RobMeades 0:5c46cb3be899 395 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 396 uint32_t encodeUint32 (char * pBuffer, uint32_t value);
RobMeades 0:5c46cb3be899 397 /// Decode a uint32_t value.
RobMeades 0:5c46cb3be899 398 // \param ppBuffer A pointer to the pointer to decode.
RobMeades 0:5c46cb3be899 399 // On completion this points to the location after the
RobMeades 0:5c46cb3be899 400 // uint32 in the input buffer.
RobMeades 0:5c46cb3be899 401 uint32_t decodeUint32 (const char ** ppBuffer);
RobMeades 0:5c46cb3be899 402 /// Encode GpioState.
RobMeades 0:5c46cb3be899 403 // \param pBuffer A pointer to the value to decode.
RobMeades 0:5c46cb3be899 404 // \param gGpioState A pointer to the place to put the
RobMeades 0:5c46cb3be899 405 // GPIO Sate.
RobMeades 0:5c46cb3be899 406 // \return The number of bytes encoded.
RobMeades 0:5c46cb3be899 407 uint32_t encodeGpioState (char * pBuffer, GpioState_t *pGpioState);
RobMeades 0:5c46cb3be899 408 /// Decode Gpio_State_t.
RobMeades 0:5c46cb3be899 409 // \param gGpioState_t a pointer to a place to put the
RobMeades 0:5c46cb3be899 410 // decoded GPIO state.
RobMeades 0:5c46cb3be899 411 // \param ppBuffer A pointer to the pointer to decode.
RobMeades 0:5c46cb3be899 412 // On completion this points to the location after the
RobMeades 0:5c46cb3be899 413 // uint32 in the input buffer.
RobMeades 0:5c46cb3be899 414 void decodeGpioState (GpioState_t * pGpioState,
RobMeades 0:5c46cb3be899 415 const char ** ppBuffer);
RobMeades 0:5c46cb3be899 416 /// Log a message for debugging, "printf()" style.
RobMeades 0:5c46cb3be899 417 // \param pFormat The printf() stle parameters.
RobMeades 0:5c46cb3be899 418 void logMsg (const char * pFormat, ...);
RobMeades 0:5c46cb3be899 419 };
RobMeades 0:5c46cb3be899 420
RobMeades 0:5c46cb3be899 421 #endif
RobMeades 0:5c46cb3be899 422
RobMeades 0:5c46cb3be899 423 // End Of File