28 char wheel_enc_set = 0;
31 char emitter_byte = 0x00;
33 Timeout update_timeout;
37 char Setup::get_dc_status()
39 IF_read_aux_ic_data();
43 void Setup::IF_set_IR_emitter_output(
char emitter,
char state)
47 char shift = 1 << emitter;
48 emitter_byte &= (0xFF - shift);
51 char shift = 1 << emitter;
52 emitter_byte |= shift;
56 data [1] = emitter_byte;
58 primary_i2c.write(AUX_IC_ADDRESS,data,2,
false);
62 void Setup::IF_set_base_LED(
char state)
66 }
else emitter_byte |= 0x08;
69 data [1] = emitter_byte;
70 primary_i2c.write(AUX_IC_ADDRESS,data,2,
false);
74 unsigned short Setup::IF_read_IR_adc_value(
char adc,
char index)
76 char address = ADC1_ADDRESS;
77 if(adc == 2) address=ADC2_ADDRESS;
110 primary_i2c.write(address,apb,1,
false);
111 primary_i2c.read(address,data,2,
false);
112 value=((data[0] % 16)<<8)+data[1];
113 if(value > 4096) value=4096;
119 char Setup::IF_setup_led_expansion_ic(
void)
134 primary_i2c.write(LED_IC_ADDRESS,data,3,
false);
140 primary_i2c.write(LED_IC_ADDRESS,data,3,
false);
147 return primary_i2c.write(LED_IC_ADDRESS,data,3,
false);
151 void Setup::IF_setup_gpio_expansion_ic(
void)
167 if(primary_i2c.write(GPIO_IC_ADDRESS,data,3,
false) != 0) {
168 system_warnings += 2;
170 psi.
debug(
"- WARNING: No I2C acknowledge for main GPIO IC\n");
171 if(HALT_ON_GPIO_ERROR){
172 psi.
debug(
"- PROGRAM HALTED. Check that robot is switched on!\n");
191 primary_i2c.write(GPIO_IC_ADDRESS,data,3,
false);
199 primary_i2c.write(GPIO_IC_ADDRESS,command,1,
false);
200 primary_i2c.read(GPIO_IC_ADDRESS,read_data,2,
false);
201 gpio_byte0 = read_data[0];
203 gpio_byte1 = read_data[1];
204 if(okay && testing_voltage_regulators_flag)psi.
debug(
"- Checking 3.3V voltage regulators\n");
205 IF_parse_gpio_byte0(gpio_byte0);
206 IF_parse_gpio_byte1(gpio_byte1);
207 testing_voltage_regulators_flag = 0;
209 gpio_interrupt.mode(PullUp);
210 gpio_interrupt.rise(
this,&Setup::IF_handle_gpio_interrupt);
219 primary_i2c.write(AUX_IC_ADDRESS,data,2,
false);
221 if(primary_i2c.write(AUX_IC_ADDRESS,data,2,
false) != 0) {
222 system_warnings += 4;
223 psi.
debug(
"- WARNING: No I2C acknowledge for aux GPIO IC\n");
227 primary_i2c.write(AUX_IC_ADDRESS,data,2,
false);
230 update_timeout.attach_us(
this,&Setup::IF_update_gpio_inputs,50000);
234 void Setup::IF_read_aux_ic_data()
239 write_data[0] = 0x09;
240 primary_i2c.write(AUX_IC_ADDRESS,write_data,1,
false);
241 primary_i2c.read(AUX_IC_ADDRESS,read_data,1,
false);
242 char old_charging_state = status_dc_in;
243 status_dc_in = 1-((read_data[0] & 0x10) >> 4);
244 if(status_dc_in!=old_charging_state){
245 if(status_dc_in == 0)psi.
debug(
"No DC input\n");
246 else psi.
debug(
"DC input to charge pins\n");
251 void Setup::IF_parse_gpio_byte0(
char byte)
255 char current_switch = ((gpio_byte0 & 0xF8) >> 3);
256 if(switch_set == 1) {
257 if(current_switch != switch_byte) {
258 previous_switch_byte = switch_byte;
259 switch_byte = current_switch;
264 switch_byte = current_switch;
267 if(((gpio_byte0 & 0x01)) != power_good_motor_left){
268 power_good_motor_left = (gpio_byte0 & 0x01);
269 if(!power_good_motor_left){
270 if(testing_voltage_regulators_flag || SHOW_VR_WARNINGS)psi.
debug(
"- WARNING: Voltage regulator left motor low\n");
272 else if(testing_voltage_regulators_flag)psi.
debug(
"- Power good left motor v.reg\n");
274 if(((gpio_byte0 & 0x02) >> 1) != power_good_motor_right){
275 power_good_motor_right = (gpio_byte0 & 0x02) >> 1;
276 if(!power_good_motor_right){
277 if(testing_voltage_regulators_flag || SHOW_VR_WARNINGS)psi.
debug(
"- WARNING: Voltage regulator right motor low\n");
279 else if(testing_voltage_regulators_flag)psi.
debug(
"- Power good right motor v.reg\n");
281 if(((gpio_byte0 & 0x04) >> 2) != power_good_infrared){
282 power_good_infrared = (gpio_byte0 & 0x04) >> 2;
283 if(!power_good_infrared){
284 if(testing_voltage_regulators_flag || SHOW_VR_WARNINGS)psi.
debug(
"- WARNING: Voltage regulator infrared low\n");
286 else if(testing_voltage_regulators_flag)psi.
debug(
"- Power good infrared and aux v.reg\n");
288 if(USE_LED4_FOR_VR_WARNINGS){
289 mbed_led4 = (!power_good_motor_left || !power_good_motor_right || !power_good_infrared);
292 if(HALT_ON_ALL_VREGS_LOW && !power_good_motor_left && !power_good_motor_right && !power_good_infrared){
293 psi.
debug(
"- PROGRAM HALTED. Check that robot is switched on!\n");
309 void Setup::IF_parse_gpio_byte1(
char byte)
313 char current_id = ((gpio_byte1 & 0xF0)>> 4);
314 if(user_id_set == 1) {
315 if(robot_id != current_id) {
316 previous_robot_id = robot_id;
317 robot_id = current_id;
322 robot_id = current_id;
325 char current_encoder = (gpio_byte1 & 0x0F);
326 if(wheel_enc_set == 1) {
327 if(wheel_encoder_byte != current_encoder) {
328 previous_wheel_encoder_byte = wheel_encoder_byte;
329 wheel_encoder_byte = current_encoder;
334 wheel_encoder_byte = current_encoder;
339 void Setup::IF_handle_gpio_interrupt()
342 if(USE_LED3_FOR_INTERRUPTS) mbed_led3 = test;
343 IF_update_gpio_inputs();
346 char Setup::IF_is_switch_pressed()
350 char command[1] = {0};
351 primary_i2c.write(GPIO_IC_ADDRESS,command,1,
false);
352 primary_i2c.read(GPIO_IC_ADDRESS,data,1,
false);
353 return (data[0] & 0x80);
357 char Setup::IF_get_switch_state()
361 char command[1] = {0};
362 primary_i2c.write(GPIO_IC_ADDRESS,command,1,
false);
363 primary_i2c.read(GPIO_IC_ADDRESS,data,1,
false);
364 return (data[0] & 0xF8) >> 3;
367 void Setup::IF_update_gpio_inputs()
369 update_timeout.detach();
372 char command[1] = {0};
373 primary_i2c.write(GPIO_IC_ADDRESS,command,1,
false);
374 primary_i2c.read(GPIO_IC_ADDRESS,data,2,
false);
375 if(data[0]!=gpio_byte0) {
376 IF_parse_gpio_byte0(data[0]);
378 if(data[1]!=gpio_byte1) {
379 IF_parse_gpio_byte1(data[1]);
381 update_timeout.attach_us(
this,&Setup::IF_update_gpio_inputs,50000);
385 void Setup::IF_write_to_led_ic(
char byte_0,
char byte_1)
392 primary_i2c.write(LED_IC_ADDRESS,data,3,
false);
396 void Setup::IF_setup_temperature_sensor()
400 data[1] = TEMPERATURE_CRITICAL_HI;
401 data[2] = TEMPEARTURE_CRITICAL_LO;
402 primary_i2c.write(TEMPERATURE_ADDRESS,data,3,
false);
404 data[1] = TEMPERATURE_HIGH_HI;
405 data[2] = TEMPEARTURE_HIGH_LO;
406 primary_i2c.write(TEMPERATURE_ADDRESS,data,3,
false);
408 data[1] = TEMPERATURE_LOW_HI;
409 data[2] = TEMPEARTURE_LOW_LO;
410 primary_i2c.write(TEMPERATURE_ADDRESS,data,3,
false);
413 float Setup::IF_read_from_temperature_sensor()
415 char command[1] = {0x05};
419 primary_i2c.write(TEMPERATURE_ADDRESS,command,1,
false);
420 primary_i2c.read(TEMPERATURE_ADDRESS,data,2,
false);
424 char UpperByte = data[0];
425 char LowerByte = data[1];
426 if ((UpperByte & 0x80) == 0x80) {
427 psi.
debug(
"- WARNING: Temperature sensor reports critical temperature\n");
429 if ((UpperByte & 0x40) == 0x40) {
430 psi.
debug(
"- WARNING: Temperature sensor reports above upper limit\n");
432 if ((UpperByte & 0x20) == 0x20) {
433 psi.
debug(
"- WARNING: Temperature sensor reports below lower limit\n");
435 UpperByte = UpperByte & 0x1F;
436 if ((UpperByte & 0x10) == 0x10) {
437 UpperByte = UpperByte & 0x0F;
438 temp = (UpperByte * 256) + LowerByte;
439 temperature = - (temp / 16.0f);
441 temp = (UpperByte * 256) + LowerByte;
442 temperature = (temp / 16.0f);
void debug(const char *format,...)