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 "mbed.h"
marcelobarrosalmeida 1:acdf490d94a7 4 #include "sens_itf.h"
marcelobarrosalmeida 1:acdf490d94a7 5 #include "sens_util.h"
marcelobarrosalmeida 1:acdf490d94a7 6 #include "../util/buf_io.h"
marcelobarrosalmeida 1:acdf490d94a7 7 #include "../util/crc16.h"
marcelobarrosalmeida 1:acdf490d94a7 8 #include "../pt/pt.h"
marcelobarrosalmeida 1:acdf490d94a7 9 #include "SLCD.h"
marcelobarrosalmeida 1:acdf490d94a7 10 #include "MMA8451Q.h"
marcelobarrosalmeida 1:acdf490d94a7 11
marcelobarrosalmeida 1:acdf490d94a7 12 #define SENS_ITF_SENSOR_DBG_FRAME 1
marcelobarrosalmeida 1:acdf490d94a7 13 #define SENS_ITF_DBG_FRAME 1
marcelobarrosalmeida 1:acdf490d94a7 14 #define SENS_ITF_SENSOR_NUM_OF_POINTS 5
marcelobarrosalmeida 1:acdf490d94a7 15
marcelobarrosalmeida 1:acdf490d94a7 16 #define MMA8451_I2C_ADDRESS (0x1d<<1)
marcelobarrosalmeida 1:acdf490d94a7 17
marcelobarrosalmeida 1:acdf490d94a7 18 static uint8_t main_svr_addr[SENS_ITF_SERVER_ADDR_SIZE];
marcelobarrosalmeida 1:acdf490d94a7 19 static uint8_t secon_svr_addr[SENS_ITF_SERVER_ADDR_SIZE];
marcelobarrosalmeida 1:acdf490d94a7 20 static uint8_t rx_frame[SENS_ITF_MAX_FRAME_SIZE];
marcelobarrosalmeida 1:acdf490d94a7 21 static volatile uint8_t num_rx_bytes;
marcelobarrosalmeida 1:acdf490d94a7 22 static Timeout rx_trmout_timer ;
marcelobarrosalmeida 1:acdf490d94a7 23 static Ticker acq_data_timer;
marcelobarrosalmeida 1:acdf490d94a7 24 static sens_itf_point_ctrl_t sensor_points;
marcelobarrosalmeida 1:acdf490d94a7 25 static sens_itf_cmd_brd_id_t board_info;
marcelobarrosalmeida 1:acdf490d94a7 26 static struct pt pt_updt;
marcelobarrosalmeida 1:acdf490d94a7 27 static struct pt pt_data;
marcelobarrosalmeida 1:acdf490d94a7 28 static volatile uint8_t frame_timeout;
marcelobarrosalmeida 1:acdf490d94a7 29 static volatile uint8_t acq_data ;
marcelobarrosalmeida 1:acdf490d94a7 30 static DigitalOut greenLED(LED1);
marcelobarrosalmeida 1:acdf490d94a7 31 static DigitalOut redLED(LED2);
marcelobarrosalmeida 1:acdf490d94a7 32 static AnalogIn lightSensor(PTE22);
marcelobarrosalmeida 1:acdf490d94a7 33 static SLCD sLCD;
marcelobarrosalmeida 1:acdf490d94a7 34 static Serial pcSerial(USBTX, USBRX);
marcelobarrosalmeida 1:acdf490d94a7 35 static MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
marcelobarrosalmeida 1:acdf490d94a7 36 static InterruptIn mode_switch(SW3);
marcelobarrosalmeida 1:acdf490d94a7 37 static volatile uint8_t view_mode;
marcelobarrosalmeida 1:acdf490d94a7 38
marcelobarrosalmeida 1:acdf490d94a7 39 void scroll_message(char *message, unsigned char len)
marcelobarrosalmeida 1:acdf490d94a7 40 {
marcelobarrosalmeida 1:acdf490d94a7 41 sLCD.All_Segments(0);
marcelobarrosalmeida 1:acdf490d94a7 42
marcelobarrosalmeida 1:acdf490d94a7 43 for (int start = 0; start < len - 4; start++)
marcelobarrosalmeida 1:acdf490d94a7 44 {
marcelobarrosalmeida 1:acdf490d94a7 45 for (int digit = 0; digit < 4; digit++)
marcelobarrosalmeida 1:acdf490d94a7 46 sLCD.putc(message[start + digit]);
marcelobarrosalmeida 1:acdf490d94a7 47 wait(0.4);
marcelobarrosalmeida 1:acdf490d94a7 48 }
marcelobarrosalmeida 1:acdf490d94a7 49 }
marcelobarrosalmeida 1:acdf490d94a7 50
marcelobarrosalmeida 1:acdf490d94a7 51 static void dump_frame(uint8_t *frame, uint8_t size)
marcelobarrosalmeida 1:acdf490d94a7 52 {
marcelobarrosalmeida 1:acdf490d94a7 53 int n,m;
marcelobarrosalmeida 1:acdf490d94a7 54 char buf[64];
marcelobarrosalmeida 1:acdf490d94a7 55
marcelobarrosalmeida 1:acdf490d94a7 56 buf[0] = buf[1] = buf[2] = buf[3] = ' ';
marcelobarrosalmeida 1:acdf490d94a7 57
marcelobarrosalmeida 1:acdf490d94a7 58 for(n = 0, m = 4; n < size ; n++, m+=3)
marcelobarrosalmeida 1:acdf490d94a7 59 {
marcelobarrosalmeida 1:acdf490d94a7 60 sprintf(&buf[m],"%02X_",frame[n]);
marcelobarrosalmeida 1:acdf490d94a7 61 }
marcelobarrosalmeida 1:acdf490d94a7 62
marcelobarrosalmeida 1:acdf490d94a7 63 buf[m] = buf[m+1] = buf[m+2] = buf[m+3] = ' ';
marcelobarrosalmeida 1:acdf490d94a7 64 buf[m+4] = '\0';
marcelobarrosalmeida 1:acdf490d94a7 65
marcelobarrosalmeida 1:acdf490d94a7 66 m +=4;
marcelobarrosalmeida 1:acdf490d94a7 67 scroll_message(buf,m);
marcelobarrosalmeida 1:acdf490d94a7 68
marcelobarrosalmeida 1:acdf490d94a7 69 }
marcelobarrosalmeida 1:acdf490d94a7 70
marcelobarrosalmeida 1:acdf490d94a7 71 static uint8_t sens_itf_get_point_type(uint8_t point)
marcelobarrosalmeida 1:acdf490d94a7 72 {
marcelobarrosalmeida 1:acdf490d94a7 73 return sensor_points.points[point].desc.type;
marcelobarrosalmeida 1:acdf490d94a7 74 }
marcelobarrosalmeida 1:acdf490d94a7 75
marcelobarrosalmeida 1:acdf490d94a7 76 static uint8_t sens_itf_get_number_of_points(void)
marcelobarrosalmeida 1:acdf490d94a7 77 {
marcelobarrosalmeida 1:acdf490d94a7 78 return SENS_ITF_SENSOR_NUM_OF_POINTS;
marcelobarrosalmeida 1:acdf490d94a7 79 }
marcelobarrosalmeida 1:acdf490d94a7 80
marcelobarrosalmeida 1:acdf490d94a7 81 static sens_itf_cmd_point_desc_t *sens_itf_get_point_desc(uint8_t point)
marcelobarrosalmeida 1:acdf490d94a7 82 {
marcelobarrosalmeida 1:acdf490d94a7 83 sens_itf_cmd_point_desc_t *d = 0;
marcelobarrosalmeida 1:acdf490d94a7 84
marcelobarrosalmeida 1:acdf490d94a7 85 if (point < sens_itf_get_number_of_points())
marcelobarrosalmeida 1:acdf490d94a7 86 d = &sensor_points.points[point].desc;
marcelobarrosalmeida 1:acdf490d94a7 87
marcelobarrosalmeida 1:acdf490d94a7 88 return d;
marcelobarrosalmeida 1:acdf490d94a7 89 }
marcelobarrosalmeida 1:acdf490d94a7 90
marcelobarrosalmeida 1:acdf490d94a7 91 static sens_itf_cmd_point_t *sens_itf_get_point_value(uint8_t point)
marcelobarrosalmeida 1:acdf490d94a7 92 {
marcelobarrosalmeida 1:acdf490d94a7 93 sens_itf_cmd_point_t *v = 0;
marcelobarrosalmeida 1:acdf490d94a7 94
marcelobarrosalmeida 1:acdf490d94a7 95 if (point < sens_itf_get_number_of_points())
marcelobarrosalmeida 1:acdf490d94a7 96 v = &sensor_points.points[point].value;
marcelobarrosalmeida 1:acdf490d94a7 97
marcelobarrosalmeida 1:acdf490d94a7 98 return v;
marcelobarrosalmeida 1:acdf490d94a7 99 }
marcelobarrosalmeida 1:acdf490d94a7 100
marcelobarrosalmeida 1:acdf490d94a7 101 static uint8_t sens_itf_set_point_value(uint8_t point, sens_itf_cmd_point_t *v)
marcelobarrosalmeida 1:acdf490d94a7 102 {
marcelobarrosalmeida 1:acdf490d94a7 103 uint8_t ret = 0;
marcelobarrosalmeida 1:acdf490d94a7 104
marcelobarrosalmeida 1:acdf490d94a7 105 if (point < sens_itf_get_number_of_points())
marcelobarrosalmeida 1:acdf490d94a7 106 {
marcelobarrosalmeida 1:acdf490d94a7 107 sensor_points.points[point].value = *v;
marcelobarrosalmeida 1:acdf490d94a7 108 ret = 1;
marcelobarrosalmeida 1:acdf490d94a7 109 }
marcelobarrosalmeida 1:acdf490d94a7 110 else
marcelobarrosalmeida 1:acdf490d94a7 111 {
marcelobarrosalmeida 1:acdf490d94a7 112 ret = 0;
marcelobarrosalmeida 1:acdf490d94a7 113 }
marcelobarrosalmeida 1:acdf490d94a7 114
marcelobarrosalmeida 1:acdf490d94a7 115 return ret;
marcelobarrosalmeida 1:acdf490d94a7 116 }
marcelobarrosalmeida 1:acdf490d94a7 117
marcelobarrosalmeida 1:acdf490d94a7 118 static sens_itf_cmd_brd_id_t *sens_itf_get_board_info(void)
marcelobarrosalmeida 1:acdf490d94a7 119 {
marcelobarrosalmeida 1:acdf490d94a7 120 return &board_info;
marcelobarrosalmeida 1:acdf490d94a7 121 }
marcelobarrosalmeida 1:acdf490d94a7 122
marcelobarrosalmeida 1:acdf490d94a7 123 static uint8_t sens_itf_sensor_send_frame(uint8_t *frame, uint8_t size)
marcelobarrosalmeida 1:acdf490d94a7 124 {
marcelobarrosalmeida 1:acdf490d94a7 125 //dump_frame(frame, size);
marcelobarrosalmeida 1:acdf490d94a7 126
marcelobarrosalmeida 1:acdf490d94a7 127 for(int n = 0 ; n < size ; n++)
marcelobarrosalmeida 1:acdf490d94a7 128 pcSerial.putc((unsigned int )frame[n]);
marcelobarrosalmeida 1:acdf490d94a7 129 //pcSerial.puts((char *)frame,size); // puts returns the size sent ?
marcelobarrosalmeida 1:acdf490d94a7 130 return size;
marcelobarrosalmeida 1:acdf490d94a7 131 }
marcelobarrosalmeida 1:acdf490d94a7 132
marcelobarrosalmeida 1:acdf490d94a7 133 static uint8_t sens_itf_sensor_check_register_map(sens_itf_cmd_req_t *cmd, sens_itf_cmd_res_t *ans, uint8_t *frame)
marcelobarrosalmeida 1:acdf490d94a7 134 {
marcelobarrosalmeida 1:acdf490d94a7 135 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 136 if ( // check global register map for valid address ranges
marcelobarrosalmeida 1:acdf490d94a7 137 ((cmd->hdr.addr > SENS_ITF_REGMAP_SVR_SEC_ADDR) &&
marcelobarrosalmeida 1:acdf490d94a7 138 (cmd->hdr.addr < SENS_ITF_REGMAP_POINT_DESC_1)) ||
marcelobarrosalmeida 1:acdf490d94a7 139 (cmd->hdr.addr > SENS_ITF_REGMAP_WRITE_POINT_DATA_32) ||
marcelobarrosalmeida 1:acdf490d94a7 140 // check local register map - reading
marcelobarrosalmeida 1:acdf490d94a7 141 ((cmd->hdr.addr >= SENS_ITF_REGMAP_READ_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 142 (cmd->hdr.addr <= SENS_ITF_REGMAP_READ_POINT_DATA_32) &&
marcelobarrosalmeida 1:acdf490d94a7 143 ((cmd->hdr.addr - SENS_ITF_REGMAP_READ_POINT_DATA_1) >= sens_itf_get_number_of_points())) ||
marcelobarrosalmeida 1:acdf490d94a7 144 // check local register map - writing
marcelobarrosalmeida 1:acdf490d94a7 145 ((cmd->hdr.addr >= SENS_ITF_REGMAP_WRITE_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 146 (cmd->hdr.addr <= SENS_ITF_REGMAP_WRITE_POINT_DATA_32) &&
marcelobarrosalmeida 1:acdf490d94a7 147 ((cmd->hdr.addr - SENS_ITF_REGMAP_WRITE_POINT_DATA_1) >= sens_itf_get_number_of_points())))
marcelobarrosalmeida 1:acdf490d94a7 148 {
marcelobarrosalmeida 1:acdf490d94a7 149 sens_util_log(SENS_ITF_SENSOR_DBG_FRAME, "Invalid register address %02X",cmd->hdr.addr);
marcelobarrosalmeida 1:acdf490d94a7 150 ans->hdr.status = SENS_ITF_ANS_REGISTER_NOT_IMPLEMENTED;
marcelobarrosalmeida 1:acdf490d94a7 151 size = sens_itf_pack_cmd_res(ans, frame);
marcelobarrosalmeida 1:acdf490d94a7 152 }
marcelobarrosalmeida 1:acdf490d94a7 153 return size;
marcelobarrosalmeida 1:acdf490d94a7 154 }
marcelobarrosalmeida 1:acdf490d94a7 155
marcelobarrosalmeida 1:acdf490d94a7 156 static uint8_t sens_itf_sensor_writings(sens_itf_cmd_req_t *cmd, sens_itf_cmd_res_t *ans, uint8_t *frame)
marcelobarrosalmeida 1:acdf490d94a7 157 {
marcelobarrosalmeida 1:acdf490d94a7 158 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 159 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_WRITE_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 160 (cmd->hdr.addr <= SENS_ITF_REGMAP_WRITE_POINT_DATA_32))
marcelobarrosalmeida 1:acdf490d94a7 161 {
marcelobarrosalmeida 1:acdf490d94a7 162 uint8_t point = cmd->hdr.addr - SENS_ITF_REGMAP_WRITE_POINT_DATA_1;
marcelobarrosalmeida 1:acdf490d94a7 163 //sLCD.printf("R%dV%d",point,cmd->payload.point_value_cmd.value.u8);
marcelobarrosalmeida 1:acdf490d94a7 164 //wait(0.5);
marcelobarrosalmeida 1:acdf490d94a7 165 uint8_t acr = sens_itf_get_point_desc(point)->access_rights & SENS_ITF_ACCESS_WRITE_ONLY;
marcelobarrosalmeida 1:acdf490d94a7 166
marcelobarrosalmeida 1:acdf490d94a7 167 if (acr)
marcelobarrosalmeida 1:acdf490d94a7 168 {
marcelobarrosalmeida 1:acdf490d94a7 169 ans->hdr.status = SENS_ITF_ANS_OK;
marcelobarrosalmeida 1:acdf490d94a7 170 sens_itf_set_point_value(point,&cmd->payload.point_value_cmd);
marcelobarrosalmeida 1:acdf490d94a7 171 }
marcelobarrosalmeida 1:acdf490d94a7 172 else
marcelobarrosalmeida 1:acdf490d94a7 173 {
marcelobarrosalmeida 1:acdf490d94a7 174 sens_util_log(SENS_ITF_SENSOR_DBG_FRAME, "Point %d does not allow writings",point);
marcelobarrosalmeida 1:acdf490d94a7 175 ans->hdr.status = SENS_ITF_ANS_READY_ONLY;
marcelobarrosalmeida 1:acdf490d94a7 176 }
marcelobarrosalmeida 1:acdf490d94a7 177 size = sens_itf_pack_cmd_res(ans, frame);
marcelobarrosalmeida 1:acdf490d94a7 178 }
marcelobarrosalmeida 1:acdf490d94a7 179 return size;
marcelobarrosalmeida 1:acdf490d94a7 180 }
marcelobarrosalmeida 1:acdf490d94a7 181
marcelobarrosalmeida 1:acdf490d94a7 182 static uint8_t sens_itf_sensor_readings(sens_itf_cmd_req_t *cmd, sens_itf_cmd_res_t *ans, uint8_t *frame)
marcelobarrosalmeida 1:acdf490d94a7 183 {
marcelobarrosalmeida 1:acdf490d94a7 184 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 185 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_READ_POINT_DATA_1) &&
marcelobarrosalmeida 1:acdf490d94a7 186 (cmd->hdr.addr <= SENS_ITF_REGMAP_READ_POINT_DATA_32))
marcelobarrosalmeida 1:acdf490d94a7 187 {
marcelobarrosalmeida 1:acdf490d94a7 188 uint8_t point = cmd->hdr.addr - SENS_ITF_REGMAP_READ_POINT_DATA_1;
marcelobarrosalmeida 1:acdf490d94a7 189 uint8_t acr = sens_itf_get_point_desc(point)->access_rights & SENS_ITF_ANS_READY_ONLY;
marcelobarrosalmeida 1:acdf490d94a7 190
marcelobarrosalmeida 1:acdf490d94a7 191 if (acr)
marcelobarrosalmeida 1:acdf490d94a7 192 {
marcelobarrosalmeida 1:acdf490d94a7 193 ans->hdr.status = SENS_ITF_ANS_OK;
marcelobarrosalmeida 1:acdf490d94a7 194 ans->payload.point_value_cmd = *sens_itf_get_point_value(point);
marcelobarrosalmeida 1:acdf490d94a7 195 }
marcelobarrosalmeida 1:acdf490d94a7 196 else
marcelobarrosalmeida 1:acdf490d94a7 197 {
marcelobarrosalmeida 1:acdf490d94a7 198 sens_util_log(SENS_ITF_SENSOR_DBG_FRAME, "Point %d does not allow readings",point);
marcelobarrosalmeida 1:acdf490d94a7 199 ans->hdr.status = SENS_ITF_ANS_WRITE_ONLY;
marcelobarrosalmeida 1:acdf490d94a7 200 }
marcelobarrosalmeida 1:acdf490d94a7 201 size = sens_itf_pack_cmd_res(ans, frame);
marcelobarrosalmeida 1:acdf490d94a7 202 }
marcelobarrosalmeida 1:acdf490d94a7 203 return size;
marcelobarrosalmeida 1:acdf490d94a7 204 }
marcelobarrosalmeida 1:acdf490d94a7 205
marcelobarrosalmeida 1:acdf490d94a7 206 static uint8_t sens_itf_check_other_cmds(sens_itf_cmd_req_t *cmd, sens_itf_cmd_res_t *ans, uint8_t *frame)
marcelobarrosalmeida 1:acdf490d94a7 207 {
marcelobarrosalmeida 1:acdf490d94a7 208 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 209 switch (cmd->hdr.addr)
marcelobarrosalmeida 1:acdf490d94a7 210 {
marcelobarrosalmeida 1:acdf490d94a7 211 case SENS_ITF_REGMAP_ITF_VERSION:
marcelobarrosalmeida 1:acdf490d94a7 212 ans->payload.itf_version_cmd.version = SENS_ITF_LATEST_VERSION;
marcelobarrosalmeida 1:acdf490d94a7 213 break;
marcelobarrosalmeida 1:acdf490d94a7 214 case SENS_ITF_REGMAP_BRD_ID:
marcelobarrosalmeida 1:acdf490d94a7 215 memcpy(&ans->payload.brd_id_cmd,sens_itf_get_board_info(),sizeof(sens_itf_cmd_brd_id_t));
marcelobarrosalmeida 1:acdf490d94a7 216 break;
marcelobarrosalmeida 1:acdf490d94a7 217 case SENS_ITF_REGMAP_BRD_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 218 ans->payload.brd_status_cmd.status = 0; // TBD
marcelobarrosalmeida 1:acdf490d94a7 219 break;
marcelobarrosalmeida 1:acdf490d94a7 220 case SENS_ITF_REGMAP_BRD_CMD:
marcelobarrosalmeida 1:acdf490d94a7 221 ans->payload.command_res_cmd.status = 0; // TBD
marcelobarrosalmeida 1:acdf490d94a7 222 break;
marcelobarrosalmeida 1:acdf490d94a7 223 case SENS_ITF_REGMAP_READ_BAT_STATUS:
marcelobarrosalmeida 1:acdf490d94a7 224 ans->payload.bat_status_cmd.status = 0; // TBD
marcelobarrosalmeida 1:acdf490d94a7 225 break;
marcelobarrosalmeida 1:acdf490d94a7 226 case SENS_ITF_REGMAP_READ_BAT_CHARGE:
marcelobarrosalmeida 1:acdf490d94a7 227 ans->payload.bat_charge_cmd.charge = 100; // TBD
marcelobarrosalmeida 1:acdf490d94a7 228 break;
marcelobarrosalmeida 1:acdf490d94a7 229 case SENS_ITF_REGMAP_SVR_MAIN_ADDR:
marcelobarrosalmeida 1:acdf490d94a7 230 memcpy(ans->payload.svr_addr_cmd.addr,main_svr_addr, SENS_ITF_SERVER_ADDR_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 231 break;
marcelobarrosalmeida 1:acdf490d94a7 232 case SENS_ITF_REGMAP_SVR_SEC_ADDR:
marcelobarrosalmeida 1:acdf490d94a7 233 memcpy(ans->payload.svr_addr_cmd.addr,secon_svr_addr, SENS_ITF_SERVER_ADDR_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 234 break;
marcelobarrosalmeida 1:acdf490d94a7 235 default:
marcelobarrosalmeida 1:acdf490d94a7 236 break;
marcelobarrosalmeida 1:acdf490d94a7 237
marcelobarrosalmeida 1:acdf490d94a7 238 }
marcelobarrosalmeida 1:acdf490d94a7 239
marcelobarrosalmeida 1:acdf490d94a7 240 if ((cmd->hdr.addr >= SENS_ITF_REGMAP_POINT_DESC_1) && (cmd->hdr.addr <= SENS_ITF_REGMAP_POINT_DESC_32))
marcelobarrosalmeida 1:acdf490d94a7 241 {
marcelobarrosalmeida 1:acdf490d94a7 242 uint8_t point = cmd->hdr.addr - SENS_ITF_REGMAP_POINT_DESC_1;
marcelobarrosalmeida 1:acdf490d94a7 243 memcpy(&ans->payload.point_desc_cmd, &sensor_points.points[point].desc, sizeof(sens_itf_cmd_point_desc_t));
marcelobarrosalmeida 1:acdf490d94a7 244 }
marcelobarrosalmeida 1:acdf490d94a7 245
marcelobarrosalmeida 1:acdf490d94a7 246 ans->hdr.status = SENS_ITF_ANS_OK;
marcelobarrosalmeida 1:acdf490d94a7 247 size = sens_itf_pack_cmd_res(ans, frame);
marcelobarrosalmeida 1:acdf490d94a7 248 return size;
marcelobarrosalmeida 1:acdf490d94a7 249 }
marcelobarrosalmeida 1:acdf490d94a7 250 static void sens_itf_process_cmd(uint8_t *frame, uint8_t num_rx_bytes)
marcelobarrosalmeida 1:acdf490d94a7 251 {
marcelobarrosalmeida 1:acdf490d94a7 252 uint8_t ret;
marcelobarrosalmeida 1:acdf490d94a7 253 uint8_t size = 0;
marcelobarrosalmeida 1:acdf490d94a7 254 sens_itf_cmd_req_t cmd;
marcelobarrosalmeida 1:acdf490d94a7 255 sens_itf_cmd_res_t ans;
marcelobarrosalmeida 1:acdf490d94a7 256
marcelobarrosalmeida 1:acdf490d94a7 257 ret = sens_itf_unpack_cmd_req(&cmd, frame, num_rx_bytes);
marcelobarrosalmeida 1:acdf490d94a7 258
marcelobarrosalmeida 1:acdf490d94a7 259 if (ret > 0)
marcelobarrosalmeida 1:acdf490d94a7 260 {
marcelobarrosalmeida 1:acdf490d94a7 261 ans.hdr.addr = cmd.hdr.addr;
marcelobarrosalmeida 1:acdf490d94a7 262
marcelobarrosalmeida 1:acdf490d94a7 263 size = sens_itf_sensor_check_register_map(&cmd, &ans,frame);
marcelobarrosalmeida 1:acdf490d94a7 264 if (size == 0)
marcelobarrosalmeida 1:acdf490d94a7 265 size = sens_itf_sensor_writings(&cmd, &ans,frame);
marcelobarrosalmeida 1:acdf490d94a7 266
marcelobarrosalmeida 1:acdf490d94a7 267 if (size == 0)
marcelobarrosalmeida 1:acdf490d94a7 268 size = sens_itf_sensor_readings(&cmd, &ans,frame);
marcelobarrosalmeida 1:acdf490d94a7 269
marcelobarrosalmeida 1:acdf490d94a7 270 if (size == 0)
marcelobarrosalmeida 1:acdf490d94a7 271 size = sens_itf_check_other_cmds(&cmd, &ans,frame);
marcelobarrosalmeida 1:acdf490d94a7 272
marcelobarrosalmeida 1:acdf490d94a7 273 if (size == 0)
marcelobarrosalmeida 1:acdf490d94a7 274 {
marcelobarrosalmeida 1:acdf490d94a7 275 ans.hdr.status = SENS_ITF_ANS_ERROR;
marcelobarrosalmeida 1:acdf490d94a7 276 sLCD.printf(" D");
marcelobarrosalmeida 1:acdf490d94a7 277 }
marcelobarrosalmeida 1:acdf490d94a7 278
marcelobarrosalmeida 1:acdf490d94a7 279 size = sens_itf_pack_cmd_res(&ans,frame);
marcelobarrosalmeida 1:acdf490d94a7 280 sens_itf_sensor_send_frame(frame, size);
marcelobarrosalmeida 1:acdf490d94a7 281 }
marcelobarrosalmeida 1:acdf490d94a7 282 }
marcelobarrosalmeida 1:acdf490d94a7 283
marcelobarrosalmeida 1:acdf490d94a7 284 void sens_itf_init_point_db(void)
marcelobarrosalmeida 1:acdf490d94a7 285 {
marcelobarrosalmeida 1:acdf490d94a7 286 uint8_t n;
marcelobarrosalmeida 1:acdf490d94a7 287 char *point_names[SENS_ITF_POINT_NAME_SIZE] = { "LIGHT", "LEDG", "ACCX", "ACCY", "ACCXZ" };
marcelobarrosalmeida 1:acdf490d94a7 288 uint8_t data_types[SENS_ITF_POINT_NAME_SIZE] = {SENS_ITF_DT_U8, SENS_ITF_DT_U8, SENS_ITF_DT_FLOAT, SENS_ITF_DT_FLOAT, SENS_ITF_DT_FLOAT};
marcelobarrosalmeida 1:acdf490d94a7 289 uint8_t access_rights[SENS_ITF_POINT_NAME_SIZE] = { SENS_ITF_ACCESS_READ_ONLY, SENS_ITF_ACCESS_WRITE_ONLY, SENS_ITF_ACCESS_READ_ONLY,
marcelobarrosalmeida 1:acdf490d94a7 290 SENS_ITF_ACCESS_READ_ONLY, SENS_ITF_ACCESS_READ_ONLY};
marcelobarrosalmeida 1:acdf490d94a7 291 uint32_t sampling_time[SENS_ITF_POINT_NAME_SIZE] = {4*10, 0, 4*15, 4*20, 4*25};
marcelobarrosalmeida 1:acdf490d94a7 292
marcelobarrosalmeida 1:acdf490d94a7 293 memset(&sensor_points, 0, sizeof(sensor_points));
marcelobarrosalmeida 1:acdf490d94a7 294 memset(&board_info, 0, sizeof(board_info));
marcelobarrosalmeida 1:acdf490d94a7 295
marcelobarrosalmeida 1:acdf490d94a7 296 strcpy((char *)board_info.model, "KL46Z");
marcelobarrosalmeida 1:acdf490d94a7 297 strcpy((char *)board_info.manufactor, "TESLA");
marcelobarrosalmeida 1:acdf490d94a7 298 board_info.sensor_id = 0xDEADBEEF;
marcelobarrosalmeida 1:acdf490d94a7 299 board_info.hardware_revision = 0x01;
marcelobarrosalmeida 1:acdf490d94a7 300 board_info.num_of_points = SENS_ITF_SENSOR_NUM_OF_POINTS;
marcelobarrosalmeida 1:acdf490d94a7 301 board_info.cabalities = SENS_ITF_CAPABILITIES_DISPLAY |
marcelobarrosalmeida 1:acdf490d94a7 302 SENS_ITF_CAPABILITIES_WPAN_STATUS |
marcelobarrosalmeida 1:acdf490d94a7 303 SENS_ITF_CAPABILITIES_BATTERY_STATUS;
marcelobarrosalmeida 1:acdf490d94a7 304
marcelobarrosalmeida 1:acdf490d94a7 305 sensor_points.num_of_points = SENS_ITF_SENSOR_NUM_OF_POINTS;
marcelobarrosalmeida 1:acdf490d94a7 306
marcelobarrosalmeida 1:acdf490d94a7 307 for (n = 0; n < SENS_ITF_SENSOR_NUM_OF_POINTS; n++)
marcelobarrosalmeida 1:acdf490d94a7 308 {
marcelobarrosalmeida 1:acdf490d94a7 309 strcpy((char *)sensor_points.points[n].desc.name, point_names[n]);
marcelobarrosalmeida 1:acdf490d94a7 310 sensor_points.points[n].desc.type = data_types[n];
marcelobarrosalmeida 1:acdf490d94a7 311 sensor_points.points[n].desc.unit = 0; // TDB
marcelobarrosalmeida 1:acdf490d94a7 312 sensor_points.points[n].desc.access_rights = access_rights[n];
marcelobarrosalmeida 1:acdf490d94a7 313 sensor_points.points[n].desc.sampling_time_x250ms = sampling_time[n];
marcelobarrosalmeida 1:acdf490d94a7 314 sensor_points.points[n].value.type = data_types[n];
marcelobarrosalmeida 1:acdf490d94a7 315 }
marcelobarrosalmeida 1:acdf490d94a7 316 }
marcelobarrosalmeida 1:acdf490d94a7 317
marcelobarrosalmeida 1:acdf490d94a7 318 static void sens_itf_rx_tmrout_timer_func(void)
marcelobarrosalmeida 1:acdf490d94a7 319 {
marcelobarrosalmeida 1:acdf490d94a7 320 //greenLED = greenLED == 1 ? 0 : 1;
marcelobarrosalmeida 1:acdf490d94a7 321 frame_timeout = 1;
marcelobarrosalmeida 1:acdf490d94a7 322 }
marcelobarrosalmeida 1:acdf490d94a7 323
marcelobarrosalmeida 1:acdf490d94a7 324 static void sens_itf_acq_data_timer_func(void)
marcelobarrosalmeida 1:acdf490d94a7 325 {
marcelobarrosalmeida 1:acdf490d94a7 326 redLED = redLED == 1 ? 0 : 1;
marcelobarrosalmeida 1:acdf490d94a7 327 acq_data = 1;
marcelobarrosalmeida 1:acdf490d94a7 328 }
marcelobarrosalmeida 1:acdf490d94a7 329
marcelobarrosalmeida 1:acdf490d94a7 330 static void sens_itf_rx_tmrout_timer_reesched(void)
marcelobarrosalmeida 1:acdf490d94a7 331 {
marcelobarrosalmeida 1:acdf490d94a7 332 rx_trmout_timer.detach();
marcelobarrosalmeida 1:acdf490d94a7 333 rx_trmout_timer.attach_us(sens_itf_rx_tmrout_timer_func,500*1000);
marcelobarrosalmeida 1:acdf490d94a7 334 }
marcelobarrosalmeida 1:acdf490d94a7 335
marcelobarrosalmeida 1:acdf490d94a7 336 // Serial or SPI interrupt, called when a new byte is received
marcelobarrosalmeida 1:acdf490d94a7 337 static void sens_itf_sensor_rx_byte(void)
marcelobarrosalmeida 1:acdf490d94a7 338 {
marcelobarrosalmeida 1:acdf490d94a7 339 uint8_t value;
marcelobarrosalmeida 1:acdf490d94a7 340
marcelobarrosalmeida 1:acdf490d94a7 341 // DISABLE INTERRUPTS
marcelobarrosalmeida 1:acdf490d94a7 342 if (frame_timeout)
marcelobarrosalmeida 1:acdf490d94a7 343 return;
marcelobarrosalmeida 1:acdf490d94a7 344
marcelobarrosalmeida 1:acdf490d94a7 345 value = (uint8_t) pcSerial.getc();
marcelobarrosalmeida 1:acdf490d94a7 346
marcelobarrosalmeida 1:acdf490d94a7 347 if (num_rx_bytes < SENS_ITF_MAX_FRAME_SIZE)
marcelobarrosalmeida 1:acdf490d94a7 348 rx_frame[num_rx_bytes] = value;
marcelobarrosalmeida 1:acdf490d94a7 349
marcelobarrosalmeida 1:acdf490d94a7 350 num_rx_bytes++;
marcelobarrosalmeida 1:acdf490d94a7 351 if (num_rx_bytes >= SENS_ITF_MAX_FRAME_SIZE)
marcelobarrosalmeida 1:acdf490d94a7 352 num_rx_bytes = 0;
marcelobarrosalmeida 1:acdf490d94a7 353
marcelobarrosalmeida 1:acdf490d94a7 354 sens_itf_rx_tmrout_timer_reesched();
marcelobarrosalmeida 1:acdf490d94a7 355 // ENABLE INTERRUPTS
marcelobarrosalmeida 1:acdf490d94a7 356 }
marcelobarrosalmeida 1:acdf490d94a7 357
marcelobarrosalmeida 1:acdf490d94a7 358 uint8_t sens_itf_sensor_init(void)
marcelobarrosalmeida 1:acdf490d94a7 359 {
marcelobarrosalmeida 1:acdf490d94a7 360
marcelobarrosalmeida 1:acdf490d94a7 361 sens_itf_init_point_db();
marcelobarrosalmeida 1:acdf490d94a7 362 memcpy(main_svr_addr,"1212121212121212",SENS_ITF_SERVER_ADDR_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 363 memcpy(secon_svr_addr,"aabbccddeeff1122",SENS_ITF_SERVER_ADDR_SIZE);
marcelobarrosalmeida 1:acdf490d94a7 364 num_rx_bytes = 0;
marcelobarrosalmeida 1:acdf490d94a7 365 acq_data = 0;
marcelobarrosalmeida 1:acdf490d94a7 366 frame_timeout = 0;
marcelobarrosalmeida 1:acdf490d94a7 367 greenLED = 0;
marcelobarrosalmeida 1:acdf490d94a7 368 redLED = 1;
marcelobarrosalmeida 1:acdf490d94a7 369 sens_itf_rx_tmrout_timer_reesched();
marcelobarrosalmeida 1:acdf490d94a7 370 acq_data_timer.attach(sens_itf_acq_data_timer_func,2);
marcelobarrosalmeida 1:acdf490d94a7 371 pcSerial.attach(sens_itf_sensor_rx_byte);
marcelobarrosalmeida 1:acdf490d94a7 372
marcelobarrosalmeida 1:acdf490d94a7 373 return 1;
marcelobarrosalmeida 1:acdf490d94a7 374 }
marcelobarrosalmeida 1:acdf490d94a7 375
marcelobarrosalmeida 1:acdf490d94a7 376 static int pt_data_func(struct pt *pt)
marcelobarrosalmeida 1:acdf490d94a7 377 {
marcelobarrosalmeida 1:acdf490d94a7 378 PT_BEGIN(pt);
marcelobarrosalmeida 1:acdf490d94a7 379
marcelobarrosalmeida 1:acdf490d94a7 380 while (1)
marcelobarrosalmeida 1:acdf490d94a7 381 {
marcelobarrosalmeida 1:acdf490d94a7 382 // wait a frame timeout
marcelobarrosalmeida 1:acdf490d94a7 383 PT_WAIT_UNTIL(pt, frame_timeout == 1);
marcelobarrosalmeida 1:acdf490d94a7 384
marcelobarrosalmeida 1:acdf490d94a7 385 if (num_rx_bytes > 0)
marcelobarrosalmeida 1:acdf490d94a7 386 {
marcelobarrosalmeida 1:acdf490d94a7 387 // process it
marcelobarrosalmeida 1:acdf490d94a7 388 sens_itf_process_cmd(rx_frame, num_rx_bytes);
marcelobarrosalmeida 1:acdf490d94a7 389 num_rx_bytes = 0;
marcelobarrosalmeida 1:acdf490d94a7 390 }
marcelobarrosalmeida 1:acdf490d94a7 391
marcelobarrosalmeida 1:acdf490d94a7 392 // restart reception
marcelobarrosalmeida 1:acdf490d94a7 393 frame_timeout = 0;
marcelobarrosalmeida 1:acdf490d94a7 394 sens_itf_rx_tmrout_timer_reesched();
marcelobarrosalmeida 1:acdf490d94a7 395 }
marcelobarrosalmeida 1:acdf490d94a7 396
marcelobarrosalmeida 1:acdf490d94a7 397 PT_END(pt);
marcelobarrosalmeida 1:acdf490d94a7 398 }
marcelobarrosalmeida 1:acdf490d94a7 399
marcelobarrosalmeida 1:acdf490d94a7 400 static int pt_updt_func(struct pt *pt)
marcelobarrosalmeida 1:acdf490d94a7 401 {
marcelobarrosalmeida 1:acdf490d94a7 402 PT_BEGIN(pt);
marcelobarrosalmeida 1:acdf490d94a7 403
marcelobarrosalmeida 1:acdf490d94a7 404 while (1)
marcelobarrosalmeida 1:acdf490d94a7 405 {
marcelobarrosalmeida 1:acdf490d94a7 406 char buf[5];
marcelobarrosalmeida 1:acdf490d94a7 407 uint8_t v;
marcelobarrosalmeida 1:acdf490d94a7 408
marcelobarrosalmeida 1:acdf490d94a7 409 // wait job
marcelobarrosalmeida 1:acdf490d94a7 410 PT_WAIT_UNTIL(pt, acq_data == 1);
marcelobarrosalmeida 1:acdf490d94a7 411
marcelobarrosalmeida 1:acdf490d94a7 412 v = (uint8_t)(lightSensor.read()*100);
marcelobarrosalmeida 1:acdf490d94a7 413 sensor_points.points[0].value.value.u8 = v;
marcelobarrosalmeida 1:acdf490d94a7 414 greenLED = sensor_points.points[1].value.value.u8;
marcelobarrosalmeida 1:acdf490d94a7 415 sensor_points.points[2].value.value.fp32 = 1.0 - abs(acc.getAccX());
marcelobarrosalmeida 1:acdf490d94a7 416 sensor_points.points[3].value.value.fp32 = 1.0 - abs(acc.getAccY());
marcelobarrosalmeida 1:acdf490d94a7 417 sensor_points.points[4].value.value.fp32 = 1.0 - abs(acc.getAccZ());
marcelobarrosalmeida 1:acdf490d94a7 418
marcelobarrosalmeida 1:acdf490d94a7 419 sLCD.All_Segments(0);
marcelobarrosalmeida 1:acdf490d94a7 420 switch(view_mode)
marcelobarrosalmeida 1:acdf490d94a7 421 {
marcelobarrosalmeida 1:acdf490d94a7 422 case 0:
marcelobarrosalmeida 1:acdf490d94a7 423 sprintf(buf,"L %2d",v);
marcelobarrosalmeida 1:acdf490d94a7 424 sLCD.printf("%s",buf);
marcelobarrosalmeida 1:acdf490d94a7 425 break;
marcelobarrosalmeida 1:acdf490d94a7 426 case 1:
marcelobarrosalmeida 1:acdf490d94a7 427 sprintf(buf,"%4d",(uint16_t) (sensor_points.points[2].value.value.fp32*1000));
marcelobarrosalmeida 1:acdf490d94a7 428 sLCD.printf("%s",buf);
marcelobarrosalmeida 1:acdf490d94a7 429 break;
marcelobarrosalmeida 1:acdf490d94a7 430 case 2:
marcelobarrosalmeida 1:acdf490d94a7 431 sprintf(buf,"%4d",(uint16_t) (sensor_points.points[3].value.value.fp32*1000));
marcelobarrosalmeida 1:acdf490d94a7 432 sLCD.printf("%s",buf);
marcelobarrosalmeida 1:acdf490d94a7 433 break;
marcelobarrosalmeida 1:acdf490d94a7 434 case 3:
marcelobarrosalmeida 1:acdf490d94a7 435 sprintf(buf,"%4d",(uint16_t) (sensor_points.points[4].value.value.fp32*1000));
marcelobarrosalmeida 1:acdf490d94a7 436 sLCD.printf("%s",buf);
marcelobarrosalmeida 1:acdf490d94a7 437 break;
marcelobarrosalmeida 1:acdf490d94a7 438 default:
marcelobarrosalmeida 1:acdf490d94a7 439 break;
marcelobarrosalmeida 1:acdf490d94a7 440 }
marcelobarrosalmeida 1:acdf490d94a7 441
marcelobarrosalmeida 1:acdf490d94a7 442 acq_data = 0;
marcelobarrosalmeida 1:acdf490d94a7 443 }
marcelobarrosalmeida 1:acdf490d94a7 444
marcelobarrosalmeida 1:acdf490d94a7 445 PT_END(pt);
marcelobarrosalmeida 1:acdf490d94a7 446 }
marcelobarrosalmeida 1:acdf490d94a7 447
marcelobarrosalmeida 1:acdf490d94a7 448 void set_mode(void)
marcelobarrosalmeida 1:acdf490d94a7 449 {
marcelobarrosalmeida 1:acdf490d94a7 450 view_mode = ++view_mode > 3 ? 0 : view_mode;
marcelobarrosalmeida 1:acdf490d94a7 451 }
marcelobarrosalmeida 1:acdf490d94a7 452
marcelobarrosalmeida 1:acdf490d94a7 453 void main(void)
marcelobarrosalmeida 1:acdf490d94a7 454 {
marcelobarrosalmeida 1:acdf490d94a7 455 frame_timeout = 0;
marcelobarrosalmeida 1:acdf490d94a7 456 acq_data = 0;
marcelobarrosalmeida 1:acdf490d94a7 457 view_mode = 0;
marcelobarrosalmeida 1:acdf490d94a7 458
marcelobarrosalmeida 1:acdf490d94a7 459 sLCD.All_Segments(0);
marcelobarrosalmeida 1:acdf490d94a7 460 sLCD.DP2(0);
marcelobarrosalmeida 1:acdf490d94a7 461 sLCD.printf("INIT");
marcelobarrosalmeida 1:acdf490d94a7 462 pcSerial.baud(115200);
marcelobarrosalmeida 1:acdf490d94a7 463 sens_itf_sensor_init();
marcelobarrosalmeida 1:acdf490d94a7 464
marcelobarrosalmeida 1:acdf490d94a7 465 mode_switch.rise(set_mode);
marcelobarrosalmeida 1:acdf490d94a7 466
marcelobarrosalmeida 1:acdf490d94a7 467 PT_INIT(&pt_data);
marcelobarrosalmeida 1:acdf490d94a7 468 PT_INIT(&pt_updt);
marcelobarrosalmeida 1:acdf490d94a7 469
marcelobarrosalmeida 1:acdf490d94a7 470
marcelobarrosalmeida 1:acdf490d94a7 471 while(1)
marcelobarrosalmeida 1:acdf490d94a7 472 {
marcelobarrosalmeida 1:acdf490d94a7 473 pt_data_func(&pt_data);
marcelobarrosalmeida 1:acdf490d94a7 474 pt_updt_func(&pt_updt);
marcelobarrosalmeida 1:acdf490d94a7 475 }
marcelobarrosalmeida 1:acdf490d94a7 476 }
marcelobarrosalmeida 1:acdf490d94a7 477