Modified version of the UKESF lab source which can be carried out with no knowledge of C

Fork of PsiSwarm-Headstart by UKESF Headstart Summer School

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