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 // This sets the DEFAULT heartbeat interval when no other interval has been set on a connection. IE if you create a
29 // connection and do not call setHeartbeatInterval(millis), this is what you'll get.
30 #ifndef HEARTBEAT_INTERVAL
31 # define HEARTBEAT_INTERVAL 1500
32 #endif
33 
34 // Pairing is different to a normal connection, in that we just need to provide the user with reasonable time to
35 // accept the pairing request on a device, usually around 15 seconds is enough. You can redefine if needed.
36 #ifndef PAIRING_TIMEOUT_TICKS
37 #define PAIRING_TIMEOUT_TICKS (15000 / TICK_INTERVAL)
38 #endif
39 
54 enum FieldValueType : uint8_t {
77 };
78 
90 struct FieldAndValue {
91  FieldValueType fieldType;
92  uint16_t msgType;
93  uint16_t field;
94  char value[MAX_VALUE_LEN];
95  uint8_t len;
96 };
97 
102 #define COMMSERR_OK 0
103 #define COMMSERR_WRITE_NOT_CONNECTED 1
104 #define COMMSERR_PROTOCOL_ERROR 2
105 #define COMMSERR_CONNECTED 3
106 #define COMMSERR_DISCONNECTED 4
107 
109  uint16_t remoteNo: 4;
110  uint16_t connected: 1;
111  uint16_t errorMode: 8;
112 };
113 
119 
120 // forward references.
123 
135 };
136 
142 protected:
143  FieldAndValue currentField;
144  TagValueTransportType transportType;
145  uint8_t protocolUsed;
146 public:
148  virtual ~TagValueTransport() = default;
149 
150  virtual void startMsg(uint16_t msgType);
151  void startBinMsg(uint16_t msgType, uint16_t byteLen);
152  void writeField(uint16_t field, const char* value);
153  void writeFieldInt(uint16_t field, int value);
154  void writeFieldLong(uint16_t field, long value);
155  FieldAndValue* fieldIfAvailable();
156  void clearFieldStatus(FieldValueType ty = FVAL_PROCESSING);
157  TagValueTransportType getTransportType() { return transportType; }
158 
159  virtual void flush() = 0;
160  virtual int writeChar(char data) = 0;
161  virtual int writeStr(const char* data) = 0;
162  virtual uint8_t readByte()=0;
163  virtual bool readAvailable()=0;
164 
165  virtual bool available() = 0;
166  virtual bool connected() = 0;
167  virtual void close() = 0;
168  virtual void endMsg();
169 private:
170  bool findNextMessageStart();
171  bool processMsgKey();
172  bool processValuePart();
173 };
174 
175 #define FLAG_CURRENTLY_CONNECTED 0
176 #define FLAG_BOOTSTRAP_MODE 1
177 #define FLAG_BOOTSTRAP_COMPLETE 2
178 #define FLAG_AUTHENTICATED 3
179 #define FLAG_PAIRING_MODE 4
180 #define FLAG_FULLY_JOINED_RX 5
181 #define FLAG_FULLY_JOINED_TX 6
182 
188 private:
189  const ConnectorLocalInfo* localInfoPgm;
190  uint16_t ticksLastSend;
191  uint16_t ticksLastRead;
192  uint16_t hbTimeoutTicks;
193  CombinedMessageProcessor* processor;
194  TagValueTransport* transport;
195  CommsCallbackFn commsCallback;
196  AuthenticationManager* authManager;
197 
198  // used by bootstrapping and writing out messages
199  MenuItemIterator iterator;
200  MenuItemTypePredicate bootPredicate;
201  RemoteNoMenuItemPredicate remotePredicate;
202 
203  // the remote connection details take 16 bytes
204  char remoteName[16];
205  uint8_t remoteMajorVer, remoteMinorVer;
206  ApiPlatform remotePlatform;
207  uint8_t flags;
208  uint8_t remoteNo;
209 public:
214  explicit TagValueRemoteConnector(uint8_t remoteNo = 0);
215 
224  void initialise(TagValueTransport* transport, CombinedMessageProcessor* processor, const ConnectorLocalInfo* localInfoPgm, uint8_t remoteNo);
225 
226  void setAuthManager(AuthenticationManager* mgr) { authManager = mgr; }
227 
232  void setCommsNotificationCallback(CommsCallbackFn callback) { this->commsCallback = callback; }
233 
237  bool isTransportAvailable() { return transport->available(); }
238 
239  void provideAuthentication(const char* auth);
240 
244  bool isTransportConnected() { return transport->connected(); }
245 
250  void encodeJoin();
251 
270  void encodeCustomTagValMessage(uint16_t msgType, void (*msgWriter)(TagValueTransport*));
271 
287  void encodeCustomBinaryMessage(uint16_t msgType, uint16_t len, void (*msgWriter)(TagValueTransport*, void*), void* data = nullptr);
288 
297  void encodeDialogMsg(uint8_t mode, uint8_t btn1, uint8_t btn2, const char* hdrPgm, const char* buffer);
298 
303  void encodeBootstrap(bool isComplete);
304 
309  void encodeHeartbeat(HeartbeatMode restartConnection);
310 
317  void encodeAnalogItem(int parentId, AnalogMenuItem* item);
318 
325  void encodeSubMenu(int parentId, SubMenuItem* item);
326 
333  void encodeBooleanMenu(int parentId, BooleanMenuItem* item);
334 
341  void encodeEnumMenu(int parentId, EnumMenuItem* item);
342 
349  void encodeActionMenu(int parentId, ActionMenuItem* item);
350 
357  void encodeFloatMenu(int parentId, FloatMenuItem* item);
358 
365  void encodeRuntimeMenuItem(int parentId, RuntimeMenuItem* item);
366 
373  void encodeMultiEditMenu(int parentId, RuntimeMenuItem* item);
374 
380  void encodeLargeNumberMenuItem(int parentId, EditableLargeNumberMenuItem* item);
381 
388  void encodeChangeValue(MenuItem* theItem);
389 
396  void encodeAcknowledgement(uint32_t correlation, AckResponseStatus status);
397 
403  void encodeColorMenuItem(int id, Rgb32MenuItem *pItem);
404 
410  void encodeScrollMenuItem(int id, ScrollChoiceMenuItem *pItem);
411 
416  void tick();
417 
427  void pairingRequest(const char* name, const char* uuid);
428 
432  void initiateBootstrap();
433 
437  uint8_t getRemoteNo() const {return remoteNo;}
438 
442  const char* getRemoteName() {return remoteName;}
443 
447  uint8_t getRemoteMajorVer() const {return remoteMajorVer;}
448 
452  uint8_t getRemoteMinorVer() const {return remoteMinorVer;}
453 
457  ApiPlatform getRemotePlatform() {return remotePlatform;}
458 
463  bool isConnected() { return bitRead(flags, FLAG_CURRENTLY_CONNECTED); }
464 
468  void setRemoteName(const char* name);
469 
473  void setRemoteConnected(uint8_t major, uint8_t minor, ApiPlatform platform);
474 
480  void commsNotify(uint16_t commsEventType);
481 
483  void close();
484 
486  bool isAuthenticated() { return bitRead(flags, FLAG_AUTHENTICATED); }
487  AuthenticationManager* getAuthManager() { return authManager; }
488 
489  void setHeartbeatTimeout(uint16_t milli) { hbTimeoutTicks = milli / TICK_INTERVAL; }
490 private:
491  void encodeBaseMenuFields(int parentId, MenuItem* item);
492  bool prepareWriteMsg(uint16_t msgType);
493  void nextBootstrap();
494  void performAnyWrites();
495  void dealWithHeartbeating();
502  void setConnected(bool conn);
503 
504  bool isBootstrapMode() { return bitRead(flags, FLAG_BOOTSTRAP_MODE); }
505  void setBootstrapMode(bool mode) { bitWrite(flags, FLAG_BOOTSTRAP_MODE, mode); }
506 
507  bool isBootstrapComplete() { return bitRead(flags, FLAG_BOOTSTRAP_COMPLETE); }
508  void setBootstrapComplete(bool mode) { bitWrite(flags, FLAG_BOOTSTRAP_COMPLETE, mode); }
509 
510  void setAuthenticated(bool auth) { bitWrite(flags, FLAG_AUTHENTICATED, auth); }
511 
512  bool isPairing() { return bitRead(flags, FLAG_PAIRING_MODE); }
513  void setPairing(bool pair) { bitWrite(flags, FLAG_PAIRING_MODE, pair); }
514 
515  bool isConnectionFullyEstablished() {
516  return isConnected() && (bitRead(flags, FLAG_FULLY_JOINED_RX) != 0) && (bitRead(flags, FLAG_FULLY_JOINED_TX) != 0);
517  }
518 
519  void setFullyJoinedRx(bool joinRx) { bitWrite(flags, FLAG_FULLY_JOINED_RX, joinRx); }
520 
521  void setFullyJoinedTx(bool joinTx) { bitWrite(flags, FLAG_FULLY_JOINED_TX, joinTx); }
522 
523  bool beginEncodeChange(MenuItem *item);
524 };
525 
526 #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:118
FieldValueType
Definition: RemoteConnector.h:54
@ FVAL_END_MSG
Definition: RemoteConnector.h:58
@ FVAL_PROCESSING_MSGTYPE_HI
Definition: RemoteConnector.h:74
@ FVAL_NEW_MSG
Definition: RemoteConnector.h:56
@ FVAL_PROCESSING_VALUE
Definition: RemoteConnector.h:68
@ FVAL_ERROR_PROTO
Definition: RemoteConnector.h:62
@ FVAL_PROCESSING_PROTOCOL
Definition: RemoteConnector.h:72
@ FVAL_PROCESSING_MSGTYPE_LO
Definition: RemoteConnector.h:76
@ FVAL_FIELD
Definition: RemoteConnector.h:60
@ FVAL_PROCESSING_WAITEQ
Definition: RemoteConnector.h:66
@ FVAL_PROCESSING_AWAITINGMSG
Definition: RemoteConnector.h:70
@ FVAL_PROCESSING
Definition: RemoteConnector.h:64
TagValueTransportType
Definition: RemoteConnector.h:128
@ TVAL_BUFFERED
Definition: RemoteConnector.h:132
@ TVAL_UNBUFFERED
Definition: RemoteConnector.h:130
@ TVAL_BUFFERED_DELEGATE_ENCRYPT
Definition: RemoteConnector.h:134
Definition: RemoteConnector.h:108
Definition: RemoteConnector.h:90
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:187
bool isConnected()
Definition: RemoteConnector.h:463
const char * getRemoteName()
Definition: RemoteConnector.h:442
bool isTransportAvailable()
Definition: RemoteConnector.h:237
void encodeAnalogItem(int parentId, AnalogMenuItem *item)
Definition: RemoteConnector.cpp:432
void setRemoteName(const char *name)
Definition: RemoteConnector.cpp:68
void encodeRuntimeMenuItem(int parentId, RuntimeMenuItem *item)
Definition: RemoteConnector.cpp:536
uint8_t getRemoteMajorVer() const
Definition: RemoteConnector.h:447
void encodeSubMenu(int parentId, SubMenuItem *item)
Definition: RemoteConnector.cpp:585
void encodeMultiEditMenu(int parentId, RuntimeMenuItem *item)
Definition: RemoteConnector.cpp:482
void encodeEnumMenu(int parentId, EnumMenuItem *item)
Definition: RemoteConnector.cpp:551
void encodeBootstrap(bool isComplete)
Definition: RemoteConnector.cpp:379
void tick()
Definition: RemoteConnector.cpp:173
bool isTransportConnected()
Definition: RemoteConnector.h:244
void setRemoteConnected(uint8_t major, uint8_t minor, ApiPlatform platform)
Definition: RemoteConnector.cpp:73
void pairingRequest(const char *name, const char *uuid)
Definition: RemoteConnector.cpp:127
void encodeAcknowledgement(uint32_t correlation, AckResponseStatus status)
Definition: RemoteConnector.cpp:566
void encodeLargeNumberMenuItem(int parentId, EditableLargeNumberMenuItem *item)
Definition: RemoteConnector.cpp:471
void initialise(TagValueTransport *transport, CombinedMessageProcessor *processor, const ConnectorLocalInfo *localInfoPgm, uint8_t remoteNo)
Definition: RemoteConnector.cpp:56
uint8_t getRemoteMinorVer() const
Definition: RemoteConnector.h:452
bool isAuthenticated()
Definition: RemoteConnector.h:486
TagValueRemoteConnector(uint8_t remoteNo=0)
Definition: RemoteConnector.cpp:41
void encodeColorMenuItem(int id, Rgb32MenuItem *pItem)
Definition: RemoteConnector.cpp:461
void encodeBooleanMenu(int parentId, BooleanMenuItem *item)
Definition: RemoteConnector.cpp:577
void close()
Definition: RemoteConnector.cpp:160
void encodeChangeValue(MenuItem *theItem)
Definition: RemoteConnector.cpp:603
void encodeCustomTagValMessage(uint16_t msgType, void(*msgWriter)(TagValueTransport *))
Definition: RemoteConnector.cpp:357
void encodeDialogMsg(uint8_t mode, uint8_t btn1, uint8_t btn2, const char *hdrPgm, const char *buffer)
Definition: RemoteConnector.cpp:339
void setCommsNotificationCallback(CommsCallbackFn callback)
Definition: RemoteConnector.h:232
void encodeActionMenu(int parentId, ActionMenuItem *item)
Definition: RemoteConnector.cpp:591
void initiateBootstrap()
Definition: RemoteConnector.cpp:269
void commsNotify(uint16_t commsEventType)
Definition: RemoteConnector.cpp:150
void encodeScrollMenuItem(int id, ScrollChoiceMenuItem *pItem)
Definition: RemoteConnector.cpp:446
uint8_t getRemoteNo() const
Definition: RemoteConnector.h:437
void encodeFloatMenu(int parentId, FloatMenuItem *item)
Definition: RemoteConnector.cpp:516
void encodeHeartbeat(HeartbeatMode restartConnection)
Definition: RemoteConnector.cpp:385
void encodeJoin()
Definition: RemoteConnector.cpp:364
void encodeCustomBinaryMessage(uint16_t msgType, uint16_t len, void(*msgWriter)(TagValueTransport *, void *), void *data=nullptr)
Definition: RemoteConnector.cpp:406
ApiPlatform getRemotePlatform()
Definition: RemoteConnector.h:457
Definition: RemoteConnector.h:141
A series of utilities that used throughout tcMenu.
Definition: tcUtil.h:25