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
distantio.cpp@6:72d46dbdbe7a, 2015-10-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |