Psi Swarm robot library version 0.9
Fork of PsiSwarmV9 by
Diff: eprom.cpp
- Revision:
- 19:3e3b03d80ea3
- Parent:
- 18:9204f74069b4
--- a/eprom.cpp Sun Jun 04 20:22:41 2017 +0000 +++ b/eprom.cpp Mon Jun 05 22:47:14 2017 +0000 @@ -190,6 +190,204 @@ return 0; } + +void Eprom::firmware_writer() +{ + psi.debug("Starting firmware writer function\n"); + display.clear_display(); + display.write_string("FIRMWARE WRITER"); + display.set_position(1,0); + int sub_menu = 0; + char _batch_number = FD_BATCH_NUMBER; + char _serial_number = FD_SERIAL_NUMBER; + char _create_day = FD_CREATE_DAY; + char _create_month = FD_CREATE_MONTH; + char _create_year = FD_CREATE_YEAR; + char _pcb_version_big = FD_PCB_VERSION_BIG; + char _pcb_version_little = FD_PCB_VERSION_LITTLE; + char _firmware_version_big = FD_FIRMWARE_VERSION_BIG; + char _firmware_version_little = FD_FIRMWARE_VERSION_LITTLE; + char _has_compass = FD_HAS_COMPASS; + char _has_side_ir = FD_HAS_SIDE_IR; + char _has_base_ir = FD_HAS_BASE_IR; + char _has_base_colour = FD_HAS_BASE_COLOUR; + char _has_top_colour = FD_HAS_TOP_COLOUR; + char _has_encoders = FD_HAS_ENCODERS; + char _has_audio_pic = FD_HAS_AUDIO_PIC; + char _has_ultrasonic = FD_HAS_ULTRASONIC; + char _has_temperature = FD_HAS_TEMPERATURE; + char _has_recharging = FD_HAS_RECHARGING; + char _has_433_radio = FD_HAS_433_RADIO; + char exit_state = 0; + char old_button = 255; + char button; + while(exit_state == 0){ + button = i2c_setup.IF_get_switch_state(); + if(button != old_button){ + old_button = button; + if(button == 1)// Up + { + switch(sub_menu){ + case 0: if(_batch_number == 0) _batch_number = 20; + else _batch_number --; + break; + case 1: if(_serial_number == 0) _serial_number = 99; + else _serial_number --; + break; + case 2: if(_create_day == 1) _create_day = 31; + else _create_day --; + break; + case 3: if(_create_month == 1) _create_month = 12; + else _create_month --; + break; + case 4: if(_create_year == 15) _create_year = 25; + else _create_year --; + break; + case 5: if(_pcb_version_big == 1) _pcb_version_big = 3; + else _pcb_version_big --; + break; + case 6: if(_pcb_version_little == 0) _pcb_version_little = 9; + else _pcb_version_little --; + break; + case 7: if(_firmware_version_big == 1) _firmware_version_big = 3; + else _firmware_version_big --; + break; + case 8: if(_firmware_version_little == 0) _firmware_version_little = 9; + else _firmware_version_little --; + break; + case 9: _has_compass = 1-_has_compass; break; + case 10: _has_side_ir = 1 - _has_side_ir; break; + case 11: _has_base_ir = 1 - _has_base_ir; break; + case 12: _has_base_colour = 1 - _has_base_colour; break; + case 13: _has_top_colour = 1 - _has_top_colour; break; + case 14: _has_encoders = 1 - _has_encoders; break; + case 15: _has_audio_pic = 1 - _has_audio_pic; break; + case 16: _has_ultrasonic = 1 - _has_ultrasonic; break; + case 17: _has_temperature = 1 - _has_temperature; break; + case 18: _has_recharging = 1 - _has_recharging; break; + case 19: _has_433_radio = 1 - _has_433_radio; break; + case 20: exit_state = 1; break; + case 21: exit_state = 2; break; + } + } + if(button == 2)// Down + { + switch(sub_menu){ + case 0: if(_batch_number == 20) _batch_number = 0; + else _batch_number ++; + break; + case 1: if(_serial_number == 99) _serial_number = 0; + else _serial_number ++; + break; + case 2: if(_create_day == 31) _create_day = 1; + else _create_day ++; + break; + case 3: if(_create_month == 12) _create_month = 1; + else _create_month ++; + break; + case 4: if(_create_year == 25) _create_year = 15; + else _create_year ++; + break; + case 5: if(_pcb_version_big == 3) _pcb_version_big = 1; + else _pcb_version_big ++; + break; + case 6: if(_pcb_version_little == 9) _pcb_version_little = 0; + else _pcb_version_little ++; + break; + case 7: if(_firmware_version_big == 3) _firmware_version_big = 1; + else _firmware_version_big ++; + break; + case 8: if(_firmware_version_little == 9) _firmware_version_little = 0; + else _firmware_version_little ++; + break; + case 9: _has_compass = 1-_has_compass; break; + case 10: _has_side_ir = 1 - _has_side_ir; break; + case 11: _has_base_ir = 1 - _has_base_ir; break; + case 12: _has_base_colour = 1 - _has_base_colour; break; + case 13: _has_top_colour = 1 - _has_top_colour; break; + case 14: _has_encoders = 1 - _has_encoders; break; + case 15: _has_audio_pic = 1 - _has_audio_pic; break; + case 16: _has_ultrasonic = 1 - _has_ultrasonic; break; + case 17: _has_temperature = 1 - _has_temperature; break; + case 18: _has_recharging = 1 - _has_recharging; break; + case 19: _has_433_radio = 1 - _has_433_radio; break; + case 20: exit_state = 1; break; + case 21: exit_state = 2; break; + } + } + if(button == 4)// Left + { + if(sub_menu == 0) sub_menu = 21; + else sub_menu --; + + } + if(button == 8)// Right + { + if(sub_menu == 21) sub_menu = 0; + else sub_menu ++; + } + display.set_position(1,0); + char message[17]; + switch(sub_menu){ + case 0: sprintf(message,"BATCH NUMBER:%3d",_batch_number); break; + case 1: sprintf(message,"SERIAL NUMBR:%3d",_serial_number); break; + case 2: sprintf(message,"CREATE DAY :%3d",_create_day); break; + case 3: sprintf(message,"CREATE MONTH:%3d",_create_month); break; + case 4: sprintf(message,"CREATE YEAR :%3d",_create_year); break; + case 5: sprintf(message,"PCB VERS BIG:%3d",_pcb_version_big); break; + case 6: sprintf(message,"PCB VERS LIT:%3d",_pcb_version_little); break; + case 7: sprintf(message,"FWR VERS BIG:%3d",_firmware_version_big);break; + case 8: sprintf(message,"FWR VERS LIT:%3d",_firmware_version_little); break; + case 9: sprintf(message,"HAS COMPASS :%s",IF_get_state(_has_compass)); break; + case 10: sprintf(message,"HAS SIDE IR :%s",IF_get_state(_has_side_ir)); break; + case 11: sprintf(message,"HAS BASE IR :%s",IF_get_state(_has_base_ir)); break; + case 12: sprintf(message,"HAS BASE COL:%s",IF_get_state(_has_base_colour)); break; + case 13: sprintf(message,"HAS TOP COL :%s",IF_get_state(_has_top_colour)); break; + case 14: sprintf(message,"HAS ENCODERS:%s",IF_get_state(_has_encoders)); break; + case 15: sprintf(message,"HAS AUDIOPIC:%s",IF_get_state(_has_audio_pic)); break; + case 16: sprintf(message,"HAS ULTRASNC:%s",IF_get_state(_has_ultrasonic)); break; + case 17: sprintf(message,"HAS TEMPERAT:%s",IF_get_state(_has_temperature)); break; + case 18: sprintf(message,"HAS RECHARGE:%s",IF_get_state(_has_recharging)); break; + case 19: sprintf(message,"HAS 433RADIO:%s",IF_get_state(_has_433_radio)); break; + case 20: sprintf(message,"ACCEPT "); break; + case 21: sprintf(message,"REJECT "); break; + } + display.write_string(message); + } + wait(0.01); + } + if(exit_state == 1){ + display.clear_display(); + display.write_string("WRITING FIRMWARE"); + char _flash_count = read_firmware_byte(1); + if(_flash_count > 199) _flash_count = 0; + char _motor_calibration_set = read_firmware_byte(22); + if(_motor_calibration_set > 1) _motor_calibration_set = 0; + char _base_ir_calibration_set = read_firmware_byte(29); + if(_base_ir_calibration_set > 1) _base_ir_calibration_set = 0; + char _base_colour_calibration_set = read_firmware_byte(50); + if(_base_colour_calibration_set > 1) _base_colour_calibration_set = 0; + int _boot_count = ((int)read_firmware_byte(69) << 8) + read_firmware_byte(70); + if(_boot_count > 29999) _boot_count = 0; + write_firmware(_flash_count, _create_day, _create_month, _create_year, _batch_number, _serial_number, _pcb_version_big, _pcb_version_little, _firmware_version_big, + _firmware_version_little, _has_compass, _has_side_ir, _has_base_ir, _has_base_colour, _has_top_colour, _has_encoders, _has_audio_pic, _has_ultrasonic, + _has_temperature, _has_recharging, _has_433_radio, _motor_calibration_set, _base_ir_calibration_set, _base_colour_calibration_set, _boot_count); + } else { + display.clear_display(); + display.write_string("CHANGES REJECTED"); + wait(1); + psi.debug("Firmware writer settings rejected\n"); + display.clear_display(); + } + wait(1); +} + +const char * Eprom::IF_get_state(char value) +{ + if(value==1)return"YES"; + return"NO "; +} + void Eprom::IF_write_base_ir_calibration_values(short white_values[5], short black_values[5]){ //Set calibration_set byte [29] to 1 write_firmware_byte(29,1); @@ -258,8 +456,8 @@ void Eprom::write_string(char value){ - if(value==1) pc.printf("YES\n"); - else pc.printf("NO\n"); + if(value==1) psi.debug("YES\n"); + else psi.debug("NO\n"); } void Eprom::write_firmware(char _flash_count, char _create_day, char _create_month, char _create_year, char _batch_number, char _serial_number, char _pcb_version_big, char _pcb_version_little, char _firmware_version_big, @@ -268,68 +466,68 @@ psi.debug("Writing new firmware:\n"); write_firmware_byte(0,PSI_BYTE); _flash_count ++; - pc.printf("Flash Count: %d\n",_flash_count); + psi.debug("Flash Count: %d\n",_flash_count); write_firmware_byte(1,_flash_count); - pc.printf("Flash Date: %d-%d-%d\n",_create_day,_create_month,_create_year); + psi.debug("Flash Date: %d-%d-%d\n",_create_day,_create_month,_create_year); write_firmware_byte(2,_create_day); write_firmware_byte(3,_create_month); write_firmware_byte(4,_create_year); - pc.printf("Serial Number: %d-%d\n",_batch_number,_serial_number); + psi.debug("Serial Number: %d-%d\n",_batch_number,_serial_number); write_firmware_byte(5,_batch_number); write_firmware_byte(6,_serial_number); - pc.printf("PCB Version: %d.%d\n",_pcb_version_big,_pcb_version_little); + psi.debug("PCB Version: %d.%d\n",_pcb_version_big,_pcb_version_little); write_firmware_byte(7,_pcb_version_big); write_firmware_byte(8,_pcb_version_little); - pc.printf("Firmware Version: %d.%d\n",_firmware_version_big,_firmware_version_little); + psi.debug("Firmware Version: %d.%d\n",_firmware_version_big,_firmware_version_little); write_firmware_byte(9,_firmware_version_big); write_firmware_byte(10,_firmware_version_little); - pc.printf("Has Compass: "); + psi.debug("Has Compass: "); write_string(_has_compass); write_firmware_byte(11,_has_compass); - pc.printf("Has Side IR Sensors: "); + psi.debug("Has Side IR Sensors: "); write_string(_has_side_ir); write_firmware_byte(12,_has_side_ir); - pc.printf("Has Base IR Sensors: "); + psi.debug("Has Base IR Sensors: "); write_string(_has_base_ir); write_firmware_byte(13,_has_base_ir); - pc.printf("Has Base Colour Sensor: "); + psi.debug("Has Base Colour Sensor: "); write_string(_has_base_colour_sensor); write_firmware_byte(14,_has_base_colour_sensor); - pc.printf("Has Top Colour Sensor: "); + psi.debug("Has Top Colour Sensor: "); write_string(_has_top_colour_sensor); write_firmware_byte(15,_has_top_colour_sensor); - pc.printf("Has Wheel Encoders: "); + psi.debug("Has Wheel Encoders: "); write_string(_has_encoders); write_firmware_byte(16,_has_encoders); - pc.printf("Has Audio PIC: "); + psi.debug("Has Audio PIC: "); write_string(_has_audio_pic); write_firmware_byte(17,_has_audio_pic); - pc.printf("Has Ultrasonic Sensor: "); + psi.debug("Has Ultrasonic Sensor: "); write_string(_has_ultrasonic); write_firmware_byte(18,_has_ultrasonic); - pc.printf("Has Temperature Sensor: "); + psi.debug("Has Temperature Sensor: "); write_string(_has_temperature); write_firmware_byte(19,_has_temperature); - pc.printf("Has Recharging Circuit: "); + psi.debug("Has Recharging Circuit: "); write_string(_has_recharging); write_firmware_byte(20,_has_recharging); - pc.printf("Has 433MHz Radio: "); + psi.debug("Has 433MHz Radio: "); write_string(_has_433_radio); write_firmware_byte(21,_has_433_radio); - pc.printf("Motor calibration set: "); + psi.debug("Motor calibration set: "); write_string(_motor_calibration_set); write_firmware_byte(22,_motor_calibration_set); - pc.printf("Base IR calibration set: "); + psi.debug("Base IR calibration set: "); write_string(_base_ir_calibration_set); write_firmware_byte(29,_base_ir_calibration_set); - pc.printf("Base colour calibration set: "); + psi.debug("Base colour calibration set: "); write_string(_base_colour_calibration_set); write_firmware_byte(50,_base_colour_calibration_set); - pc.printf("Boot Count: %d\n",_boot_count); + psi.debug("Boot Count: %d\n",_boot_count); wait(0.2); - pc.printf("_________________________________________\n"); + psi.debug("_________________________________________\n"); wait(0.2); - pc.printf("VERIFYING FIRMWARE...\n"); + psi.debug("VERIFYING FIRMWARE...\n"); short test_b_c = read_firmware_byte(69) << 8; test_b_c += read_firmware_byte(70); if(read_firmware_byte(0) == PSI_BYTE @@ -359,14 +557,14 @@ && read_firmware_byte(50) == _base_colour_calibration_set && test_b_c == _boot_count ){ - pc.printf("Flash successful.\n"); + psi.debug("Flash successful.\n"); display.clear_display(); display.set_position(0,0); display.write_string("FIRMWARE"); display.set_position(1,0); display.write_string("UPDATED"); } - else {pc.printf("ERROR: Corrupt data. Flashing failed.\n"); + else {psi.debug("ERROR: Corrupt data. Flashing failed.\n"); display.clear_display(); display.set_position(0,0); display.write_string("UPDATE");