2018.07.26
Dependencies: EthernetInterface TextLCD USBDevice USBHost3 mbed
Fork of USBHostHub_HelloWorld by
Diff: 0_main.cpp
- Revision:
- 10:a2bd7d07c7f8
- Child:
- 11:ff06edc0219c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/0_main.cpp Wed Feb 10 14:58:50 2016 +0000 @@ -0,0 +1,2136 @@ +/*************************************** + * Project: B2 + * Title: CrExp B2 Motor Ctrl Main + * Target: LPC1768 + * ------------------------------------ + * + * + * + * mbed LPC1768 + * +-------USB-----+ + * GND | | VOUT(3.3V) + * VIN | | VU(5.0V OUT) + * VB | | IF- + * mR | # ### # ### | IF+ + * p5 mosi | # # # # # # | Ether RD- + * p6 miso | # # ### ### | Ether RD+ + * p7 sck | # # # # # # | Ether TD- + * p8 | # # ### ### | Ether TD+ + * p9 tx sdi | | USB D- + * p10 rx scl | | USB D+ + * p11 mosi | | CAN rd p30 + * p12 miso | | CAN td p29 + * p13 tx sck | | sda tx p28 + * p14 rx | | scl rx P27 + * p15 AIn | | PWM P26 + * p16 AIn | | PWM P25 + * p16 AIn | | PWM p24 + * p18 AIn AOut | | PWM p23 + * p19 AIn | | PWM p22 + * p20 AIn | | PWM p21 + * +---------------+ + * + ***************************************/ +#include "mbed.h" +#include "USBHostGamepad.h" +#include "USBSerial.h" +#include "rtos.h" +#include "EthernetInterface.h" +//#include "QEI.h" +#include "common.h" +#include "stdio.h" +#include "TextLCD.h" +#include "com_func.h" + +// USBSerial serial setting +Serial pc(USBTX, USBRX); // UART + +// Digital I/O setting +DigitalOut led1(LED1); // 1: on, 0: off +DigitalOut led2(LED2); // 1: on, 0: off +DigitalOut led3(LED3); // 1: on, 0: off +DigitalOut led4(LED4); // 1: on, 0: off + +// I2C setting +//i2c(p28, p27); // I2C SDA, SCL is not good ??? +I2C i2c(p9, p10); // I2C SDA, SCL is good + +// I2C address +const int32_t i2c_addr_handy = I2C_ADDRESS_HANDY << 1; // Ctrl Board0 : Handy Controller +const int32_t i2c_addr_winch = I2C_ADDRESS_WINCH << 1; // Ctrl Board1 : Winch +const int32_t i2c_addr_transform = I2C_ADDRESS_TRANSFORM << 1; // Ctrl Board2 : Transform +const int32_t i2c_addr_crawler = I2C_ADDRESS_CRAWLER << 1; // Ctrl Board3 : Crawler +const int32_t i2c_addr_resolver = I2C_ADDRESS_RESOLVER << 1; // Ctrl Board4 : Resolver + +// Ethernet +EthernetInterface eth; +TCPSocketServer tcp_server; // TCP Server +TCPSocketConnection tcp_client; +UDPSocket udp_server; // UDP Server +Endpoint client; +// LCD +TextLCD lcd(p11, p12, p24, p23, p22, p21); // rs, e, d4-d7 +// Local File System +LocalFileSystem SettingFile("local"); // Create the local filesystem under the name "local" + +// Global +uint32_t flg_gamePad_Connected = 0; +char PC_cmd[11+1] = "&0100000000"; +setValue_t setValue; // Setting Data +char dbuffer[128]; +uint8_t motor_speed = 0; +/* Status flag */ +/* + 0000 0000 : button LI LK RI RK PCW PCCW TU TD + 0000 0000 : limit switch + 0000 0000 : res + 0000 0000 : res +*/ +uint32_t flg_exp_status = 0; +Mutex flg_mutex; +Mutex swbtn_OpeMutex; +int swbtn_Opeflg = 0; + +bool flg_ButtonOn = false; + +// Mutex hwbtn_OpeMutex; +// int hwbtn_Opeflg = 0; + +char motor_current_pct; +int flg_JS_shape_mode = 0; +int flg_JS_ope_mode = 0; +uint8_t motor1_current_pct; +uint8_t motor2_current_pct; + + +/* Prototype */ +void write_Setting_lfs(void); +int read_Setting_lfs(void); +void dsp_console_setting_value(void); +void winchMovingControl( int, char*, int, winchData_t*, int, char* ); +extern void dspSetValue2Console( Serial*, setValue_t * ); +extern void lcd_out( TextLCD* ,int, int, char* ); + +// ============================================================ +// Read motor current +// ============================================================ +void read_motorCurrent( + int i2c_addr, + char* I2C_cmd, + char* I2C_res, + int NumberOfI2Cdata + +){ + I2C_cmd[1] = 'C'; + i2c.write(i2c_addr, I2C_cmd, 3); // Send command to motor control board. + //Thread::wait(500); + i2c.read(i2c_addr, I2C_res, 3); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + /* + DEBUG_PRINT_L4(" ++++++++++++++++++++++++++++++\n" ); + DEBUG_PRINT_L4(" Read Motor1 Current [%d]\n", I2C_res[0] ); + DEBUG_PRINT_L4(" Read Motor2 Current [%d]\n", I2C_res[1] ); + DEBUG_PRINT_L4(" Read Motor2 Current [%d]\n", I2C_res[2] ); + DEBUG_PRINT_L4(" ++++++++++++++++++++++++++++++\n" ); + */ +} + +// ============================================================ +// Send stop command to motor specific controller +// ============================================================ +void stop_motor( int32_t i2c_addr, char* i2c_cmd, int32_t flg ){ + if (flg == 1 ){ + i2c_cmd[3] = MOTOR_STP; + i2c_cmd[4] = MOTOR_STP; + } + i2c.write(i2c_addr, i2c_cmd, 6 ); // Send command to motor control board. +} + +// ============================================================ +// Send Status to PC +// ============================================================ +void sendStatus2PC( char *cmd, int32_t numberOfCmd ){ + int i; + led4 = 1; + for ( i = 0; i < numberOfCmd; i++ ) { + pc.putc(*cmd++); + } + led4 = 0; +} + +// ============================================================ +// Read winch current position from Resolver. +// ============================================================ +int16_t ReadWinchCurrentPosition( int32_t i2c_addr ) +{ + char I2C_data[2]; + int16_t res_position; + + i2c.read(i2c_addr, I2C_data, 2); // Read + // flg_mutex.lock(); + res_position = (I2C_data[1] << 8) | I2C_data[0]; + // winchCurrentPosition = res_position; + // flg_mutex.unlock(); + return res_position; +} + +// ============================================================ +// Button control +// ============================================================ +void onControl( + uint8_t btn00, uint8_t btn01, uint8_t btn02, uint8_t btn03, + uint8_t btn04, uint8_t btn05, uint8_t btn06, uint8_t btn07, + uint8_t btn08, uint8_t btn09, uint8_t btn10, uint8_t btn11, + uint8_t btn12, uint8_t btn13, uint8_t btn14, uint8_t btn15, + uint16_t gamePadVID, uint16_t gamePadPID +){ + /* ** OLD type *** + * I2C Command (7byte) + * 0: '#' // Preamble + * 1: '0' // Target upper + * 2: '1' // Target lower + * 3: '0' // Command 1 + * 4: '1/3' // Command 2 + * 5: '0/1' + */ + + /* New Type 15.11.06 ~ + [0] : + [1] : + [2] : + [3] : + [4] : motor 1 direction (A=Forward, B=Reverse, F=Stop) + [5] : motor 1 speed + [6] : motor 2 direction (A=Forward, B=Reverse, F=Stop) + [7] : motor 2 speed <-- New added + [8] : N/F + [9] : N/F + */ + char I2C_cmd[NumberOfI2CCommand+1] = "#010000"; + char I2C_res[NumberOfI2CCommand+1] = "\0"; + + uint8_t btnStatus_RFK = 0; + uint8_t btnStatus_RFI = 0; + uint8_t btnStatus_LBK = 0; + uint8_t btnStatus_LBI = 0; + uint8_t btnStatus_WUP = 0; + uint8_t btnStatus_WDN = 0; + uint8_t btnStatus_RJSFwdRvs = 0; // R-JS Fwd/Rvs + uint8_t btnStatus_RJSLftRgt = 0; // R-JS Left/Light + uint8_t btnStatus_LJSFwdRvs = 0; // L-JS Fwd/Rvs + uint8_t btnStatus_LJSLftRgt = 0; // L-Js Left/Right + + uint8_t btnStatus_Start = 0; // Guide button status for ELECOM GamePad + uint8_t btnStatus_CrossUp = 0; + uint8_t btnStatus_CrossDn = 0; + uint8_t btnStatus_CrossRt = 0; + uint8_t btnStatus_CrossLt = 0; + + // For JS Ope mode B + uint8_t btnID_RFK = 0; + uint8_t btnID_RFI = 0; + uint8_t btnID_LBK = 0; + uint8_t btnID_LBI = 0; + uint8_t btnID_WUP = 0; + uint8_t btnID_WDN = 0; + + uint8_t btnID_Start = 0; // Guide button ID for ELECOM GamePad + uint8_t btnID_JS_SD = 0; // JS mode Single / Dual + uint8_t btnID_JD_IK = 0; // JS mode I-Shape / KO-Shape + + uint8_t btnID_CrossUp = 0; + uint8_t btnID_CrossDn = 0; + uint8_t btnID_CrossRt = 0; + uint8_t btnID_CrossLt = 0; + + if( gamePadVID == GAMEPAD_VID_RSTHANDY ){ // NRst own original controller + DEBUG_PRINT_L4("Bd0> [Rst HDY] "); + btnID_WDN = 0x10; + btnID_WUP = 0x20; + btnID_RFK = 0x01; + btnID_RFI = 0x02; + btnID_LBK = 0x04; + btnID_LBI = 0x08; + btnID_CrossUp = 0; + btnID_CrossDn = 4; + btnID_CrossRt = 2; + btnID_CrossLt = 6; + btnID_JS_SD = 1; // JS mode Single or Dual + btnID_JD_IK = 2; // JS mode I-Shape KO-Shape + if ( gamePadPID == GAMEPAD_PID_RSTHANDY ){ + btnStatus_WUP = btn04; + btnStatus_WDN = btn04; + btnStatus_RFK = btn04; + btnStatus_RFI = btn04; + btnStatus_LBK = btn04; + btnStatus_LBI = btn04; + btnStatus_RJSFwdRvs = btn03; // Assign analog js to this sw input by LPC1768mbed + btnStatus_RJSLftRgt = btn02; // Assign analog js to this sw input by LPC1768mbed + btnStatus_LJSFwdRvs = btn01; // Assign analog js to this sw input by LPC1768mbed + btnStatus_LJSLftRgt = btn00; // Assign analog js to this sw input by LPC1768mbed + btnStatus_Start = btn05; // + btnStatus_CrossUp = btn06; + btnStatus_CrossDn = btn06; + btnStatus_CrossRt = btn06; + btnStatus_CrossLt = btn06; + } + } + else if (gamePadVID == GAMEPAD_VID_ELECOM ){ + DEBUG_PRINT_L4("Bd0> [ELECOM] "); + btnID_WUP = 2; + btnID_WDN = 4; + btnID_RFK = 32; + btnID_RFI = 128; + btnID_LBK = 16; + btnID_LBI = 64; + btnID_Start = 8; // Guide button ID for ELECOM GamePad + btnID_CrossUp = 0; + btnID_CrossDn = 4; + btnID_CrossRt = 2; + btnID_CrossLt = 6; + if ( gamePadPID == GAMEPAD_PID_ELECOM_JCU3613M ){ + btnStatus_WUP = btn04; + btnStatus_WDN = btn04; + btnStatus_RFK = btn04; + btnStatus_RFI = btn04; + btnStatus_LBK = btn04; + btnStatus_LBI = btn04; + btnStatus_RJSFwdRvs = btn03; + btnStatus_RJSLftRgt = btn02; + btnStatus_LJSFwdRvs = btn01; + btnStatus_LJSLftRgt = btn00; + btnStatus_Start = btn05; // Guide button status for ELECOM GamePad + btnStatus_CrossUp = btn06; + btnStatus_CrossDn = btn06; + btnStatus_CrossRt = btn06; + btnStatus_CrossLt = btn06; + } + } + else if( gamePadVID == GAMEPAD_VID_LOGICOOL ){ + btnID_WUP = 136; + btnID_WDN = 40; + btnID_RFK = 2; + btnID_RFI = 8; + btnID_LBK = 1; + btnID_LBI = 4; + btnID_Start = 32; // Guide button ID for ELECOM GamePad + btnID_CrossUp = 0; + btnID_CrossDn = 4; + btnID_CrossRt = 2; + btnID_CrossLt = 6; + if ( gamePadPID == GAMEPAD_PID_LOGICOOL_F710 ){ + DEBUG_PRINT_L4("Bd0> [LOGI F710] "); + btnStatus_WUP = btn05; + btnStatus_WDN = btn05; + btnStatus_RFK = btn06; + btnStatus_RFI = btn06; + btnStatus_LBK = btn06; + btnStatus_LBI = btn06; + } + else if ( gamePadPID == GAMEPAD_PID_LOGICOOL_F310 ){ + DEBUG_PRINT_L4("Bd0> [LOGI F310] "); + btnStatus_WUP = btn04; + btnStatus_WDN = btn04; + btnStatus_RFK = btn05; + btnStatus_RFI = btn05; + btnStatus_LBK = btn05; + btnStatus_LBI = btn05; + btnStatus_RJSFwdRvs = btn03; + btnStatus_RJSLftRgt = btn02; + btnStatus_LJSFwdRvs = btn01; + btnStatus_LJSLftRgt = btn00; + btnStatus_RJSFwdRvs = btn03; + btnStatus_RJSLftRgt = btn02; + btnStatus_LJSFwdRvs = btn01; + btnStatus_LJSLftRgt = btn00; + btnStatus_Start = btn05; // Guide button status for ELECOM GamePad + btnStatus_CrossUp = btn04; + btnStatus_CrossDn = btn04; + btnStatus_CrossRt = btn04; + btnStatus_CrossLt = btn04; + } + } + else if ( gamePadVID == GAMEPAD_VID_SANWA){ + DEBUG_PRINT_L4("Bd0> [SANWA] "); + btnID_WUP = 4; + btnID_WDN = 2; + btnID_RFK = 2; + btnID_RFI = 1; + btnID_LBK = 128; + btnID_LBI = 64; + if ( gamePadPID == GAMEPAD_PID_SANWA_JYP70US ){ + btnStatus_WUP = btn05; + btnStatus_WDN = btn05; + btnStatus_RFK = btn06; + btnStatus_RFI = btn06; + btnStatus_LBK = btn05; + btnStatus_LBI = btn05; + } + } + +#ifdef __DISP_GAMAPAD_STATUS_ALL__ // For Debug +// DEBUG_PRINT_BTN(" Btn 00:%d, 01:%d, 02:%d, 03:%d, 04:%d, 05:%d, 06:%d, 07:%d, 08:%d | VID=0x%04x, PID=0x%04x\r\n", +// btn00,btn01,btn02,btn03,btn04,btn05,btn06,btn07,btn08, +// gamePadVID, gamePadPID); + DEBUG_PRINT_L4(" Btn 00:%d, 01:%d, 02:%d, 03:%d, 04:%d, 05:%d, 06:%d, 07:%d, 08:%d\r\n", + btn00,btn01,btn02,btn03,btn04,btn05,btn06,btn07,btn08); +#endif + + I2C_cmd[4] = '\0'; + I2C_cmd[5] = '\0'; + I2C_cmd[6] = '\0'; + I2C_cmd[7] = '\0'; + I2C_cmd[8] = '\0'; + I2C_cmd[9] = '\0'; + + int tmpSpeed = 0; + + if (swbtn_Opeflg == 1){ + Thread::wait(1); + } + else{ + if( gamePadVID == GAMEPAD_VID_RSTHANDY ){ // NRst own original controller + flg_exp_status &= 0xFFFFFFF0; + if(!( btnStatus_Start & 0x01 )){ // I-Shape + setValue.operation.sv_JS_ShapeMode = 0; + setValue.operation.sv_JS_OpeMode = 0; + flg_exp_status |= 0x00000001; + } + else{ // KO-Shape + setValue.operation.sv_JS_ShapeMode = 1; + flg_exp_status |= 0x00000002; + } + + if(!(btnStatus_Start & 0x02 )&&( btnStatus_Start & 0x01 )){ // Dual + setValue.operation.sv_JS_OpeMode = 1; + flg_exp_status |= 0x00000004; + } + else{ // Single + setValue.operation.sv_JS_OpeMode = 0; + flg_exp_status |= 0x00000008; + } + DEBUG_PRINT_L4( "-----------------------------\n" ); + DEBUG_PRINT_L4( "%d : %d\n",btnStatus_Start, flg_exp_status ); + DEBUG_PRINT_L4( " JS shape mode change : %d\n", setValue.operation.sv_JS_ShapeMode); + DEBUG_PRINT_L4( " JS operation mode change: %d\n", setValue.operation.sv_JS_OpeMode ); + DEBUG_PRINT_L4( "-----------------------------\n" ); + } + else{ + /* + * + * GamePad software switch + * [Guide] + [B] : JS shape mode toggle: I <--> KO + * [Guide] + [X} : JS Operation mode toggle: Dual <--> Single + * 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+-+-+-+ + * |x|x|x|x|x|x|x|o| 1: I-Shape JSmode, 2: K-Shape JSmode, 4: Single JSmode, 8: Dual JSmode + * +-+-+-+-+-+-+-+-+ + */ + if( btnStatus_Start == btnID_Start ){ + if ( btnStatus_CrossUp == btnID_CrossUp ){ // I Shape + setValue.operation.sv_JS_ShapeMode = 0; + setValue.operation.sv_JS_OpeMode = 0; + DEBUG_PRINT_L4( "--------------------------------\n" ); + DEBUG_PRINT_L4( " I\n" ); + DEBUG_PRINT_L4( " JS shape mode change : %d\n", setValue.operation.sv_JS_ShapeMode); + DEBUG_PRINT_L4( " JS operation mode change: %d\n", setValue.operation.sv_JS_OpeMode ); + DEBUG_PRINT_L4( "--------------------------------\n" ); + flg_exp_status |= 0x00000001; + } + else if( btnStatus_CrossDn == btnID_CrossDn ){ // KO Shape + setValue.operation.sv_JS_ShapeMode = 1; + DEBUG_PRINT_L4( "-------------------------\n" ); + DEBUG_PRINT_L4( " KO\n" ); + DEBUG_PRINT_L4( " JS shape mode change : %d\n", setValue.operation.sv_JS_ShapeMode); + DEBUG_PRINT_L4( " JS operation mode change: %d\n", setValue.operation.sv_JS_OpeMode ); + DEBUG_PRINT_L4( "-------------------------\n" ); + flg_exp_status |= 0x00000002; + } + else if( btnStatus_CrossRt == btnID_CrossRt ){ // Single JS + setValue.operation.sv_JS_OpeMode = 0; + DEBUG_PRINT_L4( "-----------------------------\n" ); + DEBUG_PRINT_L4( " Single\n" ); + DEBUG_PRINT_L4( " JS shape mode change : %d\n", setValue.operation.sv_JS_ShapeMode); + DEBUG_PRINT_L4( " JS operation mode change: %d\n", setValue.operation.sv_JS_OpeMode ); + DEBUG_PRINT_L4( "-----------------------------\n" ); + flg_exp_status |= 0x00000004; + } + else if( btnStatus_CrossLt == btnID_CrossLt ){ // Dual JS + if( setValue.operation.sv_JS_ShapeMode == 1 ){ // KO Shape + setValue.operation.sv_JS_OpeMode = 1; + DEBUG_PRINT_L4( "-----------------------------\n" ); + DEBUG_PRINT_L4( " Dual\n" ); + DEBUG_PRINT_L4( " JS shape mode change : %d\n", setValue.operation.sv_JS_ShapeMode); + DEBUG_PRINT_L4( " JS operation mode change: %d\n", setValue.operation.sv_JS_OpeMode ); + DEBUG_PRINT_L4( "-----------------------------\n" ); + flg_exp_status |= 0x00000008; + } + } + } + else{ + flg_exp_status &= 0xFFFFFFF0; + } + } + /*/ ==================================== + // Crawler Moving Control + // ==================================== + // JoyStick mode 1: Dual JoyStick mode + // + // *** *** + // * L * * R * + // *** *** + // F 4 1 + // + // R 8 2 + // + // Forward move 5 + // Reverce move a + // Right rotation 6 + // Left rotation 9 + * 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+-+-+-+ + * |x|x|o|x|x|x|x|x| 1: R Fwd, 2: R Rvs, 4: L Fwd, 8: L Rvs + * +-+-+-+-+-+-+-+-+ + */ + if( setValue.operation.sv_JS_OpeMode == 1 ){ + if( btnStatus_LJSFwdRvs < setValue.crawlerCtrl.sv_LBCM_dzc - setValue.crawlerCtrl.sv_LBCM_dzl ){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[6] = MOTOR_FWD; // Motor2 FWD + tmpSpeed = ( setValue.crawlerCtrl.sv_LBCM_dzc+1 - btnStatus_LJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_LBCM_dzc * setValue.crawlerCtrl.sv_LBCM_sli_F / 100; // Speed + I2C_cmd[7] = (char)tmpSpeed; + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + DEBUG_PRINT_L3( "Bd0> Dual Mode: L-Fwd (Speed=%d)\n", tmpSpeed); + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + flg_exp_status |= 0x00400000; + + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else if( btnStatus_LJSFwdRvs > setValue.crawlerCtrl.sv_LBCM_dzc + setValue.crawlerCtrl.sv_LBCM_dzu ){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[6] = MOTOR_RVS; // Motor2 RVS + tmpSpeed = ( btnStatus_LJSFwdRvs - setValue.crawlerCtrl.sv_LBCM_dzc ) * 100 / setValue.crawlerCtrl.sv_LBCM_dzc+1 * setValue.crawlerCtrl.sv_LBCM_sli_F / 100; // Speed I2C_cmd[5] = (char)tmpSpeed; + I2C_cmd[7] = (char)tmpSpeed; + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + DEBUG_PRINT_L3( "Bd0> Dual Mode: L-Rvs (Speed=%d)\n", tmpSpeed); + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + flg_exp_status |= 0x00800000; + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else{ + I2C_cmd[6] = MOTOR_STP; // Stop + I2C_cmd[7] = 0; // Speed=0 + flg_exp_status &= 0xFF3F000F; + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + } + + if( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc - setValue.crawlerCtrl.sv_RFCM_dzl ){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[2] = MOTOR_FWD; // Motor1 FWD + tmpSpeed = (( 128 - btnStatus_RJSFwdRvs ) * 100 / 127 ) * setValue.crawlerCtrl.sv_RFCM_sli_R / 100; + I2C_cmd[3] = (char)tmpSpeed; + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + DEBUG_PRINT_L3( "Bd0> Dual Mode: R-Fwd (Speed=%d)\n", tmpSpeed); + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + flg_exp_status |= 0x00100000; + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else if( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc + setValue.crawlerCtrl.sv_RFCM_dzu ){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[2] = MOTOR_RVS; // Motor1 RVS + tmpSpeed = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc+1 * setValue.crawlerCtrl.sv_RFCM_sli_R / 100; // Speed + I2C_cmd[3] = (char)tmpSpeed; + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + DEBUG_PRINT_L3( "Bd0> Dual Mode: R-Rvs (Speed=%d)\n", tmpSpeed); + DEBUG_PRINT_L3( "Bd0> ******************************\n"); + flg_exp_status |= 0x00200000; + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else{ + I2C_cmd[2] = MOTOR_STP; // Stop + I2C_cmd[3] = 0; // Speed=0 + flg_exp_status &= 0xFFCFFFFF; + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + } + // I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + // I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + // I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + // I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + // i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + // i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + led3 = 0; + } + /* JoyStick mode 0: Single JoyStick mode + // + // *** **** + // * X * * LR * + // *** **** + // F 4 1 + // + // R 8 2 + // + // Forward move 5 + // Reverce move a + // Right rotation 6 + // Left rotation 9 + * 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+-+-+-+ + * |x|x|o|x|x|x|x|x| 1: R Fwd, 2: R Rvs, 4: L Fwd, 8: L Rvs + * +-+-+-+-+-+-+-+-+ + */ + else{ // Single JoyStick mode + if(( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl ) && ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu) && ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl)){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[2] = MOTOR_FWD; // Motor1 Fwd + I2C_cmd[3] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_F / 100; // Speed + I2C_cmd[6] = MOTOR_FWD; // Motor2 Fwd + I2C_cmd[7] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSFwdRvs ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_R / 100; // Speed + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + DEBUG_PRINT_L4( "Bd0> Single Mode: Dir1 (Speed: %d, %d)\n", I2C_cmd[5], I2C_cmd[7]); + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + flg_exp_status |= 0x00100000; + flg_exp_status |= 0x00400000; // 0x00500000 + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else if(( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu ) && ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu) && ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl)){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[2] = MOTOR_RVS; // Motor1 Rvs + I2C_cmd[3] = ( btnStatus_RJSLftRgt - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_F / 100; // Speed + I2C_cmd[6] = MOTOR_FWD; // Motor2 Fwd + I2C_cmd[7] = ( btnStatus_RJSLftRgt - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_R / 100; // Speed + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + DEBUG_PRINT_L4( "Bd0> Single Mode: Dir2 (Speed: %d, %d)\n", I2C_cmd[5], I2C_cmd[7]); + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + flg_exp_status |= 0x00200000; + flg_exp_status |= 0x00400000; // 0x00600000 + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else if(( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu ) && ( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu) && ( btnStatus_RJSLftRgt > setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl)){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[2] = MOTOR_RVS; // Motor1 Rvs + I2C_cmd[3] = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_F / 100; // Speed + I2C_cmd[6] = MOTOR_RVS; // Motor2 Rvs + I2C_cmd[7] = ( btnStatus_RJSFwdRvs - setValue.crawlerCtrl.sv_RFCM_dzc ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_R / 100; // Speed + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + DEBUG_PRINT_L4( "Bd0> Single Mode: Dir3 (Speed: %d, %d)\n", I2C_cmd[5], I2C_cmd[7]); + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + flg_exp_status |= 0x00200000; + flg_exp_status |= 0x00800000; // 0x00A00000 + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else if(( btnStatus_RJSLftRgt < setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzu ) && ( btnStatus_RJSFwdRvs < setValue.crawlerCtrl.sv_RFCM_dzc+setValue.crawlerCtrl.sv_RFCM_dzu) && ( btnStatus_RJSFwdRvs > setValue.crawlerCtrl.sv_RFCM_dzc-setValue.crawlerCtrl.sv_RFCM_dzl)){ + flg_ButtonOn = true; + led3 = 1; + I2C_cmd[2] = MOTOR_FWD; // Motor1 Fwd + I2C_cmd[3] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSLftRgt ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_F / 100; // Speed + I2C_cmd[6] = MOTOR_RVS; // Motor2 Rvs + I2C_cmd[7] = ( setValue.crawlerCtrl.sv_RFCM_dzc+1 - btnStatus_RJSLftRgt ) * 100 / setValue.crawlerCtrl.sv_RFCM_dzc * setValue.crawlerCtrl.sv_RFCM_sli_R / 100; // Speed + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + DEBUG_PRINT_L4( "Bd0> Single Mode: Dir4 (Speed: %d, %d)\n", I2C_cmd[5], I2C_cmd[7]); + DEBUG_PRINT_L4( "Bd0> *************************************\n"); + flg_exp_status |= 0x00100000; + flg_exp_status |= 0x00800000; // 0x00900000 + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + // ==================================== + // ALL motor off commmand packet send + // ==================================== + else { + led3 = 0; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_STP; // Motor1 Fwd + I2C_cmd[3] = 0; // Speed=0 + I2C_cmd[6] = MOTOR_STP; // Motor2 Rvs + I2C_cmd[7] = 0; // Speed=0 + Thread::wait(5); + #endif + flg_exp_status &= 0xFF0FFFFF; + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + } + // I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + // I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + // I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + // I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + // i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + // i2c.write(i2c_addr_crawler, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + } + /* + * ==================================== + * Winch Motor Control + * + * 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+-+-+-+ + * |x|o|x|x|x|x|x|x| 1: W Down, 2: W Up, 4: -, 8: - + * +-+-+-+-+-+-+-+-+ + */ + if ( btnStatus_WDN == btnID_WDN ) { // Winch Down (FWD) + flg_ButtonOn = true; + + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + DEBUG_PRINT_L3( "Bd0> BTN W-DN(Fwd)\n" ); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + led3 = 1; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_FWD; // Motor1 FWD + I2C_cmd[3] = setValue.winchCtrl.sv_WDM_sli_F; // Speed + // I2C_cmd[6] = MOTOR_FWD; // Motor2 FWD + // I2C_cmd[7] = setValue.winchCtrl.sv_WRM_sli_F; // Speed + #endif + //// Are these part necessary ?? //// + //// = ReadWinchCurrentPosition(i2c_addr_resolver); + // ReadCurrentPositon(i2c_addr_resolver, &winchData, sizeof(winchData), 0x00 ); + // winchCurrentPosition = winchData.dt_WinchCntPosition; + ////DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\n", winchCurrentPosition ); + + flg_exp_status |= 0x01000000; + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + + I2C_cmd[4] = setValue.winchCtrl.sv_WDM_ith_F; + I2C_cmd[5] = setValue.winchCtrl.sv_WDM_ith_R; + I2C_cmd[8] = setValue.winchCtrl.sv_WRM_ith_F; + I2C_cmd[9] = setValue.winchCtrl.sv_WRM_ith_R; + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + flg_ButtonOn = false; + } + else if ( btnStatus_WUP == btnID_WUP ) { // Winch Up (Rvs) + flg_ButtonOn = true; + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + DEBUG_PRINT_L3( "Bd0> BTN W-UP(Rvs)\n" ); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + led3 = 1; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_RVS; // Motor1 RVS + I2C_cmd[3] = setValue.winchCtrl.sv_WDM_sli_R; // Speed + // I2C_cmd[6] = MOTOR_RVS; // Motor2 RVS + // I2C_cmd[7] = setValue.winchCtrl.sv_WRM_sli_R; // Speed + #endif + //// Are these part necessary ?? //// + ////winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + // ReadCurrentPositon(i2c_addr_resolver, &winchData, sizeof(winchData), 0x00 ); + // winchCurrentPosition = winchData.dt_WinchCntPosition; + ////DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\n", winchCurrentPosition ); + + flg_exp_status |= 0x02000000; + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + I2C_cmd[4] = setValue.winchCtrl.sv_WDM_ith_F; + I2C_cmd[5] = setValue.winchCtrl.sv_WDM_ith_R; + I2C_cmd[8] = setValue.winchCtrl.sv_WRM_ith_F; + I2C_cmd[9] = setValue.winchCtrl.sv_WRM_ith_R; + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + motor_current_pct = I2C_res[0]; + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + flg_ButtonOn = false; + } + // ==================================== + // ALL motor off commmand packet send + // ==================================== + else { + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + led3 = 0; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_STP; + I2C_cmd[3] = 0; + I2C_cmd[6] = MOTOR_STP; + I2C_cmd[7] = 0; + Thread::wait(5); + #endif + flg_exp_status &= 0xF0FFFFFF; + I2C_cmd[4] = setValue.winchCtrl.sv_WDM_ith_F; + I2C_cmd[5] = setValue.winchCtrl.sv_WDM_ith_R; + I2C_cmd[8] = setValue.winchCtrl.sv_WRM_ith_F; + I2C_cmd[9] = setValue.winchCtrl.sv_WRM_ith_R; + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + + } +// I2C_cmd[4] = setValue.winchCtrl.sv_WDM_ith_F; +// I2C_cmd[5] = setValue.winchCtrl.sv_WDM_ith_R; +// I2C_cmd[8] = setValue.winchCtrl.sv_WRM_ith_F; +// I2C_cmd[9] = setValue.winchCtrl.sv_WRM_ith_R; +// i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board +// i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + +// motor1_current_pct = I2C_res[0]; +// motor2_current_pct = I2C_res[1]; +// motor_current_pct = motor1_current_pct; +// DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + + //// Are these part necessary ?? //// + ////winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + //ReadCurrentPositon(i2c_addr_resolver, &winchData, sizeof(winchData), 0x00 ); + //winchCurrentPosition = winchData.dt_WinchCntPosition; + ////DEBUG_PRINT_L3("Bd0> Winch Current Position (button) : %04d\n", winchCurrentPosition ); + + /* + // ==================================== + // TRANSFORM Motor Control + // ==================================== + * 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+-+-+-+ + * |o|x|x|x|x|x|x|x| 1: RF-I, 2: RF-K, 4: LB-I, 8: LB-K + * +-+-+-+-+-+-+-+-+ + */ + + if ( btnStatus_RFK == btnID_RFK ) { // RF KO + flg_ButtonOn = true; + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + DEBUG_PRINT_L3( "Bd0> BTN RF-K\n" ); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + led3 = 1; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_FWD; // Motor1 FWD + I2C_cmd[3] = setValue.tfmCtrl.sv_RFTM_sli_F; // Speed + #endif + flg_exp_status |= 0x10000000; + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + } + else if ( btnStatus_RFI == btnID_RFI ) { // RF I + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + DEBUG_PRINT_L3( "Bd0> BTN RF-I\n" ); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + led3 = 1; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_RVS; // Motor1 RVS + I2C_cmd[3] = setValue.tfmCtrl.sv_RFTM_sli_R; // Speed + #endif + flg_exp_status |= 0x20000000; + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + + I2C_cmd[4] = setValue.tfmCtrl.sv_RFTM_ith_F; + I2C_cmd[5] = setValue.tfmCtrl.sv_RFTM_ith_R; + I2C_cmd[8] = setValue.tfmCtrl.sv_LBTM_ith_F; + I2C_cmd[9] = setValue.tfmCtrl.sv_LBTM_ith_R; + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + flg_ButtonOn = false; + } + else if ( btnStatus_LBK == btnID_LBK ) { // LB KO + flg_ButtonOn = true; + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + DEBUG_PRINT_L3( "Bd0> BTN LB-K\n" ); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + led3 = 1; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[6] = MOTOR_FWD; // Motor2 FWD + I2C_cmd[7] = setValue.tfmCtrl.sv_LBTM_sli_F; // Speed + #endif + flg_exp_status |= 0x40000000; + + I2C_cmd[4] = setValue.tfmCtrl.sv_RFTM_ith_F; + I2C_cmd[5] = setValue.tfmCtrl.sv_RFTM_ith_R; + I2C_cmd[8] = setValue.tfmCtrl.sv_LBTM_ith_F; + I2C_cmd[9] = setValue.tfmCtrl.sv_LBTM_ith_R; + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + flg_ButtonOn = false; + } + else if ( btnStatus_LBI == btnID_LBI ) { // LB I + flg_ButtonOn = true; + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + DEBUG_PRINT_L3( "Bd0> BTN LB-I\n" ); + DEBUG_PRINT_L3( "Bd0> ****************\n" ); + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + led3 = 1; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[6] = MOTOR_RVS; // Motor1 RVS + I2C_cmd[7] = setValue.tfmCtrl.sv_LBTM_sli_R; // Speed + #endif + flg_exp_status |= 0x80000000; + + I2C_cmd[4] = setValue.tfmCtrl.sv_RFTM_ith_F; + I2C_cmd[5] = setValue.tfmCtrl.sv_RFTM_ith_R; + I2C_cmd[8] = setValue.tfmCtrl.sv_LBTM_ith_F; + I2C_cmd[9] = setValue.tfmCtrl.sv_LBTM_ith_R; + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + flg_ButtonOn = false; + } + // ==================================== + // ALL motor off commmand packet send + // ==================================== + else { + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); + led3 = 0; + #ifdef __IIC_COMAMND_SEND__ + I2C_cmd[2] = MOTOR_STP; + I2C_cmd[3] = 0; + I2C_cmd[6] = MOTOR_STP; + I2C_cmd[7] = 0; + Thread::wait(5); + #endif + flg_exp_status &= 0x0FFFFFFF; + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + I2C_cmd[4] = setValue.tfmCtrl.sv_RFTM_ith_F; + I2C_cmd[5] = setValue.tfmCtrl.sv_RFTM_ith_R; + I2C_cmd[8] = setValue.tfmCtrl.sv_LBTM_ith_F; + I2C_cmd[9] = setValue.tfmCtrl.sv_LBTM_ith_R; + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + + } + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 1; + // hwbtn_OpeMutex.unlock(); +// I2C_cmd[4] = setValue.tfmCtrl.sv_RFTM_ith_F; +// I2C_cmd[5] = setValue.tfmCtrl.sv_RFTM_ith_R; +// I2C_cmd[8] = setValue.tfmCtrl.sv_LBTM_ith_F; +// I2C_cmd[9] = setValue.tfmCtrl.sv_LBTM_ith_R; + // Send Command PAcket here ! +// i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board +// i2c.write(i2c_addr_transform, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board\] + // hwbtn_OpeMutex.lock(); + // hwbtn_Opeflg = 0; + // hwbtn_OpeMutex.unlock(); + } +} + +uint32_t getc_fromHost( uint8_t *c ){ + + uint32_t rts = 0; + + if(pc.readable()){ + *c = pc.getc(); + rts = 0; + } + else{ + rts = 1; + } + return rts; +} + +// ************************************************************** +// TASK: Hoat Interface Task +// +// ************************************************************** +void clientPC_interface_task(void const *) +{ + int rcv_data_cnt; + //winchData_t winchData; + + char I2C_cmd[NumberOfI2CCommand+1] = "#010000"; + char I2C_res[NumberOfI2CCommand+1] = "\0"; + +// winchData_t winchData; + int16_t winchCurrentPosition; + char motor_current_pct; + + while(1){ + + // DEBUG_PRINT("\nWaiting for UDP packet...\n"); + rcv_data_cnt = udp_server.receiveFrom(client, dbuffer, sizeof(dbuffer)); + Thread::wait(10); + if( rcv_data_cnt < 0 ){ + DEBUG_PRINT_L0("Bd0> ## Receive packet fail ##\n"); + } + else{ + dbuffer[rcv_data_cnt] = '\0'; + led4 = 1; + + if(!strcmp( dbuffer, "Hello Z\n" )){ + DEBUG_PRINT_L2("Bd0> Hello Z Packet received from client by UDP\n"); + char snd_data[] = "Hello I'm CrExoB2"; + udp_server.sendTo(client, snd_data, sizeof(snd_data)); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if(!strcmp( dbuffer, "status\n")){ + DEBUG_PRINT_L2("Bd0> Hello Status req received from client by UDP\n"); + strcpy(dbuffer,"XXXX\n"); + udp_server.sendTo(client, dbuffer, sizeof(dbuffer)); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if(!strcmp( dbuffer, "Hello")){ + DEBUG_PRINT_L2( "Bd0> Hello Packet received from [ 0x%02x ]\n", flg_exp_status ); + + /* ***************************************** */ + /* Read Winch Current Position from Resolver */ + /* ***************************************** */ + winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + Thread::wait(10); + + // ------------------------------------- + // Crawler Moving + // ------------------------------------- + if( flg_exp_status & 0x00F00000 ){ + // Forward move 5 + // Reverce move a + // Right rotation 6 + // Left rotation 9 + if((flg_exp_status & 0x00F00000) == 0x00500000 ){ + sprintf( dbuffer, "WCFW %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00a00000 ){ + sprintf( dbuffer, "WCRV %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00600000 ){ + sprintf( dbuffer, "WCRR %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00900000 ){ + sprintf( dbuffer, "WCLR %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00800000 ){ + sprintf( dbuffer, "LCRV %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00400000 ){ + sprintf( dbuffer, "LCFW %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00200000 ){ + sprintf( dbuffer, "RCRV %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + else if((flg_exp_status & 0x00F00000) == 0x00100000 ){ + sprintf( dbuffer, "RCFW %03d %04d\0\0" , motor_speed, winchCurrentPosition); + // Thread::wait(10); + } + DEBUG_PRINT_L2("Bd0> >>>> Crawler >>>>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + // ------------------------------------- + + // Transform + // ------------------------------------- + else if( flg_exp_status & 0x20000000 ){ +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_transform, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf(dbuffer,"RF2I %03d %04d\0", motor_current_pct, winchCurrentPosition ); // RF Crawler Tfm I + DEBUG_PRINT_L2("Bd0> >>>> Transform >>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if( flg_exp_status & 0x10000000 ){ +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_transform, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf(dbuffer,"RF2K %03d %04d\0", motor_current_pct, winchCurrentPosition ); // RF Crawler Tfm K + DEBUG_PRINT_L2("Bd0> >>>> Transform >>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if( flg_exp_status & 0x80000000 ){ +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_transform, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf(dbuffer,"LB2I %03d %04d\0", motor_current_pct, winchCurrentPosition ); // LB Crawler Tfm I + DEBUG_PRINT_L2("Bd0> >>>> Transform >>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if( flg_exp_status & 0x40000000 ){ +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_transform, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf(dbuffer,"LB2K %03d %04d\0", motor_current_pct, winchCurrentPosition ); // LB Crawler Tfm K + DEBUG_PRINT_L2("Bd0> >>>> Transform >>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + // ------------------------------------- + // Winch Moving + // ------------------------------------- + else if( flg_exp_status & 0x01000000 ){ // Wincd down (FWD) +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf(dbuffer,"WCDN %03d %04d\0", motor_current_pct, winchCurrentPosition ); // Winch down + DEBUG_PRINT_L2("Bd0> >>>> Winch >>>>>>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if( flg_exp_status & 0x02000000 ){ // Winch up (RVS) +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf(dbuffer,"WCUP %03d %04d\0", motor_current_pct, winchCurrentPosition ); // Winch down + DEBUG_PRINT_L2("Bd0> >>>> Winch >>>>>>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send2Client: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else if( flg_exp_status & 0x0000000f ){ +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + sprintf( dbuffer,"JSMD %03d %04d\0", setValue.operation.sv_JS_ShapeMode, setValue.operation.sv_JS_OpeMode ); + DEBUG_PRINT_L2("Bd0> >>>> Winch >>>>>>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2("Bd0> Send JSMode: %s\n", dbuffer); + DEBUG_PRINT_L2("Bd0> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + } + else{ +#ifdef __READ_CURRENT_AT_CIF_TASK__ + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_res, NumberOfI2CCommand ); + motor1_current_pct = I2C_res[0]; + motor2_current_pct = I2C_res[1]; + motor_current_pct = motor1_current_pct; + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L2( "Bd0> ReadMotorCurrent (%d)%\n", motor_current_pct ); + DEBUG_PRINT_L2( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); +#endif // __READ_CURRENT_AT_CIF_TASK__ + Thread::wait(10); // When this period seto to short time, gamepad command can not get. 50msec OK + // sprintf( dbuffer,"OFF_ %03d %04d\0", motor_current_pct, winchCurrentPosition ); // Winch down + } + /* Send data to client PC */ + DEBUG_PRINT_L2(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + DEBUG_PRINT_L2(">>>> Send data 2 client PC >>>>\n"); + DEBUG_PRINT_L2(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + udp_server.sendTo(client, dbuffer, sizeof(dbuffer)); + Thread::wait(10); + } + } + Thread::wait(100); // When this period seto to short time, gamepad command can not get. 50msec OK + led4 = 0; + Thread::wait(100); // When this period seto to short time, gamepad command can not get. 50msec OK + } +} + +// ************************************************************** +// TASK: GamaPad Task +// +// ************************************************************** +void gamepad_task(void const *) +{ + + char I2C_cmd[NumberOfI2CCommand+1] = "#010000000"; + +// int counter = 0; + // USB HOST GAMEPAD + USBHostGamepad gamepad; + + led1 = 1; + + while(1) { + + // try to connect a USB Gamepad + while(!gamepad.connect()) { + flg_gamePad_Connected = 0; + led2 = OFF; + // led1 = 1; + Thread::wait(500); + } + + // when connected, attach handler called on gamepad event + gamepad.attachEvent(onControl); + + // wait until the Gamepad is disconnected + while(gamepad.connected()) { + flg_gamePad_Connected = 1; + led2 = !led2; + led2 = ON; + // led1 = 1; + + I2C_cmd[4] = 0x00; + I2C_cmd[5] = 0x01; + i2c.write(i2c_addr_handy, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + DEBUG_PRINT_L2("Bd0>Send Handy Controller(%02x) >>>>>>>>>>\n",i2c_addr_handy ); + + Thread::wait(500); + } + } +} + +// ====================================================================== +// Write setting value from lpcal file system of mbed +// ====================================================================== +void write_Setting_lfs( void ) +{ + FILE *wfp; + + DEBUG_PRINT_L3("\nBd0> Local file system write ... "); + wfp = fopen("/local/set.dat", "wb"); // Open local file "set.txt" for writing + if(!wfp){ + DEBUG_PRINT_L3("Bd0> **!!local file open error!!**\n"); + } + else{ + Thread::wait(200); + fwrite( &setValue, sizeof( int8_t ),sizeof(setValue), wfp ); + Thread::wait(200); + fclose(wfp); + + DEBUG_PRINT_L3("file writen\n"); + } +} + +// ====================================================================== +// Read setting value from lpcal file system of mbed +// ====================================================================== +int read_Setting_lfs( void ) +{ + FILE *rfp; + + DEBUG_PRINT_L3("\nBd0> Read Setting data from local file system \n"); + DEBUG_PRINT_L3( "Bd0> ---------------------------------------- \n"); + rfp = fopen("/local/set.dat", "rb"); // Open local file "set.txt" for writing + if(!rfp){ + DEBUG_PRINT_L3("Bd0> **!!local file open error!!**\n"); + return _FAIL_; + } + else{ + Thread::wait(500); + + fread( (int8_t*)&setValue, sizeof(int8_t), sizeof(setValue), rfp ); + dspSetValue2Console(&pc, &setValue); + + Thread::wait(500); + fclose(rfp); + DEBUG_PRINT_L3("\n"); + + return _OK_; + } +} + +// ====================================================================== +// Read Network setting value from lpcal file system of mbed +// ====================================================================== +int read_NetSetting_lfs( char* ip_address, char* subnet_mask, char* gateway ) +{ + FILE *rfp; +// char ip_address[20]; +// char subnet_mask[20]; +// char gateway[20]; + + DEBUG_PRINT_L3("\nBd0> Read Network Setting data from local file system \n"); + DEBUG_PRINT_L3( "Bd0> nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn \n"); + rfp = fopen("/local/net.dat", "r"); // Open local file "set.txt" for writing + if(!rfp){ + DEBUG_PRINT_L3("Bd0> **!!local file open error!!**\n"); + return _FAIL_; + } + else{ + Thread::wait(500); + + fscanf(rfp, "%s", ip_address); + fscanf(rfp, "%s", subnet_mask); + fscanf(rfp, "%s", gateway); + + DEBUG_PRINT_L3("Bd0> nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\n"); + DEBUG_PRINT_L3("Bd0> ip address : %s\n", ip_address); + DEBUG_PRINT_L3("Bd0> subnet mask : %s\n", subnet_mask); + DEBUG_PRINT_L3("Bd0> default gateway: %s\n", gateway); + DEBUG_PRINT_L3("Bd0> nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\n"); + + Thread::wait(500); + fclose(rfp); + DEBUG_PRINT_L3("\n"); + + return _OK_; + } +} +// ====================================================================== +// Winch control function +// ====================================================================== +void winchMovingControl( + int mode, // Operationg mode: Relative / Abslute + char* dbufferP, // Date buffer pointer + int dbuffer_s, // Date buffer size + winchData_t* winchDataP, // Winch data structure pointer + int winchData_s, // Winch data structure size + char* I2C_cmd +){ + int rcv_data_cnt; +// int moving_data; + int man_speed; + + bool flg_stop_operation = false; + + uint16_t winchCurrentPosition; + + char I2C_read[NumberOfI2CCommand+1]; + char I2C_resdata[2]; // Resolver read data + +// if (hwbtn_Opeflg == 1){ +// Thread::wait(1); +// } +// else{ + + + if( flg_ButtonOn == true ) {Thread::wait(2);} + + I2C_cmd[4] = setValue.crawlerCtrl.sv_RFCM_ith_F; + I2C_cmd[5] = setValue.crawlerCtrl.sv_RFCM_ith_R; + I2C_cmd[8] = setValue.crawlerCtrl.sv_LBCM_ith_F; + I2C_cmd[9] = setValue.crawlerCtrl.sv_LBCM_ith_R; + + if( mode == WINCH_POSITION_CLEAR ){ + led3 = ON; + DEBUG_PRINT_L3("Bd0> === WINCH_POSITION_CLEAR ===\n"); + rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s); + DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\n", rcv_data_cnt ); + if( rcv_data_cnt < 0 ){ + DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\n" ); + // tcp_client.send( (char*)winchDataP, winchData_s); + // break; + } + else{ + DEBUG_PRINT_L3("Bd0> %s\n", dbuffer ); + // if( !strcmp( dbuffer, "WinchStepDnOf" ) ){ + // break; + // } + } + + I2C_cmd[1] = 'Z'; // Zero clear + i2c.write(i2c_addr_resolver, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + led3 = OFF; + } + else if (( mode == WINCH_MMODE_RELATIVE ) || ( mode == WINCH_MMODE_ABSOLUTE )){ + if ( mode == WINCH_MMODE_RELATIVE ) DEBUG_PRINT_L3("Bd0> === WINCH_MMODE_RELATIVE === \n"); + if ( mode == WINCH_MMODE_ABSOLUTE ) DEBUG_PRINT_L3("Bd0> === WINCH_MMODE_ABSOLUTE === \n"); + + rcv_data_cnt = tcp_client.receive( dbuffer, dbuffer_s); + + *(dbufferP+rcv_data_cnt) = '\0'; + winchDataP->operation = '\n'; + + DEBUG_PRINT_L3("Bd0> TCP Rcv data count is [%d]\n", rcv_data_cnt ); + // Copy received data to Winch data structure. + memcpy( winchDataP, (winchData_t *)dbuffer, winchData_s); + //// ########################## + ////zzz winchDataP->dt_WinchCntPosition = res_position; // Current Position is winch data. But currently this value will be clear after reset MC. + //// ########################## + // winchDataP->dt_WinchDstPosition += winchDataP->dt_WinchCntPosition; + DEBUG_PRINT_L3("Bd0> Winch Rtv Move [ From %04d >>> To %04d ]\n", winchDataP->dt_WinchCntPosition, winchDataP->dt_WinchDstPosition ); + + swbtn_OpeMutex.lock(); + swbtn_Opeflg = 1; + swbtn_OpeMutex.unlock(); + + while( true ){ + while( true ){ + led3 = ON; + ////winchDataP->dt_WinchCntPosition = res_position; // Current position. + + DEBUG_PRINT_L3("Bd0> == Winch Position ==============\n"); + DEBUG_PRINT_L3("Bd0> CURRENT : %d\n", winchDataP->dt_WinchCntPosition ); + DEBUG_PRINT_L3("Bd0> DESTINATION: %d\n", winchDataP->dt_WinchDstPosition ); + DEBUG_PRINT_L3("Bd0> ================================\n"); + + tcp_client.send( (char*)winchDataP, winchData_s); + DEBUG_PRINT_L3("Bd0> Send Winch Rtv data [ %04d >>>> %04d ]\n", winchDataP->dt_WinchCntPosition, winchDataP->dt_WinchDstPosition ); + + rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s); + DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\n", rcv_data_cnt ); + if( rcv_data_cnt < 0 ){ + DEBUG_PRINT_L3("##ERROR## Data receive\n" ); + + // tcp_client.send( (char*)winchDataP, winchData_s); + break; + } + else{ + DEBUG_PRINT_L3("Bd0> %s\n", dbuffer ); + if( !strcmp( dbuffer, "WinchRtvStop" ) ){ + flg_stop_operation = true; + break; + } + } + if( winchDataP->dt_WinchCntPosition < winchDataP->dt_WinchDstPosition ){ + I2C_cmd[2] = MOTOR_FWD; // Motor1 FWD + if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_DISTANCE ){ + I2C_cmd[3] = setValue.winchCtrl.sv_WDM_mst; // Speed + } + else{ + I2C_cmd[3] = setValue.winchCtrl.sv_WDM_sli_F; // Speed + } + } + else{ + I2C_cmd[2] = MOTOR_RVS; // Motor1 RVS + if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) < SLOWDOWN_DISTANCE ){ + I2C_cmd[3] = setValue.winchCtrl.sv_WDM_mrt;; // Speed + } + else{ + I2C_cmd[3] = setValue.winchCtrl.sv_WDM_sli_R; // Speed + } + } + + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + // Read winch current position from Resolver. + winchCurrentPosition = ReadWinchCurrentPosition( i2c_addr_resolver ); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; // Current position. + winchDataP->operation = 0x00; + //i2c.read(i2c_addr_resolver, I2C_resdata, 2); // Read + //res_position = (I2C_resdata[1] << 8) | I2C_resdata[0]; + DEBUG_PRINT_L3("Bd0> DISTANCE from [ 0x%2x : %04x (%02x %02x) ]\n", i2c_addr_resolver, winchCurrentPosition, I2C_resdata[1], I2C_resdata[0]); + // -------------------------------------- + // Read motor current + // -------------------------------------- + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_read, NumberOfI2CCommand ); + winchDataP->dt_WinchMotor1Current = I2C_read[0]; // Motor current set + winchDataP->dt_WinchMotor2Current = I2C_read[1]; // Motor current set + winchDataP->operation = I2C_read[2]; + DEBUG_PRINT_L3( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L3( "Bd0> ReadMotorCurrent (%d)%\n", winchDataP->dt_WinchMotor1Current ); + DEBUG_PRINT_L3( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\n", i2c_addr_winch, I2C_read[0]); + led3 = OFF; + if( abs ( winchDataP->dt_WinchCntPosition - winchDataP->dt_WinchDstPosition) <= 0 ){ + break; + } + Thread::wait(10); // Time interval for program debugging + } + I2C_cmd[2] = MOTOR_STP; // Motor1 STOP + I2C_cmd[3] = 0; // Speed + I2C_cmd[6] = MOTOR_STP; // Motor2 STOP + I2C_cmd[7] = 0; // Speed + + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + Thread::wait(500); // Time interval for program debugging + + winchCurrentPosition = ReadWinchCurrentPosition( i2c_addr_resolver ); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; // Current position. + winchDataP->operation = 0x00; + //winchCurrentPosition = res_position; // Set curretn winch position that send for Host PC here when auto move mode. + DEBUG_PRINT_L3("Bd0> Check destination is same to setting point or not: %d\n", winchCurrentPosition); + if( winchDataP->dt_WinchDstPosition == winchDataP->dt_WinchCntPosition ){ + DEBUG_PRINT_L3("Bd0> Destination is same to setting point, then stop operation\n" ); + break; // When final destination == set point , then break. else adjust position again. + } + if( flg_stop_operation == true ){ + DEBUG_PRINT_L3("Bd0> Winch auto operation force stop\n" ); + flg_stop_operation = false; + break; + } + } + + // Thread::wait(500); // Time interval for program debugging + + winchCurrentPosition = ReadWinchCurrentPosition( i2c_addr_resolver ); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; // Current position. + winchDataP->operation = 0x77; + DEBUG_PRINT_L3("Bd0> Send final winch position to PC: %d\n", winchCurrentPosition); + + tcp_client.send( (char*)winchDataP, winchData_s); + + swbtn_OpeMutex.lock(); + swbtn_Opeflg = 0; + swbtn_OpeMutex.unlock(); + + led3 = OFF; + } + + // ---------------------------------------------------------- + // In case of commad received from PC by TCP connection. + // In case of hard ware button pushed is by gamepad task + // ---------------------------------------------------------- + else if (( mode == WINCH_STEPDOWN_BTN_ON )||( mode == WINCH_U_STEPDOWN_BTN_ON )) { + + if ( mode == WINCH_STEPDOWN_BTN_ON ) DEBUG_PRINT_L3( "Bd0> === WINCH_STEPDOWN_BTN_ON ===\n" ); + if ( mode == WINCH_U_STEPDOWN_BTN_ON ) DEBUG_PRINT_L3( "Bd0> === WINCH_U_STEPDOWN_BTN_ON ===\n" ); + + swbtn_OpeMutex.lock(); + swbtn_Opeflg = 1; + swbtn_OpeMutex.unlock(); + man_speed = 50; + while( 1 ){ + led3 = ON; + DEBUG_PRINT_L3("Bd0> WINCH_STEPDOWN_BTN_ON\n"); + rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s); + DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\n", rcv_data_cnt ); + if( rcv_data_cnt < 0 ){ + DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\n" ); + // tcp_client.send( (char*)winchDataP, winchData_s); + break; + } + else{ + DEBUG_PRINT_L3("Bd0> %s\n", dbuffer ); + if(( !strcmp( dbuffer, "WinchStepDnOf" ))||( !strcmp( dbuffer, "WinchuStepDnOf" )) ){ + break; + } + } + + if ( mode == WINCH_U_STEPDOWN_BTN_ON ) man_speed = 50; + else man_speed = 100; + + I2C_cmd[2] = MOTOR_FWD; // Motor1 FWD + I2C_cmd[3] = man_speed; // Speed + + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + led3 = OFF; + + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_read, NumberOfI2CCommand ); + winchDataP->dt_WinchMotor1Current = I2C_read[0]; + winchDataP->dt_WinchMotor2Current = I2C_read[1]; + winchDataP->operation = I2C_read[2]; // This is motor lock status inform to PC. + DEBUG_PRINT_L3( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L3( "Bd0> ReadMotorCurrent (%d)%\n", winchDataP->dt_WinchMotor1Current ); + DEBUG_PRINT_L3( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + if( winchDataP->operation == 0x88 ){ + winchDataP->dt_WinchMotor1Current = 0xFF; + } + + DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\n", i2c_addr_winch, I2C_read[0]); + winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; + winchDataP->operation = 0x00; + // ReadCurrentPositon(i2c_addr_resolver, winchDataP, winchData_s, 0x00 ); + tcp_client.send( (char*)winchDataP, winchData_s); + DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\n", winchCurrentPosition ); + + Thread::wait(10); // Time interval for program debugging + } + DEBUG_PRINT_L3( "Bd0> Send Motor Stop by IIC\n" ); + I2C_cmd[2] = MOTOR_STP; // Motor1 FWD + I2C_cmd[3] = 0; // Speed + I2C_cmd[6] = MOTOR_STP; // Motor2 FWD + I2C_cmd[7] = 0; // Speed + + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + DEBUG_PRINT_L3( "Bd0> Send 0x77 2 PC\n" ); + winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; + winchDataP->operation = 0x77; + //ReadCurrentPositon(i2c_addr_resolver, winchDataP, winchData_s, 0x77 ); + tcp_client.send( (char*)winchDataP, winchData_s); + + swbtn_OpeMutex.lock(); + swbtn_Opeflg = 0; + swbtn_OpeMutex.unlock(); + led3 = OFF; + } + // ---------------------------------------------------------- + // In case of commad received from PC by TCP connection. + // In case of hard ware button pushed is by gamepad task + // ---------------------------------------------------------- + else if (( mode == WINCH_STEPUP_BTN_ON )||( mode == WINCH_U_STEPUP_BTN_ON )) { + + if ( mode == WINCH_STEPUP_BTN_ON ) DEBUG_PRINT_L3( "Bd0> === WINCH_STEPUP_BTN_ON ===\n" ); + if ( mode == WINCH_U_STEPUP_BTN_ON ) DEBUG_PRINT_L3( "Bd0> === WINCH_U_STEPUP_BTN_ON ===\n" ); + + swbtn_OpeMutex.lock(); + swbtn_Opeflg = 1; + swbtn_OpeMutex.unlock(); + man_speed = 1; + while( 1 ){ + led3 = ON; + DEBUG_PRINT_L3("Bd0> WINCH_STEPUP_BTN_ON\n"); + rcv_data_cnt = tcp_client.receive(dbuffer, dbuffer_s); + DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\n", rcv_data_cnt ); + if( rcv_data_cnt < 0 ){ + DEBUG_PRINT_L3("Bd0> ##ERROR## Data receive\n" ); + // tcp_client.send( (char*)winchDataP, winchData_s); + break; + } + else{ + DEBUG_PRINT_L3("Bd0> %s\n", dbuffer ); + if( + ( !strcmp( dbuffer, "WinchStepUpOf" )) + || + (!strcmp( dbuffer, "WinchuStepUpOf" )) + ){ + break; + } + } + + if ( mode == WINCH_U_STEPUP_BTN_ON ) man_speed = 50; + else man_speed = 100; + + I2C_cmd[2] = MOTOR_RVS; // Motor1 FWD + I2C_cmd[3] = man_speed; // Speed + + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + led3 = OFF; + + read_motorCurrent( i2c_addr_winch, I2C_cmd, I2C_read, NumberOfI2CCommand ); + winchDataP->dt_WinchMotor1Current = I2C_read[0]; + winchDataP->dt_WinchMotor2Current = I2C_read[1]; + winchDataP->operation = I2C_read[2]; // This is motor lock status inform to PC. + DEBUG_PRINT_L3( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + DEBUG_PRINT_L3( "Bd0> ReadMotorCurrent (%d)%\n", winchDataP->dt_WinchMotor1Current ); + DEBUG_PRINT_L3( "Bd0> RRRRRRRRRRRRRRRRRRRRRRRR\n" ); + if( winchDataP->operation == 0x88 ){ + winchDataP->dt_WinchMotor1Current = 0xFF; + } + + DEBUG_PRINT_L3("Bd0> Return from [ 0x%2x : %d ]\n", i2c_addr_winch, I2C_read[0]); + winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; + winchDataP->operation = 0x00; + // ReadCurrentPositon(i2c_addr_resolver, winchDataP, winchData_s, 0x00 ); + tcp_client.send( (char*)winchDataP, winchData_s); + DEBUG_PRINT_L3( "Bd0> Send Winch Position: %d\n", winchCurrentPosition ); + + Thread::wait(10); // Time interval for program debugging + } + DEBUG_PRINT_L3( "Bd0> Send Motor Stop by IIC\n" ); + I2C_cmd[2] = MOTOR_STP; // Motor1 FWD + I2C_cmd[3] = 0; // Speed + I2C_cmd[6] = MOTOR_STP; // Motor2 FWD + I2C_cmd[7] = 0; // Speed + + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + + DEBUG_PRINT_L3( "Bd0> Send 0x77 2 PC\n" ); + winchCurrentPosition = ReadWinchCurrentPosition(i2c_addr_resolver); + winchDataP->dt_WinchCntPosition = winchCurrentPosition; + winchDataP->operation = 0x77; + // ReadCurrentPositon(i2c_addr_resolver, winchDataP, winchData_s, 0x77 ); + tcp_client.send( (char*)winchDataP, winchData_s); + + swbtn_OpeMutex.lock(); + swbtn_Opeflg = 0; + swbtn_OpeMutex.unlock(); + + led3 = OFF; + } + + else { + DEBUG_PRINT_L3("STEPSTEPSTEPSTEPSTEP\n"); + } +// } +} + +// ********************************************************************** +// +// Main Function of this program +// +// ********************************************************************** +int main() +{ + winchData_t winchData; + + char I2C_cmd[NumberOfI2CCommand+1] = "#010000000"; +// char I2C_res[NumberOfI2CCommand+1] = "\0"; + + char ip_address[20];; + char subnet_mask[20]; + char gateway[20]; + + int ret; + int try_cnt; + int rcv_data_cnt; + + bool flg_ethernet = false; + + char ttt[20]; + + // Set UART(USB) baudrate + pc.baud(115200); + + cf_led_demo( &led1, &led2, &led3, &led4, 15, 35 ); + + DEBUG_PRINT_L0("\r\n"); + DEBUG_PRINT_L0("Bd0> +--------------------------------------------------------------\n"); + DEBUG_PRINT_L0("Bd0> | Project: B2 Crawler Explorer for 1F-1 PCV internal inspection\n"); + DEBUG_PRINT_L0("Bd0> |---------\n"); + DEBUG_PRINT_L0("Bd0> | This is: Main Control Program of Main Controller\n"); + DEBUG_PRINT_L0("Bd0> | Target MCU: mbed LPC1768\r\n"); + DEBUG_PRINT_L0("Bd0> | Letest update: %s\r\n", LatestUpDate); + DEBUG_PRINT_L0("Bd0> | Program Revision: %s\r\n", ProgramRevision); + DEBUG_PRINT_L0("Bd0> | Author: %s\r\n", Author); + DEBUG_PRINT_L0("Bd0> | Copyright(C) 2015 %s Allright Reserved\r\n", Company); + DEBUG_PRINT_L0("Bd0> ---------------------------------------------------------------\n"); + sprintf( ttt, "%s", ProgramRevision ); + + DEBUG_PRINT_L0("Bd0> Start ststem initializing ...\n"); + DEBUG_PRINT_L0("Bd0> ------------------------\n"); + DEBUG_PRINT_L0("Bd0> Initalizing Ethernet ...\n"); + DEBUG_PRINT_L0("Bd0> ------------------------\n"); + + read_NetSetting_lfs( ip_address, subnet_mask, gateway ); + + DEBUG_PRINT_L0("Bd0> nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\n"); + DEBUG_PRINT_L0("Bd0> ip address : %s\n", ip_address); + DEBUG_PRINT_L0("Bd0> subnet mask : %s\n", subnet_mask); + DEBUG_PRINT_L0("Bd0> default gateway: %s\n", gateway); + DEBUG_PRINT_L0("Bd0> nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\n"); + +#ifdef __ETERNET_DHCP__ + ret = eth.init(); // Use DHCP +#else // __ETERNET_DHCP__ + ret = eth.init( + ip_address, // const char* ip, + subnet_mask, // const char* mask, + gateway // const char* gateway + ); +#endif // __ETERNET_DHCP__ + if( ret == 0 ){ + DEBUG_PRINT_L0("Bd0> Eternet init ... OK\n"); + ret = eth.connect(); + if( ret == 0 ){ + cf_led_onoff( &led1,&led2,&led3,&led4, false, false, false, true ); + DEBUG_PRINT_L0("Bd0> Eternat connect ... OK\n"); + DEBUG_PRINT_L0("Bd0> [ IP Address : %s ]\n", eth.getIPAddress()); + udp_server.bind(UDP_SERVER_PORT); + tcp_server.bind(TCP_SERVER_PORT); + tcp_server.listen(); + flg_ethernet = true; + } + else{ + cf_led_error( &led1,&led2,&led3,&led4 ); + DEBUG_PRINT_L0("Bd0> ***ERROR*** Eternat connect Fali\n"); + } + } + else{ + DEBUG_PRINT_L0("Bd0> *** ERROR*** Eternat init Fail\n"); + } + + Thread::wait(500); + + //--------------------------------------------------- + // Read CrExp setting value from Local File System + // setting file "SET.DAT". + // When error occured, LED1 will be blinking shortly. + //--------------------------------------------------- + DEBUG_PRINT_L0("Bd0> ---------------------------\n"); + DEBUG_PRINT_L0("Bd0> Read setting value from LFS\n"); + DEBUG_PRINT_L0("Bd0> ---------------------------\n"); + try_cnt = LFS_READ_COUNT; + while( 1 ){ + if( read_Setting_lfs() == _OK_ ) break; + else try_cnt -= 1; + if( try_cnt == 0 ){ + DEBUG_PRINT_L0("Bd0> ***ERROR*** LFS read error\n"); + while(1){ + led1 = !led1; + Thread::wait(30); + } + } + } + DEBUG_PRINT_L0("Bd0> LFS read OK\n"); + + //--------------------------------------------------- + // Checking Targer LCXpresso824-MAX board here. + // Send Hello Packet and waiting reply message from + // target. + // When error occured, LED1 will blinking slowly. + //--------------------------------------------------- + DEBUG_PRINT_L0("--------------------------\n"); + DEBUG_PRINT_L0("Check the target controler\n"); + DEBUG_PRINT_L0("--------------------------\n"); +/* + try_cnt = TARGET_CHECK_COUNT; + while(1){ + // ********************************************************************** + // ********************************************************************** + // Check each target motor control 824 board here + // currently only one target checked for debugging ... + // ********************************************************************** + // ********************************************************************** + I2C_cmd[1] = MOTOR_FWD; + i2c.write(i2c_addr_winch, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board. + Thread::wait(100); + i2c.read(i2c_addr_winch, I2C_res, NumberOfI2CCommand); + DEBUG_PRINT_L0("Bd0> Try count down: %d/%d\n", try_cnt, TARGET_CHECK_COUNT ); + DEBUG_PRINT_L0("Bd0> Return from [ i2c address = 0x%2x : %s ]\n", i2c_addr_winch>>1, I2C_res); + DEBUG_PRINT_L0("Bd0> MCTR1[Winch motor controller] found\n"); + if( I2C_res[0] == 'S' ){ + break; + } + else try_cnt -= 1; + if( try_cnt == 0 ){ + DEBUG_PRINT_L0("Bd0> ##ERROR##\n"); + led1 = OFF; + while(1){ + led1 = !led1; // ON + Thread::wait(80); + led1 = !led1; // OFF + Thread::wait(80); + led1 = !led1; // ON + Thread::wait(80); + led1 = !led1; // OFF + Thread::wait(80); + led1 = !led1; // ON + Thread::wait(80); + led1 = !led1; // OFF + Thread::wait(80); + led1 = !led1; // ON + Thread::wait(80); + led1 = !led1; // OFF + Thread::wait(500); + } + } + } + DEBUG_PRINT_L0("Bd0> Target system found\n"); +*/ + /* + ************************************************** + Send Calculation Data to Resolver Controller + ************************************************** + */ + DEBUG_PRINT_L0("Bd0> Send Calculation Data to Resolver Controller"); + I2C_cmd[2] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100>>8)&0xFF); // Dram diameter upper + I2C_cmd[3] = (uint8_t)((setValue.winchCtrl.sv_WRS_DramDmrx100)&0xFF); // Dram diameter lower + I2C_cmd[4] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100>>8)&0xFF); // Cable diameter upper + I2C_cmd[5] = (uint8_t)((setValue.winchCtrl.sv_WRS_CCableDmrx100)&0xFF); // Cable diameter lower + I2C_cmd[6] = setValue.winchCtrl.sv_WRS_RResolution; // Resolver resolution + i2c.write(i2c_addr_resolver, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + DEBUG_PRINT_L0(" ... done\n"); + + DEBUG_PRINT_L0("Bd0> ----------------------------------------\n"); + /* Max thread count is (may be ..) 2, How can I increase this , I don't know ?? */ + DEBUG_PRINT_L0("Bd0> Start host interface task ... "); + Thread thread_hif(clientPC_interface_task, NULL, osPriorityHigh, 256 * 2); + DEBUG_PRINT_L0("\nBd0> Start host gamepad task ... "); + Thread thread_gpd(gamepad_task, NULL, osPriorityHigh, 256 * 2); + DEBUG_PRINT_L0("\nBd0> ----------------------------------------\n"); + + DEBUG_PRINT_L0( "Bd0> ------------------------\n"); + DEBUG_PRINT_L0( "Bd0> Initializing completed !\n"); + DEBUG_PRINT_L0( "Bd0> ------------------------\n"); + + led1 = ON; // Initializing is OK then Power Indicator LED ON + + I2C_cmd[4] = 0x00; + I2C_cmd[5] = 0x01; + i2c.write(i2c_addr_handy, I2C_cmd, NumberOfI2CCommand); // Send command to motor control board + + while( true ) { + Thread::wait(10); + + // ----------------------------------------------------------------- + // Communicate with client PC program. + // TCP connection: + // ----------------------------------------------------------------- + if( flg_ethernet == true ) // in case of Ethernet OK + { + tcp_server.accept(tcp_client); + tcp_client.set_blocking(false, 3500); // Timeout after (300) msec + DEBUG_PRINT_L3("Bd0> ----------------------------\n"); + DEBUG_PRINT_L3("Bd0> TCP Connection from: %s\n", tcp_client.get_address()); + DEBUG_PRINT_L3("Bd0> ----------------------------\n"); + + while(true){ + + rcv_data_cnt = tcp_client.receive(dbuffer, sizeof(dbuffer)); + DEBUG_PRINT_L3("Bd0> rcv_data_cnt = %d\n", rcv_data_cnt ); + if( rcv_data_cnt < 0 ){ + // DEBUG_PRINT("## TCP Receive packet fail ##\n"); + break; + } + else{ + if( !strcmp( dbuffer, "WinchPositionClear" ) ){ + winchMovingControl( + WINCH_POSITION_CLEAR, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + + else if( !strcmp( dbuffer, "WinchRtvStart" ) ){ + winchMovingControl( + WINCH_MMODE_RELATIVE, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchAbsStart" ) ){ + winchMovingControl( + WINCH_MMODE_ABSOLUTE, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchStepUpOn" ) ){ + winchMovingControl( + WINCH_STEPUP_BTN_ON, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchStepUpOf" ) ){ + winchMovingControl( + WINCH_STEPUP_BTN_OFF, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchStepDnOn" ) ){ + winchMovingControl( + WINCH_STEPDOWN_BTN_ON, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchStepDnOf" ) ){ + winchMovingControl( + WINCH_STEPDOWN_BTN_OFF, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + + else if( !strcmp( dbuffer, "WinchuStepUpOn" ) ){ + winchMovingControl( + WINCH_U_STEPUP_BTN_ON, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchuStepUpOf" ) ){ + winchMovingControl( + WINCH_U_STEPUP_BTN_OFF, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchuStepDnOn" ) ){ + winchMovingControl( + WINCH_U_STEPDOWN_BTN_ON, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + else if( !strcmp( dbuffer, "WinchuStepDnOf" ) ){ + winchMovingControl( + WINCH_U_STEPDOWN_BTN_OFF, + dbuffer, + sizeof(dbuffer), + &winchData, + sizeof( winchData ), + I2C_cmd + ); + } + + else if( !strcmp( dbuffer, "SetValue" ) ){ + DEBUG_PRINT_L3("Bd0> SetValue Request from client\n"); + rcv_data_cnt = tcp_client.receive( dbuffer, sizeof(dbuffer)); + DEBUG_PRINT_L3("Bd0> TCP Rcv data count is [%d]\n", rcv_data_cnt ); + memcpy( &setValue, (setValue_t *)dbuffer, sizeof( setValue)) ; + // Display setting value list to consol + dspSetValue2Console( &pc, &setValue ); + // Write setting data to local file system + // Thread::wait(100); + write_Setting_lfs(); + // Thread::wait(500); + // Read setting data from local file system + if ( read_Setting_lfs() == _FAIL_ ){ + DEBUG_PRINT_L0("Bd0> ### ERROR### Can't read out setting data from lfs\n"); + } + } + else if(!strcmp( dbuffer, "GetValue" )){ + DEBUG_PRINT_L3("Bd0> GetValue request from TCP client <-- send"); + read_Setting_lfs(); + // Display setting value list to consol + dspSetValue2Console( &pc, &setValue ); + tcp_client.send_all( (char*)&setValue, sizeof(setValue)); + DEBUG_PRINT_L2("(%d)\n", sizeof(setValue)); + } + } + if( rcv_data_cnt <= 0 ) break; + } + tcp_client.close(); + } + } +}