To Record the time of the car

Dependencies:   mbed TextLCD

Committer:
Dennis40816
Date:
Tue Aug 11 23:15:01 2020 +0000
Revision:
4:1300ca51fc75
Parent:
3:70ce5fd299bb
Child:
5:a897228b7306
Formal_Version_1; with delay time; fix pc no bt_end_flag

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