C++ Library for the PsiSwarm Robot - Version 0.7
Fork of PsiSwarmV7 by
Diff: eprom.cpp
- Revision:
- 0:d6269d17c8cf
- Child:
- 1:060690a934a9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eprom.cpp Thu Feb 04 21:48:54 2016 +0000 @@ -0,0 +1,94 @@ +/** University of York Robotics Laboratory PsiSwarm Library: Eprom Functions Source File + * + * File: eprom.cpp + * + * (C) Dept. Electronics & Computer Science, University of York + * James Hilder, Alan Millard, Alexander Horsfield, Homero Elizondo, Jon Timmis + * + * PsiSwarm Library Version: 0.4 + * + * February 2016 + * + * Functions for accessing the 64Kb EPROM chip and reading the reserved firmware block + * + * Example: + * @code + * #include "psiswarm.h" + * + * int main() { + * init(); + * write_eeprom_byte(0,0xDD); //Writes byte 0xDD in EPROM address 0 + * char c = read_eeprom_byte(0); //c will hold 0xDD + * //Valid address range is from 0 to 65279 + * } + * @endcode + */ + +#include "psiswarm.h" + +/** Write a single byte to the EPROM + * + * @param address The address to store the data, range 0-65279 + * @param data The character to store + */ +void write_eeprom_byte ( int address, char data ) +{ + char write_array[3]; + if(address > 65279) { + debug("WARNING: Attempt to write to invalid EPROM address: %X",address); + } else { + write_array[0] = address / 256; + write_array[1] = address % 256; + write_array[2] = data; + primary_i2c.write(EEPROM_ADDRESS, write_array, 3, false); + //Takes 5ms to write a page: ideally this could be done with a timer or RTOS + wait(0.005); + } +} + +/** Read a single byte from the EPROM + * + * @param address The address to read from, range 0-65279 + * @return The character stored at address + */ +char read_eeprom_byte ( int address ) +{ + char address_array [2]; + address_array[0] = address / 256; + address_array[1] = address % 256; + char data [1]; + primary_i2c.write(EEPROM_ADDRESS, address_array, 2, false); + primary_i2c.read(EEPROM_ADDRESS, data, 1, false); + return data [0]; +} + +/** Read the next byte from the EPROM, to be called after read_eeprom_byte + * + * @return The character stored at address after the previous one read from + */ +char read_next_eeprom_byte () +{ + char data [1]; + primary_i2c.read(EEPROM_ADDRESS, data, 1, false); + return data [0]; +} + +/** Read the data stored in the reserved firmware area of the EPROM + * + * @return 1 if a valid firmware is read, 0 otherwise + */ +char read_firmware () +{ + char address_array [2] = {255,0}; + primary_i2c.write(EEPROM_ADDRESS, address_array, 2, false); + primary_i2c.read(EEPROM_ADDRESS, firmware_bytes, 21, false); + + if(firmware_bytes[0] == PSI_BYTE) { + // Parse firmware + char firmware_string [8]; + sprintf(firmware_string,"%d.%d",firmware_bytes[9],firmware_bytes[10]); + firmware_version = atof(firmware_string); + return 1; + } + return 0; +} \ No newline at end of file