Bluetooth communication for flocking.
Fork of BeautifulMemeProject by
Diff: PsiSwarm/eprom.cpp
- Revision:
- 0:8a5497a2e366
- Child:
- 1:f6356cf1cefc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PsiSwarm/eprom.cpp Sat Oct 03 22:48:50 2015 +0000 @@ -0,0 +1,80 @@ +/** University of York Robotics Laboratory PsiSwarm Library: Eprom Functions Source File + * + * File: eprom.cpp + * + * (C) Dr James Hilder, Dept. Electronics & Computer Science, University of York + * + * PsiSwarm Library Version: 0.2, October 2015 + * + * 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, 20, false); + if(firmware_bytes[0] == PSI_BYTE) return 1; + return 0; +} \ No newline at end of file