To Record the time of the car

Dependencies:   mbed TextLCD

Committer:
Dennis40816
Date:
Wed Aug 12 01:27:38 2020 +0000
Revision:
5:a897228b7306
Parent:
4:1300ca51fc75
Child:
6:f5a4aa4a3fe4
v1.1; ADD define of role , mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Dennis40816 0:9c3829968b11 1 //Include
Dennis40816 0:9c3829968b11 2 #include "mbed.h"
Dennis40816 0:9c3829968b11 3 #include "TextLCD.h"
Dennis40816 0:9c3829968b11 4 //Define-USER SET
Dennis40816 2:c9889e740474 5 #define DEBUG 2 // 0: formal , 1: all information, 2: only delay time
Dennis40816 2:c9889e740474 6 #define NO_DELAY 0 //if define RESULT == 1, ignore delay time of RF , if DEBUG == 2, this must be 0
Dennis40816 0:9c3829968b11 7 #define RX_MODE 1 //1 for scanf ; 2 for getc
Dennis40816 0:9c3829968b11 8 #define BUTTON_DEBOUNCE 0.3f
Dennis40816 1:db7799912cac 9 #define LCD_SHOW_PERIOD 3.0f //show last cycle for 2 sec
Dennis40816 2:c9889e740474 10 #define SENSOR_IN_DEBOUNCE 0.2f
Dennis40816 4:1300ca51fc75 11 #define NVIC_RESET_PROTECT 3.0f //all sys reset by pull blue button(button 2) for more than 4 seconds
Dennis40816 0:9c3829968b11 12 //Define-Don't Change
Dennis40816 2:c9889e740474 13 #if(DEBUG == 2 && NO_DELAY == 1)
Dennis40816 2:c9889e740474 14 #define NO_DELAY 0
Dennis40816 2:c9889e740474 15 #endif
Dennis40816 0:9c3829968b11 16 #define m_1 1000000.0f
Dennis40816 0:9c3829968b11 17 #define TX_SIZE 16
Dennis40816 0:9c3829968b11 18 #define RX_SIZE 16
Dennis40816 3:70ce5fd299bb 19 #if (DEBUG != 1)
Dennis40816 0:9c3829968b11 20 #define CYCLE_TIME_PROTECT 2.0f //used in formal , protect someone trigger the sensor
Dennis40816 0:9c3829968b11 21 #else
Dennis40816 1:db7799912cac 22 #define CYCLE_TIME_PROTECT 1.0f
Dennis40816 0:9c3829968b11 23 #endif
Dennis40816 4:1300ca51fc75 24 #define ENDURANCE_CYCLE 11
Dennis40816 0:9c3829968b11 25 #define SKIDPAD_CYCLE 4
Dennis40816 0:9c3829968b11 26
Dennis40816 0:9c3829968b11 27 //RF CMD
Dennis40816 0:9c3829968b11 28 #define ACCEPT 0
Dennis40816 0:9c3829968b11 29 #define DENY 1
Dennis40816 0:9c3829968b11 30 #define CHECK 2
Dennis40816 0:9c3829968b11 31 #define MASTER 3
Dennis40816 0:9c3829968b11 32 #define SLAVE 4
Dennis40816 0:9c3829968b11 33 #define RESULT 5
Dennis40816 0:9c3829968b11 34 #define DELAY 6
Dennis40816 0:9c3829968b11 35 #define RESET 7 //cycle reset
Dennis40816 0:9c3829968b11 36 #define RESTART 8 //mode all reset
Dennis40816 5:a897228b7306 37 //mode
Dennis40816 5:a897228b7306 38 #define SING 0
Dennis40816 5:a897228b7306 39 #define ACC 1
Dennis40816 5:a897228b7306 40 #define SKID 2
Dennis40816 5:a897228b7306 41 #define ENDU 3
Dennis40816 5:a897228b7306 42 //role
Dennis40816 5:a897228b7306 43 #define NONE 0
Dennis40816 5:a897228b7306 44 #define ROLE_MASTER 1
Dennis40816 5:a897228b7306 45 #define ROLE_SLAVE 2
Dennis40816 0:9c3829968b11 46
Dennis40816 0:9c3829968b11 47 /*
Dennis40816 0:9c3829968b11 48 ###############################
Dennis40816 0:9c3829968b11 49 # Pin Init #
Dennis40816 0:9c3829968b11 50 # functions #
Dennis40816 0:9c3829968b11 51 ###############################
Dennis40816 0:9c3829968b11 52 */
Dennis40816 0:9c3829968b11 53 //simulate the sensor
Dennis40816 0:9c3829968b11 54 // Serial Tutorial : http://www.stmcu.org.cn/module/forum/thread-608234-1-1.html
Dennis40816 0:9c3829968b11 55 //PC
Dennis40816 0:9c3829968b11 56 Serial pc(USBTX,USBRX,115200);
Dennis40816 0:9c3829968b11 57 //Wireless
Dennis40816 0:9c3829968b11 58 Serial RF(PC_10,PC_11,9600); //Default , product url: http://www.wenshing.com.tw/upload/file/1537953630.pdf
Dennis40816 0:9c3829968b11 59 //LCD
Dennis40816 0:9c3829968b11 60 I2C i2c_lcd(PB_9,PB_8); // SDA,SCL
Dennis40816 0:9c3829968b11 61 TextLCD_I2C lcd(&i2c_lcd, 0x40, TextLCD::LCD16x2); //0x40 for all short(blue lcd) , 0x4E for A1 to A3 open(green lcd) - I2C Address
Dennis40816 0:9c3829968b11 62 //Sensor
Dennis40816 4:1300ca51fc75 63 #if(DEBUG == 1)
Dennis40816 0:9c3829968b11 64 DigitalOut sensor_com(PA_8,1); // D7
Dennis40816 1:db7799912cac 65 InterruptIn SENSOR_IT(PB_4,PullDown); // D5
Dennis40816 4:1300ca51fc75 66 #else
Dennis40816 4:1300ca51fc75 67 DigitalOut sensor_com(PB_2,1);
Dennis40816 4:1300ca51fc75 68 InterruptIn SENSOR_IT(PB_1,PullDown);
Dennis40816 4:1300ca51fc75 69 #endif
Dennis40816 0:9c3829968b11 70 //BT
Dennis40816 0:9c3829968b11 71 Serial bt (PA_0,PA_1,115200); // Serial_4 tx,rx
Dennis40816 0:9c3829968b11 72 DigitalOut key(PC_1,0); // not AT Mode
Dennis40816 0:9c3829968b11 73 DigitalIn bt_state(PA_4,PullDown); // high when connected with terminal
Dennis40816 0:9c3829968b11 74 //Mode Button
Dennis40816 1:db7799912cac 75 DigitalOut button_high(PA_11,1); // 最右7
Dennis40816 1:db7799912cac 76 InterruptIn MY_BUTTON(PB_12,PullDown); // 最右8
Dennis40816 0:9c3829968b11 77 //Reset Button
Dennis40816 1:db7799912cac 78 DigitalOut button_high_2(PA_6,1); // Mode的左邊
Dennis40816 0:9c3829968b11 79 InterruptIn MY_BUTTON_2(PA_7,PullDown);
Dennis40816 0:9c3829968b11 80 /*
Dennis40816 0:9c3829968b11 81 ###############################
Dennis40816 0:9c3829968b11 82 # Global #
Dennis40816 0:9c3829968b11 83 # Variable #
Dennis40816 0:9c3829968b11 84 ###############################
Dennis40816 0:9c3829968b11 85 */
Dennis40816 0:9c3829968b11 86 // main process
Dennis40816 0:9c3829968b11 87 // /**/ -> need reset
Dennis40816 5:a897228b7306 88 volatile int mode = SING; //mode 0:Single 1:ACC 2:SkidPad 3:Endurance
Dennis40816 0:9c3829968b11 89 /**/ volatile int process = 0; //process 0:for ready ; 1:sensor in/confirm master or slave ; 2:calculation : 3:bt show 4 lcd show
Dennis40816 0:9c3829968b11 90 // time record
Dennis40816 0:9c3829968b11 91 /**/ Timer this_cycle_timer; //keep running timer
Dennis40816 2:c9889e740474 92 float sensor_in_debounce = 0.0;
Dennis40816 0:9c3829968b11 93 /**/ float total_time = 0.0;
Dennis40816 0:9c3829968b11 94 /**/ float last_cycle_time = 0.0; //for LC print
Dennis40816 0:9c3829968b11 95 /**/ float best_cycle_time = 0.0;
Dennis40816 0:9c3829968b11 96 // cycle
Dennis40816 0:9c3829968b11 97 /**/ int cycle = 1;
Dennis40816 0:9c3829968b11 98 /**/ int best_cycle = 1;
Dennis40816 0:9c3829968b11 99 // button debounce
Dennis40816 0:9c3829968b11 100 float button_RTC = 0.0;
Dennis40816 0:9c3829968b11 101 float button_LTC = 0.0;
Dennis40816 0:9c3829968b11 102 float button_RTC_2 = 0.0;
Dennis40816 0:9c3829968b11 103 float button_LTC_2 = 0.0;
Dennis40816 0:9c3829968b11 104 // RF related
Dennis40816 0:9c3829968b11 105 bool rf_state = 0; //0 for disconnect
Dennis40816 0:9c3829968b11 106 bool last_rf_state = 1;
Dennis40816 0:9c3829968b11 107 bool Rx_flag = 0; //1 when receive a cmd over
Dennis40816 5:a897228b7306 108 /**/ int role = NONE;
Dennis40816 0:9c3829968b11 109 /**/ int this_tcmd = 0;
Dennis40816 0:9c3829968b11 110 /**/ int last_tcmd = 0;
Dennis40816 0:9c3829968b11 111 /**/ int this_rcmd = 0;
Dennis40816 0:9c3829968b11 112 int rf_interval_cnt = 0;
Dennis40816 0:9c3829968b11 113 /**/ float rf_delay_time = 0.0;
Dennis40816 0:9c3829968b11 114 /**/ Timer rf_check_timer;
Dennis40816 0:9c3829968b11 115 // RF Data
Dennis40816 0:9c3829968b11 116 /**/ char TX_buffer[TX_SIZE];
Dennis40816 0:9c3829968b11 117 /**/ char RX_buffer[RX_SIZE];
Dennis40816 0:9c3829968b11 118 /**/ int tx_cnt = 0;
Dennis40816 0:9c3829968b11 119 /**/ int rx_cnt = 0;
Dennis40816 0:9c3829968b11 120 // LCD
Dennis40816 0:9c3829968b11 121 /**/ bool lcd_print_flag = 0;
Dennis40816 0:9c3829968b11 122 bool lcd_end_flag = 0;
Dennis40816 0:9c3829968b11 123 float lcd_life_check_time = 0.0;
Dennis40816 0:9c3829968b11 124 float lcd_show_result_time = 0.0;
Dennis40816 0:9c3829968b11 125 float lcd_end_time = 0.0;
Dennis40816 0:9c3829968b11 126 // BT
Dennis40816 0:9c3829968b11 127 /**/ bool bt_print_flag = 0;
Dennis40816 0:9c3829968b11 128 bool bt_end_flag = 0;
Dennis40816 0:9c3829968b11 129 /*
Dennis40816 0:9c3829968b11 130 ###############################
Dennis40816 0:9c3829968b11 131 # Declaration #
Dennis40816 0:9c3829968b11 132 ###############################
Dennis40816 0:9c3829968b11 133 */
Dennis40816 0:9c3829968b11 134 // Initial
Dennis40816 0:9c3829968b11 135 void Initial_All(void);
Dennis40816 0:9c3829968b11 136 void Initial_Hardware(void);
Dennis40816 0:9c3829968b11 137 void Initial_IT(void);
Dennis40816 0:9c3829968b11 138 //main function
Dennis40816 3:70ce5fd299bb 139 void ALL_SYS_RESET_CHECK(void);
Dennis40816 0:9c3829968b11 140 void reset_parameters(void);
Dennis40816 0:9c3829968b11 141 void show_all(void);
Dennis40816 0:9c3829968b11 142 void lcd_show(void);
Dennis40816 0:9c3829968b11 143 void bt_show(void);
Dennis40816 0:9c3829968b11 144 void show_flag_check(void);
Dennis40816 0:9c3829968b11 145 void time_cal(void);
Dennis40816 0:9c3829968b11 146 void RF_Send(int);
Dennis40816 0:9c3829968b11 147 void RF_Receive(int);
Dennis40816 3:70ce5fd299bb 148 void RF_Check(void);
Dennis40816 0:9c3829968b11 149 // IT Functions
Dennis40816 0:9c3829968b11 150 void sensor_in(void);
Dennis40816 0:9c3829968b11 151 void button_fall(void);
Dennis40816 0:9c3829968b11 152 void button_fall_2(void);
Dennis40816 1:db7799912cac 153 void test_button(void);
Dennis40816 0:9c3829968b11 154 void RxCallback(void);
Dennis40816 0:9c3829968b11 155 //protect parameters
Dennis40816 0:9c3829968b11 156 void parameters_protect(void);
Dennis40816 0:9c3829968b11 157 /*
Dennis40816 0:9c3829968b11 158 ###############################
Dennis40816 0:9c3829968b11 159 # Main #
Dennis40816 0:9c3829968b11 160 # function #
Dennis40816 0:9c3829968b11 161 ###############################
Dennis40816 0:9c3829968b11 162 */
Dennis40816 0:9c3829968b11 163 int main()
Dennis40816 0:9c3829968b11 164 {
Dennis40816 0:9c3829968b11 165 Initial_All();
Dennis40816 0:9c3829968b11 166 while(1) {
Dennis40816 3:70ce5fd299bb 167 ALL_SYS_RESET_CHECK();
Dennis40816 3:70ce5fd299bb 168 RF_Check();
Dennis40816 0:9c3829968b11 169 time_cal();
Dennis40816 0:9c3829968b11 170 show_all();
Dennis40816 0:9c3829968b11 171 }
Dennis40816 0:9c3829968b11 172 }
Dennis40816 0:9c3829968b11 173 /*
Dennis40816 0:9c3829968b11 174 ###############################
Dennis40816 0:9c3829968b11 175 # Functions #
Dennis40816 0:9c3829968b11 176 # Implementation #
Dennis40816 0:9c3829968b11 177 ###############################
Dennis40816 0:9c3829968b11 178 */
Dennis40816 0:9c3829968b11 179 //Initial
Dennis40816 0:9c3829968b11 180 void Initial_All(){
Dennis40816 0:9c3829968b11 181 Initial_Hardware();
Dennis40816 0:9c3829968b11 182 Initial_IT();
Dennis40816 0:9c3829968b11 183 }
Dennis40816 0:9c3829968b11 184 void Initial_Hardware(){
Dennis40816 0:9c3829968b11 185 //lcd
Dennis40816 0:9c3829968b11 186 lcd.setCursor(TextLCD::CurOff_BlkOff);
Dennis40816 0:9c3829968b11 187 lcd.setBacklight(TextLCD::LightOn);
Dennis40816 0:9c3829968b11 188 lcd.locate(0,0);
Dennis40816 0:9c3829968b11 189 lcd.printf("NTHU RACING");
Dennis40816 0:9c3829968b11 190 lcd.locate(0,1);
Dennis40816 0:9c3829968b11 191 lcd.printf("Initializing");
Dennis40816 0:9c3829968b11 192 //bt
Dennis40816 1:db7799912cac 193 if(bt_state.read()) {
Dennis40816 1:db7799912cac 194 bt.printf("######################################\r\n");
Dennis40816 1:db7799912cac 195 bt.printf("NTHU RACING TIME RECORDER INITIALIZING\r\n\r\n");
Dennis40816 1:db7799912cac 196 }
Dennis40816 0:9c3829968b11 197 else{
Dennis40816 0:9c3829968b11 198 lcd.locate(12,0);
Dennis40816 1:db7799912cac 199 lcd.printf("b0");
Dennis40816 1:db7799912cac 200 pc.printf("######################################\r\n");
Dennis40816 0:9c3829968b11 201 pc.printf("NTHU RACING TIME RECORDER INITIALIZING\r\n\r\n");
Dennis40816 0:9c3829968b11 202 }
Dennis40816 0:9c3829968b11 203 wait(1.5);
Dennis40816 0:9c3829968b11 204 }
Dennis40816 0:9c3829968b11 205 void Initial_IT(){
Dennis40816 0:9c3829968b11 206 //BUTTON
Dennis40816 0:9c3829968b11 207 MY_BUTTON.rise(&button_fall);
Dennis40816 0:9c3829968b11 208 MY_BUTTON_2.rise(&button_fall_2);
Dennis40816 0:9c3829968b11 209 //SENSOR
Dennis40816 0:9c3829968b11 210 SENSOR_IT.rise(&sensor_in);
Dennis40816 0:9c3829968b11 211 //RF
Dennis40816 0:9c3829968b11 212 RF.attach(&RxCallback,Serial::RxIrq);
Dennis40816 0:9c3829968b11 213 lcd.cls();
Dennis40816 0:9c3829968b11 214 lcd.locate(0,0);
Dennis40816 0:9c3829968b11 215 lcd.printf("Set up ok!");
Dennis40816 0:9c3829968b11 216 if(bt_state.read()){
Dennis40816 4:1300ca51fc75 217 bt.printf("Mode 0 -> Single Cycle\r\n");
Dennis40816 4:1300ca51fc75 218 bt.printf("Mode 1 -> Accleration \r\n");
Dennis40816 4:1300ca51fc75 219 bt.printf("Mode 2 -> Skidpad \r\n");
Dennis40816 4:1300ca51fc75 220 bt.printf("Mode 3 -> Endurance:%d\r\n\r\n",ENDURANCE_CYCLE);
Dennis40816 1:db7799912cac 221 bt.printf("NTHU RACING TIME RECORDER SET UP DONE\r\n");
Dennis40816 0:9c3829968b11 222 bt.printf("#####################################\r\n");
Dennis40816 0:9c3829968b11 223 }
Dennis40816 0:9c3829968b11 224 else{
Dennis40816 4:1300ca51fc75 225 pc.printf("Mode 0 -> Single Cycle\r\n");
Dennis40816 4:1300ca51fc75 226 pc.printf("Mode 1 -> Accleration \r\n");
Dennis40816 4:1300ca51fc75 227 pc.printf("Mode 2 -> Skidpad \r\n");
Dennis40816 4:1300ca51fc75 228 pc.printf("Mode 3 -> Endurance:%d\r\n",ENDURANCE_CYCLE);
Dennis40816 1:db7799912cac 229 pc.printf("NTHU RACING TIME RECORDER SET UP DONE\r\n");
Dennis40816 0:9c3829968b11 230 pc.printf("#####################################\r\n");
Dennis40816 0:9c3829968b11 231 }
Dennis40816 0:9c3829968b11 232 wait(1);
Dennis40816 0:9c3829968b11 233 }
Dennis40816 0:9c3829968b11 234 //while loop
Dennis40816 3:70ce5fd299bb 235 void ALL_SYS_RESET_CHECK(){
Dennis40816 3:70ce5fd299bb 236 if(MY_BUTTON_2.read()){
Dennis40816 3:70ce5fd299bb 237 if(us_ticker_read()/m_1 - button_RTC_2 > NVIC_RESET_PROTECT) NVIC_SystemReset();
Dennis40816 3:70ce5fd299bb 238 }
Dennis40816 3:70ce5fd299bb 239 }
Dennis40816 3:70ce5fd299bb 240 void RF_Check(){
Dennis40816 5:a897228b7306 241 if(role == NONE && mode == ACC) {
Dennis40816 3:70ce5fd299bb 242 rf_check_timer.start();
Dennis40816 3:70ce5fd299bb 243 if(rf_check_timer.read() > 1){
Dennis40816 3:70ce5fd299bb 244 rf_interval_cnt++;
Dennis40816 3:70ce5fd299bb 245 rf_check_timer.reset();
Dennis40816 3:70ce5fd299bb 246 }
Dennis40816 3:70ce5fd299bb 247 if(rf_interval_cnt % 5 == 0 && rf_interval_cnt) {
Dennis40816 3:70ce5fd299bb 248 RF_Send(CHECK);
Dennis40816 3:70ce5fd299bb 249 }
Dennis40816 3:70ce5fd299bb 250 if(rf_interval_cnt > 5) rf_state = 0;
Dennis40816 5:a897228b7306 251 if(rf_interval_cnt >= INT_MAX) rf_interval_cnt = 0;
Dennis40816 3:70ce5fd299bb 252 }
Dennis40816 3:70ce5fd299bb 253 else rf_check_timer.stop();
Dennis40816 3:70ce5fd299bb 254 }
Dennis40816 0:9c3829968b11 255 void reset_parameters() {
Dennis40816 0:9c3829968b11 256 process = 0;
Dennis40816 0:9c3829968b11 257 lcd_print_flag = 0;
Dennis40816 0:9c3829968b11 258 bt_print_flag = 0;
Dennis40816 0:9c3829968b11 259 this_cycle_timer.stop();
Dennis40816 0:9c3829968b11 260 this_cycle_timer.reset();
Dennis40816 2:c9889e740474 261 lcd_end_flag = 0;
Dennis40816 2:c9889e740474 262 bt_end_flag = 0;
Dennis40816 5:a897228b7306 263 if( mode != ACC || (mode == ACC && this_rcmd == RESTART) || (mode == ACC && last_tcmd == RESTART) ){
Dennis40816 1:db7799912cac 264 cycle = 1;
Dennis40816 1:db7799912cac 265 best_cycle = 1;
Dennis40816 1:db7799912cac 266 last_cycle_time = 0.0;
Dennis40816 1:db7799912cac 267 best_cycle_time = 0.0;
Dennis40816 1:db7799912cac 268 total_time = 0.0;
Dennis40816 2:c9889e740474 269
Dennis40816 1:db7799912cac 270 }
Dennis40816 5:a897228b7306 271 if(mode == ACC){
Dennis40816 0:9c3829968b11 272 memset(TX_buffer,0,TX_SIZE);
Dennis40816 0:9c3829968b11 273 memset(RX_buffer,0,RX_SIZE);
Dennis40816 0:9c3829968b11 274
Dennis40816 0:9c3829968b11 275 tx_cnt = 0;
Dennis40816 0:9c3829968b11 276 rx_cnt = 0;
Dennis40816 0:9c3829968b11 277 rf_delay_time = 0.0;
Dennis40816 5:a897228b7306 278 role = NONE;
Dennis40816 0:9c3829968b11 279 this_tcmd = 0;
Dennis40816 0:9c3829968b11 280 last_tcmd = 0;
Dennis40816 0:9c3829968b11 281 this_rcmd = 0;
Dennis40816 0:9c3829968b11 282 }
Dennis40816 1:db7799912cac 283 if(bt_state.read() ) bt.printf("#####################################\r\n");
Dennis40816 1:db7799912cac 284 else pc.printf("#####################################\r\n");
Dennis40816 0:9c3829968b11 285 }
Dennis40816 0:9c3829968b11 286 void show_all(){
Dennis40816 0:9c3829968b11 287 parameters_protect();
Dennis40816 0:9c3829968b11 288 lcd_show();
Dennis40816 0:9c3829968b11 289 bt_show();
Dennis40816 0:9c3829968b11 290 show_flag_check();
Dennis40816 0:9c3829968b11 291 }
Dennis40816 0:9c3829968b11 292 void parameters_protect(){
Dennis40816 0:9c3829968b11 293 if(cycle >= 99){
Dennis40816 0:9c3829968b11 294 cycle = 0;
Dennis40816 0:9c3829968b11 295 if(bt_state.read()) bt.printf("Cycle Protect \r\n");
Dennis40816 0:9c3829968b11 296 else pc.printf("Cycle Protect \r\n");
Dennis40816 0:9c3829968b11 297 }
Dennis40816 0:9c3829968b11 298 if(last_cycle_time >= 9999.99f ){
Dennis40816 0:9c3829968b11 299 last_cycle_time = 0.0;
Dennis40816 0:9c3829968b11 300 if(bt_state.read()) bt.printf("Last Cycle Time Protect \r\n");
Dennis40816 0:9c3829968b11 301 else pc.printf("Last Cycle Time Protect \r\n");
Dennis40816 0:9c3829968b11 302 }
Dennis40816 0:9c3829968b11 303 if(total_time >= 9999.99f){
Dennis40816 0:9c3829968b11 304 total_time = 0.0;
Dennis40816 0:9c3829968b11 305 if(bt_state.read()) bt.printf("Total Time Protect \r\n");
Dennis40816 0:9c3829968b11 306 else pc.printf("Total Time Protect \r\n");
Dennis40816 0:9c3829968b11 307 }
Dennis40816 0:9c3829968b11 308 }
Dennis40816 0:9c3829968b11 309 void lcd_show(){
Dennis40816 0:9c3829968b11 310 //process 4 update
Dennis40816 0:9c3829968b11 311 lcd.locate(0,0);
Dennis40816 2:c9889e740474 312 if( (!lcd_print_flag) && last_cycle_time > 0.0f && process == 4){
Dennis40816 0:9c3829968b11 313 //print out last cycle time flag
Dennis40816 0:9c3829968b11 314 lcd_print_flag = 1;
Dennis40816 0:9c3829968b11 315 lcd_show_result_time = us_ticker_read()/m_1;
Dennis40816 0:9c3829968b11 316 }
Dennis40816 5:a897228b7306 317 else if((!lcd_end_flag) && ( (cycle > SKIDPAD_CYCLE && mode == SKID || cycle > ENDURANCE_CYCLE && mode == ENDU) ||
Dennis40816 2:c9889e740474 318 #if(NO_DELAY == 1)
Dennis40816 5:a897228b7306 319 (last_tcmd == RESULT || this_rcmd == RESULT && mode == ACC) )
Dennis40816 2:c9889e740474 320 #else
Dennis40816 5:a897228b7306 321 (last_tcmd == DELAY || this_rcmd == DELAY && mode == ACC) )
Dennis40816 2:c9889e740474 322 #endif
Dennis40816 2:c9889e740474 323 ){
Dennis40816 0:9c3829968b11 324 //mode end
Dennis40816 1:db7799912cac 325 if(us_ticker_read()/m_1 - lcd_show_result_time > LCD_SHOW_PERIOD){
Dennis40816 1:db7799912cac 326 lcd_end_flag = 1;
Dennis40816 1:db7799912cac 327 lcd_end_time = us_ticker_read()/m_1;
Dennis40816 1:db7799912cac 328 }
Dennis40816 0:9c3829968b11 329 }
Dennis40816 0:9c3829968b11 330
Dennis40816 0:9c3829968b11 331 //row 1 show
Dennis40816 5:a897228b7306 332 if(us_ticker_read()/m_1 - lcd_show_result_time < LCD_SHOW_PERIOD && last_cycle_time != 0 && mode != ACC)
Dennis40816 0:9c3829968b11 333 lcd.printf("LCT : %.2f sec ",last_cycle_time);
Dennis40816 5:a897228b7306 334 else if(us_ticker_read()/m_1 - lcd_end_time < LCD_SHOW_PERIOD && last_cycle_time != 0 && mode != ACC)
Dennis40816 1:db7799912cac 335 lcd.printf("BC :%d ",best_cycle);
Dennis40816 0:9c3829968b11 336 else{
Dennis40816 0:9c3829968b11 337 switch(mode){
Dennis40816 5:a897228b7306 338 case SING :
Dennis40816 1:db7799912cac 339 lcd.printf("SING b%dn%d C%d ",bt_state.read(),rf_state,cycle);
Dennis40816 0:9c3829968b11 340 break;
Dennis40816 5:a897228b7306 341 case ACC:
Dennis40816 1:db7799912cac 342 lcd.printf("ACC b%dn%d C%d ",bt_state.read(),rf_state,cycle);
Dennis40816 0:9c3829968b11 343 break;
Dennis40816 5:a897228b7306 344 case SKID:
Dennis40816 1:db7799912cac 345 lcd.printf("SKID b%dn%d C%d ",bt_state.read(),rf_state,cycle);
Dennis40816 0:9c3829968b11 346 break;
Dennis40816 5:a897228b7306 347 case ENDU:
Dennis40816 1:db7799912cac 348 lcd.printf("ENDU b%dn%d C%d ",bt_state.read(),rf_state,cycle);
Dennis40816 0:9c3829968b11 349 break;
Dennis40816 0:9c3829968b11 350 }
Dennis40816 0:9c3829968b11 351 }
Dennis40816 0:9c3829968b11 352 lcd.locate(0,1);
Dennis40816 0:9c3829968b11 353 //row 2 show
Dennis40816 2:c9889e740474 354 if(cycle == 1 && this_cycle_timer.read() == 0) lcd.printf("Ready to Go !"); //first in
Dennis40816 5:a897228b7306 355 else if(mode == ACC && lcd_print_flag)lcd.printf ("TC:%.2f sec ",last_cycle_time);
Dennis40816 5:a897228b7306 356 else if(mode == ACC) lcd.printf("TC:%.2f sec ",this_cycle_timer.read());
Dennis40816 2:c9889e740474 357 else if(lcd_end_flag && mode!=1) lcd.printf("BCT :%.2f sec",best_cycle_time);
Dennis40816 5:a897228b7306 358 else if((cycle > SKIDPAD_CYCLE && mode == SKID || cycle > ENDURANCE_CYCLE && mode == ENDU)) lcd.printf("Mode %d End! ",mode);
Dennis40816 0:9c3829968b11 359 else lcd.printf("%.2f,%.2f ",this_cycle_timer.read(),this_cycle_timer.read()+total_time);
Dennis40816 0:9c3829968b11 360 //lcd life check
Dennis40816 0:9c3829968b11 361 lcd.locate(15,1);
Dennis40816 0:9c3829968b11 362 if(us_ticker_read()/m_1 - lcd_life_check_time < 1.0f) lcd.printf(".");
Dennis40816 0:9c3829968b11 363 else if(us_ticker_read()/m_1 - lcd_life_check_time < 2.0f) lcd.printf(" ");
Dennis40816 0:9c3829968b11 364 else lcd_life_check_time = us_ticker_read()/m_1;
Dennis40816 0:9c3829968b11 365 }
Dennis40816 0:9c3829968b11 366 void bt_show(){
Dennis40816 0:9c3829968b11 367 //process 3 update and print
Dennis40816 0:9c3829968b11 368 if(bt_state.read() && process == 3){
Dennis40816 0:9c3829968b11 369 //process change
Dennis40816 0:9c3829968b11 370 process = 4;
Dennis40816 1:db7799912cac 371 bt_print_flag = 1;
Dennis40816 0:9c3829968b11 372 if (last_cycle_time == 0.0f) bt.printf("First in\r\n");
Dennis40816 0:9c3829968b11 373 else {
Dennis40816 1:db7799912cac 374 bt.printf("Mode:%d,cycle: %d,last cycle time:%.2f sec\r\n",mode,cycle,last_cycle_time);
Dennis40816 5:a897228b7306 375 if(cycle == SKIDPAD_CYCLE && mode == SKID || cycle == ENDURANCE_CYCLE && mode == ENDU ){
Dennis40816 1:db7799912cac 376 bt.printf("Best Cycle:%d\r\n",best_cycle);
Dennis40816 1:db7799912cac 377 bt.printf("Best Cycle Time:%.2f sec\r\n",best_cycle_time);
Dennis40816 1:db7799912cac 378 bt.printf("Mode %d End & Reset\r\n",mode);
Dennis40816 0:9c3829968b11 379 bt_end_flag = 1;
Dennis40816 2:c9889e740474 380 }
Dennis40816 5:a897228b7306 381 else if(mode == ACC) bt_end_flag = 1;
Dennis40816 0:9c3829968b11 382 }
Dennis40816 0:9c3829968b11 383 }
Dennis40816 0:9c3829968b11 384 else if(process == 3){
Dennis40816 1:db7799912cac 385 process = 4;
Dennis40816 1:db7799912cac 386 bt_print_flag = 1;
Dennis40816 0:9c3829968b11 387 if (last_cycle_time == 0.0f) pc.printf("First in\r\n");
Dennis40816 0:9c3829968b11 388 else {
Dennis40816 1:db7799912cac 389 pc.printf("Mode:%d,cycle: %d,last cycle time:%.2f sec\r\n",mode,cycle,last_cycle_time);
Dennis40816 5:a897228b7306 390 if(cycle == SKIDPAD_CYCLE && mode == SKID || cycle == ENDURANCE_CYCLE && mode == ENDU){
Dennis40816 1:db7799912cac 391 pc.printf("Mode %d End & Reset\r\n",mode);
Dennis40816 0:9c3829968b11 392 bt_end_flag = 1;
Dennis40816 4:1300ca51fc75 393 }
Dennis40816 5:a897228b7306 394 else if(mode == ACC) bt_end_flag = 1;
Dennis40816 0:9c3829968b11 395 }
Dennis40816 0:9c3829968b11 396 }
Dennis40816 0:9c3829968b11 397 if(last_rf_state != rf_state){
Dennis40816 0:9c3829968b11 398 last_rf_state = rf_state;
Dennis40816 0:9c3829968b11 399 if(rf_state){
Dennis40816 0:9c3829968b11 400 if(bt_state.read()) bt.printf("RF Connected!\r\n");
Dennis40816 0:9c3829968b11 401 else pc.printf("RF Connected!\r\n");
Dennis40816 0:9c3829968b11 402 }
Dennis40816 0:9c3829968b11 403 else{
Dennis40816 0:9c3829968b11 404 if(bt_state.read()) bt.printf("RF Disconnected!\r\n");
Dennis40816 0:9c3829968b11 405 else pc.printf("RF Disonnected!\r\n");
Dennis40816 0:9c3829968b11 406 }
Dennis40816 0:9c3829968b11 407 }
Dennis40816 0:9c3829968b11 408 }
Dennis40816 0:9c3829968b11 409 void show_flag_check(){
Dennis40816 0:9c3829968b11 410 //cycle update for mode != ACC
Dennis40816 5:a897228b7306 411 if(lcd_print_flag && bt_print_flag && mode != ACC){
Dennis40816 0:9c3829968b11 412 //print ok
Dennis40816 0:9c3829968b11 413 process = 0;
Dennis40816 0:9c3829968b11 414 lcd_print_flag = 0;
Dennis40816 0:9c3829968b11 415 bt_print_flag = 0;
Dennis40816 2:c9889e740474 416 cycle++;
Dennis40816 2:c9889e740474 417
Dennis40816 0:9c3829968b11 418 }
Dennis40816 0:9c3829968b11 419 if(lcd_end_flag && bt_end_flag){
Dennis40816 0:9c3829968b11 420 //notice reset
Dennis40816 5:a897228b7306 421 if(mode == ACC && us_ticker_read()/m_1 - lcd_end_time > LCD_SHOW_PERIOD && lcd_end_flag ) RF_Send(RESET); //including local reset
Dennis40816 0:9c3829968b11 422 else if(us_ticker_read()/m_1 - lcd_end_time > LCD_SHOW_PERIOD) reset_parameters();
Dennis40816 0:9c3829968b11 423 }
Dennis40816 2:c9889e740474 424
Dennis40816 0:9c3829968b11 425 }
Dennis40816 0:9c3829968b11 426 void time_cal(){
Dennis40816 0:9c3829968b11 427 if(process == 1){
Dennis40816 0:9c3829968b11 428 process = 2;
Dennis40816 0:9c3829968b11 429 //calculation time variable
Dennis40816 0:9c3829968b11 430 //last_cycle_time update in sensor in
Dennis40816 5:a897228b7306 431 if(mode != ACC) total_time += last_cycle_time;
Dennis40816 0:9c3829968b11 432 if(cycle == 1){
Dennis40816 0:9c3829968b11 433 best_cycle = cycle;
Dennis40816 0:9c3829968b11 434 best_cycle_time = last_cycle_time;
Dennis40816 0:9c3829968b11 435 }
Dennis40816 0:9c3829968b11 436 else if(last_cycle_time < best_cycle_time){
Dennis40816 0:9c3829968b11 437 best_cycle = cycle;
Dennis40816 0:9c3829968b11 438 best_cycle_time = last_cycle_time;
Dennis40816 0:9c3829968b11 439 }
Dennis40816 0:9c3829968b11 440 //get in update show period
Dennis40816 0:9c3829968b11 441 process = 3;
Dennis40816 0:9c3829968b11 442 }
Dennis40816 0:9c3829968b11 443 }
Dennis40816 0:9c3829968b11 444 //RF communication function , must end with \n ; //cycle update for mode ACC
Dennis40816 0:9c3829968b11 445 void RF_Send(int rf_tcmd){
Dennis40816 2:c9889e740474 446 if(rf_tcmd != ACCEPT) this_tcmd = rf_tcmd;
Dennis40816 2:c9889e740474 447 switch(rf_tcmd){
Dennis40816 2:c9889e740474 448 case ACCEPT:
Dennis40816 2:c9889e740474 449 RF.printf("%d\n",ACCEPT);
Dennis40816 2:c9889e740474 450 rf_state = 1;
Dennis40816 2:c9889e740474 451 rf_interval_cnt = -4;
Dennis40816 2:c9889e740474 452 break;
Dennis40816 2:c9889e740474 453 case DENY:
Dennis40816 2:c9889e740474 454 RF.printf("%d\n",DENY);
Dennis40816 2:c9889e740474 455 break;
Dennis40816 2:c9889e740474 456 case CHECK:
Dennis40816 2:c9889e740474 457 //以後加上cycle check
Dennis40816 2:c9889e740474 458 RF.printf("%d\n",CHECK);
Dennis40816 2:c9889e740474 459 break;
Dennis40816 2:c9889e740474 460 case MASTER:
Dennis40816 5:a897228b7306 461 role = ROLE_MASTER;
Dennis40816 2:c9889e740474 462 RF.printf("%d\n",MASTER);
Dennis40816 2:c9889e740474 463 if(bt_state.read()) bt.printf("Car in \r\n");
Dennis40816 2:c9889e740474 464 else pc.printf("Car in \r\n");
Dennis40816 2:c9889e740474 465 break;
Dennis40816 2:c9889e740474 466 case SLAVE:
Dennis40816 2:c9889e740474 467 RF.printf("%d&%.2f\n",SLAVE,this_cycle_timer.read());
Dennis40816 2:c9889e740474 468 break;
Dennis40816 2:c9889e740474 469 case RESULT:
Dennis40816 2:c9889e740474 470 RF.printf("%d&%.2f\n",RESULT,this_cycle_timer.read());
Dennis40816 2:c9889e740474 471 break;
Dennis40816 2:c9889e740474 472 case DELAY:
Dennis40816 2:c9889e740474 473 //delay time abnormal detect
Dennis40816 2:c9889e740474 474 if(rf_delay_time < 1.0f) {
Dennis40816 2:c9889e740474 475 RF.printf("%d&%.4f\n",DELAY,rf_delay_time);
Dennis40816 2:c9889e740474 476 #if (DEBUG == 1 || DEBUG == 2)
Dennis40816 2:c9889e740474 477 if(bt_state.read()) bt.printf("Delay time:%.4f\r\n",rf_delay_time);
Dennis40816 2:c9889e740474 478 else pc.printf("Delay time:%.4f\r\n",rf_delay_time);
Dennis40816 2:c9889e740474 479 #endif
Dennis40816 2:c9889e740474 480 }
Dennis40816 2:c9889e740474 481 else if(bt_state.read()) bt.printf("rf delay time > 1sec \r\n");
Dennis40816 2:c9889e740474 482 else pc.printf("rf delay time > 1 sec\r\n");
Dennis40816 2:c9889e740474 483 break;
Dennis40816 2:c9889e740474 484 case RESET:
Dennis40816 2:c9889e740474 485 cycle++;
Dennis40816 2:c9889e740474 486 reset_parameters();
Dennis40816 2:c9889e740474 487 if(bt_state.read()) bt.printf("ACC Set \r\n");
Dennis40816 2:c9889e740474 488 else pc.printf("ACC Set \r\n");
Dennis40816 2:c9889e740474 489 break;
Dennis40816 2:c9889e740474 490 case RESTART:
Dennis40816 2:c9889e740474 491 RF.printf("%d\n",RESTART);
Dennis40816 2:c9889e740474 492 //reset_parameters at button_fall_2
Dennis40816 2:c9889e740474 493 break;
Dennis40816 2:c9889e740474 494 default:
Dennis40816 2:c9889e740474 495 if(bt_state.read()) bt.printf("Unknown Tcmd\r\n");
Dennis40816 2:c9889e740474 496 else pc.printf("Unknown Tcmd\r\n");
Dennis40816 2:c9889e740474 497 break;
Dennis40816 2:c9889e740474 498 }
Dennis40816 2:c9889e740474 499 last_tcmd = this_tcmd;
Dennis40816 2:c9889e740474 500 }
Dennis40816 2:c9889e740474 501
Dennis40816 2:c9889e740474 502 void RF_Receive(int rf_rcmd){
Dennis40816 5:a897228b7306 503 if(mode == ACC){
Dennis40816 2:c9889e740474 504 this_rcmd = rf_rcmd;
Dennis40816 2:c9889e740474 505 #if(DEBUG == 1)
Dennis40816 2:c9889e740474 506 //if(bt_state.read()) bt.printf("this rcmd:%d\r\n",this_rcmd);
Dennis40816 2:c9889e740474 507 //else pc.printf("this rcmd:%d\r\n",this_rcmd);
Dennis40816 2:c9889e740474 508 #endif
Dennis40816 2:c9889e740474 509 switch(rf_rcmd){
Dennis40816 0:9c3829968b11 510 case ACCEPT:
Dennis40816 0:9c3829968b11 511 rf_state = 1;
Dennis40816 2:c9889e740474 512 rf_interval_cnt = 0;
Dennis40816 0:9c3829968b11 513 break;
Dennis40816 0:9c3829968b11 514 case DENY:
Dennis40816 2:c9889e740474 515 switch(last_tcmd){
Dennis40816 2:c9889e740474 516 //master
Dennis40816 2:c9889e740474 517 case MASTER:
Dennis40816 2:c9889e740474 518 bt.printf("MASTER Request Denied!\r\n");
Dennis40816 2:c9889e740474 519 break;
Dennis40816 2:c9889e740474 520 //slave //發送時間待補
Dennis40816 2:c9889e740474 521 case SLAVE:
Dennis40816 2:c9889e740474 522 bt.printf("SLAVE Request Denied!\r\n");
Dennis40816 2:c9889e740474 523 break;
Dennis40816 2:c9889e740474 524 //result
Dennis40816 2:c9889e740474 525 case RESULT:
Dennis40816 2:c9889e740474 526 bt.printf("RESULT Request Denied!\r\n");
Dennis40816 2:c9889e740474 527 break;
Dennis40816 2:c9889e740474 528 }
Dennis40816 0:9c3829968b11 529 break;
Dennis40816 0:9c3829968b11 530 case CHECK:
Dennis40816 2:c9889e740474 531 RF_Send(ACCEPT);
Dennis40816 0:9c3829968b11 532 break;
Dennis40816 0:9c3829968b11 533 case MASTER:
Dennis40816 2:c9889e740474 534 //will become Slave End
Dennis40816 5:a897228b7306 535 if(role == NONE){
Dennis40816 5:a897228b7306 536 role = ROLE_SLAVE;
Dennis40816 2:c9889e740474 537 if(bt_state.read()) bt.printf("Car in \r\n");
Dennis40816 2:c9889e740474 538 else pc.printf("Car in \r\n");
Dennis40816 2:c9889e740474 539 }
Dennis40816 2:c9889e740474 540 else RF_Send(DENY);
Dennis40816 0:9c3829968b11 541 break;
Dennis40816 0:9c3829968b11 542 case SLAVE:
Dennis40816 2:c9889e740474 543 /*should be Master End*/
Dennis40816 2:c9889e740474 544 //calculate Delay time
Dennis40816 2:c9889e740474 545 char slave_time[5];
Dennis40816 2:c9889e740474 546 for(int i=0;i<5;i++) slave_time[i] = RX_buffer[i+2];
Dennis40816 2:c9889e740474 547 rf_delay_time = (float)(( this_cycle_timer.read()-atof(slave_time) )/2);
Dennis40816 2:c9889e740474 548 last_cycle_time = this_cycle_timer.read()-rf_delay_time;
Dennis40816 2:c9889e740474 549 //send back Delay time
Dennis40816 2:c9889e740474 550 wait_ms(10);
Dennis40816 2:c9889e740474 551 RF_Send(DELAY);
Dennis40816 2:c9889e740474 552 wait_ms(10);
Dennis40816 2:c9889e740474 553 //Role off and interval = 0 ->maybe at reset?
Dennis40816 2:c9889e740474 554 process = 3;
Dennis40816 0:9c3829968b11 555 break;
Dennis40816 0:9c3829968b11 556 case RESULT:
Dennis40816 2:c9889e740474 557 //should be Master End
Dennis40816 2:c9889e740474 558 char result_time[5];
Dennis40816 2:c9889e740474 559 for(int i=0;i<5;i++) result_time[i] = RX_buffer[i+2];
Dennis40816 2:c9889e740474 560 last_cycle_time = atof(result_time);
Dennis40816 2:c9889e740474 561 process = 3;
Dennis40816 0:9c3829968b11 562 break;
Dennis40816 0:9c3829968b11 563 case DELAY:
Dennis40816 2:c9889e740474 564 // should be Slave End
Dennis40816 2:c9889e740474 565 char delay_time [5];
Dennis40816 2:c9889e740474 566 for(int i=0;i<5;i++) delay_time[i] = RX_buffer[i+2];
Dennis40816 2:c9889e740474 567 rf_delay_time = atof(delay_time);
Dennis40816 2:c9889e740474 568 last_cycle_time = this_cycle_timer.read()+ rf_delay_time;
Dennis40816 2:c9889e740474 569 process = 3;
Dennis40816 2:c9889e740474 570 #if(DEBUG == 1 || DEBUG == 2)
Dennis40816 2:c9889e740474 571 if(bt_state.read()) bt.printf("Delay time:%.4f \r\n",rf_delay_time);
Dennis40816 2:c9889e740474 572 else pc.printf("Delay time:%.4f \r\n",rf_delay_time);
Dennis40816 2:c9889e740474 573 #endif
Dennis40816 0:9c3829968b11 574 break;
Dennis40816 0:9c3829968b11 575 case RESET:
Dennis40816 0:9c3829968b11 576 cycle++;
Dennis40816 0:9c3829968b11 577 reset_parameters();
Dennis40816 2:c9889e740474 578 if(bt_state.read()) bt.printf("ACC Set\r\n");
Dennis40816 2:c9889e740474 579 else pc.printf("ACC Set\r\n");
Dennis40816 0:9c3829968b11 580 break;
Dennis40816 0:9c3829968b11 581 case RESTART:
Dennis40816 2:c9889e740474 582 reset_parameters();
Dennis40816 2:c9889e740474 583 if(bt_state.read()) bt.printf("ACC Restart\r\n");
Dennis40816 2:c9889e740474 584 else pc.printf("ACC Restart\r\n");
Dennis40816 0:9c3829968b11 585 break;
Dennis40816 0:9c3829968b11 586 default:
Dennis40816 2:c9889e740474 587 if(bt_state.read()) bt.printf("Unknown Rcmd\r\n");
Dennis40816 2:c9889e740474 588 else pc.printf("Unknown Rcmd\r\n");
Dennis40816 0:9c3829968b11 589 break;
Dennis40816 0:9c3829968b11 590 }
Dennis40816 0:9c3829968b11 591 }
Dennis40816 0:9c3829968b11 592 }
Dennis40816 0:9c3829968b11 593
Dennis40816 0:9c3829968b11 594 //IT
Dennis40816 0:9c3829968b11 595 void sensor_in(){
Dennis40816 2:c9889e740474 596 if(us_ticker_read()/m_1 - sensor_in_debounce > SENSOR_IN_DEBOUNCE){
Dennis40816 2:c9889e740474 597 sensor_in_debounce = us_ticker_read()/m_1;
Dennis40816 5:a897228b7306 598 if(mode!=ACC){
Dennis40816 2:c9889e740474 599 if(cycle == 1){
Dennis40816 2:c9889e740474 600 this_cycle_timer.start();
Dennis40816 2:c9889e740474 601 process = 1;
Dennis40816 2:c9889e740474 602 }
Dennis40816 2:c9889e740474 603 if(this_cycle_timer.read() > CYCLE_TIME_PROTECT){
Dennis40816 2:c9889e740474 604 process = 1;
Dennis40816 2:c9889e740474 605 last_cycle_time = this_cycle_timer.read();
Dennis40816 2:c9889e740474 606 this_cycle_timer.reset();
Dennis40816 2:c9889e740474 607 }
Dennis40816 2:c9889e740474 608 //check mode2,3
Dennis40816 5:a897228b7306 609 if((cycle > SKIDPAD_CYCLE && mode == SKID || cycle > ENDURANCE_CYCLE && mode == ENDU)){
Dennis40816 2:c9889e740474 610 process = 0;
Dennis40816 2:c9889e740474 611 }
Dennis40816 1:db7799912cac 612 }
Dennis40816 5:a897228b7306 613 else if(mode == ACC){
Dennis40816 2:c9889e740474 614 //mode acc
Dennis40816 2:c9889e740474 615 if(!role && rf_state){
Dennis40816 2:c9889e740474 616 //MASTER
Dennis40816 2:c9889e740474 617 this_cycle_timer.start();
Dennis40816 2:c9889e740474 618 RF_Send(MASTER);
Dennis40816 2:c9889e740474 619 }
Dennis40816 5:a897228b7306 620 if(role == ROLE_SLAVE && this_cycle_timer.read() > CYCLE_TIME_PROTECT){
Dennis40816 2:c9889e740474 621 this_cycle_timer.stop();
Dennis40816 2:c9889e740474 622 //SLAVE
Dennis40816 2:c9889e740474 623 #if (NO_DELAY == 1)
Dennis40816 2:c9889e740474 624 //this_cycle_timer.start() at RxCallback
Dennis40816 2:c9889e740474 625 RF_Send(RESULT);
Dennis40816 2:c9889e740474 626 last_cycle_time = this_cycle_timer.read();
Dennis40816 2:c9889e740474 627 process = 3;
Dennis40816 2:c9889e740474 628 #else
Dennis40816 2:c9889e740474 629 //with delay calculation in Master End
Dennis40816 2:c9889e740474 630 RF_Send(SLAVE);
Dennis40816 2:c9889e740474 631 #endif
Dennis40816 2:c9889e740474 632 }
Dennis40816 0:9c3829968b11 633 }
Dennis40816 0:9c3829968b11 634 }
Dennis40816 0:9c3829968b11 635 }
Dennis40816 0:9c3829968b11 636 void button_fall(void){
Dennis40816 0:9c3829968b11 637 //debounce
Dennis40816 0:9c3829968b11 638 button_RTC = us_ticker_read()/m_1;
Dennis40816 0:9c3829968b11 639 if(button_RTC - button_LTC > BUTTON_DEBOUNCE){
Dennis40816 0:9c3829968b11 640 button_LTC = button_RTC;
Dennis40816 5:a897228b7306 641 (mode >= ENDU || mode < SING) ? mode = SING : mode++ ;
Dennis40816 5:a897228b7306 642 (mode == ACC)?RF.attach(&RxCallback,Serial::RxIrq):RF.attach(NULL,Serial::RxIrq);
Dennis40816 5:a897228b7306 643 if(mode != ACC) rf_state = 0;
Dennis40816 1:db7799912cac 644 last_tcmd = RESTART;
Dennis40816 0:9c3829968b11 645 reset_parameters();
Dennis40816 1:db7799912cac 646 last_tcmd = ACCEPT;
Dennis40816 0:9c3829968b11 647 if(bt_state.read()) bt.printf("Mode change to :%d \r\n",mode);
Dennis40816 0:9c3829968b11 648 else pc.printf("Mode change to :%d \r\n",mode);
Dennis40816 0:9c3829968b11 649 }
Dennis40816 0:9c3829968b11 650 }
Dennis40816 0:9c3829968b11 651 void button_fall_2(void){
Dennis40816 0:9c3829968b11 652 //send reset cmd
Dennis40816 0:9c3829968b11 653 button_RTC_2 = us_ticker_read()/m_1;
Dennis40816 0:9c3829968b11 654 if(button_RTC_2 - button_LTC_2 > BUTTON_DEBOUNCE){
Dennis40816 0:9c3829968b11 655 button_LTC_2 = button_RTC_2;
Dennis40816 5:a897228b7306 656 if(mode == ACC) RF_Send(RESTART);
Dennis40816 0:9c3829968b11 657 reset_parameters();
Dennis40816 0:9c3829968b11 658 if(bt_state.read() ){
Dennis40816 5:a897228b7306 659 if(mode == ACC) bt.printf("ACC Restart\r\n");
Dennis40816 2:c9889e740474 660 else {
Dennis40816 2:c9889e740474 661 bt.printf("Restart!\r\n\r\n\r\n");
Dennis40816 2:c9889e740474 662 bt.printf("#####################\r\n");
Dennis40816 2:c9889e740474 663 }
Dennis40816 0:9c3829968b11 664 }
Dennis40816 1:db7799912cac 665 else{
Dennis40816 1:db7799912cac 666 pc.printf("Restart!\r\n\r\n\r\n");
Dennis40816 1:db7799912cac 667 pc.printf("#####################\r\n");
Dennis40816 1:db7799912cac 668 }
Dennis40816 0:9c3829968b11 669 }
Dennis40816 0:9c3829968b11 670 }
Dennis40816 0:9c3829968b11 671 void RxCallback(){
Dennis40816 0:9c3829968b11 672 //read from buffer
Dennis40816 3:70ce5fd299bb 673 #if(RX_MODE == 1) // by scanf ,printf
Dennis40816 0:9c3829968b11 674 RF.scanf("%s",RX_buffer);
Dennis40816 0:9c3829968b11 675 if(RX_buffer[0]-'0' == MASTER) this_cycle_timer.start();
Dennis40816 0:9c3829968b11 676 else if(RX_buffer[0]-'0' == SLAVE || RX_buffer[0]-'0' == RESULT) this_cycle_timer.stop();
Dennis40816 0:9c3829968b11 677 Rx_flag = 1;
Dennis40816 3:70ce5fd299bb 678 #elif(RX_MODE == 2) //by getc , printf
Dennis40816 0:9c3829968b11 679 while(RF.readable()){
Dennis40816 0:9c3829968b11 680 char new_char = RF.getc();
Dennis40816 0:9c3829968b11 681 if(new_char != '\n') {
Dennis40816 0:9c3829968b11 682 RX_buffer[rx_cnt++] = new_char;
Dennis40816 0:9c3829968b11 683 if(rx_cnt == 1){
Dennis40816 0:9c3829968b11 684 //timer management
Dennis40816 0:9c3829968b11 685 if(RX_buffer[0]-'0' == MASTER) this_cycle_timer.start();
Dennis40816 0:9c3829968b11 686 else if(RX_buffer[0]-'0' == SLAVE || RX_buffer[0]-'0' == RESULT) this_cycle_timer.stop();
Dennis40816 0:9c3829968b11 687 }
Dennis40816 0:9c3829968b11 688 }
Dennis40816 2:c9889e740474 689 else if(new_char == '\n') {
Dennis40816 0:9c3829968b11 690 rx_cnt = 0;
Dennis40816 0:9c3829968b11 691 Rx_flag = 1;
Dennis40816 0:9c3829968b11 692 }
Dennis40816 0:9c3829968b11 693 }
Dennis40816 0:9c3829968b11 694 #endif
Dennis40816 0:9c3829968b11 695 #if(DEBUG == 1)
Dennis40816 2:c9889e740474 696 if(bt_state.read()&& !rx_cnt) bt.printf("RX Callback,'%s' has been received\r\n",RX_buffer);
Dennis40816 0:9c3829968b11 697 #endif
Dennis40816 0:9c3829968b11 698 if(Rx_flag == 1){
Dennis40816 0:9c3829968b11 699 RF_Receive(RX_buffer[0]-'0');
Dennis40816 0:9c3829968b11 700 Rx_flag = 0;
Dennis40816 0:9c3829968b11 701 }
Dennis40816 0:9c3829968b11 702 }