PsiSwarm Library  0.8
eprom.cpp
1 
35 #include "psiswarm.h"
36 
42 void Eprom::write_eeprom_byte ( int address, char data )
43 {
44  char write_array[3];
45  if(address > 65279) {
46  psi.debug("WARNING: Attempt to write to invalid EPROM address: %X",address);
47  } else {
48  write_array[0] = address / 256;
49  write_array[1] = address % 256;
50  write_array[2] = data;
51  primary_i2c.write(EEPROM_ADDRESS, write_array, 3, false);
52  //Takes 5ms to write a page: ideally this could be done with a timer or RTOS
53  wait(0.005);
54  }
55 }
56 
62 char Eprom::read_eeprom_byte ( int address )
63 {
64  char address_array [2];
65  address_array[0] = address / 256;
66  address_array[1] = address % 256;
67  char data [1];
68  primary_i2c.write(EEPROM_ADDRESS, address_array, 2, false);
69  primary_i2c.read(EEPROM_ADDRESS, data, 1, false);
70  return data [0];
71 }
72 
78 {
79  char data [1];
80  primary_i2c.read(EEPROM_ADDRESS, data, 1, false);
81  return data [0];
82 }
83 
89 {
90  char address_array [2] = {255,0};
91  primary_i2c.write(EEPROM_ADDRESS, address_array, 2, false);
92  primary_i2c.read(EEPROM_ADDRESS, firmware_bytes, 21, false);
93 
94  if(firmware_bytes[0] == PSI_BYTE) {
95  // Parse firmware
96  char firmware_string [8];
97  sprintf(firmware_string,"%d.%d",firmware_bytes[9],firmware_bytes[10]);
98  firmware_version = atof(firmware_string);
99  char pcb_version_string [8];
100  sprintf(pcb_version_string,"%d.%d",firmware_bytes[7],firmware_bytes[8]);
101  pcb_version = atof(pcb_version_string);
102  char serial_number_string [8];
103  sprintf(serial_number_string,"%d.%d",firmware_bytes[5],firmware_bytes[6]);
104  serial_number = atof(serial_number_string);
105  has_compass = firmware_bytes[11];
106  has_side_ir = firmware_bytes[12];
107  has_base_ir = firmware_bytes[13];
108  has_base_colour_sensor= firmware_bytes[14];
109  has_top_colour_sensor= firmware_bytes[15];
110  has_wheel_encoders= firmware_bytes[16];
111  has_audio_pic= firmware_bytes[17];
112  has_ultrasonic_sensor= firmware_bytes[18];
113  has_temperature_sensor= firmware_bytes[19];
114  has_recharging_circuit= firmware_bytes[20];
115  has_433_radio= firmware_bytes[21];
116  if(firmware_version > 1.0) {
117  motor_calibration_set = firmware_bytes[22];
118  if(motor_calibration_set == 1) {
119  left_motor_calibration_value = (float) firmware_bytes[23] * 65536;
120  left_motor_calibration_value += ((float) firmware_bytes[24] * 256);
121  left_motor_calibration_value += firmware_bytes[25];
122  left_motor_calibration_value /= 16777216;
123  right_motor_calibration_value = (float) firmware_bytes[26] * 65536;
124  right_motor_calibration_value += ((float) firmware_bytes[27] * 256);
125  right_motor_calibration_value += firmware_bytes[28];
126  right_motor_calibration_value /= 16777216;
127  }
128  } else motor_calibration_set = 0;
129  return 1;
130  }
131  return 0;
132 }
void write_eeprom_byte(int address, char data)
Definition: eprom.cpp:42
char read_firmware(void)
Definition: eprom.cpp:88
char read_eeprom_byte(int address)
Definition: eprom.cpp:62
char read_next_eeprom_byte(void)
Definition: eprom.cpp:77
void debug(const char *format,...)
Definition: psiswarm.cpp:325