tcMenu
RemoteConnector.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 https://www.thecoderscorner.com (Dave Cherry).
3  * This product is licensed under an Apache license, see the LICENSE file in the top-level directory.
4  */
5 
11 #ifndef _TCMENU_REMOTECONNECTOR_H_
12 #define _TCMENU_REMOTECONNECTOR_H_
13 
14 #include <PlatformDetermination.h>
15 #include "RemoteTypes.h"
16 #include <tcUtil.h>
17 #include "MenuItems.h"
18 #include "RuntimeMenuItem.h"
19 #include "MessageProcessors.h"
20 #include "MenuIterator.h"
21 #include "ScrollChoiceMenuItem.h"
22 
23 #define TAG_VAL_PROTOCOL 0x01
24 #define BINARY_GZ_PROTOCOL 0x02
25 #define START_OF_MESSAGE 0x01
26 #define TICK_INTERVAL 1
27 
28 // when debugging to reduce disconnects set the following (give 1 minute timeout): -DHEARTBEAT_INTERVAL=20000
29 #ifndef HEARTBEAT_INTERVAL
30 # define HEARTBEAT_INTERVAL 1500
31 #endif
32 
33 #define HEARTBEAT_INTERVAL_TICKS (HEARTBEAT_INTERVAL / TICK_INTERVAL)
34 #define PAIRING_TIMEOUT_TICKS (15000 / TICK_INTERVAL)
35 
50 enum FieldValueType : uint8_t {
73 };
74 
86 struct FieldAndValue {
87  FieldValueType fieldType;
88  uint16_t msgType;
89  uint16_t field;
90  char value[MAX_VALUE_LEN];
91  uint8_t len;
92 };
93 
98 #define COMMSERR_OK 0
99 #define COMMSERR_WRITE_NOT_CONNECTED 1
100 #define COMMSERR_PROTOCOL_ERROR 2
101 #define COMMSERR_CONNECTED 3
102 #define COMMSERR_DISCONNECTED 4
103 
105  uint16_t remoteNo: 4;
106  uint16_t connected: 1;
107  uint16_t errorMode: 8;
108 };
109 
115 
116 // forward references.
119 
131 };
132 
138 protected:
139  FieldAndValue currentField;
140  TagValueTransportType transportType;
141  uint8_t protocolUsed;
142 public:
144  virtual ~TagValueTransport() = default;
145 
146  virtual void startMsg(uint16_t msgType);
147  void startBinMsg(uint16_t msgType, uint16_t byteLen);
148  void writeField(uint16_t field, const char* value);
149  void writeFieldInt(uint16_t field, int value);
150  void writeFieldLong(uint16_t field, long value);
151  FieldAndValue* fieldIfAvailable();
152  void clearFieldStatus(FieldValueType ty = FVAL_PROCESSING);
153  TagValueTransportType getTransportType() { return transportType; }
154 
155  virtual void flush() = 0;
156  virtual int writeChar(char data) = 0;
157  virtual int writeStr(const char* data) = 0;
158  virtual uint8_t readByte()=0;
159  virtual bool readAvailable()=0;
160 
161  virtual bool available() = 0;
162  virtual bool connected() = 0;
163  virtual void close() = 0;
164  virtual void endMsg();
165 private:
166  bool findNextMessageStart();
167  bool processMsgKey();
168  bool processValuePart();
169 };
170 
171 #define FLAG_CURRENTLY_CONNECTED 0
172 #define FLAG_BOOTSTRAP_MODE 1
173 #define FLAG_BOOTSTRAP_COMPLETE 2
174 #define FLAG_AUTHENTICATED 3
175 #define FLAG_PAIRING_MODE 4
176 #define FLAG_FULLY_JOINED_RX 5
177 #define FLAG_FULLY_JOINED_TX 6
178 
184 private:
185  const ConnectorLocalInfo* localInfoPgm;
186  uint16_t ticksLastSend;
187  uint16_t ticksLastRead;
188  CombinedMessageProcessor* processor;
189  TagValueTransport* transport;
190  CommsCallbackFn commsCallback;
191  AuthenticationManager* authManager;
192 
193  // used by bootstrapping and writing out messages
194  MenuItemIterator iterator;
195  MenuItemTypePredicate bootPredicate;
196  RemoteNoMenuItemPredicate remotePredicate;
197 
198  // the remote connection details take 16 bytes
199  char remoteName[16];
200  uint8_t remoteMajorVer, remoteMinorVer;
201  ApiPlatform remotePlatform;
202  uint8_t flags;
203  uint8_t remoteNo;
204 public:
209  explicit TagValueRemoteConnector(uint8_t remoteNo = 0);
210 
219  void initialise(TagValueTransport* transport, CombinedMessageProcessor* processor, const ConnectorLocalInfo* localInfoPgm, uint8_t remoteNo);
220 
221  void setAuthManager(AuthenticationManager* mgr) { authManager = mgr; }
222 
227  void setCommsNotificationCallback(CommsCallbackFn callback) { this->commsCallback = callback; }
228 
232  bool isTransportAvailable() { return transport->available(); }
233 
234  void provideAuthentication(const char* auth);
235 
239  bool isTransportConnected() { return transport->connected(); }
240 
245  void encodeJoin();
246 
265  void encodeCustomTagValMessage(uint16_t msgType, void (*msgWriter)(TagValueTransport*));
266 
282  void encodeCustomBinaryMessage(uint16_t msgType, uint16_t len, void (*msgWriter)(TagValueTransport*, void*), void* data = nullptr);
283 
292  void encodeDialogMsg(uint8_t mode, uint8_t btn1, uint8_t btn2, const char* hdrPgm, const char* buffer);
293 
298  void encodeBootstrap(bool isComplete);
299 
304  void encodeHeartbeat(HeartbeatMode restartConnection);
305 
312  void encodeAnalogItem(int parentId, AnalogMenuItem* item);
313 
320  void encodeSubMenu(int parentId, SubMenuItem* item);
321 
328  void encodeBooleanMenu(int parentId, BooleanMenuItem* item);
329 
336  void encodeEnumMenu(int parentId, EnumMenuItem* item);
337 
344  void encodeActionMenu(int parentId, ActionMenuItem* item);
345 
352  void encodeFloatMenu(int parentId, FloatMenuItem* item);
353 
360  void encodeRuntimeMenuItem(int parentId, RuntimeMenuItem* item);
361 
368  void encodeMultiEditMenu(int parentId, RuntimeMenuItem* item);
369 
375  void encodeLargeNumberMenuItem(int parentId, EditableLargeNumberMenuItem* item);
376 
383  void encodeChangeValue(MenuItem* theItem);
384 
391  void encodeAcknowledgement(uint32_t correlation, AckResponseStatus status);
392 
398  void encodeColorMenuItem(int id, Rgb32MenuItem *pItem);
399 
405  void encodeScrollMenuItem(int id, ScrollChoiceMenuItem *pItem);
406 
411  void tick();
412 
422  void pairingRequest(const char* name, const char* uuid);
423 
427  void initiateBootstrap();
428 
432  uint8_t getRemoteNo() const {return remoteNo;}
433 
437  const char* getRemoteName() {return remoteName;}
438 
442  uint8_t getRemoteMajorVer() const {return remoteMajorVer;}
443 
447  uint8_t getRemoteMinorVer() const {return remoteMinorVer;}
448 
452  ApiPlatform getRemotePlatform() {return remotePlatform;}
453 
458  bool isConnected() { return bitRead(flags, FLAG_CURRENTLY_CONNECTED); }
459 
463  void setRemoteName(const char* name);
464 
468  void setRemoteConnected(uint8_t major, uint8_t minor, ApiPlatform platform);
469 
475  void commsNotify(uint16_t commsEventType);
476 
478  void close();
479 
481  bool isAuthenticated() { return bitRead(flags, FLAG_AUTHENTICATED); }
482  AuthenticationManager* getAuthManager() { return authManager; }
483 private:
484  void encodeBaseMenuFields(int parentId, MenuItem* item);
485  bool prepareWriteMsg(uint16_t msgType);
486  void nextBootstrap();
487  void performAnyWrites();
488  void dealWithHeartbeating();
495  void setConnected(bool conn);
496 
497  bool isBootstrapMode() { return bitRead(flags, FLAG_BOOTSTRAP_MODE); }
498  void setBootstrapMode(bool mode) { bitWrite(flags, FLAG_BOOTSTRAP_MODE, mode); }
499 
500  bool isBootstrapComplete() { return bitRead(flags, FLAG_BOOTSTRAP_COMPLETE); }
501  void setBootstrapComplete(bool mode) { bitWrite(flags, FLAG_BOOTSTRAP_COMPLETE, mode); }
502 
503  void setAuthenticated(bool auth) { bitWrite(flags, FLAG_AUTHENTICATED, auth); }
504 
505  bool isPairing() { return bitRead(flags, FLAG_PAIRING_MODE); }
506  void setPairing(bool pair) { bitWrite(flags, FLAG_PAIRING_MODE, pair); }
507 
508  bool isConnectionFullyEstablished() {
509  return isConnected() && (bitRead(flags, FLAG_FULLY_JOINED_RX) != 0) && (bitRead(flags, FLAG_FULLY_JOINED_TX) != 0);
510  }
511 
512  void setFullyJoinedRx(bool joinRx) { bitWrite(flags, FLAG_FULLY_JOINED_RX, joinRx); }
513 
514  void setFullyJoinedTx(bool joinTx) { bitWrite(flags, FLAG_FULLY_JOINED_TX, joinTx); }
515 
516  bool beginEncodeChange(MenuItem *item);
517 };
518 
519 #endif /* _TCMENU_REMOTECONNECTOR_H_ */
In TcMenu, MenuItem storage is shared between program memory and RAM. Usually each MenuItem has assoc...
Provides a number of utility functions for the processing of menu item structures.
This file contains the default processors that can deal with incoming messages turning them into even...
void(* CommsCallbackFn)(CommunicationInfo)
Definition: RemoteConnector.h:114
FieldValueType
Definition: RemoteConnector.h:50
@ FVAL_END_MSG
Definition: RemoteConnector.h:54
@ FVAL_PROCESSING_MSGTYPE_HI
Definition: RemoteConnector.h:70
@ FVAL_NEW_MSG
Definition: RemoteConnector.h:52
@ FVAL_PROCESSING_VALUE
Definition: RemoteConnector.h:64
@ FVAL_ERROR_PROTO
Definition: RemoteConnector.h:58
@ FVAL_PROCESSING_PROTOCOL
Definition: RemoteConnector.h:68
@ FVAL_PROCESSING_MSGTYPE_LO
Definition: RemoteConnector.h:72
@ FVAL_FIELD
Definition: RemoteConnector.h:56
@ FVAL_PROCESSING_WAITEQ
Definition: RemoteConnector.h:62
@ FVAL_PROCESSING_AWAITINGMSG
Definition: RemoteConnector.h:66
@ FVAL_PROCESSING
Definition: RemoteConnector.h:60
TagValueTransportType
Definition: RemoteConnector.h:124
@ TVAL_BUFFERED
Definition: RemoteConnector.h:128
@ TVAL_UNBUFFERED
Definition: RemoteConnector.h:126
@ TVAL_BUFFERED_DELEGATE_ENCRYPT
Definition: RemoteConnector.h:130
Definition: RemoteConnector.h:104
Definition: RemoteConnector.h:86
contains the definitions of each message and field.
HeartbeatMode
Definition: RemoteTypes.h:157
ApiPlatform
Definition: RemoteTypes.h:147
Contains definitions of menu items that can be fully defined at runtime with no need for prog mem str...
contains the menu item definition for scrolling choice types, and also for RGB items
Definition: MenuItems.h:672
Definition: MenuItems.h:476
Definition: RemoteAuthentication.h:38
Definition: MenuItems.h:597
Definition: MessageProcessors.h:146
Definition: EditableLargeNumberMenuItem.h:182
Definition: MenuItems.h:566
Definition: MenuItems.h:625
Definition: MenuItems.h:329
Definition: MenuIterator.h:173
Definition: MenuIterator.h:145
Definition: MenuIterator.h:103
Definition: ScrollChoiceMenuItem.h:229
Definition: RuntimeMenuItem.h:73
Definition: ScrollChoiceMenuItem.h:34
Definition: RuntimeMenuItem.h:147
Definition: RemoteConnector.h:183
bool isConnected()
Definition: RemoteConnector.h:458
const char * getRemoteName()
Definition: RemoteConnector.h:437
bool isTransportAvailable()
Definition: RemoteConnector.h:232
void encodeAnalogItem(int parentId, AnalogMenuItem *item)
Definition: RemoteConnector.cpp:431
void setRemoteName(const char *name)
Definition: RemoteConnector.cpp:67
void encodeRuntimeMenuItem(int parentId, RuntimeMenuItem *item)
Definition: RemoteConnector.cpp:535
uint8_t getRemoteMajorVer() const
Definition: RemoteConnector.h:442
void encodeSubMenu(int parentId, SubMenuItem *item)
Definition: RemoteConnector.cpp:584
void encodeMultiEditMenu(int parentId, RuntimeMenuItem *item)
Definition: RemoteConnector.cpp:481
void encodeEnumMenu(int parentId, EnumMenuItem *item)
Definition: RemoteConnector.cpp:550
void encodeBootstrap(bool isComplete)
Definition: RemoteConnector.cpp:378
void tick()
Definition: RemoteConnector.cpp:172
bool isTransportConnected()
Definition: RemoteConnector.h:239
void setRemoteConnected(uint8_t major, uint8_t minor, ApiPlatform platform)
Definition: RemoteConnector.cpp:72
void pairingRequest(const char *name, const char *uuid)
Definition: RemoteConnector.cpp:126
void encodeAcknowledgement(uint32_t correlation, AckResponseStatus status)
Definition: RemoteConnector.cpp:565
void encodeLargeNumberMenuItem(int parentId, EditableLargeNumberMenuItem *item)
Definition: RemoteConnector.cpp:470
void initialise(TagValueTransport *transport, CombinedMessageProcessor *processor, const ConnectorLocalInfo *localInfoPgm, uint8_t remoteNo)
Definition: RemoteConnector.cpp:55
uint8_t getRemoteMinorVer() const
Definition: RemoteConnector.h:447
bool isAuthenticated()
Definition: RemoteConnector.h:481
TagValueRemoteConnector(uint8_t remoteNo=0)
Definition: RemoteConnector.cpp:41
void encodeColorMenuItem(int id, Rgb32MenuItem *pItem)
Definition: RemoteConnector.cpp:460
void encodeBooleanMenu(int parentId, BooleanMenuItem *item)
Definition: RemoteConnector.cpp:576
void close()
Definition: RemoteConnector.cpp:159
void encodeChangeValue(MenuItem *theItem)
Definition: RemoteConnector.cpp:602
void encodeCustomTagValMessage(uint16_t msgType, void(*msgWriter)(TagValueTransport *))
Definition: RemoteConnector.cpp:356
void encodeDialogMsg(uint8_t mode, uint8_t btn1, uint8_t btn2, const char *hdrPgm, const char *buffer)
Definition: RemoteConnector.cpp:338
void setCommsNotificationCallback(CommsCallbackFn callback)
Definition: RemoteConnector.h:227
void encodeActionMenu(int parentId, ActionMenuItem *item)
Definition: RemoteConnector.cpp:590
void initiateBootstrap()
Definition: RemoteConnector.cpp:268
void commsNotify(uint16_t commsEventType)
Definition: RemoteConnector.cpp:149
void encodeScrollMenuItem(int id, ScrollChoiceMenuItem *pItem)
Definition: RemoteConnector.cpp:445
uint8_t getRemoteNo() const
Definition: RemoteConnector.h:432
void encodeFloatMenu(int parentId, FloatMenuItem *item)
Definition: RemoteConnector.cpp:515
void encodeHeartbeat(HeartbeatMode restartConnection)
Definition: RemoteConnector.cpp:384
void encodeJoin()
Definition: RemoteConnector.cpp:363
void encodeCustomBinaryMessage(uint16_t msgType, uint16_t len, void(*msgWriter)(TagValueTransport *, void *), void *data=nullptr)
Definition: RemoteConnector.cpp:405
ApiPlatform getRemotePlatform()
Definition: RemoteConnector.h:452
Definition: RemoteConnector.h:137
A series of utilities that used throughout tcMenu.
Definition: tcUtil.h:25