2018.07.26

Dependencies:   EthernetInterface TextLCD USBDevice USBHost2 mbed

P1_2Y_handy.cpp

Committer:
sayzyas
Date:
2018-07-26
Revision:
0:2cb1be240f50

File content as of revision 0:2cb1be240f50:

/*
////////////////////////////////////////////////////////////////////////////
 Project: B1/B2 DebrisProbe Demonstration model
 Title:   Debris Prober demo HandyCtrl Main
 Target:  mbed LPC1768
 Data:    2017.06.30
 Author:  sayzyas as ZNR
 ------------------------------------------------
 The Final Project of this company ! .... may be.
 ------------------------------------------------
      
      ## #####  ##    #####
      ## ## ## ##     ## ##
      ## ## ## #####  #####
      ##   ##  ##  ## ## ##
      ##   ##  #####  #####
 
           mbed LPC1768
  +-------------USB-----------+
  | GND           VOUT(3.3V)  |
  | VIN           VU(5.0V OUT)|
  | VB            IF-         |
  | mR            IF+         |
  | p5  mosi      Ether RD-   |
  | p6  miso      Ether RD+   |
  | p7  sck       Ether TD-   |
  | p8            Ether TD+   |
  | p9  tx sdi    USB D-      |
  | p10 rx scl    USB D+      |
  | p11    mosi   CAN rd  p30 |
  | p12    miso   CAN td  p29 |
  | p13 tx sck    sda tx  p28 |
  | p14 rx        scl rx  P27 |
  | p15 AIn       PWM     P26 |
  | p16 AIn       PWM     P25 |
  | p17 AIn       PWM     p24 |
  | p18 AIn AOut  PWM     p23 |
  | p19 AIn       PWM     p22 |
  | p20 AIn       PWM     p21 |
  +---------------------------+
 
////////////////////////////////////////////////////////////////////////////
 */
 
#include "mbed.h"
#include "USBHostGamepad.h"
#include "USBSerial.h"
#include "rtos.h"
#include "EthernetInterface.h"
#include "common.h"
#include "stdio.h"
//#include "TextLCD.h"
#include "com_func.h"
#include "USBHID.h"
#include "TextLCD.h"


// USBSerial serial setting
Serial pc(USBTX, USBRX); // UART

// Digital I/O setting
DigitalOut led1(LED1); // 1:on,0:off  System is OK then ON.
DigitalOut led2(LED2); // 1:on,0:off  GamePad is connected.
DigitalOut led3(LED3); // 1:on,0:off  When got the GamePas switch input then ON  
DigitalOut led4(LED4); // 1:on,0:off  Access indicator with PC

// LED indicator
DigitalOut led_ind_ptwc(p14);      // LED indicator pan/tilt, winch, crawler limit
DigitalOut led_ind_tfm(p15);       // LED indicator tfm motor current limit
DigitalOut led_valid_part1(p25);   // LED transform, crawler valid 
DigitalOut led_valid_part2(p26);   // LED pan/tilt, winch valid     

int16_t   led_ind_cnt = 0;
int16_t   led_ind_cnt_t = 0;

// Switch Matrix 3bit SW ON = 0 input
//  bit 2 1 0   Send data 
//   0  1 1 1 : 
//   1  1 1 0 : 0x01 RF Tfm K
//   2  1 0 1 : 0x02 RF Tfm I
//   3  1 0 0 : 0x04 LB Tfm K
//   4  0 1 1 : 0x08 LB Tfm I
//   5  0 1 0 : 0x10 Winch Down
//   6  0 0 1 : 0x20 Winch Up
//   7  0 0 0 : 
DigitalIn sw1(p5); // Bit 0
DigitalIn sw2(p6); // Bit 1
DigitalIn sw3(p7); // Bit 2

// Digital Input 1:OFF, 0:ON
DigitalIn sw_JS_ShapeMode(p29);      // SW: i \ k ,pde ( 1: K, 0: I )
DigitalIn sw_validpart(p30);   // SW: CrExp Shape ( 1: Left-Winch. 0: Right-tfmcrwler )

// Analig Joystick input for crawler control
AnalogIn Rjsin_UD(p16);  // Crawler R-UD
AnalogIn Rjsin_LR(p17);  // Crawler R-LR
//AnalogIn Ljsin_UD(p19);  // Crawler L-UD
//AnalogIn Ljsin_LR(p20);  // Crawler L-LR

const char* TCP_SERVER_ADDRESS = "192.168.0.24";
// Ethernet
EthernetInterface   eth;
// TCP
TCPSocketConnection tsocket;    // TCP client
// UDP
UDPSocket           usocket;    // UDP client
Endpoint            client;

// Local File System
LocalFileSystem local("local");  // Create the local filesystem under the name "local"

TextLCD lcd(p11, p12, p24, p23, p22, p21); // rs, e, d4-d7

uint8_t js_center_value_r_ud = 0x80;
uint8_t js_center_value_r_lr = 0x80;
uint8_t js_center_value_l_ud = 0x80;
uint8_t js_center_value_l_lr = 0x80;

// Global
uint32_t            flg_gamePad_Connected = 0;
char                PC_cmd[11+1] = "&0100000000";
basic_operation_t   baseOperation;
char                dbuffer[128];

// Global Parameter of setting
setValue_t          setValue;      // Setting Data

/* Status flag */
/* 
  0000 0000 : button    LI LK RI RK PCW PCCW TU TD    
  0000 0000 : limit switch
  0000 0000 : res
  0000 0000 : res
*/
uint32_t    flg_exp_status = 0;
Mutex       lcdMutex;
Mutex       flg_mutex;
int         swbtn_Opeflg = 0;

int16_t     winchCurrentPosition;
int16_t     winchOffsetValue = 0;   // 2016.10.07 added
int16_t     winchDramDiameter = 5985;  // 2017.01.06 added

Mutex       mtx_wcp;

bool        flg_ButtonOn = false;
bool        flg_lsw_valid = false;

int         flg_JS_shape_mode = 0;
int         flg_JS_ope_mode = 0;
int         motor1_current_pct;
int         motor2_current_pct;
uint8_t     limitSw_Sts = 0;
char        motorLock_sts = '\0';

void led_winch_valid( int counter )
{
    if( counter < 25)
    {
        led_valid_part2 = 0; 
    }
    else
    {
        led_valid_part2 = 1; 
    }
}

void led_crawler_valid( int counter )
{
    if( counter < 25)
    {
        led_valid_part2 = 1; 
    }
    else
    {
        led_valid_part2 = 0; 
    }
}

void lcd_dsp( int column, int row, char* msg, int cnt)
{
    for( int i = 0; i < cnt; i++ )
    {
        lcd.locate(column+i,row);
        lcd.putc(*msg++);
    }
    Thread::wait(10); 
}

// ============================================================
// Send Status to PC
// ============================================================
void sendStatus2PC( char *cmd, int32_t numberOfCmd ){
    int i;
    led4 = 1;
    for ( i = 0; i < numberOfCmd; i++ ) {
        pc.putc(*cmd++);
    }            
    led4 = 0;
}

uint8_t adj_crawlerSpeed( uint8_t in )
{
    uint8_t out;
/*    
    pc.printf( "#### %d ####\r\n", in );
    
    if( ( in > 0 ) && ( in < 98 ))
    {                    
        out = (uint8_t)((float)in * 0.8);
    }    
    else
    {
        out = 100;
    }
*/
    out = in;
    return out;                                
}


bool cmd_snd2serverZ( 
    char*   cmd,     // command send to server
    int     cmdSize
){ 
    tsocket.send(cmd, cmdSize);
    DEBUG_PRINT_L0("Snd cmd 2 server [ %s (%d) ]\r\n", cmd, cmdSize );   
    // Clean up
   
    return true;    
}


bool    flg_mc_tfmcrw = false;
bool    flg_mc_winch = false;
char    I2C_res[NumberOfI2CCommand+1] = "\0";

// *****************************************************************
//  calibration joystick data
// *****************************************************************
bool calibrate_joystick( int js, uint8_t data_ud, uint8_t data_lr ){
    uint16_t tmp;

    if( js == 0 )   // R-JS
    {
        tmp = (uint16_t)js_center_value_r_ud;
        tmp += (uint16_t)data_ud;
        tmp /= 2;
        js_center_value_r_ud = (uint8_t)tmp;
        
        tmp = (uint16_t)js_center_value_r_lr;
        tmp += (uint16_t)data_lr;
        tmp /= 2;
        js_center_value_r_lr = (uint8_t)tmp;
        
        if
        (
        (((127-10) < js_center_value_r_ud )&&(js_center_value_r_ud < (127+10))) && 
        (((127-10) < js_center_value_r_lr )&&(js_center_value_r_lr < (127+10)))
        )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else // Other
    {
        tmp = (uint16_t)js_center_value_l_ud;
        tmp += (uint16_t)data_ud;
        tmp /= 2;
        js_center_value_l_ud = (uint8_t)tmp;
        
        tmp = (uint16_t)js_center_value_l_lr;
        tmp += (uint16_t)data_lr;
        tmp /= 2;
        js_center_value_l_lr = (uint8_t)tmp;

        if
        (
        (((127-10) < js_center_value_l_ud )&&(js_center_value_l_ud < (127+10))) && 
        (((127-10) < js_center_value_l_lr )&&(js_center_value_l_lr < (127+10)))
        )        {
            return true;
        }
        else
        {
            return false;
        }

    }
}

// LED current indicator blink control when
// each motor is moving.
void led_ind_run
(
    int led_number,
    int count,
    int period
){
    if(( count >= 0 )&&( count < period ))      
    {
        if( led_number == 1 )
        { 
           led_ind_ptwc = ON;
        }
        else
        {
            led_ind_tfm = ON;
        }
    }
    else if(( count >= period )&&( count < period*2 ))
    {
        if( led_number == 1 )
        { 
           led_ind_ptwc = OFF;
        }
        else
        {
            led_ind_tfm = OFF;
        }
    }
    else
    {
        led_ind_ptwc = OFF;
        led_ind_tfm = OFF;
    }     
} 


void led_error_blink( int no, int times )
{
    for( int i = 0; i < times; i++ ) {
        if( no == 1 )
        {
            led_ind_ptwc = 1;
        }
        else
        {
            led_ind_tfm = 1;
        }
        Thread::wait(50);
        if( no == 1 )
        {
            led_ind_ptwc = 0;
        }
        else
        {
            led_ind_tfm = 0;
        }
        Thread::wait(50);
    }
}

bool    flg_B2 = false;
bool    flg_system_ok = true;

// *****************************************************************
//  switch control task
// ----------------------
//
//    Up:    center -> 255
//    Down:  002 -> center
//    Right: center -> 255
//    Left : 0 -> center 
//
// *****************************************************************
int16_t tmpPosition;
void sw_task( void const *){

    char        msg[16] = "";
    
    uint16_t    jsr_ud_data;
    uint16_t    jsr_lr_data;
    uint8_t     jsr_ud_undata;
    uint8_t     jsr_lr_undata;
    
    uint8_t     m1_speed;
    uint8_t     m2_speed;
    char        sbuf[128] = ""; // TCP send buffer
    char        rbuf[128];      // TCP receive buffer
    int         flg_tfmcrwpart_1st = 0;
    int         flg_wchcptpart_1st = 0;
    
    int         rts;
    bool        jsjg = true;
    
    bool        led_tfm_lock = false;
    bool        led_ptwc_lock = false;
    
    int runcount = 0;

    DEBUG_PRINT_L0("Handy(Bd2)>> Start ststem initializing ...\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)>> =============================================================\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)>>  Initalizing Ethernet ...\r\n");    
    DEBUG_PRINT_L0("Handy(Bd2)>> =============================================================\r\n");

    const char* ip_address = "192.168.0.31";
    const char* subnet_mask = "255.255.255.0";
    const char* gateway = "192.168.0.0";

    DEBUG_PRINT_L0("Handy(Bd2)> --------------------------------------\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)> ip address     : %s\r\n", ip_address);
    DEBUG_PRINT_L0("Handy(Bd2)> subnet mask    : %s\r\n", subnet_mask);
    DEBUG_PRINT_L0("Handy(Bd2)> default gateway: %s\r\n", gateway);
    DEBUG_PRINT_L0("Handy(Bd2)> --------------------------------------\r\n");

    char sss[24];

    int ret = eth.init(   
            ip_address,      // const char* ip, 
            subnet_mask,     // const char* mask, 
            gateway          // const char* gateway
    );
    if( ret == 0 ){

        DEBUG_PRINT_L0("Handy(Bd2)> Eternet init ... OK\r\n");
        ret = eth.connect(7000);    // Connection time out: 7000msec
        
        if( ret == 0 ){
            cf_led_onoff( &led1,&led2,&led3,&led4, false, false, false, true );
            DEBUG_PRINT_L0("Handy(Bd2)> [ IP Address : %s ]\r\n", eth.getIPAddress());  
            while( true )
            {
                if (tsocket.connect(TCP_SERVER_ADDRESS, TCP_SERVER_PORT) < 0) {
                    DEBUG_PRINT_L0("Handy(Bd2)> ###ERROR### : Unable to connect to (%s) on port (%d)\r\n", TCP_SERVER_ADDRESS, TCP_SERVER_PORT);
                    flg_system_ok = false;
                    wait(0.5);
                    break;
                }
                flg_system_ok = true;
                sprintf(sss, "IP:%s", ip_address );
                lcdMutex.lock();
                lcd_dsp(0,0,"Network .. OK   ",16);
                sss[15] = ' ';
                lcd_dsp(0,1,sss,16); 
                lcdMutex.unlock();
                sprintf( sbuf, "Hello" );
                DEBUG_PRINT_L0( "Handy(Bd2)> Send [%s]\r\n", sbuf ); 
                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                wait_ms(5);
                // Receive winch position from host
                tsocket.receive( rbuf, sizeof(rbuf));
                
                // 
                // Check target (B1 or B2) here !
                // 
                if( !strncmp( rbuf, "B2Demo", 6 ) )
                {
                    DEBUG_PRINT_L0( "Handy(Bd2)> Echo back [%s]\r\n", rbuf ); 
                    flg_B2 = true;
                }
                wait_ms(300);
    
                DEBUG_PRINT_L1("Calibrating joystick ... ");
                for( int i = 0; i < CALIBRATION_COUNT; i++){
                    jsr_ud_data = Rjsin_UD.read_u16();
                    jsr_lr_data = Rjsin_LR.read_u16();
                    jsr_ud_undata = (uint8_t)(jsr_ud_data >> 8);
                    jsr_lr_undata = (uint8_t)(jsr_lr_data >> 8);
                    jsjg = calibrate_joystick( 0, jsr_ud_undata, jsr_lr_undata);   // Under constraction
                }
                
                if( jsjg == false ){
                    flg_system_ok = false;
                    wait(0.5);
                    break;                    
                }
                
                DEBUG_PRINT_L1("done\r\n");            

                lcdMutex.lock();
                wait_ms(500);
                lcd_dsp(0,0,"System Boot up  ",16);
                
                if( flg_B2 == true )
                {
                    sprintf( msg, "B2Wch [**** mm] ");  // B2
                }
                else
                {
                    sprintf( msg, "------ B1 ------");  // B1
                }
                lcdMutex.lock();
                lcd_dsp(0,0,"                ",16);
                lcd_dsp(0,1,msg,16); 
                lcdMutex.unlock();
    
                while(1){
                    jsr_ud_data = Rjsin_UD.read_u16();
                    jsr_lr_data = Rjsin_LR.read_u16();
                    
                    jsr_ud_undata = (uint8_t)(jsr_ud_data >> 8);
                    jsr_lr_undata = (uint8_t)(jsr_lr_data >> 8);
                    
                    DEBUG_PRINT_SW("Handy SW> ");
                    DEBUG_PRINT_SW("R:%03d/%3d,%03d/%3d  ", jsr_ud_undata, js_center_value_r_ud, jsr_lr_undata, js_center_value_r_ud );
                    DEBUG_PRINT_SW("SW: %d %d %d  ", sw1.read(), sw2.read(), sw3.read() );
                    DEBUG_PRINT_SW("JS: %d %d\r\n", sw_JS_ShapeMode.read(), sw_validpart.read() );
            
                    // **********************************************************
                    //  Transform and crawler control part
                    // **********************************************************
                    if( sw_validpart == 0 ){ // sw on
                        flg_wchcptpart_1st = 0;
                        led_valid_part2 = 0;
                        led_valid_part1 = 1;
                        if( flg_tfmcrwpart_1st == 0 )
                        {
                            sprintf( sbuf, "OX_PART_000_0000" );
                            DEBUG_PRINT_L0( "Handy(Bd2)> VALID PART [%s]\r\n", sbuf ); 
                            rts = tsocket.send_all(sbuf, sizeof(sbuf));
                            if( rts < 0 ) break;
                            Thread::wait(5);
                            flg_tfmcrwpart_1st = 1;
                        }
                        else
                        {
                            // ---------------------------------------------
                            // Right JoyStick Control
                            // ---------------------------------------------
                            if( sw_JS_ShapeMode == 1 ){ // OFF: KO-Shape
                                
                                if( // Dead zone
                                    ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                    ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                    ( jsr_lr_undata >= (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) &&
                                    ( jsr_lr_undata <= (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) 
                                ){
                                    sprintf( sbuf, "XX_CLRF_002_0000" ); // M1 Stop
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    sprintf( sbuf, "XX_CLLB_002_0000" ); // M2 Stop
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf)); 
                                    if( rts < 0 ) break;
                                    lcdMutex.lock();
                                    if( runcount < 15 )
                                    {
                                        lcd_dsp(0,0,"OX          [^] ",16);
                                    }
                                    else if ( runcount < 30 ) 
                                    {
                                        lcd_dsp(0,0,"OX          [>] ",16);
                                    }
                                    else if(runcount < 45 )
                                    {
                                        lcd_dsp(0,0,"OX          [v] ",16);
                                    }
                                    else{
                                        lcd_dsp(0,0,"OX          [<] ",16);
                                    }
                                    if( runcount >= 60 )
                                    {
                                        runcount = 0;
                                    }
                                    else
                                    {
                                        runcount++;
                                    }
                                    lcdMutex.unlock();
                                    // Receive winch position from host
                                //      rts = tsocket.receive( rbuf, sizeof(rbuf));
                                //      if( rts < 0 ) break;                                                                        
                                    led4 = 0;
                                    led_ind_ptwc = 0;
                                    led_ind_cnt = 0;
                                    Thread::wait(15); // Don't delete, important!
                                }
                                else if( // Forward zone
                                    ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                    ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) &&
                                    ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) 
                                ){
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }
                                    led4 = ON;
                                    m1_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio
                                    m2_speed = m1_speed;
                                    sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;

                                    sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    DEBUG_PRINT_L2("Handy> R-JS Up: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX Cr-F:%03d", (255 - jsr_ud_undata));
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                    
                               /*
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break; 
                                                                       
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    if( tmpPosition == 9999 )
                                    {
                                        DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" );
                                        led_error_blink( 1, 4 );
                                    }
                                */     
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }
                                else if( // Reverse zone
                                    ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                    ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) &&
                                    ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) 
                                ){
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                               
                                    led4 = ON;
                                    m1_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio
                                    m2_speed = m1_speed;
                                    sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX Cr-R:%03d", (255 - jsr_ud_undata));
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                /*    
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    if( tmpPosition == 9999 )
                                    {
                                        DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                        led_error_blink( 1, 4 );
                                    }
                                */                                        
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }                                

                                else if( // Right turn zone
                                    ( jsr_lr_undata > (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) &&
                                    ( jsr_ud_undata > (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                    ( jsr_ud_undata < (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone))
                                ){
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                                    
                                    led4 = ON;
                                    m1_speed = ( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr; // Speed ratio
                                    m2_speed = m1_speed; // Speed
                                    sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    DEBUG_PRINT_L2("Handy> R-JS Right: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_lr_undata, send_report.data[2], js_center_value_r_ud);
                                    sprintf(msg,"OX Cr->:%03d", jsr_lr_undata);
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                /*    
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    if( tmpPosition == 9999 )
                                    {
                                        DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                        led_error_blink( 1, 4 );
                                    }
                                */                                        
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }                                
                                else if( // Left turn zone
                                    ( jsr_lr_undata < (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) &&
                                    ( jsr_ud_undata > (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                    ( jsr_ud_undata < (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone))
                                ){
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                                  
                                    led4 = ON;
                                    m1_speed = ( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr; // Speed ratio
                                    m2_speed = m1_speed;
                                    sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    DEBUG_PRINT_L2("Handy> R-JS Left: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_lr_undata, send_report.data[2], js_center_value_r_ud);
                                    sprintf(msg,"OX Cr<-:%03d", jsr_lr_undata);
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                /*
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    if( tmpPosition == 9999 )
                                    {
                                        DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                        led_error_blink( 1, 4 );
                                    }
                                */    
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }
                                
                                else if( // Right-upper zone
                                    ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                    ( jsr_lr_undata > (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) 
                                ){                                
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                               
                                    led4 = ON;
                                    if( jsr_ud_undata > jsr_lr_undata )
                                    {
                                        m2_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio
                                        m1_speed = 100 - (( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr);
                                        sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd
                                        DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;
                                        
                                        sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd
                                        DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;
                                   /*     
                                        // Receive winch position from host
                                        rts = tsocket.receive( rbuf, sizeof(rbuf));
                                        if( rts < 0 ) break;                                        
                                        rbuf[4] = '\0';
                                        tmpPosition = atoi( rbuf );
                                        if( tmpPosition == 9999 )
                                        {
                                            DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                            led_error_blink( 1, 4 );
                                        }
                                    */
                                    }
                                    DEBUG_PRINT_L2("Handy> R-JS R-U zone: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX Cr-FRZ  ");
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }
                                
                                else if( // Left-upper zone
                                    ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                    ( jsr_lr_undata < (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone))
                                ){                                
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                                  
                                    led4 = ON;
                                    if( (jsr_ud_undata - js_center_value_r_ud) > (js_center_value_r_ud-jsr_lr_undata) )
                                    {
                                        m1_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio
                                        m2_speed = 100 - (( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr);
                                        sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd
                                        DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;

                                        sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd
                                        DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;
                                   /*     
                                        // Receive winch position from host
                                        rts = tsocket.receive( rbuf, sizeof(rbuf));
                                        if( rts < 0 ) break;

                                        rbuf[4] = '\0';
                                        tmpPosition = atoi( rbuf );
                                        if( tmpPosition == 9999 )
                                        {
                                            DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                            led_error_blink( 1, 4 );
                                        }
                                    */
                                    }
                                    DEBUG_PRINT_L2("Handy> R-JS Up: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX Cr-FLZ  ");
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }
                                
                                else if( // Right-lower zone
                                    ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                    ( jsr_lr_undata > (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone))
                                ){                                
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                                   
                                    led4 = ON;
                                    if( (js_center_value_r_ud - jsr_ud_undata) > (jsr_lr_undata - js_center_value_r_lr) )
                                    {
                                        m2_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio
                                        m1_speed = 100 - (( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr);
                                        sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs
                                        DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;

                                        sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs
                                        DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;
                                    /*    
                                        // Receive winch position from host
                                        rts = tsocket.receive( rbuf, sizeof(rbuf));
                                        if( rts < 0 ) break;

                                        rbuf[4] = '\0';
                                        tmpPosition = atoi( rbuf );
                                        if( tmpPosition == 9999 )
                                        {
                                            DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                            led_error_blink( 1, 4 );
                                        }
                                    */
                                    }
                                    DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX Cr-RRZ  ");
                                    //sprintf(msg, "OX C BK RT ");
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }

                                else if( // Left-lower zone
                                    ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                    ( jsr_lr_undata < (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone))
                                ){                                
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }                                  
                                    led4 = ON;
                                    if( (js_center_value_r_ud - jsr_ud_undata) > ( js_center_value_r_lr - jsr_lr_undata) )
                                    {
                                        m1_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio
                                        m2_speed = 100 - (( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr);
                                        sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs
                                        DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));

                                        if( rts < 0 ) break;
                                        sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs
                                        DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                        rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                        if( rts < 0 ) break;
                                   /*     
                                        // Receive winch position from host
                                        rts = tsocket.receive( rbuf, sizeof(rbuf));
                                        if( rts < 0 ) break;
                                        
                                        rbuf[4] = '\0';
                                        tmpPosition = atoi( rbuf );
                                        if( tmpPosition == 9999 )
                                        {
                                            DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                            led_error_blink( 1, 4 );
                                        }
                                    */
                                    }
                                    DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX Cr-RLZ  ");
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }
                            }
                            else    // ON: I-Shape
                            {
                                // Right Joystic < Down
                                if( jsr_ud_undata > (js_center_value_r_ud + + setValue.jsCtrl.rjs_upper_dzone) ){
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }
                                    led4 = ON;
                                    m1_speed = adj_crawlerSpeed(( js_center_value_r_ud+1 - (255 - jsr_ud_undata) ) * 100 / js_center_value_r_ud ); // Speed
                                    m2_speed = m1_speed; // Speed

                                    sprintf( sbuf, "XX_CLRF_001_%04d", m1_speed ); // M1 Rvs
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;

                                    sprintf( sbuf, "XX_CLLB_000_%04d", m2_speed ); // M2 Fwd
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;

                                    DEBUG_PRINT_L2("Handy> R-JS Up: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX C FW:%03d", (255 - jsr_ud_undata));
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                                /*
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
                                        
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    if( tmpPosition == 9999 )
                                    {
                                        DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                        led_error_blink( 1, 4 );
                                    }
                                */
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }
                                // Right Joystick < Up >
                                else if( jsr_ud_undata < (js_center_value_r_ud - + setValue.jsCtrl.rjs_upper_dzone) ){
                                    // Crawler reverse Run
                                    led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD8);
                                    if( led_ind_cnt > LED_IND_BLINK_PERIOD8*2 )
                                    {
                                        led_ind_cnt = 0;
                                    }
                                    else
                                    {
                                        led_ind_cnt += 1;
                                    }
                                    led4 = ON;
                                    m1_speed = adj_crawlerSpeed(( (255 - jsr_ud_undata) - js_center_value_r_ud ) * 100 / js_center_value_r_ud ); // Speed
                                    m2_speed = m1_speed; // Speed
                                    sprintf( sbuf, "XX_CLRF_000_%04d", m1_speed ); // M1 Fwd
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    sprintf( sbuf, "XX_CLLB_001_%04d", m2_speed ); // M2 Rvs
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    DEBUG_PRINT_L2("Handy> R-JS Down: js_data[%03d], motor_speeed[%03d], js_center[%03d]\r\n", jsr_ud_undata, send_report.data[3], js_center_value_r_ud);
                                    sprintf(msg, "OX C BK:%03d", (255 - jsr_ud_undata));
                                    
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,msg,11);
                                    lcdMutex.unlock();
                               /*     
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
                                        
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    if( tmpPosition == 9999 )
                                    {
                                        DEBUG_PRINT_L0( "Handy(Bd2)> ### CRAWLER LOCK DETECTION ###\r\n" ); 
                                        led_error_blink( 1, 4 );
                                    }
                                */    
                                    led4 = OFF;
                                    Thread::wait(15); // Don't delete, important!
                                }           
                                else{ 
                                    sprintf( sbuf, "XX_CLRF_002_0000" ); // M1 Stop
                                    DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    
                                    sprintf( sbuf, "XX_CLLB_002_0000" ); // M2 Stop
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf)); 
                                    if( rts < 0 ) break;
                               /*     
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
                                        
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,"OX         ",11);
                                    lcdMutex.unlock();
                                */
                                    led4 = OFF;
                                    led_ind_ptwc = OFF;
                                }
                            }
                            // ---------------------------------------------
                            // Other Switch Control: Pass
                            // ---------------------------------------------
                            if ((sw1 == 0)&&(sw2 == 1)&&(sw3==0)){ // Limit Switch valid
                                if( flg_lsw_valid == false )
                                {
                                    flg_lsw_valid = true;
                                    //printf("lsw valid\r\n");
                                    if( flg_B2 == false ) //B1
                                    {
                                        lcd_dsp(0,1,"------ B1 -----*",16);
                                    }
                                    else
                                    {
                                        sprintf(msg,"B2Wch [%04d mm]*", tmpPosition);
                                        lcdMutex.lock();
                                        lcd_dsp(0,1,msg,16);           
                                        lcdMutex.unlock();
                                    }
                                    Thread::wait(700);
                                }
                                else
                                {
                                    flg_lsw_valid = false;
                                    //printf("lsw invalid\r\n");
                                    if( flg_B2 == false ) //B1
                                    {                                    
                                        lcd_dsp(0,1,"------ B1 ------",16);
                                    }
                                    else
                                    {
                                        sprintf(msg,"B2Wch [%04d mm] ", tmpPosition);
                                        lcdMutex.lock();
                                        lcd_dsp(0,1,msg,16);           
                                        lcdMutex.unlock();
                                    }
                                    Thread::wait(700);
                                }
                            }
                            else if ((sw1 == 0)&&(sw2 == 1)&&(sw3==1)){ // RF transform K
                                led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2);
                                if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 )
                                {
                                    led_ind_cnt_t = 0;
                                }
                                else
                                {
                                    led_ind_cnt_t += 1;
                                }
                                if( flg_lsw_valid == true )
                                {
                                    sprintf( sbuf, "XX_TFRF_100_0100" );
                                }
                                else
                                {
                                    sprintf( sbuf, "XX_TFRF_000_0100" );
                                }

                                sprintf(msg, "OX Tfm-RFK ");
                                lcdMutex.lock();
                                lcd_dsp(0,0,msg,11);                                
                                lcdMutex.unlock();
                                
                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" );
                                    led_tfm_lock = true;
                                }
                                if( led_tfm_lock == true )
                                {
                                    led_error_blink( 0, 4 );
                                }
                                led3 = 1;
                                Thread::wait(15);
                            }
                            else if ((sw1 == 1)&&(sw2 == 0)&&(sw3==1)){ // RF transform I
                                led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2);
                                if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 )
                                {
                                    led_ind_cnt_t = 0;
                                }
                                else
                                {
                                    led_ind_cnt_t += 1;
                                }                                
                                if( flg_lsw_valid == true )
                                {
                                    sprintf( sbuf, "XX_TFRF_101_0100" );
                                }
                                else
                                {
                                    sprintf( sbuf, "XX_TFRF_001_0100" );
                                }

                                sprintf(msg, "OX Tfm-RFI ");
                                lcdMutex.lock();
                                lcd_dsp(0,0,msg,11);                                
                                lcdMutex.unlock();

                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;                                    
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" );
                                    led_tfm_lock = true;
                                }
                                if( led_tfm_lock == true )
                                {
                                    led_error_blink( 0, 4 );
                                }
                                led3 = 1;
                                Thread::wait(15);
                            }
                            else if ((sw1 == 0)&&(sw2 == 0)&&(sw3==1)){ // LB transform K
                                led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2);
                                if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 )
                                {
                                    led_ind_cnt_t = 0;
                                }
                                else
                                {
                                    led_ind_cnt_t += 1;
                                }                                
                                if( flg_lsw_valid == true )
                                {
                                    sprintf( sbuf, "XX_TFLB_100_0100" );
                                }
                                else
                                {
                                    sprintf( sbuf, "XX_TFLB_000_0100" );
                                }

                                sprintf(msg, "OX Tfm-LBK ");
                                lcdMutex.lock();
                                lcd_dsp(0,0,msg,11);                                
                                lcdMutex.unlock();

                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf)); 
                                if( rts < 0 ) break;
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" );
                                    led_tfm_lock = true;
                                }
                                if( led_tfm_lock == true )
                                {
                                    led_error_blink( 0, 4 );
                                }
                                led3 = 1;
                                Thread::wait(15);
                            }
                            else if ((sw1 == 1)&&(sw2 == 1)&&(sw3==0)){ // LB transform I
                                led_ind_run(0, led_ind_cnt_t, LED_IND_BLINK_PERIOD2);
                                if( led_ind_cnt_t > LED_IND_BLINK_PERIOD2*2 )
                                {
                                    led_ind_cnt_t = 0;
                                }
                                else
                                {
                                    led_ind_cnt_t += 1;
                                }                                
                                if( flg_lsw_valid == true )
                                {
                                    sprintf( sbuf, "XX_TFLB_101_0100" );
                                }
                                else
                                {
                                    sprintf( sbuf, "XX_TFLB_001_0100" );
                                }

                                sprintf(msg, "OX Tfm-LBI ");
                                lcdMutex.lock();
                                lcd_dsp(0,0,msg,11);                                
                                lcdMutex.unlock();
                                
                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L5( "Handy(Bd2)> ### TRANSFORM LOCK DETECTION ###\r\n" );
                                    led_tfm_lock = true;
                                }
                                if( led_tfm_lock == true )
                                {
                                    led_error_blink( 0, 4 );
                                }
                                led3 = 1;
                                Thread::wait(15);
                            }
                            else
                            {
                                sprintf( sbuf, "XX_TFRF_002_0000" );
                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                // Receive winch position from host
                           //     rts = tsocket.receive( rbuf, sizeof(rbuf));
                           //     if( rts < 0 ) break;
                                sprintf( sbuf, "XX_TFLB_002_0000" );
                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                // Receive winch position from host
                           //     rts = tsocket.receive( rbuf, sizeof(rbuf));
                           //     if( rts < 0 ) break;
                                led3 = OFF;
                                led_tfm_lock = false;
                                led_ind_tfm = OFF;
                            }
                        }
                    }
                    // **********************************************************
                    //  B1: Camera pan/tile, B2: Winch control part
                    // **********************************************************
                    else{
                        flg_tfmcrwpart_1st = 0;
                        led_valid_part2 = 1;
                        led_valid_part1 = 0;
                        if( flg_wchcptpart_1st == 0 )
                        {
                            sprintf( sbuf, "XO_PART_000_0000" );
                            DEBUG_PRINT_L0( "Handy(Bd2)> VALID PART [%s]\r\n", sbuf ); 
                            rts = tsocket.send_all(sbuf, sizeof(sbuf));
                            if( rts < 0 ) break;
                            Thread::wait(5);
                            flg_wchcptpart_1st = 1;
                        }            
                        else
                        {   
                            if((sw1 == 0)&&(sw2 == 1)&&(sw3==0)){ // Winch Position Clear
                                sprintf( sbuf, "OO_WCLR_000_0100" );
                                DEBUG_PRINT_L0( "Handy(Bd2)>> Send [%s]\r\n", sbuf ); 
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                Thread::wait(10);
                            }                        
                            if( // Dead zone
                                ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                ( jsr_lr_undata >= (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) &&
                                ( jsr_lr_undata <= (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) 
                            ){
                                if( flg_B2 == false ) // B1
                                {
                                
                                    sprintf( sbuf, "XX_CPAN_002_0000" ); // M2 Stop
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf)); 
                                    if( rts < 0 ) break;
                                    sprintf( sbuf, "XX_CTLT_002_0000" ); // M2 Stop
                                    DEBUG_PRINT_L0( " [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf)); 
                                    if( rts < 0 ) break;        
                                    lcdMutex.lock();
                                    if( runcount < 15 )
                                    {
                                        lcd_dsp(0,0,"XO          [^] ",16);
                                    }
                                    else if ( runcount < 30 ) 
                                    {
                                        lcd_dsp(0,0,"XO          [>] ",16);
                                    }
                                    else if(runcount < 45 )
                                    {
                                        lcd_dsp(0,0,"XO          [v] ",16);
                                    }
                                    else{
                                        lcd_dsp(0,0,"XO          [<] ",16);
                                    }
                                    if( runcount >= 60 )
                                    {
                                        runcount = 0;
                                    }
                                    else
                                    {
                                        runcount++;
                                    };                                    
                                    lcdMutex.unlock();
                                    Thread::wait(2);
                                    led_ind_ptwc = OFF;
                                } 
                                else // B2
                                {
                                    sprintf( sbuf, "XX_WICH_002_0000" );
                                    DEBUG_PRINT_L0( "Handy(Bd2)> BTN WCH STOP [%s]\r\n", sbuf ); 
                                    rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                    if( rts < 0 ) break;
                                    lcdMutex.lock();
                                    //lcd_dsp(0,0,"XO         ",11);
                                    
                                    lcdMutex.lock();
                                    if( runcount < 15 )
                                    {
                                        lcd_dsp(0,0,"XO          [^] ",16);
                                    }
                                    else if ( runcount < 30 ) 
                                    {
                                        lcd_dsp(0,0,"XO          [>] ",16);
                                    }
                                    else if(runcount < 45 )
                                    {
                                        lcd_dsp(0,0,"XO          [v] ",16);
                                    }
                                    else{
                                        lcd_dsp(0,0,"XO          [<] ",16);
                                    }
                                    if( runcount >= 60 )
                                    {
                                        runcount = 0;
                                    }
                                    else
                                    {
                                        runcount++;
                                    };
                                    
                                    // Receive winch position from host
                                    rts = tsocket.receive( rbuf, sizeof(rbuf));
                                    if( rts < 0 ) break;
    
                                    rbuf[4] = '\0';
                                    tmpPosition = atoi( rbuf );
                                    DEBUG_PRINT_L0( "Handy(Bd2)> Winch Position [%04d]\r\n", tmpPosition );
                                    if( tmpPosition != 9999 )
                                    { 
                                        if( flg_lsw_valid == true )
                                        {
                                            sprintf(msg,"B2Wch [%04d mm]*", tmpPosition);
                                        }
                                        else
                                        {
                                            sprintf(msg,"B2Wch [%04d mm] ", tmpPosition);
                                        }
                                    }
                                    else
                                    {
                                        if( flg_lsw_valid == true )
                                        {
                                            sprintf(msg,"B2Wch [**** mm]*");
                                        }
                                        else
                                        {
                                            sprintf(msg,"B2Wch [**** mm] ");
                                        }
                                    }
                                    lcdMutex.lock();
                                    lcd_dsp(0,1,msg,16);           
                                    lcdMutex.unlock();
                                    led_ind_ptwc = OFF;
                                }
                                led2 = 0;
                                led3 = 0;
                                led_ind_ptwc = 0;
                                led_ptwc_lock = false;
                            }
                            else if( // PAN zone
                                ( jsr_lr_undata >= (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone)) &&
                                ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone*2)) &&
                                ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone*2)) &&
                                ( flg_B2 == false )
                            ){
                                led2 = 1;
                                led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD);
                                if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 )
                                {
                                    led_ind_cnt = 0;
                                }
                                else
                                {
                                    led_ind_cnt += 1;
                                }
                                m1_speed = ( jsr_lr_undata - js_center_value_r_lr ) * 100 / js_center_value_r_lr; // Speed ratio
                                sprintf( sbuf, "XX_CPAN_000_%04d", m1_speed );
                                DEBUG_PRINT_L0( "Handy(Bd2)> BTN PAN CW [%s]\r\n", sbuf ); 
                                // Send command to host.
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;

                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" );
                                    led_ptwc_lock = true;
                                }
                                else
                                { 
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,"XO PAN CW  ",11);
                                    lcd_dsp(0,1,"------ B1 ------",16);
                                    lcdMutex.unlock();
                                }
                                if( led_ptwc_lock == true )
                                {
                                    led_error_blink( 1, 4 );
                                }
                            }
                            else if( // Left turn zone
                                ( jsr_lr_undata <= (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone)) &&
                                ( jsr_ud_undata >= (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone*2)) &&
                                ( jsr_ud_undata <= (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone*2)) &&
                                ( flg_B2 == false )
                            ){
                                led2 = 1;
                                led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD);
                                if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 )
                                {
                                    led_ind_cnt = 0;
                                }
                                else
                                {
                                    led_ind_cnt += 1;
                                }
                                m1_speed = ( js_center_value_r_lr - jsr_lr_undata ) * 100 / js_center_value_r_lr; // Speed ratio
                                sprintf( sbuf, "XX_CPAN_001_%04d", m1_speed );
                                DEBUG_PRINT_L0( "Handy(Bd2)> BTN PAN CCW[%s]\r\n", sbuf ); 
                                // Send command to host.
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;

                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" );
                                    led_ptwc_lock = true;
                                }
                                else
                                { 
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,"XO PAN CCW ",11);
                                    lcd_dsp(0,1,"------ B1 ------",16);
                                    lcdMutex.unlock();
                                }
                                if( led_ptwc_lock == true )
                                {
                                    led_error_blink( 1, 4 );
                                }
                            }
                            // Down
                            else if( // Down Motor forward
                                ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone*2)) &&
                                ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone*2)) &&
                                ( flg_B2 == false)
                            ){
                                led2 = ON;
                                led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD);
                                if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 )
                                {
                                    led_ind_cnt = 0;
                                }
                                else
                                {
                                    led_ind_cnt += 1;
                                }
                                m2_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio
                                //m2_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio
                                sprintf( sbuf, "XX_CTLT_000_%04d", m2_speed );
                                DEBUG_PRINT_L0( "Handy(Bd2)> BTN TILT CW [%s]\r\n", sbuf ); 
                                // Send command to host.
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
    
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" );
                                    led_ptwc_lock = true;
                                }
                                else
                                {                                         
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,"XO TLT Down",11);
                                    lcd_dsp(0,1,"------ B1 ------",16);
                                    lcdMutex.unlock();
                                }
                                if( led_ptwc_lock == true )
                                {
                                    led_error_blink( 1, 4 );
                                }
                            }
                            else if( // Up motor reverse
                                ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                ( jsr_lr_undata > (js_center_value_r_lr - setValue.jsCtrl.rjs_left_dzone*2)) &&
                                ( jsr_lr_undata < (js_center_value_r_lr + setValue.jsCtrl.rjs_right_dzone*2)) &&
                                ( flg_B2 == false)
                            ){
                                led2 = 1;
                                led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD);
                                if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 )
                                {
                                    led_ind_cnt = 0;
                                }
                                else
                                {
                                    led_ind_cnt += 1;
                                }
                                m2_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio
                                // m2_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio
                                sprintf( sbuf, "XX_CTLT_001_%04d", m2_speed );
                                DEBUG_PRINT_L0( "Handy(Bd2)> BTN TLT CCW[%s]\r\n", sbuf ); 
                                // Send command to host.
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
    
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L0( "Handy(Bd2)> ### CCAMERA TILT LOCK DETECTION ###\r\n" );
                                    led_ptwc_lock = true;
                                }
                                else
                                {                                
                                    lcdMutex.lock();
                                    lcd_dsp(0,0,"XO TILT Up ",11);
                                    lcd_dsp(0,1,"------ B1 ------",16);
                                    lcdMutex.unlock();
                                }
                                if( led_ptwc_lock == true )
                                {
                                    led_error_blink( 1, 4 );
                                }
                            }
                            // Down Motor forward
                            else if(
                                ( jsr_ud_undata < (js_center_value_r_ud - setValue.jsCtrl.rjs_lower_dzone)) &&
                                
                                ( jsr_lr_undata > (js_center_value_r_lr - 25 * setValue.jsCtrl.rjs_left_dzone)) &&
                                ( jsr_lr_undata < (js_center_value_r_lr + 25 * setValue.jsCtrl.rjs_right_dzone)) &&                                
                                ( flg_B2 == true )
                            ){
                                led2 = ON;
                                led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD);
                                if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 )
                                {
                                    led_ind_cnt = 0;
                                }
                                else
                                {
                                    led_ind_cnt += 1;
                                }
                                m1_speed = ( js_center_value_r_ud - jsr_ud_undata ) * 100 / js_center_value_r_ud; // Speed ratio
                                sprintf( sbuf, "XX_WICH_000_%04d", m1_speed );
                                DEBUG_PRINT_L0( "Handy(Bd2)> BTN WCH DN [%s]\r\n", sbuf ); 
                                // Send command to host.
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                lcdMutex.lock();
                                lcd_dsp(0,0,"XO W Down  ",11);
                                lcdMutex.unlock();
                                // Receive winch position from host.
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L0( "Handy(Bd2)> ### WINCH LOCK DETECTION ###\r\n" );
                                    led_ptwc_lock = true;
                                }
                                else
                                {                                    
                                    DEBUG_PRINT_L0( "Handy(Bd2)> Winch Position [%04d]\r\n", tmpPosition ); 
                                    sprintf(msg,"B2Wch [%04d mm] ", tmpPosition);
                                    if( tmpPosition != 9999 )
                                    { 
                                        if( flg_lsw_valid == true )
                                        {
                                            sprintf(msg,"B2Wch [%04d mm]*", tmpPosition);
                                        }
                                        else
                                        {
                                            sprintf(msg,"B2Wch [%04d mm] ", tmpPosition);
                                        }
                                    }
                                    else
                                    {
                                        if( flg_lsw_valid == true )
                                        {
                                            sprintf(msg,"B2Wch [**** mm]*");
                                        }
                                        else
                                        {
                                            sprintf(msg,"B2Wch [**** mm] ");
                                        }
                                    }
                                    lcdMutex.lock();
                                    lcd_dsp(0,1,msg,16);           
                                    lcdMutex.unlock();
                                }
                                if( led_ptwc_lock == true )
                                {
                                    led_error_blink( 1, 4 );
                                }
                            }
                            // Up motor reverse
                            else if(
                                ( jsr_ud_undata > (js_center_value_r_ud + setValue.jsCtrl.rjs_upper_dzone)) &&
                                ( jsr_lr_undata > (js_center_value_r_lr - 25 * setValue.jsCtrl.rjs_left_dzone)) &&
                                ( jsr_lr_undata < (js_center_value_r_lr + 25 * setValue.jsCtrl.rjs_right_dzone)) &&                                
                                ( flg_B2 == true )
                            ){
                                led2 = 1;
                                led_ind_run(1, led_ind_cnt, LED_IND_BLINK_PERIOD);
                                if( led_ind_cnt > LED_IND_BLINK_PERIOD*2 )
                                {
                                    led_ind_cnt = 0;
                                }
                                else
                                {
                                    led_ind_cnt += 1;
                                }
                                m1_speed = ( jsr_ud_undata - js_center_value_r_ud ) * 100 / js_center_value_r_ud; // Speed ratio
                                sprintf( sbuf, "XX_WICH_001_%04d", m1_speed );
                                DEBUG_PRINT_L0( "Handy(Bd2)> BTN WCH UP [%s]\r\n", sbuf ); 
                                // Send command to host
                                rts = tsocket.send_all(sbuf, sizeof(sbuf));
                                if( rts < 0 ) break;
                                lcdMutex.lock();
                                lcd_dsp(0,0,"XO W Up    ",11);
                                lcdMutex.unlock();
                                // Receive winch position from host
                                rts = tsocket.receive( rbuf, sizeof(rbuf));
                                if( rts < 0 ) break;
                                rbuf[4] = '\0';
                                tmpPosition = atoi( rbuf );
                                if( tmpPosition == 9999 )
                                {
                                    DEBUG_PRINT_L0( "Handy(Bd2)> ### WWINCH LOCK DETECTION ###\r\n" );
                                    led_ptwc_lock = true;
                                }
                                else
                                {                                
                                    DEBUG_PRINT_L0( "Handy(Bd2)> Winch Position [%04d]\r\n", tmpPosition ); 
                                    sprintf(msg,"B2Wch [%04d mm] ", tmpPosition);
                                    if( tmpPosition != 9999 )
                                    { 
                                        if( flg_lsw_valid == true )
                                        {
                                            sprintf(msg,"B2Wch [%04d mm]*", tmpPosition);
                                        }
                                        else
                                        {
                                            sprintf(msg,"B2Wch [%04d mm] ", tmpPosition);
                                        }
                                    }
                                    else
                                    {
                                        if( flg_lsw_valid == true )
                                        {
                                            sprintf(msg,"B2Wch [**** mm]*");
                                        }
                                        else
                                        {
                                            sprintf(msg,"B2Wch [**** mm] ");
                                        }
                                    }
                                    lcdMutex.lock();
                                    lcd_dsp(0,1,msg,16);           
                                    lcdMutex.unlock();
                                }
                                if( led_ptwc_lock == true )
                                {
                                    led_error_blink( 1, 4 );
                                }
                            }
                        }
                    }
                    Thread::wait(5);
                }
                lcd_dsp(0,0,"!!Eth error",11);
                tsocket.close();
            }           
            
        }
        else{
            cf_led_error( &led1,&led2,&led3,&led4 );         
            DEBUG_PRINT_L0("Handy(Bd2)> ###ERROR### Eternet connect Fali\r\n");
            DEBUG_PRINT_L0("Handy(Bd2)> This programis booting in Stand alone mode.\r\n"); 
            flg_system_ok = false;
        }
    }
    else{
        DEBUG_PRINT_L0("Handy(Bd2)> ###ERROR### Eternet init Fail\r\n");  
        DEBUG_PRINT_L0("Handy(Bd2)> This programis booting in Stand alone mode.\r\n"); 
        flg_system_ok = false;
    }
}

// ======================================================================
// Read setting value from lpcal file system of mbed
// ======================================================================
bool read_LFS( setValue_t* setValue ){
    FILE    *fp;
    char    *fname = "/local/jsset.txt"; 
    char    s[150];
    int     c;
    int     data;
    bool    rts;
    
    flg_mutex.lock();
    fp = fopen(fname, "r");
    if( fp != NULL ){  // Open "set.txt" on the local file system for writing
        c = getc(fp);
        if( c != '#' ){
            pc.printf( "#### ERROR This is not a setting file ####\r\n");
            rts = false;
        }
        else{
            fgets( s, 100, fp );
            pc.printf( "%s", s );
            fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_upper_dzone=data; pc.printf("R-JS upper  = %03d",setValue->jsCtrl.rjs_upper_dzone);  fgets(s,100,fp); pc.printf("%s",s );
            fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_lower_dzone=data; pc.printf("R-JS lower  = %03d",setValue->jsCtrl.rjs_lower_dzone);  fgets(s,100,fp); pc.printf("%s",s );
            fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_right_dzone=data; pc.printf("R-JS upper  = %03d",setValue->jsCtrl.rjs_right_dzone);  fgets(s,100,fp); pc.printf("%s",s );
            fscanf(fp,"%03d",&data);setValue->jsCtrl.rjs_left_dzone=data;  pc.printf("R-JS lower  = %03d",setValue->jsCtrl.rjs_left_dzone);  fgets(s,100,fp); pc.printf("%s",s );
            fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_1=data;      pc.printf("%03d",setValue->jsCtrl.reserved_1); fgets(s,100,fp); pc.printf("%s",s);
            fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_2=data;      pc.printf("%03d",setValue->jsCtrl.reserved_2); fgets(s,100,fp); pc.printf("%s",s);
            fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_3=data;      pc.printf("%03d",setValue->jsCtrl.reserved_3); fgets(s,100,fp); pc.printf("%s",s);
            fscanf(fp,"%03d",&data);setValue->jsCtrl.reserved_4=data;      pc.printf("%03d",setValue->jsCtrl.reserved_4); fgets(s,100,fp); pc.printf("%s",s);
        }
        fclose(fp);
        rts = true;   
    }
    else{
        pc.printf( "#### ERROR local file open error ####\r\n");
        rts = false;
    }
    flg_mutex.unlock();
    return rts;   
}


extern "C" {
#include "rt_TypeDef.h"
#include "rt_System.h"
}
// **********************************************************************
//
//    Main Function of this program
//
// **********************************************************************
int main()
{
    Mutex           file_access_mutex;
//    int ret;
    int try_cnt;
//    bool flg_ethernet = false;
    char sss[20];

    // Serial baudrate
    pc.baud(115200);
    
    sw_validpart.mode( PullUp );    // use internal pullup
    sw_JS_ShapeMode.mode( PullUp );    // use internal pullup

    led_ind_ptwc = ON;      // LED indicator pan/tilt, crawler limit
    led_ind_tfm = ON;       // LED indicator tfm motor current limit
    led_valid_part1 = ON;   // LED transform, crawler valid 
    led_valid_part2 = ON;   // LED pan/tilt, winch valid       

    lcd_dsp(0,0,"B2 PMORPH Demo  ",16); 
    lcd_dsp(0,1,"Revast Co.,Ltd. ",16); 
    lcd_dsp(0,0,"Rev1.00 20170403",16); 
    lcd_dsp(0,1,"System Booting..",16);
    
    DEBUG_PRINT_L0("\r\n");
    DEBUG_PRINT_L0("Bd2> HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\r\n");
    DEBUG_PRINT_L0("Bd2> | Project: B1/B2 Debris Prover Demonstration machine\r\n");
    DEBUG_PRINT_L0("Bd2> |-------------------------------------------------------------\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)>> | This is: Handy Control Program of Main Controller\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)>> |   Target MCU: mbed LPC1768\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)>> |   Letest update: %s\r\n", LatestUpDate);
    DEBUG_PRINT_L0("Handy(Bd2)>> |   Program Revision: %s\r\n", ProgramRevision);
    DEBUG_PRINT_L0("Handy(Bd2)>> |   Author: %s\r\n", Author);
    DEBUG_PRINT_L0("Handy(Bd2)>> |   Copyright(C) 2017 %s Allright Reserved\r\n", Company);
    DEBUG_PRINT_L0("Handy(Bd2)>> HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\r\n");
    sprintf( sss, "%s", ProgramRevision );

//    Thread::wait(50);     
    
    //---------------------------------------------------
    // Read CrExp setting value from Local File System
    // setting file "SET.DAT".
    // When error occured, LED1 will be blinking shortly.
    //---------------------------------------------------
    DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)> 2. Read setting value from LFS\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n");

#ifdef __CREATE_SETTING_FILE__    
    write_LFS(&setValue);  // Create and set setting file.
#endif  // __CREATE_SETTING_FILE__

    // --------------------------------------------------------------------
    // Read setting from local file system and set to internal structure
    // --------------------------------------------------------------------
    lcdMutex.lock();
    lcd_dsp(0,0,"LFS reading ... ",16); 
    lcdMutex.unlock();
    try_cnt = LFS_READ_COUNT;
    while( 1 ){   
        if( read_LFS(&setValue) == true ) break;
        else try_cnt -= 1;
        if( try_cnt == 0 ){
            DEBUG_PRINT_L0("Handy(Bd2)> ***ERROR*** LFS read error\r\n");
            while(1){
                led1 = !led1;
                Thread::wait(30);
            }            
        }
    }

    DEBUG_PRINT_L0("Handy(Bd2)> LFS read OK\r\n");
    lcdMutex.lock();
    lcd_dsp(0,0,"LFS read OK     ",16); 
    lcdMutex.unlock();

    led3 = ON;  // Setting Data Read OK
    led2 = ON; // Check target OK

    /* Set basic function default setting */ 
    baseOperation.sv_JS_OpeMode = 0;
    baseOperation.sv_JS_OpeMode = 0;
    baseOperation.sv_WinchValid = 0;

    DEBUG_PRINT_L0( "Handy(Bd2)> ----------------------------------\r\n");
    DEBUG_PRINT_L0( "Handy(Bd2)> >>>> Initializing completed ! <<<<\r\n");
    DEBUG_PRINT_L0( "Handy(Bd2)> ----------------------------------\r\n");
  
/*
    lcdMutex.lock();
    lcd_dsp(0,0,"Booted up !     ",16); 
    Thread::wait(500);
    lcd_dsp(0,0,"LFS System OK   ",16);
    lcd_dsp(0,1,"                ",16);
    Thread::wait(500);
    lcd_dsp(0,0,"                ",16);
    lcd_dsp(0,1,"B2Wch [3500 mm] ",16);
    lcdMutex.unlock();
*/

    lcdMutex.lock();
    lcd_dsp(0,0,"Start sw task   ",16); 
    lcdMutex.unlock();
    DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)>> 5. Start the task\r\n");  
    /* Max thread count is (may be ..) 2, How can I increase this , I don't know ?? */  

//    DEBUG_PRINT_L0("Handy(Bd2)> Start host gamepad task ... ");
//    Thread thread_gpd(gamepad_task, NULL, osPriorityNormal, 128*4);  // GamePad Task isn't necessary.
    DEBUG_PRINT_L0("Handy(Bd2)> Start switch task ... ");
    Thread thread_swd(sw_task, NULL, osPriorityNormal, 256 * 4);

    DEBUG_PRINT_L0("\r\n");
    DEBUG_PRINT_L0("Handy(Bd2)> =============================================================\r\n");

    led4 = OFF;
    led3 = OFF;
    led2 = OFF;
    led1 = ON;  // Initializing is OK then Power Indicator LED ON    
   
    wait(10.0);

    if( flg_system_ok == true )
    {
        led_ind_ptwc = OFF;      // LED indicator pan/tilt, crawler limit
        led_ind_tfm = OFF;       // LED indicator tfm motor current limit
        led_valid_part1 = OFF;   // LED transform, crawler valid 
        led_valid_part2 = OFF;   // LED pan/tilt, winch valid  
    }

    while( 1 ) {
        Thread::wait(3);
        // -----------------------------------------------------------------
        // Communicate with client PC program.
        //    TCP connection: 
        // -----------------------------------------------------------------
        if( flg_system_ok == true )
        {
            lcdMutex.lock();
            lcd_dsp(13,0,"[^] ",4); 
            lcdMutex.unlock();
            Thread::wait(300);
            lcdMutex.lock();
            lcd_dsp(13,0,"[>] ",4); 
            lcdMutex.unlock();
            Thread::wait(300);
            lcdMutex.lock();
            lcd_dsp(13,0,"[v] ",4); 
            lcdMutex.unlock();
            Thread::wait(300);
            lcdMutex.lock();
            lcd_dsp(13,0,"[<] ",4); 
            lcdMutex.unlock();
            Thread::wait(300);
        }
        else
        {
            lcdMutex.lock();
            //           0123456789012345
            lcd_dsp(0,0,"HandyCtrl Error!",16); 
            lcd_dsp(0,1,"* Check system! * ",16);
            lcdMutex.unlock();
            Thread::wait(750);
        }
    }
    
    tsocket.close();
}