z ysaito / Mbed 2 deprecated Pro_B2_0ZNR_B2DebrisSurvayor_1768LAN

Dependencies:   EthernetInterface TextLCD USBDevice USBHost3 mbed

Fork of USBHostHub_HelloWorld by Samuel Mokrani

Files at this revision

API Documentation at this revision

Comitter:
sayzyas
Date:
Thu Jul 26 00:20:39 2018 +0000
Parent:
14:3a5ae61ab1f4
Child:
16:1adb3f1e867d
Commit message:
2018.07.26

Changed in this revision

0_main.cpp Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
USBDevice.lib Show annotated file Show diff for this revision Revisions of this file
USBHost.lib Show annotated file Show diff for this revision Revisions of this file
common.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
memo.txt Show annotated file Show diff for this revision Revisions of this file
--- 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
--- a/EthernetInterface.lib	Thu Apr 14 10:25:08 2016 +0000
+++ b/EthernetInterface.lib	Thu Jul 26 00:20:39 2018 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/EthernetInterface/#2fc406e2553f
+http://mbed.org/users/mbed_official/code/EthernetInterface/#183490eb1b4a
--- a/USBDevice.lib	Thu Apr 14 10:25:08 2016 +0000
+++ b/USBDevice.lib	Thu Jul 26 00:20:39 2018 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/users/mbed_official/code/USBDevice/#2af474687369
+http://developer.mbed.org/users/mbed_official/code/USBDevice/#01321bd6ff89
--- a/USBHost.lib	Thu Apr 14 10:25:08 2016 +0000
+++ b/USBHost.lib	Thu Jul 26 00:20:39 2018 +0000
@@ -1,1 +1,1 @@
-https://mbed.org/users/mbed_official/code/USBHost/#8fbe33e98b2b
+https://mbed.org/users/mbed_official/code/USBHost/#1675750cca08
--- a/common.h	Thu Apr 14 10:25:08 2016 +0000
+++ b/common.h	Thu Jul 26 00:20:39 2018 +0000
@@ -4,19 +4,29 @@
    http://tricky-code.net/nicecode/code10.php
 */
 /* Information */
-#define LatestUpDate    "2016.04.07"
-#define ProgramRevision "Rev 0.941" 
-#define Author          "ZNSR"
+#define LatestUpDate    "2016.11.04"
+#define ProgramRevision "Rev 2.40" 
+#define Author          "ZisNotRevast"
 #define Company         "Revast Co.,Ltd."
 
 //#define __CREATE_SETTING_FILE__
 //#define __TARGET_BOARD_CHECK__
 
+
+//#define __WInchDebug__  // For debugging 
+
+
+// Comment out if net setting is FIX.
+// #define __NET_SETTING_FROM_LFS__
+
+
 // Read motor current 
 #define __READ_TFM_MOTOR_CURRENT__
 
 #define __IIC_COMAMND_SEND__
 
+#define __SET_WINCH_MOTOR_SPEED_BY_VOLUME__
+
 // ======================================================================
 // For Debugging
 // ======================================================================
@@ -24,10 +34,19 @@
 #define __DEBUG_L0__
 //#define __DEBUG_L1__
 //#define __DEBUG_L2__
-#define __DEBUG_L3__
+//#define __DEBUG_L3__
 //#define __DEBUG_L4__
 //#define __DEBUG_L5__
 
+#define __DEBUG_WINCH_DATA__
+
+
+#ifdef __DEBUG_WINCH_DATA__
+    #define DEBUG_PRINT_WINCH_DATA(...)  pc.printf(__VA_ARGS__)
+#else
+    #define DEBUG_PRINT_WINCH_DATA(...) 
+#endif
+
 #ifdef __DEBUG_PRINT_SW__
     #define DEBUG_PRINT_SW(...)  pc.printf(__VA_ARGS__)
 #else
@@ -118,15 +137,15 @@
 };
 /* For resolver reader controller */
 enum{
-    I2C_CP_PREAMBLE_R,          // Preamble of command packet
+    I2C_CP_PREAMBLE_R,        // Sub command
     I2C_CP_COMMAND_R,           // instruction command
     I2C_CP_WDRAM_DIA_UPPER,     // motor1 rotation direction   
     I2C_CP_WDRAM_DIA_LOWER,     // motor1 rotation speed    
     I2C_CP_CCABLE_DIA_UPPER,    // motor1 current limit detection threshold upper byte 
     I2C_CP_CCABLE_DIA_LOWER,    // motor1 current limit detection threshold lower byte 
     I2C_CP_RESOLVER_RESO,       // motor1 current limit detection threshold upper byte
-    I2C_CP_RES1,                // reserved   
-    I2C_CP_RES2,                // reserved   
+    I2C_CP_PRESET_CPOS_UPPER,   // reserved   
+    I2C_CP_PRESET_CPOS_LOWER,   // reserved    
     I2C_CP_RES3,                // reserved   
     I2C_CP_RES4,                // reserved   
     I2C_CP_RES5,                // reserved  
@@ -139,6 +158,7 @@
 /* Winch Operating mode */
 enum{
     WINCH_POSITION_CLEAR,
+    WINCH_PRESET_BASEDATA,
     WINCH_MMODE_RELATIVE,
     WINCH_MMODE_ABSOLUTE,
     WINCH_STEPDOWN_BTN_ON,
@@ -149,6 +169,7 @@
     WINCH_U_STEPDOWN_BTN_OFF,
     WINCH_U_STEPUP_BTN_ON,
     WINCH_U_STEPUP_BTN_OFF,
+    WINCH_PRESET_POSITION,
 };
 
 /* Game Pad defnition */
@@ -211,8 +232,8 @@
     uint16_t    sv_LBTM_ith_R;          // 2 LB transform motor Rvs roration current threshold
     uint8_t     sv_RFTM_srto_F;         // 1 RF transform motor Fwd rotation speed ratio
     uint8_t     sv_RFTM_srto_R;         // 1 RF transform motor Rvs rotation speed ratio
-    int8_t      sv_LBTM_srto_F;         // 1 LB transform motor Fwd rotation speed ratio
-    int8_t      sv_LBTM_srto_R;         // 1 LB transform motor Rvs rotation speed ratio
+    uint8_t     sv_LBTM_srto_F;         // 1 LB transform motor Fwd rotation speed ratio
+    uint8_t     sv_LBTM_srto_R;         // 1 LB transform motor Rvs rotation speed ratio
 } tfm_SetValue_t;                       // 12 byte 
 
 typedef struct {
@@ -251,7 +272,7 @@
 
 
 
-#define SLOWDOWN_DISTANCE 10
+#define SLOWDOWN_DISTANCE 23    // <--10 2016.06.01
 #define SLOWDOWN_NEAR_DISTANCE 3
 /*
 typedef struct {
--- a/mbed.bld	Thu Apr 14 10:25:08 2016 +0000
+++ b/mbed.bld	Thu Jul 26 00:20:39 2018 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/252557024ec3
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/6c34061e7c34
\ No newline at end of file
--- a/memo.txt	Thu Apr 14 10:25:08 2016 +0000
+++ b/memo.txt	Thu Jul 26 00:20:39 2018 +0000
@@ -1,3 +1,33 @@
+                   // ------------------------------------------------------------------------------------------
+1239                    i2c.write(I2C_ADDRESS_CRAWLER, I2C_cmd, NumberOfI2CCommand); // <<<<=== is it necessary ?
+1240                    Thread::wait(1); // <<<<=== is it necessary ?
+                    // ------------------------------------------------------------------------------------------
+クローラが止まりにくい現象はこれが影響していないか??
+
+また、Validエリア判定条件を修正:まともに動くか??
+
+
+2016.10.07(Fri)
+バグ修正
+レゾルバ位置情報取得のボード4へのI2Cアクセスがエラーになる場合があった。
+エラーの場合関数自体の戻り値で位置情報を返していたため、エラーの場合には
+−1、それい以外の場合には位置データが帰ってくきていいた。
+統合プロプログラムにも変える場合があったと思われる。
+(露見しなかったのが不思議レベル)
+
+ReadWinchCurrentPosition関数を修正し、
+エラーデータが戻らないようにした。
+またエラーの場合、最大3回リトライをするように修正
+
+int16_t ReadWinchCurrentPosition( int32_t i2c_addr, int16_t *winchPositionP, int mode )
+  
+  i2c_addr 送信先I2Cアドレス(レゾルバコントローラ)
+  winchPositionP位置データ
+  mode 動作モード(未使用)
+  
+  戻り値 0:正常 0以外:エラー
+
+
 2016.03.17(Wed)
 ---------------
 形状変形操作変更