Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BeautifulMemeProject by
main.cpp@12:daa53285b6e4, 2015-10-27 (annotated)
- Committer:
- jah128
- Date:
- Tue Oct 27 13:03:10 2015 +0000
- Revision:
- 12:daa53285b6e4
- Parent:
- 11:7b3ee540ba56
- Child:
- 13:f5994956b1ba
Add attraction dance
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jah128 | 6:ff3c66f7372b | 1 | /*********************************************************************** |
jah128 | 0:8a5497a2e366 | 2 | ** ██████╗ ███████╗██╗███████╗██╗ ██╗ █████╗ ██████╗ ███╗ ███╗ ** |
jah128 | 0:8a5497a2e366 | 3 | ** ██╔══██╗██╔════╝██║██╔════╝██║ ██║██╔══██╗██╔══██╗████╗ ████║ ** |
jah128 | 0:8a5497a2e366 | 4 | ** ██████╔╝███████╗██║███████╗██║ █╗ ██║███████║██████╔╝██╔████╔██║ ** |
jah128 | 0:8a5497a2e366 | 5 | ** ██╔═══╝ ╚════██║██║╚════██║██║███╗██║██╔══██║██╔══██╗██║╚██╔╝██║ ** |
jah128 | 0:8a5497a2e366 | 6 | ** ██║ ███████║██║███████║╚███╔███╔╝██║ ██║██║ ██║██║ ╚═╝ ██║ ** |
jah128 | 0:8a5497a2e366 | 7 | ** ╚═╝ ╚══════╝╚═╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ** |
jah128 | 0:8a5497a2e366 | 8 | ************************************************************************ |
jah128 | 0:8a5497a2e366 | 9 | **(C) Dr James Hilder - York Robotics Laboratory - University of York ** |
jah128 | 0:8a5497a2e366 | 10 | ***********************************************************************/ |
jah128 | 0:8a5497a2e366 | 11 | |
jah128 | 6:ff3c66f7372b | 12 | /// PsiSwarm Beautiful Meme Project Source Code |
jah128 | 10:1b09d4bb847b | 13 | /// Version 0.2 |
jah128 | 6:ff3c66f7372b | 14 | /// James Hilder, Alan Millard, Homero Elizondo, Jon Timmis |
jah128 | 6:ff3c66f7372b | 15 | /// University of York |
jah128 | 0:8a5497a2e366 | 16 | |
jah128 | 10:1b09d4bb847b | 17 | /// Include main.h - this includes psiswarm.h all the other necessary core files |
jah128 | 10:1b09d4bb847b | 18 | #include "main.h" |
jah128 | 9:085e090e1ec1 | 19 | |
jah128 | 10:1b09d4bb847b | 20 | char * program_name = "B-Meme"; |
jah128 | 10:1b09d4bb847b | 21 | char * author_name = "YRL"; |
jah128 | 10:1b09d4bb847b | 22 | char * version_name = "0.2"; |
jah128 | 0:8a5497a2e366 | 23 | |
jah128 | 6:ff3c66f7372b | 24 | // IMPORTANT!!! |
jah128 | 6:ff3c66f7372b | 25 | // Do not call the IR functions at all as they will interfere with the correct operation of this program |
jah128 | 6:ff3c66f7372b | 26 | // Instead, use the values held in the variables below; they are updated every 500ms |
jah128 | 6:ff3c66f7372b | 27 | |
jah128 | 6:ff3c66f7372b | 28 | char beacon_found = 0; // This will be a 1 when a beacon was detected during the previous 500ms window |
jah128 | 6:ff3c66f7372b | 29 | int beacon_heading = 0; // This is the heading from the last time a beacon was detected |
jah128 | 6:ff3c66f7372b | 30 | char robots_found[8]; // These will be a 1 when the respective robot [excluding self] was detected during the previous 500ms window |
jah128 | 7:ef9ab01b9e26 | 31 | int robots_heading[8]; // These are the headings from the last time the respective robots were detected |
jah128 | 6:ff3c66f7372b | 32 | unsigned short robots_distance[8]; // This is the maximum sensor value from the last time the respective robot was detected |
jah128 | 6:ff3c66f7372b | 33 | unsigned short reflected_sensor_data[8]; // The reflected IR values when this robots emitters are on |
jah128 | 6:ff3c66f7372b | 34 | unsigned short background_sensor_data[8];// The raw IR values when no robot (or beacon) should have its IR on |
jah128 | 6:ff3c66f7372b | 35 | |
jah128 | 12:daa53285b6e4 | 36 | char default_normal_program = 6; // The program to run on turn on (after 'face beacon' program) |
jah128 | 10:1b09d4bb847b | 37 | char use_recharging_program = 1; // Set to 1 to force robot to run recharging program when battery voltage drops below a threshold |
jah128 | 6:ff3c66f7372b | 38 | char user_code_debug = 1; // Set to 1 to show terminal messages from "out" function [specific to this code] |
jah128 | 10:1b09d4bb847b | 39 | char display_debug_inf = 0; // Set to 1 to show debug info about beacon\robots on display [instead of running program info] |
jah128 | 10:1b09d4bb847b | 40 | char main_program_state; // Index of the currently running program |
jah128 | 10:1b09d4bb847b | 41 | char program_changed = 0; // Flag to update display when program is changed |
jah128 | 12:daa53285b6e4 | 42 | char program_run_init = 0; // Flag to tell program to run its initialisation on first loop, if neccessary |
jah128 | 10:1b09d4bb847b | 43 | char success_count = 0; // Flag to indicate the success of a program |
jah128 | 10:1b09d4bb847b | 44 | char step_cycle = 0; // Alternates between 0 and 1 in successive time-steps |
jah128 | 10:1b09d4bb847b | 45 | char target_reached = 0; // Flag to indicate if a program target has been reached |
jah128 | 10:1b09d4bb847b | 46 | char prog_name [17]; // Stores the name of the running program [line 0 on the display] |
jah128 | 10:1b09d4bb847b | 47 | char prog_info [17]; // Stores information about the current state of the program [line 1 on the display] |
jah128 | 10:1b09d4bb847b | 48 | char disable_ir_emitters = 0; // Used to disable IR emission during charging etc [use with caution!] |
jah128 | 10:1b09d4bb847b | 49 | char recharging_state = 0; // Stores the state of the recharging program (0 is not currently running) |
jah128 | 11:7b3ee540ba56 | 50 | |
jah128 | 11:7b3ee540ba56 | 51 | float battery_low_threshold = 3.63; // Threshold at which to interrupt program and start recharging routine: suggest 3.55 |
jah128 | 11:7b3ee540ba56 | 52 | float battery_high_threshold = 3.97; // Threshold at which to end battery recharging routine and resume normal program: suggest 4.0 |
jah128 | 11:7b3ee540ba56 | 53 | |
jah128 | 9:085e090e1ec1 | 54 | Ticker main_loop_ticker; |
jah128 | 9:085e090e1ec1 | 55 | |
jah128 | 10:1b09d4bb847b | 56 | ///This is the main loop for the Beautiful Meme code. The code block is run once every 250mS* [with 4Hz beacon] once all the IR samples have been collected. |
jah128 | 9:085e090e1ec1 | 57 | void main_loop() |
jah128 | 9:085e090e1ec1 | 58 | { |
jah128 | 10:1b09d4bb847b | 59 | if(use_recharging_program == 1)recharging_program(); |
jah128 | 9:085e090e1ec1 | 60 | update_display(); |
jah128 | 10:1b09d4bb847b | 61 | if(recharging_state == 0) { |
jah128 | 10:1b09d4bb847b | 62 | switch(main_program_state) { |
jah128 | 10:1b09d4bb847b | 63 | case 0: //Case 0 is the initial program: turn to face beacon |
jah128 | 10:1b09d4bb847b | 64 | if(step_cycle == 0) { |
jah128 | 10:1b09d4bb847b | 65 | char turn_status = turn_to_bearing(0); |
jah128 | 10:1b09d4bb847b | 66 | if(turn_status == 0) { |
jah128 | 10:1b09d4bb847b | 67 | success_count ++; |
jah128 | 10:1b09d4bb847b | 68 | if(success_count > 1) set_program(default_normal_program); |
jah128 | 10:1b09d4bb847b | 69 | } else success_count = 0; |
jah128 | 10:1b09d4bb847b | 70 | } |
jah128 | 10:1b09d4bb847b | 71 | break; |
jah128 | 10:1b09d4bb847b | 72 | case 1: |
jah128 | 10:1b09d4bb847b | 73 | target_reached = 0; |
jah128 | 10:1b09d4bb847b | 74 | head_to_bearing_program(0); |
jah128 | 10:1b09d4bb847b | 75 | if(target_reached == 1) set_program(2); |
jah128 | 10:1b09d4bb847b | 76 | break; |
jah128 | 10:1b09d4bb847b | 77 | case 2: |
jah128 | 10:1b09d4bb847b | 78 | target_reached = 0; |
jah128 | 10:1b09d4bb847b | 79 | head_to_bearing_program(180); |
jah128 | 10:1b09d4bb847b | 80 | if(target_reached == 1) set_program(1); |
jah128 | 10:1b09d4bb847b | 81 | break; |
jah128 | 10:1b09d4bb847b | 82 | case 3: |
jah128 | 10:1b09d4bb847b | 83 | curved_random_walk_with_interaction_program(); |
jah128 | 10:1b09d4bb847b | 84 | break; |
jah128 | 10:1b09d4bb847b | 85 | case 4: |
jah128 | 10:1b09d4bb847b | 86 | straight_random_walk_with_interaction_program(); |
jah128 | 10:1b09d4bb847b | 87 | break; |
jah128 | 10:1b09d4bb847b | 88 | case 5: |
jah128 | 10:1b09d4bb847b | 89 | find_space_program(); |
jah128 | 10:1b09d4bb847b | 90 | break; |
jah128 | 12:daa53285b6e4 | 91 | case 6: |
jah128 | 12:daa53285b6e4 | 92 | clustering_program(0); |
jah128 | 12:daa53285b6e4 | 93 | break; |
jah128 | 10:1b09d4bb847b | 94 | } |
jah128 | 9:085e090e1ec1 | 95 | } |
jah128 | 9:085e090e1ec1 | 96 | step_cycle=1-step_cycle; |
jah128 | 9:085e090e1ec1 | 97 | } |
jah128 | 9:085e090e1ec1 | 98 | |
jah128 | 1:f6356cf1cefc | 99 | ///Place user code here that should be run after initialisation but before the main loop |
jah128 | 6:ff3c66f7372b | 100 | void user_code_setup() |
jah128 | 12:daa53285b6e4 | 101 | { |
jah128 | 9:085e090e1ec1 | 102 | wait(0.8); |
jah128 | 9:085e090e1ec1 | 103 | display.clear_display(); |
jah128 | 9:085e090e1ec1 | 104 | display.set_position(0,0); |
jah128 | 9:085e090e1ec1 | 105 | display.write_string("BEAUTIFUL MEME"); |
jah128 | 9:085e090e1ec1 | 106 | display.set_position(1,0); |
jah128 | 9:085e090e1ec1 | 107 | display.write_string(" PROJECT"); |
jah128 | 9:085e090e1ec1 | 108 | wait(0.2); |
jah128 | 6:ff3c66f7372b | 109 | out("------------------------------------------------------\n"); |
jah128 | 6:ff3c66f7372b | 110 | out("Beautiful Meme Project Demo Code \n"); |
jah128 | 6:ff3c66f7372b | 111 | out("------------------------------------------------------\n"); |
jah128 | 6:ff3c66f7372b | 112 | locate_beacon(); |
jah128 | 6:ff3c66f7372b | 113 | while(beacon_found == 0) { |
jah128 | 9:085e090e1ec1 | 114 | wait(0.5); |
jah128 | 6:ff3c66f7372b | 115 | locate_beacon(); |
jah128 | 6:ff3c66f7372b | 116 | } |
jah128 | 6:ff3c66f7372b | 117 | start_infrared_timers(); |
jah128 | 9:085e090e1ec1 | 118 | main_loop_ticker.attach_us(&main_loop,BEACON_PERIOD * 10); |
jah128 | 10:1b09d4bb847b | 119 | set_program(0); |
jah128 | 9:085e090e1ec1 | 120 | set_leds(0x00,0x00); |
jah128 | 10:1b09d4bb847b | 121 | set_center_led(3,0.5); |
jah128 | 9:085e090e1ec1 | 122 | display.clear_display(); |
jah128 | 9:085e090e1ec1 | 123 | display.set_position(0,0); |
jah128 | 9:085e090e1ec1 | 124 | display.write_string("BEACON FOUND AT"); |
jah128 | 9:085e090e1ec1 | 125 | display.set_position(1,0); |
jah128 | 9:085e090e1ec1 | 126 | char degrees_string[16]; |
jah128 | 9:085e090e1ec1 | 127 | sprintf(degrees_string,"%d DEGREES",beacon_heading); |
jah128 | 9:085e090e1ec1 | 128 | display.write_string(degrees_string); |
jah128 | 0:8a5497a2e366 | 129 | } |
jah128 | 0:8a5497a2e366 | 130 | |
jah128 | 1:f6356cf1cefc | 131 | /// Code goes here to handle what should happen when the user switch is pressed |
jah128 | 0:8a5497a2e366 | 132 | void handle_switch_event(char switch_state) |
jah128 | 0:8a5497a2e366 | 133 | { |
jah128 | 6:ff3c66f7372b | 134 | /// Switch_state = 1 if up is pressed, 2 if down is pressed, 4 if left is pressed, 8 if right is pressed and 16 if the center button is pressed |
jah128 | 1:f6356cf1cefc | 135 | /// NB For maximum compatability it is recommended to minimise reliance on center button press |
jah128 | 6:ff3c66f7372b | 136 | |
jah128 | 6:ff3c66f7372b | 137 | //pc.printf("User switch code block: %d\n",switch_state); |
jah128 | 0:8a5497a2e366 | 138 | } |
jah128 | 0:8a5497a2e366 | 139 | |
jah128 | 1:f6356cf1cefc | 140 | /// The main routine: it is recommended to leave this function alone and add user code to the above functions |
jah128 | 6:ff3c66f7372b | 141 | int main() |
jah128 | 6:ff3c66f7372b | 142 | { |
jah128 | 1:f6356cf1cefc | 143 | ///init() in psiswarm.cpp sets up the robot |
jah128 | 0:8a5497a2e366 | 144 | init(); |
jah128 | 0:8a5497a2e366 | 145 | user_code_setup(); |
jah128 | 0:8a5497a2e366 | 146 | user_code_running = 1; |
jah128 | 0:8a5497a2e366 | 147 | while(1) { |
jah128 | 9:085e090e1ec1 | 148 | wait(1); |
jah128 | 6:ff3c66f7372b | 149 | } |
jah128 | 6:ff3c66f7372b | 150 | } |
jah128 | 6:ff3c66f7372b | 151 | |
jah128 | 10:1b09d4bb847b | 152 | char * get_program_name(int index) |
jah128 | 10:1b09d4bb847b | 153 | { |
jah128 | 10:1b09d4bb847b | 154 | char * ret_name = new char[17]; |
jah128 | 10:1b09d4bb847b | 155 | switch(index){ |
jah128 | 10:1b09d4bb847b | 156 | case 0: |
jah128 | 10:1b09d4bb847b | 157 | strcpy(ret_name,"FACE BEACON"); |
jah128 | 10:1b09d4bb847b | 158 | break; |
jah128 | 10:1b09d4bb847b | 159 | case 1: |
jah128 | 10:1b09d4bb847b | 160 | strcpy(ret_name,"HEAD TO BEACON"); |
jah128 | 10:1b09d4bb847b | 161 | break; |
jah128 | 10:1b09d4bb847b | 162 | case 2: |
jah128 | 10:1b09d4bb847b | 163 | strcpy(ret_name,"HEAD TO SOUTH"); |
jah128 | 10:1b09d4bb847b | 164 | break; |
jah128 | 10:1b09d4bb847b | 165 | case 3: |
jah128 | 10:1b09d4bb847b | 166 | strcpy(ret_name,"RANDOM WALK 1"); |
jah128 | 10:1b09d4bb847b | 167 | break; |
jah128 | 10:1b09d4bb847b | 168 | case 4: |
jah128 | 10:1b09d4bb847b | 169 | strcpy(ret_name,"RANDOM WALK 2"); |
jah128 | 10:1b09d4bb847b | 170 | break; |
jah128 | 10:1b09d4bb847b | 171 | case 5: |
jah128 | 10:1b09d4bb847b | 172 | strcpy(ret_name,"FIND SPACE"); |
jah128 | 10:1b09d4bb847b | 173 | break; |
jah128 | 12:daa53285b6e4 | 174 | case 6: |
jah128 | 12:daa53285b6e4 | 175 | strcpy(ret_name,"CLUSTERING"); |
jah128 | 12:daa53285b6e4 | 176 | break; |
jah128 | 10:1b09d4bb847b | 177 | } |
jah128 | 10:1b09d4bb847b | 178 | return ret_name; |
jah128 | 10:1b09d4bb847b | 179 | } |
jah128 | 10:1b09d4bb847b | 180 | |
jah128 | 10:1b09d4bb847b | 181 | void set_program(int index) |
jah128 | 10:1b09d4bb847b | 182 | { |
jah128 | 10:1b09d4bb847b | 183 | main_program_state = index; |
jah128 | 10:1b09d4bb847b | 184 | program_changed = 1; |
jah128 | 12:daa53285b6e4 | 185 | program_run_init = 1; |
jah128 | 10:1b09d4bb847b | 186 | strcpy(prog_info,""); |
jah128 | 10:1b09d4bb847b | 187 | strcpy(prog_name,get_program_name(index)); |
jah128 | 10:1b09d4bb847b | 188 | } |
jah128 | 10:1b09d4bb847b | 189 | |
jah128 | 10:1b09d4bb847b | 190 | void set_program_info(char * info) |
jah128 | 10:1b09d4bb847b | 191 | { |
jah128 | 10:1b09d4bb847b | 192 | strcpy(prog_info,info); |
jah128 | 10:1b09d4bb847b | 193 | program_changed = 1; |
jah128 | 10:1b09d4bb847b | 194 | } |
jah128 | 9:085e090e1ec1 | 195 | |
jah128 | 9:085e090e1ec1 | 196 | void update_display() |
jah128 | 9:085e090e1ec1 | 197 | { |
jah128 | 10:1b09d4bb847b | 198 | if(program_changed == 1) { |
jah128 | 10:1b09d4bb847b | 199 | program_changed = 0; |
jah128 | 9:085e090e1ec1 | 200 | display.clear_display(); |
jah128 | 10:1b09d4bb847b | 201 | |
jah128 | 10:1b09d4bb847b | 202 | if(display_debug_inf==1) display_debug_info(); |
jah128 | 10:1b09d4bb847b | 203 | else{ |
jah128 | 10:1b09d4bb847b | 204 | display.set_position(0,0); |
jah128 | 10:1b09d4bb847b | 205 | display.write_string(prog_name); |
jah128 | 9:085e090e1ec1 | 206 | } |
jah128 | 10:1b09d4bb847b | 207 | display.set_position(1,0); |
jah128 | 10:1b09d4bb847b | 208 | display.write_string(prog_info); |
jah128 | 9:085e090e1ec1 | 209 | } |
jah128 | 9:085e090e1ec1 | 210 | } |
jah128 | 9:085e090e1ec1 | 211 | |
jah128 | 9:085e090e1ec1 | 212 | void display_debug_info() |
jah128 | 9:085e090e1ec1 | 213 | { |
jah128 | 9:085e090e1ec1 | 214 | char disp_line[16] = "- - - - - - - -"; |
jah128 | 9:085e090e1ec1 | 215 | if(beacon_found==1)disp_line[0]='B'; |
jah128 | 10:1b09d4bb847b | 216 | for(int i=1; i<8; i++) { |
jah128 | 10:1b09d4bb847b | 217 | if(robots_found[i])disp_line[((i)*2)]=48+i; |
jah128 | 9:085e090e1ec1 | 218 | } |
jah128 | 10:1b09d4bb847b | 219 | display.set_position(0,0); |
jah128 | 9:085e090e1ec1 | 220 | display.write_string(disp_line); |
jah128 | 9:085e090e1ec1 | 221 | } |
jah128 | 9:085e090e1ec1 | 222 | |
jah128 | 6:ff3c66f7372b | 223 | /// Verbose output |
jah128 | 6:ff3c66f7372b | 224 | void out(const char* format, ...) |
jah128 | 6:ff3c66f7372b | 225 | { |
jah128 | 6:ff3c66f7372b | 226 | char buffer[256]; |
jah128 | 6:ff3c66f7372b | 227 | if (debug_mode) { |
jah128 | 6:ff3c66f7372b | 228 | va_list vl; |
jah128 | 6:ff3c66f7372b | 229 | va_start(vl, format); |
jah128 | 6:ff3c66f7372b | 230 | vsprintf(buffer,format,vl); |
jah128 | 6:ff3c66f7372b | 231 | if(user_code_debug == 1) pc.printf("%s", buffer); |
jah128 | 6:ff3c66f7372b | 232 | va_end(vl); |
jah128 | 0:8a5497a2e366 | 233 | } |
jah128 | 0:8a5497a2e366 | 234 | } |