Complete library for whole scientific pre-final
Dependencies: BOX_1
main.cpp@5:b0fa65791218, 2019-09-05 (annotated)
- 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?
User | Revision | Line number | New 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 |