Complete library for whole scientific pre-final
Dependencies: BOX_1
main.cpp
- Committer:
- Alessio_Zaino
- Date:
- 2019-09-05
- Revision:
- 5:b0fa65791218
- Parent:
- 4:f693e434d21c
File content as of revision 5:b0fa65791218:
//SCIENTIFIC CAN ID'S 201 TO 255 /*********** Open box1 ||201|0|| can frame id 201 indirizzamento al sottosistema (scatole) 202 indirizzamento dal sottosistema (scatole) 203/4 indirizzamento dal sottosistema (envi) 0 id scatola 1 nel dato 100 chiudi 101 apri 102 leggi CAN RX priorità piu bassa envi priorità normale box alta Costruzione frame CAN void sci::buildFrame(struct can_frame &frame, uint8_t id, can_commands command, int32_t value) { int len = 0; uint32_t new_id = id; new_id |= (uint32_t)command << 8; new_id |= 0x80000000; 100|0 0000 0000 0000 0 000 0000| 0000 0000 frame.can_id = new_id; frame.data[len++] = value >> 24; frame.data[len++] = value >> 16; frame.data[len++] = value >> 8; frame.data[len++] = value; frame.can_dlc = len; } ************/ #include "BOX.h" #include "mbed.h" #include "ENVIROMENTAL.h" //EVENT FLAGS #define OPEN_BOX 101 #define CLOSE_BOX 100 #define SEND_BOX_DATA_REQUEST 102 Thread can_rx_thd; Thread box_thd; Thread envi_thd; EventFlags event_flags; CAN can(PB_8, PB_9); CANMessage msg; CANFormat CANextended; BOX box1(PA_9, PA_8, PB_0, PA_0, 1000, PA_4); BOX box2(PC_9, PC_8, PB_1, PA_1, 1000, PA_5); BOX box3(PC_7, PC_6, PB_2, PA_2, 1000, PA_6); I2C i2c(PB_7,PB_6); ENVIROMENTAL envi(PB_7, PB_6, PA_3, i2c); unsigned char box_sel; unsigned char box_cmd; char message_out[8]; char envi_tx[8]; char data_box[3][8]; uint32_t new_id(int command, int id) { uint32_t id_message = id; id_message |= (uint32_t)command << 8; id_message |= 0x80000000; return id_message; } void box() { uint32_t flag_read = 0; box1.initialize(); box2.initialize(); box3.initialize(); int weight = 0; int resistence = 0; float temperature = 0; while(1) { flag_read = event_flags.wait_any(OPEN_BOX | CLOSE_BOX | SEND_BOX_DATA_REQUEST); //trigger this theand only if switch (flag_read) { case OPEN_BOX: switch(box_sel) { case 1: box1.move_servo(1000); //open box 1 break; case 2: box2.move_servo(1000); //open box 2 break; case 3: box3.move_servo(1000); //open box 3 break; default: break; } break; case CLOSE_BOX: switch(box_sel) { case 1: box2.move_servo(2200); //close box 1 break; case 2: box2.move_servo(2200); //close box 2 break; case 3: box2.move_servo(2200); //close box 3 break; default: break; } break; case SEND_BOX_DATA_REQUEST: //for every data request, a measure is made and then the data is sended on CAN switch(box_sel) { case 1: //make measurements box 1 weight = box1.get_weight(); resistence = box1.get_resistance(); //bisogna ancora "impacchettare i dati" temperature = box1.get_temp(); //temperature 4 bytes *(float*)(data_box[0]) = temperature; //weight 2 bytes data_box[0][4] = (char)(weight >> 8); data_box[0][5] = (char)(weight); //resistence 2 bytes data_box[0][6] = (char)(resistence >> 8); data_box[0][7] = (char)(resistence); break; case 2: //make measurements box 2 weight = box2.get_weight(); resistence = box2.get_resistance(); temperature = box2.get_temp(); //temperature 4 bytes *(float*)(data_box[1]) = temperature; //weight 2 bytes data_box[1][4] = (char)(weight >> 8); data_box[1][5] = (char)(weight); //resistence 2 bytes data_box[1][6] = (char)(resistence >> 8); data_box[1][7] = (char)(resistence); break; case 3: //make measurements box 3 weight = box3.get_weight(); resistence = box3.get_resistance(); temperature = box3.get_temp(); //temperature 4 bytes *(float*)(data_box[2]) = temperature; //weight 2 bytes data_box[2][4] = (char)(weight >> 8); data_box[2][5] = (char)(weight); //resistence 2 bytes data_box[2][6] = (char)(resistence >> 8); data_box[2][7] = (char)(resistence); break; default: break; } for(int i=0; i<8; i++) { message_out[i] = data_box[box_sel][i]; } can.write(CANMessage(new_id(202, box_sel),message_out, 8)); break; default: break; } } } void can_rx() { while(1) { can.read(msg); switch (msg.id) { case 201: box_sel = msg.data[0]; box_cmd = msg.data[1]; event_flags.set(OPEN_BOX); break; case 202: box_sel = msg.data[0]; box_cmd = msg.data[1]; event_flags.set(CLOSE_BOX); break; case 203: box_sel = msg.data[0]; event_flags.set(SEND_BOX_DATA_REQUEST); break; } } } void environmental() //make measurements and send to the can bus every second { float temp,CO; uint32_t hum; int32_t pres; int lumen, infrared, uv; temp = envi.get_temp(); //return temperature from SI7021 hum = envi.get_humidity(); //return humidity from SI7021 pres = envi.get_pressure(); //return pressure in Pa from MBP280 CO = envi.get_CO(); //return CO from mq-7 lumen = envi.get_lumen(); //return visible lumen from TSL2561 infrared = envi.get_infrared(); //return infrared lumen from TSL2561 uv = envi.get_uv(); //return uv intensity from VEML6070 envi_tx[1]=(char)(temp); envi_tx[2]=(char)(hum); envi_tx[3]=(char)(pres); envi_tx[4]=(char)(CO); envi_tx[5]=(char)(lumen); envi_tx[6]=(char)(infrared); envi_tx[7]=(char)(uv); can.write(CANMessage(210, envi_tx, 8)); osDelay(1000); } int main() { can.frequency(125000); box_thd.start(mbed::callback(box)); envi_thd.start(environmental); can_rx_thd.start(can_rx); }