2018.07.26
Dependencies: EthernetInterface TextLCD USBDevice USBHost2 mbed
P1_2Y_handy.cpp
- Committer:
- sayzyas
- Date:
- 2018-07-26
- Revision:
- 0:2cb1be240f50
File content as of revision 0:2cb1be240f50:
/* //////////////////////////////////////////////////////////////////////////// Project: B1/B2 DebrisProbe Demonstration model Title: Debris Prober demo HandyCtrl Main Target: mbed LPC1768 Data: 2017.06.30 Author: sayzyas as ZNR ------------------------------------------------ The Final Project of this company ! .... may be. ------------------------------------------------ ## ##### ## ##### ## ## ## ## ## ## ## ## ## ##### ##### ## ## ## ## ## ## ## ## ##### ##### mbed LPC1768 +-------------USB-----------+ | GND VOUT(3.3V) | | VIN VU(5.0V OUT)| | VB IF- | | mR IF+ | | p5 mosi Ether RD- | | p6 miso Ether RD+ | | p7 sck Ether TD- | | p8 Ether TD+ | | p9 tx sdi USB D- | | p10 rx scl USB D+ | | p11 mosi CAN rd p30 | | p12 miso CAN td p29 | | p13 tx sck sda tx p28 | | p14 rx scl rx P27 | | p15 AIn PWM P26 | | p16 AIn PWM P25 | | p17 AIn PWM p24 | | p18 AIn AOut PWM p23 | | p19 AIn PWM p22 | | p20 AIn PWM p21 | +---------------------------+ //////////////////////////////////////////////////////////////////////////// */ #include "mbed.h" #include "USBHostGamepad.h" #include "USBSerial.h" #include "rtos.h" #include "EthernetInterface.h" #include "common.h" #include "stdio.h" //#include "TextLCD.h" #include "com_func.h" #include "USBHID.h" #include "TextLCD.h" // USBSerial serial setting Serial pc(USBTX, USBRX); // UART // Digital I/O setting DigitalOut led1(LED1); // 1:on,0:off System is OK then ON. DigitalOut led2(LED2); // 1:on,0:off GamePad is connected. DigitalOut led3(LED3); // 1:on,0:off When got the GamePas switch input then ON DigitalOut led4(LED4); // 1:on,0:off Access indicator with PC // LED indicator DigitalOut led_ind_ptwc(p14); // LED indicator pan/tilt, winch, crawler limit DigitalOut led_ind_tfm(p15); // LED indicator tfm motor current limit DigitalOut led_valid_part1(p25); // LED transform, crawler valid DigitalOut led_valid_part2(p26); // LED pan/tilt, winch valid int16_t led_ind_cnt = 0; int16_t led_ind_cnt_t = 0; // Switch Matrix 3bit SW ON = 0 input // bit 2 1 0 Send data // 0 1 1 1 : // 1 1 1 0 : 0x01 RF Tfm K // 2 1 0 1 : 0x02 RF Tfm I // 3 1 0 0 : 0x04 LB Tfm K // 4 0 1 1 : 0x08 LB Tfm I // 5 0 1 0 : 0x10 Winch Down // 6 0 0 1 : 0x20 Winch Up // 7 0 0 0 : DigitalIn sw1(p5); // Bit 0 DigitalIn sw2(p6); // Bit 1 DigitalIn sw3(p7); // Bit 2 // Digital Input 1:OFF, 0:ON DigitalIn sw_JS_ShapeMode(p29); // SW: i \ k ,pde ( 1: K, 0: I ) DigitalIn sw_validpart(p30); // SW: CrExp Shape ( 1: Left-Winch. 0: Right-tfmcrwler ) // Analig Joystick input for crawler control AnalogIn Rjsin_UD(p16); // Crawler R-UD AnalogIn Rjsin_LR(p17); // Crawler R-LR //AnalogIn Ljsin_UD(p19); // Crawler L-UD //AnalogIn Ljsin_LR(p20); // Crawler L-LR const char* TCP_SERVER_ADDRESS = "192.168.0.24"; // Ethernet EthernetInterface eth; // TCP TCPSocketConnection tsocket; // TCP client // UDP UDPSocket usocket; // UDP client Endpoint client; // Local File System LocalFileSystem local("local"); // Create the local filesystem under the name "local" TextLCD lcd(p11, p12, p24, p23, p22, p21); // rs, e, d4-d7 uint8_t js_center_value_r_ud = 0x80; uint8_t js_center_value_r_lr = 0x80; uint8_t js_center_value_l_ud = 0x80; uint8_t js_center_value_l_lr = 0x80; // Global uint32_t flg_gamePad_Connected = 0; char PC_cmd[11+1] = "&0100000000"; basic_operation_t baseOperation; char dbuffer[128]; // Global Parameter of setting setValue_t setValue; // Setting Data /* Status flag */ /* 0000 0000 : button LI LK RI RK PCW PCCW TU TD 0000 0000 : limit switch 0000 0000 : res 0000 0000 : res */ uint32_t flg_exp_status = 0; Mutex lcdMutex; Mutex flg_mutex; int swbtn_Opeflg = 0; int16_t winchCurrentPosition; int16_t winchOffsetValue = 0; // 2016.10.07 added int16_t winchDramDiameter = 5985; // 2017.01.06 added Mutex mtx_wcp; bool flg_ButtonOn = false; bool flg_lsw_valid = false; int flg_JS_shape_mode = 0; int flg_JS_ope_mode = 0; int motor1_current_pct; int motor2_current_pct; uint8_t limitSw_Sts = 0; char motorLock_sts = '\0'; void led_winch_valid( int counter ) { if( counter < 25) { led_valid_part2 = 0; } else { led_valid_part2 = 1; } } void led_crawler_valid( int counter ) { if( counter < 25) { led_valid_part2 = 1; } else { led_valid_part2 = 0; } } void lcd_dsp( int column, int row, char* msg, int cnt) { for( int i = 0; i < cnt; i++ ) { lcd.locate(column+i,row); lcd.putc(*msg++); } Thread::wait(10); } // ============================================================ // Send Status to PC // ============================================================ void sendStatus2PC( char *cmd, int32_t numberOfCmd ){ int i; led4 = 1; for ( i = 0; i < numberOfCmd; i++ ) { pc.putc(*cmd++); } led4 = 0; } uint8_t adj_crawlerSpeed( uint8_t in ) { uint8_t out; /* pc.printf( "#### %d ####\r\n", in ); if( ( in > 0 ) && ( in < 98 )) { out = (uint8_t)((float)in * 0.8); } else { out = 100; } */ out = in; return out; } bool cmd_snd2serverZ( char* cmd, // command send to server int cmdSize ){ tsocket.send(cmd, cmdSize); DEBUG_PRINT_L0("Snd cmd 2 server [ %s (%d) ]\r\n", cmd, cmdSize ); // Clean up return true; } bool flg_mc_tfmcrw = false; bool flg_mc_winch = false; char I2C_res[NumberOfI2CCommand+1] = "\0"; // ***************************************************************** // calibration joystick data // ***************************************************************** bool calibrate_joystick( int js, uint8_t data_ud, uint8_t data_lr ){ uint16_t tmp; if( js == 0 ) // R-JS { tmp = (uint16_t)js_center_value_r_ud; tmp += (uint16_t)data_ud; tmp /= 2; js_center_value_r_ud = (uint8_t)tmp; tmp = (uint16_t)js_center_value_r_lr; tmp += (uint16_t)data_lr; tmp /= 2; js_center_value_r_lr = (uint8_t)tmp; if ( (((127-10) < js_center_value_r_ud )&&(js_center_value_r_ud < (127+10))) && (((127-10) < js_center_value_r_lr )&&(js_center_value_r_lr < (127+10))) ) { return true; } else { return false; } } else // Other { tmp = (uint16_t)js_center_value_l_ud; tmp += (uint16_t)data_ud; tmp /= 2; js_center_value_l_ud = (uint8_t)tmp; tmp = (uint16_t)js_center_value_l_lr; tmp += (uint16_t)data_lr; tmp /= 2; js_center_value_l_lr = (uint8_t)tmp; if ( (((127-10) < js_center_value_l_ud )&&(js_center_value_l_ud < (127+10))) && (((127-10) < js_center_value_l_lr )&&(js_center_value_l_lr < (127+10))) ) { return true; } else { return false; } } } // LED current indicator blink control when // each motor is moving. void led_ind_run ( int led_number, int count, int period ){ if(( count >= 0 )&&( count < period )) { if( led_number == 1 ) { led_ind_ptwc = ON; } else { led_ind_tfm = ON; } } else if(( count >= period )&&( count < period*2 )) { if( led_number == 1 ) { led_ind_ptwc = OFF; } else { led_ind_tfm = OFF; } } else { led_ind_ptwc = OFF; led_ind_tfm = OFF; } } void led_error_blink( int no, int times ) { for( int i = 0; i < times; i++ ) { if( no == 1 ) { led_ind_ptwc = 1; } else { led_ind_tfm = 1; } Thread::wait(50); if( no == 1 ) { led_ind_ptwc = 0; } else { led_ind_tfm = 0; } Thread::wait(50); } } bool flg_B2 = false; bool flg_system_ok = true; // ***************************************************************** // switch control task // ---------------------- // // Up: center -> 255 // Down: 002 -> center // Right: center -> 255 // Left : 0 -> center // // ***************************************************************** int16_t tmpPosition; void sw_task( void const *){ char msg[16] = ""; uint16_t jsr_ud_data; uint16_t jsr_lr_data; uint8_t jsr_ud_undata; uint8_t jsr_lr_undata; uint8_t m1_speed; uint8_t m2_speed; char sbuf[128] = ""; // TCP send buffer char rbuf[128]; // TCP receive buffer int flg_tfmcrwpart_1st = 0; int flg_wchcptpart_1st = 0; int rts; bool jsjg = true; bool led_tfm_lock = false; bool led_ptwc_lock = false; int runcount = 0; DEBUG_PRINT_L0("Handy(Bd2)>> Start ststem initializing ...\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> =============================================================\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> Initalizing Ethernet ...\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> =============================================================\r\n"); const char* ip_address = "192.168.0.31"; const char* subnet_mask = "255.255.255.0"; const char* gateway = "192.168.0.0"; DEBUG_PRINT_L0("Handy(Bd2)> --------------------------------------\r\n"); DEBUG_PRINT_L0("Handy(Bd2)> ip address : %s\r\n", ip_address); DEBUG_PRINT_L0("Handy(Bd2)> subnet mask : %s\r\n", subnet_mask); DEBUG_PRINT_L0("Handy(Bd2)> default gateway: %s\r\n", gateway); DEBUG_PRINT_L0("Handy(Bd2)> --------------------------------------\r\n"); char sss[24]; int ret = eth.init( ip_address, // const char* ip, subnet_mask, // const char* mask, gateway // const char* gateway ); if( ret == 0 ){ DEBUG_PRINT_L0("Handy(Bd2)> Eternet init ... OK\r\n"); ret = eth.connect(7000); // Connection time out: 7000msec if( ret == 0 ){ cf_led_onoff( &led1,&led2,&led3,&led4, false, false, false, true ); DEBUG_PRINT_L0("Handy(Bd2)> [ IP Address : %s ]\r\n", eth.getIPAddress()); while( true ) { if (tsocket.connect(TCP_SERVER_ADDRESS, TCP_SERVER_PORT) < 0) { DEBUG_PRINT_L0("Handy(Bd2)> ###ERROR### : Unable to connect to (%s) on port (%d)\r\n", TCP_SERVER_ADDRESS, TCP_SERVER_PORT); flg_system_ok = false; wait(0.5); break; } flg_system_ok = true; sprintf(sss, "IP:%s", ip_address ); lcdMutex.lock(); lcd_dsp(0,0,"Network .. OK ",16); sss[15] = ' '; lcd_dsp(0,1,sss,16); lcdMutex.unlock(); sprintf( sbuf, "Hello" ); DEBUG_PRINT_L0( "Handy(Bd2)> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); wait_ms(5); // Receive winch position from host tsocket.receive( rbuf, sizeof(rbuf)); // // Check target (B1 or B2) here ! // if( !strncmp( rbuf, "B2Demo", 6 ) ) { DEBUG_PRINT_L0( "Handy(Bd2)> Echo back [%s]\r\n", rbuf ); flg_B2 = true; } wait_ms(300); DEBUG_PRINT_L1("Calibrating joystick ... "); for( int i = 0; i < CALIBRATION_COUNT; i++){ jsr_ud_data = Rjsin_UD.read_u16(); jsr_lr_data = Rjsin_LR.read_u16(); jsr_ud_undata = (uint8_t)(jsr_ud_data >> 8); jsr_lr_undata = (uint8_t)(jsr_lr_data >> 8); jsjg = calibrate_joystick( 0, jsr_ud_undata, jsr_lr_undata); // Under constraction } if( jsjg == false ){ flg_system_ok = false; wait(0.5); break; } DEBUG_PRINT_L1("done\r\n"); lcdMutex.lock(); wait_ms(500); lcd_dsp(0,0,"System Boot up ",16); if( flg_B2 == true ) { sprintf( msg, "B2Wch [**** mm] "); // B2 } else { sprintf( msg, "------ B1 ------"); // B1 } lcdMutex.lock(); lcd_dsp(0,0," ",16); lcd_dsp(0,1,msg,16); lcdMutex.unlock(); while(1){ jsr_ud_data = Rjsin_UD.read_u16(); jsr_lr_data = Rjsin_LR.read_u16(); jsr_ud_undata = (uint8_t)(jsr_ud_data >> 8); jsr_lr_undata = (uint8_t)(jsr_lr_data >> 8); DEBUG_PRINT_SW("Handy SW> "); DEBUG_PRINT_SW("R:%03d/%3d,%03d/%3d ", jsr_ud_undata, js_center_value_r_ud, jsr_lr_undata, js_center_value_r_ud ); DEBUG_PRINT_SW("SW: %d %d %d ", sw1.read(), sw2.read(), sw3.read() ); DEBUG_PRINT_SW("JS: %d %d\r\n", sw_JS_ShapeMode.read(), sw_validpart.read() ); // ********************************************************** // Transform and crawler control part // ********************************************************** if( sw_validpart == 0 ){ // sw on flg_wchcptpart_1st = 0; led_valid_part2 = 0; led_valid_part1 = 1; if( flg_tfmcrwpart_1st == 0 ) { sprintf( sbuf, "OX_PART_000_0000" ); DEBUG_PRINT_L0( "Handy(Bd2)> VALID PART [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; Thread::wait(5); flg_tfmcrwpart_1st = 1; } else { // --------------------------------------------- // Right JoyStick Control // --------------------------------------------- if( sw_JS_ShapeMode == 1 ){ // OFF: KO-Shape if( // Dead zone ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata >= (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) && ( jsr_lr_undata <= (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) ){ sprintf( sbuf, "XX_CLRF_002_0000" ); // M1 Stop DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_002_0000" ); // M2 Stop DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; lcdMutex.lock(); if( runcount < 15 ) { lcd_dsp(0,0,"OX [^] ",16); } else if ( runcount < 30 ) { lcd_dsp(0,0,"OX [>] ",16); } else if(runcount < 45 ) { lcd_dsp(0,0,"OX [v] ",16); } else{ lcd_dsp(0,0,"OX [<] ",16); } if( runcount >= 60 ) { runcount = 0; } else { runcount++; } lcdMutex.unlock(); // Receive winch position from host // rts = tsocket.receive( rbuf, sizeof(rbuf)); // if( rts < 0 ) break; led4 = 0; led_ind_ptwc = 0; led_ind_cnt = 0; Thread::wait(15); // Don't delete, important! } else if( // Forward zone ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) && ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; m1_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio m2_speed = m1_speed; sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; DEBUG_PRINT_L2("Handy> R-JS Up: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX Cr-F:%03d", (255 - jsr_ud_undata)); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Reverse zone ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) && ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; m1_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio m2_speed = m1_speed; sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX Cr-R:%03d", (255 - jsr_ud_undata)); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Right turn zone ( jsr_lr_undata > (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) && ( jsr_ud_undata > (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_ud_undata < (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; m1_speed = ( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr; // Speed ratio m2_speed = m1_speed; // Speed sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; DEBUG_PRINT_L2("Handy> R-JS Right: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_lr_undata, send_report.data[2], js_center_value_r_ud); sprintf(msg,"OX Cr->:%03d", jsr_lr_undata); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Left turn zone ( jsr_lr_undata < (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) && ( jsr_ud_undata > (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_ud_undata < (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; m1_speed = ( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr; // Speed ratio m2_speed = m1_speed; sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; DEBUG_PRINT_L2("Handy> R-JS Left: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_lr_undata, send_report.data[2], js_center_value_r_ud); sprintf(msg,"OX Cr<-:%03d", jsr_lr_undata); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Right-upper zone ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; if( jsr_ud_undata > jsr_lr_undata ) { m2_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio m1_speed = 100 - (( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr); sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ } DEBUG_PRINT_L2("Handy> R-JS R-U zone: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX Cr-FRZ "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Left-upper zone ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata < (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; if( (jsr_ud_undata - js_center_value_r_ud) > (js_center_value_r_ud-jsr_lr_undata) ) { m1_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio m2_speed = 100 - (( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr); sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ } DEBUG_PRINT_L2("Handy> R-JS Up: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX Cr-FLZ "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Right-lower zone ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; if( (js_center_value_r_ud - jsr_ud_undata) > (jsr_lr_undata - js_center_value_r_lr) ) { m2_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio m1_speed = 100 - (( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr); sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ } DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX Cr-RRZ "); //sprintf(msg, "OX C BK RT "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); led4 = OFF; Thread::wait(15); // Don't delete, important! } else if( // Left-lower zone ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_lr_undata < (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; if( (js_center_value_r_ud - jsr_ud_undata) > ( js_center_value_r_lr - jsr_lr_undata) ) { m1_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio m2_speed = 100 - (( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr); sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ } DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX Cr-RLZ "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); led4 = OFF; Thread::wait(15); // Don't delete, important! } } else // ON: I-Shape { // Right Joystic < Down if( jsr_ud_undata > (js_center_value_r_ud + + setValue.jsCtrl.rjs_upper_dzone) ){ led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; m1_speed = adj_crawlerSpeed(( js_center_value_r_ud+1 - (255 - jsr_ud_undata) ) * 100 / js_center_value_r_ud ); // Speed m2_speed = m1_speed; // Speed sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; DEBUG_PRINT_L2("Handy> R-JS Up: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX C FW:%03d", (255 - jsr_ud_undata)); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ led4 = OFF; Thread::wait(15); // Don't delete, important! } // Right Joystick < Up > else if( jsr_ud_undata < (js_center_value_r_ud - + setValue.jsCtrl.rjs_upper_dzone) ){ // Crawler reverse Run led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8); if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } led4 = ON; m1_speed = adj_crawlerSpeed(( (255 - jsr_ud_undata) - js_center_value_r_ud ) * 100 / js_center_value_r_ud ); // Speed m2_speed = m1_speed; // Speed sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud); sprintf(msg, "OX C BK:%03d", (255 - jsr_ud_undata)); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); led_error_blink( 1, 4 ); } */ led4 = OFF; Thread::wait(15); // Don't delete, important! } else{ sprintf( sbuf, "XX_CLRF_002_0000" ); // M1 Stop DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CLLB_002_0000" ); // M2 Stop DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; /* // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; lcdMutex.lock(); lcd_dsp(0,0,"OX ",11); lcdMutex.unlock(); */ led4 = OFF; led_ind_ptwc = OFF; } } // --------------------------------------------- // Other Switch Control: Pass // --------------------------------------------- if ((sw1 == 0)&&(sw2 == 1)&&(sw3==0)){ // Limit Switch valid if( flg_lsw_valid == false ) { flg_lsw_valid = true; //printf("lsw valid\r\n"); if( flg_B2 == false ) //B1 { lcd_dsp(0,1,"------ B1 -----*",16); } else { sprintf(msg,"B2Wch [%04d mm]*", tmpPosition); lcdMutex.lock(); lcd_dsp(0,1,msg,16); lcdMutex.unlock(); } Thread::wait(700); } else { flg_lsw_valid = false; //printf("lsw invalid\r\n"); if( flg_B2 == false ) //B1 { lcd_dsp(0,1,"------ B1 ------",16); } else { sprintf(msg,"B2Wch [%04d mm] ", tmpPosition); lcdMutex.lock(); lcd_dsp(0,1,msg,16); lcdMutex.unlock(); } Thread::wait(700); } } else if ((sw1 == 0)&&(sw2 == 1)&&(sw3==1)){ // RF transform K led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2); if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 ) { led_ind_cnt_t = 0; } else { led_ind_cnt_t += 1; } if( flg_lsw_valid == true ) { sprintf( sbuf, "XX_TFRF_100_0100" ); } else { sprintf( sbuf, "XX_TFRF_000_0100" ); } sprintf(msg, "OX Tfm-RFK "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" ); led_tfm_lock = true; } if( led_tfm_lock == true ) { led_error_blink( 0, 4 ); } led3 = 1; Thread::wait(15); } else if ((sw1 == 1)&&(sw2 == 0)&&(sw3==1)){ // RF transform I led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2); if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 ) { led_ind_cnt_t = 0; } else { led_ind_cnt_t += 1; } if( flg_lsw_valid == true ) { sprintf( sbuf, "XX_TFRF_101_0100" ); } else { sprintf( sbuf, "XX_TFRF_001_0100" ); } sprintf(msg, "OX Tfm-RFI "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" ); led_tfm_lock = true; } if( led_tfm_lock == true ) { led_error_blink( 0, 4 ); } led3 = 1; Thread::wait(15); } else if ((sw1 == 0)&&(sw2 == 0)&&(sw3==1)){ // LB transform K led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2); if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 ) { led_ind_cnt_t = 0; } else { led_ind_cnt_t += 1; } if( flg_lsw_valid == true ) { sprintf( sbuf, "XX_TFLB_100_0100" ); } else { sprintf( sbuf, "XX_TFLB_000_0100" ); } sprintf(msg, "OX Tfm-LBK "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" ); led_tfm_lock = true; } if( led_tfm_lock == true ) { led_error_blink( 0, 4 ); } led3 = 1; Thread::wait(15); } else if ((sw1 == 1)&&(sw2 == 1)&&(sw3==0)){ // LB transform I led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2); if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 ) { led_ind_cnt_t = 0; } else { led_ind_cnt_t += 1; } if( flg_lsw_valid == true ) { sprintf( sbuf, "XX_TFLB_101_0100" ); } else { sprintf( sbuf, "XX_TFLB_001_0100" ); } sprintf(msg, "OX Tfm-LBI "); lcdMutex.lock(); lcd_dsp(0,0,msg,11); lcdMutex.unlock(); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" ); led_tfm_lock = true; } if( led_tfm_lock == true ) { led_error_blink( 0, 4 ); } led3 = 1; Thread::wait(15); } else { sprintf( sbuf, "XX_TFRF_002_0000" ); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host // rts = tsocket.receive( rbuf, sizeof(rbuf)); // if( rts < 0 ) break; sprintf( sbuf, "XX_TFLB_002_0000" ); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host // rts = tsocket.receive( rbuf, sizeof(rbuf)); // if( rts < 0 ) break; led3 = OFF; led_tfm_lock = false; led_ind_tfm = OFF; } } } // ********************************************************** // B1: Camera pan/tile, B2: Winch control part // ********************************************************** else{ flg_tfmcrwpart_1st = 0; led_valid_part2 = 1; led_valid_part1 = 0; if( flg_wchcptpart_1st == 0 ) { sprintf( sbuf, "XO_PART_000_0000" ); DEBUG_PRINT_L0( "Handy(Bd2)> VALID PART [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; Thread::wait(5); flg_wchcptpart_1st = 1; } else { if((sw1 == 0)&&(sw2 == 1)&&(sw3==0)){ // Winch Position Clear sprintf( sbuf, "OO_WCLR_000_0100" ); DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; Thread::wait(10); } if( // Dead zone ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata >= (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) && ( jsr_lr_undata <= (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) ){ if( flg_B2 == false ) // B1 { sprintf( sbuf, "XX_CPAN_002_0000" ); // M2 Stop DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; sprintf( sbuf, "XX_CTLT_002_0000" ); // M2 Stop DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; lcdMutex.lock(); if( runcount < 15 ) { lcd_dsp(0,0,"XO [^] ",16); } else if ( runcount < 30 ) { lcd_dsp(0,0,"XO [>] ",16); } else if(runcount < 45 ) { lcd_dsp(0,0,"XO [v] ",16); } else{ lcd_dsp(0,0,"XO [<] ",16); } if( runcount >= 60 ) { runcount = 0; } else { runcount++; }; lcdMutex.unlock(); Thread::wait(2); led_ind_ptwc = OFF; } else // B2 { sprintf( sbuf, "XX_WICH_002_0000" ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN WCH STOP [%s]\r\n", sbuf ); rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; lcdMutex.lock(); //lcd_dsp(0,0,"XO ",11); lcdMutex.lock(); if( runcount < 15 ) { lcd_dsp(0,0,"XO [^] ",16); } else if ( runcount < 30 ) { lcd_dsp(0,0,"XO [>] ",16); } else if(runcount < 45 ) { lcd_dsp(0,0,"XO [v] ",16); } else{ lcd_dsp(0,0,"XO [<] ",16); } if( runcount >= 60 ) { runcount = 0; } else { runcount++; }; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); DEBUG_PRINT_L0( "Handy(Bd2)> Winch Position [%04d]\r\n", tmpPosition ); if( tmpPosition != 9999 ) { if( flg_lsw_valid == true ) { sprintf(msg,"B2Wch [%04d mm]*", tmpPosition); } else { sprintf(msg,"B2Wch [%04d mm] ", tmpPosition); } } else { if( flg_lsw_valid == true ) { sprintf(msg,"B2Wch [**** mm]*"); } else { sprintf(msg,"B2Wch [**** mm] "); } } lcdMutex.lock(); lcd_dsp(0,1,msg,16); lcdMutex.unlock(); led_ind_ptwc = OFF; } led2 = 0; led3 = 0; led_ind_ptwc = 0; led_ptwc_lock = false; } else if( // PAN zone ( jsr_lr_undata >= (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) && ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone*2)) && ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone*2)) && ( flg_B2 == false ) ){ led2 = 1; led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD); if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } m1_speed = ( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr; // Speed ratio sprintf( sbuf, "XX_CPAN_000_%04d", m1_speed ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN PAN CW [%s]\r\n", sbuf ); // Send command to host. rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" ); led_ptwc_lock = true; } else { lcdMutex.lock(); lcd_dsp(0,0,"XO PAN CW ",11); lcd_dsp(0,1,"------ B1 ------",16); lcdMutex.unlock(); } if( led_ptwc_lock == true ) { led_error_blink( 1, 4 ); } } else if( // Left turn zone ( jsr_lr_undata <= (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) && ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone*2)) && ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone*2)) && ( flg_B2 == false ) ){ led2 = 1; led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD); if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } m1_speed = ( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr; // Speed ratio sprintf( sbuf, "XX_CPAN_001_%04d", m1_speed ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN PAN CCW[%s]\r\n", sbuf ); // Send command to host. rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" ); led_ptwc_lock = true; } else { lcdMutex.lock(); lcd_dsp(0,0,"XO PAN CCW ",11); lcd_dsp(0,1,"------ B1 ------",16); lcdMutex.unlock(); } if( led_ptwc_lock == true ) { led_error_blink( 1, 4 ); } } // Down else if( // Down Motor forward ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone*2)) && ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone*2)) && ( flg_B2 == false) ){ led2 = ON; led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD); if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } m2_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio //m2_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio sprintf( sbuf, "XX_CTLT_000_%04d", m2_speed ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN TILT CW [%s]\r\n", sbuf ); // Send command to host. rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" ); led_ptwc_lock = true; } else { lcdMutex.lock(); lcd_dsp(0,0,"XO TLT Down",11); lcd_dsp(0,1,"------ B1 ------",16); lcdMutex.unlock(); } if( led_ptwc_lock == true ) { led_error_blink( 1, 4 ); } } else if( // Up motor reverse ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone*2)) && ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone*2)) && ( flg_B2 == false) ){ led2 = 1; led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD); if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } m2_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio // m2_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio sprintf( sbuf, "XX_CTLT_001_%04d", m2_speed ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN TLT CCW[%s]\r\n", sbuf ); // Send command to host. rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" ); led_ptwc_lock = true; } else { lcdMutex.lock(); lcd_dsp(0,0,"XO TILT Up ",11); lcd_dsp(0,1,"------ B1 ------",16); lcdMutex.unlock(); } if( led_ptwc_lock == true ) { led_error_blink( 1, 4 ); } } // Down Motor forward else if( ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr - 25 * setValue.jsCtrl.rjs_left_dzone)) && ( jsr_lr_undata < (js_center_value_r_lr + 25 * setValue.jsCtrl.rjs_right_dzone)) && ( flg_B2 == true ) ){ led2 = ON; led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD); if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } m1_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio sprintf( sbuf, "XX_WICH_000_%04d", m1_speed ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN WCH DN [%s]\r\n", sbuf ); // Send command to host. rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; lcdMutex.lock(); lcd_dsp(0,0,"XO W Down ",11); lcdMutex.unlock(); // Receive winch position from host. rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### WINCH LOCK DETECTION ###\r\n" ); led_ptwc_lock = true; } else { DEBUG_PRINT_L0( "Handy(Bd2)> Winch Position [%04d]\r\n", tmpPosition ); sprintf(msg,"B2Wch [%04d mm] ", tmpPosition); if( tmpPosition != 9999 ) { if( flg_lsw_valid == true ) { sprintf(msg,"B2Wch [%04d mm]*", tmpPosition); } else { sprintf(msg,"B2Wch [%04d mm] ", tmpPosition); } } else { if( flg_lsw_valid == true ) { sprintf(msg,"B2Wch [**** mm]*"); } else { sprintf(msg,"B2Wch [**** mm] "); } } lcdMutex.lock(); lcd_dsp(0,1,msg,16); lcdMutex.unlock(); } if( led_ptwc_lock == true ) { led_error_blink( 1, 4 ); } } // Up motor reverse else if( ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) && ( jsr_lr_undata > (js_center_value_r_lr - 25 * setValue.jsCtrl.rjs_left_dzone)) && ( jsr_lr_undata < (js_center_value_r_lr + 25 * setValue.jsCtrl.rjs_right_dzone)) && ( flg_B2 == true ) ){ led2 = 1; led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD); if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 ) { led_ind_cnt = 0; } else { led_ind_cnt += 1; } m1_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio sprintf( sbuf, "XX_WICH_001_%04d", m1_speed ); DEBUG_PRINT_L0( "Handy(Bd2)> BTN WCH UP [%s]\r\n", sbuf ); // Send command to host rts = tsocket.send_all(sbuf, sizeof(sbuf)); if( rts < 0 ) break; lcdMutex.lock(); lcd_dsp(0,0,"XO W Up ",11); lcdMutex.unlock(); // Receive winch position from host rts = tsocket.receive( rbuf, sizeof(rbuf)); if( rts < 0 ) break; rbuf[4] = '\0'; tmpPosition = atoi( rbuf ); if( tmpPosition == 9999 ) { DEBUG_PRINT_L0( "Handy(Bd2)> ### WWINCH LOCK DETECTION ###\r\n" ); led_ptwc_lock = true; } else { DEBUG_PRINT_L0( "Handy(Bd2)> Winch Position [%04d]\r\n", tmpPosition ); sprintf(msg,"B2Wch [%04d mm] ", tmpPosition); if( tmpPosition != 9999 ) { if( flg_lsw_valid == true ) { sprintf(msg,"B2Wch [%04d mm]*", tmpPosition); } else { sprintf(msg,"B2Wch [%04d mm] ", tmpPosition); } } else { if( flg_lsw_valid == true ) { sprintf(msg,"B2Wch [**** mm]*"); } else { sprintf(msg,"B2Wch [**** mm] "); } } lcdMutex.lock(); lcd_dsp(0,1,msg,16); lcdMutex.unlock(); } if( led_ptwc_lock == true ) { led_error_blink( 1, 4 ); } } } } Thread::wait(5); } lcd_dsp(0,0,"!!Eth error",11); tsocket.close(); } } else{ cf_led_error( &led1,&led2,&led3,&led4 ); DEBUG_PRINT_L0("Handy(Bd2)> ###ERROR### Eternet connect Fali\r\n"); DEBUG_PRINT_L0("Handy(Bd2)> This programis booting in Stand alone mode.\r\n"); flg_system_ok = false; } } else{ DEBUG_PRINT_L0("Handy(Bd2)> ###ERROR### Eternet init Fail\r\n"); DEBUG_PRINT_L0("Handy(Bd2)> This programis booting in Stand alone mode.\r\n"); flg_system_ok = false; } } // ====================================================================== // Read setting value from lpcal file system of mbed // ====================================================================== bool read_LFS( setValue_t* setValue ){ FILE *fp; char *fname = "/local/jsset.txt"; char s[150]; int c; int data; bool rts; flg_mutex.lock(); fp = fopen(fname, "r"); if( fp != NULL ){ // Open "set.txt" on the local file system for writing c = getc(fp); if( c != '#' ){ pc.printf( "#### ERROR This is not a setting file ####\r\n"); rts = false; } else{ fgets( s, 100, fp ); pc.printf( "%s", s ); fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_upper_dzone=data; pc.printf("R-JS upper = %03d",setValue->jsCtrl.rjs_upper_dzone); fgets(s,100,fp); pc.printf("%s",s ); fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_lower_dzone=data; pc.printf("R-JS lower = %03d",setValue->jsCtrl.rjs_lower_dzone); fgets(s,100,fp); pc.printf("%s",s ); fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_right_dzone=data; pc.printf("R-JS upper = %03d",setValue->jsCtrl.rjs_right_dzone); fgets(s,100,fp); pc.printf("%s",s ); fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_left_dzone=data; pc.printf("R-JS lower = %03d",setValue->jsCtrl.rjs_left_dzone); fgets(s,100,fp); pc.printf("%s",s ); fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_1=data; pc.printf("%03d",setValue->jsCtrl.reserved_1); fgets(s,100,fp); pc.printf("%s",s); fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_2=data; pc.printf("%03d",setValue->jsCtrl.reserved_2); fgets(s,100,fp); pc.printf("%s",s); fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_3=data; pc.printf("%03d",setValue->jsCtrl.reserved_3); fgets(s,100,fp); pc.printf("%s",s); fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_4=data; pc.printf("%03d",setValue->jsCtrl.reserved_4); fgets(s,100,fp); pc.printf("%s",s); } fclose(fp); rts = true; } else{ pc.printf( "#### ERROR local file open error ####\r\n"); rts = false; } flg_mutex.unlock(); return rts; } extern "C" { #include "rt_TypeDef.h" #include "rt_System.h" } // ********************************************************************** // // Main Function of this program // // ********************************************************************** int main() { Mutex file_access_mutex; // int ret; int try_cnt; // bool flg_ethernet = false; char sss[20]; // Serial baudrate pc.baud(115200); sw_validpart.mode( PullUp ); // use internal pullup sw_JS_ShapeMode.mode( PullUp ); // use internal pullup led_ind_ptwc = ON; // LED indicator pan/tilt, crawler limit led_ind_tfm = ON; // LED indicator tfm motor current limit led_valid_part1 = ON; // LED transform, crawler valid led_valid_part2 = ON; // LED pan/tilt, winch valid lcd_dsp(0,0,"B2 PMORPH Demo ",16); lcd_dsp(0,1,"Revast Co.,Ltd. ",16); lcd_dsp(0,0,"Rev1.00 20170403",16); lcd_dsp(0,1,"System Booting..",16); DEBUG_PRINT_L0("\r\n"); DEBUG_PRINT_L0("Bd2> HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\r\n"); DEBUG_PRINT_L0("Bd2> | Project: B1/B2 Debris Prover Demonstration machine\r\n"); DEBUG_PRINT_L0("Bd2> |-------------------------------------------------------------\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> | This is: Handy Control Program of Main Controller\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> | Target MCU: mbed LPC1768\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> | Letest update: %s\r\n", LatestUpDate); DEBUG_PRINT_L0("Handy(Bd2)>> | Program Revision: %s\r\n", ProgramRevision); DEBUG_PRINT_L0("Handy(Bd2)>> | Author: %s\r\n", Author); DEBUG_PRINT_L0("Handy(Bd2)>> | Copyright(C) 2017 %s Allright Reserved\r\n", Company); DEBUG_PRINT_L0("Handy(Bd2)>> HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\r\n"); sprintf( sss, "%s", ProgramRevision ); // Thread::wait(50); //--------------------------------------------------- // Read CrExp setting value from Local File System // setting file "SET.DAT". // When error occured, LED1 will be blinking shortly. //--------------------------------------------------- DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n"); DEBUG_PRINT_L0("Handy(Bd2)> 2. Read setting value from LFS\r\n"); DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n"); #ifdef __CREATE_SETTING_FILE__ write_LFS(&setValue); // Create and set setting file. #endif // __CREATE_SETTING_FILE__ // -------------------------------------------------------------------- // Read setting from local file system and set to internal structure // -------------------------------------------------------------------- lcdMutex.lock(); lcd_dsp(0,0,"LFS reading ... ",16); lcdMutex.unlock(); try_cnt = LFS_READ_COUNT; while( 1 ){ if( read_LFS(&setValue) == true ) break; else try_cnt -= 1; if( try_cnt == 0 ){ DEBUG_PRINT_L0("Handy(Bd2)> ***ERROR*** LFS read error\r\n"); while(1){ led1 = !led1; Thread::wait(30); } } } DEBUG_PRINT_L0("Handy(Bd2)> LFS read OK\r\n"); lcdMutex.lock(); lcd_dsp(0,0,"LFS read OK ",16); lcdMutex.unlock(); led3 = ON; // Setting Data Read OK led2 = ON; // Check target OK /* Set basic function default setting */ baseOperation.sv_JS_OpeMode = 0; baseOperation.sv_JS_OpeMode = 0; baseOperation.sv_WinchValid = 0; DEBUG_PRINT_L0( "Handy(Bd2)> ----------------------------------\r\n"); DEBUG_PRINT_L0( "Handy(Bd2)> >>>> Initializing completed ! <<<<\r\n"); DEBUG_PRINT_L0( "Handy(Bd2)> ----------------------------------\r\n"); /* lcdMutex.lock(); lcd_dsp(0,0,"Booted up ! ",16); Thread::wait(500); lcd_dsp(0,0,"LFS System OK ",16); lcd_dsp(0,1," ",16); Thread::wait(500); lcd_dsp(0,0," ",16); lcd_dsp(0,1,"B2Wch [3500 mm] ",16); lcdMutex.unlock(); */ lcdMutex.lock(); lcd_dsp(0,0,"Start sw task ",16); lcdMutex.unlock(); DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n"); DEBUG_PRINT_L0("Handy(Bd2)>> 5. Start the task\r\n"); /* Max thread count is (may be ..) 2, How can I increase this , I don't know ?? */ // DEBUG_PRINT_L0("Handy(Bd2)> Start host gamepad task ... "); // Thread thread_gpd(gamepad_task, NULL, osPriorityNormal, 128*4); // GamePad Task isn't necessary. DEBUG_PRINT_L0("Handy(Bd2)> Start switch task ... "); Thread thread_swd(sw_task, NULL, osPriorityNormal, 256 * 4); DEBUG_PRINT_L0("\r\n"); DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n"); led4 = OFF; led3 = OFF; led2 = OFF; led1 = ON; // Initializing is OK then Power Indicator LED ON wait(10.0); if( flg_system_ok == true ) { led_ind_ptwc = OFF; // LED indicator pan/tilt, crawler limit led_ind_tfm = OFF; // LED indicator tfm motor current limit led_valid_part1 = OFF; // LED transform, crawler valid led_valid_part2 = OFF; // LED pan/tilt, winch valid } while( 1 ) { Thread::wait(3); // ----------------------------------------------------------------- // Communicate with client PC program. // TCP connection: // ----------------------------------------------------------------- if( flg_system_ok == true ) { lcdMutex.lock(); lcd_dsp(13,0,"[^] ",4); lcdMutex.unlock(); Thread::wait(300); lcdMutex.lock(); lcd_dsp(13,0,"[>] ",4); lcdMutex.unlock(); Thread::wait(300); lcdMutex.lock(); lcd_dsp(13,0,"[v] ",4); lcdMutex.unlock(); Thread::wait(300); lcdMutex.lock(); lcd_dsp(13,0,"[<] ",4); lcdMutex.unlock(); Thread::wait(300); } else { lcdMutex.lock(); // 0123456789012345 lcd_dsp(0,0,"HandyCtrl Error!",16); lcd_dsp(0,1,"* Check system! * ",16); lcdMutex.unlock(); Thread::wait(750); } } tsocket.close(); }