VivicoreSerial library
CommunicationProtocol.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2021 VIVIWARE JAPAN, Inc. All right reserved.
3 
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public License
6  as published by the Free Software Foundation; either version 2
7  of the License, or (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18 
24 #ifndef COMMUNICATION_PROTOCOL_H
25 #define COMMUNICATION_PROTOCOL_H
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 #include <inttypes.h>
32 
43 #define BLE_PROTOCOL_MAJOR_VERSION (uint8_t)(0x07)
44 
51 #define BLE_PROTOCOL_MINOR_VERSION (uint8_t)(0x00)
52 
54 #define BLE_PROTOCOL_VERSION \
55  (uint16_t)(((uint16_t)BLE_PROTOCOL_MAJOR_VERSION << 8) + ((uint16_t)BLE_PROTOCOL_MINOR_VERSION))
63 #define NUM_MAX_BLE_PKT (20)
64 
71 #define NUM_MAX_BLE_PKT_BODY (NUM_MAX_BLE_PKT - 2)
72 
74 // ACMD commands
75 typedef enum {
76  ACMD_BRANCHTYPE = 0x00,
77  ACMD_DISCONNECT = 0x01,
78  ACMD_ENCODED_WRITE = 0x02,
79  ACMD_ALLDISCONNECT = 0x03,
80  ACMD_DCINFO = 0x04,
81  ACMD_BINARY_WRITE = 0x05,
82  ACMD_FIND_BRANCH = 0x06,
83  ACMD_DCMAX = 0x07,
84  ACMD_DCMIN = 0x08,
85  ACMD_UNIQUE_ID = 0x09,
86  ACMD_OTA_STATUS = 0x0A,
87  ACMD_DCINI = 0x0B,
88  ACMD_FIND_CORE = 0x0C,
89  ACMD_BRTYPE = 0x20,
90  ACMD_SHUTDOWN = 0xF0,
91 } AppCommand_t;
92 
93 // Command parameter for ACMD_SHUTDOWN
94 typedef enum {
95  ACMDPARAM_SHUTDOWN_BATTERY_LOW = 0x01,
96  ACMDPARAM_SHUTDOWN_SWICTCH_OFF = 0x02,
97 } AppCommandParamShutdown_t;
98 
99 // Command parameter for ACMD_FIND_CORE/BRANCH
100 typedef enum {
101  ACMDPARAM_FIND_BLINK_OFF = 0x00,
102  ACMDPARAM_FIND_BLINK_NORMAL = 0x01,
103  ACMDPARAM_FIND_BLINK_SLOW = 0x02,
104  ACMDPARAM_FIND_BLINK_RAPID = 0x03,
105 } AppCommandParamFind_t;
114 #define UART_PROTOCOL_MAJOR_VERSION (uint8_t)(0x07)
115 
122 #define UART_PROTOCOL_MINOR_VERSION (uint8_t)(0x00)
123 
125 #define UART_PROTOCOL_VERSION \
126  (uint16_t)(((uint16_t)UART_PROTOCOL_MAJOR_VERSION << 8) + ((uint16_t)UART_PROTOCOL_MINOR_VERSION))
130 // DC_INI is supported on this version or later
131 #define UART_PROTOCOL_VERSION_DCINI (uint16_t)(0x0603)
132 // No BCMD header on response packet on this version or later
133 #define UART_PROTOCOL_VERSION_NO_BCMD_ON_RES (uint16_t)(0x0604)
141 #define UART_PROTOCOL_BAUDRATE (50000)
142 
150 #define NUM_MAX_UART_PKT_BODY_DATA (NUM_MAX_BLE_PKT_BODY)
151 
159 #define NUM_MAX_UART_PKT_BODY (NUM_MAX_UART_PKT_BODY_DATA + 2)
160 
168 #define NUM_MAX_UART_PKT (NUM_MAX_UART_PKT_BODY + 3)
169 
171 typedef enum {
172  STX = 0xC1,
173 } HeaderType_t;
174 
175 // Central to Peripherals(Core) and Peripherals(Core) to Branch commands
176 typedef enum {
177  BCMD_DISCOVERY = 0x00,
178  BCMD_ENCODED_WRITE = ACMD_ENCODED_WRITE,
179  BCMD_DCINFO = ACMD_DCINFO,
180  BCMD_BINARY_WRITE = ACMD_BINARY_WRITE,
181  BCMD_FIND_LED = ACMD_FIND_BRANCH,
182  BCMD_READ = 0x32,
183  BCMD_BRANCH_DFU_START = 0x64,
184  BCMD_RESET = 0x99,
185  BCMD_INVALID = 0xFF,
186 } BranchCommand_t;
187 
188 // Command parameter for BCMD_READ
189 typedef enum {
190  BCMDPARAM_RESERVED = 0x00,
191  BCMDPARAM_READ_IDENTIFICATION = 0x01,
192  BCMDPARAM_READ_ENCODED_DATA = 0x02,
193  BCMDPARAM_READ_DCINFO = 0x03,
194  BCMDPARAM_READ_DCMAX = 0x04,
195  BCMDPARAM_READ_DCMIN = 0x05,
196  BCMDPARAM_READ_DCINI = 0x06,
197 } BranchCommandParamRead_t;
198 
199 // Command parameter for BCMD_FIND_LED
200 typedef enum {
201  BCMDPARAM_FIND_BLINK_OFF = ACMDPARAM_FIND_BLINK_OFF,
202  BCMDPARAM_FIND_BLINK_NORMAL = ACMDPARAM_FIND_BLINK_NORMAL,
203  BCMDPARAM_FIND_BLINK_SLOW = ACMDPARAM_FIND_BLINK_SLOW,
204  BCMDPARAM_FIND_BLINK_RAPID = ACMDPARAM_FIND_BLINK_RAPID,
205 } BranchCommandParamFind_t;
206 
207 // Command response type
208 typedef enum {
209  BCMDRES_RESERVED = 0x00,
210  BCMDRES_READ_IDENTIFICATION = BCMDPARAM_READ_IDENTIFICATION,
211  BCMDRES_READ_ENCODED_DATA = BCMDPARAM_READ_ENCODED_DATA,
212  BCMDRES_READ_DCINFO = BCMDPARAM_READ_DCINFO,
213  BCMDRES_READ_DCMAX = BCMDPARAM_READ_DCMAX,
214  BCMDRES_READ_DCMIN = BCMDPARAM_READ_DCMIN,
215  BCMDRES_READ_DCINI = BCMDPARAM_READ_DCINI,
216  BCMDRES_DISCOVERY_ACK = 0xAA,
217  BCMDRES_ACK_EMPTY = 0xBB,
218  BCMDRES_NOTHING = 0xFF,
219 } BranchCommandRes_t;
220 
221 // UART communication protocol packet format
222 typedef struct {
223  uint8_t bcmd;
224  uint8_t branch_id;
225 } BcmdPktHdr_t;
226 
227 typedef struct {
228  BcmdPktHdr_t hdr;
229  uint8_t body[NUM_MAX_UART_PKT_BODY_DATA];
230 } BcmdReqPkt_t;
231 
232 // TODO: deprecated packet structure
233 typedef struct {
234  BcmdPktHdr_t hdr;
235  uint8_t body[NUM_MAX_UART_PKT_BODY_DATA];
236 } BcmdResWithBcmdHdrPkt_t;
237 
238 typedef struct {
239  uint8_t body[NUM_MAX_UART_PKT_BODY_DATA];
240 } BcmdResPkt_t;
241 
242 typedef struct {
243  uint8_t stx;
244  uint8_t len;
245 } UartPktHdr_t;
246 
247 typedef struct {
248  UartPktHdr_t hdr;
249  BcmdReqPkt_t body;
250 } UartReqPkt_t;
251 
252 typedef struct {
253  UartPktHdr_t hdr;
254  BcmdResPkt_t body;
255 } UartResPkt_t;
258 /*
259  * Common communication protocol specification applicable for both App/Core and Core/Branch
260  */
261 
265 #define NUM_MAX_DC (16)
266 
268 // Maximum data body size in DC ini/min/max packet
269 #define NUM_MAX_PKT_BODY_DATA_DC (NUM_MAX_BLE_PKT_BODY - 2)
270 #define NUM_MAX_PKT_BODY_DATA_DC_INI (NUM_MAX_PKT_BODY_DATA_DC)
271 #define NUM_MAX_PKT_BODY_DATA_DC_MIN (NUM_MAX_PKT_BODY_DATA_DC)
272 #define NUM_MAX_PKT_BODY_DATA_DC_MAX (NUM_MAX_PKT_BODY_DATA_DC)
281 typedef enum {
284  BRANCH_ID_ROOT = 0x01,
285  BRANCH_ID_2 = 0x02,
286  BRANCH_ID_3 = 0x03,
287  BRANCH_ID_4 = 0x04,
288  BRANCH_ID_5 = 0x05,
289  BRANCH_ID_MAX = BRANCH_ID_5,
290  BRANCH_ID_IGNORED = 0xFF,
291 } BranchId_t;
292 
296 typedef enum {
299 } ChipType_t;
300 
301 #ifdef __cplusplus
302 }
303 
307 enum class DcGroup_t : uint8_t {
308  DC_GROUP_FOR_SYSTEM = 0,
309  DC_GROUP_1,
310  DC_GROUP_2,
311  DC_GROUP_3,
312  DC_GROUP_4,
313  DC_GROUP_5,
314  DC_GROUP_6,
315  DC_GROUP_7,
316  DC_GROUP_8,
317  DC_GROUP_9,
318  DC_GROUP_10,
319  DC_GROUP_11,
320  DC_GROUP_12,
321  DC_GROUP_13,
322  DC_GROUP_14,
323  DC_GROUP_15,
324 };
325 
329 enum class DcNature_t : uint8_t {
330  DC_NATURE_OUT = 0,
331  DC_NATURE_IN,
332 };
333 
337 enum class DcType_t : uint8_t {
338  DC_TYPE_BOOLEAN = 0x01,
339  DC_TYPE_ANALOG_1BYTE = 0x05,
340  DC_TYPE_ANALOG_2BYTES = 0x06,
341  DC_TYPE_BINARY = 0x07,
342 };
343 #endif
344 
345 #endif // COMMUNICATION_PROTOCOL_H
BranchId_t
Branch ID.
Definition: CommunicationProtocol.h:281
@ BRANCH_ID_5
Definition: CommunicationProtocol.h:288
@ BRANCH_ID_BROADCAST
Definition: CommunicationProtocol.h:282
@ BRANCH_ID_3
Definition: CommunicationProtocol.h:286
@ BRANCH_ID_ALL
Definition: CommunicationProtocol.h:283
@ BRANCH_ID_ROOT
Definition: CommunicationProtocol.h:284
@ BRANCH_ID_4
Definition: CommunicationProtocol.h:287
@ BRANCH_ID_2
Definition: CommunicationProtocol.h:285
ChipType_t
Microcontroller chip types on Branch.
Definition: CommunicationProtocol.h:296
@ CHIP_TYPE_ATMEGA_328PB
Definition: CommunicationProtocol.h:298
@ CHIP_TYPE_ATMEGA_328P
Definition: CommunicationProtocol.h:297
#define NUM_MAX_UART_PKT_BODY_DATA
Maximum data size on a packet for UART communication protocol.
Definition: CommunicationProtocol.h:150