Generic communication interface between the wireless board (mote) and the sensor board. Any kind of sensor board can be connected to the mote using this specification given it provides a SPI peripheral, one input pin with interrupt capability and one digital output. The sensor board must implement a special register set from which all required information can be retrieved. Protocol: http://is.gd/wuQorh Github: http://is.gd/ySj1L9

Dependencies:   mbed-src

Committer:
marcelobarrosalmeida
Date:
Tue Apr 08 16:34:20 2014 +0000
Revision:
1:acdf490d94a7
Adding accel to sensor list

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcelobarrosalmeida 1:acdf490d94a7 1 #include <string.h>
marcelobarrosalmeida 1:acdf490d94a7 2 #include <stdint.h>
marcelobarrosalmeida 1:acdf490d94a7 3 #include "sens_itf.h"
marcelobarrosalmeida 1:acdf490d94a7 4 #include "../util/buf_io.h"
marcelobarrosalmeida 1:acdf490d94a7 5 #include "../util/crc16.h"
marcelobarrosalmeida 1:acdf490d94a7 6
marcelobarrosalmeida 1:acdf490d94a7 7 #define SENS_ITF_DBG_FRAME 1
marcelobarrosalmeida 1:acdf490d94a7 8
marcelobarrosalmeida 1:acdf490d94a7 9 uint8_t sens_itf_unpack_point_value(sens_itf_cmd_point_t *point, uint8_t *buf)
marcelobarrosalmeida 1:acdf490d94a7 10 {
marcelobarrosalmeida 1:acdf490d94a7 11 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 12
marcelobarrosalmeida 1:acdf490d94a7 13 switch (point->type)
marcelobarrosalmeida 1:acdf490d94a7 14 {
marcelobarrosalmeida 1:acdf490d94a7 15 case SENS_ITF_DT_U8:
marcelobarrosalmeida 1:acdf490d94a7 16 point->value.u8 = buf_io_get8_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 17 size = 1;
marcelobarrosalmeida 1:acdf490d94a7 18 break;
marcelobarrosalmeida 1:acdf490d94a7 19 case SENS_ITF_DT_S8:
marcelobarrosalmeida 1:acdf490d94a7 20 point->value.s8 = buf_io_get8_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 21 size = 1;
marcelobarrosalmeida 1:acdf490d94a7 22 break;
marcelobarrosalmeida 1:acdf490d94a7 23 case SENS_ITF_DT_U16:
marcelobarrosalmeida 1:acdf490d94a7 24 point->value.u16 = buf_io_get16_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 25 size = 2;
marcelobarrosalmeida 1:acdf490d94a7 26 break;
marcelobarrosalmeida 1:acdf490d94a7 27 case SENS_ITF_DT_S16:
marcelobarrosalmeida 1:acdf490d94a7 28 point->value.s16 = buf_io_get16_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 29 size = 2;
marcelobarrosalmeida 1:acdf490d94a7 30 break;
marcelobarrosalmeida 1:acdf490d94a7 31 case SENS_ITF_DT_U32:
marcelobarrosalmeida 1:acdf490d94a7 32 point->value.u32 = buf_io_get32_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 33 size = 4;
marcelobarrosalmeida 1:acdf490d94a7 34 break;
marcelobarrosalmeida 1:acdf490d94a7 35 case SENS_ITF_DT_S32:
marcelobarrosalmeida 1:acdf490d94a7 36 point->value.s32 = buf_io_get32_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 37 size = 4;
marcelobarrosalmeida 1:acdf490d94a7 38 break;
marcelobarrosalmeida 1:acdf490d94a7 39 case SENS_ITF_DT_U64:
marcelobarrosalmeida 1:acdf490d94a7 40 point->value.u64 = buf_io_get64_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 41 size = 8;
marcelobarrosalmeida 1:acdf490d94a7 42 break;
marcelobarrosalmeida 1:acdf490d94a7 43 case SENS_ITF_DT_S64:
marcelobarrosalmeida 1:acdf490d94a7 44 point->value.s64 = buf_io_get64_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 45 size = 8;
marcelobarrosalmeida 1:acdf490d94a7 46 break;
marcelobarrosalmeida 1:acdf490d94a7 47 case SENS_ITF_DT_FLOAT:
marcelobarrosalmeida 1:acdf490d94a7 48 point->value.fp32 = buf_io_getf_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 49 size = 4;
marcelobarrosalmeida 1:acdf490d94a7 50 break;
marcelobarrosalmeida 1:acdf490d94a7 51 case SENS_ITF_DT_DOUBLE:
marcelobarrosalmeida 1:acdf490d94a7 52 point->value.fp64 = buf_io_getd_fl(buf);
marcelobarrosalmeida 1:acdf490d94a7 53 size = 8;
marcelobarrosalmeida 1:acdf490d94a7 54 break;
marcelobarrosalmeida 1:acdf490d94a7 55 default:
marcelobarrosalmeida 1:acdf490d94a7 56 break;
marcelobarrosalmeida 1:acdf490d94a7 57 }
marcelobarrosalmeida 1:acdf490d94a7 58
marcelobarrosalmeida 1:acdf490d94a7 59 return size;
marcelobarrosalmeida 1:acdf490d94a7 60 }
marcelobarrosalmeida 1:acdf490d94a7 61
marcelobarrosalmeida 1:acdf490d94a7 62 uint8_t sens_itf_pack_point_value(const sens_itf_cmd_point_t *point, uint8_t *buf)
marcelobarrosalmeida 1:acdf490d94a7 63 {
marcelobarrosalmeida 1:acdf490d94a7 64 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 65
marcelobarrosalmeida 1:acdf490d94a7 66 switch (point->type)
marcelobarrosalmeida 1:acdf490d94a7 67 {
marcelobarrosalmeida 1:acdf490d94a7 68 case SENS_ITF_DT_U8:
marcelobarrosalmeida 1:acdf490d94a7 69 buf_io_put8_tl(point->value.u8, buf);
marcelobarrosalmeida 1:acdf490d94a7 70 size = 1;
marcelobarrosalmeida 1:acdf490d94a7 71 break;
marcelobarrosalmeida 1:acdf490d94a7 72 case SENS_ITF_DT_S8:
marcelobarrosalmeida 1:acdf490d94a7 73 buf_io_put8_tl(point->value.s8, buf);
marcelobarrosalmeida 1:acdf490d94a7 74 size = 1;
marcelobarrosalmeida 1:acdf490d94a7 75 break;
marcelobarrosalmeida 1:acdf490d94a7 76 case SENS_ITF_DT_U16:
marcelobarrosalmeida 1:acdf490d94a7 77 buf_io_put16_tl(point->value.u16, buf);
marcelobarrosalmeida 1:acdf490d94a7 78 size = 2;
marcelobarrosalmeida 1:acdf490d94a7 79 break;
marcelobarrosalmeida 1:acdf490d94a7 80 case SENS_ITF_DT_S16:
marcelobarrosalmeida 1:acdf490d94a7 81 buf_io_put16_tl(point->value.s16, buf);
marcelobarrosalmeida 1:acdf490d94a7 82 size = 2;
marcelobarrosalmeida 1:acdf490d94a7 83 break;
marcelobarrosalmeida 1:acdf490d94a7 84 case SENS_ITF_DT_U32:
marcelobarrosalmeida 1:acdf490d94a7 85 buf_io_put32_tl(point->value.u32, buf);
marcelobarrosalmeida 1:acdf490d94a7 86 size = 4;
marcelobarrosalmeida 1:acdf490d94a7 87 break;
marcelobarrosalmeida 1:acdf490d94a7 88 case SENS_ITF_DT_S32:
marcelobarrosalmeida 1:acdf490d94a7 89 buf_io_put32_tl(point->value.s32, buf);
marcelobarrosalmeida 1:acdf490d94a7 90 size = 4;
marcelobarrosalmeida 1:acdf490d94a7 91 break;
marcelobarrosalmeida 1:acdf490d94a7 92 case SENS_ITF_DT_U64:
marcelobarrosalmeida 1:acdf490d94a7 93 buf_io_put64_tl(point->value.u64, buf);
marcelobarrosalmeida 1:acdf490d94a7 94 size = 8;
marcelobarrosalmeida 1:acdf490d94a7 95 break;
marcelobarrosalmeida 1:acdf490d94a7 96 case SENS_ITF_DT_S64:
marcelobarrosalmeida 1:acdf490d94a7 97 buf_io_put64_tl(point->value.s64, buf);
marcelobarrosalmeida 1:acdf490d94a7 98 size = 8;
marcelobarrosalmeida 1:acdf490d94a7 99 break;
marcelobarrosalmeida 1:acdf490d94a7 100 case SENS_ITF_DT_FLOAT:
marcelobarrosalmeida 1:acdf490d94a7 101 buf_io_putf_tl(point->value.fp32, buf);
marcelobarrosalmeida 1:acdf490d94a7 102 size = 4;
marcelobarrosalmeida 1:acdf490d94a7 103 break;
marcelobarrosalmeida 1:acdf490d94a7 104 case SENS_ITF_DT_DOUBLE:
marcelobarrosalmeida 1:acdf490d94a7 105 buf_io_putd_tl(point->value.fp64, buf);
marcelobarrosalmeida 1:acdf490d94a7 106 size = 8;
marcelobarrosalmeida 1:acdf490d94a7 107 break;
marcelobarrosalmeida 1:acdf490d94a7 108 default:
marcelobarrosalmeida 1:acdf490d94a7 109 break;
marcelobarrosalmeida 1:acdf490d94a7 110 }
marcelobarrosalmeida 1:acdf490d94a7 111
marcelobarrosalmeida 1:acdf490d94a7 112 return size;
marcelobarrosalmeida 1:acdf490d94a7 113 }
marcelobarrosalmeida 1:acdf490d94a7 114
marcelobarrosalmeida 1:acdf490d94a7 115 uint8_t sens_itf_unpack_cmd_req(sens_itf_cmd_req_t *cmd, uint8_t *frame, uint8_t frame_size)
marcelobarrosalmeida 1:acdf490d94a7 116 {
marcelobarrosalmeida 1:acdf490d94a7 117 uint8_t *buf = frame;
marcelobarrosalmeida 1:acdf490d94a7 118 uint16_t crc;
marcelobarrosalmeida 1:acdf490d94a7 119 uint16_t frame_crc;
marcelobarrosalmeida 1:acdf490d94a7 120 uint8_t size;
marcelobarrosalmeida 1:acdf490d94a7 121
marcelobarrosalmeida 1:acdf490d94a7 122 if (frame_size < 3)
marcelobarrosalmeida 1:acdf490d94a7 123 {
marcelobarrosalmeida 1:acdf490d94a7 124 //OS_UTIL_LOG(SENS_ITF_DBG_FRAME, ("Invalid frame size %d", frame_size));
marcelobarrosalmeida 1:acdf490d94a7 125 return 0;
marcelobarrosalmeida 1:acdf490d94a7 126 }
marcelobarrosalmeida 1:acdf490d94a7 127
marcelobarrosalmeida 1:acdf490d94a7 128 // minimal header decoding
marcelobarrosalmeida 1:acdf490d94a7 129 cmd->hdr.size = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 130 cmd->hdr.addr = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 131
marcelobarrosalmeida 1:acdf490d94a7 132 frame_crc = buf_io_get16_fl(&frame[cmd->hdr.size]);
marcelobarrosalmeida 1:acdf490d94a7 133 crc = crc16_calc(frame, cmd->hdr.size);
marcelobarrosalmeida 1:acdf490d94a7 134 cmd->crc = frame_crc;
marcelobarrosalmeida 1:acdf490d94a7 135
marcelobarrosalmeida 1:acdf490d94a7 136 if (frame_crc != crc)
marcelobarrosalmeida 1:acdf490d94a7 137 {
marcelobarrosalmeida 1:acdf490d94a7 138 //OS_UTIL_LOG(SENS_ITF_DBG_FRAME, ("Invalid CRC %04X <> %04X", frame_crc, crc));
marcelobarrosalmeida 1:acdf490d94a7 139 return 0;
marcelobarrosalmeida 1:acdf490d94a7 140 }
marcelobarrosalmeida 1:acdf490d94a7 141
marcelobarrosalmeida 1:acdf490d94a7 142 switch (cmd->hdr.addr)
marcelobarrosalmeida 1:acdf490d94a7 143 {
marcelobarrosalmeida 1:acdf490d94a7 144 case SENS_ITF_REGMAP_BRD_CMD:
marcelobarrosalmeida 1:acdf490d94a7 145 cmd->payload.command_cmd.cmd = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 146 break;
marcelobarrosalmeida 1:acdf490d94a7 147 case SENS_ITF_REGMAP_WRITE_BAT_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 148 cmd->payload.bat_status_cmd.status = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 149 break;
marcelobarrosalmeida 1:acdf490d94a7 150 case SENS_ITF_REGMAP_WRITE_BAT_CHARGE:
marcelobarrosalmeida 1:acdf490d94a7 151 cmd->payload.bat_charge_cmd.charge = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 152 break;
marcelobarrosalmeida 1:acdf490d94a7 153 case SENS_ITF_REGMAP_DSP_WRITE:
marcelobarrosalmeida 1:acdf490d94a7 154 cmd->payload.write_display_cmd.line = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 155 memcpy(cmd->payload.write_display_cmd.msg,buf,SENS_ITF_DSP_MSG_MAX_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 156 buf += SENS_ITF_DSP_MSG_MAX_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 157 break;
marcelobarrosalmeida 1:acdf490d94a7 158 case SENS_ITF_REGMAP_WPAN_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 159 cmd->payload.wpan_status_cmd.status = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 160 break;
marcelobarrosalmeida 1:acdf490d94a7 161 case SENS_ITF_REGMAP_WPAN_STRENGTH:
marcelobarrosalmeida 1:acdf490d94a7 162 cmd->payload.wpan_strength_cmd.strenght = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 163 break;
marcelobarrosalmeida 1:acdf490d94a7 164 default:
marcelobarrosalmeida 1:acdf490d94a7 165 break;
marcelobarrosalmeida 1:acdf490d94a7 166 }
marcelobarrosalmeida 1:acdf490d94a7 167
marcelobarrosalmeida 1:acdf490d94a7 168 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_WRITE_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 169 (cmd->hdr.addr <= SENS_ITF_REGMAP_WRITE_POINT_DATA_32))
marcelobarrosalmeida 1:acdf490d94a7 170 {
marcelobarrosalmeida 1:acdf490d94a7 171 //uint8_t point = cmd->hdr.addr - SENS_ITF_REGMAP_WRITE_POINT_DATA_1;
marcelobarrosalmeida 1:acdf490d94a7 172 cmd->payload.point_value_cmd.type = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 173 buf += sens_itf_unpack_point_value(&cmd->payload.point_value_cmd, buf);
marcelobarrosalmeida 1:acdf490d94a7 174 }
marcelobarrosalmeida 1:acdf490d94a7 175
marcelobarrosalmeida 1:acdf490d94a7 176 size = cmd->hdr.size + 2; // + crc
marcelobarrosalmeida 1:acdf490d94a7 177 return size;
marcelobarrosalmeida 1:acdf490d94a7 178 }
marcelobarrosalmeida 1:acdf490d94a7 179
marcelobarrosalmeida 1:acdf490d94a7 180 uint8_t sens_itf_pack_cmd_res(sens_itf_cmd_res_t *cmd, uint8_t *frame)
marcelobarrosalmeida 1:acdf490d94a7 181 {
marcelobarrosalmeida 1:acdf490d94a7 182 uint8_t *buf = &frame[1];
marcelobarrosalmeida 1:acdf490d94a7 183 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 184 uint16_t crc;
marcelobarrosalmeida 1:acdf490d94a7 185
marcelobarrosalmeida 1:acdf490d94a7 186 buf_io_put8_tl_ap(cmd->hdr.addr, buf);
marcelobarrosalmeida 1:acdf490d94a7 187 buf_io_put8_tl_ap(cmd->hdr.status, buf);
marcelobarrosalmeida 1:acdf490d94a7 188
marcelobarrosalmeida 1:acdf490d94a7 189 // only fill command when status is OK, otherwise an error will be reported
marcelobarrosalmeida 1:acdf490d94a7 190 if (cmd->hdr.status == SENS_ITF_ANS_OK)
marcelobarrosalmeida 1:acdf490d94a7 191 {
marcelobarrosalmeida 1:acdf490d94a7 192 switch (cmd->hdr.addr)
marcelobarrosalmeida 1:acdf490d94a7 193 {
marcelobarrosalmeida 1:acdf490d94a7 194 case SENS_ITF_REGMAP_ITF_VERSION:
marcelobarrosalmeida 1:acdf490d94a7 195 buf_io_put8_tl_ap(cmd->payload.itf_version_cmd.version, buf);
marcelobarrosalmeida 1:acdf490d94a7 196 break;
marcelobarrosalmeida 1:acdf490d94a7 197 case SENS_ITF_REGMAP_BRD_ID:
marcelobarrosalmeida 1:acdf490d94a7 198 memcpy(buf, cmd->payload.brd_id_cmd.model, SENS_ITF_MODEL_NAME_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 199 buf += SENS_ITF_MODEL_NAME_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 200 memcpy(buf, cmd->payload.brd_id_cmd.manufactor, SENS_ITF_MANUF_NAME_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 201 buf += SENS_ITF_MODEL_NAME_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 202 buf_io_put32_tl_ap(cmd->payload.brd_id_cmd.sensor_id, buf);
marcelobarrosalmeida 1:acdf490d94a7 203 buf_io_put8_tl_ap(cmd->payload.brd_id_cmd.hardware_revision, buf);
marcelobarrosalmeida 1:acdf490d94a7 204 buf_io_put8_tl_ap(cmd->payload.brd_id_cmd.num_of_points, buf);
marcelobarrosalmeida 1:acdf490d94a7 205 buf_io_put8_tl_ap(cmd->payload.brd_id_cmd.cabalities, buf);
marcelobarrosalmeida 1:acdf490d94a7 206 break;
marcelobarrosalmeida 1:acdf490d94a7 207 case SENS_ITF_REGMAP_BRD_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 208 buf_io_put8_tl_ap(cmd->payload.brd_status_cmd.status, buf);
marcelobarrosalmeida 1:acdf490d94a7 209 break;
marcelobarrosalmeida 1:acdf490d94a7 210 case SENS_ITF_REGMAP_BRD_CMD:
marcelobarrosalmeida 1:acdf490d94a7 211 buf_io_put8_tl_ap(cmd->payload.command_res_cmd.status, buf);
marcelobarrosalmeida 1:acdf490d94a7 212 break;
marcelobarrosalmeida 1:acdf490d94a7 213 case SENS_ITF_REGMAP_READ_BAT_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 214 buf_io_put8_tl_ap(cmd->payload.bat_status_cmd.status, buf);
marcelobarrosalmeida 1:acdf490d94a7 215 break;
marcelobarrosalmeida 1:acdf490d94a7 216 case SENS_ITF_REGMAP_READ_BAT_CHARGE:
marcelobarrosalmeida 1:acdf490d94a7 217 buf_io_put8_tl_ap(cmd->payload.bat_charge_cmd.charge, buf);
marcelobarrosalmeida 1:acdf490d94a7 218 break;
marcelobarrosalmeida 1:acdf490d94a7 219 case SENS_ITF_REGMAP_SVR_MAIN_ADDR:
marcelobarrosalmeida 1:acdf490d94a7 220 case SENS_ITF_REGMAP_SVR_SEC_ADDR:
marcelobarrosalmeida 1:acdf490d94a7 221 memcpy(buf, cmd->payload.svr_addr_cmd.addr, SENS_ITF_SERVER_ADDR_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 222 buf += SENS_ITF_SERVER_ADDR_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 223 break;
marcelobarrosalmeida 1:acdf490d94a7 224 default:
marcelobarrosalmeida 1:acdf490d94a7 225 break;
marcelobarrosalmeida 1:acdf490d94a7 226 }
marcelobarrosalmeida 1:acdf490d94a7 227
marcelobarrosalmeida 1:acdf490d94a7 228 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_POINT_DESC_1) &&
marcelobarrosalmeida 1:acdf490d94a7 229 (cmd->hdr.addr <= SENS_ITF_REGMAP_POINT_DESC_32))
marcelobarrosalmeida 1:acdf490d94a7 230 {
marcelobarrosalmeida 1:acdf490d94a7 231 //uint8_t point = cmd->hdr.addr - SENS_ITF_REGMAP_POINT_DESC_1;
marcelobarrosalmeida 1:acdf490d94a7 232 memcpy(buf, cmd->payload.point_desc_cmd.name, SENS_ITF_POINT_NAME_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 233 buf += SENS_ITF_POINT_NAME_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 234 buf_io_put8_tl_ap(cmd->payload.point_desc_cmd.type, buf);
marcelobarrosalmeida 1:acdf490d94a7 235 buf_io_put8_tl_ap(cmd->payload.point_desc_cmd.unit, buf);
marcelobarrosalmeida 1:acdf490d94a7 236 buf_io_put8_tl_ap(cmd->payload.point_desc_cmd.access_rights, buf);
marcelobarrosalmeida 1:acdf490d94a7 237 buf_io_put32_tl_ap(cmd->payload.point_desc_cmd.sampling_time_x250ms, buf);
marcelobarrosalmeida 1:acdf490d94a7 238 }
marcelobarrosalmeida 1:acdf490d94a7 239
marcelobarrosalmeida 1:acdf490d94a7 240 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_READ_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 241 (cmd->hdr.addr <= SENS_ITF_REGMAP_READ_POINT_DATA_32))
marcelobarrosalmeida 1:acdf490d94a7 242 {
marcelobarrosalmeida 1:acdf490d94a7 243 //uint8_t point = cmd->hdr.addr - SENS_ITF_REGMAP_READ_POINT_DATA_1;
marcelobarrosalmeida 1:acdf490d94a7 244 buf_io_put8_tl_ap(cmd->payload.point_value_cmd.type,buf);
marcelobarrosalmeida 1:acdf490d94a7 245 buf += sens_itf_pack_point_value(&cmd->payload.point_value_cmd, buf);
marcelobarrosalmeida 1:acdf490d94a7 246 }
marcelobarrosalmeida 1:acdf490d94a7 247 }
marcelobarrosalmeida 1:acdf490d94a7 248
marcelobarrosalmeida 1:acdf490d94a7 249 size = buf - frame;
marcelobarrosalmeida 1:acdf490d94a7 250 buf_io_put8_tl(size, frame);
marcelobarrosalmeida 1:acdf490d94a7 251 crc = crc16_calc(frame, size);
marcelobarrosalmeida 1:acdf490d94a7 252 cmd->crc = crc;
marcelobarrosalmeida 1:acdf490d94a7 253 cmd->hdr.size = size;
marcelobarrosalmeida 1:acdf490d94a7 254 buf_io_put16_tl(crc, buf);
marcelobarrosalmeida 1:acdf490d94a7 255
marcelobarrosalmeida 1:acdf490d94a7 256 size += 2; // +crc
marcelobarrosalmeida 1:acdf490d94a7 257 return size;
marcelobarrosalmeida 1:acdf490d94a7 258 }
marcelobarrosalmeida 1:acdf490d94a7 259
marcelobarrosalmeida 1:acdf490d94a7 260
marcelobarrosalmeida 1:acdf490d94a7 261 uint8_t sens_itf_unpack_cmd_res(sens_itf_cmd_res_t * cmd, uint8_t *frame, uint8_t frame_size)
marcelobarrosalmeida 1:acdf490d94a7 262 {
marcelobarrosalmeida 1:acdf490d94a7 263 uint8_t size;
marcelobarrosalmeida 1:acdf490d94a7 264 uint8_t *buf = frame;
marcelobarrosalmeida 1:acdf490d94a7 265 uint16_t crc;
marcelobarrosalmeida 1:acdf490d94a7 266 uint16_t frame_crc;
marcelobarrosalmeida 1:acdf490d94a7 267
marcelobarrosalmeida 1:acdf490d94a7 268 if (frame_size < 3)
marcelobarrosalmeida 1:acdf490d94a7 269 {
marcelobarrosalmeida 1:acdf490d94a7 270 cmd->hdr.status = SENS_ITF_ANS_ERROR;
marcelobarrosalmeida 1:acdf490d94a7 271 return 0;
marcelobarrosalmeida 1:acdf490d94a7 272 }
marcelobarrosalmeida 1:acdf490d94a7 273
marcelobarrosalmeida 1:acdf490d94a7 274 // minimal header decoding
marcelobarrosalmeida 1:acdf490d94a7 275 cmd->hdr.size = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 276 cmd->hdr.addr = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 277 cmd->hdr.status = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 278
marcelobarrosalmeida 1:acdf490d94a7 279 frame_crc = buf_io_get16_fl(&frame[cmd->hdr.size]);
marcelobarrosalmeida 1:acdf490d94a7 280 crc = crc16_calc(frame, cmd->hdr.size);
marcelobarrosalmeida 1:acdf490d94a7 281 cmd->crc = frame_crc;
marcelobarrosalmeida 1:acdf490d94a7 282
marcelobarrosalmeida 1:acdf490d94a7 283 if (frame_crc != crc)
marcelobarrosalmeida 1:acdf490d94a7 284 {
marcelobarrosalmeida 1:acdf490d94a7 285 //OS_UTIL_LOG(SENS_ITF_DBG_FRAME, ("Invalid CRC %04X <> %04X", frame_crc, crc));
marcelobarrosalmeida 1:acdf490d94a7 286 cmd->hdr.status = SENS_ITF_ANS_CRC_ERROR;
marcelobarrosalmeida 1:acdf490d94a7 287 return 0;
marcelobarrosalmeida 1:acdf490d94a7 288 }
marcelobarrosalmeida 1:acdf490d94a7 289
marcelobarrosalmeida 1:acdf490d94a7 290 if (cmd->hdr.status != SENS_ITF_ANS_OK)
marcelobarrosalmeida 1:acdf490d94a7 291 {
marcelobarrosalmeida 1:acdf490d94a7 292 //OS_UTIL_LOG(SENS_ITF_DBG_FRAME, ("Response error %d", cmd->hdr.status));
marcelobarrosalmeida 1:acdf490d94a7 293 return 0;
marcelobarrosalmeida 1:acdf490d94a7 294 }
marcelobarrosalmeida 1:acdf490d94a7 295
marcelobarrosalmeida 1:acdf490d94a7 296 switch (cmd->hdr.addr)
marcelobarrosalmeida 1:acdf490d94a7 297 {
marcelobarrosalmeida 1:acdf490d94a7 298 case SENS_ITF_REGMAP_ITF_VERSION:
marcelobarrosalmeida 1:acdf490d94a7 299 cmd->payload.itf_version_cmd.version = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 300 break;
marcelobarrosalmeida 1:acdf490d94a7 301 case SENS_ITF_REGMAP_BRD_ID:
marcelobarrosalmeida 1:acdf490d94a7 302 memcpy(cmd->payload.brd_id_cmd.model, buf, SENS_ITF_MODEL_NAME_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 303 buf += SENS_ITF_MODEL_NAME_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 304 memcpy(cmd->payload.brd_id_cmd.manufactor, buf, SENS_ITF_MANUF_NAME_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 305 buf += SENS_ITF_MODEL_NAME_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 306 cmd->payload.brd_id_cmd.sensor_id = buf_io_get32_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 307 cmd->payload.brd_id_cmd.hardware_revision = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 308 cmd->payload.brd_id_cmd.num_of_points = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 309 cmd->payload.brd_id_cmd.cabalities = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 310 break;
marcelobarrosalmeida 1:acdf490d94a7 311 case SENS_ITF_REGMAP_BRD_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 312 cmd->payload.brd_status_cmd.status = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 313 break;
marcelobarrosalmeida 1:acdf490d94a7 314 case SENS_ITF_REGMAP_BRD_CMD:
marcelobarrosalmeida 1:acdf490d94a7 315 cmd->payload.command_res_cmd.status = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 316 break;
marcelobarrosalmeida 1:acdf490d94a7 317 case SENS_ITF_REGMAP_READ_BAT_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 318 cmd->payload.bat_status_cmd.status = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 319 break;
marcelobarrosalmeida 1:acdf490d94a7 320 case SENS_ITF_REGMAP_READ_BAT_CHARGE:
marcelobarrosalmeida 1:acdf490d94a7 321 cmd->payload.bat_charge_cmd.charge = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 322 break;
marcelobarrosalmeida 1:acdf490d94a7 323 case SENS_ITF_REGMAP_SVR_MAIN_ADDR:
marcelobarrosalmeida 1:acdf490d94a7 324 case SENS_ITF_REGMAP_SVR_SEC_ADDR:
marcelobarrosalmeida 1:acdf490d94a7 325 memcpy(cmd->payload.svr_addr_cmd.addr, buf, SENS_ITF_SERVER_ADDR_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 326 buf += SENS_ITF_SERVER_ADDR_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 327 break;
marcelobarrosalmeida 1:acdf490d94a7 328 default:
marcelobarrosalmeida 1:acdf490d94a7 329 break;
marcelobarrosalmeida 1:acdf490d94a7 330 }
marcelobarrosalmeida 1:acdf490d94a7 331
marcelobarrosalmeida 1:acdf490d94a7 332 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_POINT_DESC_1) &&
marcelobarrosalmeida 1:acdf490d94a7 333 (cmd->hdr.addr <= SENS_ITF_REGMAP_POINT_DESC_32))
marcelobarrosalmeida 1:acdf490d94a7 334 {
marcelobarrosalmeida 1:acdf490d94a7 335 memcpy(cmd->payload.point_desc_cmd.name, buf, SENS_ITF_POINT_NAME_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 336 buf += SENS_ITF_POINT_NAME_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 337 cmd->payload.point_desc_cmd.type = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 338 cmd->payload.point_desc_cmd.unit = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 339 cmd->payload.point_desc_cmd.access_rights = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 340 cmd->payload.point_desc_cmd.sampling_time_x250ms = buf_io_get32_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 341 }
marcelobarrosalmeida 1:acdf490d94a7 342
marcelobarrosalmeida 1:acdf490d94a7 343 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_READ_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 344 (cmd->hdr.addr <= SENS_ITF_REGMAP_READ_POINT_DATA_32))
marcelobarrosalmeida 1:acdf490d94a7 345 {
marcelobarrosalmeida 1:acdf490d94a7 346 cmd->payload.point_value_cmd.type = buf_io_get8_fl_ap(buf);
marcelobarrosalmeida 1:acdf490d94a7 347 buf += sens_itf_unpack_point_value(&cmd->payload.point_value_cmd, buf);
marcelobarrosalmeida 1:acdf490d94a7 348 }
marcelobarrosalmeida 1:acdf490d94a7 349
marcelobarrosalmeida 1:acdf490d94a7 350 size = cmd->hdr.size + 2; // crc
marcelobarrosalmeida 1:acdf490d94a7 351 return size;
marcelobarrosalmeida 1:acdf490d94a7 352 }
marcelobarrosalmeida 1:acdf490d94a7 353
marcelobarrosalmeida 1:acdf490d94a7 354 uint8_t sens_itf_pack_cmd_req(sens_itf_cmd_req_t *cmd, uint8_t *frame)
marcelobarrosalmeida 1:acdf490d94a7 355 {
marcelobarrosalmeida 1:acdf490d94a7 356 uint8_t *buf = &frame[1];
marcelobarrosalmeida 1:acdf490d94a7 357 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 358 uint16_t crc;
marcelobarrosalmeida 1:acdf490d94a7 359
marcelobarrosalmeida 1:acdf490d94a7 360 // address
marcelobarrosalmeida 1:acdf490d94a7 361 // commands without arguments are handled only with this line
marcelobarrosalmeida 1:acdf490d94a7 362 buf_io_put8_tl_ap(cmd->hdr.addr, buf);
marcelobarrosalmeida 1:acdf490d94a7 363
marcelobarrosalmeida 1:acdf490d94a7 364 switch (cmd->hdr.addr)
marcelobarrosalmeida 1:acdf490d94a7 365 {
marcelobarrosalmeida 1:acdf490d94a7 366 case SENS_ITF_REGMAP_BRD_CMD:
marcelobarrosalmeida 1:acdf490d94a7 367 buf_io_put8_tl_ap(cmd->payload.command_cmd.cmd, buf);
marcelobarrosalmeida 1:acdf490d94a7 368 break;
marcelobarrosalmeida 1:acdf490d94a7 369 case SENS_ITF_REGMAP_WRITE_BAT_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 370 buf_io_put8_tl_ap(cmd->payload.bat_status_cmd.status, buf);
marcelobarrosalmeida 1:acdf490d94a7 371 break;
marcelobarrosalmeida 1:acdf490d94a7 372 case SENS_ITF_REGMAP_WRITE_BAT_CHARGE:
marcelobarrosalmeida 1:acdf490d94a7 373 buf_io_put8_tl_ap(cmd->payload.bat_charge_cmd.charge, buf);
marcelobarrosalmeida 1:acdf490d94a7 374 break;
marcelobarrosalmeida 1:acdf490d94a7 375 case SENS_ITF_REGMAP_DSP_WRITE:
marcelobarrosalmeida 1:acdf490d94a7 376 buf_io_put8_tl_ap(cmd->payload.write_display_cmd.line, buf);
marcelobarrosalmeida 1:acdf490d94a7 377 memcpy(buf, cmd->payload.write_display_cmd.msg, SENS_ITF_DSP_MSG_MAX_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 378 buf += SENS_ITF_DSP_MSG_MAX_SIZE;
marcelobarrosalmeida 1:acdf490d94a7 379 break;
marcelobarrosalmeida 1:acdf490d94a7 380 case SENS_ITF_REGMAP_WPAN_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 381 buf_io_put8_tl_ap(cmd->payload.wpan_status_cmd.status,buf);
marcelobarrosalmeida 1:acdf490d94a7 382 break;
marcelobarrosalmeida 1:acdf490d94a7 383 case SENS_ITF_REGMAP_WPAN_STRENGTH:
marcelobarrosalmeida 1:acdf490d94a7 384 buf_io_put8_tl_ap(cmd->payload.wpan_strength_cmd.strenght,buf);
marcelobarrosalmeida 1:acdf490d94a7 385 break;
marcelobarrosalmeida 1:acdf490d94a7 386 default:
marcelobarrosalmeida 1:acdf490d94a7 387 break;
marcelobarrosalmeida 1:acdf490d94a7 388 }
marcelobarrosalmeida 1:acdf490d94a7 389
marcelobarrosalmeida 1:acdf490d94a7 390 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_WRITE_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 391 (cmd->hdr.addr <= SENS_ITF_REGMAP_WRITE_POINT_DATA_32))
marcelobarrosalmeida 1:acdf490d94a7 392 {
marcelobarrosalmeida 1:acdf490d94a7 393 buf_io_put8_tl_ap(cmd->payload.point_value_cmd.type, buf);
marcelobarrosalmeida 1:acdf490d94a7 394 buf += sens_itf_pack_point_value(&cmd->payload.point_value_cmd, buf);
marcelobarrosalmeida 1:acdf490d94a7 395 }
marcelobarrosalmeida 1:acdf490d94a7 396
marcelobarrosalmeida 1:acdf490d94a7 397 size = buf - frame;
marcelobarrosalmeida 1:acdf490d94a7 398 buf_io_put8_tl(size, frame);
marcelobarrosalmeida 1:acdf490d94a7 399 crc = crc16_calc(frame, size);
marcelobarrosalmeida 1:acdf490d94a7 400 cmd->crc = crc;
marcelobarrosalmeida 1:acdf490d94a7 401 cmd->hdr.size = size;
marcelobarrosalmeida 1:acdf490d94a7 402 buf_io_put16_tl(crc, buf);
marcelobarrosalmeida 1:acdf490d94a7 403
marcelobarrosalmeida 1:acdf490d94a7 404 size += 2; // + crc
marcelobarrosalmeida 1:acdf490d94a7 405
marcelobarrosalmeida 1:acdf490d94a7 406 return size;
marcelobarrosalmeida 1:acdf490d94a7 407 }