muCom  1.0
The reliable, fast and easy way to exchange binary data via UART
muComBase.h
1 
9 #ifndef MUCOMBASE_H
10 #define MUCOMBASE_H
11 
12 //Required includes
13 #include <stdint.h>
14 #include "stdlib.h"
15 
16 
17 //Defines for the return values of the muCom interface functions
18 #define MUCOM_OK 0
19 #define MUCOM_ERR -1
20 #define MUCOM_ERR_TIMEOUT -2
21 #define MUCOM_ERR_COMM -3
22 
23 //Define default timeout of read requests via the interface
24 #define MUCOM_DEFAULT_TIMEOUT 100
25 
26 //Various defines for the interface itself
27 #define MUCOM_HEADER_BIT_MASK 0x80
28 #define MUCOM_FRAME_DESC_MASK 0x60
29 #define MUCOM_DATA_BYTE_CNT_MASK 0x1C
30 #define MUCOM_READ_RESPONSE 0x00
31 #define MUCOM_READ_REQUEST 0x20
32 #define MUCOM_WRITE_REQUEST 0x40
33 #define MUCOM_EXECUTE_REQUEST 0x60
34 
35 
39 typedef void (*muComFunc)(uint8_t *data, uint8_t cnt);
40 
41 
46 {
47  uint8_t* addr;
48  uint8_t size;
49 };
50 
51 
56 class muComBase
57 {
58  private:
59  struct muCom_LinkedVariable_str *_linked_var; //Array of all linked variables
60  uint8_t _linked_var_num; //Max. number of linked variables
61  muComFunc *_linked_func; //Array of all linked functions
62  uint8_t _linked_func_num; //Max. number of linked functions
63  uint8_t _rcv_buf[11]; //Internal receive buffer
64  uint8_t _rcv_buf_cnt; //Number of valid bytes in the internal receive buffer (serves as statemachine)
65  int16_t _timeout; //Current timeout for read requests
66  int16_t _lastCommTime; //Timestamp of last successful communication
67 
68  //Write a raw muCom frame
69  void writeRaw(uint8_t frameDesc, uint8_t index, uint8_t *data, uint8_t cnt);
70 
71  //Internal write function to actual HW
72  virtual void _write(uint8_t* data, uint8_t cnt) = 0;
73 
74  //Internal read function from actual HW
75  virtual uint8_t _read(void) = 0;
76 
77  //Internal function to check for available data from the actual HW
78  virtual uint8_t _available(void) = 0;
79 
80  //Internal function to wait until all written bytes are acutally transmitted
81  virtual void _flushTx(void) = 0;
82 
83  //Internal function to get the current timestamp in ms
84  virtual int16_t _getTimestamp(void) = 0;
85 
86 
87  public:
93  muComBase(uint8_t num_var, uint8_t num_func);
94 
95 
99  ~muComBase(void);
100 
101 
106  inline int16_t getLastCommTime(void)
107  { return (this->_getTimestamp() - this->_lastCommTime); }
108 
109 
114  void setTimeout(int16_t timeout);
115 
116 
124  uint8_t handle(void);
125 
126 
132  int8_t linkFunction(uint8_t index, muComFunc function);
133 
134 
141  int8_t linkVariable(uint8_t index, uint8_t *var, uint8_t size);
142 
143  inline void linkVariable(uint8_t index, uint8_t *var)
144  { this->linkVariable(index, (uint8_t*)var, sizeof(uint8_t)); }
145 
146  inline void linkVariable(uint8_t index, int8_t *var)
147  { this->linkVariable(index, (uint8_t*)var, sizeof(int8_t)); }
148 
149  inline void linkVariable(uint8_t index, uint16_t *var)
150  { this->linkVariable(index, (uint8_t*)var, sizeof(uint16_t)); }
151 
152  inline void linkVariable(uint8_t index, int16_t *var)
153  { this->linkVariable(index, (uint8_t*)var, sizeof(int16_t)); }
154 
155  inline void linkVariable(uint8_t index, uint32_t *var)
156  { this->linkVariable(index, (uint8_t*)var, sizeof(uint32_t)); }
157 
158  inline void linkVariable(uint8_t index, int32_t *var)
159  { this->linkVariable(index, (uint8_t*)var, sizeof(int32_t)); }
160 
161  inline void linkVariable(uint8_t index, uint64_t *var)
162  { this->linkVariable(index, (uint8_t*)var, sizeof(uint64_t)); }
163 
164  inline void linkVariable(uint8_t index, int64_t *var)
165  { this->linkVariable(index, (uint8_t*)var, sizeof(int64_t)); }
166 
167  inline void linkVariable(uint8_t index, float *var)
168  { this->linkVariable(index, (uint8_t*)var, sizeof(float)); }
169 
170 
177  inline void invokeFunction(uint8_t index, uint8_t* data, uint8_t cnt)
178  { this->writeRaw(MUCOM_EXECUTE_REQUEST, index, data, cnt); }
179 
185  inline void invokeFunction(uint8_t index)
186  { uint8_t dummy; this->writeRaw(MUCOM_EXECUTE_REQUEST, index, &dummy, 1); }
187 
188 
195  inline void write(uint8_t index, uint8_t *data, uint8_t cnt)
196  { this->writeRaw(MUCOM_WRITE_REQUEST, index, data, cnt); }
197 
203  inline void writeByte(uint8_t index, uint8_t data)
204  { this->write(index, (uint8_t*)&data, sizeof(uint8_t)); }
205 
211  inline void writeShort(uint8_t index, uint16_t data)
212  { this->write(index, (uint8_t*)&data, sizeof(uint16_t)); }
213 
219  inline void writeLong(uint8_t index, uint32_t data)
220  { this->write(index, (uint8_t*)&data, sizeof(uint32_t)); }
221 
227  inline void writeLongLong(uint8_t index, uint64_t data)
228  { this->write(index, (uint8_t*)&data, sizeof(uint64_t)); }
229 
235  inline void writeFloat(uint8_t index, float data)
236  { this->write(index, (uint8_t*)&data, sizeof(float)); }
237 
238 
245  int8_t read(uint8_t index, uint8_t *data, uint8_t cnt);
246 
253  inline int8_t readByte(uint8_t index, uint8_t *data)
254  { return this->read(index, (uint8_t*)data, sizeof(uint8_t)); }
255 
256  inline int8_t readByte(uint8_t index, int8_t *data)
257  { return this->read(index, (uint8_t*)data, sizeof(int8_t)); }
258 
265  inline int8_t readShort(uint8_t index, uint16_t *data)
266  { return this->read(index, (uint8_t*)data, sizeof(uint16_t)); }
267 
268  inline int8_t readShort(uint8_t index, int16_t *data)
269  { return this->read(index, (uint8_t*)data, sizeof(int16_t)); }
270 
277  inline int8_t readLong(uint8_t index, uint32_t *data)
278  { return this->read(index, (uint8_t*)data, sizeof(uint32_t)); }
279 
280  inline int8_t readLong(uint8_t index, int32_t *data)
281  { return this->read(index, (uint8_t*)data, sizeof(int32_t)); }
282 
289  inline int8_t readLongLong(uint8_t index, uint64_t *data)
290  { return this->read(index, (uint8_t*)data, sizeof(uint64_t)); }
291 
292  inline int8_t readLongLong(uint8_t index, int64_t *data)
293  { return this->read(index, (uint8_t*)data, sizeof(int64_t)); }
294 
301  inline int8_t readFloat(uint8_t index, float *data)
302  { return this->read(index, (uint8_t*)data, sizeof(float)); }
303 
310  uint8_t readByte(uint8_t index);
311 
318  uint16_t readShort(uint8_t index);
319 
326  uint32_t readLong(uint8_t index);
327 
334  uint64_t readLongLong(uint8_t index);
335 
342  float readFloat(uint8_t index);
343 };
344 
345 
346 #endif //MUCOMBASE_H
muComBase::getLastCommTime
int16_t getLastCommTime(void)
Get timestamp of last successful communication.
Definition: muComBase.h:106
muComBase::~muComBase
~muComBase(void)
Destructor of the base class.
Definition: muComBase.cpp:66
muComBase::invokeFunction
void invokeFunction(uint8_t index)
Invoke a function at the communication partner.
Definition: muComBase.h:185
muComBase::writeShort
void writeShort(uint8_t index, uint16_t data)
Write a short (16 bit) to the communication partner.
Definition: muComBase.h:211
muComBase::write
void write(uint8_t index, uint8_t *data, uint8_t cnt)
Write a data array to a remote variable.
Definition: muComBase.h:195
muComBase::readLongLong
int8_t readLongLong(uint8_t index, uint64_t *data)
Read a long long from the communication partner.
Definition: muComBase.h:289
muComBase::invokeFunction
void invokeFunction(uint8_t index, uint8_t *data, uint8_t cnt)
Invoke a function at the communication partner.
Definition: muComBase.h:177
muComBase::writeByte
void writeByte(uint8_t index, uint8_t data)
Write a byte (8 bit) to the communication partner.
Definition: muComBase.h:203
muComBase::readShort
int8_t readShort(uint8_t index, uint16_t *data)
Read a short from the communication partner.
Definition: muComBase.h:265
muComBase::writeLong
void writeLong(uint8_t index, uint32_t data)
Write a long (32 bit) to the communication partner.
Definition: muComBase.h:219
muComBase::linkVariable
int8_t linkVariable(uint8_t index, uint8_t *var, uint8_t size)
Link a variable or a buffer to the muCom interface.
Definition: muComBase.cpp:216
muComBase::readFloat
int8_t readFloat(uint8_t index, float *data)
Read a float from the communication partner.
Definition: muComBase.h:301
muComBase::handle
uint8_t handle(void)
Handle the muCom interface.
Definition: muComBase.cpp:85
muComBase::read
int8_t read(uint8_t index, uint8_t *data, uint8_t cnt)
Read data from the communication partner.
Definition: muComBase.cpp:268
muComBase::writeLongLong
void writeLongLong(uint8_t index, uint64_t data)
Write a long long (64 bit) to the communication partner.
Definition: muComBase.h:227
muComBase::muComBase
muComBase(uint8_t num_var, uint8_t num_func)
Constructor of the base class.
Definition: muComBase.cpp:47
muComBase::writeFloat
void writeFloat(uint8_t index, float data)
Write a float to the communication partner.
Definition: muComBase.h:235
muComBase::readByte
int8_t readByte(uint8_t index, uint8_t *data)
Read a byte from the communication partner.
Definition: muComBase.h:253
muComBase::readLong
int8_t readLong(uint8_t index, uint32_t *data)
Read a long from the communication partner.
Definition: muComBase.h:277
muComBase
Base muCom class.
Definition: muComBase.h:56
muComBase::linkFunction
int8_t linkFunction(uint8_t index, muComFunc function)
Link function to the muCom interface.
Definition: muComBase.cpp:202
muCom_LinkedVariable_str
Internal structure to store references to linked variables.
Definition: muComBase.h:45
muComBase::setTimeout
void setTimeout(int16_t timeout)
Set timeout for read requests.
Definition: muComBase.cpp:74