Engduino  3.1.0
A fun device for learning coding
EngduinoProtocol.h
Go to the documentation of this file.
1 
14 #ifndef __ENGDUINOPROTOCOL_H__
15 #define __ENGDUINOPROTOCOL_H__
16 
17 #include <Arduino.h>
18 #include <Engduino.h>
19 
20 #include <EngduinoLEDs.h>
21 #include <EngduinoThermistor.h>
22 #include <EngduinoAccelerometer.h>
23 #include <EngduinoMagnetometer.h>
24 #include <EngduinoLight.h>
25 #include <EngduinoButton.h>
26 #include <EngduinoIR.h>
27 
28 // Version
29 #define VERSION 30 // ENGDUINOV3_0_SKETCH_BASIC
30 
31 // Communication channel
32 #define COMMUNICATION_PC_TERMINAL 1 // PC terminal
33 #define COMMUNICATION_BT_MODULE 2 // Bluetooth module
34 
35 // Commands definition
36 #define COM_SET_LEDS 10
37 #define COM_SET_LED 11
38 
39 #define COM_SET_PINS_DIGITAL_TYPE 20
40 #define COM_SET_PINS_ANALOG_TYPE 21
41 #define COM_SET_PINS_DIGITAL_VALUE 22
42 #define COM_SET_PINS_ANALOG_VALUE 23
43 
44 #define COM_SET_IR 40
45 
46 #define COM_SET_STATUS 90
47 
48 #define COM_GET_VERSION 100
49 
50 #define COM_GET_SENSORS 110
51 #define COM_GET_TEMPERATURE 111
52 #define COM_GET_ACCELEROMETER 112
53 #define COM_GET_MAGNETOMETER 113
54 #define COM_GET_LIGHT 114
55 
56 #define COM_GET_BUTTON 120
57 
58 #define COM_GET_PINS_DIGITAL_VALUE 130
59 #define COM_GET_PINS_ANALOG_VALUE 131
60 
61 #define COM_GET_IR 160
62 
63 #define COM_GET_STATUS 190
64 
65 
66 // Package definition
67 #define PACKAGE_TYPE_1 1
68 #define PACKAGE_TYPE_2 2
69 #define PACKAGE_TYPE_3 3
70 
71 #define PACKAGE_PACKAGE_TYPE 0
72 #define PACKAGE_PACKAGE_COMMAND_ID 1
73 
74 #define PACKAGE_MAX_LENGTH 156
75 #define PACKAGE_MAXNR_VALUES 56
76 
77 #define PACKAGE_START_CHR '{'
78 #define PACKAGE_STOP_CHR '}'
79 #define PACKAGE_DELIMITER_CHR ';'
80 
81 // Status key codes
82 #define STATUS_OVERSAMPLING 0 // Enable internal oversampling
83 
84 // Error codes definition
85 #define RES_OK 0
86 #define RES_ERR -1
87 #define RES_ERR_PACKAGE_HEADER -10
88 #define RES_ERR_PACKAGE_NR_VALS -11
89 #define RES_ERR_PACKAGE_VAL -12
90 #define RES_ERR_PACKAGE_UNKNOWN_SENSOR_TYPE -13
91 #define RES_ERR_PACKAGE_UNKNOWN_STATUS_KEY -14
92 #define RES_ERR_PACKAGE_UNKNOWN_ANALOG_PIN -15
93 
94 
95 // General
96 #define NR_SENSORS 5 // n+1 (ALL)
97 #define TIME_STAMP 2.05 // OS tick in [ms]
98 #define MIN_TIME 20 // Minimal time between sending packages in [ms]
99 
100 // Structures
102  byte packageType;
103  byte commandID;
104  long packageID;
105  byte ack;
106 };
107 
108 enum {
109  SENSOR_ALL = 0,
110  SENSOR_TEMP = 1,
111  SENSOR_ACC = 2,
112  SENSOR_MAG = 3,
113  SENSOR_LIGHT = 4
114 };
115 
116 enum {
117  SENSOR_TEMP_BUF = 0,
118  SENSOR_ACC_X_BUF = 1,
119  SENSOR_ACC_Y_BUF = 2,
120  SENSOR_ACC_Z_BUF = 3,
121  SENSOR_MAG_X_BUF = 4,
122  SENSOR_MAG_Y_BUF = 5,
123  SENSOR_MAG_Z_BUF = 6,
124  SENSOR_LIGHT_BUF = 7
125 };
126 #define NR_SENSORS_BUF 8 // Need to update if more sensors added! Value should be equal to elements in enum above.
127 
128 enum {
129  BUTTON_PRESSED = 0,
130  BUTTON_RELEASED = 1
131 };
132 
133 enum {
134  PIN_TRAN_NONE = -1,
135  PIN_TRAN_LOW_TO_HIGH = 1,
136  PIN_TRAN_HIGH_TO_LOW = 2,
137  PIN_TRAN_BOTH = 3
138 };
139 
140 enum {
141  PIN_TYPE_DIGITAL,
142  PIN_TYPE_ANALOG
143 };
144 #define NR_TRAN_PINS 18 // Number of digital transition pins Dxx
145 
146 
147 // Needed to ensure correct linkage between C++ and C linkage of ISR
148 extern "C" void TIMER1_COMPA_vect(void) __attribute__ ((signal));
149 
151 {
152  protected:
153  EngduinoLEDsClass* engduinoLEDs;
154  EngduinoThermistorClass* engduinoThermistor;
155  EngduinoAccelerometerClass* engduinoAccelerometer;
156  EngduinoMagnetometerClass* engduinoMagnetometer;
157  EngduinoLightClass* engduinoLight;
158  EngduinoButtonClass* engduinoButton;
159  EngduinoIRClass* engduinoIR;
160 
161  private:
162  byte commChannel;
163  colour ledsColor[16];
164  uint8_t ledsBrightness[16];
165  uint8_t ledsRGB[3][16];
166  long vals[16];
167  long sensorsCnt[NR_SENSORS];
168  long sensorsMatch[NR_SENSORS];
169  uint8_t sensorsReadOnce[NR_SENSORS];
170  bool buttonCatchEnable[2];
171  uint8_t irBuf[IRBUFSZ];
172  long cntt;
173  byte pinsTranOption[NR_TRAN_PINS];
174  byte pinsOldState[NR_TRAN_PINS];
175  byte pinsType[NR_TRAN_PINS];
176  long pinsCnt[NR_TRAN_PINS];
177  long pinsMatch[NR_TRAN_PINS];
178 
179  long sensorsSum[NR_SENSORS_BUF];
180  uint16_t sensorsSamples[NR_SENSORS];
181  uint16_t overSamplingCnt;
182  uint16_t overSamplingMatch;
183  uint8_t overSamplingRead;
184 
185  // Status vars
186  uint16_t overSampling;
187 
188  void _readThermistor(long *outVals);
189  void _readAccelerometer(long *outVals);
190  void _readMagnetometer(long *outVals);
191  void _readLight(long *outVals);
192  void _readSensors(long *outVals);
193 
194  public:
195  EngduinoProtocolClass();
196  ~EngduinoProtocolClass();
197  void begin(EngduinoLEDsClass *eledsc,
201  EngduinoLightClass *elc,
202  EngduinoButtonClass *ebc,
203  EngduinoIRClass *eirc);
204  void end();
205  void mainLoop();
206  void loadDefaults();
207  int parsePackage(String str, byte *outNrVals, long *outVals);
208  int parsePackageHeader(byte communicationChannel, byte inNrVals, long *inVals, struct EngduinoPackage *outPackage, byte *outHeaderSize);
209  int sendPackage(byte inNrVals, byte inCommandID, long *inVals);
210  int sendPackage(struct EngduinoPackage *engPackage, byte inNrVals, byte inCommandID, long *inVals);
211  int setLED(struct EngduinoPackage *engPackage, byte nrVals, long *inVals);
212  int setLEDs(struct EngduinoPackage *engPackage, byte nrVals, long *inVals);
213  int setGetStatus(struct EngduinoPackage *engPackage, byte nrVals, long *inVals, uint8_t setGet);
214  int setGetIR(struct EngduinoPackage *engPackage, byte nrVals, long *inVals, uint8_t setGet);
215  int setPinsType(struct EngduinoPackage *engPackage, byte inNrVals, long *inVals, uint8_t digAnalog);
216  int setPinsValue(struct EngduinoPackage *engPackage, byte inNrVals, long *inVals, uint8_t digAnalog);
217  int getVersion(struct EngduinoPackage *engPackage);
218  int getSensor(struct EngduinoPackage *engPackage, int sensorType, byte nrVals, long *inVals);
219  int getButton(struct EngduinoPackage *engPackage, byte nrVals, long *inVals);
220  int getPinsValue(struct EngduinoPackage *engPackage, byte inNrVals, long *inVals, uint8_t digAnalog);
221 
222  /*
223  * The ISR needs access to the private variables, so we declare it
224  * a friend of the class
225  */
226  friend void TIMER1_COMPA_vect();
227 };
228 
229 extern EngduinoProtocolClass EngduinoProtocol;
230 
231 #endif
232 
Definition: EngduinoLEDs.h:36
Definition: EngduinoProtocol.h:150
Definition: EngduinoMagnetometer.h:209
Definition: EngduinoProtocol.h:101
Definition: EngduinoAccelerometer.h:733
Definition: EngduinoIR.h:43
Definition: EngduinoLight.h:29
Definition: EngduinoThermistor.h:26
Definition: EngduinoButton.h:25