C++ Library for the PsiSwarm Robot - Version 0.8

Dependents:   PsiSwarm_V8_Blank_CPP Autonomia_RndmWlk

Fork of PsiSwarmV7_CPP by Psi Swarm Robot

Committer:
jah128
Date:
Mon Oct 17 13:09:10 2016 +0000
Revision:
12:878c6e9d9e60
Parent:
8:6c92789d5f87
Added Psiswarm class; changed Dances to Animations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jah128 0:d6269d17c8cf 1 /** University of York Robotics Laboratory PsiSwarm Library: Eprom Functions Source File
jah128 8:6c92789d5f87 2 *
jah128 6:b340a527add9 3 * Copyright 2016 University of York
jah128 6:b340a527add9 4 *
jah128 8:6c92789d5f87 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
jah128 6:b340a527add9 6 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
jah128 6:b340a527add9 7 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS
jah128 8:6c92789d5f87 8 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jah128 6:b340a527add9 9 * See the License for the specific language governing permissions and limitations under the License.
jah128 0:d6269d17c8cf 10 *
jah128 0:d6269d17c8cf 11 * File: eprom.cpp
jah128 0:d6269d17c8cf 12 *
jah128 0:d6269d17c8cf 13 * (C) Dept. Electronics & Computer Science, University of York
jah128 0:d6269d17c8cf 14 * James Hilder, Alan Millard, Alexander Horsfield, Homero Elizondo, Jon Timmis
jah128 0:d6269d17c8cf 15 *
jah128 8:6c92789d5f87 16 * PsiSwarm Library Version: 0.8
jah128 0:d6269d17c8cf 17 *
jah128 5:3cdd1a37cdd7 18 * October 2016
jah128 0:d6269d17c8cf 19 *
jah128 0:d6269d17c8cf 20 * Functions for accessing the 64Kb EPROM chip and reading the reserved firmware block
jah128 0:d6269d17c8cf 21 *
jah128 0:d6269d17c8cf 22 * Example:
jah128 0:d6269d17c8cf 23 * @code
jah128 0:d6269d17c8cf 24 * #include "psiswarm.h"
jah128 0:d6269d17c8cf 25 *
jah128 0:d6269d17c8cf 26 * int main() {
jah128 0:d6269d17c8cf 27 * init();
jah128 8:6c92789d5f87 28 * eprom.write_eeprom_byte(0,0xDD); //Writes byte 0xDD in EPROM address 0
jah128 8:6c92789d5f87 29 * char c = eprom.read_eeprom_byte(0); //c will hold 0xDD
jah128 0:d6269d17c8cf 30 * //Valid address range is from 0 to 65279
jah128 0:d6269d17c8cf 31 * }
jah128 0:d6269d17c8cf 32 * @endcode
jah128 0:d6269d17c8cf 33 */
jah128 0:d6269d17c8cf 34
jah128 0:d6269d17c8cf 35 #include "psiswarm.h"
jah128 0:d6269d17c8cf 36
jah128 0:d6269d17c8cf 37 /** Write a single byte to the EPROM
jah128 0:d6269d17c8cf 38 *
jah128 0:d6269d17c8cf 39 * @param address The address to store the data, range 0-65279
jah128 0:d6269d17c8cf 40 * @param data The character to store
jah128 0:d6269d17c8cf 41 */
jah128 8:6c92789d5f87 42 void Eprom::write_eeprom_byte ( int address, char data )
jah128 0:d6269d17c8cf 43 {
jah128 0:d6269d17c8cf 44 char write_array[3];
jah128 0:d6269d17c8cf 45 if(address > 65279) {
jah128 12:878c6e9d9e60 46 psi.debug("WARNING: Attempt to write to invalid EPROM address: %X",address);
jah128 0:d6269d17c8cf 47 } else {
jah128 0:d6269d17c8cf 48 write_array[0] = address / 256;
jah128 0:d6269d17c8cf 49 write_array[1] = address % 256;
jah128 0:d6269d17c8cf 50 write_array[2] = data;
jah128 0:d6269d17c8cf 51 primary_i2c.write(EEPROM_ADDRESS, write_array, 3, false);
jah128 0:d6269d17c8cf 52 //Takes 5ms to write a page: ideally this could be done with a timer or RTOS
jah128 0:d6269d17c8cf 53 wait(0.005);
jah128 0:d6269d17c8cf 54 }
jah128 0:d6269d17c8cf 55 }
jah128 0:d6269d17c8cf 56
jah128 0:d6269d17c8cf 57 /** Read a single byte from the EPROM
jah128 0:d6269d17c8cf 58 *
jah128 0:d6269d17c8cf 59 * @param address The address to read from, range 0-65279
jah128 0:d6269d17c8cf 60 * @return The character stored at address
jah128 0:d6269d17c8cf 61 */
jah128 8:6c92789d5f87 62 char Eprom::read_eeprom_byte ( int address )
jah128 0:d6269d17c8cf 63 {
jah128 0:d6269d17c8cf 64 char address_array [2];
jah128 0:d6269d17c8cf 65 address_array[0] = address / 256;
jah128 0:d6269d17c8cf 66 address_array[1] = address % 256;
jah128 0:d6269d17c8cf 67 char data [1];
jah128 0:d6269d17c8cf 68 primary_i2c.write(EEPROM_ADDRESS, address_array, 2, false);
jah128 0:d6269d17c8cf 69 primary_i2c.read(EEPROM_ADDRESS, data, 1, false);
jah128 0:d6269d17c8cf 70 return data [0];
jah128 0:d6269d17c8cf 71 }
jah128 0:d6269d17c8cf 72
jah128 0:d6269d17c8cf 73 /** Read the next byte from the EPROM, to be called after read_eeprom_byte
jah128 0:d6269d17c8cf 74 *
jah128 0:d6269d17c8cf 75 * @return The character stored at address after the previous one read from
jah128 0:d6269d17c8cf 76 */
jah128 8:6c92789d5f87 77 char Eprom::read_next_eeprom_byte ()
jah128 0:d6269d17c8cf 78 {
jah128 0:d6269d17c8cf 79 char data [1];
jah128 0:d6269d17c8cf 80 primary_i2c.read(EEPROM_ADDRESS, data, 1, false);
jah128 0:d6269d17c8cf 81 return data [0];
jah128 0:d6269d17c8cf 82 }
jah128 0:d6269d17c8cf 83
jah128 0:d6269d17c8cf 84 /** Read the data stored in the reserved firmware area of the EPROM
jah128 0:d6269d17c8cf 85 *
jah128 0:d6269d17c8cf 86 * @return 1 if a valid firmware is read, 0 otherwise
jah128 0:d6269d17c8cf 87 */
jah128 8:6c92789d5f87 88 char Eprom::read_firmware ()
jah128 0:d6269d17c8cf 89 {
jah128 0:d6269d17c8cf 90 char address_array [2] = {255,0};
jah128 0:d6269d17c8cf 91 primary_i2c.write(EEPROM_ADDRESS, address_array, 2, false);
jah128 0:d6269d17c8cf 92 primary_i2c.read(EEPROM_ADDRESS, firmware_bytes, 21, false);
jah128 0:d6269d17c8cf 93
jah128 0:d6269d17c8cf 94 if(firmware_bytes[0] == PSI_BYTE) {
jah128 0:d6269d17c8cf 95 // Parse firmware
jah128 0:d6269d17c8cf 96 char firmware_string [8];
jah128 0:d6269d17c8cf 97 sprintf(firmware_string,"%d.%d",firmware_bytes[9],firmware_bytes[10]);
jah128 0:d6269d17c8cf 98 firmware_version = atof(firmware_string);
jah128 1:060690a934a9 99 char pcb_version_string [8];
jah128 1:060690a934a9 100 sprintf(pcb_version_string,"%d.%d",firmware_bytes[7],firmware_bytes[8]);
jah128 1:060690a934a9 101 pcb_version = atof(pcb_version_string);
jah128 1:060690a934a9 102 char serial_number_string [8];
jah128 1:060690a934a9 103 sprintf(serial_number_string,"%d.%d",firmware_bytes[5],firmware_bytes[6]);
jah128 1:060690a934a9 104 serial_number = atof(serial_number_string);
jah128 1:060690a934a9 105 has_compass = firmware_bytes[11];
jah128 1:060690a934a9 106 has_side_ir = firmware_bytes[12];
jah128 1:060690a934a9 107 has_base_ir = firmware_bytes[13];
jah128 1:060690a934a9 108 has_base_colour_sensor= firmware_bytes[14];
jah128 1:060690a934a9 109 has_top_colour_sensor= firmware_bytes[15];
jah128 1:060690a934a9 110 has_wheel_encoders= firmware_bytes[16];
jah128 1:060690a934a9 111 has_audio_pic= firmware_bytes[17];
jah128 1:060690a934a9 112 has_ultrasonic_sensor= firmware_bytes[18];
jah128 1:060690a934a9 113 has_temperature_sensor= firmware_bytes[19];
jah128 1:060690a934a9 114 has_recharging_circuit= firmware_bytes[20];
jah128 1:060690a934a9 115 has_433_radio= firmware_bytes[21];
jah128 8:6c92789d5f87 116 if(firmware_version > 1.0) {
jah128 8:6c92789d5f87 117 motor_calibration_set = firmware_bytes[22];
jah128 8:6c92789d5f87 118 if(motor_calibration_set == 1) {
jah128 8:6c92789d5f87 119 left_motor_calibration_value = (float) firmware_bytes[23] * 65536;
jah128 8:6c92789d5f87 120 left_motor_calibration_value += ((float) firmware_bytes[24] * 256);
jah128 8:6c92789d5f87 121 left_motor_calibration_value += firmware_bytes[25];
jah128 8:6c92789d5f87 122 left_motor_calibration_value /= 16777216;
jah128 8:6c92789d5f87 123 right_motor_calibration_value = (float) firmware_bytes[26] * 65536;
jah128 8:6c92789d5f87 124 right_motor_calibration_value += ((float) firmware_bytes[27] * 256);
jah128 8:6c92789d5f87 125 right_motor_calibration_value += firmware_bytes[28];
jah128 8:6c92789d5f87 126 right_motor_calibration_value /= 16777216;
jah128 8:6c92789d5f87 127 }
jah128 4:1c621cb8cf0d 128 } else motor_calibration_set = 0;
jah128 0:d6269d17c8cf 129 return 1;
jah128 0:d6269d17c8cf 130 }
jah128 0:d6269d17c8cf 131 return 0;
jah128 0:d6269d17c8cf 132 }