2018.07.26

Dependencies:   EthernetInterface TextLCD USBDevice USBHost3 mbed

Fork of USBHostHub_HelloWorld by Samuel Mokrani

Revision:
15:01680ed6b799
Parent:
14:3a5ae61ab1f4
--- a/0_main.cpp	Thu Apr 14 10:25:08 2016 +0000
+++ b/0_main.cpp	Thu Jul 26 00:20:39 2018 +0000
@@ -1,2753 +1,3075 @@
-
-/***************************************
- * Project: B2
- * Title:   CrExp B2 Motor Ctrl Main
- * Target:  LPC1768
- * ------------------------------------
- *
- *
- *
- *                 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
- * p16 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"
-
-// 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
-// I2C setting
-I2C i2c_res(p28, p27);      // I2C SDA, SCL is not good ???
-I2C i2c(p9, p10);     // I2C SDA, SCL is good
-
-// Ethernet
-EthernetInterface   eth;
-TCPSocketServer     tcp_server; // TCP Server
-TCPSocketConnection tcp_client;
-UDPSocket           udp_server; // UDP Server
-Endpoint            client;
-// LCD
-TextLCD lcd(p11, p12, p24, p23, p22, p21); // rs, e, d4-d7
-// Local File System
-LocalFileSystem local("local");  // Create the local filesystem under the name "local"
-
-// Global
-uint32_t            flg_gamePad_Connected = 0;
-char                PC_cmd[11+1] = "&0100000000";
-basic_operation_t   baseOperation;
-char                dbuffer[128];
-uint8_t             motor_speed = 0;
-
-// 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       flg_mutex;
-Mutex       swbtn_OpeMutex;
-int         swbtn_Opeflg = 0;
-
-int16_t     winchCurrentPosition;
-
-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';
-
-
-/* Prototype */
-void write_Setting_lfs(void);
-int read_Setting_lfs(void);
-void dsp_console_setting_value(void);
-void winchMovingControl( int, char*, int, winchData_t*, int, char* );  
-extern void dspSetValue2Console( Serial*, setValue_t * );  
-extern void lcd_out( TextLCD* ,int, int, char* );
-
-// ============================================================
-// Read motor current
-// ============================================================
-void read_motorCurrent(
-    int     i2c_addr,
-    char*   I2C_readcmd,
-    char*   I2C_res,
-    int     NumberOfI2Cdata
-){
-    i2c.read(i2c_addr, I2C_res, NumberOfI2Cdata);  
-    /*
-    DEBUG_PRINT_L0(" ++++++++++++++++++++++++++++++\r\n" );
-    DEBUG_PRINT_L0("  Read Motor1 Current [%d]\r\n", I2C_res[0] );
-    DEBUG_PRINT_L0("  Read Motor2 Current [%d]\r\n", I2C_res[1] );
-    DEBUG_PRINT_L0("  Read                [%d]\r\n", I2C_res[2] );
-    DEBUG_PRINT_L0(" ++++++++++++++++++++++++++++++\r\n" );
-    */
-}
-
-// ============================================================
-// 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;
-}
-            
-// ============================================================
-// Read winch current position from Resolver.
-// ============================================================
-int16_t ReadWinchCurrentPosition( int32_t i2c_addr )
-{
-    char        I2C_data[2];
-    int16_t     res_position = 0;
-    int         rts;
-    
-    rts = i2c.read(i2c_addr, I2C_data, 2); // Read
-    mtx_wcp.lock();   
-    if( rts == 0 ){
-        res_position = (I2C_data[1] << 8) | I2C_data[0]; 
-    }
-    else{
-        res_position = -1;
-    }
-     //   winchCurrentPosition = res_position;
-    mtx_wcp.unlock();
-    return res_position;
-}
-
-
-char I2C_res[NumberOfI2CCommand+1] = "\0";
-// ============================================================
-// Button control
-// ============================================================
-void onControl(
-    uint8_t btn00, uint8_t btn01, uint8_t btn02, uint8_t btn03, 
-    uint8_t btn04, uint8_t btn05, uint8_t btn06, uint8_t btn07, 
-    uint8_t btn08, uint8_t btn09, uint8_t btn10, uint8_t btn11, 
-    uint8_t btn12, uint8_t btn13, uint8_t btn14, uint8_t btn15,
-    uint16_t gamePadVID, uint16_t gamePadPID
-){
-    /* ** OLD type ***
-     * I2C Command (7byte)
-     *  0: '#'  // Preamble
-     *  1: '0'  // Target upper
-     *  2: '1'  // Target lower
-     *  3: '0'   // Command 1
-     *  4: '1/3'   // Command 2
-     *  5: '0/1'
-     */
-     
-     /* New Type 15.11.06 ~
-        [0] :  
-        [1] : 
-        [2] : 
-        [3] : 
-        [4] : motor 1 direction (A=Forward, B=Reverse, F=Stop)
-        [5] : motor 1 speed
-        [6] : motor 2 direction (A=Forward, B=Reverse, F=Stop)
-        [7] : motor 2 speed <-- New added
-        [8] : N/F
-        [9] : N/F
-    */
-    char I2C_cmd[NumberOfI2CCommand+1] = "#0100000000000";
-    char I2C_readcmd[NumberOfI2CCommand+1] = "#010000";
-    
-    uint8_t   btnStatus_RFK = 0;
-    uint8_t   btnStatus_RFI = 0;
-    uint8_t   btnStatus_LBK = 0;
-    uint8_t   btnStatus_LBI = 0;
-    uint8_t   btnStatus_WUP = 0;
-    uint8_t   btnStatus_WDN = 0;
-    uint8_t   btnStatus_RJSFwdRvs = 0; // R-JS Fwd/Rvs
-    uint8_t   btnStatus_RJSLftRgt = 0; // R-JS Left/Light
-    uint8_t   btnStatus_LJSFwdRvs = 0; // L-JS Fwd/Rvs
-    uint8_t   btnStatus_LJSLftRgt = 0; // L-Js Left/Right
-    
-    uint8_t   btnStatus_Start = 0;  // Guide button status for ELECOM GamePad
-    uint8_t   btnStatus_CrossUp = 0;
-    uint8_t   btnStatus_CrossDn = 0;
-    uint8_t   btnStatus_CrossRt = 0;
-    uint8_t   btnStatus_CrossLt = 0;
-    
-    // For JS Ope mode B    
-    uint8_t   btnID_RFK = 0;
-    uint8_t   btnID_RFI = 0;
-    uint8_t   btnID_LBK = 0;
-    uint8_t   btnID_LBI = 0;
-    uint8_t   btnID_RFLBI = 0;  // RF-I and LB-I both button on same time
-    uint8_t   btnID_RFLBK = 0;  // RF-K and LB-K both button on same time
-    uint8_t   btnID_WUP = 0;
-    uint8_t   btnID_WDN = 0;
-    
-    uint8_t   btnID_Start = 0;  // Guide button ID for ELECOM GamePad
-    uint8_t   btnID_JS_SD = 0;  // JS mode Single / Dual
-    uint8_t   btnID_JD_IK = 0;  // JS mode I-Shape / KO-Shape
-    
-    uint8_t   btnID_CrossUp = 0;
-    uint8_t   btnID_CrossDn = 0;
-    uint8_t   btnID_CrossRt = 0;
-    uint8_t   btnID_CrossLt = 0;
-    
-    if( gamePadVID == GAMEPAD_VID_RSTHANDY ){ // NRst own original controller
-        DEBUG_PRINT_L4("Bd0> [Rst HDY] ");
-        btnID_WDN  = 0x10;
-        btnID_WUP  = 0x20;
-        btnID_RFK  = 0x01;
-        btnID_RFI  = 0x02;
-        btnID_LBK  = 0x04;
-        btnID_LBI  = 0x08;
-        btnID_CrossUp = 0;
-        btnID_CrossDn = 4;
-        btnID_CrossRt = 2;
-        btnID_CrossLt = 6;
-        // ---- This is temporary setting ------------------------------
-        btnID_RFLBI = 192; // RF-I and LB-I both button on same time
-        btnID_RFLBK = 48;  // RF-K and LB-K both button on same time
-        // --------------------------------------------------------------
-        btnID_JS_SD = 1;  // JS mode Single or Dual
-        btnID_JD_IK = 2;  // JS mode I-Shape KO-Shape
-        if ( gamePadPID == GAMEPAD_PID_RSTHANDY ){
-            btnStatus_WDN = btn04;             
-            btnStatus_WUP = btn04;
-            btnStatus_RFK = btn04; 
-            btnStatus_RFI = btn04;
-            btnStatus_LBK = btn04;
-            btnStatus_LBI = btn04;
-            btnStatus_RJSFwdRvs = btn03; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_RJSLftRgt = btn02; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_LJSFwdRvs = btn01; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_LJSLftRgt = btn00; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_CrossUp = btn06;
-            btnStatus_CrossDn = btn06;
-            btnStatus_CrossRt = btn06;
-            btnStatus_CrossLt = btn06;
-            btnStatus_Start = btn05;  //
-        }
-    }
-    else if (gamePadVID == GAMEPAD_VID_ELECOM ){
-        DEBUG_PRINT_L4("Bd0> [ELECOM] ");
-        btnID_WDN  = 4;
-        btnID_WUP  = 2;
-        btnID_RFK  = 32;
-        btnID_RFI  = 128;
-        btnID_LBK  = 16;
-        btnID_LBI  = 64;
-        // ---------------------
-        btnID_RFLBI = 192; // RF-I and LB-I both button on same time
-        btnID_RFLBK = 48;  // RF-K and LB-K both button on same time
-        // ---------------------
-        btnID_Start = 8;  // Guide button ID for ELECOM GamePad
-        btnID_CrossUp = 0;
-        btnID_CrossDn = 4;
-        btnID_CrossRt = 2;
-        btnID_CrossLt = 6;
-        if ( gamePadPID == GAMEPAD_PID_ELECOM_JCU3613M ){
-            btnStatus_WDN = btn04; 
-            btnStatus_WUP = btn04;
-            btnStatus_RFK = btn04;
-            btnStatus_RFI = btn04;
-            btnStatus_LBK = btn04;
-            btnStatus_LBI = btn04;
-            btnStatus_RJSFwdRvs = btn03;
-            btnStatus_RJSLftRgt = btn02;
-            btnStatus_LJSFwdRvs = btn01;
-            btnStatus_LJSLftRgt = btn00;
-            btnStatus_Start = btn05;  // Guide button status for ELECOM GamePad
-            btnStatus_CrossUp = btn06;
-            btnStatus_CrossDn = btn06;
-            btnStatus_CrossRt = btn06;
-            btnStatus_CrossLt = btn06;
-        }        
-    }
-    else if( gamePadVID == GAMEPAD_VID_LOGICOOL ){
-        btnID_WDN  = 40;
-        btnID_WUP  = 136;
-        btnID_RFK  = 2;
-        btnID_RFI  = 8;
-        btnID_LBK  = 1;
-        btnID_LBI  = 4;
-        btnID_Start = 32;  // Guide button ID for ELECOM GamePad
-        btnID_CrossUp = 0;
-        btnID_CrossDn = 4;
-        btnID_CrossRt = 2;
-        btnID_CrossLt = 6;
-        if ( gamePadPID == GAMEPAD_PID_LOGICOOL_F710 ){
-            DEBUG_PRINT_L4("Bd0> [LOGI F710] ");
-            btnStatus_WDN = btn05;           
-            btnStatus_WUP = btn05;
-            btnStatus_RFK = btn06;
-            btnStatus_RFI = btn06;
-            btnStatus_LBK = btn06;
-            btnStatus_LBI = btn06;
-        }
-        else if ( gamePadPID == GAMEPAD_PID_LOGICOOL_F310 ){
-            DEBUG_PRINT_L4("Bd0> [LOGI F310] ");
-            btnStatus_WDN = btn04; 
-            btnStatus_WUP = btn04;
-            btnStatus_RFK = btn05;
-            btnStatus_RFI = btn05;
-            btnStatus_LBK = btn05;
-            btnStatus_LBI = btn05;
-            btnStatus_RJSFwdRvs = btn03;
-            btnStatus_RJSLftRgt = btn02;
-            btnStatus_LJSFwdRvs = btn01;
-            btnStatus_LJSLftRgt = btn00;
-            btnStatus_Start = btn05;  // Guide button status for ELECOM GamePad
-            btnStatus_CrossUp = btn04;
-            btnStatus_CrossDn = btn04;
-            btnStatus_CrossRt = btn04;
-            btnStatus_CrossLt = btn04;
-        }
-    }
-    else if ( gamePadVID == GAMEPAD_VID_SANWA){
-        DEBUG_PRINT_L4("Bd0> [SANWA] ");
-        btnID_WDN  = 2;
-        btnID_WUP  = 4;
-        btnID_RFK  = 2;
-        btnID_RFI  = 1;
-        btnID_LBK  = 128;
-        btnID_LBI  = 64;
-        // ---------------------
-        btnID_RFLBI = 80; // RF-I and LB-I both button on same time
-        btnID_RFLBK = 40;  // RF-K and LB-K both button on same time
-        // ---------------------
-        btnID_CrossUp = 0;
-        btnID_CrossDn = 255;
-        btnID_CrossRt = 0;
-        btnID_CrossLt = 255;
-        if ( gamePadPID == GAMEPAD_PID_SANWA_JYP70US ){
-            btnStatus_WDN = btn05; 
-            btnStatus_WUP = btn05;
-            btnStatus_RFK = btn06;
-            btnStatus_RFI = btn06;
-            btnStatus_LBK = btn05;
-            btnStatus_LBI = btn05;
-            btnStatus_RJSFwdRvs = btn03; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_RJSLftRgt = btn02; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_LJSFwdRvs = btn01; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_LJSLftRgt = btn00; // Assign analog js to this sw input by LPC1768mbed
-            btnStatus_CrossUp = btn01;
-            btnStatus_CrossDn = btn01;
-            btnStatus_CrossRt = btn00;
-            btnStatus_CrossLt = btn00;
-        }
-    }
-
-#ifdef __DISP_GAMAPAD_STATUS_ALL__ // For Debug
-//    DEBUG_PRINT_BTN(" Btn 00:%d, 01:%d, 02:%d, 03:%d, 04:%d, 05:%d, 06:%d, 07:%d, 08:%d | VID=0x%04x, PID=0x%04x\r\n", 
-//            btn00,btn01,btn02,btn03,btn04,btn05,btn06,btn07,btn08,
-//            gamePadVID, gamePadPID);
-    DEBUG_PRINT_SW("Bd0> -- Button Status -------------------------------\r\n");
-    DEBUG_PRINT_SW("Bd0>  00(%02x) 01(%02x) 02(%02x) 03(%02x)\r\n", btn00,btn01,btn02,btn03);
-    DEBUG_PRINT_SW("Bd0>  04(%02x) 05(%02x) 06(%02x) 07(%02x) 08(%02x)\r\n", btn04,btn05,btn06,btn07,btn08);
-    DEBUG_PRINT_SW("Bd0>  09(%02x) 10(%02x) 11(%02x) 12(%02x) 13(%02x) 14(%02x) 15(%02x)\r\n", btn09,btn10,btn11,btn12,btn13,btn14,btn15);
-    DEBUG_PRINT_SW("Bd0> ------------------------------------------------\r\n");
-#endif
-   
-    I2C_cmd[I2C_CP_M1_DIR]          = '\0';
-    I2C_cmd[I2C_CP_M1_SPEED]        = '\0';
-    I2C_cmd[I2C_CP_M1_FWD_CNTTH_U]  = '\0';
-    I2C_cmd[I2C_CP_M1_FWD_CNTTH_L]  = '\0';
-    I2C_cmd[I2C_CP_M1_RVS_CNTTH_U]  = '\0';
-    I2C_cmd[I2C_CP_M1_RVS_CNTTH_L]  = '\0';
-    I2C_cmd[I2C_CP_M2_DIR]          = '\0';
-    I2C_cmd[I2C_CP_M2_SPEED]        = '\0';
-    I2C_cmd[I2C_CP_M2_FWD_CNTTH_U]  = '\0';
-    I2C_cmd[I2C_CP_M2_FWD_CNTTH_L]  = '\0';
-    I2C_cmd[I2C_CP_M2_RVS_CNTTH_U]  = '\0';
-    I2C_cmd[I2C_CP_M2_RVS_CNTTH_L]  = '\0';
-    
-    int tmpSpeed = 0;
-    
-    if (swbtn_Opeflg == 1){
-        Thread::wait(1);
-    } 
-    else{
-        if( flg_lsw_valid == true ){
-            I2C_cmd[1] = 'V';
-        }
-        else{
-            I2C_cmd[1] = '0';
-        }
-        if( gamePadVID == GAMEPAD_VID_RSTHANDY ){ // NRst own original controller
-            flg_exp_status &= 0xFFFFFFF0;
-            if(!( btnStatus_Start & 0x01 )){ // I-Shape
-                flg_mutex.lock();
-                baseOperation.sv_JS_ShapeMode = 0;
-                baseOperation.sv_WinchValid = 0;
-                flg_mutex.unlock();
-                flg_exp_status |= 0x00000001;
-            }
-            else{ // KO-Shape
-                flg_mutex.lock();
-                baseOperation.sv_JS_ShapeMode = 1;
-                flg_mutex.unlock();
-                flg_exp_status |= 0x00000002;
-            }
-            
-            if(!(btnStatus_Start & 0x02 )){ // Tfm,crawler part valid
-                flg_mutex.lock();
-                baseOperation.sv_WinchValid = 0;
-                flg_mutex.unlock();
-                flg_exp_status |= 0x00000004;
-            }
-            else{ // Winch part valid
-                flg_mutex.lock();
-                baseOperation.sv_WinchValid = 1;
-                flg_mutex.unlock();
-                flg_exp_status |= 0x00000008;
-            }
-            DEBUG_PRINT_L4( "-----------------------------\r\n" );
-            DEBUG_PRINT_L4( "%d : %d\r\n",btnStatus_Start, flg_exp_status );
-            DEBUG_PRINT_L4( " JS shape mode change    : %d\r\n", baseOperation.sv_JS_ShapeMode); 
-            DEBUG_PRINT_L4( " Valid part              : %d\r\n", baseOperation.sv_WinchValid ); 
-            DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
-        }
-        else{
-        /*
-             * 
-             * GamePad software switch
-             *    Cross button Up on   : JS shape mode I
-             *    Cross button Down on : JS shape mode KO
-             *    Cross button Right on: Winch part valid
-             *    Cross button Left on : Crawlerm, Transform part valid
-             *  7 6 5 4 3 2 1 0
-             * +-+-+-+-+-+-+-+-+
-             * |x|x|x|x|x|x|x|o|  1: I-Shape JSmode, 2: K-Shape JSmode, 4: Left part(Crawler, Tfm) part valid, 8: Winch part valid 
-             * +-+-+-+-+-+-+-+-+
-             */
-            if ( btnStatus_CrossUp == btnID_CrossUp ){ // I Shape
-                flg_mutex.lock();
-                baseOperation.sv_JS_ShapeMode = 0;
-                flg_mutex.unlock();
-                DEBUG_PRINT_L4( "--------------------------------\r\n" );
-                DEBUG_PRINT_L4( " I\r\n" ); 
-                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
-                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
-                DEBUG_PRINT_L4( "--------------------------------\r\n" ); 
-                flg_exp_status |= 0x00000001;
-            }
-            else if( btnStatus_CrossDn == btnID_CrossDn ){ // KO Shape
-                flg_mutex.lock();
-                baseOperation.sv_JS_ShapeMode = 1;
-                flg_mutex.unlock();
-                DEBUG_PRINT_L4( "-------------------------\r\n" ); 
-                DEBUG_PRINT_L4( " KO\r\n" ); 
-                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
-                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
-                DEBUG_PRINT_L4( "-------------------------\r\n" ); 
-                flg_exp_status |= 0x00000002;
-            }    
-            else if( btnStatus_CrossRt == btnID_CrossLt ){ // Valid Part : Crawler (Left)
-                flg_mutex.lock();
-                baseOperation.sv_WinchValid = 0;
-                flg_mutex.unlock();
-                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
-                DEBUG_PRINT_L4( " Tfm, Crawler\r\n" ); 
-                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
-                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
-                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
-                flg_exp_status |= 0x00000004;
-            }
-            else if( btnStatus_CrossLt == btnID_CrossRt ){ // Valid Part : Winch (Right)
-                flg_mutex.lock();
-                baseOperation.sv_WinchValid = 1;
-                flg_mutex.unlock();
-                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
-                DEBUG_PRINT_L4( " Winch\r\n" ); 
-                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
-                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
-                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
-                flg_exp_status |= 0x00000008;
-            } 
-            else{
-                flg_exp_status &= 0xFFFFFFF0;
-            }                      
-        }
-        /*
-        // ====================================
-        //  TRANSFORM Motor Control
-        // ====================================
-         *  7 6 5 4 3 2 1 0
-         * +-+-+-+-+-+-+-+-+
-         * |o|x|x|x|x|x|x|x|  1: RF-I, 2: RF-K, 4: LB-I, 8: LB-K
-         * +-+-+-+-+-+-+-+-+
-         */
-
-        if ((btnStatus_RFK==btnID_RFLBK)&&(baseOperation.sv_WinchValid==0)){ // Both sw on
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN RF-K & LB-K\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
-            I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_F; // Speed
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor1 FWD
-            I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_F; // Speed
-    #endif
-            flg_exp_status |= 0x30000000;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif  // __IIC_COMAMND_SEND__
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        }
-
-        else if ((btnStatus_RFI== btnID_RFLBI)&&(baseOperation.sv_WinchValid==0)){ // Both sw on
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN RF-I & LB-I\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 FWD
-            I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_F; // Speed
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor1 FWD
-            I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_F; // Speed
-    #endif
-            flg_exp_status |= 0x10000000;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif  // __IIC_COMAMND_SEND__
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        }
-        
-        else if ((btnStatus_RFK==btnID_RFK)&&(baseOperation.sv_WinchValid==0)){ // RF KO
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN RF-K\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
-            I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_F; // Speed
-    #endif
-            flg_exp_status |= 0x10000000;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif  // __IIC_COMAMND_SEND__
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        } 
-        else if ((btnStatus_RFI==btnID_RFI)&&(baseOperation.sv_WinchValid==0)){ // RF I
-            DEBUG_PRINT_L3( "Bd0> BTN RF-I\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 RVS
-            I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_R; // Speed
-    #endif
-            flg_exp_status |= 0x20000000;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct );
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif // __READ_TFM_MOTOR_CURRENT__
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        }
-        
-        else if ((btnStatus_LBK==btnID_LBK)&&(baseOperation.sv_WinchValid==0)){ // LB KO
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN LB-K\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 FWD
-            I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_F; // Speed
-    #endif
-            flg_exp_status |= 0x40000000;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif // __READ_TFM_MOTOR_CURRENT__
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        } 
-        else if ((btnStatus_LBI==btnID_LBI)&&(baseOperation.sv_WinchValid==0)) { // LB I
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN LB-I\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor1 RVS
-            I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_R; // Speed
-    #endif
-            flg_exp_status |= 0x80000000;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif // __READ_TFM_MOTOR_CURRENT__
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        }
-        // ====================================
-        // ALL motor off commmand packet send
-        //  -- This part isn't operated in case of general game controller, because no event. --
-        // ====================================   
-        else if (baseOperation.sv_WinchValid==0){
-            led3 = 0;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
-            I2C_cmd[I2C_CP_M1_SPEED] = 0;
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
-            I2C_cmd[I2C_CP_M2_SPEED] = 0;
-            Thread::wait(5);
-    #endif
-            flg_exp_status &= 0x0FFFFFFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            
-    #ifdef __READ_TFM_MOTOR_CURRENT__
-            read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 5 ); 
-            motorLock_sts = I2C_res[4];
-            if( motorLock_sts == '1' ){
-                motor1_current_pct = 999;
-            }
-            else{
-                motor1_current_pct = I2C_res[0];
-            }
-            if( motorLock_sts == '2' ){
-                motor2_current_pct = 999;
-            }
-            else{
-                motor2_current_pct = I2C_res[1];
-            }
-            limitSw_Sts = I2C_res[3];
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts );
-            DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
-    #endif // __READ_TFM_MOTOR_CURRENT__
-
-        }
-
-        /*/ ====================================
-         //  Crawler Moving Control
-         // ====================================
-         // JoyStick mode 1: Independence mode ( Dual JoyStick mode )
-         //   
-         //   ***      ***
-         //  * L *    * R *
-         //   ***      ***
-         // F  4        1
-         //
-         // R  8        2
-         //
-         // Forward move    5
-         // Reverce move    a
-         // Right rotation  6
-         // Left rotation   9
-         *  7 6 5 4 3 2 1 0
-         * +-+-+-+-+-+-+-+-+
-         * |x|x|o|x|x|x|x|x|  1: R Fwd, 2: R Rvs, 4: L Fwd, 8: L Rvs
-         * +-+-+-+-+-+-+-+-+
-         */
-        if( baseOperation.sv_JS_OpeMode == 1 ){
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_R & 0xFF );
-            if ((btnStatus_LJSFwdRvs<setValue.crawlerCtrl.sv_LBCM_dzc-setValue.crawlerCtrl.sv_LBCM_dzl)&&(baseOperation.sv_WinchValid==0)){
-                flg_ButtonOn = true;
-                led3 = 1;
-                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 FWD
-                tmpSpeed = ( setValue.crawlerCtrl.sv_LBCM_dzc+1 - btnStatus_LJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_LBCM_dzc * setValue.crawlerCtrl.sv_LBCM_srto_F / 100; // Speed
-                I2C_cmd[I2C_CP_M2_SPEED] = (char)tmpSpeed; 
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                DEBUG_PRINT_L3( "Bd0> Dual Mode: L-Fwd (Speed=%d)\r\n", tmpSpeed);
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '2' ){
-                    motor2_current_pct = 999;
-                }
-                else{
-                    motor2_current_pct = I2C_res[1];
-                }
-                DEBUG_PRINT_L2( "Bd0> 2: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-                                
-                flg_exp_status |= 0x00400000;
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if ((btnStatus_LJSFwdRvs>setValue.crawlerCtrl.sv_LBCM_dzc+setValue.crawlerCtrl.sv_LBCM_dzu)&&(baseOperation.sv_WinchValid==0)){
-                flg_ButtonOn = true;
-                led3 = 1;
-                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS;    // Motor2 RVS
-                tmpSpeed = ( btnStatus_LJSFwdRvs - setValue.crawlerCtrl.sv_LBCM_dzc ) * 100 / setValue.crawlerCtrl.sv_LBCM_dzc+1 * setValue.crawlerCtrl.sv_LBCM_srto_F / 100; // Speed                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = (char)tmpSpeed; 
-                I2C_cmd[I2C_CP_M2_SPEED] =  (char)tmpSpeed; 
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                DEBUG_PRINT_L3( "Bd0> Dual Mode: L-Rvs (Speed=%d)\r\n", tmpSpeed);
-
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '2' ){
-                    motor2_current_pct = 999;
-                }
-                else{
-                    motor2_current_pct = I2C_res[1];
-                }
-                DEBUG_PRINT_L2( "Bd0> 2: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-
-                flg_exp_status |= 0x00800000;
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if (baseOperation.sv_WinchValid==0) {
-                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;   // Stop
-                I2C_cmd[I2C_CP_M2_SPEED] = 0;     // Speed=0
-                flg_exp_status &= 0xFF3FFFFF;
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            }
-            
-            if ((btnStatus_RJSFwdRvs<setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl)&&(baseOperation.sv_WinchValid==0)){
-                flg_ButtonOn = true;
-                led3 = 1;
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
-                tmpSpeed = (( 128 - btnStatus_RJSFwdRvs ) * 100 / 127 ) * setValue.crawlerCtrl.sv_RFCM_srto_R / 100;
-                I2C_cmd[I2C_CP_M1_SPEED] = (char)tmpSpeed; 
-                DEBUG_PRINT_L3( "Bd0> Dual Mode: R-Fwd (Speed=%d)\r\n", tmpSpeed);
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '1' ){
-                    motor1_current_pct = 999;
-                }
-                else{
-                    motor1_current_pct = I2C_res[0];
-                }
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-
-                flg_exp_status |= 0x00100000;
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if ((btnStatus_RJSFwdRvs>setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu)&&(baseOperation.sv_WinchValid==0)){
-                flg_ButtonOn = true;
-                led3 = 1;
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS;    // Motor1 RVS
-                tmpSpeed = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc+1 * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
-                I2C_cmd[I2C_CP_M1_SPEED] = (char)tmpSpeed; 
-                DEBUG_PRINT_L3( "Bd0> Dual Mode: R-Rvs (Speed=%d)\r\n", tmpSpeed);
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '1' ){
-                    motor1_current_pct = 999;
-                }
-                else{
-                    motor1_current_pct = I2C_res[0];
-                }
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-
-                flg_exp_status |= 0x00200000;
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if (baseOperation.sv_WinchValid==0) {
-                DEBUG_PRINT_L2("***** MOTOR STOP ****\r\n"); 
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;   // Stop
-                I2C_cmd[I2C_CP_M1_SPEED] = 0;     // Speed=0
-                flg_exp_status &= 0xFFCFFFFF;
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            }
-            led3 = 0;           
-        }
-        /* JoyStick mode 0: Syncronous mode ( Single JoyStick mode )
-        //   
-        //   ***      ****
-        //  * X *    * LR *
-        //   ***      ****
-        // F  4        1
-        //
-        // R  8        2
-        //
-        // Forward move    5
-        // Reverce move    a
-        // Right rotation  6
-        // Left rotation   9
-         *  7 6 5 4 3 2 1 0
-         * +-+-+-+-+-+-+-+-+
-         * |x|x|o|x|x|x|x|x|  1: R Fwd, 2: R Rvs, 4: L Fwd, 8: L Rvs
-         * +-+-+-+-+-+-+-+-+
-         */
-        else{ // Single JoyStick mode
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_R & 0xFF );
-            if(
-                ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl ) &&
-                ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50) &&
-                ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50 ) &&
-                ( baseOperation.sv_WinchValid == 0)
-            ){                
-                flg_ButtonOn = true;
-                led3 = 1;
-                if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 Reverse
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 Fwd
-                }
-                else{
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 Fwd
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 Fwd
-                }
-                I2C_cmd[I2C_CP_M1_SPEED] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100; // Speed
-                I2C_cmd[I2C_CP_M2_SPEED] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                DEBUG_PRINT_L3( "Bd0> Single Mode: Dir1 [%d, %d] (Speed: %d, %d)\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M1_RVS_CNTTH_U], I2C_cmd[I2C_CP_M2_SPEED]);
-                flg_exp_status |= 0x00500000;
-                //flg_exp_status |= 0x00400000; // 0x00500000
-                
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '1' ){
-                    motor1_current_pct = 999;
-                }
-                else{
-                    motor1_current_pct = I2C_res[0];
-                }
-                if( motorLock_sts == '2' ){
-                    motor2_current_pct = 999;
-                }
-                else{
-                    motor2_current_pct = I2C_res[1];
-                }
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-             
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if(
-                ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu ) && 
-                ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50 ) && 
-                ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50) &&
-                ( baseOperation.sv_WinchValid == 0)
-            ){                
-                flg_ButtonOn = true;
-                led3 = 1;
-                if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 Reverse
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor1 Reverse
-                }
-                else{               
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 Rvs
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 Fwd
-                }                
-                I2C_cmd[I2C_CP_M1_SPEED] = ( btnStatus_RJSLftRgt - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100; // Speed
-                I2C_cmd[I2C_CP_M2_SPEED] = ( btnStatus_RJSLftRgt - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                DEBUG_PRINT_L3( "Bd0> Single Mode: Dir2 [%d, %d] (Speed: %d, %d)\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M1_RVS_CNTTH_U], I2C_cmd[I2C_CP_M2_SPEED]);
-                flg_exp_status |= 0x00600000;         
-                //flg_exp_status |= 0x00400000; // 0x00600000
-
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '1' ){
-                    motor1_current_pct = 999;
-                }
-                else{
-                    motor1_current_pct = I2C_res[0];
-                }
-                if( motorLock_sts == '2' ){
-                    motor2_current_pct = 999;
-                }
-                else{
-                    motor2_current_pct = I2C_res[1];
-                }
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if(
-                ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu ) &&
-                ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50) && 
-                ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50) &&
-                ( baseOperation.sv_WinchValid == 0)
-            ){                
-                flg_ButtonOn = true;
-                led3 = 1;        
-                if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 Rvs
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 Rvs
-                }
-                else{
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 Rvs
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 Rvs
-                }             
-                I2C_cmd[I2C_CP_M1_SPEED] = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100; // Speed
-                I2C_cmd[I2C_CP_M2_SPEED] = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                DEBUG_PRINT_L3( "Bd0> Single Mode: Dir3 [%d, %d] (Speed: %d, %d)\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M1_RVS_CNTTH_U], I2C_cmd[I2C_CP_M2_SPEED]);
-                flg_exp_status |= 0x00A00000;         
-                //flg_exp_status |= 0x00800000; // 0x00A00000
-                // Read motor current from target
-
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '1' ){
-                    motor1_current_pct = 999;
-                }
-                else{
-                    motor1_current_pct = I2C_res[0];
-                }
-                if( motorLock_sts == '2' ){
-                    motor2_current_pct = 999;
-                }
-                else{
-                    motor2_current_pct = I2C_res[1];
-                }
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            else if(
-                ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzu ) && 
-                ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50) && 
-                ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50) &&
-                ( baseOperation.sv_WinchValid == 0)
-            ){                
-                flg_ButtonOn = true;
-                led3 = 1;
-                if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 Reverse
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor1 Reverse
-                }
-                else{
-                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 Fwd
-                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 Rvs
-                }
-                I2C_cmd[I2C_CP_M1_SPEED] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSLftRgt ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100; // Speed
-                I2C_cmd[I2C_CP_M2_SPEED] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSLftRgt ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                DEBUG_PRINT_L3( "Bd0> Single Mode: Dir4 [%d, %d] (Speed: %d, %d)\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M1_RVS_CNTTH_U], I2C_cmd[I2C_CP_M2_SPEED]);
-                flg_exp_status |= 0x00900000;         
-                //flg_exp_status |= 0x00800000; // 0x00900000
-
-                // Read motor current from target
-                read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_readcmd, I2C_res, 5 ); 
-                motorLock_sts = I2C_res[4];
-                if( motorLock_sts == '1' ){
-                    motor1_current_pct = 999;
-                }
-                else{
-                    motor1_current_pct = I2C_res[0];
-                }
-                if( motorLock_sts == '2' ){
-                    motor2_current_pct = 999;
-                }
-                else{
-                    motor2_current_pct = I2C_res[1];
-                }
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-                DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                flg_ButtonOn = false;
-            }
-            // ====================================
-            // ALL motor off commmand packet send
-            // ====================================   
-            else if (baseOperation.sv_WinchValid==0) {
-                led3 = 0;
-        #ifdef __IIC_COMAMND_SEND__
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;     // Motor1 Fwd
-                I2C_cmd[I2C_CP_M1_SPEED] = 0;             // Speed=0
-                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;     // Motor2 Rvs
-                I2C_cmd[I2C_CP_M2_SPEED] = 0;             // Speed=0  
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-        //        Thread::wait(5);
-        #endif
-                flg_exp_status &= 0xFF0FFFFF;
-         //       I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = setValue.crawlerCtrl.sv_RFCM_ith_F;
-         //       I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = setValue.crawlerCtrl.sv_RFCM_ith_R;
-         //       I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = setValue.crawlerCtrl.sv_LBCM_ith_F;
-        //        I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = setValue.crawlerCtrl.sv_LBCM_ith_R;
-            }
-        }
-
-        /*
-         * ====================================
-         *  Winch Motor Control
-         *
-         *  7 6 5 4 3 2 1 0
-         * +-+-+-+-+-+-+-+-+
-         * |x|o|x|x|x|x|x|x|  1: W Down, 2: W Up, 4: -, 8: -
-         * +-+-+-+-+-+-+-+-+
-         */
-        if ((btnStatus_WDN == btnID_WDN) && (baseOperation.sv_WinchValid == 1)){ // Winch Down (FWD)
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN W-DN(Fwd)\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
-            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_F; // Speed
-            // I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 FWD
-            // I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_hsrto_F; // Speed
-    #endif
-            flg_exp_status |= 0x01000000;
-
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        } 
-        else if (( btnStatus_WUP == btnID_WUP ) && (baseOperation.sv_WinchValid == 1)) { // Winch Up (Rvs)
-            flg_ButtonOn = true;
-            DEBUG_PRINT_L3( "Bd0> BTN W-UP(Rvs)\r\n" ); 
-            led3 = 1;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 RVS
-            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_R; // Speed
-            // I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 RVS
-            // I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_hsrto_R; // Speed
-    #endif
-            flg_exp_status |= 0x02000000;
-
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            flg_ButtonOn = false;
-        }
-        // ====================================
-        // ALL motor off commmand packet send
-        // ====================================   
-        else if (baseOperation.sv_WinchValid == 1){
-            led3 = 0;
-    #ifdef __IIC_COMAMND_SEND__
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
-            I2C_cmd[I2C_CP_M1_SPEED] = 0;
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
-            I2C_cmd[I2C_CP_M2_SPEED] = 0;
-            Thread::wait(5);
-    #endif
-            flg_exp_status &= 0xF0FFFFFF;
-
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_R & 0xFF );
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_F >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_F & 0xFF );
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_R >> 8 ) & 0xFF;
-            I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_R & 0xFF );
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
-        }
-    }
-}    
-
-uint32_t getc_fromHost( uint8_t *c ){
-    
-    uint32_t rts = 0;
-    
-    if(pc.readable()){
-        *c = pc.getc();
-        rts = 0;
-    }
-    else{
-         rts = 1;
-    }
-    return rts;  
-}
-
-// **************************************************************
-//  TASK: Hoat Interface Task
-//
-// **************************************************************
-int first_counter = 0;
-void clientPC_interface_task(void const *)
-{
-    int rcv_data_cnt;
-    //winchData_t winchData;
-    
-    char I2C_readcmd[NumberOfI2CCommand+1] = "#010000";
-    
-//    winchData_t winchData;
-//    int16_t winchCurrentPosition;
-    int16_t winchTempPosition;
-    
-    int cnt = 0;
-    
-    while(1){
-
-    //  DEBUG_PRINT("\r\nWaiting for UDP packet...\r\n");
-        rcv_data_cnt = udp_server.receiveFrom(client, dbuffer, sizeof(dbuffer));
-        Thread::wait(10); 
-        if( rcv_data_cnt < 0 ){
-            DEBUG_PRINT_L0("Bd0> ## Receive packet fail ##\r\n");
-        }
-        else{
-            dbuffer[rcv_data_cnt] = '\0';
-            led4 = 1;
-
-            if(!strcmp( dbuffer, "Hello Z\r\n" )){
-                DEBUG_PRINT_L2("Bd0> Hello Z Packet received from client by UDP\n");
-                char snd_data[] = "Hello I'm CrExoB2";
-                udp_server.sendTo(client, snd_data, sizeof(snd_data));
-                Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-            }
-            else if(!strcmp( dbuffer, "status\r\n")){
-                DEBUG_PRINT_L2("Bd0> Hello Status req received from client by UDP\r\n");
-                strcpy(dbuffer,"XXXX\r\n");
-                udp_server.sendTo(client, dbuffer, sizeof(dbuffer));
-                Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-            }
-            else if(!strcmp( dbuffer, "set_jss")){   // Single JS mode
-                baseOperation.sv_JS_OpeMode = 0;
-            }
-            else if(!strcmp( dbuffer, "set_jsd")){   // Dual JS mode
-                baseOperation.sv_JS_OpeMode = 1;
-            }
-            else if(!strcmp( dbuffer, "lsw_valid")){   // Limit swich detection valid
-                flg_lsw_valid = true;
-            }
-            else if(!strcmp( dbuffer, "lsw_invalid")){   // Limit swich detection invalid
-                flg_lsw_valid = false;
-            }
-            else if(!strcmp( dbuffer, "Hello")){
-                DEBUG_PRINT_L2( "Bd0> Hello Packet received from [ 0x%02x ]\r\n", flg_exp_status );
-                
-                /* ***************************************** */
-                /* Read Winch Current Position from Resolver */
-                /* ***************************************** */
-                if (baseOperation.sv_WinchValid == 1){ // read winch current position operation is valid in case of winch part is valid.
-                    winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                    if( winchTempPosition != -1 ){
-                        mtx_wcp.lock();
-                        winchCurrentPosition = winchTempPosition;
-                        mtx_wcp.unlock();
-                    }
-                }
-                Thread::wait(10); 
-               
-                first_counter++;
-                if( first_counter > 10 ) {
-                    sprintf( dbuffer,"OFF_ %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts); // Winch down
-                    first_counter = 10;
-                }
-                else{
-                    sprintf( dbuffer,"JSMD %03d %03d 0000 000\0", baseOperation.sv_JS_ShapeMode, baseOperation.sv_WinchValid );    
-                }
-                // -------------------------------------
-                // Crawler Moving
-                // -------------------------------------
-                if( flg_exp_status & 0x00F00000 ){
-                    // Forward move    5
-                    // Reverce move    a
-                    // Right rotation  6
-                    // Left rotation   9
-                    
-                    if((flg_exp_status & 0x00F00000) == 0x00500000 ){
-                        //                 01234 5678 9012 34569
-                        sprintf( dbuffer, "BCFW %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                       Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00a00000 ){ 
-                        sprintf( dbuffer, "BCRV %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00600000 ){ 
-                        sprintf( dbuffer, "BCRR %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00900000 ){ 
-                        sprintf( dbuffer, "BCLR %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00800000 ){ 
-                        sprintf( dbuffer, "LCRV %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00400000 ){
-                        sprintf( dbuffer, "LCFW %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00200000 ){
-                        sprintf( dbuffer, "RCRV %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    else if((flg_exp_status & 0x00F00000) == 0x00100000 ){
-                        sprintf( dbuffer, "RCFW %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
-                        Thread::wait(10); 
-                    } 
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    pc.printf("\t\t\t S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                // -------------------------------------
-                // Transform 
-                // -------------------------------------
-                else if( flg_exp_status & 0x20000000 ){
-                    sprintf(dbuffer,"RF2I %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // RF Crawler Tfm I 
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    pc.printf("\t\t\t S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                else if( flg_exp_status & 0x10000000 ){
-                    sprintf(dbuffer,"RF2K %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // RF Crawler Tfm K
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                else if( flg_exp_status & 0x80000000 ){
-                    sprintf(dbuffer,"LB2I %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // LB Crawler Tfm I
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                else if( flg_exp_status & 0x40000000 ){
-                    sprintf(dbuffer,"LB2K %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // LB Crawler Tfm K
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                // -------------------------------------
-                // Winch Moving
-                // -------------------------------------
-                else if( flg_exp_status & 0x01000000 ){ // Wincd down (FWD)
-                    sprintf(dbuffer,"WCDN %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // Winch down
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                else if( flg_exp_status & 0x02000000 ){ // Winch up (RVS)
-                    sprintf(dbuffer,"WCUP %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // Winch down
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                else if( flg_exp_status & 0x0000000f ){
-                    if( cnt == 3 ){
-                        sprintf( dbuffer,"JSMD %03d %03d 0000 000\0", baseOperation.sv_JS_ShapeMode, baseOperation.sv_WinchValid );
-                        cnt = 0;
-                    }
-                    else{
-                        sprintf( dbuffer,"OFF_ %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // Winch down
-                    }
-                    cnt++;
-                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                else{
-                    sprintf( dbuffer,"OFF_ %03d %03d %04d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition ); // Winch down
-                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
-                }
-                /* Send data to client PC */
-                udp_server.sendTo(client, dbuffer,  sizeof(dbuffer));
-                Thread::wait(10); 
-
-                // ----------------------------------------------------------------------------
-                // Read target(transform controller) status in each time.
-                read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_readcmd, I2C_res, 4 );                 
-                motor1_current_pct = I2C_res[0];
-                motor2_current_pct = I2C_res[1];
-                limitSw_Sts = I2C_res[3];
-            //    DEBUG_PRINT_L2( "Bd0> X: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
-            //    DEBUG_PRINT_L2( "Bd0> X: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
-            //    DEBUG_PRINT_L2( "Bd0> X: Limit switch status (0x%02x)%\r\n", limitSw_Sts );
-                // ----------------------------------------------------------------------------
-                
-            }
-        }
-    //    Thread::wait(100);  // When this period seto to short time, gamepad command can not get. 50msec OK
-        led4 = 0;
-    //    Thread::wait(100);  // When this period seto to short time, gamepad command can not get. 50msec OK
-    }        
-}
-
-// **************************************************************
-//  TASK: GamaPad Task
-//
-// **************************************************************
-void gamepad_task(void const *)
-{
-    
-    char I2C_cmd[NumberOfI2CCommand+1] = "#010000000";
-    
-//    int counter = 0;
-    // USB HOST GAMEPAD
-    USBHostGamepad gamepad;
-    
-    led1 = 1;
-
-    while(1) {
-
-        // try to connect a USB Gamepad
-        while(!gamepad.connect()) {
-            flg_gamePad_Connected = 0;
-            led2 = OFF;
-        //    led1 = 1;
-            Thread::wait(500);
-        }
-
-        // when connected, attach handler called on gamepad event
-        gamepad.attachEvent(onControl);
-
-        // wait until the Gamepad is disconnected
-        while(gamepad.connected()) {
-            flg_gamePad_Connected = 1;
-            led2 = !led2;
-            led2 = ON;
-        //    led1 = 1;   
-
-            // Send status to Handy Ctrl controller, but currently this is only for Main Controller.
-            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = 0x00;
-            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = 0x01;
-            i2c.write(I2C_ADDRESS_HANDY, I2C_cmd, NumberOfI2CCommand);
-            // DEBUG_PRINT_L2("Bd0> Send Handy Controller(%02x) >>>>>>>>>>\r\n",I2C_ADDRESS_HANDY );
-                
-            Thread::wait(500);
-        }
-    }
-}
-
-// ======================================================================
-// Read setting value from lpcal file system of mbed
-// ======================================================================
-
-bool read_LFS( setValue_t* setValue ){
-    FILE    *fp;
-    char    *fname = "/local/set.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,"%04d",&data);setValue->winchCtrl.sv_WDM_ith_F=data; pc.printf("%04d",setValue->winchCtrl.sv_WDM_ith_F); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WDM_ith_R=data; pc.printf("%04d",setValue->winchCtrl.sv_WDM_ith_R); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WRM_ith_F=data; pc.printf("%04d",setValue->winchCtrl.sv_WRM_ith_F); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WRM_ith_R=data; pc.printf("%04d",setValue->winchCtrl.sv_WRM_ith_R); fgets(s,100,fp); pc.printf("%s",s);
-    
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_hsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_hsrto_F); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_hsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_hsrto_R); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_lsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_lsrto_F); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_lsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_lsrto_R); fgets(s,100,fp); pc.printf("%s",s);
-    
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_hsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_hsrto_F); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_hsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_hsrto_R); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_lsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_lsrto_F); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_lsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_lsrto_R); fgets(s,100,fp); pc.printf("%s",s);
-    
-            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WRS_DramDmrx100=data;   pc.printf("%04d",setValue->winchCtrl.sv_WRS_DramDmrx100);   fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WRS_CCableDmrx100=data; pc.printf("%04d",setValue->winchCtrl.sv_WRS_CCableDmrx100); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRS_RResolution=data;   pc.printf("%03d",setValue->winchCtrl.sv_WRS_RResolution);   fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->winchCtrl.reserved=data;             pc.printf("%03d",setValue->winchCtrl.reserved);             fgets(s,100,fp); pc.printf("%s",s);
-    
-            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_RFTM_ith_F=data;  pc.printf("%04d",setValue->tfmCtrl.sv_RFTM_ith_F);  fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_RFTM_ith_R=data;  pc.printf("%04d",setValue->tfmCtrl.sv_RFTM_ith_R);  fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_LBTM_ith_F=data;  pc.printf("%04d",setValue->tfmCtrl.sv_LBTM_ith_F);  fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_LBTM_ith_R=data;  pc.printf("%04d",setValue->tfmCtrl.sv_LBTM_ith_R);  fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_RFTM_srto_F=data; pc.printf("%03d",setValue->tfmCtrl.sv_RFTM_srto_F); fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_RFTM_srto_R=data; pc.printf("%03d",setValue->tfmCtrl.sv_RFTM_srto_R); fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_LBTM_srto_F=data; pc.printf("%03d",setValue->tfmCtrl.sv_LBTM_srto_F); fgets(s, 100, fp ); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_LBTM_srto_R=data; pc.printf("%03d",setValue->tfmCtrl.sv_LBTM_srto_R); fgets(s, 100, fp ); pc.printf("%s",s);
-                
-            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_RFCM_ith_F=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_RFCM_ith_F); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_RFCM_ith_R=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_RFCM_ith_R); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_LBCM_ith_F=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_LBCM_ith_F); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_LBCM_ith_R=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_LBCM_ith_R); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_srto_F=data; pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_srto_F); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_srto_R=data; pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_srto_R); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_srto_F=data; pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_srto_F); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_srto_R=data; pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_srto_R); fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_dzu=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_dzu);  fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_dzc=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_dzc);  fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_dzl=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_dzl);  fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_dzu=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_dzu);  fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_dzc=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_dzc);  fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_dzl=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_dzl);  fgets(s,100,fp); pc.printf("%s",s );
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.reserved1=data;      pc.printf("%03d",setValue->crawlerCtrl.reserved1); fgets(s,100,fp); pc.printf("%s",s);
-            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.reserved2=data;      pc.printf("%03d",setValue->crawlerCtrl.reserved2); 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;   
-}
-
-bool write_LFS( setValue_t* setValue ){
-    FILE    *fp;
-    char    *fname = "/local/set.txt";
-    bool    rts = true; 
-  
-    pc.printf("write setting data to setting file \r\n ");
-
-    fp = fopen(fname, "w");  // Open "out.txt" on the local file system for writing
-    if( fp != NULL ){ 
-        fprintf(fp, "#### B2 DebrisServayor Setting ####\n");
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (0)\r\n");
-    }
-    Thread::wait(50);
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %04d #WDM F-C th\n", setValue->winchCtrl.sv_WDM_ith_F);
-        fprintf(fp, "%04d #WDM F-C th\n", setValue->winchCtrl.sv_WDM_ith_F);
-        pc.printf("Writing ... %04d #WDM R-C th\n", setValue->winchCtrl.sv_WDM_ith_R);
-        fprintf(fp, "%04d #WDM R-C th\n", setValue->winchCtrl.sv_WDM_ith_R);
-        pc.printf("Writing ... %04d #WM2 F-C th\n", setValue->winchCtrl.sv_WRM_ith_F);
-        fprintf(fp, "%04d #WM2 F-C th\n", setValue->winchCtrl.sv_WRM_ith_F);
-        pc.printf("Writing ... %04d #WM2 R-C th\n", setValue->winchCtrl.sv_WRM_ith_R);
-        fprintf(fp, "%04d #WM2 R-C th\n", setValue->winchCtrl.sv_WRM_ith_R);
-        fclose(fp);
-    }
-    else{
-        pc.printf("File open error (1)\r\n");
-    }
-    Thread::wait(50);
-
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %03d #WDM F-HS\n", setValue->winchCtrl.sv_WDM_hsrto_F);
-        fprintf(fp, "%03d #WDM F-HS\n", setValue->winchCtrl.sv_WDM_hsrto_F);
-        pc.printf("Writing ... %03d #WDM R-HS\n", setValue->winchCtrl.sv_WDM_hsrto_R);
-        fprintf(fp, "%03d #WDM R-HS\n", setValue->winchCtrl.sv_WDM_hsrto_R);
-        pc.printf("Writing ... %03d #WDM F-LS\n", setValue->winchCtrl.sv_WDM_lsrto_F);
-        fprintf(fp, "%03d #WDM F-LS\n", setValue->winchCtrl.sv_WDM_lsrto_F);
-        pc.printf("Writing ... %03d #WDM R-LS\n", setValue->winchCtrl.sv_WDM_lsrto_R);
-        fprintf(fp, "%03d #WDM R-LS\n", setValue->winchCtrl.sv_WDM_lsrto_R);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (2)\r\n");
-    }
-    Thread::wait(50);
-    
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %03d #WM2 F-HS\n", setValue->winchCtrl.sv_WRM_hsrto_F);
-        fprintf(fp, "%03d #WM2 F-HS\n", setValue->winchCtrl.sv_WRM_hsrto_F);
-        pc.printf("Writing ... %03d #WM2 R-HS\n", setValue->winchCtrl.sv_WRM_hsrto_R);
-        fprintf(fp, "%03d #WM2 R-HS\n", setValue->winchCtrl.sv_WRM_hsrto_R);
-        pc.printf("Writing ... %03d #WM2 F-LS\n", setValue->winchCtrl.sv_WRM_lsrto_F);
-        fprintf(fp, "%03d #WM2 F-LS\n", setValue->winchCtrl.sv_WRM_lsrto_F);
-        pc.printf("Writing ... %03d #WM2 R-LS\n", setValue->winchCtrl.sv_WRM_lsrto_R);
-        fprintf(fp, "%03d #WM2 R-LS\n", setValue->winchCtrl.sv_WRM_lsrto_R);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (3)\r\n");
-    }
-    Thread::wait(50);
-    
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %04d #WD D-DMx100\n", setValue->winchCtrl.sv_WRS_DramDmrx100);
-        fprintf(fp, "%04d #WD D-DMx100\n", setValue->winchCtrl.sv_WRS_DramDmrx100);
-        pc.printf("Writing ... %04d #WCC Dx100\n", setValue->winchCtrl.sv_WRS_CCableDmrx100);
-        fprintf(fp, "%04d #WCC Dx100\n", setValue->winchCtrl.sv_WRS_CCableDmrx100);
-        pc.printf("Writing ... %03d #R-Res\n", setValue->winchCtrl.sv_WRS_RResolution);
-        fprintf(fp, "%03d #R-Res\n", setValue->winchCtrl.sv_WRS_RResolution);
-        pc.printf("Writing ... %03d #Res\n", setValue->winchCtrl.reserved);
-        fprintf(fp, "%03d #res\n", setValue->winchCtrl.reserved);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (4)\r\n");
-    }
-    Thread::wait(50);
-    
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %04d #R-TFM F-C\n", setValue->tfmCtrl.sv_RFTM_ith_F);
-        fprintf(fp, "%04d #R-TFM F-C\n", setValue->tfmCtrl.sv_RFTM_ith_F);
-        pc.printf("Writing ... %04d #R-TFM R-C\n", setValue->tfmCtrl.sv_RFTM_ith_R);
-        fprintf(fp, "%04d #R-TFM R-C\n", setValue->tfmCtrl.sv_RFTM_ith_R);
-        pc.printf("Writing ... %04d #L-TFM F-C\n", setValue->tfmCtrl.sv_LBTM_ith_F);;
-        fprintf(fp, "%04d #L-TFM F-C\n", setValue->tfmCtrl.sv_LBTM_ith_F);;
-        pc.printf("Writing ... %04d #L-TFM R-C\n", setValue->tfmCtrl.sv_LBTM_ith_R);
-        fprintf(fp, "%04d #L-TFM R-C\n", setValue->tfmCtrl.sv_LBTM_ith_R);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (5)\r\n");
-    }
-    Thread::wait(50);
-
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %03d #R-TFM F-S\n", setValue->tfmCtrl.sv_RFTM_srto_F);
-        fprintf(fp, "%03d #R-TFM F-S\n", setValue->tfmCtrl.sv_RFTM_srto_F);
-        pc.printf("Writing ... %03d #R-TFM R-S\n", setValue->tfmCtrl.sv_RFTM_srto_R);
-        fprintf(fp, "%03d #R-TFM R-S\n", setValue->tfmCtrl.sv_RFTM_srto_R);
-        pc.printf("Writing ... %03d #L-TFM F-S\n", setValue->tfmCtrl.sv_LBTM_srto_F);
-        fprintf(fp, "%03d #L-TFM F-S\n", setValue->tfmCtrl.sv_LBTM_srto_F);
-        pc.printf("Writing ... %03d #L-TFM R-S\n", setValue->tfmCtrl.sv_LBTM_srto_R);
-        fprintf(fp, "%03d #L-TFM R-S\n", setValue->tfmCtrl.sv_LBTM_srto_R);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (6)\r\n");
-    }
-    Thread::wait(50);
-
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %04d #RC F-C th\n", setValue->crawlerCtrl.sv_RFCM_ith_F);
-        fprintf(fp, "%04d #RC F-C th\n", setValue->crawlerCtrl.sv_RFCM_ith_F);
-        pc.printf("Writing ... %04d #RC R-C th\n", setValue->crawlerCtrl.sv_RFCM_ith_R);
-        fprintf(fp, "%04d #RC R-C th\n", setValue->crawlerCtrl.sv_RFCM_ith_R);
-        pc.printf("Writing ... %04d #LC F-C th\n", setValue->crawlerCtrl.sv_LBCM_ith_F);
-        fprintf(fp, "%04d #LC F-C th\n", setValue->crawlerCtrl.sv_LBCM_ith_F);
-        pc.printf("Writing ... %04d #LC R-C th\n", setValue->crawlerCtrl.sv_LBCM_ith_R);
-        fprintf(fp, "%04d #LC R-C th\n", setValue->crawlerCtrl.sv_LBCM_ith_R);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (7)\r\n");
-    }
-    Thread::wait(50);
-
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %03d #RC F-S\n", setValue->crawlerCtrl.sv_RFCM_srto_F);
-        fprintf(fp, "%03d #RC F-S\n", setValue->crawlerCtrl.sv_RFCM_srto_F);
-        pc.printf("Writing ... %03d #RC R-S\n", setValue->crawlerCtrl.sv_RFCM_srto_R); 
-        fprintf(fp, "%03d #RC R-S\n", setValue->crawlerCtrl.sv_RFCM_srto_R); 
-        pc.printf("Writing ... %03d #LC F-S\n", setValue->crawlerCtrl.sv_LBCM_srto_F);
-        fprintf(fp, "%03d #LC F-S\n", setValue->crawlerCtrl.sv_LBCM_srto_F);
-        pc.printf("Writing ... %03d #LC R-S\n", setValue->crawlerCtrl.sv_LBCM_srto_R);
-        fprintf(fp, "%03d #LC R-S\n", setValue->crawlerCtrl.sv_LBCM_srto_R);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (8)\r\n");
-    }
-
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %03d #RJS U\n", setValue->crawlerCtrl.sv_RFCM_dzu);
-        fprintf(fp, "%03d #RJS U\n", setValue->crawlerCtrl.sv_RFCM_dzu);
-        pc.printf("Writing ... %03d #RJS C\n", setValue->crawlerCtrl.sv_RFCM_dzc);
-        fprintf(fp, "%03d #RJS C\n", setValue->crawlerCtrl.sv_RFCM_dzc);
-        pc.printf("Writing ... %03d #RJS L\n", setValue->crawlerCtrl.sv_RFCM_dzl);
-        fprintf(fp, "%03d #RJS L\n", setValue->crawlerCtrl.sv_RFCM_dzl);
-        pc.printf("Writing ... %03d #LJS U\n", setValue->crawlerCtrl.sv_LBCM_dzu);
-        fprintf(fp, "%03d #LJS U\n", setValue->crawlerCtrl.sv_LBCM_dzu);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (9)\r\n");
-    }
-
-    fp = fopen(fname, "a");  // Open "out.txt" on the local file system for writing    
-    if( fp != NULL ){ 
-        pc.printf("Writing ... %03d #LJS C\n", setValue->crawlerCtrl.sv_LBCM_dzc);
-        fprintf(fp, "%03d #LJS C\n", setValue->crawlerCtrl.sv_LBCM_dzc);
-        pc.printf("Writing ... %03d #LJS L\n", setValue->crawlerCtrl.sv_LBCM_dzl);
-        fprintf(fp, "%03d #LJS L\n", setValue->crawlerCtrl.sv_LBCM_dzl);
-        pc.printf("Writing ... %03d #res\n", setValue->crawlerCtrl.reserved1);
-        fprintf(fp, "%03d #res\n", setValue->crawlerCtrl.reserved1);
-        pc.printf("Writing ... %03d #res\n", setValue->crawlerCtrl.reserved2);
-        fprintf(fp, "%03d #res\n", setValue->crawlerCtrl.reserved2);
-        fclose(fp);
-    }
-    else{
-        rts = false;
-        pc.printf("File open error (10)\r\n");
-    }
-
-    pc.printf("settig file write completed \r\n ");
-
-
-    return rts;
-}
-
-// ======================================================================
-// Read Network setting value from lpcal file system of mbed
-// ======================================================================
-int read_NetSetting_lfs( char* ip_address, char* subnet_mask, char* gateway )
-{
-    FILE *rfp;
-
-    DEBUG_PRINT_L3("Bd0> Read Network Setting data from local file system \r\n");
-    rfp = fopen("/local/net.txt", "r");  // Open local file "set.txt" for writing
-    if(!rfp){
-        DEBUG_PRINT_L3("Bd0> **!!local file open error!!**\r\n");
-        return _FAIL_;
-    }
-    else{
-        Thread::wait(50);
-        fscanf(rfp, "%s", ip_address);
-        fscanf(rfp, "%s", subnet_mask);
-        fscanf(rfp, "%s", gateway);
-        fclose(rfp);
-        return _OK_;
-    }     
-}
-// ======================================================================
-// Winch control function
-// ======================================================================
-void winchMovingControl(
-    int             mode,           // Operationg mode: Relative / Abslute
-    char*           dbufferP,       // Date buffer pointer
-    int             dbuffer_s,      // Date buffer size
-    winchData_t*    winchDataP,     // Winch data structure pointer
-    int             winchData_s,     // Winch data structure size
-    char*           I2C_cmd
-){  
-    int rcv_data_cnt;
-//    int moving_data;
-    int man_speed;
-    
-    int cnt;
-    
-    
-    bool flg_stop_operation = false;
-
-    int16_t winchTempPosition;
-
-    char I2C_read[NumberOfI2CCommand+1];
-    char I2C_readcmd[NumberOfI2CCommand+1];
-    
-//    if (hwbtn_Opeflg == 1){
-//        Thread::wait(1);
-//    }
-//    else{
-        
-        
-        if( flg_ButtonOn == true ) {Thread::wait(2);}
-        
-        I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = setValue.crawlerCtrl.sv_RFCM_ith_F;
-        I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = setValue.crawlerCtrl.sv_RFCM_ith_R;
-        I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = setValue.crawlerCtrl.sv_LBCM_ith_F;
-        I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = setValue.crawlerCtrl.sv_LBCM_ith_R;
-            
-        if( mode == WINCH_POSITION_CLEAR ){
-            led3 = ON;                      
-            DEBUG_PRINT_L3("Bd0> === WINCH_POSITION_CLEAR ===\r\n");
-            rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
-            DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
-            if( rcv_data_cnt < 0 ){
-                DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
-            //    tcp_client.send( (char*)winchDataP, winchData_s);
-            //    break;
-            }
-            else{
-                DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
-            //    if( !strcmp( dbuffer, "WinchStepDnOf" ) ){
-            //        break;
-            //    }
-            }
-
-            I2C_cmd[I2C_CP_COMMAND] = 'Z';   // Zero clear
-            i2c.write(I2C_ADDRESS_RESOLVER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-            led3 = OFF;
-        }
-        else if (( mode == WINCH_MMODE_RELATIVE ) || ( mode == WINCH_MMODE_ABSOLUTE )){
-            if ( mode == WINCH_MMODE_RELATIVE ) DEBUG_PRINT_L3("Bd0> === WINCH_MMODE_RELATIVE === \r\n");
-            if ( mode == WINCH_MMODE_ABSOLUTE ) DEBUG_PRINT_L3("Bd0> === WINCH_MMODE_ABSOLUTE === \r\n");
-            
-            rcv_data_cnt = tcp_client.receive( dbuffer, dbuffer_s);
-            
-            *(dbufferP+rcv_data_cnt) = '\0';
-            winchDataP->operation = '\r\n';
-                
-            DEBUG_PRINT_L3("Bd0> TCP Rcv data count is [%d]\r\n", rcv_data_cnt );
-            // Copy received data to Winch data structure.
-            memcpy( winchDataP, (winchData_t *)dbuffer, winchData_s);
-         //   winchDataP->dt_WinchDstPosition += winchDataP->dt_WinchCntPosition; 
-            DEBUG_PRINT_L3("Bd0> Winch Rtv Move [ From %04d >>> To %04d ]\r\n", winchDataP->dt_WinchCntPosition, winchDataP->dt_WinchDstPosition );
-
-            swbtn_OpeMutex.lock();
-            swbtn_Opeflg = 1;
-            swbtn_OpeMutex.unlock();
-            
-            cnt = 0;
-            
-            while( true ){        
-                while( true ){
-                    led3 = ON;
-                    ////winchDataP->dt_WinchCntPosition = res_position;    // Current position.
-
-                    DEBUG_PRINT_L3("Bd0> == Winch Position ==============\r\n");        
-                    DEBUG_PRINT_L3("Bd0>  CURRENT    : %d\r\n", winchDataP->dt_WinchCntPosition );
-                    DEBUG_PRINT_L3("Bd0>  DESTINATION: %d\r\n", winchDataP->dt_WinchDstPosition );
-                    DEBUG_PRINT_L3("Bd0> ================================\r\n");        
-
-                    tcp_client.send( (char*)winchDataP, winchData_s);
-                    DEBUG_PRINT_L3("Bd0> Send Winch Rtv data [ %04d >>>> %04d ]\r\n", winchDataP->dt_WinchCntPosition, winchDataP->dt_WinchDstPosition );
-                    
-                    rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
-                    DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
-                    if( rcv_data_cnt < 0 ){
-                        DEBUG_PRINT_L3("##ERROR## Data receive\r\n" );
-
-                    //    tcp_client.send( (char*)winchDataP, winchData_s);
-                        break;
-                    }
-                    else{
-                        DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
-                        if( !strcmp( dbuffer, "WinchRtvStop" ) ){
-                            flg_stop_operation = true;
-                            break;
-                        }
-                    }
-                    // Forward rotation : winch down
-                    if( winchDataP->dt_WinchCntPosition < winchDataP->dt_WinchDstPosition ){
-                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
-                        if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_NEAR_DISTANCE ){
-                            I2C_cmd[I2C_CP_M1_SPEED] = (setValue.winchCtrl.sv_WDM_lsrto_F >> 1); // very slow speed
-                        }
-                        else if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_DISTANCE ){
-                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_lsrto_F; // slow speed
-                        }
-                        else{
-                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_F; // normal speed
-                        }              
-                    }
-                    // Reverse rotation : winch up
-                    else if ( winchDataP->dt_WinchCntPosition > winchDataP->dt_WinchDstPosition ){
-                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 RVS
-                        if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_NEAR_DISTANCE ){
-                            I2C_cmd[I2C_CP_M1_SPEED] = (setValue.winchCtrl.sv_WDM_lsrto_R >> 1); // very slow speed
-                        }
-                        else if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_DISTANCE ){
-                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_lsrto_R; // slow speed
-                        }
-                        else{
-                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_R; // normal speed
-                        }              
-                    }
-                           
-                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-                    // Read winch current position from Resolver.
-                    
-                    winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                    if( winchTempPosition != -1 ){
-                        mtx_wcp.lock();
-                        winchCurrentPosition = winchTempPosition;
-                        mtx_wcp.unlock();
-                    }
-                    mtx_wcp.lock();
-                    winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
-                    mtx_wcp.unlock();
-                    winchDataP->operation = 0x00;
-                    //i2c.read(I2C_ADDRESS_RESOLVER, I2C_resdata, 2); // Read
-                    //res_position = (I2C_resdata[1] << 8) | I2C_resdata[0]; 
-                    // --------------------------------------
-                    //  Read motor current             
-                    // --------------------------------------
-                    read_motorCurrent( I2C_ADDRESS_WINCH, I2C_readcmd, I2C_read, 3 );
-                    winchDataP->dt_WinchMotor1Current = I2C_read[0];     // Motor current set
-                    winchDataP->dt_WinchMotor2Current = I2C_read[1];     // Motor current set
-                    winchDataP->operation = I2C_read[2];
-                    DEBUG_PRINT_L3("Bd0> 15: ReadMotorCurrent (%d)%\r\n", winchDataP->dt_WinchMotor1Current ); 
-                    DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\r\n", I2C_ADDRESS_WINCH, I2C_read[0]);
-                    led3 = OFF; 
-                    if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) == 0 ){
-               //     if( winchDataP->dt_WinchCntPosition == winchDataP->dt_WinchDstPosition ){
-                        DEBUG_PRINT_L3( "Bd0> Current:%d -> Destination:%d\r\n" , winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition); 
-                        break;
-                    }                      
-                    Thread::wait(2);   // Time interval for program debugging    
-                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-                }
-                
-                
-                
-                DEBUG_PRINT_L3( "Bd0> ! Winch Stop\r\n" ); 
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;   // Motor1 STOP
-                I2C_cmd[I2C_CP_M1_SPEED] = 0;     // Speed
-                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;   // Motor2 STOP
-                I2C_cmd[I2C_CP_M2_SPEED] = 0;     // Speed
-
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-           //     Thread::wait(1000);   // Time interval for program debugging
-                
-                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                if( winchTempPosition != -1 ){
-                    mtx_wcp.lock();
-                    winchCurrentPosition = winchTempPosition;
-                    mtx_wcp.unlock();
-                }
-
-
-                mtx_wcp.lock();
-                winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
-                mtx_wcp.unlock();
-                winchDataP->operation = 0x00;
-                DEBUG_PRINT_L3("Bd0> Check destination is same to setting point or not: %d\r\n", winchCurrentPosition); 
-                if( winchDataP->dt_WinchDstPosition == winchCurrentPosition ){
-                    cnt++;
-                    DEBUG_PRINT_L3("Bd0> Destination is same to setting point, then stop operation\r\n" );
-                    winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                    if( winchTempPosition != -1 ){
-                        mtx_wcp.lock();
-                        winchCurrentPosition = winchTempPosition;
-                        mtx_wcp.unlock();
-                    }
-                    if ( cnt >= 5 ){
-                        break;  // When final destination == set point , then break. else adjust position again.
-                    }
-                }
-                // Force Stop by Stop button
-                if( flg_stop_operation == true ){
-                    DEBUG_PRINT_L3("Bd0> Winch auto operation force stop\r\n" );
-                    flg_stop_operation = false;
-                    break;
-                }
-            }
-/*            
-            Thread::wait(300);   // Time interval for program debugging   
-            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-            if( winchTempPosition != -1 ){
-                mtx_wcp.lock();
-                winchCurrentPosition = winchTempPosition;
-                mtx_wcp.unlock();
-            }
-            mtx_wcp.lock();            
-            winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
-            mtx_wcp.unlock();
-            winchDataP->operation = 0x00;
-            DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\r\n", winchDataP->dt_WinchCntPosition); 
-            tcp_client.send( (char*)winchDataP, winchData_s);
-                        
-            Thread::wait(300);   // Time interval for program debugging   
-            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-            if( winchTempPosition != -1 ){
-                mtx_wcp.lock();
-                winchCurrentPosition = winchTempPosition;
-                mtx_wcp.unlock();
-            }
-            mtx_wcp.lock();            
-            winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
-            mtx_wcp.unlock();
-            winchDataP->operation = 0x00;            
-            DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\r\n", winchDataP->dt_WinchCntPosition); 
-            tcp_client.send( (char*)winchDataP, winchData_s);
-*/
-            Thread::wait(300);   // Time interval for program debugging   
-            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-            if( winchTempPosition != -1 ){
-                mtx_wcp.lock();
-                winchCurrentPosition = winchTempPosition;
-                mtx_wcp.unlock();
-            }
-            mtx_wcp.lock();            
-            winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
-            mtx_wcp.unlock();
-            winchDataP->operation = 0x77;
-            DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\r\n", winchDataP->dt_WinchCntPosition); 
-            tcp_client.send( (char*)winchDataP, winchData_s);
-            
-            swbtn_OpeMutex.lock();
-            swbtn_Opeflg = 0;
-            swbtn_OpeMutex.unlock();
-            
-            led3 = OFF;     
-        }
-
-        // ----------------------------------------------------------
-        // In case of commad received from PC by TCP connection.
-        // In case of hard ware button pushed is by gamepad task
-        // ----------------------------------------------------------
-        else if (( mode == WINCH_STEPDOWN_BTN_ON )||( mode == WINCH_U_STEPDOWN_BTN_ON )) {
-            
-            if ( mode == WINCH_STEPDOWN_BTN_ON )    DEBUG_PRINT_L3( "Bd0> === WINCH_STEPDOWN_BTN_ON ===\r\n" );
-            if ( mode == WINCH_U_STEPDOWN_BTN_ON )  DEBUG_PRINT_L3( "Bd0> === WINCH_U_STEPDOWN_BTN_ON ===\r\n" );
-            
-            swbtn_OpeMutex.lock();
-            swbtn_Opeflg = 1;
-            swbtn_OpeMutex.unlock();
-            while( 1 ){
-                led3 = ON;                      
-                DEBUG_PRINT_L3("Bd0> WINCH_STEPDOWN_BTN_ON\r\n");
-                rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
-                DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
-                if( rcv_data_cnt < 0 ){
-                    DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
-                //    tcp_client.send( (char*)winchDataP, winchData_s);
-                    break;
-                }
-                else{
-                    DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
-                    if(( !strcmp( dbuffer, "WinchStepDnOf" ))||( !strcmp( dbuffer, "WinchuStepDnOf" )) ){
-                        break;
-                    }
-                }
-                
-                if ( mode == WINCH_U_STEPDOWN_BTN_ON ) man_speed = 50;
-                else man_speed = 100;
-
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
-                I2C_cmd[I2C_CP_M1_SPEED] = man_speed; // Speed
-
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-                led3 = OFF;   
-
-                read_motorCurrent( I2C_ADDRESS_WINCH, I2C_readcmd, I2C_read, 3 );
-                winchDataP->dt_WinchMotor1Current = I2C_read[0];
-                winchDataP->dt_WinchMotor2Current = I2C_read[1];
-                winchDataP->operation = I2C_read[2];    // This is motor lock status inform to PC.
-                DEBUG_PRINT_L3( "Bd0> 16: ReadMotorCurrent (%d)%\r\n", winchDataP->dt_WinchMotor1Current ); 
-                if( winchDataP->operation == 0x88 ){
-                   winchDataP->dt_WinchMotor1Current = 0xFF;
-                }
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-                            
-                DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\r\n", I2C_ADDRESS_WINCH, I2C_read[0]);
-                
-                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                if( winchTempPosition != -1 ){
-                    mtx_wcp.lock();
-                    winchCurrentPosition = winchTempPosition;
-                    mtx_wcp.unlock();
-                }
-                mtx_wcp.lock();
-                winchDataP->dt_WinchCntPosition = winchCurrentPosition;
-                mtx_wcp.unlock();
-                winchDataP->operation = 0x00;
-                // ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x00 );
-                tcp_client.send( (char*)winchDataP, winchData_s);
-                DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\r\n", winchCurrentPosition );
-            //    Thread::wait(2);   // Time interval for program debugging    
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-            }
-            DEBUG_PRINT_L3( "Bd0> Send Motor Stop by IIC\r\n" );
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 FWD
-            I2C_cmd[I2C_CP_M1_SPEED] = 0; // Speed
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor2 FWD
-            I2C_cmd[I2C_CP_M2_SPEED] = 0; // Speed
-                                            
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-            
-            DEBUG_PRINT_L3( "Bd0> Send 0x77 2 PC\r\n" );
-            
-            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-            if( winchTempPosition != -1 ){
-                mtx_wcp.lock();
-                winchCurrentPosition = winchTempPosition;
-                mtx_wcp.unlock();
-            }
-            mtx_wcp.lock();
-            winchDataP->dt_WinchCntPosition = winchCurrentPosition;
-            mtx_wcp.unlock();
-            winchDataP->operation = 0x77;
-            //ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x77 );
-            tcp_client.send( (char*)winchDataP, winchData_s);
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-            swbtn_OpeMutex.lock();
-            swbtn_Opeflg = 0;
-            swbtn_OpeMutex.unlock();
-            led3 = OFF;  
-        }
-        // ----------------------------------------------------------
-        // In case of commad received from PC by TCP connection.
-        // In case of hard ware button pushed is by gamepad task
-        // ----------------------------------------------------------
-        else if (( mode == WINCH_STEPUP_BTN_ON )||( mode == WINCH_U_STEPUP_BTN_ON )) {
-
-            if ( mode == WINCH_STEPUP_BTN_ON )  DEBUG_PRINT_L3( "Bd0> === WINCH_STEPUP_BTN_ON ===\r\n" );
-            if ( mode == WINCH_U_STEPUP_BTN_ON )    DEBUG_PRINT_L3( "Bd0> === WINCH_U_STEPUP_BTN_ON ===\r\n" );
-            
-            swbtn_OpeMutex.lock();
-            swbtn_Opeflg = 1;
-            swbtn_OpeMutex.unlock();
-            while( 1 ){
-                led3 = ON;                      
-                DEBUG_PRINT_L3("Bd0> WINCH_STEPUP_BTN_ON\r\n");
-                rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
-                DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
-                if( rcv_data_cnt < 0 ){
-                    DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
-                //    tcp_client.send( (char*)winchDataP, winchData_s);
-                    break;
-                }
-                else{
-                    DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
-                    if(
-                        ( !strcmp( dbuffer, "WinchStepUpOf" ))||(!strcmp( dbuffer, "WinchuStepUpOf" )) ){
-                        break;
-                    }
-                }
-                
-                if ( mode == WINCH_U_STEPUP_BTN_ON ) man_speed = 50;
-                else man_speed = 100;
-                
-                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 FWD
-                I2C_cmd[I2C_CP_M1_SPEED] = man_speed; // Speed
-
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-                led3 = OFF;
-                
-                read_motorCurrent( I2C_ADDRESS_WINCH, I2C_readcmd, I2C_read, 3 );
-                winchDataP->dt_WinchMotor1Current = I2C_read[0];
-                winchDataP->dt_WinchMotor2Current = I2C_read[1];
-                winchDataP->operation = I2C_read[2];    // This is motor lock status inform to PC.
-                DEBUG_PRINT_L3( "Bd0> 17: ReadMotorCurrent (%d)%\r\n", winchDataP->dt_WinchMotor1Current ); 
-                if( winchDataP->operation == 0x88 ){
-                    winchDataP->dt_WinchMotor1Current = 0xFF;
-                }            
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-                DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\r\n", I2C_ADDRESS_WINCH, I2C_read[0]);
-                
-                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                if( winchTempPosition != -1 ){
-                    mtx_wcp.lock();
-                    winchCurrentPosition = winchTempPosition;
-                    mtx_wcp.unlock();
-                }
-                mtx_wcp.lock();
-                winchDataP->dt_WinchCntPosition = winchCurrentPosition;
-                mtx_wcp.unlock();
-                winchDataP->operation = 0x00;
-                // ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x00 );
-                tcp_client.send( (char*)winchDataP, winchData_s);
-                DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\r\n", winchCurrentPosition );
-           //     Thread::wait(2);   // Time interval for program debugging    
-                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-            }
-            DEBUG_PRINT_L3( "Bd0> Send Motor Stop by IIC\r\n" );
-            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 FWD
-            I2C_cmd[I2C_CP_M1_SPEED] = 0; // Speed
-            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor2 FWD
-            I2C_cmd[I2C_CP_M2_SPEED] = 0; // Speed
-                                        
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-            DEBUG_PRINT_L3( "Bd0> Send 0x77 2 PC\r\n" );
-            if( flg_ButtonOn == false ){
-                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
-                if( winchTempPosition != -1 ){
-                    mtx_wcp.lock();
-                    winchCurrentPosition = winchTempPosition;
-                    mtx_wcp.unlock();
-                }
-                mtx_wcp.lock();
-                winchDataP->dt_WinchCntPosition = winchCurrentPosition;
-                mtx_wcp.unlock();
-                winchDataP->operation = 0x77;
-            // ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x77 );
-                tcp_client.send( (char*)winchDataP, winchData_s);
-            }
-            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-            
-            swbtn_OpeMutex.lock();
-            swbtn_Opeflg = 0;
-            swbtn_OpeMutex.unlock();
-                    
-            led3 = OFF;  
-        }
-
-        else {
-        //    DEBUG_PRINT_L3("STEPSTEPSTEPSTEPSTEP\r\n");
-        }
-//    }
-}
-
-// **********************************************************************
-//
-//    Main Function of this program
-//
-// **********************************************************************
-int main()
-{
-    Mutex           file_access_mutex;
-    setValue_t      new_setValue;      // Setting Data
-    winchData_t     winchData;
-
-    char I2C_cmd[NumberOfI2CCommand+1] = "#010000000";
-//    char I2C_res[NumberOfI2CCommand+1] = "\0";
-    
-    char ip_address[20];
-    char subnet_mask[20];
-    char gateway[20];
-
-//    char* ip_address;
-//    char* subnet_mask;
-//    char* gateway;
-    
-    int ret;
-    int try_cnt;
-    int rcv_data_cnt;
-
-    bool flg_ethernet = false;
-    
-    char ttt[20];
-    
-    // Set UART(USB) baudrate
-    pc.baud(115200);
-    
-    cf_led_demo( &led1, &led2, &led3, &led4, 10, 15 );
-
-    DEBUG_PRINT_L0("\r\n");
-    DEBUG_PRINT_L0("Bd0> +--------------------------------------------------------------\r\n");
-    DEBUG_PRINT_L0("Bd0> | Project: B2 Crawler Explorer for 1F-1 PCV internal inspection\r\n");
-    DEBUG_PRINT_L0("Bd0> |---------\r\n");
-    DEBUG_PRINT_L0("Bd0> | This is: Main Control Program of Main Controller\r\n");
-    DEBUG_PRINT_L0("Bd0> |   Target MCU: mbed LPC1768\r\n");
-    DEBUG_PRINT_L0("Bd0> |   Letest update: %s\r\n", LatestUpDate);
-    DEBUG_PRINT_L0("Bd0> |   Program Revision: %s\r\n", ProgramRevision);
-    DEBUG_PRINT_L0("Bd0> |   Author: %s\r\n", Author);
-    DEBUG_PRINT_L0("Bd0> |   Copyright(C) 2015 %s Allright Reserved\r\n", Company);
-    DEBUG_PRINT_L0("Bd0> ---------------------------------------------------------------\r\n");
-    sprintf( ttt, "%s", ProgramRevision );
-    
-    DEBUG_PRINT_L0("Bd0> Start ststem initializing ...\r\n");
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-    DEBUG_PRINT_L0("Bd0> 1. Initalizing Ethernet ...\r\n");    
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-    
-    read_NetSetting_lfs( ip_address, subnet_mask, gateway );
-    
-//    ip_address = "192.168.3.24";
-//    subnet_mask = "255.255.255.0";
-//    gateway = "192.168.3.1";
-    
-    DEBUG_PRINT_L0("Bd0> --------------------------------------\r\n");
-    DEBUG_PRINT_L0("Bd0> ip address     : %s\r\n", ip_address);
-    DEBUG_PRINT_L0("Bd0> subnet mask    : %s\r\n", subnet_mask);
-    DEBUG_PRINT_L0("Bd0> default gateway: %s\r\n", gateway);
-    DEBUG_PRINT_L0("Bd0> --------------------------------------\r\n");
-    
-#ifdef __ETERNET_DHCP__
-    ret = eth.init();   // Use DHCP
-#else // __ETERNET_DHCP__ 
-    ret = eth.init(   
-            ip_address,         // const char* ip, 
-            subnet_mask,     // const char* mask, 
-            gateway          // const char* gateway
-    );
-#endif // __ETERNET_DHCP__ 
-    if( ret == 0 ){
-        DEBUG_PRINT_L0("Bd0> Eternet init ... OK\r\n");
-        ret = eth.connect();
-        if( ret == 0 ){
-            cf_led_onoff( &led1,&led2,&led3,&led4, false, false, false, true );
-            DEBUG_PRINT_L0("Bd0> Eternat connect ... OK\r\n");    
-            DEBUG_PRINT_L0("Bd0> [ IP Address : %s ]\r\n", eth.getIPAddress());   
-            udp_server.bind(UDP_SERVER_PORT);
-            tcp_server.bind(TCP_SERVER_PORT);
-            tcp_server.listen();
-            flg_ethernet = true;
-            led4 = ON; // Ethernet OK
-        }
-        else{
-            cf_led_error( &led1,&led2,&led3,&led4 );         
-            DEBUG_PRINT_L0("Bd0> ***ERROR*** Eternat connect Fali\r\n");  
-        }
-    }
-    else{
-        DEBUG_PRINT_L0("Bd0> *** ERROR*** Eternat init Fail\r\n");  
-    }
-
-    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("Bd0> =============================================================\r\n");
-    DEBUG_PRINT_L0("Bd0> 2. Read setting value from LFS\r\n");
-    DEBUG_PRINT_L0("Bd0> =============================================================\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
-    // --------------------------------------------------------------------
-    try_cnt = LFS_READ_COUNT;
-    while( 1 ){   
-        if( read_LFS(&setValue) == true ) break;
-        else try_cnt -= 1;
-        if( try_cnt == 0 ){
-            DEBUG_PRINT_L0("Bd0> ***ERROR*** LFS read error\r\n");
-            while(1){
-                led1 = !led1;
-                Thread::wait(30);
-            }            
-        }
-    }
-
-    DEBUG_PRINT_L0("Bd0> LFS read OK\r\n");
-    led3 = ON;  // Setting Data Read OK
-
-#ifdef __TARGET_BOARD_CHECK__
-    //---------------------------------------------------
-    // Checking Targer LCXpresso824-MAX board here.
-    // Send Hello Packet and waiting reply message from
-    // target.
-    // When error occured, LED1 will blinking slowly.
-    //---------------------------------------------------
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-    DEBUG_PRINT_L0("Vd0> 3. Check the target controler\r\n");
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-
-    try_cnt = TARGET_CHECK_COUNT;
-    while(1){
-        // Check each target motor control 824 board here
-        i2c.read(I2C_ADDRESS_WINCH, I2C_res, NumberOfI2CCommand);
-        if( I2C_res[4] == 'S' ){
-            DEBUG_PRINT_L0("Bd0> Try count            : %02d/%02d\r\n", TARGET_CHECK_COUNT - try_cnt, TARGET_CHECK_COUNT );
-            DEBUG_PRINT_L0("Bd0> Return from (0x%02x) : '%c'\r\n", I2C_ADDRESS_WINCH, I2C_res[4]);
-            break;
-        }
-        else try_cnt -= 1;
-        if( try_cnt == 0 ){
-            DEBUG_PRINT_L0("Bd0> ##ERROR : Target(0x02)##\r\n",I2C_ADDRESS_WINCH);
-            led1 = OFF;
-            while(1){
-                led1 = !led1;       // ON
-                Thread::wait(80);
-            }            
-        }
-    }
-
-    try_cnt = TARGET_CHECK_COUNT;
-    while(1){
-        // Check each target motor control 824 board here
-        i2c.read(I2C_ADDRESS_TRANSFORM, I2C_res, NumberOfI2CCommand);
-        if( I2C_res[4] == 'S' ){
-            DEBUG_PRINT_L0("Bd0> Try count: %02d/%02d\r\n", TARGET_CHECK_COUNT - try_cnt, TARGET_CHECK_COUNT );
-            DEBUG_PRINT_L0("Bd0> Return from (0x%02x): '%c'\r\n", I2C_ADDRESS_TRANSFORM, I2C_res[4]);
-            break;
-        }
-        else try_cnt -= 1;
-        if( try_cnt == 0 ){
-            DEBUG_PRINT_L0("Bd0> ##ERROR : Target(0x02)##\r\n",I2C_ADDRESS_TRANSFORM);
-            led1 = OFF;
-            while(1){
-                led2 = !led2;       // ON
-                Thread::wait(80);
-            }            
-        }
-    }    
-    try_cnt = TARGET_CHECK_COUNT;
-    while(1){
-        // Check each target motor control 824 board here
-        i2c.read(I2C_ADDRESS_CRAWLER, I2C_res, NumberOfI2CCommand);
-        if( I2C_res[4] == 'S' ){
-            DEBUG_PRINT_L0("Bd0> Try count            : %02d/%02d\r\n", TARGET_CHECK_COUNT - try_cnt, TARGET_CHECK_COUNT );
-            DEBUG_PRINT_L0("Bd0> Return from (0x%02x) : '%c'\r\n", I2C_ADDRESS_CRAWLER, I2C_res[4]);
-            break;
-        }
-        else try_cnt -= 1;
-        if( try_cnt == 0 ){
-            DEBUG_PRINT_L0("Bd0> ##ERROR : Target(0x02)##\r\n",I2C_ADDRESS_CRAWLER);
-            led1 = OFF;
-            while(1){
-                led3 = !led3;       // ON
-                Thread::wait(80);
-            }            
-        }
-    }
-    DEBUG_PRINT_L0("Bd0> -------------------\r\n");  
-    DEBUG_PRINT_L0("Bd0> Target system found\r\n");  
-    DEBUG_PRINT_L0("Bd0> -------------------\r\n");  
-#endif // __TARGET_BOARD_CHECK__
-
-
-    led2 = ON; // Check target OK
-
-    /* Set basic function default setting */ 
-    baseOperation.sv_JS_OpeMode = 0;
-    baseOperation.sv_JS_OpeMode = 0;
-    baseOperation.sv_WinchValid = 0;
-
-
-    /* 
-    **************************************************
-    Send Calculation Data to Resolver Controller
-    **************************************************
-    */
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-    DEBUG_PRINT_L0("Bd0> 4. Send the Calculation base data to Resolver Controller");  
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-    I2C_cmd[I2C_CP_WDRAM_DIA_UPPER] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100>>8)&0xFF);    // Dram diameter upper
-    I2C_cmd[I2C_CP_WDRAM_DIA_LOWER] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100)&0xFF);       // Dram diameter lower
-    I2C_cmd[I2C_CP_CCABLE_DIA_UPPER] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100>>8)&0xFF);  // Cable diameter upper
-    I2C_cmd[I2C_CP_CCABLE_DIA_LOWER] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100)&0xFF);     // Cable diameter lower
-    I2C_cmd[I2C_CP_RESOLVER_RESO] = setValue.winchCtrl.sv_WRS_RResolution;  // Resolver resolution
-    
-    for( int j = 0; j < NumberOfI2CCommand; j++)
-        DEBUG_PRINT_L0("%02x ", I2C_cmd[j]); 
-    DEBUG_PRINT_L0( "\r\n" );
-                    
-    i2c.write(I2C_ADDRESS_RESOLVER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-    DEBUG_PRINT_L0(" ... done\r\n");      
-    
-    // Thread (
-    //    void(*task)(void const *argument), 
-    //    void *argument=NULL, 
-    //    osPriority priority=osPriorityNormal, 
-    //    uint32_t stack_size=DEFAULT_STACK_SIZE, 
-    //    unsigned char *stack_pointer=NULL
-    //)
-
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-    DEBUG_PRINT_L0("Bd0> 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("Bd0> Start host interface task ... ");
-  //  Thread thread_hif(clientPC_interface_task, NULL, osPriorityHigh, 128*4); 
-    Thread thread_hif(clientPC_interface_task, NULL, osPriorityNormal, 128*4); 
-    DEBUG_PRINT_L0("\r\nBd0> Start host gamepad task ... ");
-    Thread thread_gpd(gamepad_task, NULL, osPriorityNormal, 128*4);
-    DEBUG_PRINT_L0("\r\n");
-    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
-
-    DEBUG_PRINT_L0( "Bd0> ----------------------------------\r\n");
-    DEBUG_PRINT_L0( "Bd0> >>>> Initializing completed ! <<<<\r\n");
-    DEBUG_PRINT_L0( "Bd0> ----------------------------------\r\n");
-  
-    led4 = OFF;
-    led3 = OFF;
-    led2 = OFF;
-    led1 = ON;  // Initializing is OK then Power Indicator LED ON
-    
-    I2C_cmd[4] = 0x00;
-    I2C_cmd[5] = 0x01;
-    i2c.write(I2C_ADDRESS_HANDY, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
-
-    while( true ) {
-        Thread::wait(10);
-        // -----------------------------------------------------------------
-        // Communicate with client PC program.
-        //    TCP connection: 
-        // -----------------------------------------------------------------
-        if( flg_ethernet == true ) // in case of Ethernet OK
-        {
-            tcp_server.accept(tcp_client);
-            tcp_client.set_blocking(false, 3500);   // Timeout after (300) msec
-            DEBUG_PRINT_L3("Bd0> ----------------------------\r\n");
-            DEBUG_PRINT_L3("Bd0> TCP Connection from: %s\r\n", tcp_client.get_address());
-            DEBUG_PRINT_L3("Bd0> ----------------------------\r\n");
-                        
-            while(true){
-                                
-               // --------------------------------------------------------------
-               // Following instructions are blocking when no ethernat access                 
-               // --------------------------------------------------------------
-                rcv_data_cnt = tcp_client.receive(dbuffer, sizeof(dbuffer));
-                DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );
-                if( rcv_data_cnt < 0 ){
-                //    DEBUG_PRINT("## TCP Receive packet fail ##\r\n");
-                    break;
-                }
-                else{
-                    if( !strcmp( dbuffer, "WinchPositionClear" ) ){
-                        winchMovingControl( 
-                            WINCH_POSITION_CLEAR,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-
-                    else if( !strcmp( dbuffer, "WinchRtvStart" ) ){
-                        winchMovingControl( 
-                            WINCH_MMODE_RELATIVE,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-                    else if( !strcmp( dbuffer, "WinchAbsStart" ) ){
-                        winchMovingControl( 
-                            WINCH_MMODE_ABSOLUTE,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-                    else if( !strcmp( dbuffer, "WinchStepUpOn" ) ){
-                        winchMovingControl( 
-                            WINCH_STEPUP_BTN_ON,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );  
-                    }
-                    else if( !strcmp( dbuffer, "WinchStepUpOf" ) ){
-                        winchMovingControl( 
-                            WINCH_STEPUP_BTN_OFF,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-                    else if( !strcmp( dbuffer, "WinchStepDnOn" ) ){
-                        winchMovingControl( 
-                            WINCH_STEPDOWN_BTN_ON,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-                    else if( !strcmp( dbuffer, "WinchStepDnOf" ) ){
-                        winchMovingControl( 
-                            WINCH_STEPDOWN_BTN_OFF,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-
-                    else if( !strcmp( dbuffer, "WinchuStepUpOn" ) ){
-                        winchMovingControl( 
-                            WINCH_U_STEPUP_BTN_ON,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );  
-                    }
-                    else if( !strcmp( dbuffer, "WinchuStepUpOf" ) ){
-                        winchMovingControl( 
-                            WINCH_U_STEPUP_BTN_OFF,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-                    else if( !strcmp( dbuffer, "WinchuStepDnOn" ) ){
-                        winchMovingControl( 
-                            WINCH_U_STEPDOWN_BTN_ON,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-                    else if( !strcmp( dbuffer, "WinchuStepDnOf" ) ){
-                        winchMovingControl( 
-                            WINCH_U_STEPDOWN_BTN_OFF,
-                            dbuffer,
-                            sizeof(dbuffer),
-                            &winchData,
-                            sizeof( winchData ),
-                            I2C_cmd
-                        );
-                    }
-
-                    else if( !strcmp( dbuffer, "SetValue" ) ){
-                        DEBUG_PRINT_L3("Bd0> SetValue Request from client\r\n");
-                        Thread::wait(200); 
-                        rcv_data_cnt = tcp_client.receive( (char*)&new_setValue, sizeof(new_setValue));
-                        Thread::wait(200); 
-                     //   DEBUG_PRINT_L3("Bd0> TCP Rcv data count is [%d]\r\n", rcv_data_cnt );
-                     //   dspSetValue2Console( &pc, &new_setValue );             
-                     //   DEBUG_PRINT_L0("Bd0> write setting file to local file sysytem\r\n");
-                        
-                        thread_hif.terminate();
-                        thread_gpd.terminate();
-                        
-                    //    file_access_mutex.lock();
-                        write_LFS(&new_setValue);
-                    //    file_access_mutex.unlock();
-                    
-                        Thread::wait(500);
-                   
-                        DEBUG_PRINT_L0("Bd0> SetValue instruction is over\r\n");
-                    }
-                    else if(!strcmp( dbuffer, "GetValue" )){
-                        DEBUG_PRINT_L3("Bd0> GetValue request from TCP client\r\n");
-                        
-                        flg_mutex.lock();       // This is very important
-                        memcpy( &new_setValue, &setValue, sizeof( new_setValue ) );
-                        flg_mutex.unlock();     // This is very important
-                        dspSetValue2Console( &pc, &new_setValue );
-                        tcp_client.send_all( (char*)&new_setValue, sizeof(new_setValue) );
-                        DEBUG_PRINT_L2("(%d)\r\n", sizeof(new_setValue));
-                    }
-                }
-                if( rcv_data_cnt <= 0 ) break;             
-            }
-            tcp_client.close();
-        }
-    }
-}
+
+/***************************************
+ * Project: B2
+ * Title:   Bebris Prober Ctrl Main
+ * Target:  LPC1768
+ * Author:  sayzyas as ZNR
+ * ------------------------------------
+ *
+ *
+ *
+ *                 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
+ * p16 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"
+
+// USBSerial serial setting
+Serial pc(USBTX, USBRX); // UART
+
+// Analog I/O setting : 2016.07.26 added
+AnalogIn winchDramMSpeed(p19);  // Winch motor speed adjustment valiable volume for Motor 1 (Dram)
+AnalogIn winchCableMSpeed(p20); // Winch motor speed adjustment valiable volume for Motor 2 (Cable)
+
+// 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
+// I2C setting
+//I2C i2c_res(p28, p27);      // I2C SDA, SCL is not good ???
+I2C i2c(p9, p10);     // I2C SDA, SCL is good
+
+// Ethernet
+EthernetInterface   eth;
+TCPSocketServer     tcp_server; // TCP Server
+TCPSocketConnection tcp_client;
+UDPSocket           udp_server; // UDP Server
+Endpoint            client;
+// LCD
+// TextLCD lcd(p11, p12, p24, p23, p22, p21); // rs, e, d4-d7
+// Local File System
+LocalFileSystem local("local");  // Create the local filesystem under the name "local"
+
+// Global
+uint32_t            flg_gamePad_Connected = 0;
+char                PC_cmd[11+1] = "&0100000000";
+basic_operation_t   baseOperation;
+char                dbuffer[128];
+uint8_t             motor_speed = 0;
+
+// 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       flg_mutex;
+Mutex       swbtn_OpeMutex;
+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';
+
+bool        flg_winchButtonOn = false;
+
+
+/* Prototype */
+void write_Setting_lfs(void);
+int read_Setting_lfs(void);
+void dsp_console_setting_value(void);
+void winchMovingControl( int, char*, int, winchData_t*, int, char* );  
+extern void dspSetValue2Console( Serial*, setValue_t * );  
+// extern void lcd_out( TextLCD* ,int, int, char* );
+
+// ============================================================
+// Read Winch Motor Speed from Analog volume
+// ============================================================
+void set_winchMotorSpeed( void ){
+    // if reserved is not 0 then read winch motor speed from analog volume.
+    if( setValue.winchCtrl.reserved != 0 ){
+        setValue.winchCtrl.sv_WDM_hsrto_F = (winchDramMSpeed.read_u16() & 0xFF00 ) / 655; // normal speed
+        setValue.winchCtrl.sv_WDM_hsrto_R = (winchDramMSpeed.read_u16() & 0xFF00 ) / 655; // normal speed
+        setValue.winchCtrl.sv_WRM_hsrto_F = (winchCableMSpeed.read_u16() & 0xFF00 ) / 655;  // normal speed
+        setValue.winchCtrl.sv_WRM_hsrto_R = (winchCableMSpeed.read_u16() & 0xFF00 ) / 655;  // normal speed
+    }
+//    setValue.winchCtrl.sv_WDM_lsrto_F = setValue.winchCtrl.sv_WDM_hsrto_F >> 1; // slow speed
+//    setValue.winchCtrl.sv_WDM_lsrto_R = setValue.winchCtrl.sv_WDM_hsrto_R >> 1; // slow speed
+//    setValue.winchCtrl.sv_WRM_lsrto_F = setValue.winchCtrl.sv_WRM_hsrto_F >> 1;  // slow speed
+//    setValue.winchCtrl.sv_WRM_lsrto_R = setValue.winchCtrl.sv_WRM_hsrto_R >> 1;  // slow speed
+
+
+    DEBUG_PRINT_L3( "Bd0> Dram motor F speed : %d\r\n", setValue.winchCtrl.sv_WDM_hsrto_F );
+    DEBUG_PRINT_L3( "Bd0> Dram motor R speed : %d\r\n", setValue.winchCtrl.sv_WDM_hsrto_R );
+    DEBUG_PRINT_L3( "Bd0> cable motor F speed: %d\r\n", setValue.winchCtrl.sv_WRM_hsrto_F );
+    DEBUG_PRINT_L3( "Bd0> Cable motor R speed: %d\r\n", setValue.winchCtrl.sv_WRM_hsrto_R );
+}
+
+// ============================================================
+// Read motor current
+// ============================================================
+int read_motorCurrent(
+    int     i2c_addr,
+    char*   I2C_data,
+    int     NumberOfI2Cdata
+){
+    int     rts;
+    int     roop = 0;
+    
+    while(1){
+        rts = i2c.read(i2c_addr, I2C_data, 6);  
+        if( rts == 0 ){
+/*            DEBUG_PRINT_L0(" ++++++++++++++++++++++++++++++\r\n" );
+            DEBUG_PRINT_L0("  Target [0x%02x]\r\n", i2c_addr );
+            DEBUG_PRINT_L0("  00 Read Motor1 Current [%d]\r\n", I2C_data[0] );
+            DEBUG_PRINT_L0("  01 Read Motor2 Current [%d]\r\n", I2C_data[1] );
+            DEBUG_PRINT_L0("  02 Read                [0x%02x]\r\n", I2C_data[2] );
+            DEBUG_PRINT_L0("  03 Read                [%d]\r\n", I2C_data[3] );
+            DEBUG_PRINT_L0("  04 Read                [%c]\r\n", I2C_data[4] );
+            DEBUG_PRINT_L0(" ++++++++++++++++++++++++++++++\r\n" );
+*/
+            break;
+        }
+        if( roop >= 3 ){
+            rts = -1;
+            break;
+        }
+        roop++;
+    }
+    return rts;
+}
+
+// ============================================================
+// 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;
+}
+
+
+int16_t debugWinchCurrentPosition = 0;
+// ============================================================
+// Read winch current position from Resolver.
+// ============================================================
+/*
+2016.11.09
+  Add dummy data to read winch position value.
+    byte[0]: Dummy data = 0x12 <--- New added !
+    byte[1]: Winch position upper byte
+    byte[2]: Winch position lower byte
+    byte[3]: Dummy data = 0x34 <--- New added !
+*/
+int16_t ReadWinchCurrentPosition( int32_t i2c_addr, int mode )
+{
+    char        I2C_data[4];
+    int16_t     res_position = 0;
+    int         rts;
+    
+    Thread::wait(5);
+    rts = i2c.read(i2c_addr, I2C_data, 4); // Read
+    if(( I2C_data[0] == 0x12 )&&( I2C_data[3] == 0x34 )&&(rts == 0))
+    {
+        res_position = (I2C_data[2] << 8) | I2C_data[1]; 
+        if( res_position == -1 ){
+            res_position = 9999;
+        }
+        else{
+            res_position += winchOffsetValue;
+        }
+    }
+    else{
+        res_position = 9999;
+    }
+    pc.printf("ReadWinchCurrentPosition [ %d ]mm\r\n",  res_position );
+    return res_position;
+}
+
+uint8_t adj_crawlerSpeed( uint8_t in )
+{
+    uint8_t out;
+    
+    if( ( in > 0 ) && ( in < 98 ))
+    {                    
+        out = (uint8_t)((float)in * 0.8);
+    }    
+    else
+    {
+        out = 100;
+    }
+    return out;                                
+}
+
+bool    flg_mc_tfmcrw = false;
+bool    flg_mc_winch = false;
+char    I2C_res[NumberOfI2CCommand+1] = "\0";
+// ============================================================
+// Button control
+// ============================================================
+void onControl(
+    uint8_t btn00, uint8_t btn01, uint8_t btn02, uint8_t btn03, 
+    uint8_t btn04, uint8_t btn05, uint8_t btn06, uint8_t btn07, 
+    uint8_t btn08, uint8_t btn09, uint8_t btn10, uint8_t btn11, 
+    uint8_t btn12, uint8_t btn13, uint8_t btn14, uint8_t btn15,
+    uint16_t gamePadVID, uint16_t gamePadPID
+){
+    /* ** OLD type ***
+     * I2C Command (7byte)
+     *  0: '#'  // Preamble
+     *  1: '0'  // Target upper
+     *  2: '1'  // Target lower
+     *  3: '0'   // Command 1
+     *  4: '1/3'   // Command 2
+     *  5: '0/1'
+     */
+     
+     /* New Type 15.11.06 ~
+        [0] :  
+        [1] : 
+        [2] : 
+        [3] : 
+        [4] : motor 1 direction (A=Forward, B=Reverse, F=Stop)
+        [5] : motor 1 speed
+        [6] : motor 2 direction (A=Forward, B=Reverse, F=Stop)
+        [7] : motor 2 speed <-- New added
+        [8] : N/F
+        [9] : N/F
+    */
+    char I2C_cmd[NumberOfI2CCommand+1] = "#0100000000000";
+    char I2C_readcmd[NumberOfI2CCommand+1] = "#010000";
+    
+    uint8_t   btnStatus_RFK = 0;
+    uint8_t   btnStatus_RFI = 0;
+    uint8_t   btnStatus_LBK = 0;
+    uint8_t   btnStatus_LBI = 0;
+    uint8_t   btnStatus_WUP = 0;
+    uint8_t   btnStatus_WDN = 0;
+    uint8_t   btnStatus_RJSFwdRvs = 0; // R-JS Fwd/Rvs
+    uint8_t   btnStatus_RJSLftRgt = 0; // R-JS Left/Light
+    uint8_t   btnStatus_LJSFwdRvs = 0; // L-JS Fwd/Rvs
+    uint8_t   btnStatus_LJSLftRgt = 0; // L-Js Left/Right
+    
+    uint8_t   btnStatus_Start = 0;  // Guide button status for ELECOM GamePad
+    uint8_t   btnStatus_CrossUp = 0;
+    uint8_t   btnStatus_CrossDn = 0;
+    uint8_t   btnStatus_CrossRt = 0;
+    uint8_t   btnStatus_CrossLt = 0;
+    
+    // For JS Ope mode B    
+    uint8_t   btnID_RFK = 0;
+    uint8_t   btnID_RFI = 0;
+    uint8_t   btnID_LBK = 0;
+    uint8_t   btnID_LBI = 0;
+    uint8_t   btnID_RFLBI = 0;  // RF-I and LB-I both button on same time
+    uint8_t   btnID_RFLBK = 0;  // RF-K and LB-K both button on same time
+    uint8_t   btnID_WUP = 0;
+    uint8_t   btnID_WDN = 0;
+    
+    uint8_t   btnID_Start = 0;  // Guide button ID for ELECOM GamePad
+    uint8_t   btnID_JS_SD = 0;  // JS mode Single / Dual
+    uint8_t   btnID_JD_IK = 0;  // JS mode I-Shape / KO-Shape
+    
+    uint8_t   btnID_CrossUp = 0;
+    uint8_t   btnID_CrossDn = 0;
+    uint8_t   btnID_CrossRt = 0;
+    uint8_t   btnID_CrossLt = 0;
+    
+    uint8_t   cntcnt = 0;
+    
+    int       rrr;
+    
+    if( gamePadVID == GAMEPAD_VID_RSTHANDY ){ // NRst own original controller
+        DEBUG_PRINT_L4("Bd0> [Rst HDY] ");
+        btnID_WDN  = 0x10;
+        btnID_WUP  = 0x20;
+        btnID_RFK  = 0x01;
+        btnID_RFI  = 0x02;
+        btnID_LBK  = 0x04;
+        btnID_LBI  = 0x08;
+        btnID_CrossUp = 0;
+        btnID_CrossDn = 4;
+        btnID_CrossRt = 2;
+        btnID_CrossLt = 6;
+        // ---- This is temporary setting ------------------------------
+        btnID_RFLBI = 192; // RF-I and LB-I both button on same time
+        btnID_RFLBK = 48;  // RF-K and LB-K both button on same time
+        // --------------------------------------------------------------
+        btnID_JS_SD = 1;  // JS mode Single or Dual
+        btnID_JD_IK = 2;  // JS mode I-Shape KO-Shape
+        if ( gamePadPID == GAMEPAD_PID_RSTHANDY ){
+            btnStatus_WDN = btn04;             
+            btnStatus_WUP = btn04;
+            btnStatus_RFK = btn04; 
+            btnStatus_RFI = btn04;
+            btnStatus_LBK = btn04;
+            btnStatus_LBI = btn04;
+            btnStatus_RJSFwdRvs = btn03; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_RJSLftRgt = btn02; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_LJSFwdRvs = btn01; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_LJSLftRgt = btn00; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_CrossUp = btn06;
+            btnStatus_CrossDn = btn06;
+            btnStatus_CrossRt = btn06;
+            btnStatus_CrossLt = btn06;
+            btnStatus_Start = btn05;  //
+        }
+    }
+    else if (gamePadVID == GAMEPAD_VID_ELECOM ){
+        DEBUG_PRINT_L4("Bd0> [ELECOM] ");
+        btnID_WDN  = 4;     // 0x04
+        btnID_WUP  = 2;     // 0x02
+        btnID_RFK  = 32;    // 0x20
+        btnID_RFI  = 128;   // 0x80
+        btnID_LBK  = 16;    // 0x10
+        btnID_LBI  = 64;    // 0x40
+        // ---------------------
+        btnID_RFLBI = 192; // 0xC0 RF-I and LB-I both button on same time
+        btnID_RFLBK = 48;  // 0x30 RF-K and LB-K both button on same time
+        // ---------------------
+        btnID_Start = 8;  // Guide button ID for ELECOM GamePad
+        btnID_CrossUp = 0;
+        btnID_CrossDn = 4;
+        btnID_CrossRt = 2;
+        btnID_CrossLt = 6;
+        if ( gamePadPID == GAMEPAD_PID_ELECOM_JCU3613M ){
+            btnStatus_WDN = btn04; 
+            btnStatus_WUP = btn04;
+            btnStatus_RFK = btn04;
+            btnStatus_RFI = btn04;
+            btnStatus_LBK = btn04;
+            btnStatus_LBI = btn04;
+            btnStatus_RJSFwdRvs = btn03;
+            btnStatus_RJSLftRgt = btn02;
+            btnStatus_LJSFwdRvs = btn01;
+            btnStatus_LJSLftRgt = btn00;
+            btnStatus_Start = btn05;  // Guide button status for ELECOM GamePad
+            btnStatus_CrossUp = btn06;
+            btnStatus_CrossDn = btn06;
+            btnStatus_CrossRt = btn06;
+            btnStatus_CrossLt = btn06;
+        }        
+    }
+    else if( gamePadVID == GAMEPAD_VID_LOGICOOL ){
+        btnID_WDN  = 40;
+        btnID_WUP  = 136;
+        btnID_RFK  = 2;
+        btnID_RFI  = 8;
+        btnID_LBK  = 1;
+        btnID_LBI  = 4;
+        // ---------------------
+        btnID_RFLBI = 12; // RF-I and LB-I both button on same time
+        btnID_RFLBK = 3;  // RF-K and LB-K both button on same time
+        // ---------------------
+        btnID_Start = 32;  // Guide button ID for ELECOM GamePad
+        btnID_CrossUp = 0;
+        btnID_CrossDn = 4;
+        btnID_CrossRt = 2;
+        btnID_CrossLt = 6;
+        if ( gamePadPID == GAMEPAD_PID_LOGICOOL_F710 ){
+            DEBUG_PRINT_L4("Bd0> [LOGI F710] ");
+            btnStatus_WDN = btn05;           
+            btnStatus_WUP = btn05;
+            btnStatus_RFK = btn06;
+            btnStatus_RFI = btn06;
+            btnStatus_LBK = btn06;
+            btnStatus_LBI = btn06;
+        }
+        else if ( gamePadPID == GAMEPAD_PID_LOGICOOL_F310 ){
+            DEBUG_PRINT_L4("Bd0> [LOGI F310] ");
+            btnStatus_WDN = btn04; 
+            btnStatus_WUP = btn04;
+            btnStatus_RFK = btn05;
+            btnStatus_RFI = btn05;
+            btnStatus_LBK = btn05;
+            btnStatus_LBI = btn05;
+            btnStatus_RJSFwdRvs = btn03;
+            btnStatus_RJSLftRgt = btn02;
+            btnStatus_LJSFwdRvs = btn01;
+            btnStatus_LJSLftRgt = btn00;
+            btnStatus_Start = btn05;  // Guide button status for ELECOM GamePad
+            btnStatus_CrossUp = btn04;
+            btnStatus_CrossDn = btn04;
+            btnStatus_CrossRt = btn04;
+            btnStatus_CrossLt = btn04;
+        }
+    }
+    else if ( gamePadVID == GAMEPAD_VID_SANWA){
+        DEBUG_PRINT_L4("Bd0> [SANWA] ");
+        btnID_WDN  = 2;
+        btnID_WUP  = 4;
+        btnID_RFK  = 2;
+        btnID_RFI  = 1;
+        btnID_LBK  = 128;
+        btnID_LBI  = 64;
+        // ---------------------
+        btnID_RFLBI = 80; // RF-I and LB-I both button on same time
+        btnID_RFLBK = 40;  // RF-K and LB-K both button on same time
+        // ---------------------
+        btnID_CrossUp = 0;
+        btnID_CrossDn = 255;
+        btnID_CrossRt = 0;
+        btnID_CrossLt = 255;
+        if ( gamePadPID == GAMEPAD_PID_SANWA_JYP70US ){
+            btnStatus_WDN = btn05; 
+            btnStatus_WUP = btn05;
+            btnStatus_RFK = btn06;
+            btnStatus_RFI = btn06;
+            btnStatus_LBK = btn05;
+            btnStatus_LBI = btn05;
+            btnStatus_RJSFwdRvs = btn03; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_RJSLftRgt = btn02; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_LJSFwdRvs = btn01; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_LJSLftRgt = btn00; // Assign analog js to this sw input by LPC1768mbed
+            btnStatus_CrossUp = btn01;
+            btnStatus_CrossDn = btn01;
+            btnStatus_CrossRt = btn00;
+            btnStatus_CrossLt = btn00;
+        }
+    }
+
+#ifdef __DISP_GAMAPAD_STATUS_ALL__ // For Debug
+//    DEBUG_PRINT_BTN(" Btn 00:%d, 01:%d, 02:%d, 03:%d, 04:%d, 05:%d, 06:%d, 07:%d, 08:%d | VID=0x%04x, PID=0x%04x\r\n", 
+//            btn00,btn01,btn02,btn03,btn04,btn05,btn06,btn07,btn08,
+//            gamePadVID, gamePadPID);
+    DEBUG_PRINT_SW("Bd0> -- Button Status -------------------------------\r\n");
+    DEBUG_PRINT_SW("Bd0>  00(%02x) 01(%02x) 02(%02x) 03(%02x)\r\n", btn00,btn01,btn02,btn03);
+    DEBUG_PRINT_SW("Bd0>  04(%02x) 05(%02x) 06(%02x) 07(%02x) 08(%02x)\r\n", btn04,btn05,btn06,btn07,btn08);
+    DEBUG_PRINT_SW("Bd0>  09(%02x) 10(%02x) 11(%02x) 12(%02x) 13(%02x) 14(%02x) 15(%02x)\r\n", btn09,btn10,btn11,btn12,btn13,btn14,btn15);
+    DEBUG_PRINT_SW("Bd0> ------------------------------------------------\r\n");
+#endif
+   
+    I2C_cmd[I2C_CP_M1_DIR]          = '\0';
+    I2C_cmd[I2C_CP_M1_SPEED]        = '\0';
+    I2C_cmd[I2C_CP_M1_FWD_CNTTH_U]  = '\0';
+    I2C_cmd[I2C_CP_M1_FWD_CNTTH_L]  = '\0';
+    I2C_cmd[I2C_CP_M1_RVS_CNTTH_U]  = '\0';
+    I2C_cmd[I2C_CP_M1_RVS_CNTTH_L]  = '\0';
+    I2C_cmd[I2C_CP_M2_DIR]          = '\0';
+    I2C_cmd[I2C_CP_M2_SPEED]        = '\0';
+    I2C_cmd[I2C_CP_M2_FWD_CNTTH_U]  = '\0';
+    I2C_cmd[I2C_CP_M2_FWD_CNTTH_L]  = '\0';
+    I2C_cmd[I2C_CP_M2_RVS_CNTTH_U]  = '\0';
+    I2C_cmd[I2C_CP_M2_RVS_CNTTH_L]  = '\0';
+    
+    int tmpSpeed = 0;
+    
+    if (swbtn_Opeflg == 1){
+        Thread::wait(1);
+    } 
+    else{
+        if( flg_lsw_valid == true ){
+            I2C_cmd[1] = 'V';
+        }
+        else{
+            I2C_cmd[1] = '0';
+        }
+        if( gamePadVID == GAMEPAD_VID_RSTHANDY ){ // NRst own original controller
+            flg_exp_status &= 0xFFFFFFF0;
+            if(!( btnStatus_Start & 0x01 )){ // I-Shape
+                flg_mutex.lock();
+                baseOperation.sv_JS_ShapeMode = 0;
+                baseOperation.sv_WinchValid = 0;
+                flg_mutex.unlock();
+                flg_exp_status |= 0x00000001;
+            }
+            else{ // KO-Shape
+                flg_mutex.lock();
+                baseOperation.sv_JS_ShapeMode = 1;
+                flg_mutex.unlock();
+                flg_exp_status |= 0x00000002;
+            }
+            
+            if(!(btnStatus_Start & 0x02 )){ // Tfm,crawler part valid
+                flg_mutex.lock();
+                baseOperation.sv_WinchValid = 0;
+                flg_mutex.unlock();
+                flg_exp_status |= 0x00000004;
+                if( flg_mc_tfmcrw == false ){
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;
+                    pc.printf("#### Winch Motor Stop ####\r\n");
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+           
+                    sprintf( dbuffer,"OFF_ %03d %03d %04d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition ); // Winch down
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                flg_mc_tfmcrw = true;
+                flg_mc_winch = false;
+            }
+            else{ // Winch part valid
+                flg_mutex.lock();
+                baseOperation.sv_WinchValid = 1;
+                flg_mutex.unlock();
+                flg_exp_status |= 0x00000008;
+                if( flg_mc_winch == false ){
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;
+                    pc.printf("#### Transform and Crawler Motor Stop ####\r\n");
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+
+                    sprintf( dbuffer,"OFF_ %03d %03d %04d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition ); // Winch down
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                flg_mc_tfmcrw = false;
+                flg_mc_winch = true;
+            }
+            DEBUG_PRINT_L4( "-----------------------------\r\n" );
+            DEBUG_PRINT_L4( "%d : %d\r\n",btnStatus_Start, flg_exp_status );
+            DEBUG_PRINT_L4( " JS shape mode change    : %d\r\n", baseOperation.sv_JS_ShapeMode); 
+            DEBUG_PRINT_L4( " Valid part              : %d\r\n", baseOperation.sv_WinchValid ); 
+            DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
+        }
+        else{
+        /*
+             * 
+             * GamePad software switch
+             *    Cross button Up on   : JS shape mode I
+             *    Cross button Down on : JS shape mode KO
+             *    Cross button Right on: Winch part valid
+             *    Cross button Left on : Crawlerm, Transform part valid
+             *  7 6 5 4 3 2 1 0
+             * +-+-+-+-+-+-+-+-+
+             * |x|x|x|x|x|x|x|o|  1: I-Shape JSmode, 2: K-Shape JSmode, 4: Left part(Crawler, Tfm) part valid, 8: Winch part valid 
+             * +-+-+-+-+-+-+-+-+
+             */
+            if ( btnStatus_CrossUp == btnID_CrossUp ){ // I Shape
+                flg_mutex.lock();
+                baseOperation.sv_JS_ShapeMode = 0;
+                flg_mutex.unlock();
+                DEBUG_PRINT_L4( "--------------------------------\r\n" );
+                DEBUG_PRINT_L4( " I\r\n" ); 
+                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
+                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
+                DEBUG_PRINT_L4( "--------------------------------\r\n" ); 
+                DEBUG_PRINT_L3( "Bd0> I Shape\r\n" ); 
+                flg_exp_status |= 0x00000001;
+            }
+            else if( btnStatus_CrossDn == btnID_CrossDn ){ // KO Shape
+                flg_mutex.lock();
+                baseOperation.sv_JS_ShapeMode = 1;
+                flg_mutex.unlock();
+                DEBUG_PRINT_L4( "-------------------------\r\n" ); 
+                DEBUG_PRINT_L4( " KO\r\n" ); 
+                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
+                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
+                DEBUG_PRINT_L4( "-------------------------\r\n" ); 
+                DEBUG_PRINT_L3( "Bd0> KO Shape\r\n" ); 
+                flg_exp_status |= 0x00000002;
+            }    
+            else if( btnStatus_CrossRt == btnID_CrossLt ){ // Valid Part : Crawler (Left)
+                flg_mutex.lock();
+                baseOperation.sv_WinchValid = 0;
+                flg_mutex.unlock();
+                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
+                DEBUG_PRINT_L4( " Tfm, Crawler\r\n" ); 
+                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
+                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
+                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
+                DEBUG_PRINT_L3( "Bd0> Left Part\r\n" ); 
+                flg_exp_status |= 0x00000004;
+                if( flg_mc_tfmcrw == false ){
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;
+                    pc.printf("#### Winch Motor Stop ####\r\n");
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    sprintf( dbuffer,"OFF_ %03d %03d %04d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition ); // Winch down
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                flg_mc_tfmcrw = true;
+                flg_mc_winch = false;
+            }
+            else if( btnStatus_CrossLt == btnID_CrossRt ){ // Valid Part : Winch (Right)
+                flg_mutex.lock();
+                baseOperation.sv_WinchValid = 1;
+                flg_mutex.unlock();
+                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
+                DEBUG_PRINT_L4( " Winch\r\n" ); 
+                DEBUG_PRINT_L4( " JS shape mode change : %d\r\n", baseOperation.sv_JS_ShapeMode); 
+                DEBUG_PRINT_L4( " Valid part           : %d\r\n", baseOperation.sv_WinchValid ); 
+                DEBUG_PRINT_L4( "-----------------------------\r\n" ); 
+                DEBUG_PRINT_L3( "Bd0> Right Part\r\n" ); 
+                flg_exp_status |= 0x00000008;
+                if( flg_mc_winch == false ){
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;
+                    pc.printf("#### Transform and Crawler Motor Stop ####\r\n");
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    sprintf( dbuffer,"OFF_ %03d %03d %04d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition ); // Winch down
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                flg_mc_tfmcrw = false;
+                flg_mc_winch = true;
+            } 
+            else{
+                flg_exp_status &= 0xFFFFFFF0;
+            }                      
+        }
+        /*
+        // ====================================
+        //  TRANSFORM Motor Control
+        // ====================================
+         *  7 6 5 4 3 2 1 0
+         * +-+-+-+-+-+-+-+-+    
+         * |o|x|x|x|x|x|x|x|  1: RF-I, 2: RF-K, 4: LB-I, 8: LB-K
+         * +-+-+-+-+-+-+-+-+
+         */
+        if ( baseOperation.sv_WinchValid == 0 ){ // TRANSFORM, CRAWLER PART Valid
+            if (btnStatus_RFK==btnID_RFLBK){ // Both sw on
+                flg_ButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN RF-K & LB-K\r\n" ); 
+                led3 = 1;
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
+                I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_F; // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor1 FWD
+                I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_F; // Speed
+                flg_exp_status |= 0x30000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+        //      i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                if( rrr == 0 ) {
+                    motorLock_sts = I2C_res[4]; 
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    limitSw_Sts = I2C_res[3];
+                    DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                    DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                    DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
+                    DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+                }
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 ERROR\r\n" );                 
+                
+        #endif  // __IIC_COMAMND_SEND__
+                flg_ButtonOn = false;
+            }
+            else if (btnStatus_RFI== btnID_RFLBI) {// Both sw on
+                flg_ButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN RF-I & LB-I\r\n" ); 
+                led3 = 1;
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 FWD
+                I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_F; // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor1 FWD
+                I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_F; // Speed
+                flg_exp_status |= 0x10000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+        //      i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                if( rrr == 0 ){
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    limitSw_Sts = I2C_res[3];
+                    DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                    DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                    DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
+                    DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+                }
+        #endif  // __READ_TFM_MOTOR_CURRENT__
+                flg_ButtonOn = false;
+            }
+            else if (btnStatus_RFK==btnID_RFK){ // RF KO
+                flg_ButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN RF-K\r\n" ); 
+                led3 = 1;
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
+                I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_F; // Speed
+                flg_exp_status |= 0x10000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+        //      i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                     motor1_current_pct = 999;
+                }
+                else{
+                   motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    motor2_current_pct = 999;
+                }
+                else{
+                    motor2_current_pct = I2C_res[1];
+                }
+                limitSw_Sts = I2C_res[3];
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
+                DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+        #endif  // __READ_TFM_MOTOR_CURRENT__
+                flg_ButtonOn = false;
+            } 
+            else if (btnStatus_RFI==btnID_RFI){ // RF I
+                DEBUG_PRINT_L3( "Bd0> BTN RF-I\r\n" ); 
+                led3 = 1;
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 RVS
+                I2C_cmd[I2C_CP_M1_SPEED] = setValue.tfmCtrl.sv_RFTM_srto_R; // Speed
+                flg_exp_status |= 0x20000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+        //      i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                    motor1_current_pct = 999;
+                }
+                else{
+                   motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    motor2_current_pct = 999;
+                }
+                else{
+                motor2_current_pct = I2C_res[1];
+                }
+                limitSw_Sts = I2C_res[3];
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct );
+                DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
+                DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+        #endif // __READ_TFM_MOTOR_CURRENT__
+                flg_ButtonOn = false;
+            }
+            else if (btnStatus_LBK==btnID_LBK){ // LB KO
+                flg_ButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN LB-K\r\n" ); 
+                led3 = 1;
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 FWD
+                I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_F; // Speed
+                flg_exp_status |= 0x40000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF; 
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+        //      i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                    motor1_current_pct = 999;
+                }
+                else{
+                    motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    motor2_current_pct = 999;
+                }
+                else{
+                    motor2_current_pct = I2C_res[1];
+                }
+                limitSw_Sts = I2C_res[3];
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
+                DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+        #endif // __READ_TFM_MOTOR_CURRENT__
+                flg_ButtonOn = false;
+            } 
+            else if (btnStatus_LBI==btnID_LBI) { // LB I
+                flg_ButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN LB-I\r\n" ); 
+                led3 = 1;
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor1 RVS
+                I2C_cmd[I2C_CP_M2_SPEED] = setValue.tfmCtrl.sv_LBTM_srto_R; // Speed
+                flg_exp_status |= 0x80000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+        //      i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                    motor1_current_pct = 999;
+                }
+                else{
+                    motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    motor2_current_pct = 999;
+                }
+                else{
+                    motor2_current_pct = I2C_res[1];
+                }
+                limitSw_Sts = I2C_res[3];
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts ); 
+                DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+        #endif // __READ_TFM_MOTOR_CURRENT__
+                // 2016.09.05 comment out
+                flg_ButtonOn = false;
+            }
+            else {  //  Motor OFF
+                led3 = 0;
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
+                I2C_cmd[I2C_CP_M1_SPEED] = 0;
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
+                I2C_cmd[I2C_CP_M2_SPEED] = 0;
+                Thread::wait(5);
+                flg_exp_status &= 0x0FFFFFFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_RFTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_RFTM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.tfmCtrl.sv_LBTM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.tfmCtrl.sv_LBTM_ith_R & 0xFF );
+                // ------------------------------------------------------------------------------------------
+                i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // <<<<=== is it necessary ?
+                Thread::wait(1); // <<<<=== is it necessary ?
+                i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // <<<<=== is it necessary ?
+                Thread::wait(1);// <<<<=== is it necessary ?
+                // ----------------------------------------------------------------------------------------
+        #ifdef __READ_TFM_MOTOR_CURRENT__
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                    motor1_current_pct = 999;
+                }
+                else{
+                    motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    motor2_current_pct = 999;
+                }
+                else{
+                    motor2_current_pct = I2C_res[1];
+                }
+                limitSw_Sts = I2C_res[3];
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                DEBUG_PRINT_L2( "Bd0> Limit switch status (0x%02x)%\r\n", limitSw_Sts );
+                DEBUG_PRINT_L2( "Bd0> Motor Lock Status (%c)\r\n", motorLock_sts ); 
+        #endif // __READ_TFM_MOTOR_CURRENT__
+    
+            }
+            i2c.write(I2C_ADDRESS_TRANSFORM, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+            /*
+             // ====================================
+             //  Crawler Moving Control
+             // ====================================
+             // JoyStick mode 1: Independence mode ( Dual JoyStick mode )
+             //   
+             //   ***      ***
+             //  * L *    * R *
+             //   ***      ***
+             // F  4        1
+             //
+             // R  8        2
+             //
+             // Forward move    5
+             // Reverce move    a
+             // Right rotation  6
+             // Left rotation   9
+             *  7 6 5 4 3 2 1 0
+             * +-+-+-+-+-+-+-+-+
+             * |x|x|o|x|x|x|x|x|  1: R Fwd, 2: R Rvs, 4: L Fwd, 8: L Rvs
+             * +-+-+-+-+-+-+-+-+
+             */
+            if( baseOperation.sv_JS_OpeMode == 1 ){
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_R & 0xFF );
+                if ( btnStatus_LJSFwdRvs<setValue.crawlerCtrl.sv_LBCM_dzc-setValue.crawlerCtrl.sv_LBCM_dzl ){
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 FWD
+                    tmpSpeed = ( setValue.crawlerCtrl.sv_LBCM_dzc+1 - btnStatus_LJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_LBCM_dzc * setValue.crawlerCtrl.sv_LBCM_srto_F / 100; // Speed
+                    I2C_cmd[I2C_CP_M2_SPEED] = (char)tmpSpeed; 
+                //    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    DEBUG_PRINT_SW( "Bd0> Dual Mode: L-Fwd (Speed=%d)\r\n", tmpSpeed);
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 2: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                                    
+                    flg_exp_status |= 0x00400000;
+                    flg_ButtonOn = false;
+                }
+                else if (btnStatus_LJSFwdRvs>setValue.crawlerCtrl.sv_LBCM_dzc+setValue.crawlerCtrl.sv_LBCM_dzu){
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS;    // Motor2 RVS
+                    tmpSpeed = ( btnStatus_LJSFwdRvs - setValue.crawlerCtrl.sv_LBCM_dzc ) * 100 / setValue.crawlerCtrl.sv_LBCM_dzc+1 * setValue.crawlerCtrl.sv_LBCM_srto_F / 100; // Speed                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = (char)tmpSpeed; 
+                    I2C_cmd[I2C_CP_M2_SPEED] =  (char)tmpSpeed; 
+                //    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    DEBUG_PRINT_L3( "Bd0> Dual Mode: L-Rvs (Speed=%d)\r\n", tmpSpeed);
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 2: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+    
+                    flg_exp_status |= 0x00800000;
+                    flg_ButtonOn = false;
+                }
+                else if (baseOperation.sv_WinchValid==0) {
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;   // Stop
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;     // Speed=0
+                    flg_exp_status &= 0xFF3FFFFF;
+                }
+                
+                if (btnStatus_RJSFwdRvs<setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl){
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
+                    tmpSpeed = (( 128 - btnStatus_RJSFwdRvs ) * 100 / 127 ) * setValue.crawlerCtrl.sv_RFCM_srto_R / 100;
+                    I2C_cmd[I2C_CP_M1_SPEED] = (char)tmpSpeed; 
+                    DEBUG_PRINT_SW( "Bd0> Dual Mode: R-Fwd (Speed=%d)\r\n", tmpSpeed);
+                //    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+    
+                    flg_exp_status |= 0x00100000;
+                    flg_ButtonOn = false;
+                }
+                else if (btnStatus_RJSFwdRvs>setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu){
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS;    // Motor1 RVS
+                    tmpSpeed = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc+1 * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
+                    I2C_cmd[I2C_CP_M1_SPEED] = (char)tmpSpeed; 
+                    DEBUG_PRINT_SW( "Bd0> Dual Mode: R-Rvs (Speed=%d)\r\n", tmpSpeed);
+               //     i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+    
+                    flg_exp_status |= 0x00200000;
+                    flg_ButtonOn = false;
+                }
+                else{
+                    DEBUG_PRINT_L2("***** MOTOR STOP ****\r\n"); 
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;   // Stop
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;     // Speed=0
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    flg_exp_status &= 0xFFCFFFFF;
+                }
+                // ---------------------------------------------
+                // Send command to target here ! 2016.09.07
+                // ---------------------------------------------
+                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                led3 = 0;           
+            }
+            /* JoyStick mode 0: Syncronous mode ( Single JoyStick mode )
+            //   
+            //   ***      ****
+            //  * X *    * LR *
+            //   ***      ****
+            // F  4        1
+            //
+            // R  8        2
+            //
+            // Forward move    5
+            // Reverce move    a
+            // Right rotation  6
+            // Left rotation   9
+             *  7 6 5 4 3 2 1 0
+             * +-+-+-+-+-+-+-+-+
+             * |x|x|o|x|x|x|x|x|  1: R Fwd, 2: R Rvs, 4: L Fwd, 8: L Rvs
+             * +-+-+-+-+-+-+-+-+
+             */
+            else{ // Single JoyStick mode
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_RFCM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_RFCM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.crawlerCtrl.sv_LBCM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.crawlerCtrl.sv_LBCM_ith_R & 0xFF );
+                if( 
+                    ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl ) &&
+                    ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu ) &&
+                    ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl ) &&
+                    ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu )
+                ){ 
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;     // Motor1 Fwd
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;             // Speed=0
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;     // Motor2 Rvs
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;             // Speed=0  
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    Thread::wait(1);
+                    flg_exp_status &= 0xFF0FFFFF;   // These operation is absolutely necessary , if forgot then UDP connection will be fail !
+                }
+                else if(
+                    ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl ) &&
+                    ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50) &&
+                    ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50 ) 
+                ){                
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 Reverse
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 Fwd
+                    }
+                    else{
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 Fwd
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 Fwd
+                    }
+                    I2C_cmd[I2C_CP_M1_SPEED] = adj_crawlerSpeed(( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100 ); // Speed
+                    I2C_cmd[I2C_CP_M2_SPEED] = adj_crawlerSpeed(( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100 ); // Speed
+                    
+                //    I2C_cmd[I2C_CP_M1_SPEED] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100; // Speed
+                //    I2C_cmd[I2C_CP_M2_SPEED] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100; // Speed
+                //    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    DEBUG_PRINT_SW( "Bd0> Single Mode: Dir1 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    pc.printf("Bd0> Single Mode: Dir1 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    flg_exp_status |= 0x00500000;
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                    flg_ButtonOn = false;
+                    Thread::wait(5);
+                }
+                else if(
+                    ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu ) && 
+                    ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50 ) && 
+                    ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50) 
+                ){                
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 Reverse
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor1 Reverse
+                    }
+                    else{               
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 Rvs
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 Fwd
+                    }                
+                    I2C_cmd[I2C_CP_M1_SPEED] = adj_crawlerSpeed(( btnStatus_RJSLftRgt - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100); // Speed
+                    I2C_cmd[I2C_CP_M2_SPEED] = adj_crawlerSpeed(( btnStatus_RJSLftRgt - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100); // Speed
+               //     i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    DEBUG_PRINT_SW( "Bd0> Single Mode: Dir2 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    pc.printf("Bd0> Single Mode: Dir2 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    flg_exp_status |= 0x00600000;         
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                    flg_ButtonOn = false;
+                   Thread::wait(5);
+                }
+                else if(
+                    ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu ) &&
+                    ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50) && 
+                    ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50) 
+                ){                
+                    flg_ButtonOn = true;
+                    led3 = 1;        
+                    if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 Rvs
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 Rvs
+                    }
+                    else{
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 Rvs
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 Rvs
+                    }             
+                    I2C_cmd[I2C_CP_M1_SPEED] = adj_crawlerSpeed(( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100); // Speed
+                    I2C_cmd[I2C_CP_M2_SPEED] = adj_crawlerSpeed(( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100); // Speed
+                //    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    DEBUG_PRINT_SW( "Bd0> Single Mode: Dir3 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    pc.printf("Bd0> Single Mode: Dir3 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    flg_exp_status |= 0x00A00000;         
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                    flg_ButtonOn = false;
+                    Thread::wait(5);
+                }
+                else if(
+                    ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzu ) && 
+                    ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu + 50) && 
+                    ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl - 50) 
+                ){                
+                    flg_ButtonOn = true;
+                    led3 = 1;
+                    if( baseOperation.sv_JS_ShapeMode == 0 ){ // I-Shape
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 Reverse
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor1 Reverse
+                    }
+                    else{
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 Fwd
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 Rvs
+                    }
+                    I2C_cmd[I2C_CP_M1_SPEED] = adj_crawlerSpeed(( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSLftRgt ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_F / 100); // Speed
+                    I2C_cmd[I2C_CP_M2_SPEED] = adj_crawlerSpeed(( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSLftRgt ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_srto_R / 100); // Speed
+               //     i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                    DEBUG_PRINT_SW( "Bd0> Single Mode: Dir4 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    pc.printf("Bd0> Single Mode: Dir4 M1[%d, %d] M2[%d, %d]\r\n", I2C_cmd[I2C_CP_M1_DIR], I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_DIR], I2C_cmd[I2C_CP_M2_SPEED]);
+                    flg_exp_status |= 0x00900000;         
+                    // Read motor current from target
+                    rrr = read_motorCurrent( I2C_ADDRESS_CRAWLER, I2C_res, 5 ); 
+                    motorLock_sts = I2C_res[4];
+                    if( motorLock_sts == '1' ){
+                        motor1_current_pct = 999;
+                    }
+                    else{
+                        motor1_current_pct = I2C_res[0];
+                    }
+                    if( motorLock_sts == '2' ){
+                        motor2_current_pct = 999;
+                    }
+                    else{
+                        motor2_current_pct = I2C_res[1];
+                    }
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent1 (%d)%\r\n", motor1_current_pct );                 
+                    DEBUG_PRINT_L2( "Bd0> 3: ReadMotorCurrent2 (%d)%\r\n", motor2_current_pct ); 
+                    flg_ButtonOn = false;
+                    Thread::wait(5);
+                }
+                // ====================================
+                // ALL motor off commmand packet send
+                // ====================================   
+                else{
+                    led3 = 0;
+            #ifdef __IIC_COMAMND_SEND__
+                    I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;     // Motor1 Fwd
+                    I2C_cmd[I2C_CP_M1_SPEED] = 0;             // Speed=0
+                    I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;     // Motor2 Rvs
+                    I2C_cmd[I2C_CP_M2_SPEED] = 0;             // Speed=0  
+
+                    // ------------------------------------------------------------------------------------------
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // <<<<=== is it necessary ?
+                    Thread::wait(1); // <<<<=== is it necessary ?
+                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // <<<<=== is it necessary ?
+                    Thread::wait(1);// <<<<=== is it necessary ?
+                    // ------------------------------------------------------------------------------------------
+ 
+            #endif
+                    flg_exp_status &= 0xFF0FFFFF;  // These operation is absolutely necessary , if forgot then UDP connection will be fail !
+                }
+                // ---------------------------------------------
+                // Send command to target here ! 2016.09.07
+                // ---------------------------------------------
+                i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+            }
+        }
+
+        /*
+         * ====================================
+         *  Winch Motor Control
+         *
+         *  7 6 5 4 3 2 1 0
+         * +-+-+-+-+-+-+-+-+
+         * |x|o|x|x|x|x|x|x|  1: W Down, 2: W Up, 4: -, 8: -
+         * +-+-+-+-+-+-+-+-+
+         */
+        else if( baseOperation.sv_WinchValid == 1 ){ 
+            int16_t winchTempPosition;
+            if (btnStatus_WDN == btnID_WDN){ // Winch Down (FWD)
+                flg_ButtonOn = true;
+                flg_winchButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN W-DN(Fwd)\r\n" ); 
+                led3 = 1;
+        #ifdef __IIC_COMAMND_SEND__
+                set_winchMotorSpeed();  // 2016.08.05 for Fix falling winch motor speed adjustment
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
+                I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_F; // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor2 FWD
+                I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_hsrto_F; // Speed
+        #endif
+                flg_exp_status |= 0x01000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_R & 0xFF );
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+/*              
+                rrr = read_motorCurrent( I2C_ADDRESS_WINCH, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                    pc.printf("**** MOTOR1 LOCK ****\r\n");
+                    motor1_current_pct = 999;
+                }
+                else{
+                    motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    pc.printf("**** MOTOR2 LOCK ****\r\n");
+                    motor2_current_pct = 999;
+                }
+                else{
+                    motor2_current_pct = I2C_res[1];
+                }
+*/
+                // ******** 2016.06.16 ***********************************************************
+                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 1);
+                if( winchTempPosition != 9999 ){
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                }
+
+                flg_ButtonOn = false;
+                Thread::wait(1);
+            } 
+            else if ( btnStatus_WUP == btnID_WUP ) { // Winch Up (Rvs)
+                flg_ButtonOn = true;
+                flg_winchButtonOn = true;
+                DEBUG_PRINT_L3( "Bd0> BTN W-UP(Rvs)\r\n" ); 
+                led3 = 1;
+        #ifdef __IIC_COMAMND_SEND__
+                set_winchMotorSpeed();  // 2016.08.05 for Fix falling winch motor speed adjustment
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 RVS
+                I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_R; // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor2 RVS
+                I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_hsrto_R; // Speed
+        #endif
+                flg_exp_status &= 0xF0FFFFFF;
+                flg_exp_status |= 0x02000000;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WDM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M1_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WDM_ith_R & 0xFF );
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_F >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_FWD_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_F & 0xFF );
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = ( setValue.winchCtrl.sv_WRM_ith_R >> 8 ) & 0xFF;
+                I2C_cmd[I2C_CP_M2_RVS_CNTTH_L] = ( setValue.winchCtrl.sv_WRM_ith_R & 0xFF );
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+/*
+                rrr = read_motorCurrent( I2C_ADDRESS_WINCH, I2C_res, 5 ); 
+                motorLock_sts = I2C_res[4];
+                if( motorLock_sts == '1' ){
+                    pc.printf("**** MOTOR1 LOCK ****\r\n");
+                    motor1_current_pct = 999;
+                }
+                else{
+                    motor1_current_pct = I2C_res[0];
+                }
+                if( motorLock_sts == '2' ){
+                    pc.printf("**** MOTOR2 LOCK ****\r\n");
+                    motor2_current_pct = 999;
+                }
+                else{
+                    motor2_current_pct = I2C_res[1];
+                }
+*/
+                // ******** 2016.06.16 ***********************************************************
+                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 2);
+                if( winchTempPosition != 9999){
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                }
+                flg_ButtonOn = false;
+                Thread::wait(1);
+            }
+            // ====================================
+            // ALL motor off commmand packet send
+            // ====================================
+            else {
+                led3 = 0;
+            #ifdef __IIC_COMAMND_SEND__
+            //    pc.printf("MOTOR STOP STOP STOP STOP STOP STOP STOP STOP \r\n");
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;
+                I2C_cmd[I2C_CP_M1_SPEED] = 0;
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;
+                I2C_cmd[I2C_CP_M2_SPEED] = 0;
+            #endif
+                flg_exp_status &= 0xF0FFFFFF;
+            //    pc.printf("WinchMotorSpeed: %d, %d\r\n", I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_SPEED]);
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                Thread::wait(1);
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                Thread::wait(1);
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                Thread::wait(1);
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                Thread::wait(1);
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+                Thread::wait(1);
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+            }
+            // ---------------------------------------------
+            // Send command to target here ! 2016.09.07
+            // ---------------------------------------------
+        //    pc.printf("WinchMotorSpeed: %d, %d\r\n", I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_SPEED]);
+        //    i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board.
+        }
+    }
+}    
+
+uint32_t getc_fromHost( uint8_t *c ){
+    
+    uint32_t rts = 0;
+    
+    if(pc.readable()){
+        *c = pc.getc();
+        rts = 0;
+    }
+    else{
+         rts = 1;
+    }
+    return rts;  
+}
+
+// **************************************************************
+//  TASK: Hoat Interface Task
+//
+// **************************************************************
+int first_counter = 0;
+void clientPC_interface_task(void const *)
+{
+    int rcv_data_cnt;
+    //winchData_t winchData;
+    
+    char I2C_readcmd[NumberOfI2CCommand+1] = "#010000";
+    
+//    winchData_t winchData;
+//    int16_t winchCurrentPosition;
+    int16_t winchTempPosition;
+    
+    int cnt = 0;
+    int rrr;
+    int cnt2 = 0;
+    
+    int16_t tempWinchPosition = 0;
+    
+    while(1){
+
+    //  DEBUG_PRINT("\r\nWaiting for UDP packet...\r\n");
+        rcv_data_cnt = udp_server.receiveFrom(client, dbuffer, sizeof(dbuffer));
+        Thread::wait(10); 
+        if( rcv_data_cnt < 0 ){
+            DEBUG_PRINT_L0("Bd0> ?? Receive packet fail (%d) ??\r\n", rcv_data_cnt );
+            Thread::wait(100); 
+            cnt2++;
+            if( cnt2 > 5 ){
+                DEBUG_PRINT_L0("Bd0> UDP Server restart\r\n", rcv_data_cnt );
+                udp_server.close();
+                udp_server.bind(UDP_SERVER_PORT);
+            }
+        }
+        else{
+            dbuffer[rcv_data_cnt] = '\0';
+            led4 = 1;
+
+            if(!strcmp( dbuffer, "Hello Z\r\n" )){
+                DEBUG_PRINT_L2("Bd0> Hello Z Packet received from client by UDP\r\n");
+                char snd_data[] = "Hello I'm CrExoB2";
+                udp_server.sendTo(client, snd_data, sizeof(snd_data));
+                Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+            }
+            else if(!strcmp( dbuffer, "status\r\n")){
+                DEBUG_PRINT_L2("Bd0> Hello Status req received from client by UDP\r\n");
+                strcpy(dbuffer,"XXXX\r\n");
+                udp_server.sendTo(client, dbuffer, sizeof(dbuffer));
+                Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+            }
+            else if(!strcmp( dbuffer, "set_jss")){   // Single JS mode
+                baseOperation.sv_JS_OpeMode = 0;
+            }
+            else if(!strcmp( dbuffer, "set_jsd")){   // Dual JS mode
+                baseOperation.sv_JS_OpeMode = 1;
+            }
+            else if(!strcmp( dbuffer, "lsw_valid")){   // Limit swich detection valid
+                flg_lsw_valid = true;
+            }
+            else if(!strcmp( dbuffer, "lsw_invalid")){   // Limit swich detection invalid
+                flg_lsw_valid = false;
+            }
+            else if(!strcmp( dbuffer, "Hello")){
+                DEBUG_PRINT_L0( "Bd0> Hello Packet received from [ 0x%08x ]\r\n", flg_exp_status );
+                
+                /* ***************************************** */
+                /* Read Winch Current Position from Resolver */
+                /* ***************************************** */
+                if (baseOperation.sv_WinchValid == 1){ // read winch current position operation is valid in case of winch part is valid.
+                    winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 0);
+                    if( winchTempPosition != 9999 ){
+                        mtx_wcp.lock();
+                        winchCurrentPosition = winchTempPosition;
+                        mtx_wcp.unlock();
+                    }
+                }
+                Thread::wait(10); 
+               
+                first_counter++;
+                if( first_counter > 10 ) {
+                    sprintf( dbuffer,"OFF_ %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts); // Winch down
+                    first_counter = 10;
+                }
+                else{
+                    sprintf( dbuffer,"JSMD %03d %03d %04d %03d\0", baseOperation.sv_JS_ShapeMode, baseOperation.sv_WinchValid, winchCurrentPosition, limitSw_Sts);
+                //    sprintf( dbuffer,"JSMD %03d %03d 0000 000\0", baseOperation.sv_JS_ShapeMode, baseOperation.sv_WinchValid );    
+                }
+                // -------------------------------------
+                // Crawler Moving
+                // -------------------------------------
+                if( flg_exp_status & 0x00F00000 ){
+                    // Forward move    5
+                    // Reverce move    a
+                    // Right rotation  6
+                    // Left rotation   9
+                    
+                    if((flg_exp_status & 0x00F00000) == 0x00500000 ){
+                        //                 01234 5678 9012 34569
+                        sprintf( dbuffer, "BCFW %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                       Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00a00000 ){ 
+                        sprintf( dbuffer, "BCRV %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00600000 ){ 
+                        sprintf( dbuffer, "BCRR %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00900000 ){ 
+                        sprintf( dbuffer, "BCLR %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00800000 ){ 
+                        sprintf( dbuffer, "LCRV %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00400000 ){
+                        sprintf( dbuffer, "LCFW %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00200000 ){
+                        sprintf( dbuffer, "RCRV %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    else if((flg_exp_status & 0x00F00000) == 0x00100000 ){
+                        sprintf( dbuffer, "RCFW %03d %03d %04d %03d\0" , motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts);
+                        Thread::wait(10); 
+                    } 
+                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
+                //    pc.printf("\t\t\t S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                // -------------------------------------
+                // Transform 
+                // -------------------------------------
+                else if( flg_exp_status & 0x20000000 ){
+                    sprintf(dbuffer,"RF2I %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // RF Crawler Tfm I 
+                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
+                //    pc.printf("\t\t\t S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                else if( flg_exp_status & 0x10000000 ){
+                    sprintf(dbuffer,"RF2K %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // RF Crawler Tfm K
+                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                else if( flg_exp_status & 0x80000000 ){
+                    sprintf(dbuffer,"LB2I %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // LB Crawler Tfm I
+                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                else if( flg_exp_status & 0x40000000 ){
+                    sprintf(dbuffer,"LB2K %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // LB Crawler Tfm K
+                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                // -------------------------------------
+                // Winch Moving
+                // -------------------------------------
+
+                else if( flg_exp_status & 0x01000000 ){ // Wincd down (FWD)
+                    sprintf(dbuffer,"WCDN %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // Winch down
+                    DEBUG_PRINT_WINCH_DATA("Bd0> S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                else if( flg_exp_status & 0x02000000 ){ // Winch up (RVS)
+                    sprintf(dbuffer,"WCUP %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // Winch down
+                    DEBUG_PRINT_WINCH_DATA("Bd0> S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                else if( flg_exp_status & 0x0000000f ){
+                    if( cnt == 3 ){
+                        sprintf( dbuffer,"JSMD %03d %03d %04d %03d\0", baseOperation.sv_JS_ShapeMode, baseOperation.sv_WinchValid, winchCurrentPosition, limitSw_Sts);
+                        cnt = 0;
+                    }
+                    else{
+                        sprintf( dbuffer,"OFF_ %03d %03d %04d %03d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition, limitSw_Sts ); // Winch down
+                    }
+                    cnt++;
+                    DEBUG_PRINT_L2("Bd0> S2C: %s\r\n", dbuffer);
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+
+                else{
+                    sprintf( dbuffer,"OFF_ %03d %03d %04d\0", motor1_current_pct, motor2_current_pct, winchCurrentPosition ); // Winch down
+                    Thread::wait(10);  // When this period seto to short time, gamepad command can not get. 50msec OK
+                }
+                // Send data to client PC
+                udp_server.sendTo(client, dbuffer,  sizeof(dbuffer));
+                Thread::wait(10); 
+
+                // ----------------------------------------------------------------------------
+                // Read target(transform controller) status in each time.
+                rrr = read_motorCurrent( I2C_ADDRESS_TRANSFORM, I2C_res, 4 );                 
+                motor1_current_pct = I2C_res[0];
+                motor2_current_pct = I2C_res[1];
+                limitSw_Sts = I2C_res[3];
+                // ----------------------------------------------------------------------------
+                
+            }
+        }
+        led4 = 0;
+    }        
+}
+
+// **************************************************************
+//  TASK: GamaPad Task
+//
+// **************************************************************
+void gamepad_task(void const *)
+{
+    
+    char I2C_cmd[NumberOfI2CCommand+1] = "#010000000";
+    
+//    int counter = 0;
+    // USB HOST GAMEPAD
+    USBHostGamepad gamepad;
+    
+    led1 = 1;
+
+    while(1) {
+
+        // try to connect a USB Gamepad
+        while(!gamepad.connect()) {
+            flg_gamePad_Connected = 0;
+            led2 = OFF;
+        //    led1 = 1;
+            Thread::wait(500);
+        }
+
+        // when connected, attach handler called on gamepad event
+        gamepad.attachEvent(onControl);
+
+        // wait until the Gamepad is disconnected
+        while(gamepad.connected()) {
+            flg_gamePad_Connected = 1;
+            led2 = !led2;
+            led2 = ON;
+        //    led1 = 1;   
+
+            // Send status to Handy Ctrl controller, but currently this is only for Main Controller.
+            I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = 0x00;
+            I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = 0x01;
+            i2c.write(I2C_ADDRESS_HANDY, I2C_cmd, NumberOfI2CCommand);
+            // DEBUG_PRINT_L2("Bd0> Send Handy Controller(%02x) >>>>>>>>>>\r\n",I2C_ADDRESS_HANDY );
+                
+            Thread::wait(500);
+        }
+    }
+}
+
+// ======================================================================
+// Read setting value from lpcal file system of mbed
+// ======================================================================
+
+bool read_LFS( setValue_t* setValue ){
+    FILE    *fp;
+    char    *fname = "/local/set.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,"%04d",&data);setValue->winchCtrl.sv_WDM_ith_F=data; pc.printf("%04d",setValue->winchCtrl.sv_WDM_ith_F); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WDM_ith_R=data; pc.printf("%04d",setValue->winchCtrl.sv_WDM_ith_R); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WRM_ith_F=data; pc.printf("%04d",setValue->winchCtrl.sv_WRM_ith_F); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%04d",&data);setValue->winchCtrl.sv_WRM_ith_R=data; pc.printf("%04d",setValue->winchCtrl.sv_WRM_ith_R); fgets(s,100,fp); pc.printf("%s",s);
+    
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_hsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_hsrto_F); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_hsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_hsrto_R); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_lsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_lsrto_F); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WDM_lsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WDM_lsrto_R); fgets(s,100,fp); pc.printf("%s",s);
+    
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_hsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_hsrto_F); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_hsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_hsrto_R); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_lsrto_F=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_lsrto_F); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRM_lsrto_R=data; pc.printf("%03d",setValue->winchCtrl.sv_WRM_lsrto_R); fgets(s,100,fp); pc.printf("%s",s);
+    
+            fscanf(fp,"%05d",&data);setValue->winchCtrl.sv_WRS_DramDmrx100=data;   pc.printf("%04d",setValue->winchCtrl.sv_WRS_DramDmrx100);   fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%05d",&data);setValue->winchCtrl.sv_WRS_CCableDmrx100=data; pc.printf("%04d",setValue->winchCtrl.sv_WRS_CCableDmrx100); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.sv_WRS_RResolution=data;   pc.printf("%03d",setValue->winchCtrl.sv_WRS_RResolution);   fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->winchCtrl.reserved=data;             pc.printf("%03d",setValue->winchCtrl.reserved);             fgets(s,100,fp); pc.printf("%s",s);
+    
+            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_RFTM_ith_F=data;  pc.printf("%04d",setValue->tfmCtrl.sv_RFTM_ith_F);  fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_RFTM_ith_R=data;  pc.printf("%04d",setValue->tfmCtrl.sv_RFTM_ith_R);  fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_LBTM_ith_F=data;  pc.printf("%04d",setValue->tfmCtrl.sv_LBTM_ith_F);  fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%04d",&data);setValue->tfmCtrl.sv_LBTM_ith_R=data;  pc.printf("%04d",setValue->tfmCtrl.sv_LBTM_ith_R);  fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_RFTM_srto_F=data; pc.printf("%03d",setValue->tfmCtrl.sv_RFTM_srto_F); fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_RFTM_srto_R=data; pc.printf("%03d",setValue->tfmCtrl.sv_RFTM_srto_R); fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_LBTM_srto_F=data; pc.printf("%03d",setValue->tfmCtrl.sv_LBTM_srto_F); fgets(s, 100, fp ); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->tfmCtrl.sv_LBTM_srto_R=data; pc.printf("%03d",setValue->tfmCtrl.sv_LBTM_srto_R); fgets(s, 100, fp ); pc.printf("%s",s);
+                
+            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_RFCM_ith_F=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_RFCM_ith_F); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_RFCM_ith_R=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_RFCM_ith_R); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_LBCM_ith_F=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_LBCM_ith_F); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%04d",&data);setValue->crawlerCtrl.sv_LBCM_ith_R=data;  pc.printf("%04d",setValue->crawlerCtrl.sv_LBCM_ith_R); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_srto_F=data; pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_srto_F); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_srto_R=data; pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_srto_R); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_srto_F=data; pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_srto_F); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_srto_R=data; pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_srto_R); fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_dzu=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_dzu);  fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_dzc=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_dzc);  fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_RFCM_dzl=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_RFCM_dzl);  fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_dzu=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_dzu);  fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_dzc=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_dzc);  fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.sv_LBCM_dzl=data;    pc.printf("%03d",setValue->crawlerCtrl.sv_LBCM_dzl);  fgets(s,100,fp); pc.printf("%s",s );
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.reserved1=data;      pc.printf("%03d",setValue->crawlerCtrl.reserved1); fgets(s,100,fp); pc.printf("%s",s);
+            fscanf(fp,"%03d",&data);setValue->crawlerCtrl.reserved2=data;      pc.printf("%03d",setValue->crawlerCtrl.reserved2); 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;   
+}
+
+bool write_LFS_data( char *fname, char* data )
+{
+    FILE    *fp;
+    bool    rts;
+    
+    fp = fopen( fname, "a" );
+    if( fp != NULL ){ 
+        pc.printf( "Writing ... " );
+        fprintf(fp, data );
+        fprintf(fp, "\r\n" );
+        pc.printf( data );
+        pc.printf( "\r\n" );
+        Thread::wait(30);
+        fclose(fp);
+        Thread::wait(30);
+        rts = true;
+    }
+    else{
+        rts = false;
+        pc.printf("Setting file write data File open error \r\n");
+    }  
+    return rts;
+}
+
+bool write_LFS( setValue_t* setValue )
+{
+    FILE    *fp;
+    char    *fname = "/local/set.txt";
+    bool    rts = true; 
+    char    data[128] = "\0";
+  
+    pc.printf("Set setting data to SET.txt\r\n ");
+
+    fp = fopen(fname, "w");  // Open "SET.txt" on the local file system for writing
+    if( fp != NULL ){ 
+        fprintf(fp, "#### B2 DebrisProbe Setting ####\n");
+        fclose(fp);
+    }
+    else{
+        rts = false;
+        pc.printf("File open error (0)\r\n");
+    }
+    
+    sprintf( data, "%04d # 01 Winch dram motor fwd c-th", setValue->winchCtrl.sv_WDM_ith_F);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 02 Winch dram motor rvs c-th", setValue->winchCtrl.sv_WDM_ith_R);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 03 Winch cable motor fwd c-th", setValue->winchCtrl.sv_WRM_ith_F);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 04 Winch cable motor rvs c-th", setValue->winchCtrl.sv_WRM_ith_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 05 Winch dram motor fws speed high", setValue->winchCtrl.sv_WDM_hsrto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 06 Winch dram motor rvs speed hign", setValue->winchCtrl.sv_WDM_hsrto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 07 Winch dram motor fwd speed slow", setValue->winchCtrl.sv_WDM_lsrto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 08 Winch dram motor rvs speed slow", setValue->winchCtrl.sv_WDM_lsrto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 09 Winch cable motor fwd speed high", setValue->winchCtrl.sv_WRM_hsrto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 10 Winch cable motor rvs speed high", setValue->winchCtrl.sv_WRM_hsrto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 11 Winch cable motor fwd speed slow", setValue->winchCtrl.sv_WRM_lsrto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 12 Winch cable motor rvs speed slow", setValue->winchCtrl.sv_WRM_lsrto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%05d # 13 Winch dram diameterx100", setValue->winchCtrl.sv_WRS_DramDmrx100);  write_LFS_data( fname, data );
+    sprintf( data, "%05d # 14 Winch cable diameterx100", setValue->winchCtrl.sv_WRS_CCableDmrx100);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 15 Winch resolver resolution", setValue->winchCtrl.sv_WRS_RResolution);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 16 reserved", setValue->winchCtrl.reserved);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 17 RF transform motor fwd c-th", setValue->tfmCtrl.sv_RFTM_ith_F);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 18 RF transform motor rvs c-th", setValue->tfmCtrl.sv_RFTM_ith_R);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 19 LB transform motor fwd F-C", setValue->tfmCtrl.sv_LBTM_ith_F);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 20 LB transform motor rvs R-C", setValue->tfmCtrl.sv_LBTM_ith_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 21 RF transform motor fwd speed", setValue->tfmCtrl.sv_RFTM_srto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 22 RF transform motor rvs speed", setValue->tfmCtrl.sv_RFTM_srto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 23 LB transform motor fwd speed slow", setValue->tfmCtrl.sv_LBTM_srto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 24 LB transform motor rvs speed slow", setValue->tfmCtrl.sv_LBTM_srto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 25 RF crawler fwd c-th", setValue->crawlerCtrl.sv_RFCM_ith_F);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 26 RF crawler rvs c-th", setValue->crawlerCtrl.sv_RFCM_ith_R);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 27 LB crawler fwd c-th", setValue->crawlerCtrl.sv_LBCM_ith_F);  write_LFS_data( fname, data );
+    sprintf( data, "%04d # 28 LB crawler rvs c-th", setValue->crawlerCtrl.sv_LBCM_ith_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 29 RF crawler fwd speed", setValue->crawlerCtrl.sv_RFCM_srto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 30 RF crawler rvs speed", setValue->crawlerCtrl.sv_RFCM_srto_R);   write_LFS_data( fname, data );
+    sprintf( data, "%03d # 31 LB crawler fwd speed", setValue->crawlerCtrl.sv_LBCM_srto_F);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 32 LB crawler rvs speed", setValue->crawlerCtrl.sv_LBCM_srto_R);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 33 R joystic upper band width", setValue->crawlerCtrl.sv_RFCM_dzu);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 34 R joystic center value", setValue->crawlerCtrl.sv_RFCM_dzc);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 35 R joystic lower band width", setValue->crawlerCtrl.sv_RFCM_dzl);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 36 L joystic upper band width", setValue->crawlerCtrl.sv_LBCM_dzu);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 37 L joystic center value", setValue->crawlerCtrl.sv_LBCM_dzc);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 38 L joystic lower band width", setValue->crawlerCtrl.sv_LBCM_dzl);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 39 reserved1", setValue->crawlerCtrl.reserved1);  write_LFS_data( fname, data );
+    sprintf( data, "%03d # 40 reserved2", setValue->crawlerCtrl.reserved2);  write_LFS_data( fname, data );
+
+    pc.printf("settig file write completed \r\n ");
+
+    return rts;
+}
+
+// ======================================================================
+// Read Network setting value from lpcal file system of mbed
+// ======================================================================
+int read_NetSetting_lfs( char* ip_address, char* subnet_mask, char* gateway )
+{
+    FILE *rfp;
+
+    DEBUG_PRINT_L3("Bd0> Read Network Setting data from local file system \r\n");
+    rfp = fopen("/local/net.txt", "r");  // Open local file "set.txt" for writing
+    if(!rfp){
+        DEBUG_PRINT_L3("Bd0> **!!local file open error!!**\r\n");
+        return _FAIL_;
+    }
+    else{
+        Thread::wait(50);
+        fscanf(rfp, "%s", ip_address);
+        fscanf(rfp, "%s", subnet_mask);
+        fscanf(rfp, "%s", gateway);
+        fclose(rfp);
+        return _OK_;
+    }     
+}
+// ======================================================================
+// Winch control function
+// ======================================================================
+void winchMovingControl(
+    int             mode,           // Operationg mode: Relative / Abslute
+    char*           dbufferP,       // Date buffer pointer
+    int             dbuffer_s,      // Date buffer size
+    winchData_t*    winchDataP,     // Winch data structure pointer
+    int             winchData_s,     // Winch data structure size
+    char*           I2C_cmd
+){  
+    int rcv_data_cnt;
+//    int moving_data;
+
+    int man_speed1;
+    int man_speed2;
+    
+    int cnt;
+    int rrr;
+    
+    int cnt2 = 0;
+    
+    
+    bool flg_stop_operation = false;
+    bool flg_network_error = false;
+
+    int16_t winchTempPosition;
+
+    char I2C_read[NumberOfI2CCommand+1];
+    char I2C_readcmd[NumberOfI2CCommand+1];
+    
+    char winchPresetPosition[2];
+    
+    int temp;
+    
+//    if (hwbtn_Opeflg == 1){
+//        Thread::wait(1);
+//    }
+//    else{
+        
+        
+        if( flg_ButtonOn == true ) {Thread::wait(2);}
+        
+        I2C_cmd[I2C_CP_M1_FWD_CNTTH_U] = setValue.crawlerCtrl.sv_RFCM_ith_F;
+        I2C_cmd[I2C_CP_M1_RVS_CNTTH_U] = setValue.crawlerCtrl.sv_RFCM_ith_R;
+        I2C_cmd[I2C_CP_M2_FWD_CNTTH_U] = setValue.crawlerCtrl.sv_LBCM_ith_F;
+        I2C_cmd[I2C_CP_M2_RVS_CNTTH_U] = setValue.crawlerCtrl.sv_LBCM_ith_R;
+            
+        if( mode == WINCH_POSITION_CLEAR ){
+            led3 = ON;                      
+            DEBUG_PRINT_L3("Bd0> === WINCH_POSITION_CLEAR ===\r\n");
+            rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
+            DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
+            if( rcv_data_cnt < 0 ){
+                DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
+            //    tcp_client.send( (char*)winchDataP, winchData_s);
+            //    break;
+            }
+            else{
+                DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
+            //    if( !strcmp( dbuffer, "WinchStepDnOf" ) ){
+            //        break;
+            //    }
+            }
+
+            I2C_cmd[I2C_CP_COMMAND] = 'Z';   // Zero clear
+            i2c.write(I2C_ADDRESS_RESOLVER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+            led3 = OFF;
+        }
+        else if ( mode == WINCH_PRESET_BASEDATA )
+        {
+            led3 = ON;                      
+            DEBUG_PRINT_L3("Bd0> === WINCH_PRESET_BASE_DATA ===\r\n");
+            rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
+            DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
+            if( rcv_data_cnt < 0 ){
+                DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
+            }
+            else{
+                DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
+            }
+            DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+            DEBUG_PRINT_L0("Bd0> 4. Send the Calculation base data to Resolver Controller");  
+            DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+            I2C_cmd[I2C_CP_COMMAND_R] = 'R';   // 01: Zero clear 
+       //     I2C_cmd[I2C_CP_WDRAM_DIA_UPPER] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100>>8)&0xFF);    // Dram diameter upper
+       //     I2C_cmd[I2C_CP_WDRAM_DIA_LOWER] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100)&0xFF);       // Dram diameter lower
+            I2C_cmd[I2C_CP_WDRAM_DIA_UPPER] = (uint8_t)((winchDramDiameter>>8)&0xFF);    // Dram diameter upper
+            I2C_cmd[I2C_CP_WDRAM_DIA_LOWER] = (uint8_t)((winchDramDiameter)&0xFF);       // Dram diameter lower
+            I2C_cmd[I2C_CP_CCABLE_DIA_UPPER] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100>>8)&0xFF);  // Cable diameter upper
+            I2C_cmd[I2C_CP_CCABLE_DIA_LOWER] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100)&0xFF);     // Cable diameter lower
+            I2C_cmd[I2C_CP_RESOLVER_RESO] = setValue.winchCtrl.sv_WRS_RResolution;  // Resolver resolution
+            i2c.write(I2C_ADDRESS_RESOLVER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+            led3 = OFF;           
+        }
+        else if ( mode == WINCH_PRESET_POSITION )
+        {
+            led3 = ON;   
+            winchOffsetValue = 0;                   
+            DEBUG_PRINT_L3("Bd0> === WINCH_PRESET_CURRENT_POSITION ===\r\n");
+            rcv_data_cnt = tcp_client.receive( winchPresetPosition, sizeof(winchPresetPosition));
+
+            DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
+            if( rcv_data_cnt < 0 ){
+                DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
+            }
+            else{
+                DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
+                DEBUG_PRINT_L0("Bd0> =================================================================\r\n");
+                I2C_cmd[I2C_CP_COMMAND_R] = 'S';
+                I2C_cmd[I2C_CP_PRESET_CPOS_UPPER] = (uint8_t)(winchPresetPosition[1]);    // <<<<!!!!!!
+                I2C_cmd[I2C_CP_PRESET_CPOS_LOWER] = (uint8_t)(winchPresetPosition[0]);       // <<<<!!!!!!
+                DEBUG_PRINT_L0("Bd0> Preset winch position: %02x %02x (%d) \r\n", winchPresetPosition[1], winchPresetPosition[0], winchOffsetValue);  
+                i2c.write(I2C_ADDRESS_RESOLVER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+                DEBUG_PRINT_L0("Bd0> =================================================================\r\n");            
+            }
+            led3 = OFF;               
+        }
+        else if (( mode == WINCH_MMODE_RELATIVE ) || ( mode == WINCH_MMODE_ABSOLUTE )){
+            if ( mode == WINCH_MMODE_RELATIVE ) DEBUG_PRINT_L3("Bd0> === WINCH_MMODE_RELATIVE === \r\n");
+            if ( mode == WINCH_MMODE_ABSOLUTE ) DEBUG_PRINT_L3("Bd0> === WINCH_MMODE_ABSOLUTE === \r\n");
+            
+            rcv_data_cnt = tcp_client.receive( dbuffer, dbuffer_s);
+            
+            *(dbufferP+rcv_data_cnt) = '\0';
+            winchDataP->operation = '\r\n';
+                
+            DEBUG_PRINT_L3("Bd0> TCP Rcv data count is [%d]\r\n", rcv_data_cnt );
+            // Copy received data to Winch data structure.
+            memcpy( winchDataP, (winchData_t *)dbuffer, winchData_s);
+         //   winchDataP->dt_WinchDstPosition += winchDataP->dt_WinchCntPosition; 
+            DEBUG_PRINT_L3("Bd0> Winch Rtv Move [ From %04d >>> To %04d ]\r\n", winchDataP->dt_WinchCntPosition, winchDataP->dt_WinchDstPosition );
+
+            swbtn_OpeMutex.lock();
+            swbtn_Opeflg = 1;
+            swbtn_OpeMutex.unlock();
+            
+            cnt = 0;
+            cnt2 = 0;
+            
+            while( true ){        
+                while( true ){
+                    led3 = ON;
+                    DEBUG_PRINT_L3("Bd0> == Winch Position ==============\r\n");        
+                    DEBUG_PRINT_L3("Bd0>  CURRENT    : %d\r\n", winchDataP->dt_WinchCntPosition );
+                    DEBUG_PRINT_L3("Bd0>  DESTINATION: %d\r\n", winchDataP->dt_WinchDstPosition );
+                    DEBUG_PRINT_L3("Bd0> ================================\r\n");        
+
+                    tcp_client.set_blocking(false, 500);   // Timeout after (3500) msec
+
+                    tcp_client.send( (char*)winchDataP, winchData_s);
+                    DEBUG_PRINT_L3("Bd0> Send Winch Rtv data [ %04d >>>> %04d ]\r\n", winchDataP->dt_WinchCntPosition, winchDataP->dt_WinchDstPosition );
+                    
+                    rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
+                    DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
+                    if( rcv_data_cnt < 0 ){
+                        DEBUG_PRINT_L3("##ERROR## Data receive\r\n" );
+                        pc.printf("##ERROR## Data receive Stop Auto Moving mode\r\n" );
+                        cnt++;
+                        if( cnt > 5 ) flg_stop_operation = true;
+                        flg_network_error = true;
+                        break;
+                    }
+                    else{
+                        DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
+                        if( !strcmp( dbuffer, "WinchRtvStop" ) ){
+                            flg_stop_operation = true;
+                            break;
+                        }
+                    }
+                    // Forward rotation : winch down
+                    if( winchDataP->dt_WinchCntPosition < winchDataP->dt_WinchDstPosition ){
+                        pc.printf("WINCH DN\r\n");
+                        set_winchMotorSpeed();  // 2016.08.05 for Fix falling winch motor speed adjustment
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor1 FWD
+                        if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_NEAR_DISTANCE ){
+                            I2C_cmd[I2C_CP_M1_SPEED] = (setValue.winchCtrl.sv_WDM_lsrto_F >> 1); // very slow speed
+                            I2C_cmd[I2C_CP_M2_SPEED] = (setValue.winchCtrl.sv_WRM_lsrto_F >> 1); // very slow speed
+                        }
+                        else if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_DISTANCE ){
+                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_lsrto_F; // slow speed
+                            I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_lsrto_F; // slow speed
+                        }
+                        else{
+                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_F; // normal speed
+                            I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_hsrto_F; // normal speed
+                        } 
+                        temp = 1;             
+                        i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+                        pc.printf("SPEED [%d, %d]\r\n", I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_SPEED]);
+                    }
+                    // Reverse rotation : winch up
+                    else if ( winchDataP->dt_WinchCntPosition > winchDataP->dt_WinchDstPosition ){
+                        pc.printf("WINCH UP\r\n");
+                        set_winchMotorSpeed();  // 2016.08.05 for Fix falling winch motor speed adjustment
+                        I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 RVS
+                        I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor1 RVS
+                        if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_NEAR_DISTANCE ){
+                            I2C_cmd[I2C_CP_M1_SPEED] = (setValue.winchCtrl.sv_WDM_lsrto_R >> 1); // very slow speed
+                            I2C_cmd[I2C_CP_M2_SPEED] = (setValue.winchCtrl.sv_WRM_lsrto_R >> 1); // very slow speed
+                        }
+                        else if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_DISTANCE ){
+                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_lsrto_R; // slow speed
+                            I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_lsrto_R; // slow speed
+                        }
+                        else{
+                            I2C_cmd[I2C_CP_M1_SPEED] = setValue.winchCtrl.sv_WDM_hsrto_R; // normal speed
+                            I2C_cmd[I2C_CP_M2_SPEED] = setValue.winchCtrl.sv_WRM_hsrto_R; // normal speed
+                        }              
+                        temp = 2;             
+                        i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+                        pc.printf("SPEED [%d, %d]\r\n", I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M2_SPEED]);
+                    }
+                    
+                    // Read winch current position from Resolver.
+                    
+                    winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, temp);
+                    if( winchTempPosition != 9999 ){
+                        mtx_wcp.lock();
+                        winchCurrentPosition = winchTempPosition;
+                        mtx_wcp.unlock();
+                    }
+
+                    if ( winchCurrentPosition == winchDataP->dt_WinchDstPosition ){
+                        pc.printf("!!! WINCH STOP !!!\r\n");
+                        break;
+                    }
+
+                    mtx_wcp.lock();
+                    winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
+                    mtx_wcp.unlock();
+                    winchDataP->operation = 0x00;
+                    //i2c.read(I2C_ADDRESS_RESOLVER, I2C_resdata, 2); // Read
+                    //res_position = (I2C_resdata[1] << 8) | I2C_resdata[0]; 
+                    // --------------------------------------------------
+                    //  Read motor current => commented out : 2016.11.08            
+                    // --------------------------------------------------
+/*
+                    rrr = read_motorCurrent( I2C_ADDRESS_WINCH, I2C_read, 3 );
+                    winchDataP->dt_WinchMotor1Current = I2C_read[0];     // Motor current set
+                    winchDataP->dt_WinchMotor2Current = I2C_read[1];     // Motor current set
+                    winchDataP->operation = I2C_read[2];
+                    DEBUG_PRINT_L3("Bd0> 15: ReadMotorCurrent (%d)%\r\n", winchDataP->dt_WinchMotor1Current ); 
+                    DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\r\n", I2C_ADDRESS_WINCH, I2C_read[0]);
+                    DEBUG_PRINT_WINCH_DATA("Bd0> MC1(%d) MC2(%d) Ope(%d)\r\n", winchDataP->dt_WinchMotor1Current, winchDataP->dt_WinchMotor2Current, winchDataP->operation);
+*/
+                    led3 = OFF; 
+                    if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) == 0 ){
+               //     if( winchDataP->dt_WinchCntPosition == winchDataP->dt_WinchDstPosition ){
+                        DEBUG_PRINT_L3( "Bd0> Current:%d -> Destination:%d\r\n" , winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition); 
+                        break;
+                    }                      
+                    Thread::wait(1);   // Time interval for program debugging    
+                    // 2016.08.31:  Following will be commented out. Must not send IIC commnad after read motor current !!
+                    // i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+                }
+                
+                DEBUG_PRINT_L3( "Bd0> ! Winch Stop\r\n" ); 
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP;   // Motor1 STOP
+                I2C_cmd[I2C_CP_M1_SPEED] = 0;     // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP;   // Motor2 STOP
+                I2C_cmd[I2C_CP_M2_SPEED] = 0;     // Speed
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+                
+                if( flg_network_error == true )
+                {
+                    // Network Error then abort !
+                    break;
+                }
+
+                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 0);
+                if( winchTempPosition != 9999 ){
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                }
+
+                mtx_wcp.lock();
+                winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
+                mtx_wcp.unlock();
+                winchDataP->operation = 0x00;
+                DEBUG_PRINT_L3("Bd0> Check destination is same to setting point or not: %d\r\n", winchCurrentPosition); 
+                if( winchDataP->dt_WinchDstPosition == winchCurrentPosition ){
+                    cnt++;
+                    DEBUG_PRINT_L3("Bd0> Destination is same to setting point, then stop operation\r\n" );
+                    winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 0);
+                    if( winchTempPosition != 9999 ){
+                        mtx_wcp.lock();
+                        winchCurrentPosition = winchTempPosition;
+                        mtx_wcp.unlock();
+                    }
+                    if ( cnt >= 5 ){
+                        break;  // When final destination == set point , then break. else adjust position again.
+                    }
+                }
+                // Force Stop by Stop button
+                if( flg_stop_operation == true ){
+                    DEBUG_PRINT_L3("Bd0> Winch auto operation force stop\r\n" );
+                    flg_stop_operation = false;
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                    break;
+                }
+            }
+/*            
+            Thread::wait(300);   // Time interval for program debugging   
+            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
+            if( winchTempPosition != -1 ){
+                mtx_wcp.lock();
+                winchCurrentPosition = winchTempPosition;
+                mtx_wcp.unlock();
+            }
+            mtx_wcp.lock();            
+            winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
+            mtx_wcp.unlock();
+            winchDataP->operation = 0x00;
+            DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\r\n", winchDataP->dt_WinchCntPosition); 
+            tcp_client.send( (char*)winchDataP, winchData_s);
+                        
+            Thread::wait(300);   // Time interval for program debugging   
+            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER);
+            if( winchTempPosition != -1 ){
+                mtx_wcp.lock();
+                winchCurrentPosition = winchTempPosition;
+                mtx_wcp.unlock();
+            }
+            mtx_wcp.lock();            
+            winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
+            mtx_wcp.unlock();
+            winchDataP->operation = 0x00;            
+            DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\r\n", winchDataP->dt_WinchCntPosition); 
+            tcp_client.send( (char*)winchDataP, winchData_s);
+*/
+            Thread::wait(300);   // Time interval for program debugging   
+            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 0);
+            if( winchTempPosition != 9999 ){
+                mtx_wcp.lock();
+                winchCurrentPosition = winchTempPosition;
+                mtx_wcp.unlock();
+            }
+            mtx_wcp.lock();            
+            winchDataP->dt_WinchCntPosition = winchCurrentPosition;    // Current position.
+            mtx_wcp.unlock();
+            winchDataP->operation = 0x77;
+            DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\r\n", winchDataP->dt_WinchCntPosition); 
+            pc.printf("SEND 0x99 0x99 0x99 [ %x]\r\n", winchDataP->operation);
+            tcp_client.send( (char*)winchDataP, winchData_s);
+            
+            swbtn_OpeMutex.lock();
+            swbtn_Opeflg = 0;
+            swbtn_OpeMutex.unlock();
+            
+            led3 = OFF;     
+            tcp_client.set_blocking(false, 3500);   // Timeout after (3500) msec
+        }
+
+        // ----------------------------------------------------------
+        // In case of commad received from PC by TCP connection.
+        // In case of hard ware button pushed is by gamepad task
+        // ----------------------------------------------------------
+        else if (( mode == WINCH_STEPDOWN_BTN_ON )||( mode == WINCH_U_STEPDOWN_BTN_ON )) {
+            
+            if ( mode == WINCH_STEPDOWN_BTN_ON )    DEBUG_PRINT_L3( "Bd0> === WINCH_STEPDOWN_BTN_ON ===\r\n" );
+            if ( mode == WINCH_U_STEPDOWN_BTN_ON )  DEBUG_PRINT_L3( "Bd0> === WINCH_U_STEPDOWN_BTN_ON ===\r\n" );
+            
+            swbtn_OpeMutex.lock();
+            swbtn_Opeflg = 1;
+            swbtn_OpeMutex.unlock();
+            while( 1 ){
+                tcp_client.set_blocking(false, 500);   // Timeout after (3500) msec
+                led3 = ON;                      
+                DEBUG_PRINT_L3("Bd0> WINCH_STEPDOWN_BTN_ON\r\n");
+                rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
+                DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
+                if( rcv_data_cnt < 0 ){
+                    DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
+                //    tcp_client.send( (char*)winchDataP, winchData_s);
+                    break;
+                }
+                else{
+                    DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
+                    if(( !strcmp( dbuffer, "WinchStepDnOf" ))||( !strcmp( dbuffer, "WinchuStepDnOf" )) ){
+                        break;
+                    }
+                }
+ 
+                set_winchMotorSpeed();  // 2016.08.05 for Fix falling winch motor speed adjustment
+            //    if ( mode == WINCH_U_STEPDOWN_BTN_ON ) man_speed = 50;
+            //    else man_speed = 100;
+                if ( mode == WINCH_U_STEPDOWN_BTN_ON ){
+                     man_speed1 = (setValue.winchCtrl.sv_WDM_hsrto_F >> 1);
+                     man_speed2 = (setValue.winchCtrl.sv_WRM_hsrto_F >> 1);
+                }
+                else{
+                     man_speed1 = setValue.winchCtrl.sv_WDM_hsrto_F;
+                     man_speed2 = setValue.winchCtrl.sv_WRM_hsrto_F;
+                }
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_FWD; // Motor1 FWD
+                I2C_cmd[I2C_CP_M1_SPEED] = man_speed1; // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_FWD; // Motor1 FWD
+                I2C_cmd[I2C_CP_M2_SPEED] = man_speed2; // Speed
+                DEBUG_PRINT_L3("Bd0> MFSPEED: %02x %02x \r\n", I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M1_SPEED] ); 
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+                led3 = OFF;   
+
+/*
+                rrr = read_motorCurrent( I2C_ADDRESS_WINCH, I2C_read, 3 );
+                winchDataP->dt_WinchMotor1Current = I2C_read[0];
+                winchDataP->dt_WinchMotor2Current = I2C_read[1];
+                winchDataP->operation = I2C_read[2];    // This is motor lock status inform to PC.
+                DEBUG_PRINT_L3( "Bd0> 16: ReadMotorCurrent (%d)%\r\n", winchDataP->dt_WinchMotor1Current ); 
+                if( winchDataP->operation == 0x88 ){
+                   winchDataP->dt_WinchMotor1Current = 0xFF;
+                }
+*/
+                // 2016.08.31:  Following will be commented out. Must not send IIC commnad after read motor current !!
+                // i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+                            
+                DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\r\n", I2C_ADDRESS_WINCH, I2C_read[0]);
+                
+                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 1);
+                if( winchTempPosition != 9999 ){
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                }
+                mtx_wcp.lock();
+                winchDataP->dt_WinchCntPosition = winchCurrentPosition;
+                mtx_wcp.unlock();
+                winchDataP->operation = 0x00;
+                // ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x00 );
+                tcp_client.send( (char*)winchDataP, winchData_s);
+                DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\r\n", winchCurrentPosition );
+            //    Thread::wait(2);   // Time interval for program debugging    
+                // 2016.08.31:  Following will be commented out. Must not send IIC commnad after read motor current !!
+                // i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+            }
+            DEBUG_PRINT_L3( "Bd0> Send Motor Stop by IIC\r\n" );
+            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 FWD
+            I2C_cmd[I2C_CP_M1_SPEED] = 0; // Speed
+            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor2 FWD
+            I2C_cmd[I2C_CP_M2_SPEED] = 0; // Speed
+            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+            
+            DEBUG_PRINT_L3( "Bd0> Send 0x77 2 PC\r\n" );
+            
+            winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 0);
+            if( winchTempPosition != 9999 ){
+                mtx_wcp.lock();
+                winchCurrentPosition = winchTempPosition;
+                mtx_wcp.unlock();
+            }
+            mtx_wcp.lock();
+            winchDataP->dt_WinchCntPosition = winchCurrentPosition;
+            mtx_wcp.unlock();
+            winchDataP->operation = 0x77;
+            //ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x77 );
+            tcp_client.send( (char*)winchDataP, winchData_s);
+            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+            swbtn_OpeMutex.lock();
+            swbtn_Opeflg = 0;
+            swbtn_OpeMutex.unlock();
+            led3 = OFF;  
+            tcp_client.set_blocking(false, 3500);   // Timeout after (3500) msec
+        }
+        // ----------------------------------------------------------
+        // In case of commad received from PC by TCP connection.
+        // In case of hard ware button pushed is by gamepad task
+        // ----------------------------------------------------------
+        else if (( mode == WINCH_STEPUP_BTN_ON )||( mode == WINCH_U_STEPUP_BTN_ON )) {
+
+            if ( mode == WINCH_STEPUP_BTN_ON )  DEBUG_PRINT_L3( "Bd0> === WINCH_STEPUP_BTN_ON ===\r\n" );
+            if ( mode == WINCH_U_STEPUP_BTN_ON )    DEBUG_PRINT_L3( "Bd0> === WINCH_U_STEPUP_BTN_ON ===\r\n" );
+            
+            swbtn_OpeMutex.lock();
+            swbtn_Opeflg = 1;
+            swbtn_OpeMutex.unlock();
+            while( 1 ){
+                tcp_client.set_blocking(false, 500);   // Timeout after (3500) msec
+                led3 = ON;                      
+                DEBUG_PRINT_L3("Bd0> WINCH_STEPUP_BTN_ON\r\n");
+                rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s);
+                DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );                         
+                if( rcv_data_cnt < 0 ){
+                    DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\r\n" );
+                //    tcp_client.send( (char*)winchDataP, winchData_s);
+                    break;
+                }
+                else{
+                    DEBUG_PRINT_L3("Bd0> %s\r\n", dbuffer );
+                    if(
+                        ( !strcmp( dbuffer, "WinchStepUpOf" ))||(!strcmp( dbuffer, "WinchuStepUpOf" )) ){
+                        break;
+                    }
+                }
+
+                set_winchMotorSpeed();  // 2016.08.05 for Fix falling winch motor speed adjustment
+            //    if ( mode == WINCH_U_STEPDOWN_BTN_ON ) man_speed = 50;
+            //    else man_speed = 100;
+                if ( mode == WINCH_U_STEPUP_BTN_ON ){
+                     man_speed1 = (setValue.winchCtrl.sv_WDM_hsrto_R >> 1);
+                     man_speed2 = (setValue.winchCtrl.sv_WRM_hsrto_R >> 1);
+                }
+                else{
+                     man_speed1 = setValue.winchCtrl.sv_WDM_hsrto_R;
+                     man_speed2 = setValue.winchCtrl.sv_WRM_hsrto_R;
+                }
+                
+                I2C_cmd[I2C_CP_M1_DIR] = MOTOR_RVS; // Motor1 FWD
+                I2C_cmd[I2C_CP_M1_SPEED] = man_speed1; // Speed
+                I2C_cmd[I2C_CP_M2_DIR] = MOTOR_RVS; // Motor1 FWD
+                I2C_cmd[I2C_CP_M2_SPEED] = man_speed2; // Speed
+                DEBUG_PRINT_L3("Bd0> MRSPEED: %02x %02x \r\n", I2C_cmd[I2C_CP_M1_SPEED], I2C_cmd[I2C_CP_M1_SPEED] ); 
+                i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+                led3 = OFF;
+                // read winch motor current value is commented out : 2016.11.08
+ /*               
+                rrr = read_motorCurrent( I2C_ADDRESS_WINCH, I2C_read, 3 );
+                winchDataP->dt_WinchMotor1Current = I2C_read[0];
+                winchDataP->dt_WinchMotor2Current = I2C_read[1];
+                winchDataP->operation = I2C_read[2];    // This is motor lock status inform to PC.
+                DEBUG_PRINT_L3( "Bd0> 17: ReadMotorCurrent (%d)%\r\n", winchDataP->dt_WinchMotor1Current ); 
+                if( winchDataP->operation == 0x88 ){
+                    winchDataP->dt_WinchMotor1Current = 0xFF;
+                }            
+*/
+                // 2016.08.31:  Following will be commented out. Must not send IIC commnad after read motor current !!
+                // i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+                DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\r\n", I2C_ADDRESS_WINCH, I2C_read[0]);
+                
+                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 2);
+                if( winchTempPosition != 9999 ){
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                }
+                mtx_wcp.lock();
+                winchDataP->dt_WinchCntPosition = winchCurrentPosition;
+                mtx_wcp.unlock();
+                winchDataP->operation = 0x00;
+                // ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x00 );
+                tcp_client.send( (char*)winchDataP, winchData_s);
+                DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\r\n", winchCurrentPosition );
+           //     Thread::wait(2);   // Time interval for program debugging    
+                // 2016.08.31:  Following will be commented out. Must not send IIC commnad after read motor current !!
+                // i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+            }
+            DEBUG_PRINT_L3( "Bd0> Send Motor Stop by IIC\r\n" );
+            I2C_cmd[I2C_CP_M1_DIR] = MOTOR_STP; // Motor1 FWD
+            I2C_cmd[I2C_CP_M1_SPEED] = 0; // Speed
+            I2C_cmd[I2C_CP_M2_DIR] = MOTOR_STP; // Motor2 FWD
+            I2C_cmd[I2C_CP_M2_SPEED] = 0; // Speed
+            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+            DEBUG_PRINT_L3( "Bd0> Send 0x77 2 PC\r\n" );
+            if( flg_ButtonOn == false ){
+                winchTempPosition = ReadWinchCurrentPosition(I2C_ADDRESS_RESOLVER, 0);
+                if( winchTempPosition != 9999 ){
+                    mtx_wcp.lock();
+                    winchCurrentPosition = winchTempPosition;
+                    mtx_wcp.unlock();
+                }
+                mtx_wcp.lock();
+                winchDataP->dt_WinchCntPosition = winchCurrentPosition;
+                mtx_wcp.unlock();
+                winchDataP->operation = 0x77;
+            // ReadCurrentPositon(I2C_ADDRESS_RESOLVER, winchDataP, winchData_s, 0x77 );
+                tcp_client.send( (char*)winchDataP, winchData_s);
+            }
+            i2c.write(I2C_ADDRESS_WINCH, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+            
+            swbtn_OpeMutex.lock();
+            swbtn_Opeflg = 0;
+            swbtn_OpeMutex.unlock();
+                   
+            led3 = OFF;  
+            tcp_client.set_blocking(false, 3500);   // Timeout after (3500) msec
+        }
+
+        else {
+        //    DEBUG_PRINT_L3("STEPSTEPSTEPSTEPSTEP\r\n");
+        }
+//    }
+}
+
+extern "C" {
+#include "rt_TypeDef.h"
+#include "rt_System.h"
+}
+// **********************************************************************
+//
+//    Main Function of this program
+//
+// **********************************************************************
+int main()
+{
+    Mutex           file_access_mutex;
+    setValue_t      new_setValue;      // Setting Data
+    winchData_t     winchData;
+
+    char I2C_cmd[NumberOfI2CCommand+1] = "#010000000";
+//    char I2C_res[NumberOfI2CCommand+1] = "\0";
+    
+//    char* ip_address;
+//    char* subnet_mask;
+//    char* gateway;
+    
+    int ret;
+    int try_cnt;
+    int rcv_data_cnt;
+
+    bool flg_ethernet = false;
+    
+    char ttt[20];
+    char winchOffset[4];
+    
+    // Set UART(USB) baudrate
+    pc.baud(115200);
+    
+    cf_led_demo( &led1, &led2, &led3, &led4, 10, 15 );
+
+    DEBUG_PRINT_L0("\r\n");
+    DEBUG_PRINT_L0("Bd0> +--------------------------------------------------------------\r\n");
+    DEBUG_PRINT_L0("Bd0> | Project: B2 Crawler Explorer for 1F-1 PCV internal inspection\r\n");
+    DEBUG_PRINT_L0("Bd0> |---------\r\n");
+    DEBUG_PRINT_L0("Bd0> | This is: Main Control Program of Main Controller\r\n");
+    DEBUG_PRINT_L0("Bd0> |   Target MCU: mbed LPC1768\r\n");
+    DEBUG_PRINT_L0("Bd0> |   Letest update: %s\r\n", LatestUpDate);
+    DEBUG_PRINT_L0("Bd0> |   Program Revision: %s\r\n", ProgramRevision);
+    DEBUG_PRINT_L0("Bd0> |   Author: %s\r\n", Author);
+    DEBUG_PRINT_L0("Bd0> |   Copyright(C) 2015 %s Allright Reserved\r\n", Company);
+    DEBUG_PRINT_L0("Bd0> ---------------------------------------------------------------\r\n");
+    sprintf( ttt, "%s", ProgramRevision );
+    
+    DEBUG_PRINT_L0("Bd0> Start ststem initializing ...\r\n");
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+    DEBUG_PRINT_L0("Bd0> 1. Initalizing Ethernet ...\r\n");    
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+    
+#ifdef __NET_SETTING_FROM_LFS__
+    char ip_address[20];
+    char subnet_mask[20];
+    char gateway[20];
+    read_NetSetting_lfs( ip_address, subnet_mask, gateway );
+#else
+    const char* ip_address;
+    const char* subnet_mask;
+    const char* gateway;
+    ip_address = "192.168.0.24";
+    subnet_mask = "255.255.255.0";
+    gateway = "192.168.0.0";
+#endif    
+    DEBUG_PRINT_L0("Bd0> --------------------------------------\r\n");
+    DEBUG_PRINT_L0("Bd0> ip address     : %s\r\n", ip_address);
+    DEBUG_PRINT_L0("Bd0> subnet mask    : %s\r\n", subnet_mask);
+    DEBUG_PRINT_L0("Bd0> default gateway: %s\r\n", gateway);
+    DEBUG_PRINT_L0("Bd0> --------------------------------------\r\n");
+    
+#ifdef __ETERNET_DHCP__
+    ret = eth.init();   // Use DHCP
+#else // __ETERNET_DHCP__ 
+    ret = eth.init(   
+            ip_address,         // const char* ip, 
+            subnet_mask,     // const char* mask, 
+            gateway          // const char* gateway
+    );
+#endif // __ETERNET_DHCP__ 
+    if( ret == 0 ){
+        DEBUG_PRINT_L0("Bd0> Eternet init ... OK\r\n");
+        ret = eth.connect();
+        if( ret == 0 ){
+            cf_led_onoff( &led1,&led2,&led3,&led4, false, false, false, true );
+            DEBUG_PRINT_L0("Bd0> Eternat connect ... OK\r\n");    
+            DEBUG_PRINT_L0("Bd0> [ IP Address : %s ]\r\n", eth.getIPAddress());   
+            udp_server.bind(UDP_SERVER_PORT);
+            tcp_server.bind(TCP_SERVER_PORT);
+            tcp_server.listen();
+            flg_ethernet = true;
+            led4 = ON; // Ethernet OK
+        }
+        else{
+            cf_led_error( &led1,&led2,&led3,&led4 );         
+            DEBUG_PRINT_L0("Bd0> ***ERROR*** Eternat connect Fali\r\n");
+            DEBUG_PRINT_L0("Bd0> This programis booting in Stand alone mode.\r\n");  
+        }
+    }
+    else{
+        DEBUG_PRINT_L0("Bd0> *** ERROR*** Eternat init Fail\r\n");  
+        DEBUG_PRINT_L0("Bd0> This programis booting in Stand alone mode.\r\n");  
+    }
+
+    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("Bd0> =============================================================\r\n");
+    DEBUG_PRINT_L0("Bd0> 2. Read setting value from LFS\r\n");
+    DEBUG_PRINT_L0("Bd0> =============================================================\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
+    // --------------------------------------------------------------------
+    try_cnt = LFS_READ_COUNT;
+    while( 1 ){   
+        if( read_LFS(&setValue) == true ) break;
+        else try_cnt -= 1;
+        if( try_cnt == 0 ){
+            DEBUG_PRINT_L0("Bd0> ***ERROR*** LFS read error\r\n");
+            while(1){
+                led1 = !led1;
+                Thread::wait(30);
+            }            
+        }
+    }
+
+    DEBUG_PRINT_L0("Bd0> LFS read OK\r\n");
+    led3 = ON;  // Setting Data Read OK
+
+#ifdef __TARGET_BOARD_CHECK__
+    //---------------------------------------------------
+    // Checking Targer LCXpresso824-MAX board here.
+    // Send Hello Packet and waiting reply message from
+    // target.
+    // When error occured, LED1 will blinking slowly.
+    //---------------------------------------------------
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+    DEBUG_PRINT_L0("Vd0> 3. Check the target controler\r\n");
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+
+    try_cnt = TARGET_CHECK_COUNT;
+    while(1){
+        // Check each target motor control 824 board here
+        i2c.read(I2C_ADDRESS_WINCH, I2C_res, NumberOfI2CCommand);
+        if( I2C_res[4] == 'S' ){
+            DEBUG_PRINT_L0("Bd0> Try count            : %02d/%02d\r\n", TARGET_CHECK_COUNT - try_cnt, TARGET_CHECK_COUNT );
+            DEBUG_PRINT_L0("Bd0> Return from (0x%02x) : '%c'\r\n", I2C_ADDRESS_WINCH, I2C_res[4]);
+            break;
+        }
+        else try_cnt -= 1;
+        if( try_cnt == 0 ){
+            DEBUG_PRINT_L0("Bd0> ##ERROR : Target(0x02)##\r\n",I2C_ADDRESS_WINCH);
+            led1 = OFF;
+            while(1){
+                led1 = !led1;       // ON
+                Thread::wait(80);
+            }            
+        }
+    }
+
+    try_cnt = TARGET_CHECK_COUNT;
+    while(1){
+        // Check each target motor control 824 board here
+        i2c.read(I2C_ADDRESS_TRANSFORM, I2C_res, NumberOfI2CCommand);
+        if( I2C_res[4] == 'S' ){
+            DEBUG_PRINT_L0("Bd0> Try count: %02d/%02d\r\n", TARGET_CHECK_COUNT - try_cnt, TARGET_CHECK_COUNT );
+            DEBUG_PRINT_L0("Bd0> Return from (0x%02x): '%c'\r\n", I2C_ADDRESS_TRANSFORM, I2C_res[4]);
+            break;
+        }
+        else try_cnt -= 1;
+        if( try_cnt == 0 ){
+            DEBUG_PRINT_L0("Bd0> ##ERROR : Target(0x02)##\r\n",I2C_ADDRESS_TRANSFORM);
+            led1 = OFF;
+            while(1){
+                led2 = !led2;       // ON
+                Thread::wait(80);
+            }            
+        }
+    }    
+    try_cnt = TARGET_CHECK_COUNT;
+    while(1){
+        // Check each target motor control 824 board here
+        i2c.read(I2C_ADDRESS_CRAWLER, I2C_res, NumberOfI2CCommand);
+        if( I2C_res[4] == 'S' ){
+            DEBUG_PRINT_L0("Bd0> Try count            : %02d/%02d\r\n", TARGET_CHECK_COUNT - try_cnt, TARGET_CHECK_COUNT );
+            DEBUG_PRINT_L0("Bd0> Return from (0x%02x) : '%c'\r\n", I2C_ADDRESS_CRAWLER, I2C_res[4]);
+            break;
+        }
+        else try_cnt -= 1;
+        if( try_cnt == 0 ){
+            DEBUG_PRINT_L0("Bd0> ##ERROR : Target(0x02)##\r\n",I2C_ADDRESS_CRAWLER);
+            led1 = OFF;
+            while(1){
+                led3 = !led3;       // ON
+                Thread::wait(80);
+            }            
+        }
+    }
+    DEBUG_PRINT_L0("Bd0> -------------------\r\n");  
+    DEBUG_PRINT_L0("Bd0> Target system found\r\n");  
+    DEBUG_PRINT_L0("Bd0> -------------------\r\n");  
+#endif // __TARGET_BOARD_CHECK__
+
+    led2 = ON; // Check target OK
+
+    /* Set basic function default setting */ 
+    baseOperation.sv_JS_OpeMode = 0;
+    baseOperation.sv_JS_OpeMode = 0;
+    baseOperation.sv_WinchValid = 0;
+
+
+    /* 
+    **************************************************
+    Send Calculation Data to Resolver Controller
+    **************************************************
+    */
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+    DEBUG_PRINT_L0("Bd0> 4. Send the Calculation base data to Resolver Controller");  
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+    I2C_cmd[I2C_CP_COMMAND_R] = 'R';   // 01: Preset resolver base data 
+    // I2C_cmd[I2C_CP_WDRAM_DIA_UPPER] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100>>8)&0xFF);    // Dram diameter upper
+    // I2C_cmd[I2C_CP_WDRAM_DIA_LOWER] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100)&0xFF);       // Dram diameter lower
+    I2C_cmd[I2C_CP_WDRAM_DIA_UPPER] = (uint8_t)((winchDramDiameter>>8)&0xFF);    // Dram diameter upper
+    I2C_cmd[I2C_CP_WDRAM_DIA_LOWER] = (uint8_t)((winchDramDiameter)&0xFF);       // Dram diameter lower
+    I2C_cmd[I2C_CP_CCABLE_DIA_UPPER] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100>>8)&0xFF);  // Cable diameter upper
+    I2C_cmd[I2C_CP_CCABLE_DIA_LOWER] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100)&0xFF);     // Cable diameter lower
+    I2C_cmd[I2C_CP_RESOLVER_RESO] = setValue.winchCtrl.sv_WRS_RResolution;  // Resolver resolution
+    
+    for( int j = 0; j < NumberOfI2CCommand; j++)
+        DEBUG_PRINT_L0("%02x ", I2C_cmd[j]); 
+    DEBUG_PRINT_L0( "\r\n" );
+                    
+    i2c.write(I2C_ADDRESS_RESOLVER, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+    DEBUG_PRINT_L0(" ... done\r\n");      
+    
+    // Thread (
+    //    void(*task)(void const *argument), 
+    //    void *argument=NULL, 
+    //    osPriority priority=osPriorityNormal, 
+    //    uint32_t stack_size=DEFAULT_STACK_SIZE, 
+    //    unsigned char *stack_pointer=NULL
+    //)
+
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+    DEBUG_PRINT_L0("Bd0> 5. Start the task\r\n");  
+    /* Max thread count is (may be ..) 2, How can I increase this , I don't know ?? */  
+//    Thread thread_hif(clientPC_interface_task, NULL, osPriorityNormal, DEFAULT_STACK_SIZE*2.25); 
+//    if( flg_ethernet == true )
+//    {
+        DEBUG_PRINT_L0("Bd0> Start host interface task ... ");
+        Thread thread_hif(clientPC_interface_task, NULL, osPriorityNormal, 128*4); 
+        DEBUG_PRINT_L0("\r\nBd0> Start host gamepad task ... ");
+        Thread thread_gpd(gamepad_task, NULL, osPriorityNormal, 128*4);
+//    }
+//    else{
+//        DEBUG_PRINT_L0("\r\nBd0> Start host gamepad task ... ");
+//        Thread thread_gpd(gamepad_task, NULL, osPriorityNormal, 256*4);
+//    }
+    DEBUG_PRINT_L0("\r\n");
+    DEBUG_PRINT_L0("Bd0> =============================================================\r\n");
+
+    DEBUG_PRINT_L0( "Bd0> ----------------------------------\r\n");
+    DEBUG_PRINT_L0( "Bd0> >>>> Initializing completed ! <<<<\r\n");
+    DEBUG_PRINT_L0( "Bd0> ----------------------------------\r\n");
+  
+    led4 = OFF;
+    led3 = OFF;
+    led2 = OFF;
+    led1 = ON;  // Initializing is OK then Power Indicator LED ON
+    
+    I2C_cmd[4] = 0x00;
+    I2C_cmd[5] = 0x01;
+    i2c.write(I2C_ADDRESS_HANDY, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board
+
+    while( true ) {
+        Thread::wait(10);
+        // -----------------------------------------------------------------
+        // Communicate with client PC program.
+        //    TCP connection: 
+        // -----------------------------------------------------------------
+        if( flg_ethernet == true ) // in case of Ethernet OK
+        {
+            tcp_server.accept(tcp_client);
+            tcp_client.set_blocking(false, 3500);   // Timeout after (3500) msec
+            DEBUG_PRINT_L3("Bd0> ----------------------------\r\n");
+            DEBUG_PRINT_L3("Bd0> TCP Connection from: %s\r\n", tcp_client.get_address());
+            DEBUG_PRINT_L3("Bd0> ----------------------------\r\n");
+                        
+            while(true){
+                                
+               // --------------------------------------------------------------
+               // Following instructions are blocking when no ethernet access                 
+               // --------------------------------------------------------------
+                rcv_data_cnt = tcp_client.receive(dbuffer, sizeof(dbuffer));
+                DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\r\n", rcv_data_cnt );
+                if( rcv_data_cnt < 0 ){
+                //    DEBUG_PRINT("## TCP Receive packet fail ##\r\n");
+                    break;
+                }
+                else{
+                    if( !strcmp( dbuffer, "WinchPositionClear" ) ){
+                        winchMovingControl( 
+                            WINCH_POSITION_CLEAR,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                        winchOffsetValue = 0;
+                        DEBUG_PRINT_L0( "Bd0> WinchPositionClear\r\n");
+                    }
+                    else if( !strcmp( dbuffer, "WinchPresetBaseData" ) ){
+                        winchMovingControl( 
+                            WINCH_PRESET_BASEDATA,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                        DEBUG_PRINT_L0( "Bd0> WinchPresetBaseData\r\n");
+                    }
+                    else if( !strcmp( dbuffer, "WinchPresetPosition" ) ){
+                        winchMovingControl( 
+                            WINCH_PRESET_POSITION,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                        winchOffsetValue = 0;
+                        DEBUG_PRINT_L0( "Bd0> WinchPresetPosition\r\n");
+                    }
+                    else if( !strcmp( dbuffer, "WinchRtvStart" ) ){
+                        winchMovingControl( 
+                            WINCH_MMODE_RELATIVE,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "WinchAbsStart" ) ){
+                        winchMovingControl( 
+                            WINCH_MMODE_ABSOLUTE,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "WinchStepUpOn" ) ){
+                        winchMovingControl( 
+                            WINCH_STEPUP_BTN_ON,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );  
+                    }
+                    else if( !strcmp( dbuffer, "WinchStepUpOf" ) ){
+                        winchMovingControl( 
+                            WINCH_STEPUP_BTN_OFF,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "WinchStepDnOn" ) ){
+                        winchMovingControl( 
+                            WINCH_STEPDOWN_BTN_ON,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "WinchStepDnOf" ) ){
+                        winchMovingControl( 
+                            WINCH_STEPDOWN_BTN_OFF,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+
+                    else if( !strcmp( dbuffer, "WinchuStepUpOn" ) ){
+                        winchMovingControl( 
+                            WINCH_U_STEPUP_BTN_ON,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );  
+                    }
+                    else if( !strcmp( dbuffer, "WinchuStepUpOf" ) ){
+                        winchMovingControl( 
+                            WINCH_U_STEPUP_BTN_OFF,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "WinchuStepDnOn" ) ){
+                        winchMovingControl( 
+                            WINCH_U_STEPDOWN_BTN_ON,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "WinchuStepDnOf" ) ){
+                        winchMovingControl( 
+                            WINCH_U_STEPDOWN_BTN_OFF,
+                            dbuffer,
+                            sizeof(dbuffer),
+                            &winchData,
+                            sizeof( winchData ),
+                            I2C_cmd
+                        );
+                    }
+                    else if( !strcmp( dbuffer, "SetOffset" ) ){
+                        // Get winch offset value and winch bash parameter ( dram diameter ) from host PC.
+                        // 2017.01.06 added
+                        strcpy( dbuffer, "\0" ); // Prevent for this instruction is done twice.
+                        DEBUG_PRINT_L3("Bd0> SetOffset value Request from client\r\n");
+                        rcv_data_cnt = tcp_client.receive( winchOffset, sizeof(winchOffset));
+                        winchOffsetValue = (winchOffset[1]<<8 | winchOffset[0]);
+                        winchDramDiameter = (winchOffset[3]<<8 | winchOffset[2]);
+                        DEBUG_PRINT_L0("//////////////////////////////////////////////////////////////////////////\r\n");
+                        DEBUG_PRINT_L0("Bd0> Set offset instruction received [ cnt=%d, offset=%d, parameter=%d\r\n", rcv_data_cnt, winchOffsetValue, winchDramDiameter );
+                        DEBUG_PRINT_L0("//////////////////////////////////////////////////////////////////////////\r\n");
+                        Thread::wait(1500);
+                    }
+                    else if( !strcmp( dbuffer, "SetValue" ) ){
+                        strcpy( dbuffer, "\0" ); // Prevent for this instruction is done twice.
+                        DEBUG_PRINT_L3("Bd0> SetValue Request from client\r\n");
+                        rcv_data_cnt = tcp_client.receive( (char*)&new_setValue, sizeof(new_setValue));
+                        Thread::wait(1500);
+                        DEBUG_PRINT_L3("Bd0> TCP Rcv data count is [%d]\r\n", rcv_data_cnt );
+                        dspSetValue2Console( &pc, &new_setValue );             
+                    //    DEBUG_PRINT_L0("Bd0> write setting file to local file sysytem\r\n");
+                    //    thread_hif.terminate();
+                    //    thread_gpd.terminate();
+                    //    file_access_mutex.lock();
+                        write_LFS(&new_setValue);
+                    //    file_access_mutex.unlock();
+                        Thread::wait(1000);
+                        DEBUG_PRINT_L0("Bd0> SetValue instruction is over\r\n");
+                    }
+                    else if(!strcmp( dbuffer, "GetValue" )){
+                        DEBUG_PRINT_L3("Bd0> GetValue request from TCP client\r\n");
+                        flg_mutex.lock();       // This is very important
+                        memcpy( &new_setValue, &setValue, sizeof( new_setValue ) );
+                        flg_mutex.unlock();     // This is very important
+                        dspSetValue2Console( &pc, &new_setValue );
+                        tcp_client.send_all( (char*)&new_setValue, sizeof(new_setValue) );
+                        DEBUG_PRINT_L2("(%d)\r\n", sizeof(new_setValue));
+                    }
+                    else if(!strcmp( dbuffer, "SetJSSingle" )){
+                        baseOperation.sv_JS_OpeMode = 0;
+                    }
+                    else if(!strcmp( dbuffer, "SetJSDual" )){
+                        baseOperation.sv_JS_OpeMode = 1;
+                    }
+                }
+                if( rcv_data_cnt <= 0 ) break;             
+            }
+
+            tcp_client.close();
+        }
+    }
+}
\ No newline at end of file