Framework for reading and writing variables in real time on any MBED platform.

DistantIO

This is the C implementation of the DistantIO slave framework.

Library is working but slight API breaks may occur in the future. C++ version is also in development.

To get the master-side implementation, see https://github.com/Overdrivr/DistantIO

Committer:
Overdrivr
Date:
Fri Oct 16 16:16:19 2015 +0000
Revision:
6:72d46dbdbe7a
Parent:
5:e8936f38a338
removed 'static' keyword in front arrays that just increase RAM usage (premature optimization)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Overdrivr 2:f2c816b681e3 1 /*
Overdrivr 2:f2c816b681e3 2 * distantio.c
Overdrivr 2:f2c816b681e3 3 *
Overdrivr 2:f2c816b681e3 4 * Created on: Oct 13, 2014
Overdrivr 2:f2c816b681e3 5 * Author: B48923
Overdrivr 2:f2c816b681e3 6 */
Overdrivr 0:c4676d32d381 7
Overdrivr 0:c4676d32d381 8 #include "distantio.h"
Overdrivr 0:c4676d32d381 9 #include "crc.h"
Overdrivr 0:c4676d32d381 10 #include "string.h"
Overdrivr 0:c4676d32d381 11 #include "protocol.h"
Overdrivr 0:c4676d32d381 12
Overdrivr 2:f2c816b681e3 13 /*
Overdrivr 2:f2c816b681e3 14 * WARNING : IMPLEMENTATION FOR LITTLE-ENDIAN PROCESSOR
Overdrivr 2:f2c816b681e3 15 * TODO : HANDLE BOTH
Overdrivr 2:f2c816b681e3 16 */
Overdrivr 0:c4676d32d381 17
Overdrivr 0:c4676d32d381 18 static log Log;
Overdrivr 0:c4676d32d381 19 uint32_t tmp;
Overdrivr 0:c4676d32d381 20
Overdrivr 4:d675ad9c57ff 21 void _dIO_send_variable(uint16_t index,float extra_identifier_1,uint16_t extra_identifier_2=0);
Overdrivr 4:d675ad9c57ff 22 uint16_t _dIO_get_size(dio_type type);
Overdrivr 4:d675ad9c57ff 23 void _dIO_send_descriptor(uint16_t index);
Overdrivr 4:d675ad9c57ff 24 void _dIO_send_group_descriptor(uint16_t index);
Overdrivr 0:c4676d32d381 25
Overdrivr 4:d675ad9c57ff 26
Overdrivr 4:d675ad9c57ff 27 void dIO_init()
Overdrivr 0:c4676d32d381 28 {
Overdrivr 0:c4676d32d381 29 uint16_t i;
Overdrivr 0:c4676d32d381 30 char default_name[] = {"undef. "};
Overdrivr 0:c4676d32d381 31 Log.amount = 0;
Overdrivr 0:c4676d32d381 32 for(i = 0 ; i < VARIABLES_AMOUNT ; i++)
Overdrivr 0:c4676d32d381 33 {
Overdrivr 0:c4676d32d381 34 Log.variables[i].size = 0;
Overdrivr 0:c4676d32d381 35 Log.variables[i].ptr = 0;
Overdrivr 0:c4676d32d381 36 Log.variables[i].writeable = 0;
Overdrivr 0:c4676d32d381 37 Log.variables[i].id = i;
Overdrivr 3:135f55b5334e 38 strncpy(Log.variables[i].name,default_name,NAMESIZE);
Overdrivr 0:c4676d32d381 39 Log.variables[i].send = 0;
Overdrivr 0:c4676d32d381 40 Log.variables[i].groupID = 0;
Overdrivr 0:c4676d32d381 41 }
Overdrivr 0:c4676d32d381 42 tmp=0;
Overdrivr 0:c4676d32d381 43 Log.current_group_id = 0;
Overdrivr 3:135f55b5334e 44 strncpy(Log.groups[0].name,"default",NAMESIZE);
Overdrivr 0:c4676d32d381 45 }
Overdrivr 0:c4676d32d381 46
Overdrivr 4:d675ad9c57ff 47 uint8_t dIO_var(void* ptr, uint16_t size, dio_type type, uint8_t writeable, char* name, float refresh_rate)
Overdrivr 0:c4676d32d381 48 {
Overdrivr 0:c4676d32d381 49 // Too many variables, aborting
Overdrivr 0:c4676d32d381 50 if(Log.amount >= VARIABLES_AMOUNT)
Overdrivr 0:c4676d32d381 51 return 1;
Overdrivr 0:c4676d32d381 52
Overdrivr 0:c4676d32d381 53 Log.variables[Log.amount].ptr = (uint8_t*) ptr;
Overdrivr 4:d675ad9c57ff 54 Log.variables[Log.amount].size = _dIO_get_size(type);
Overdrivr 0:c4676d32d381 55 Log.variables[Log.amount].writeable = writeable;
Overdrivr 0:c4676d32d381 56 Log.variables[Log.amount].type = type;
Overdrivr 0:c4676d32d381 57 Log.variables[Log.amount].groupID = Log.current_group_id;
Overdrivr 3:135f55b5334e 58 strncpy(Log.variables[Log.amount].name,name,NAMESIZE);
Overdrivr 2:f2c816b681e3 59 Log.variables[Log.amount].refresh_rate = refresh_rate;
Overdrivr 2:f2c816b681e3 60 Log.variables[Log.amount].last_refreshed = 0;
Overdrivr 0:c4676d32d381 61 Log.amount++;
Overdrivr 0:c4676d32d381 62
Overdrivr 0:c4676d32d381 63 return 0;
Overdrivr 0:c4676d32d381 64 }
Overdrivr 0:c4676d32d381 65
Overdrivr 4:d675ad9c57ff 66 void dIO_group(char* groupname)
Overdrivr 0:c4676d32d381 67 {
Overdrivr 0:c4676d32d381 68 Log.current_group_id++;
Overdrivr 3:135f55b5334e 69 strncpy(Log.groups[Log.current_group_id].name,groupname,NAMESIZE);
Overdrivr 0:c4676d32d381 70 }
Overdrivr 0:c4676d32d381 71
Overdrivr 4:d675ad9c57ff 72 void dIO_decode(uint8_t* data,uint16_t datasize)
Overdrivr 4:d675ad9c57ff 73 {
Overdrivr 4:d675ad9c57ff 74 // First check data size
Overdrivr 4:d675ad9c57ff 75 if(datasize != FRAMESIZE)
Overdrivr 4:d675ad9c57ff 76 return;
Overdrivr 4:d675ad9c57ff 77
Overdrivr 4:d675ad9c57ff 78 // Second, check CRC
Overdrivr 4:d675ad9c57ff 79 uint16_t crc_value = crc16(data,FRAMESIZE-2);
Overdrivr 4:d675ad9c57ff 80 uint16_t crc_rx = ((uint16_t)data[FRAMESIZE-2] << 8) | data[FRAMESIZE-1];
Overdrivr 4:d675ad9c57ff 81
Overdrivr 4:d675ad9c57ff 82 if(crc_value != crc_rx)
Overdrivr 4:d675ad9c57ff 83 return;
Overdrivr 4:d675ad9c57ff 84
Overdrivr 4:d675ad9c57ff 85 // Process frame
Overdrivr 4:d675ad9c57ff 86 // First, identify command
Overdrivr 4:d675ad9c57ff 87 uint8_t command = data[0];
Overdrivr 4:d675ad9c57ff 88
Overdrivr 4:d675ad9c57ff 89 // Second, identify variable ID
Overdrivr 4:d675ad9c57ff 90 uint16_t ID = data[2] + (data[1] << 8);
Overdrivr 4:d675ad9c57ff 91 ID = (ID & 0x3FF);
Overdrivr 4:d675ad9c57ff 92
Overdrivr 4:d675ad9c57ff 93 // Third, identify data type
Overdrivr 4:d675ad9c57ff 94 uint8_t type = data[3];
Overdrivr 4:d675ad9c57ff 95
Overdrivr 4:d675ad9c57ff 96 switch(command)
Overdrivr 4:d675ad9c57ff 97 {
Overdrivr 4:d675ad9c57ff 98 // User requested descriptors
Overdrivr 4:d675ad9c57ff 99 case 0x02:
Overdrivr 4:d675ad9c57ff 100 // Send variables
Overdrivr 4:d675ad9c57ff 101 for(uint16_t i = 0 ; i < Log.amount ; i++)
Overdrivr 4:d675ad9c57ff 102 _dIO_send_descriptor(i);
Overdrivr 4:d675ad9c57ff 103 // Send groups
Overdrivr 4:d675ad9c57ff 104 for(uint16_t i = 0 ; i <= Log.current_group_id ; i++)
Overdrivr 4:d675ad9c57ff 105 _dIO_send_group_descriptor(i);
Overdrivr 4:d675ad9c57ff 106 break;
Overdrivr 4:d675ad9c57ff 107
Overdrivr 4:d675ad9c57ff 108 // User provided value to write
Overdrivr 4:d675ad9c57ff 109 case 0x04:
Overdrivr 4:d675ad9c57ff 110 if(ID >= Log.amount)
Overdrivr 4:d675ad9c57ff 111 return;
Overdrivr 4:d675ad9c57ff 112
Overdrivr 4:d675ad9c57ff 113 if(Log.variables[ID].writeable == 0x00)
Overdrivr 4:d675ad9c57ff 114 return;
Overdrivr 4:d675ad9c57ff 115
Overdrivr 4:d675ad9c57ff 116 if(Log.variables[ID].type != type)
Overdrivr 4:d675ad9c57ff 117 return;
Overdrivr 4:d675ad9c57ff 118
Overdrivr 4:d675ad9c57ff 119 uint16_t start_address = DATASTART + DATASIZE - 1;
Overdrivr 0:c4676d32d381 120
Overdrivr 4:d675ad9c57ff 121 // Copy contents directly into variable
Overdrivr 4:d675ad9c57ff 122 for(uint16_t i = 0 ; i < Log.variables[ID].size ; i++)
Overdrivr 4:d675ad9c57ff 123 {
Overdrivr 4:d675ad9c57ff 124 // Packet is big-endian, convert to little-endian
Overdrivr 4:d675ad9c57ff 125 uint8_t offset = start_address - i;
Overdrivr 4:d675ad9c57ff 126 *(Log.variables[ID].ptr + i) = *(data + offset);
Overdrivr 4:d675ad9c57ff 127 }
Overdrivr 4:d675ad9c57ff 128 break;
Overdrivr 4:d675ad9c57ff 129
Overdrivr 4:d675ad9c57ff 130 // User requested variable read
Overdrivr 4:d675ad9c57ff 131 case 0x05:
Overdrivr 4:d675ad9c57ff 132 if(ID >= Log.amount)
Overdrivr 4:d675ad9c57ff 133 return;
Overdrivr 4:d675ad9c57ff 134
Overdrivr 4:d675ad9c57ff 135 Log.variables[ID].send = 1;
Overdrivr 4:d675ad9c57ff 136 break;
Overdrivr 4:d675ad9c57ff 137
Overdrivr 4:d675ad9c57ff 138 // User requested stop variable read
Overdrivr 4:d675ad9c57ff 139 case 0x06:
Overdrivr 4:d675ad9c57ff 140 if(ID >= Log.amount)
Overdrivr 4:d675ad9c57ff 141 return;
Overdrivr 4:d675ad9c57ff 142 Log.variables[ID].send = 0;
Overdrivr 4:d675ad9c57ff 143 break;
Overdrivr 4:d675ad9c57ff 144
Overdrivr 4:d675ad9c57ff 145 }
Overdrivr 4:d675ad9c57ff 146 }
Overdrivr 4:d675ad9c57ff 147
Overdrivr 4:d675ad9c57ff 148 void dIO_update(float current_time)
Overdrivr 4:d675ad9c57ff 149 {
Overdrivr 4:d675ad9c57ff 150 for(uint16_t i = 0 ; i < Log.amount ; i++)
Overdrivr 4:d675ad9c57ff 151 {
Overdrivr 4:d675ad9c57ff 152 if(Log.variables[i].send == 0)
Overdrivr 4:d675ad9c57ff 153 continue;
Overdrivr 4:d675ad9c57ff 154
Overdrivr 4:d675ad9c57ff 155 if(current_time < Log.variables[i].last_refreshed + Log.variables[i].refresh_rate)
Overdrivr 4:d675ad9c57ff 156 continue;
Overdrivr 4:d675ad9c57ff 157
Overdrivr 4:d675ad9c57ff 158 _dIO_send_variable(i,current_time);
Overdrivr 4:d675ad9c57ff 159 Log.variables[i].last_refreshed = current_time;
Overdrivr 4:d675ad9c57ff 160 }
Overdrivr 4:d675ad9c57ff 161 }
Overdrivr 4:d675ad9c57ff 162
Overdrivr 4:d675ad9c57ff 163 void dIO_send_alive()
Overdrivr 4:d675ad9c57ff 164 {
Overdrivr 6:72d46dbdbe7a 165 uint8_t buffer[FRAMESIZE];
Overdrivr 4:d675ad9c57ff 166 buffer[0] = 0x03;
Overdrivr 4:d675ad9c57ff 167
Overdrivr 4:d675ad9c57ff 168 // Compute crc
Overdrivr 4:d675ad9c57ff 169 uint16_t crc_value = crc16(buffer,FRAMESIZE - 2);
Overdrivr 4:d675ad9c57ff 170
Overdrivr 4:d675ad9c57ff 171 // Write crc into buffer's last byte
Overdrivr 4:d675ad9c57ff 172 buffer[FRAMESIZE - 1] = crc_value & 0xFF;
Overdrivr 4:d675ad9c57ff 173 buffer[FRAMESIZE - 2] = (crc_value >> 8) & 0xFF;
Overdrivr 4:d675ad9c57ff 174
Overdrivr 4:d675ad9c57ff 175 // Send frame to encoding
Overdrivr 4:d675ad9c57ff 176 encode(buffer,FRAMESIZE);
Overdrivr 4:d675ad9c57ff 177 }
Overdrivr 4:d675ad9c57ff 178
Overdrivr 5:e8936f38a338 179 void dIO_emergency_send(void* ptr, uint16_t size, dio_type type, char* name, float recordingtime, uint16_t index)
Overdrivr 5:e8936f38a338 180 {
Overdrivr 5:e8936f38a338 181
Overdrivr 6:72d46dbdbe7a 182 uint8_t buffer[FRAMESIZE];
Overdrivr 5:e8936f38a338 183
Overdrivr 5:e8936f38a338 184 // Response code 0x09
Overdrivr 5:e8936f38a338 185 buffer[0] = 0x09;
Overdrivr 5:e8936f38a338 186
Overdrivr 5:e8936f38a338 187 // Write variable ID
Overdrivr 5:e8936f38a338 188 uint8_t * temp_ptr = (uint8_t*)(name);
Overdrivr 5:e8936f38a338 189 buffer[1] = *(temp_ptr + 1);
Overdrivr 5:e8936f38a338 190 buffer[2] = *(temp_ptr);
Overdrivr 5:e8936f38a338 191
Overdrivr 5:e8936f38a338 192 // Write variable type
Overdrivr 5:e8936f38a338 193 buffer[3] = type;
Overdrivr 5:e8936f38a338 194
Overdrivr 5:e8936f38a338 195 // Extra identifier 1
Overdrivr 5:e8936f38a338 196 temp_ptr = (uint8_t*)(&recordingtime);
Overdrivr 5:e8936f38a338 197 buffer[4] = *(temp_ptr + 3);
Overdrivr 5:e8936f38a338 198 buffer[5] = *(temp_ptr + 2);
Overdrivr 5:e8936f38a338 199 buffer[6] = *(temp_ptr + 1);
Overdrivr 5:e8936f38a338 200 buffer[7] = *(temp_ptr );
Overdrivr 5:e8936f38a338 201
Overdrivr 5:e8936f38a338 202 // Extra identifier 2
Overdrivr 5:e8936f38a338 203 temp_ptr = (uint8_t*)(&index);
Overdrivr 5:e8936f38a338 204 buffer[8] = *(temp_ptr + 1);
Overdrivr 5:e8936f38a338 205 buffer[9] = *(temp_ptr );
Overdrivr 5:e8936f38a338 206
Overdrivr 5:e8936f38a338 207 uint16_t i = 10;
Overdrivr 5:e8936f38a338 208
Overdrivr 5:e8936f38a338 209 // Write data
Overdrivr 5:e8936f38a338 210 for(uint16_t k = 0 ; k < DATASIZE ; k++)
Overdrivr 5:e8936f38a338 211 {
Overdrivr 5:e8936f38a338 212 uint16_t off = DATASIZE - 1 - k;
Overdrivr 5:e8936f38a338 213
Overdrivr 5:e8936f38a338 214 // Fill buffer with data
Overdrivr 5:e8936f38a338 215 if(off < size)
Overdrivr 5:e8936f38a338 216 {
Overdrivr 5:e8936f38a338 217 temp_ptr = (uint8_t*)(ptr) + off ;
Overdrivr 5:e8936f38a338 218 buffer[i++] = *temp_ptr;
Overdrivr 5:e8936f38a338 219 }
Overdrivr 5:e8936f38a338 220 // Fill remaining bits with 0
Overdrivr 5:e8936f38a338 221 else
Overdrivr 5:e8936f38a338 222 {
Overdrivr 5:e8936f38a338 223 buffer[i++] = 0;
Overdrivr 5:e8936f38a338 224 }
Overdrivr 5:e8936f38a338 225 }
Overdrivr 5:e8936f38a338 226
Overdrivr 5:e8936f38a338 227 // Compute crc
Overdrivr 5:e8936f38a338 228 uint16_t crc_value = crc16(buffer,i);
Overdrivr 5:e8936f38a338 229
Overdrivr 5:e8936f38a338 230 // Write crc into buffer's last byte
Overdrivr 5:e8936f38a338 231 buffer[i++] = (crc_value >> 8) & 0xFF;
Overdrivr 5:e8936f38a338 232 buffer[i++] = crc_value & 0xFF;
Overdrivr 5:e8936f38a338 233
Overdrivr 5:e8936f38a338 234 // Encode frame
Overdrivr 5:e8936f38a338 235 encode(buffer,i);
Overdrivr 5:e8936f38a338 236 }
Overdrivr 5:e8936f38a338 237
Overdrivr 4:d675ad9c57ff 238 /* ------------------- PRIVATE FUNCTIONS ------------------ */
Overdrivr 4:d675ad9c57ff 239
Overdrivr 4:d675ad9c57ff 240 void _dIO_send_descriptor(uint16_t index)
Overdrivr 0:c4676d32d381 241 {
Overdrivr 0:c4676d32d381 242 if(index >= Log.amount)
Overdrivr 0:c4676d32d381 243 return;
Overdrivr 0:c4676d32d381 244
Overdrivr 6:72d46dbdbe7a 245 uint8_t buffer[FRAMESIZE];
Overdrivr 0:c4676d32d381 246 uint8_t type;
Overdrivr 0:c4676d32d381 247
Overdrivr 0:c4676d32d381 248 // Respond returned-descriptor
Overdrivr 0:c4676d32d381 249 buffer[0] = 0x00;
Overdrivr 0:c4676d32d381 250
Overdrivr 0:c4676d32d381 251 // Write id
Overdrivr 0:c4676d32d381 252 uint16_t ID = ((Log.variables[index].groupID & 0x003F) << 10) + (index & 0x3FF);
Overdrivr 0:c4676d32d381 253 uint8_t * temp_ptr = (uint8_t*)(&ID);
Overdrivr 0:c4676d32d381 254 buffer[1] = *(temp_ptr + 1);
Overdrivr 0:c4676d32d381 255 buffer[2] = *(temp_ptr );
Overdrivr 0:c4676d32d381 256
Overdrivr 0:c4676d32d381 257 // Write type & writeable
Overdrivr 0:c4676d32d381 258
Overdrivr 0:c4676d32d381 259 type = (uint8_t)(Log.variables[index].type);
Overdrivr 0:c4676d32d381 260
Overdrivr 0:c4676d32d381 261 if(Log.variables[index].writeable)
Overdrivr 0:c4676d32d381 262 type += 0xF0;
Overdrivr 0:c4676d32d381 263
Overdrivr 0:c4676d32d381 264 buffer[3] = type;
Overdrivr 0:c4676d32d381 265
Overdrivr 0:c4676d32d381 266 //Write name
Overdrivr 0:c4676d32d381 267 uint16_t i = 4;
Overdrivr 3:135f55b5334e 268 // TODO : Replace with strncpy
Overdrivr 3:135f55b5334e 269 for(uint16_t k = 0 ; k < NAMESIZE ; k++)
Overdrivr 0:c4676d32d381 270 {
Overdrivr 0:c4676d32d381 271 if(k < strlen(Log.variables[index].name))
Overdrivr 0:c4676d32d381 272 {
Overdrivr 0:c4676d32d381 273 buffer[i] = Log.variables[index].name[k];
Overdrivr 0:c4676d32d381 274 i++;
Overdrivr 0:c4676d32d381 275 }
Overdrivr 0:c4676d32d381 276 else
Overdrivr 0:c4676d32d381 277 buffer[i++] = 0;
Overdrivr 0:c4676d32d381 278 }
Overdrivr 0:c4676d32d381 279
Overdrivr 0:c4676d32d381 280 // Compute crc
Overdrivr 0:c4676d32d381 281 uint16_t crc_value = crc16(buffer,i);
Overdrivr 0:c4676d32d381 282
Overdrivr 0:c4676d32d381 283 // Write crc into buffer's last byte
Overdrivr 0:c4676d32d381 284 buffer[i++] = (crc_value >> 8) & 0xFF;
Overdrivr 0:c4676d32d381 285 buffer[i++] = crc_value & 0xFF;
Overdrivr 0:c4676d32d381 286
Overdrivr 0:c4676d32d381 287 // Encode frame
Overdrivr 0:c4676d32d381 288 encode(buffer,i);
Overdrivr 0:c4676d32d381 289 }
Overdrivr 0:c4676d32d381 290
Overdrivr 4:d675ad9c57ff 291 void _dIO_send_group_descriptor(uint16_t index)
Overdrivr 0:c4676d32d381 292 {
Overdrivr 0:c4676d32d381 293 if(index > Log.current_group_id)
Overdrivr 0:c4676d32d381 294 return;
Overdrivr 0:c4676d32d381 295
Overdrivr 6:72d46dbdbe7a 296 uint8_t buffer[FRAMESIZE];
Overdrivr 0:c4676d32d381 297
Overdrivr 0:c4676d32d381 298 // Respond returned-descriptor
Overdrivr 0:c4676d32d381 299 buffer[0] = 0x00;
Overdrivr 0:c4676d32d381 300
Overdrivr 0:c4676d32d381 301 // Write id
Overdrivr 0:c4676d32d381 302 uint16_t ID = (index & 0x3F) << 10;
Overdrivr 0:c4676d32d381 303 uint8_t * temp_ptr = (uint8_t*)(&ID);
Overdrivr 0:c4676d32d381 304 buffer[1] = *(temp_ptr + 1);
Overdrivr 0:c4676d32d381 305 buffer[2] = *(temp_ptr);
Overdrivr 0:c4676d32d381 306
Overdrivr 0:c4676d32d381 307 // Write type
Overdrivr 0:c4676d32d381 308 buffer[3] = 0x07;
Overdrivr 0:c4676d32d381 309
Overdrivr 0:c4676d32d381 310 //Write name
Overdrivr 0:c4676d32d381 311 uint16_t i = 4;
Overdrivr 3:135f55b5334e 312 for(uint16_t k = 0 ; k < NAMESIZE ; k++)
Overdrivr 0:c4676d32d381 313 {
Overdrivr 0:c4676d32d381 314 if(k < strlen(Log.groups[index].name))
Overdrivr 0:c4676d32d381 315 {
Overdrivr 0:c4676d32d381 316 buffer[i] = Log.groups[index].name[k];
Overdrivr 0:c4676d32d381 317 i++;
Overdrivr 0:c4676d32d381 318 }
Overdrivr 0:c4676d32d381 319 else
Overdrivr 0:c4676d32d381 320 buffer[i++] = 0;
Overdrivr 0:c4676d32d381 321 }
Overdrivr 0:c4676d32d381 322
Overdrivr 0:c4676d32d381 323 // Compute crc
Overdrivr 0:c4676d32d381 324 uint16_t crc_value = crc16(buffer,i);
Overdrivr 0:c4676d32d381 325
Overdrivr 0:c4676d32d381 326 // Write crc into buffer's last byte
Overdrivr 0:c4676d32d381 327 buffer[i++] = (crc_value >> 8) & 0xFF;
Overdrivr 0:c4676d32d381 328 buffer[i++] = crc_value & 0xFF;
Overdrivr 0:c4676d32d381 329
Overdrivr 0:c4676d32d381 330 // Encode frame
Overdrivr 0:c4676d32d381 331 encode(buffer,i);
Overdrivr 0:c4676d32d381 332 }
Overdrivr 0:c4676d32d381 333
Overdrivr 0:c4676d32d381 334
Overdrivr 4:d675ad9c57ff 335 void _dIO_send_variable(uint16_t index,float extra_identifier_1,uint16_t extra_identifier_2)
Overdrivr 0:c4676d32d381 336 {
Overdrivr 0:c4676d32d381 337 if(index >= Log.amount)
Overdrivr 0:c4676d32d381 338 return;
Overdrivr 0:c4676d32d381 339
Overdrivr 6:72d46dbdbe7a 340 uint8_t buffer[FRAMESIZE];
Overdrivr 0:c4676d32d381 341
Overdrivr 0:c4676d32d381 342 // Response code 0x01
Overdrivr 0:c4676d32d381 343 buffer[0] = 0x01;
Overdrivr 0:c4676d32d381 344
Overdrivr 0:c4676d32d381 345 // Write variable ID
Overdrivr 0:c4676d32d381 346 uint16_t ID = ((Log.variables[index].groupID & 0x003F) << 10) + (index & 0x3FF);
Overdrivr 0:c4676d32d381 347 uint8_t * temp_ptr = (uint8_t*)(&ID);
Overdrivr 0:c4676d32d381 348 buffer[1] = *(temp_ptr + 1);
Overdrivr 0:c4676d32d381 349 buffer[2] = *(temp_ptr);
Overdrivr 0:c4676d32d381 350
Overdrivr 0:c4676d32d381 351 // Write variable type
Overdrivr 0:c4676d32d381 352 buffer[3] = Log.variables[index].type;
Overdrivr 0:c4676d32d381 353 //TODO writeable
Overdrivr 3:135f55b5334e 354
Overdrivr 3:135f55b5334e 355 // Extra identifier 1
Overdrivr 3:135f55b5334e 356 temp_ptr = (uint8_t*)(&extra_identifier_1);
Overdrivr 3:135f55b5334e 357 buffer[4] = *(temp_ptr + 3);
Overdrivr 3:135f55b5334e 358 buffer[5] = *(temp_ptr + 2);
Overdrivr 3:135f55b5334e 359 buffer[6] = *(temp_ptr + 1);
Overdrivr 3:135f55b5334e 360 buffer[7] = *(temp_ptr );
Overdrivr 3:135f55b5334e 361
Overdrivr 3:135f55b5334e 362 // Extra identifier 2
Overdrivr 3:135f55b5334e 363 temp_ptr = (uint8_t*)(&extra_identifier_2);
Overdrivr 3:135f55b5334e 364 buffer[8] = *(temp_ptr + 1);
Overdrivr 3:135f55b5334e 365 buffer[9] = *(temp_ptr );
Overdrivr 3:135f55b5334e 366
Overdrivr 3:135f55b5334e 367 uint16_t i = 10;
Overdrivr 0:c4676d32d381 368
Overdrivr 0:c4676d32d381 369 // Write data
Overdrivr 3:135f55b5334e 370 for(uint16_t k = 0 ; k < DATASIZE ; k++)
Overdrivr 0:c4676d32d381 371 {
Overdrivr 3:135f55b5334e 372 uint16_t off = DATASIZE - 1 - k;
Overdrivr 0:c4676d32d381 373
Overdrivr 0:c4676d32d381 374 // Fill buffer with data
Overdrivr 0:c4676d32d381 375 if(off < Log.variables[index].size)
Overdrivr 0:c4676d32d381 376 {
Overdrivr 0:c4676d32d381 377 temp_ptr = Log.variables[index].ptr + off ;
Overdrivr 0:c4676d32d381 378 buffer[i++] = *temp_ptr;
Overdrivr 0:c4676d32d381 379 }
Overdrivr 0:c4676d32d381 380 // Fill remaining bits with 0
Overdrivr 0:c4676d32d381 381 else
Overdrivr 0:c4676d32d381 382 {
Overdrivr 0:c4676d32d381 383 buffer[i++] = 0;
Overdrivr 0:c4676d32d381 384 }
Overdrivr 0:c4676d32d381 385 }
Overdrivr 0:c4676d32d381 386
Overdrivr 0:c4676d32d381 387 // Compute crc
Overdrivr 0:c4676d32d381 388 uint16_t crc_value = crc16(buffer,i);
Overdrivr 0:c4676d32d381 389
Overdrivr 0:c4676d32d381 390 // Write crc into buffer's last byte
Overdrivr 0:c4676d32d381 391 buffer[i++] = (crc_value >> 8) & 0xFF;
Overdrivr 0:c4676d32d381 392 buffer[i++] = crc_value & 0xFF;
Overdrivr 0:c4676d32d381 393
Overdrivr 0:c4676d32d381 394 // Encode frame
Overdrivr 0:c4676d32d381 395 encode(buffer,i);
Overdrivr 0:c4676d32d381 396 }
Overdrivr 0:c4676d32d381 397
Overdrivr 0:c4676d32d381 398
Overdrivr 4:d675ad9c57ff 399 uint16_t _dIO_get_size(dio_type type)
Overdrivr 0:c4676d32d381 400 {
Overdrivr 0:c4676d32d381 401 switch(type)
Overdrivr 0:c4676d32d381 402 {
Overdrivr 0:c4676d32d381 403 case dio_type_FLOAT:
Overdrivr 0:c4676d32d381 404 case dio_type_UINT32:
Overdrivr 0:c4676d32d381 405 case dio_type_INT32:
Overdrivr 0:c4676d32d381 406 return 4;
Overdrivr 0:c4676d32d381 407
Overdrivr 0:c4676d32d381 408 case dio_type_UINT16:
Overdrivr 0:c4676d32d381 409 case dio_type_INT16:
Overdrivr 0:c4676d32d381 410 return 2;
Overdrivr 0:c4676d32d381 411
Overdrivr 0:c4676d32d381 412 case dio_type_UINT8:
Overdrivr 0:c4676d32d381 413 case dio_type_INT8:
Overdrivr 0:c4676d32d381 414 default:
Overdrivr 0:c4676d32d381 415 return 1;
Overdrivr 0:c4676d32d381 416 }
Overdrivr 0:c4676d32d381 417 }