Psi Swarm robot library version 0.9

Dependents:   PsiSwarm_V9_Blank

Fork of PsiSwarmV9 by James Hilder

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");