Complete library for whole scientific pre-final

Dependencies:   BOX_1

Committer:
Alessio_Zaino
Date:
Thu Sep 05 20:56:11 2019 +0000
Revision:
5:b0fa65791218
Parent:
4:f693e434d21c
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Alessio_Zaino 5:b0fa65791218 1 //SCIENTIFIC CAN ID'S 201 TO 255
Alessio_Zaino 5:b0fa65791218 2
Alessio_Zaino 5:b0fa65791218 3 /***********
Alessio_Zaino 5:b0fa65791218 4 Open box1 ||201|0|| can frame id
Alessio_Zaino 5:b0fa65791218 5 201 indirizzamento al sottosistema (scatole)
Alessio_Zaino 5:b0fa65791218 6 202 indirizzamento dal sottosistema (scatole)
Alessio_Zaino 5:b0fa65791218 7 203/4 indirizzamento dal sottosistema (envi)
Alessio_Zaino 5:b0fa65791218 8 0 id scatola 1
Alessio_Zaino 5:b0fa65791218 9
Alessio_Zaino 5:b0fa65791218 10 nel dato
Alessio_Zaino 5:b0fa65791218 11 100 chiudi
Alessio_Zaino 5:b0fa65791218 12 101 apri
Alessio_Zaino 5:b0fa65791218 13 102 leggi
Alessio_Zaino 5:b0fa65791218 14
Alessio_Zaino 5:b0fa65791218 15
Alessio_Zaino 5:b0fa65791218 16 CAN RX priorità piu bassa
Alessio_Zaino 5:b0fa65791218 17 envi priorità normale
Alessio_Zaino 5:b0fa65791218 18 box alta
Alessio_Zaino 5:b0fa65791218 19
Alessio_Zaino 5:b0fa65791218 20
Alessio_Zaino 5:b0fa65791218 21
Alessio_Zaino 5:b0fa65791218 22
Alessio_Zaino 5:b0fa65791218 23 Costruzione frame CAN
Alessio_Zaino 5:b0fa65791218 24 void sci::buildFrame(struct can_frame &frame, uint8_t id, can_commands command, int32_t value)
Alessio_Zaino 5:b0fa65791218 25 {
Alessio_Zaino 5:b0fa65791218 26 int len = 0;
Alessio_Zaino 5:b0fa65791218 27 uint32_t new_id = id;
Alessio_Zaino 5:b0fa65791218 28 new_id |= (uint32_t)command << 8;
Alessio_Zaino 5:b0fa65791218 29 new_id |= 0x80000000; 100|0 0000 0000 0000 0 000 0000| 0000 0000
Alessio_Zaino 5:b0fa65791218 30 frame.can_id = new_id;
Alessio_Zaino 5:b0fa65791218 31
Alessio_Zaino 5:b0fa65791218 32 frame.data[len++] = value >> 24;
Alessio_Zaino 5:b0fa65791218 33 frame.data[len++] = value >> 16;
Alessio_Zaino 5:b0fa65791218 34 frame.data[len++] = value >> 8;
Alessio_Zaino 5:b0fa65791218 35 frame.data[len++] = value;
Alessio_Zaino 5:b0fa65791218 36
Alessio_Zaino 5:b0fa65791218 37 frame.can_dlc = len;
Alessio_Zaino 5:b0fa65791218 38 }
Alessio_Zaino 5:b0fa65791218 39 ************/
Alessio_Zaino 0:f8a9cceb4186 40 #include "BOX.h"
Alessio_Zaino 5:b0fa65791218 41 #include "mbed.h"
Alessio_Zaino 0:f8a9cceb4186 42 #include "ENVIROMENTAL.h"
Alessio_Zaino 5:b0fa65791218 43
Alessio_Zaino 5:b0fa65791218 44 //EVENT FLAGS
Alessio_Zaino 5:b0fa65791218 45 #define OPEN_BOX 101
Alessio_Zaino 5:b0fa65791218 46 #define CLOSE_BOX 100
Alessio_Zaino 5:b0fa65791218 47 #define SEND_BOX_DATA_REQUEST 102
Alessio_Zaino 5:b0fa65791218 48
Alessio_Zaino 5:b0fa65791218 49 Thread can_rx_thd;
Alessio_Zaino 5:b0fa65791218 50 Thread box_thd;
Alessio_Zaino 5:b0fa65791218 51 Thread envi_thd;
Alessio_Zaino 5:b0fa65791218 52
Alessio_Zaino 5:b0fa65791218 53 EventFlags event_flags;
Alessio_Zaino 5:b0fa65791218 54
Alessio_Zaino 5:b0fa65791218 55 CAN can(PB_8, PB_9);
Alessio_Zaino 5:b0fa65791218 56 CANMessage msg;
Alessio_Zaino 5:b0fa65791218 57 CANFormat CANextended;
Alessio_Zaino 0:f8a9cceb4186 58
Alessio_Zaino 5:b0fa65791218 59 BOX box1(PA_9, PA_8, PB_0, PA_0, 1000, PA_4);
Alessio_Zaino 5:b0fa65791218 60 BOX box2(PC_9, PC_8, PB_1, PA_1, 1000, PA_5);
Alessio_Zaino 5:b0fa65791218 61 BOX box3(PC_7, PC_6, PB_2, PA_2, 1000, PA_6);
Alessio_Zaino 5:b0fa65791218 62 I2C i2c(PB_7,PB_6);
Alessio_Zaino 5:b0fa65791218 63 ENVIROMENTAL envi(PB_7, PB_6, PA_3, i2c);
Alessio_Zaino 5:b0fa65791218 64
Alessio_Zaino 5:b0fa65791218 65 unsigned char box_sel;
Alessio_Zaino 5:b0fa65791218 66 unsigned char box_cmd;
Alessio_Zaino 5:b0fa65791218 67
Alessio_Zaino 5:b0fa65791218 68 char message_out[8];
Alessio_Zaino 5:b0fa65791218 69 char envi_tx[8];
Alessio_Zaino 5:b0fa65791218 70 char data_box[3][8];
Alessio_Zaino 5:b0fa65791218 71
Alessio_Zaino 5:b0fa65791218 72 uint32_t new_id(int command, int id)
Alessio_Zaino 5:b0fa65791218 73 {
Alessio_Zaino 5:b0fa65791218 74 uint32_t id_message = id;
Alessio_Zaino 5:b0fa65791218 75 id_message |= (uint32_t)command << 8;
Alessio_Zaino 5:b0fa65791218 76 id_message |= 0x80000000;
Alessio_Zaino 4:f693e434d21c 77
Alessio_Zaino 5:b0fa65791218 78 return id_message;
Alessio_Zaino 5:b0fa65791218 79 }
Alessio_Zaino 5:b0fa65791218 80 void box()
Alessio_Zaino 5:b0fa65791218 81 {
Alessio_Zaino 5:b0fa65791218 82 uint32_t flag_read = 0;
Alessio_Zaino 5:b0fa65791218 83 box1.initialize();
Alessio_Zaino 5:b0fa65791218 84 box2.initialize();
Alessio_Zaino 5:b0fa65791218 85 box3.initialize();
Alessio_Zaino 5:b0fa65791218 86 int weight = 0;
Alessio_Zaino 5:b0fa65791218 87 int resistence = 0;
Alessio_Zaino 5:b0fa65791218 88 float temperature = 0;
Alessio_Zaino 5:b0fa65791218 89 while(1)
Alessio_Zaino 5:b0fa65791218 90 {
Alessio_Zaino 5:b0fa65791218 91 flag_read = event_flags.wait_any(OPEN_BOX | CLOSE_BOX | SEND_BOX_DATA_REQUEST); //trigger this theand only if
Alessio_Zaino 5:b0fa65791218 92 switch (flag_read)
Alessio_Zaino 5:b0fa65791218 93 {
Alessio_Zaino 5:b0fa65791218 94 case OPEN_BOX:
Alessio_Zaino 5:b0fa65791218 95 switch(box_sel)
Alessio_Zaino 5:b0fa65791218 96 {
Alessio_Zaino 5:b0fa65791218 97 case 1:
Alessio_Zaino 5:b0fa65791218 98 box1.move_servo(1000);
Alessio_Zaino 5:b0fa65791218 99 //open box 1
Alessio_Zaino 5:b0fa65791218 100 break;
Alessio_Zaino 5:b0fa65791218 101 case 2:
Alessio_Zaino 5:b0fa65791218 102 box2.move_servo(1000);
Alessio_Zaino 5:b0fa65791218 103 //open box 2
Alessio_Zaino 5:b0fa65791218 104 break;
Alessio_Zaino 5:b0fa65791218 105 case 3:
Alessio_Zaino 5:b0fa65791218 106 box3.move_servo(1000);
Alessio_Zaino 5:b0fa65791218 107 //open box 3
Alessio_Zaino 5:b0fa65791218 108 break;
Alessio_Zaino 5:b0fa65791218 109 default: break;
Alessio_Zaino 5:b0fa65791218 110 }
Alessio_Zaino 5:b0fa65791218 111 break;
Alessio_Zaino 5:b0fa65791218 112 case CLOSE_BOX:
Alessio_Zaino 5:b0fa65791218 113 switch(box_sel)
Alessio_Zaino 5:b0fa65791218 114 {
Alessio_Zaino 5:b0fa65791218 115 case 1:
Alessio_Zaino 5:b0fa65791218 116 box2.move_servo(2200);
Alessio_Zaino 5:b0fa65791218 117 //close box 1
Alessio_Zaino 5:b0fa65791218 118 break;
Alessio_Zaino 5:b0fa65791218 119 case 2:
Alessio_Zaino 5:b0fa65791218 120 box2.move_servo(2200);
Alessio_Zaino 5:b0fa65791218 121 //close box 2
Alessio_Zaino 5:b0fa65791218 122 break;
Alessio_Zaino 5:b0fa65791218 123 case 3:
Alessio_Zaino 5:b0fa65791218 124 box2.move_servo(2200);
Alessio_Zaino 5:b0fa65791218 125 //close box 3
Alessio_Zaino 5:b0fa65791218 126 break;
Alessio_Zaino 5:b0fa65791218 127 default: break;
Alessio_Zaino 5:b0fa65791218 128 }
Alessio_Zaino 5:b0fa65791218 129 break;
Alessio_Zaino 4:f693e434d21c 130
Alessio_Zaino 5:b0fa65791218 131 case SEND_BOX_DATA_REQUEST:
Alessio_Zaino 5:b0fa65791218 132 //for every data request, a measure is made and then the data is sended on CAN
Alessio_Zaino 5:b0fa65791218 133 switch(box_sel)
Alessio_Zaino 5:b0fa65791218 134 {
Alessio_Zaino 5:b0fa65791218 135 case 1:
Alessio_Zaino 5:b0fa65791218 136 //make measurements box 1
Alessio_Zaino 5:b0fa65791218 137 weight = box1.get_weight();
Alessio_Zaino 5:b0fa65791218 138 resistence = box1.get_resistance(); //bisogna ancora "impacchettare i dati"
Alessio_Zaino 5:b0fa65791218 139 temperature = box1.get_temp();
Alessio_Zaino 5:b0fa65791218 140 //temperature 4 bytes
Alessio_Zaino 5:b0fa65791218 141 *(float*)(data_box[0]) = temperature;
Alessio_Zaino 5:b0fa65791218 142 //weight 2 bytes
Alessio_Zaino 5:b0fa65791218 143 data_box[0][4] = (char)(weight >> 8);
Alessio_Zaino 5:b0fa65791218 144 data_box[0][5] = (char)(weight);
Alessio_Zaino 5:b0fa65791218 145 //resistence 2 bytes
Alessio_Zaino 5:b0fa65791218 146 data_box[0][6] = (char)(resistence >> 8);
Alessio_Zaino 5:b0fa65791218 147 data_box[0][7] = (char)(resistence);
Alessio_Zaino 5:b0fa65791218 148 break;
Alessio_Zaino 5:b0fa65791218 149 case 2:
Alessio_Zaino 5:b0fa65791218 150 //make measurements box 2
Alessio_Zaino 5:b0fa65791218 151 weight = box2.get_weight();
Alessio_Zaino 5:b0fa65791218 152 resistence = box2.get_resistance();
Alessio_Zaino 5:b0fa65791218 153 temperature = box2.get_temp();
Alessio_Zaino 5:b0fa65791218 154 //temperature 4 bytes
Alessio_Zaino 5:b0fa65791218 155 *(float*)(data_box[1]) = temperature;
Alessio_Zaino 5:b0fa65791218 156 //weight 2 bytes
Alessio_Zaino 5:b0fa65791218 157 data_box[1][4] = (char)(weight >> 8);
Alessio_Zaino 5:b0fa65791218 158 data_box[1][5] = (char)(weight);
Alessio_Zaino 5:b0fa65791218 159 //resistence 2 bytes
Alessio_Zaino 5:b0fa65791218 160 data_box[1][6] = (char)(resistence >> 8);
Alessio_Zaino 5:b0fa65791218 161 data_box[1][7] = (char)(resistence);
Alessio_Zaino 5:b0fa65791218 162 break;
Alessio_Zaino 5:b0fa65791218 163 case 3:
Alessio_Zaino 5:b0fa65791218 164 //make measurements box 3
Alessio_Zaino 5:b0fa65791218 165 weight = box3.get_weight();
Alessio_Zaino 5:b0fa65791218 166 resistence = box3.get_resistance();
Alessio_Zaino 5:b0fa65791218 167 temperature = box3.get_temp();
Alessio_Zaino 5:b0fa65791218 168 //temperature 4 bytes
Alessio_Zaino 5:b0fa65791218 169 *(float*)(data_box[2]) = temperature;
Alessio_Zaino 5:b0fa65791218 170 //weight 2 bytes
Alessio_Zaino 5:b0fa65791218 171 data_box[2][4] = (char)(weight >> 8);
Alessio_Zaino 5:b0fa65791218 172 data_box[2][5] = (char)(weight);
Alessio_Zaino 5:b0fa65791218 173 //resistence 2 bytes
Alessio_Zaino 5:b0fa65791218 174 data_box[2][6] = (char)(resistence >> 8);
Alessio_Zaino 5:b0fa65791218 175 data_box[2][7] = (char)(resistence);
Alessio_Zaino 5:b0fa65791218 176 break;
Alessio_Zaino 5:b0fa65791218 177 default: break;
Alessio_Zaino 5:b0fa65791218 178 }
Alessio_Zaino 5:b0fa65791218 179 for(int i=0; i<8; i++)
Alessio_Zaino 5:b0fa65791218 180 {
Alessio_Zaino 5:b0fa65791218 181 message_out[i] = data_box[box_sel][i];
Alessio_Zaino 5:b0fa65791218 182 }
Alessio_Zaino 5:b0fa65791218 183 can.write(CANMessage(new_id(202, box_sel),message_out, 8));
Alessio_Zaino 5:b0fa65791218 184 break;
Alessio_Zaino 5:b0fa65791218 185 default: break;
Alessio_Zaino 5:b0fa65791218 186 }
Alessio_Zaino 5:b0fa65791218 187 }
Alessio_Zaino 5:b0fa65791218 188 }
Alessio_Zaino 4:f693e434d21c 189
Alessio_Zaino 5:b0fa65791218 190 void can_rx()
Alessio_Zaino 5:b0fa65791218 191 {
Alessio_Zaino 5:b0fa65791218 192 while(1)
Alessio_Zaino 5:b0fa65791218 193 {
Alessio_Zaino 5:b0fa65791218 194 can.read(msg);
Alessio_Zaino 5:b0fa65791218 195
Alessio_Zaino 5:b0fa65791218 196 switch (msg.id)
Alessio_Zaino 5:b0fa65791218 197 {
Alessio_Zaino 5:b0fa65791218 198 case 201:
Alessio_Zaino 5:b0fa65791218 199 box_sel = msg.data[0];
Alessio_Zaino 5:b0fa65791218 200 box_cmd = msg.data[1];
Alessio_Zaino 5:b0fa65791218 201 event_flags.set(OPEN_BOX);
Alessio_Zaino 5:b0fa65791218 202 break;
Alessio_Zaino 5:b0fa65791218 203 case 202:
Alessio_Zaino 5:b0fa65791218 204 box_sel = msg.data[0];
Alessio_Zaino 5:b0fa65791218 205 box_cmd = msg.data[1];
Alessio_Zaino 5:b0fa65791218 206 event_flags.set(CLOSE_BOX);
Alessio_Zaino 5:b0fa65791218 207 break;
Alessio_Zaino 5:b0fa65791218 208 case 203:
Alessio_Zaino 5:b0fa65791218 209 box_sel = msg.data[0];
Alessio_Zaino 5:b0fa65791218 210 event_flags.set(SEND_BOX_DATA_REQUEST);
Alessio_Zaino 5:b0fa65791218 211 break;
Alessio_Zaino 5:b0fa65791218 212
Alessio_Zaino 5:b0fa65791218 213 }
Alessio_Zaino 5:b0fa65791218 214 }
Alessio_Zaino 5:b0fa65791218 215 }
Alessio_Zaino 5:b0fa65791218 216
Alessio_Zaino 5:b0fa65791218 217 void environmental() //make measurements and send to the can bus every second
Alessio_Zaino 5:b0fa65791218 218 {
Alessio_Zaino 5:b0fa65791218 219 float temp,CO;
Alessio_Zaino 5:b0fa65791218 220 uint32_t hum;
Alessio_Zaino 5:b0fa65791218 221 int32_t pres;
Alessio_Zaino 5:b0fa65791218 222 int lumen, infrared, uv;
Alessio_Zaino 5:b0fa65791218 223
Alessio_Zaino 5:b0fa65791218 224 temp = envi.get_temp(); //return temperature from SI7021
Alessio_Zaino 5:b0fa65791218 225 hum = envi.get_humidity(); //return humidity from SI7021
Alessio_Zaino 5:b0fa65791218 226 pres = envi.get_pressure(); //return pressure in Pa from MBP280
Alessio_Zaino 5:b0fa65791218 227 CO = envi.get_CO(); //return CO from mq-7
Alessio_Zaino 5:b0fa65791218 228 lumen = envi.get_lumen(); //return visible lumen from TSL2561
Alessio_Zaino 5:b0fa65791218 229 infrared = envi.get_infrared(); //return infrared lumen from TSL2561
Alessio_Zaino 5:b0fa65791218 230 uv = envi.get_uv(); //return uv intensity from VEML6070
Alessio_Zaino 4:f693e434d21c 231
Alessio_Zaino 5:b0fa65791218 232 envi_tx[1]=(char)(temp);
Alessio_Zaino 5:b0fa65791218 233 envi_tx[2]=(char)(hum);
Alessio_Zaino 5:b0fa65791218 234 envi_tx[3]=(char)(pres);
Alessio_Zaino 5:b0fa65791218 235 envi_tx[4]=(char)(CO);
Alessio_Zaino 5:b0fa65791218 236 envi_tx[5]=(char)(lumen);
Alessio_Zaino 5:b0fa65791218 237 envi_tx[6]=(char)(infrared);
Alessio_Zaino 5:b0fa65791218 238 envi_tx[7]=(char)(uv);
Alessio_Zaino 4:f693e434d21c 239
Alessio_Zaino 5:b0fa65791218 240
Alessio_Zaino 5:b0fa65791218 241 can.write(CANMessage(210, envi_tx, 8));
Alessio_Zaino 5:b0fa65791218 242 osDelay(1000);
Alessio_Zaino 5:b0fa65791218 243 }
Alessio_Zaino 5:b0fa65791218 244
Alessio_Zaino 5:b0fa65791218 245
Alessio_Zaino 5:b0fa65791218 246 int main()
Alessio_Zaino 5:b0fa65791218 247 {
Alessio_Zaino 5:b0fa65791218 248 can.frequency(125000);
Alessio_Zaino 5:b0fa65791218 249 box_thd.start(mbed::callback(box));
Alessio_Zaino 5:b0fa65791218 250 envi_thd.start(environmental);
Alessio_Zaino 5:b0fa65791218 251 can_rx_thd.start(can_rx);
Alessio_Zaino 5:b0fa65791218 252 }
Alessio_Zaino 5:b0fa65791218 253
Alessio_Zaino 5:b0fa65791218 254