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.
IotMeterApi.hpp@0:5c46cb3be899, 2015-05-22 (annotated)
- 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?
User | Revision | Line number | New 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 |