Psi Swarm robot library version 0.9

Fork of PsiSwarmV9 by Psi Swarm Robot

Committer:
jah128
Date:
Sun Jun 04 20:22:41 2017 +0000
Revision:
18:9204f74069b4
Parent:
17:bf614e28668f
Updated self-test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jah128 12:878c6e9d9e60 1 /* University of York Robotics Laboratory PsiSwarm Library: PsiSwarm C++ Core Header File
jah128 12:878c6e9d9e60 2 *
jah128 15:66be5ec52c3b 3 * Copyright 2017 University of York
jah128 6:b340a527add9 4 *
jah128 12:878c6e9d9e60 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 12:878c6e9d9e60 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 6:b340a527add9 10 *
jah128 0:d6269d17c8cf 11 * File: psiswarm.h
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 15:66be5ec52c3b 16 * PsiSwarm Library Version: 0.9
jah128 0:d6269d17c8cf 17 *
jah128 16:50686c07ad07 18 * June 2017
jah128 0:d6269d17c8cf 19 *
jah128 0:d6269d17c8cf 20 *
jah128 12:878c6e9d9e60 21 */
jah128 0:d6269d17c8cf 22
jah128 0:d6269d17c8cf 23 #ifndef PSISWARM_H
jah128 0:d6269d17c8cf 24 #define PSISWARM_H
jah128 12:878c6e9d9e60 25
jah128 15:66be5ec52c3b 26 #define SOFTWARE_VERSION_CODE 0.90
jah128 17:bf614e28668f 27 #define TARGET_FIRMWARE_VERSION 1.2
jah128 0:d6269d17c8cf 28
jah128 0:d6269d17c8cf 29 #define PIC_ADDRESS 0x30
jah128 12:878c6e9d9e60 30 #define LCD_ADDRESS 0x7C
jah128 0:d6269d17c8cf 31 #define LED_IC_ADDRESS 0x42
jah128 0:d6269d17c8cf 32 #define GPIO_IC_ADDRESS 0x40
jah128 0:d6269d17c8cf 33 #define AUX_IC_ADDRESS 0x4E
jah128 0:d6269d17c8cf 34 #define ADC1_ADDRESS 0x46
jah128 0:d6269d17c8cf 35 #define ADC2_ADDRESS 0x48
jah128 0:d6269d17c8cf 36 #define EEPROM_ADDRESS 0XA0
jah128 0:d6269d17c8cf 37 #define TEMPERATURE_ADDRESS 0X30
jah128 0:d6269d17c8cf 38 #define BASE_COLOUR_ADDRESS 0X52
jah128 0:d6269d17c8cf 39 #define TOP_COLOUR_ADDRESS 0X72
jah128 0:d6269d17c8cf 40 #define ULTRASONIC_ADDRESS 0XE0
jah128 0:d6269d17c8cf 41 #define COMMAND_MESSAGE_BYTE 0X1D
jah128 0:d6269d17c8cf 42 #define ACKNOWLEDGE_MESSAGE_BYTE 0X1E
jah128 0:d6269d17c8cf 43 #define RESPONSE_MESSAGE_BYTE 0X1F
jah128 0:d6269d17c8cf 44 #define PSI_BYTE 0X1D
jah128 0:d6269d17c8cf 45
jah128 0:d6269d17c8cf 46 //Set temperature sensor warnings: 60C critical, 50C high, 0C low
jah128 0:d6269d17c8cf 47 #define TEMPERATURE_CRITICAL_HI 0X03
jah128 0:d6269d17c8cf 48 #define TEMPEARTURE_CRITICAL_LO 0XC0
jah128 0:d6269d17c8cf 49 #define TEMPERATURE_HIGH_HI 0X03
jah128 0:d6269d17c8cf 50 #define TEMPEARTURE_HIGH_LO 0X20
jah128 0:d6269d17c8cf 51 #define TEMPERATURE_LOW_HI 0X00
jah128 0:d6269d17c8cf 52 #define TEMPEARTURE_LOW_LO 0X00
jah128 0:d6269d17c8cf 53
jah128 17:bf614e28668f 54 /* CALIBRATION DEFAULTS
jah128 17:bf614e28668f 55 * __________________________
jah128 17:bf614e28668f 56 *
jah128 17:bf614e28668f 57 * These values are used as defaults if robot specific calibration values have not been stored in EEPROM
jah128 17:bf614e28668f 58 *
jah128 17:bf614e28668f 59 */
jah128 18:9204f74069b4 60 #define LEFT_STALL 20
jah128 18:9204f74069b4 61 #define RIGHT_STALL 20
jah128 17:bf614e28668f 62 #define BIR1W 1750
jah128 17:bf614e28668f 63 #define BIR2W 3780
jah128 17:bf614e28668f 64 #define BIR3W 3820
jah128 17:bf614e28668f 65 #define BIR4W 3810
jah128 17:bf614e28668f 66 #define BIR5W 2880
jah128 17:bf614e28668f 67 #define BIR1B 30
jah128 17:bf614e28668f 68 #define BIR2B 350
jah128 17:bf614e28668f 69 #define BIR3B 670
jah128 17:bf614e28668f 70 #define BIR4B 550
jah128 17:bf614e28668f 71 #define BIR5B 250
jah128 17:bf614e28668f 72 #define CS_C_BLACK 63
jah128 17:bf614e28668f 73 #define CS_C_WHITE 802
jah128 17:bf614e28668f 74 #define CS_R_BLACK 22
jah128 17:bf614e28668f 75 #define CS_R_WHITE 244
jah128 17:bf614e28668f 76 #define CS_G_BLACK 24
jah128 17:bf614e28668f 77 #define CS_G_WHITE 297
jah128 17:bf614e28668f 78 #define CS_B_BLACK 16
jah128 17:bf614e28668f 79 #define CS_B_WHITE 232
jah128 17:bf614e28668f 80
jah128 17:bf614e28668f 81
jah128 0:d6269d17c8cf 82 #define DEFAULT_IR_PULSE_DELAY 400
jah128 0:d6269d17c8cf 83 #define DEFAULT_BASE_IR_PULSE_DELAY 50
jah128 0:d6269d17c8cf 84
jah128 0:d6269d17c8cf 85 #include <stdio.h>
jah128 0:d6269d17c8cf 86 #include <stdarg.h>
jah128 0:d6269d17c8cf 87 #include <string>
jah128 0:d6269d17c8cf 88 #include <vector>
jah128 0:d6269d17c8cf 89
jah128 0:d6269d17c8cf 90 #include "settings.h"
jah128 0:d6269d17c8cf 91 #include "serial.h"
jah128 0:d6269d17c8cf 92 #include "mbed.h"
jah128 0:d6269d17c8cf 93 #include "display.h"
jah128 0:d6269d17c8cf 94 #include "led.h"
jah128 11:312663037b8c 95 #include "i2c_setup.h"
jah128 0:d6269d17c8cf 96 #include "motors.h"
jah128 0:d6269d17c8cf 97 #include "sensors.h"
jah128 0:d6269d17c8cf 98 #include "eprom.h"
jah128 0:d6269d17c8cf 99 #include "colour.h"
jah128 11:312663037b8c 100 #include "sound.h"
jah128 0:d6269d17c8cf 101 #include "demo.h"
jah128 12:878c6e9d9e60 102 #include "animations.h"
jah128 0:d6269d17c8cf 103 #include "basic.h"
jah128 0:d6269d17c8cf 104
jah128 0:d6269d17c8cf 105 //NB The user needs to have a main.cpp with a main() function and a handle_switch_event(char) function
jah128 0:d6269d17c8cf 106 #include "main.h"
jah128 0:d6269d17c8cf 107
jah128 12:878c6e9d9e60 108 /** Psiswarm Class
jah128 12:878c6e9d9e60 109 * The main class to define a robot
jah128 12:878c6e9d9e60 110 *
jah128 12:878c6e9d9e60 111 * Example code for main.cpp:
jah128 12:878c6e9d9e60 112 * @code
jah128 12:878c6e9d9e60 113 * #include "psiswarm.h"
jah128 12:878c6e9d9e60 114 * Psiswarm psi;
jah128 12:878c6e9d9e60 115 * char * program_name = "Example";
jah128 12:878c6e9d9e60 116 * char * author_name = "Name";
jah128 15:66be5ec52c3b 117 * char * version_name = "0.9";
jah128 12:878c6e9d9e60 118 * void handle_switch_event(char switch_state){}
jah128 12:878c6e9d9e60 119 * void handle_user_serial_message(char * message, char length, char interface) {}
jah128 12:878c6e9d9e60 120 * int main(){
jah128 12:878c6e9d9e60 121 * psi.init();
jah128 12:878c6e9d9e60 122 * while(1) { //Do something!
jah128 12:878c6e9d9e60 123 * }
jah128 12:878c6e9d9e60 124 * }
jah128 12:878c6e9d9e60 125 * @endcode
jah128 12:878c6e9d9e60 126 */
jah128 12:878c6e9d9e60 127 class Psiswarm
jah128 12:878c6e9d9e60 128 {
jah128 12:878c6e9d9e60 129 public:
jah128 12:878c6e9d9e60 130 /**
jah128 12:878c6e9d9e60 131 * Main initialisation routine for the PsiSwarm robot
jah128 12:878c6e9d9e60 132 *
jah128 12:878c6e9d9e60 133 * Set up the GPIO expansion ICs, launch demo mode if button is held
jah128 12:878c6e9d9e60 134 */
jah128 12:878c6e9d9e60 135 void init(void);
jah128 12:878c6e9d9e60 136
jah128 12:878c6e9d9e60 137 /**
jah128 12:878c6e9d9e60 138 * Get the uptime for the robot
jah128 12:878c6e9d9e60 139 *
jah128 12:878c6e9d9e60 140 * @return The amount of time in seconds that the MBED has been active since last reset
jah128 12:878c6e9d9e60 141 */
jah128 12:878c6e9d9e60 142 float get_uptime(void);
jah128 12:878c6e9d9e60 143
jah128 12:878c6e9d9e60 144 /**
jah128 12:878c6e9d9e60 145 * Pause the user code for a defined amount of time
jah128 12:878c6e9d9e60 146 *
jah128 12:878c6e9d9e60 147 * @param The amount of time in seconds to pause user code
jah128 12:878c6e9d9e60 148 */
jah128 12:878c6e9d9e60 149 void pause_user_code(float period);
jah128 12:878c6e9d9e60 150
jah128 12:878c6e9d9e60 151 /**
jah128 12:878c6e9d9e60 152 * Reset the wheel encoder counters
jah128 12:878c6e9d9e60 153 */
jah128 12:878c6e9d9e60 154 void reset_encoders(void);
jah128 12:878c6e9d9e60 155
jah128 12:878c6e9d9e60 156 /**
jah128 12:878c6e9d9e60 157 * Send a string (in printf format) to the preferred debug stream, specified in settings.h [of overridden programmatically]
jah128 12:878c6e9d9e60 158 *
jah128 12:878c6e9d9e60 159 * @param The string to send to output stream
jah128 12:878c6e9d9e60 160 */
jah128 12:878c6e9d9e60 161 void debug(const char* format, ...) ;
jah128 12:878c6e9d9e60 162 private:
jah128 12:878c6e9d9e60 163 void IF_end_pause_user_code(void);
jah128 12:878c6e9d9e60 164 void IF_handle_events(void);
jah128 12:878c6e9d9e60 165 void IF_update_encoders(void);
jah128 12:878c6e9d9e60 166 void IF_update_user_id(void);
jah128 12:878c6e9d9e60 167 void IF_update_switch(void);
jah128 12:878c6e9d9e60 168 void IF_update_minutes(void);
jah128 12:878c6e9d9e60 169 void IF_get_hardware_description(void);
jah128 12:878c6e9d9e60 170 };
jah128 0:d6269d17c8cf 171
jah128 17:bf614e28668f 172 extern "C" void mbed_reset(); // Allows use of (undocumented) mbed_reset() function
jah128 17:bf614e28668f 173
jah128 12:878c6e9d9e60 174 extern Psiswarm psi;
jah128 8:6c92789d5f87 175 extern Serial pc;
jah128 8:6c92789d5f87 176 extern Serial bt;
jah128 8:6c92789d5f87 177 extern Display display;
jah128 8:6c92789d5f87 178 extern Motors motors;
jah128 8:6c92789d5f87 179 extern Eprom eprom;
jah128 9:dde9e21030eb 180 extern Led led;
jah128 10:e58323951c08 181 extern Sensors sensors;
jah128 11:312663037b8c 182 extern SerialControl serial;
jah128 11:312663037b8c 183 extern Sound sound;
jah128 11:312663037b8c 184 extern Setup i2c_setup;
jah128 11:312663037b8c 185 extern Demo demo;
jah128 12:878c6e9d9e60 186 extern Animations animations;
jah128 12:878c6e9d9e60 187 extern Basic basic;
jah128 15:66be5ec52c3b 188 extern Colour colour;
jah128 0:d6269d17c8cf 189 extern char * program_name;
jah128 0:d6269d17c8cf 190 extern char * author_name;
jah128 0:d6269d17c8cf 191 extern char * version_name;
jah128 0:d6269d17c8cf 192
jah128 0:d6269d17c8cf 193 extern I2C primary_i2c;
jah128 0:d6269d17c8cf 194 extern InterruptIn gpio_interrupt;
jah128 0:d6269d17c8cf 195
jah128 0:d6269d17c8cf 196 extern AnalogIn vin_current;
jah128 0:d6269d17c8cf 197 extern AnalogIn vin_battery;
jah128 0:d6269d17c8cf 198 extern AnalogIn vin_dc;
jah128 0:d6269d17c8cf 199
jah128 0:d6269d17c8cf 200 extern DigitalOut mbed_led1;
jah128 0:d6269d17c8cf 201 extern DigitalOut mbed_led2;
jah128 0:d6269d17c8cf 202 extern DigitalOut mbed_led3;
jah128 0:d6269d17c8cf 203 extern DigitalOut mbed_led4;
jah128 0:d6269d17c8cf 204 extern PwmOut center_led_red;
jah128 0:d6269d17c8cf 205 extern PwmOut center_led_green;
jah128 0:d6269d17c8cf 206 extern PwmOut motor_left_f;
jah128 0:d6269d17c8cf 207 extern PwmOut motor_left_r;
jah128 0:d6269d17c8cf 208 extern PwmOut motor_right_f;
jah128 0:d6269d17c8cf 209 extern PwmOut motor_right_r;
jah128 0:d6269d17c8cf 210
jah128 0:d6269d17c8cf 211 extern char time_based_motor_action;
jah128 0:d6269d17c8cf 212
jah128 0:d6269d17c8cf 213 extern int base_colour_sensor_raw_values [];
jah128 0:d6269d17c8cf 214 extern int top_colour_sensor_raw_values [];
jah128 0:d6269d17c8cf 215
jah128 0:d6269d17c8cf 216 extern char waiting_for_ultrasonic;
jah128 0:d6269d17c8cf 217 extern int ultrasonic_distance;
jah128 0:d6269d17c8cf 218 extern char ultrasonic_distance_updated;
jah128 0:d6269d17c8cf 219 extern Timeout ultrasonic_timeout;
jah128 0:d6269d17c8cf 220 extern Ticker ultrasonic_ticker;
jah128 0:d6269d17c8cf 221
jah128 0:d6269d17c8cf 222 extern unsigned short background_ir_values [];
jah128 0:d6269d17c8cf 223 extern unsigned short illuminated_ir_values [];
jah128 0:d6269d17c8cf 224 extern float reflected_ir_distances [];
jah128 0:d6269d17c8cf 225 extern char ir_values_stored;
jah128 0:d6269d17c8cf 226
jah128 0:d6269d17c8cf 227 extern char firmware_bytes[];
jah128 0:d6269d17c8cf 228
jah128 0:d6269d17c8cf 229 extern char testing_voltage_regulators_flag;
jah128 0:d6269d17c8cf 230 extern char power_good_motor_left;
jah128 0:d6269d17c8cf 231 extern char power_good_motor_right;
jah128 0:d6269d17c8cf 232 extern char power_good_infrared;
jah128 0:d6269d17c8cf 233 extern char status_dc_in;
jah128 0:d6269d17c8cf 234 extern char status_charging;
jah128 0:d6269d17c8cf 235
jah128 0:d6269d17c8cf 236 extern unsigned short background_base_ir_values [];
jah128 0:d6269d17c8cf 237 extern unsigned short illuminated_base_ir_values [];
jah128 0:d6269d17c8cf 238 extern char base_ir_values_stored;
jah128 0:d6269d17c8cf 239 extern float line_position;
jah128 0:d6269d17c8cf 240 extern char line_found;
jah128 0:d6269d17c8cf 241
jah128 0:d6269d17c8cf 242 extern float motor_left_speed;
jah128 0:d6269d17c8cf 243 extern float motor_right_speed;
jah128 0:d6269d17c8cf 244 extern char motor_left_brake;
jah128 0:d6269d17c8cf 245 extern char motor_right_brake;
jah128 0:d6269d17c8cf 246
jah128 0:d6269d17c8cf 247 extern float center_led_brightness;
jah128 0:d6269d17c8cf 248 extern float backlight_brightness;
jah128 0:d6269d17c8cf 249
jah128 4:1c621cb8cf0d 250 extern char use_motor_calibration;
jah128 4:1c621cb8cf0d 251 extern char motor_calibration_set;
jah128 4:1c621cb8cf0d 252 extern float left_motor_calibration_value;
jah128 4:1c621cb8cf0d 253 extern float right_motor_calibration_value;
jah128 18:9204f74069b4 254 extern float left_motor_stall_offset;
jah128 18:9204f74069b4 255 extern float right_motor_stall_offset;
jah128 4:1c621cb8cf0d 256
jah128 17:bf614e28668f 257 extern char base_ir_calibration_set;
jah128 17:bf614e28668f 258 extern char base_colour_calibration_set;
jah128 17:bf614e28668f 259
jah128 0:d6269d17c8cf 260 extern float firmware_version;
jah128 1:060690a934a9 261 extern float pcb_version;
jah128 1:060690a934a9 262 extern float serial_number;
jah128 1:060690a934a9 263
jah128 1:060690a934a9 264 extern char has_compass;
jah128 1:060690a934a9 265 extern char has_side_ir;
jah128 1:060690a934a9 266 extern char has_base_ir;
jah128 1:060690a934a9 267 extern char has_base_colour_sensor;
jah128 1:060690a934a9 268 extern char has_top_colour_sensor;
jah128 1:060690a934a9 269 extern char has_wheel_encoders;
jah128 1:060690a934a9 270 extern char has_audio_pic;
jah128 1:060690a934a9 271 extern char has_ultrasonic_sensor;
jah128 1:060690a934a9 272 extern char has_temperature_sensor;
jah128 1:060690a934a9 273 extern char has_recharging_circuit;
jah128 1:060690a934a9 274 extern char has_433_radio;
jah128 0:d6269d17c8cf 275
jah128 0:d6269d17c8cf 276 extern int ir_pulse_delay;
jah128 0:d6269d17c8cf 277 extern int base_ir_pulse_delay;
jah128 0:d6269d17c8cf 278
jah128 0:d6269d17c8cf 279 extern char robot_id;
jah128 0:d6269d17c8cf 280 extern char previous_robot_id;
jah128 0:d6269d17c8cf 281
jah128 0:d6269d17c8cf 282 extern char wheel_encoder_byte;
jah128 0:d6269d17c8cf 283 extern char previous_wheel_encoder_byte;
jah128 0:d6269d17c8cf 284 extern signed int left_encoder;
jah128 0:d6269d17c8cf 285 extern signed int right_encoder;
jah128 0:d6269d17c8cf 286
jah128 0:d6269d17c8cf 287 extern char switch_byte;
jah128 0:d6269d17c8cf 288 extern char previous_switch_byte;
jah128 0:d6269d17c8cf 289
jah128 0:d6269d17c8cf 290 extern char user_code_running;
jah128 0:d6269d17c8cf 291 extern char user_code_restore_mode;
jah128 0:d6269d17c8cf 292 extern char demo_on;
jah128 0:d6269d17c8cf 293 extern char event;
jah128 0:d6269d17c8cf 294 extern char change_id_event;
jah128 0:d6269d17c8cf 295 extern char encoder_event;
jah128 0:d6269d17c8cf 296 extern char switch_event;
jah128 0:d6269d17c8cf 297 extern char system_warnings;
jah128 18:9204f74069b4 298 extern short boot_count;
jah128 0:d6269d17c8cf 299
jah128 0:d6269d17c8cf 300 extern char debug_mode;
jah128 0:d6269d17c8cf 301 extern char debug_output;
jah128 0:d6269d17c8cf 302
jah128 12:878c6e9d9e60 303 extern vector<string> basic_filenames;
jah128 0:d6269d17c8cf 304 extern char psi_basic_file_count;
jah128 0:d6269d17c8cf 305 extern char use_flash_basic;
jah128 0:d6269d17c8cf 306 extern char file_transfer_mode;
jah128 12:878c6e9d9e60 307
jah128 0:d6269d17c8cf 308 #endif