2018.07.26

Dependencies:   EthernetInterface TextLCD USBDevice USBHost2 mbed

Revision:
0:2cb1be240f50
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/P1_2Y_handy.cpp	Thu Jul 26 00:19:33 2018 +0000
@@ -0,0 +1,2032 @@
+/*
+////////////////////////////////////////////////////////////////////////////
+ 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();
+}
\ No newline at end of file