eeprom_test

Dependencies:   mbed FastPWM

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers function_CAN.cpp Source File

function_CAN.cpp

00001 #include "function_CAN.h"
00002 #include "setting.h"
00003 #include "function_utilities.h"
00004 #include "SPI_EEP_ENC.h"
00005 #include "stm32f4xx_flash.h"
00006 #include "FlashWriter.h"
00007 
00008 // CAN ID Setting Variables
00009 int CID_RX_CMD = 100;
00010 int CID_RX_REF_POSITION = 200;
00011 int CID_RX_REF_VALVE_POS = 300;
00012 int CID_RX_REF_PWM = 400;
00013 
00014 int CID_TX_INFO = 1100;
00015 int CID_TX_POSITION = 1200;
00016 int CID_TX_TORQUE = 1300;
00017 int CID_TX_PRES = 1400;
00018 int CID_TX_VOUT = 1500;
00019 int CID_TX_VALVE_POSITION = 1600;
00020 
00021 // variables
00022 uint8_t can_index = 0;
00023 
00024 extern DigitalOut LED;
00025 
00026 /*******************************************************************************
00027  * CAN functions
00028  ******************************************************************************/
00029 void CAN_ID_INIT(void) {
00030 
00031     CID_RX_CMD = (int) (BNO + INIT_CID_RX_CMD);
00032     CID_RX_REF_POSITION = (int) (BNO + INIT_CID_RX_REF_POSITION);
00033     CID_RX_REF_VALVE_POS = (int) (BNO + INIT_CID_RX_REF_VALVE_POS);
00034     CID_RX_REF_PWM = (int) (BNO + INIT_CID_RX_REF_PWM);
00035 
00036     CID_TX_INFO = (int) (BNO + INIT_CID_TX_INFO);
00037     CID_TX_POSITION = (int) (BNO + INIT_CID_TX_POSITION);
00038     CID_TX_TORQUE = (int) (BNO + INIT_CID_TX_TORQUE);
00039     CID_TX_PRES = (int) (BNO + INIT_CID_TX_PRES);
00040     CID_TX_VOUT = (int) (BNO + INIT_CID_TX_VOUT);
00041     CID_TX_VALVE_POSITION = (int) (BNO + INIT_CID_TX_VALVE_POSITION);
00042 }
00043 
00044 void ReadCMD(int16_t CMD)
00045 {
00046     switch(CMD){
00047         case CRX_ASK_INFO: {
00048             CAN_TX_INFO();
00049             break;
00050         }
00051         case CRX_ASK_BNO: {
00052             CAN_TX_BNO();
00053             break;
00054         }
00055         case CRX_SET_BNO: {
00056             BNO = (int16_t) msg.data[1];
00057             
00058             ////ROM_RESET_DATA();
00059             
00060             spi_eeprom_write(RID_BNO, (int16_t) BNO);
00061             CAN_ID_INIT(); // can id init
00062             break;
00063         }
00064         case CRX_ASK_OPERATING_MODE: {
00065             CAN_TX_OPERATING_MODE();
00066             break;
00067         }
00068         case CRX_SET_OPERATING_MODE: {
00069             OPERATING_MODE = (uint8_t) msg.data[1];
00070             SENSING_MODE = (uint8_t) msg.data[2];
00071             CURRENT_CONTROL_MODE = (uint8_t) msg.data[3];
00072             FLAG_VALVE_DEADZONE = (uint8_t) msg.data[4];
00073             ////ROM_RESET_DATA();
00074             break;
00075         }
00076         case CRX_SET_ENC_ZERO: {
00077             ENC_SET_ZERO();
00078 
00079             break;
00080         }
00081         case CRX_SET_FET_ON: {
00082 
00083             break;
00084         }
00085 
00086         case CRX_SET_POS_TORQ_TRANS: {
00087             MODE_POS_FT_TRANS = (int16_t) msg.data[1];
00088             /*
00089             MODE_POS_FT_TRANS == 0 : Position Control
00090             MODE_POS_FT_TRANS == 1 : Trasition(Position->Torque)
00091             MODE_POS_FT_TRANS == 2 : Torque Control (Convert to 2 automatically 3sec after transition)
00092             MODE_POS_FT_TRANS == 3 : Transition(Toque->Position)
00093             */
00094             break;
00095         }
00096 
00097         case CRX_ASK_CAN_FREQ: {
00098             CAN_TX_CAN_FREQ();
00099 
00100             break;
00101         }
00102 
00103         case CRX_SET_CAN_FREQ: {
00104             CAN_FREQ = (int16_t) (msg.data[1] | msg.data[2] << 8);
00105             ////ROM_RESET_DATA();
00106             break;
00107         }
00108 
00109         case CRX_ASK_CONTROL_MODE: {
00110             CAN_TX_CONTROL_MODE();
00111 
00112             break;
00113         }
00114 
00115         case CRX_SET_CONTROL_MODE: {
00116             //CONTROL_MODE = (int16_t) (msg.data[1]);
00117             CONTROL_UTILITY_MODE = (int16_t) (msg.data[1]);
00118             if (CONTROL_MODE == 22) {    //MODE_FIND_HOME
00119                 FLAG_FIND_HOME = true;
00120             }
00121             break;
00122         }
00123 
00124         case CRX_SET_DATA_REQUEST: {
00125             int request_type = msg.data[2];
00126             flag_data_request[request_type] = msg.data[1];
00127             //pc.printf("can middle %d\n", request_type);
00128 
00129 //            if (flag_data_request[1] == HIGH) SPI_VREF_DAC_WRITE(PRES_A_VREF, PRES_B_VREF, TORQUE_VREF, 0); // set DAC
00130             //if (flag_data_request[1] == HIGH) dac_1 = PRES_A_VREF/3.3;
00131 //            if (flag_data_request[2] == HIGH) SPI_VREF_DAC_WRITE(PRES_A_VREF, PRES_B_VREF, TORQUE_VREF, 0); // set DAC
00132             //if (flag_data_request[2] == HIGH) dac_2 = PRES_B_VREF/3.3;
00133 
00134             break;
00135         }
00136 
00137         case CRX_ASK_JOINT_ENC_DIR: {
00138             CAN_TX_JOINT_ENC_DIR();
00139 
00140             break;
00141         }
00142 
00143         case CRX_SET_JOINT_ENC_DIR: {
00144             DIR_JOINT_ENC = (int16_t) (msg.data[1] | msg.data[2] << 8);
00145             if (DIR_JOINT_ENC >= 0)
00146                 DIR_JOINT_ENC = 1;
00147             else
00148                 DIR_JOINT_ENC = -1;
00149                 
00150             ////ROM_RESET_DATA();   
00151             
00152             spi_eeprom_write(RID_JOINT_ENC_DIR, (int16_t) DIR_JOINT_ENC);
00153 
00154             break;
00155         }
00156 
00157         case CRX_ASK_VALVE_DIR: {
00158             CAN_TX_VALVE_DIR();
00159 
00160             break;
00161         }
00162 
00163         case CRX_SET_VALVE_DIR: {
00164             DIR_VALVE = (int16_t) (msg.data[1] | msg.data[2] << 8);
00165             if (DIR_VALVE >= 0)
00166                 DIR_VALVE = 1;
00167             else
00168                 DIR_VALVE = -1;
00169                 
00170             ////ROM_RESET_DATA();    
00171             
00172             spi_eeprom_write(RID_VALVE_DIR, (int16_t) DIR_VALVE);
00173 
00174             break;
00175         }
00176 
00177         case CRX_ASK_VALVE_ENC_DIR: {
00178             CAN_TX_VALVE_ENC_DIR();
00179 
00180             break;
00181         }
00182 
00183         case CRX_SET_VALVE_ENC_DIR: {
00184             DIR_VALVE_ENC = (int16_t) (msg.data[1] | msg.data[2] << 8);
00185             if (DIR_VALVE_ENC >= 0)
00186                 DIR_VALVE_ENC = 1;
00187             else
00188                 DIR_VALVE_ENC = -1;
00189                 
00190             ////////ROM_RESET_DATA();
00191 
00192             spi_eeprom_write(RID_VALVE_ENC_DIR, (int16_t) DIR_VALVE_ENC);
00193 
00194             break;
00195         }
00196 
00197         case CRX_ASK_VOLTAGE_SUPPLY: {
00198             CAN_TX_VOLTAGE_SUPPLY();
00199 
00200             break;
00201         }
00202 
00203         case CRX_SET_VOLTAGE_SUPPLY: {
00204             SUPPLY_VOLTAGE = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) / 10.0f;
00205             
00206             ////ROM_RESET_DATA();
00207             
00208             spi_eeprom_write(RID_VOLATGE_SUPPLY, (int16_t) (SUPPLY_VOLTAGE * 10.));
00209 
00210             break;
00211         }
00212 
00213         case CRX_ASK_VOLTAGE_VALVE: {
00214             CAN_TX_VOLTAGE_VALVE();
00215 
00216             break;
00217         }
00218 
00219         case CRX_SET_VOLTAGE_VALVE: {
00220             VALVE_VOLTAGE_LIMIT = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) / 10.0f;
00221             
00222             ////ROM_RESET_DATA();
00223             
00224             spi_eeprom_write(RID_VOLTAGE_VALVE, (int16_t) (VALVE_VOLTAGE_LIMIT * 10.));
00225 
00226 
00227             break;
00228         }
00229 
00230         case CRX_SET_HOMEPOS: {
00231             //CONTROL_MODE = 22;
00232             CONTROL_UTILITY_MODE = 22;
00233             break;
00234         }
00235 
00236         case CRX_ASK_PID_GAIN: {
00237             CAN_TX_PID_GAIN(msg.data[1]);
00238 
00239             break;
00240         }
00241 
00242         case CRX_SET_PID_GAIN: {
00243             if (msg.data[1] == 0) {
00244                 P_GAIN_VALVE_POSITION = (int16_t) (msg.data[2] | msg.data[3] << 8);
00245                 I_GAIN_VALVE_POSITION = (int16_t) (msg.data[4] | msg.data[5] << 8);
00246                 D_GAIN_VALVE_POSITION = (int16_t) (msg.data[6] | msg.data[7] << 8);
00247                 
00248                 ////ROM_RESET_DATA();
00249 
00250             } else if (msg.data[1] == 1) {
00251                 P_GAIN_JOINT_POSITION = (int16_t) (msg.data[2] | msg.data[3] << 8);
00252                 I_GAIN_JOINT_POSITION = (int16_t) (msg.data[4] | msg.data[5] << 8);
00253                 D_GAIN_JOINT_POSITION = (int16_t) (msg.data[6] | msg.data[7] << 8);
00254                 
00255                 ////ROM_RESET_DATA();
00256                 
00257             } else if (msg.data[1] == 2) {
00258                 P_GAIN_JOINT_TORQUE = (int16_t) (msg.data[2] | msg.data[3] << 8);
00259                 I_GAIN_JOINT_TORQUE = (int16_t) (msg.data[4] | msg.data[5] << 8);
00260                 D_GAIN_JOINT_TORQUE = (int16_t) (msg.data[6] | msg.data[7] << 8);
00261                 
00262                 ////ROM_RESET_DATA();
00263                 
00264             } else if (msg.data[1] == 3) {
00265                 K_SPRING = (float) (((float) ((int16_t) (msg.data[2] | msg.data[3] << 8))) * 0.1f);
00266                 D_DAMPER = (float) (((float) ((int16_t) (msg.data[4] | msg.data[5] << 8))) * 0.01f);
00267                 
00268 //                //////ROM_RESET_DATA();     //For Real-time changing
00269             }
00270 
00271             break;
00272         }
00273 
00274         case CRX_ASK_VALVE_DEADZONE: {
00275             CAN_TX_VALVE_DEADZONE();
00276 
00277             break;
00278         }
00279 
00280         case CRX_SET_VALVE_DEADZONE: {
00281             VALVE_CENTER = (int16_t) (msg.data[1] | msg.data[2] << 8);
00282             VALVE_DEADZONE_PLUS = (int16_t) (msg.data[3] | msg.data[4] << 8);
00283             VALVE_DEADZONE_MINUS = (int16_t) (msg.data[5] | msg.data[6] << 8);
00284             
00285             ////ROM_RESET_DATA();
00286 
00287             break;
00288         }
00289 
00290         case CRX_ASK_VELOCITY_COMP_GAIN: {
00291             CAN_TX_VELOCITY_COMP_GAIN();
00292 
00293             break;
00294         }
00295 
00296         case CRX_SET_VELOCITY_COMP_GAIN: {
00297             VELOCITY_COMP_GAIN = (int16_t) (msg.data[1] | msg.data[2] << 8);
00298             
00299             ////ROM_RESET_DATA();
00300             
00301             spi_eeprom_write(RID_VELOCITY_COMP_GAIN, (int16_t) VELOCITY_COMP_GAIN);
00302 
00303             break;
00304         }
00305 
00306         case CRX_ASK_COMPLIANCE_GAIN: {
00307             CAN_TX_COMPLIANCE_GAIN();
00308 
00309             break;
00310         }
00311 
00312         case CRX_SET_COMPLIANCE_GAIN: {
00313             COMPLIANCE_GAIN = (int16_t) (msg.data[1] | msg.data[2] << 8);
00314 
00315             ////ROM_RESET_DATA();
00316             
00317             spi_eeprom_write(RID_COMPLIANCE_GAIN, (int16_t) COMPLIANCE_GAIN);
00318 
00319             break;
00320         }
00321 
00322         case CRX_ASK_VALVE_FF: {
00323             CAN_TX_VALVE_FF();
00324 
00325             break;
00326         }
00327 
00328         case CRX_SET_VALVE_FF: {
00329             VALVE_FF = (int16_t) (msg.data[1] | msg.data[2] << 8);
00330             
00331             ////ROM_RESET_DATA();
00332             
00333             spi_eeprom_write(RID_VALVE_FF, (int16_t) VALVE_FF);
00334 
00335             break;
00336         }
00337 
00338         case CRX_ASK_BULK_MODULUS: {
00339             CAN_TX_BULK_MODULUS();
00340 
00341             break;
00342         }
00343 
00344         case CRX_SET_BULK_MODULUS: {
00345             BULK_MODULUS = (int16_t) (msg.data[1] | msg.data[2] << 8);
00346             
00347             ////ROM_RESET_DATA();
00348             
00349             spi_eeprom_write(RID_BULK_MODULUS, (int16_t) BULK_MODULUS);
00350 
00351             break;
00352         }
00353 
00354         case CRX_ASK_CHAMBER_VOLUME: {
00355             CAN_TX_CHAMBER_VOLUME();
00356 
00357             break;
00358         }
00359 
00360         case CRX_SET_CHAMBER_VOLUME: {
00361             CHAMBER_VOLUME_A = (int16_t) (msg.data[1] | msg.data[2] << 8);
00362             CHAMBER_VOLUME_B = (int16_t) (msg.data[3] | msg.data[4] << 8);
00363 
00364             ////ROM_RESET_DATA();
00365     
00366             spi_eeprom_write(RID_CHAMBER_VOLUME_A, (int16_t) CHAMBER_VOLUME_A);
00367             spi_eeprom_write(RID_CHAMBER_VOLUME_B, (int16_t) CHAMBER_VOLUME_B);
00368 
00369             break;
00370         }
00371 
00372         case CRX_ASK_PISTON_AREA: {
00373             CAN_TX_PISTON_AREA();
00374 
00375             break;
00376         }
00377 
00378         case CRX_SET_PISTON_AREA: {
00379             PISTON_AREA_A = (int16_t) (msg.data[1] | msg.data[2] << 8);
00380             PISTON_AREA_B = (int16_t) (msg.data[3] | msg.data[4] << 8);
00381             PISTON_AREA_alpha = (double)PISTON_AREA_A/(double)PISTON_AREA_B;
00382             alpha3 = PISTON_AREA_alpha * PISTON_AREA_alpha*PISTON_AREA_alpha;
00383             
00384             ////ROM_RESET_DATA();
00385             
00386             spi_eeprom_write(RID_PISTON_AREA_A, (int16_t) PISTON_AREA_A);
00387             spi_eeprom_write(RID_PISTON_AREA_B, (int16_t) PISTON_AREA_B);
00388             break;
00389         }
00390 
00391         case CRX_ASK_PRES: {
00392             CAN_TX_PRES_A_AND_B();
00393 //            SPI_VREF_DAC_WRITE(PRES_A_VREF, PRES_B_VREF, TORQUE_VREF, 0);
00394             //dac_1 = PRES_A_VREF;
00395             //dac_2 = PRES_B_VREF;
00396             
00397             break;
00398         }
00399 
00400         case CRX_SET_PRES: {
00401             PRES_SUPPLY = (int16_t) (msg.data[1] | msg.data[2] << 8);
00402             PRES_RETURN = (int16_t) (msg.data[3] | msg.data[4] << 8);
00403             ////ROM_RESET_DATA();
00404             spi_eeprom_write(RID_PRES_SUPPLY, (int16_t) PRES_SUPPLY);
00405             spi_eeprom_write(RID_PRES_RETURN, (int16_t) PRES_RETURN);
00406 
00407 
00408             break;
00409         }
00410 
00411         case CRX_ASK_ENC_LIMIT: {
00412             CAN_TX_ENC_LIMIT();
00413 
00414             break;
00415         }
00416 
00417         case CRX_SET_ENC_LIMIT: {
00418             ENC_LIMIT_MINUS = (int16_t) (msg.data[1] | msg.data[2] << 8);
00419             ENC_LIMIT_PLUS = (int16_t) (msg.data[3] | msg.data[4] << 8);
00420             ////ROM_RESET_DATA();
00421             spi_eeprom_write(RID_ENC_LIMIT_MINUS, (int16_t) ENC_LIMIT_MINUS);
00422             spi_eeprom_write(RID_ENC_LIMIT_PLUS, (int16_t) ENC_LIMIT_PLUS);
00423 
00424             break;
00425         }
00426 
00427         case CRX_ASK_STROKE: {
00428             CAN_TX_STROKE();
00429             break;
00430         }
00431 
00432         case CRX_SET_STROKE: {
00433             STROKE = (int16_t) (msg.data[1] | msg.data[2] << 8);
00434             ////ROM_RESET_DATA();
00435             spi_eeprom_write(RID_STROKE, (int16_t) STROKE);
00436 
00437             break;
00438         }
00439 
00440         case CRX_ASK_VALVE_LIMIT: {
00441             CAN_TX_VALVE_LIMIT();
00442 
00443             break;
00444         }
00445 
00446         case CRX_SET_VALVE_LIMIT: {
00447             VALVE_MIN_POS = (int16_t) (msg.data[1] | msg.data[2] << 8);
00448             VALVE_MAX_POS = (int16_t) (msg.data[3] | msg.data[4] << 8);
00449             ////ROM_RESET_DATA();
00450 
00451             break;
00452         }
00453 
00454         case CRX_ASK_ENC_PULSE_PER_POSITION: {
00455             CAN_TX_ENC_PULSE_PER_POSITION();
00456 
00457             break;
00458         }
00459 
00460         case CRX_SET_ENC_PULSE_PER_POSITION: {
00461             ENC_PULSE_PER_POSITION = (int16_t) (msg.data[1] | msg.data[2] << 8);
00462             ////ROM_RESET_DATA();
00463             spi_eeprom_write(RID_ENC_PULSE_PER_POSITION, (int16_t) ENC_PULSE_PER_POSITION);
00464 
00465             break;
00466         }
00467 
00468         case CRX_ASK_TORQUE_SENSOR_PULSE_PER_TORQUE: {
00469             CAN_TX_TORQUE_SENSOR_PULSE_PER_TORQUE();
00470 
00471             break;
00472         }
00473 
00474         case CRX_SET_TORQUE_SENSOR_PULSE_PER_TORQUE: {
00475             TORQUE_SENSOR_PULSE_PER_TORQUE = (float) ((int16_t) (msg.data[1] | msg.data[2] << 8) * 0.01f);
00476             ////ROM_RESET_DATA();
00477             spi_eeprom_write(RID_TORQUE_SENSOR_PULSE_PER_TORQUE, (int16_t) TORQUE_SENSOR_PULSE_PER_TORQUE);
00478 
00479             break;
00480         }
00481 
00482         case CRX_ASK_PRES_SENSOR_PULSE_PER_PRES: {
00483             CAN_TX_PRES_SENSOR_PULSE_PER_PRES();
00484 
00485             break;
00486         }
00487 
00488         case CRX_SET_PRES_SENSOR_PULSE_PER_PRES: {
00489             PRES_SENSOR_A_PULSE_PER_BAR = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) * 0.01f;
00490             PRES_SENSOR_B_PULSE_PER_BAR = (double) ((int16_t) (msg.data[3] | msg.data[4] << 8)) * 0.01f;
00491             ////ROM_RESET_DATA();
00492             spi_eeprom_write(RID_PRES_SENSOR_A_PULSE_PER_BAR, (int16_t) (PRES_SENSOR_A_PULSE_PER_BAR * 100.));
00493             //(RID_PRES_SENSOR_B_PULSE_PER_BAR, (int16_t) (PRES_SENSOR_B_PULSE_PER_BAR * 100.));
00494 
00495             break;
00496         }
00497 
00498         case CRX_ASK_FRICTION: {
00499             CAN_TX_FRICTION();
00500 
00501             break;
00502         }
00503 
00504         case CRX_SET_FRICTION: {
00505             FRICTION = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) / 10.0f;
00506             ////ROM_RESET_DATA();
00507             spi_eeprom_write(RID_FRICTION, (int16_t) (FRICTION * 10.));
00508 
00509             break;
00510         }
00511 
00512         case CRX_ASK_VALVE_GAIN_PLUS: {
00513             CAN_TX_VALVE_GAIN_PLUS();
00514 
00515             break;
00516         }
00517         case CRX_SET_VALVE_GAIN_PLUS: {
00518             VALVE_GAIN_LPM_PER_V[0] = (double) msg.data[1] / 50.0f;
00519             VALVE_GAIN_LPM_PER_V[2] = (double) msg.data[2] / 50.0f;
00520             VALVE_GAIN_LPM_PER_V[4] = (double) msg.data[3] / 50.0f;
00521             VALVE_GAIN_LPM_PER_V[6] = (double) msg.data[4] / 50.0f;
00522             VALVE_GAIN_LPM_PER_V[8] = (double) msg.data[5] / 50.0f;
00523             ////ROM_RESET_DATA();
00524             spi_eeprom_write(RID_VALVE_GAIN_PLUS_1, (int16_t) (VALVE_GAIN_LPM_PER_V[0] * 100.0f));
00525             spi_eeprom_write(RID_VALVE_GAIN_PLUS_2, (int16_t) (VALVE_GAIN_LPM_PER_V[2] * 100.0f));
00526             spi_eeprom_write(RID_VALVE_GAIN_PLUS_3, (int16_t) (VALVE_GAIN_LPM_PER_V[4] * 100.0f));
00527             spi_eeprom_write(RID_VALVE_GAIN_PLUS_4, (int16_t) (VALVE_GAIN_LPM_PER_V[6] * 100.0f));
00528             spi_eeprom_write(RID_VALVE_GAIN_PLUS_5, (int16_t) (VALVE_GAIN_LPM_PER_V[8] * 100.0f));
00529 
00530             break;
00531         }
00532 
00533         case CRX_ASK_VALVE_GAIN_MINUS: {
00534             CAN_TX_VALVE_GAIN_MINUS();
00535 
00536             break;
00537         }
00538         case CRX_SET_VALVE_GAIN_MINUS: {
00539             VALVE_GAIN_LPM_PER_V[1] = (double) msg.data[1] / 50.0f;
00540             VALVE_GAIN_LPM_PER_V[3] = (double) msg.data[2] / 50.0f;
00541             VALVE_GAIN_LPM_PER_V[5] = (double) msg.data[3] / 50.0f;
00542             VALVE_GAIN_LPM_PER_V[7] = (double) msg.data[4] / 50.0f;
00543             VALVE_GAIN_LPM_PER_V[9] = (double) msg.data[5] / 50.0f;
00544             ////ROM_RESET_DATA();
00545             spi_eeprom_write(RID_VALVE_GAIN_MINUS_1, (int16_t) (VALVE_GAIN_LPM_PER_V[1] * 100.0f));
00546             spi_eeprom_write(RID_VALVE_GAIN_MINUS_2, (int16_t) (VALVE_GAIN_LPM_PER_V[3] * 100.0f));
00547             spi_eeprom_write(RID_VALVE_GAIN_MINUS_3, (int16_t) (VALVE_GAIN_LPM_PER_V[5] * 100.0f));
00548             spi_eeprom_write(RID_VALVE_GAIN_MINUS_4, (int16_t) (VALVE_GAIN_LPM_PER_V[7] * 100.0f));
00549             //(RID_VALVE_GAIN_MINUS_5, (int16_t) (VALVE_GAIN_LPM_PER_V[9] * 100.0f));
00550 
00551             break;
00552         }
00553         case CRX_ASK_DDV_VALVE_DEADZONE: {
00554             CAN_TX_DDV_VALVE_DEADZONE();
00555             break;
00556         }
00557 
00558         case CRX_LOW_REF: {
00559             REFERENCE_MODE = msg.data[1];
00560 
00561             REF_NUM = msg.data[2];
00562             REF_PERIOD = (double) ((int16_t) (msg.data[3] | msg.data[4] << 8)) / 100.0f;
00563             if (REF_PERIOD <= 0.0f) REF_MOVE_TIME_5k = TMR_FREQ_5k / CAN_FREQ;
00564             else REF_MOVE_TIME_5k = (int) (REF_PERIOD * (double) TMR_FREQ_5k);
00565             REF_MAG = (double) ((int16_t) (msg.data[5] | msg.data[6] << 8)) / 100.0f;
00566 
00567             break;
00568         }
00569 
00570         case CRX_JUMP_STATUS: {
00571             MODE_JUMP_STATUS = msg.data[1];
00572 
00573             break;
00574         }
00575 
00576         case CRX_SET_ERR_CLEAR: {
00577 
00578             for (int i = 0; i < num_err; i++) {
00579                 flag_err[i] = FALSE;
00580                 flag_err_old[i] = FALSE;
00581             }
00582 
00583             flag_err_rt = FALSE;
00584 
00585 
00586             break;
00587         }
00588 
00589         case CRX_ASK_HOMEPOS_OFFSET: {
00590             CAN_TX_HOMEPOS_OFFSET();
00591             break;
00592         }
00593         case CRX_SET_HOMEPOS_OFFSET: {
00594             HOMEPOS_OFFSET = (int16_t) (msg.data[1] | msg.data[2] << 8);
00595             ////ROM_RESET_DATA();
00596             spi_eeprom_write(RID_HOMEPOS_OFFSET, (int16_t) HOMEPOS_OFFSET);
00597             break;
00598         }
00599 
00600         case CRX_ASK_HOMEPOS_VALVE_OPENING: {
00601             CAN_TX_HOMPOS_VALVE_OPENING();
00602             break;
00603         }
00604         case CRX_SET_HOMEPOS_VALVE_OPENING: {
00605             HOMEPOS_VALVE_OPENING = (int16_t) (msg.data[1] | msg.data[2] << 8);
00606             ////ROM_RESET_DATA();
00607             spi_eeprom_write(RID_HOMEPOS_VALVE_OPENING, (int16_t) HOMEPOS_VALVE_OPENING);
00608             break;
00609         }
00610 
00611         case CRX_ASK_VALVE_PWM_VS_VALVE_POS: {
00612             can_index = (int16_t) msg.data[1];
00613             CAN_TX_VALVE_PWM_VS_VALVE_POS(can_index);
00614             break;
00615         }
00616         case CRX_ASK_VALVE_POS_VS_FLOWRATE: {
00617             can_index = (int16_t) msg.data[1];
00618             CAN_TX_VALVE_POS_VS_FLOWRATE(can_index);
00619             break;
00620         }
00621         case CRX_ASK_VALVE_POS_NUM: {
00622             CAN_TX_VALVE_POS_NUM();
00623             break;
00624         }
00625         
00626         case CRX_SET_ROM: {
00627             ////ROM_RESET_DATA();
00628             break;
00629         }
00630         case CRX_SET_VALVE_CENTER_OFFSET: {
00631             VALVE_CENTER_OFFSET = ((float) ((int16_t) (msg.data[1] | msg.data[2] << 8))) * 0.1f;
00632             VALVE_CENTER = VALVE_CENTER + VALVE_CENTER_OFFSET;
00633             ////ROM_RESET_DATA();
00634             break;
00635         }
00636         case CRX_SET_VALVE_DZ_MINUS_OFFSET: {
00637             VALVE_DZ_MINUS_OFFSET = ((float) ((int16_t) (msg.data[1] | msg.data[2] << 8))) * 0.1f;
00638             VALVE_DEADZONE_MINUS = VALVE_DEADZONE_MINUS + VALVE_DZ_MINUS_OFFSET;
00639             ////ROM_RESET_DATA();
00640             break;
00641         }
00642         case CRX_SET_VALVE_DZ_PLUS_OFFSET: {
00643             VALVE_DZ_PLUS_OFFSET = ((float) ((int16_t) (msg.data[1] | msg.data[2] << 8))) * 0.1f;
00644             VALVE_DEADZONE_PLUS = VALVE_DEADZONE_PLUS + VALVE_DZ_PLUS_OFFSET;
00645             ////ROM_RESET_DATA();
00646             break;
00647         }
00648         case CRX_SET_PID_GAIN_OPP: {
00649             if (msg.data[1] == 0) {
00650                 P_GAIN_VALVE_POSITION = (int16_t) (msg.data[2] | msg.data[3] << 8);
00651                 I_GAIN_VALVE_POSITION = (int16_t) (msg.data[4] | msg.data[5] << 8);
00652                 D_GAIN_VALVE_POSITION = (int16_t) (msg.data[6] | msg.data[7] << 8);
00653                 
00654                 ////ROM_RESET_DATA();
00655                 
00656                 spi_eeprom_write(RID_P_GAIN_VALVE_POSITION, (int16_t) P_GAIN_VALVE_POSITION);
00657                 spi_eeprom_write(RID_I_GAIN_VALVE_POSITION, (int16_t) I_GAIN_VALVE_POSITION);
00658                 spi_eeprom_write(RID_D_GAIN_VALVE_POSITION, (int16_t) D_GAIN_VALVE_POSITION);
00659 
00660 
00661             } else if (msg.data[1] == 1) {
00662                 P_GAIN_JOINT_POSITION = (int16_t) (msg.data[2] | msg.data[3] << 8);
00663                 I_GAIN_JOINT_POSITION = (int16_t) (msg.data[4] | msg.data[5] << 8);
00664                 D_GAIN_JOINT_POSITION = (int16_t) (msg.data[6] | msg.data[7] << 8);
00665                 
00666                 ////ROM_RESET_DATA();
00667 
00668                 spi_eeprom_write(RID_P_GAIN_JOINT_POSITION, (int16_t) P_GAIN_JOINT_POSITION);
00669                 spi_eeprom_write(RID_I_GAIN_JOINT_POSITION, (int16_t) I_GAIN_JOINT_POSITION);
00670                 spi_eeprom_write(RID_D_GAIN_JOINT_POSITION, (int16_t) D_GAIN_JOINT_POSITION);
00671             } else if (msg.data[1] == 2) {
00672                 P_GAIN_JOINT_TORQUE = (int16_t) (msg.data[2] | msg.data[3] << 8);
00673                 I_GAIN_JOINT_TORQUE = (int16_t) (msg.data[4] | msg.data[5] << 8);
00674                 D_GAIN_JOINT_TORQUE = (int16_t) (msg.data[6] | msg.data[7] << 8);
00675                 
00676                 ////ROM_RESET_DATA();
00677                 
00678                 spi_eeprom_write(RID_P_GAIN_JOINT_TORQUE, (int16_t) P_GAIN_JOINT_TORQUE);
00679                 spi_eeprom_write(RID_I_GAIN_JOINT_TORQUE, (int16_t) I_GAIN_JOINT_TORQUE);
00680                 spi_eeprom_write(RID_D_GAIN_JOINT_TORQUE, (int16_t) D_GAIN_JOINT_TORQUE);
00681             }
00682             break;
00683         }
00684         case CRX_ASK_VALVE_MAX_MIN_POS: {
00685             //CAN_TX_DDV_VALVE_DEADZONE();
00686             CAN_TX_DDV_VALVE_MAX_MIN_POS();
00687             break;
00688         }
00689         case CRX_DELAY_TEST:{
00690             flag_delay_test = 1;
00691             break;
00692         }
00693 
00694     default:
00695         break;
00696     }
00697 }
00698 
00699 void CAN_RX_HANDLER()
00700 {
00701     CAN_TX_PWM((int16_t) 20); //1500
00702     can.read(msg);
00703     unsigned int address = msg.id;
00704     if(address==CID_RX_CMD){
00705         unsigned int CMD = msg.data[0];
00706         ReadCMD(CMD);
00707         
00708     } else if(address==CID_RX_REF_POSITION) {
00709         
00710         int16_t temp_pos = (int16_t) (msg.data[0] | msg.data[1] << 8);
00711         int16_t temp_vel = (int16_t) (msg.data[2] | msg.data[3] << 8);
00712         int16_t temp_torq = (int16_t) (msg.data[4] | msg.data[5] << 8);
00713         
00714         if((OPERATING_MODE&0b001)==0) { // Rotary Actuator
00715             pos.ref = (double)temp_pos * 1.0f;
00716             vel.ref = (double)temp_vel * 10.0f;
00717         }
00718         else { //Linear Actuator
00719             pos.ref = (double)temp_pos * 10.0f;
00720             vel.ref = (double)temp_vel * 256.0f;
00721         }
00722         
00723         torq.ref = (double)temp_torq * 0.1f /(float)(TORQUE_SENSOR_PULSE_PER_TORQUE);
00724         
00725     } else if(address==CID_RX_REF_VALVE_POS) {
00726         int16_t temp_ref_valve_pos = (int16_t) (msg.data[0] | msg.data[1] << 8);
00727         
00728         if (((OPERATING_MODE&0b110)>>1) == 0) { //Moog Valve
00729             valve_pos.ref = (double) temp_ref_valve_pos;
00730         } else if (((OPERATING_MODE&0b110)>>1) == 1) { //KNR Valve
00731             valve_pos.ref = (double) temp_ref_valve_pos;
00732         } else { //SW Valve
00733             if(temp_ref_valve_pos >= 0) {
00734                 valve_pos.ref = (double)VALVE_CENTER + (double)temp_ref_valve_pos * ((double)VALVE_MAX_POS-(double)VALVE_CENTER)/10000.0f;
00735             } else {
00736                 valve_pos.ref = (double)VALVE_CENTER - (double)temp_ref_valve_pos * ((double)VALVE_MIN_POS-(double)VALVE_CENTER)/10000.0f;
00737             }
00738         }
00739         
00740     } else if(address==CID_RX_REF_PWM){
00741         int temp_ref_pwm = (int16_t) (msg.data[0] | msg.data[1] << 8);
00742         Vout.ref = (double) temp_ref_pwm;
00743     }   
00744 }
00745 
00746 /******************************************************************************
00747  Information Transmission Functions
00748 *******************************************************************************/
00749 
00750 void CAN_TX_INFO(void) {
00751     CANMessage temp_msg;
00752     
00753     temp_msg.id = CID_TX_INFO;
00754     temp_msg.len = 7;
00755     temp_msg.data[0] = (uint8_t) CTX_SEND_INFO;
00756     temp_msg.data[1] = (uint8_t) BNO;
00757     temp_msg.data[2] = (uint8_t) CAN_FREQ;
00758     temp_msg.data[3] = (uint8_t) (CAN_FREQ >> 8);
00759     temp_msg.data[4] = (uint8_t) (flag_err[7] << 7 | flag_err[6] << 6 | flag_err[5] << 5 | flag_err[4] << 4 | flag_err[3] << 3 | flag_err[2] << 2 | flag_err[1] << 1 | flag_err[0]);
00760     temp_msg.data[5] = (uint8_t) CONTROL_UTILITY_MODE;
00761     temp_msg.data[6] = (uint8_t) OPERATING_MODE;
00762 
00763     can.write(temp_msg);
00764 }
00765 
00766 void CAN_TX_BNO(void) {
00767     CANMessage temp_msg;
00768     
00769     temp_msg.id = CID_TX_INFO;
00770     temp_msg.len = 2;
00771     temp_msg.data[0] = (uint8_t) CTX_SEND_BNO;
00772     temp_msg.data[1] = (uint8_t) BNO;
00773 
00774     can.write(temp_msg);
00775 }
00776 
00777 void CAN_TX_OPERATING_MODE(void) {
00778     CANMessage temp_msg;
00779     
00780     temp_msg.id = CID_TX_INFO;
00781     temp_msg.len = 5;
00782     temp_msg.data[0] = (uint8_t) CTX_SEND_OPERATING_MODE;
00783     temp_msg.data[1] = (uint8_t) OPERATING_MODE;
00784     temp_msg.data[2] = (uint8_t) SENSING_MODE;
00785     temp_msg.data[3] = (uint8_t) CURRENT_CONTROL_MODE;
00786     temp_msg.data[4] = (uint8_t) FLAG_VALVE_DEADZONE;
00787 
00788     can.write(temp_msg);
00789 }
00790 
00791 void CAN_TX_CAN_FREQ(void) {
00792     CANMessage temp_msg;
00793 
00794     temp_msg.id = CID_TX_INFO;
00795     temp_msg.len = 3;
00796     temp_msg.data[0] = (uint8_t) CTX_SEND_CAN_FREQ;
00797     temp_msg.data[1] = (uint8_t) CAN_FREQ;
00798     temp_msg.data[2] = (uint8_t) (CAN_FREQ >> 8);
00799 
00800     can.write(temp_msg);
00801 }
00802 
00803 void CAN_TX_CONTROL_MODE(void) {
00804     CANMessage temp_msg;
00805 
00806     temp_msg.id = CID_TX_INFO;
00807     temp_msg.len = 2;
00808     temp_msg.data[0] = (uint8_t) CTX_SEND_CONTROL_MODE;
00809     temp_msg.data[1] = (uint8_t) CONTROL_UTILITY_MODE;
00810 
00811     can.write(temp_msg);
00812 }
00813 
00814 void CAN_TX_JOINT_ENC_DIR(void) {
00815     CANMessage temp_msg;
00816 
00817     temp_msg.id = CID_TX_INFO;
00818     temp_msg.len = 3;
00819     temp_msg.data[0] = (uint8_t) CTX_SEND_JOINT_ENC_DIR;
00820     temp_msg.data[1] = (uint8_t) DIR_JOINT_ENC;
00821     temp_msg.data[2] = (uint8_t) (DIR_JOINT_ENC >> 8);
00822 
00823     can.write(temp_msg);
00824 }
00825 
00826 void CAN_TX_VALVE_DIR(void) {
00827     CANMessage temp_msg;
00828 
00829     temp_msg.id = CID_TX_INFO;
00830     temp_msg.len = 3;
00831     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_DIR;
00832     temp_msg.data[1] = (uint8_t) DIR_VALVE;
00833     temp_msg.data[2] = (uint8_t) (DIR_VALVE >> 8);
00834 
00835     can.write(temp_msg);
00836 }
00837 
00838 void CAN_TX_VALVE_ENC_DIR(void) {
00839     CANMessage temp_msg;
00840 
00841     temp_msg.id = CID_TX_INFO;
00842     temp_msg.len = 3;
00843     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_ENC_DIR;
00844     temp_msg.data[1] = (uint8_t) DIR_VALVE_ENC;
00845     temp_msg.data[2] = (uint8_t) (DIR_VALVE_ENC >> 8);
00846 
00847     can.write(temp_msg);
00848 }
00849 
00850 void CAN_TX_VOLTAGE_SUPPLY(void) {
00851     int16_t send_voltage_supply = (int16_t) (SUPPLY_VOLTAGE * 10.0f);
00852 
00853     CANMessage temp_msg;
00854 
00855     temp_msg.id = CID_TX_INFO;
00856     temp_msg.len = 3;
00857     temp_msg.data[0] = (uint8_t) CTX_SEND_VOLTAGE_SUPPLY;
00858     temp_msg.data[1] = (uint8_t) (send_voltage_supply);
00859     temp_msg.data[2] = (uint8_t) (send_voltage_supply >> 8);
00860 
00861     can.write(temp_msg);
00862 }
00863 
00864 void CAN_TX_VOLTAGE_VALVE(void) {
00865     int16_t send_voltage_valve = (int16_t) (VALVE_VOLTAGE_LIMIT * 10.0f);
00866 
00867     CANMessage temp_msg;
00868 
00869     temp_msg.id = CID_TX_INFO;
00870     temp_msg.len = 3;
00871     temp_msg.data[0] = (uint8_t) CTX_SEND_VOLTAGE_VALVE;
00872     temp_msg.data[1] = (uint8_t) send_voltage_valve;
00873     temp_msg.data[2] = (uint8_t) (send_voltage_valve >> 8);
00874 
00875     can.write(temp_msg);
00876 }
00877 
00878 
00879 void CAN_TX_PID_GAIN(int t_type) {
00880     // t_type = 0 : valve position control gain
00881     // t_type = 1 : joint position control gain
00882     // t_type = 2 : joint torque control gain
00883 
00884     int16_t sendPgain=0, sendIgain=0, sendDgain=0;
00885     if (t_type == 0) {
00886         sendPgain = (int16_t) (P_GAIN_VALVE_POSITION);
00887         sendIgain = (int16_t) (I_GAIN_VALVE_POSITION);
00888         sendDgain = (int16_t) (D_GAIN_VALVE_POSITION);
00889     } else if (t_type == 1) {
00890         sendPgain = (int16_t) (P_GAIN_JOINT_POSITION);
00891         sendIgain = (int16_t) (I_GAIN_JOINT_POSITION);
00892         sendDgain = (int16_t) (D_GAIN_JOINT_POSITION);
00893     } else if (t_type == 2) {
00894         sendPgain = (int16_t) (P_GAIN_JOINT_TORQUE);
00895         sendIgain = (int16_t) (I_GAIN_JOINT_TORQUE);
00896         sendDgain = (int16_t) (D_GAIN_JOINT_TORQUE);
00897     } else if (t_type == 3) {
00898         sendPgain = (int16_t) (K_SPRING * 10.0f);
00899         sendIgain = (int16_t) (D_DAMPER * 100.0f);
00900     }
00901 
00902     CANMessage temp_msg;
00903     
00904     temp_msg.id = CID_TX_INFO;
00905     temp_msg.len = 8;
00906     temp_msg.data[0] = (uint8_t) CTX_SEND_PID_GAIN;
00907     temp_msg.data[1] = (uint8_t) t_type;
00908     temp_msg.data[2] = (uint8_t) sendPgain;
00909     temp_msg.data[3] = (uint8_t) (sendPgain >> 8);
00910     temp_msg.data[4] = (uint8_t) sendIgain;
00911     temp_msg.data[5] = (uint8_t) (sendIgain >> 8);
00912     temp_msg.data[6] = (uint8_t) sendDgain;
00913     temp_msg.data[7] = (uint8_t) (sendDgain >> 8);
00914 
00915     can.write(temp_msg);
00916 }
00917 
00918 
00919 void CAN_TX_VALVE_DEADZONE(void) {
00920     CANMessage temp_msg;
00921 
00922     temp_msg.id = CID_TX_INFO;
00923     temp_msg.len = 7;
00924     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_DEADZONE;
00925     temp_msg.data[1] = (uint8_t) VALVE_CENTER;
00926     temp_msg.data[2] = (uint8_t) (VALVE_CENTER >> 8);
00927     temp_msg.data[3] = (uint8_t) (int) (VALVE_DEADZONE_PLUS);
00928     temp_msg.data[4] = (uint8_t) ((int) (VALVE_DEADZONE_PLUS) >> 8);
00929     temp_msg.data[5] = (uint8_t) (int) (VALVE_DEADZONE_MINUS);
00930     temp_msg.data[6] = (uint8_t) ((int) (VALVE_DEADZONE_MINUS) >> 8);
00931 
00932     can.write(temp_msg);
00933 }
00934 
00935 void CAN_TX_VELOCITY_COMP_GAIN(void) {
00936     CANMessage temp_msg;
00937     
00938     temp_msg.id = CID_TX_INFO;
00939     temp_msg.len = 3;
00940     temp_msg.data[0] = (uint8_t) CTX_SEND_VELOCITY_COMP_GAIN;
00941     temp_msg.data[1] = (uint8_t) VELOCITY_COMP_GAIN;
00942     temp_msg.data[2] = (uint8_t) (VELOCITY_COMP_GAIN >> 8);
00943 
00944     can.write(temp_msg);
00945 }
00946 
00947 void CAN_TX_COMPLIANCE_GAIN(void) {
00948     CANMessage temp_msg;
00949     
00950     temp_msg.id = CID_TX_INFO;
00951     temp_msg.len = 3;
00952     temp_msg.data[0] = (uint8_t) CTX_SEND_COMPLIANCE_GAIN;
00953     temp_msg.data[1] = (uint8_t) COMPLIANCE_GAIN;
00954     temp_msg.data[2] = (uint8_t) (COMPLIANCE_GAIN >> 8);
00955 
00956     can.write(temp_msg);
00957 }
00958 
00959 void CAN_TX_VALVE_FF(void) {
00960     CANMessage temp_msg;
00961     
00962     temp_msg.id = CID_TX_INFO;
00963     temp_msg.len = 3;
00964     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_FF;
00965     temp_msg.data[1] = (uint8_t) VALVE_FF;
00966     temp_msg.data[2] = (uint8_t) (VALVE_FF >> 8);
00967 
00968     can.write(temp_msg);
00969 }
00970 
00971 void CAN_TX_BULK_MODULUS(void) {
00972     CANMessage temp_msg;
00973     
00974     temp_msg.id = CID_TX_INFO;
00975     temp_msg.len = 3;
00976     temp_msg.data[0] = (uint8_t) CTX_SEND_BULK_MODULUS;
00977     temp_msg.data[1] = (uint8_t) BULK_MODULUS;
00978     temp_msg.data[2] = (uint8_t) (BULK_MODULUS >> 8);
00979 
00980     can.write(temp_msg);
00981 }
00982 
00983 void CAN_TX_CHAMBER_VOLUME(void) {
00984     CANMessage temp_msg;
00985     
00986     temp_msg.id = CID_TX_INFO;
00987     temp_msg.len = 5;
00988     temp_msg.data[0] = (uint8_t) CTX_SEND_CHAMBER_VOLUME;
00989     temp_msg.data[1] = (uint8_t) CHAMBER_VOLUME_A;
00990     temp_msg.data[2] = (uint8_t) (CHAMBER_VOLUME_A >> 8);
00991     temp_msg.data[3] = (uint8_t) CHAMBER_VOLUME_B;
00992     temp_msg.data[4] = (uint8_t) (CHAMBER_VOLUME_B >> 8);
00993 
00994     can.write(temp_msg);
00995 }
00996 
00997 void CAN_TX_PISTON_AREA(void) {
00998     CANMessage temp_msg;
00999     
01000     temp_msg.id = CID_TX_INFO;
01001     temp_msg.len = 5;
01002     temp_msg.data[0] = (uint8_t) CTX_SEND_PISTON_AREA;
01003     temp_msg.data[1] = (uint8_t) PISTON_AREA_A;
01004     temp_msg.data[2] = (uint8_t) (PISTON_AREA_A >> 8);
01005     temp_msg.data[3] = (uint8_t) PISTON_AREA_B;
01006     temp_msg.data[4] = (uint8_t) (PISTON_AREA_B >> 8);
01007 
01008     can.write(temp_msg);
01009 }
01010 
01011 void CAN_TX_PRES_A_AND_B(void) {
01012     CANMessage temp_msg;
01013     
01014     temp_msg.id = CID_TX_INFO;
01015     temp_msg.len = 5;
01016     temp_msg.data[0] = (uint8_t) CTX_SEND_PRES;
01017     temp_msg.data[1] = (uint8_t) PRES_SUPPLY;
01018     temp_msg.data[2] = (uint8_t) (PRES_SUPPLY >> 8);
01019     temp_msg.data[3] = (uint8_t) PRES_RETURN;
01020     temp_msg.data[4] = (uint8_t) (PRES_RETURN >> 8);
01021 
01022     can.write(temp_msg);
01023 }
01024 
01025 void CAN_TX_ENC_LIMIT(void) {
01026     CANMessage temp_msg;
01027     
01028     temp_msg.id = CID_TX_INFO;
01029     temp_msg.len = 5;
01030     temp_msg.data[0] = (uint8_t) CTX_SEND_ENC_LIMIT;
01031     temp_msg.data[1] = (uint8_t) ENC_LIMIT_MINUS;
01032     temp_msg.data[2] = (uint8_t) (ENC_LIMIT_MINUS >> 8);
01033     temp_msg.data[3] = (uint8_t) ENC_LIMIT_PLUS;
01034     temp_msg.data[4] = (uint8_t) (ENC_LIMIT_PLUS >> 8);
01035 
01036     can.write(temp_msg);
01037 }
01038 
01039 void CAN_TX_STROKE(void) {
01040     CANMessage temp_msg;
01041     
01042     temp_msg.id = CID_TX_INFO;
01043     temp_msg.len = 3;
01044     temp_msg.data[0] = (uint8_t) CTX_SEND_STROKE;
01045     temp_msg.data[1] = (uint8_t) STROKE;
01046     temp_msg.data[2] = (uint8_t) (STROKE >> 8);
01047 
01048     can.write(temp_msg);
01049 }
01050 
01051 void CAN_TX_VALVE_LIMIT(void) {
01052     CANMessage temp_msg;
01053     
01054     temp_msg.id = CID_TX_INFO;
01055     temp_msg.len = 5;
01056     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_LIMIT;
01057     temp_msg.data[1] = (uint8_t) VALVE_MIN_POS;
01058     temp_msg.data[2] = (uint8_t) (VALVE_MIN_POS >> 8);
01059     temp_msg.data[3] = (uint8_t) VALVE_MAX_POS;
01060     temp_msg.data[4] = (uint8_t) (VALVE_MAX_POS >> 8);
01061 
01062     can.write(temp_msg);
01063 }
01064 
01065 void CAN_TX_ENC_PULSE_PER_POSITION(void) {
01066     CANMessage temp_msg;
01067     
01068     temp_msg.id = CID_TX_INFO;
01069     temp_msg.len = 3;
01070     temp_msg.data[0] = (uint8_t) CTX_SEND_ENC_PULSE_PER_POSITION;
01071     int temp_enc_pulse_per_position = (int) (ENC_PULSE_PER_POSITION);
01072     temp_msg.data[1] = (uint8_t) temp_enc_pulse_per_position;
01073     temp_msg.data[2] = (uint8_t) (temp_enc_pulse_per_position >> 8);
01074 
01075     can.write(temp_msg);
01076 }
01077 
01078 void CAN_TX_TORQUE_SENSOR_PULSE_PER_TORQUE(void) {
01079     CANMessage temp_msg;
01080     
01081     temp_msg.id = CID_TX_INFO;
01082     temp_msg.len = 3;
01083     temp_msg.data[0] = (uint8_t) CTX_SEND_TORQUE_SENSOR_PULSE_PER_TORQUE;
01084     int temp_torque_sensor_pulse_per_torque = (int) (TORQUE_SENSOR_PULSE_PER_TORQUE * 100.0f);
01085     temp_msg.data[1] = (uint8_t) temp_torque_sensor_pulse_per_torque;
01086     temp_msg.data[2] = (uint8_t) (temp_torque_sensor_pulse_per_torque >> 8);
01087 
01088     can.write(temp_msg);
01089 }
01090 
01091 void CAN_TX_PRES_SENSOR_PULSE_PER_PRES(void) {
01092     CANMessage temp_msg;
01093     
01094     temp_msg.id = CID_TX_INFO;
01095     temp_msg.len = 5;
01096     temp_msg.data[0] = (uint8_t) CTX_SEND_PRES_SENSOR_PULSE_PER_BAR;
01097     temp_msg.data[1] = (uint8_t) (int) (PRES_SENSOR_A_PULSE_PER_BAR * 100.0f);
01098     temp_msg.data[2] = (uint8_t) ((int) (PRES_SENSOR_A_PULSE_PER_BAR * 100.0f) >> 8);
01099     temp_msg.data[3] = (uint8_t) (int) (PRES_SENSOR_B_PULSE_PER_BAR * 100.0f);
01100     temp_msg.data[4] = (uint8_t) ((int) (PRES_SENSOR_B_PULSE_PER_BAR * 100.0f) >> 8);
01101 
01102     can.write(temp_msg);
01103 }
01104 
01105 void CAN_TX_FRICTION(void) {
01106     CANMessage temp_msg;
01107     int16_t send_friction;
01108     send_friction = (int16_t) (FRICTION * 10.0f);
01109     
01110     temp_msg.id = CID_TX_INFO;
01111     temp_msg.len = 3;
01112     temp_msg.data[0] = (uint8_t) CTX_SEND_FRICTION;
01113     temp_msg.data[1] = (uint8_t) send_friction;
01114     temp_msg.data[2] = (uint8_t) (send_friction >> 8);
01115 
01116     can.write(temp_msg);
01117 }
01118 
01119 void CAN_TX_VALVE_GAIN_PLUS(void) {
01120     CANMessage temp_msg;
01121     
01122     temp_msg.id = CID_TX_INFO;
01123     temp_msg.len = 6;
01124     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_GAIN_PLUS;
01125     temp_msg.data[1] = (uint8_t) (VALVE_GAIN_LPM_PER_V[0] * 50.0f);
01126     temp_msg.data[2] = (uint8_t) (VALVE_GAIN_LPM_PER_V[2] * 50.0f);
01127     temp_msg.data[3] = (uint8_t) (VALVE_GAIN_LPM_PER_V[4] * 50.0f);
01128     temp_msg.data[4] = (uint8_t) (VALVE_GAIN_LPM_PER_V[6] * 50.0f);
01129     temp_msg.data[5] = (uint8_t) (VALVE_GAIN_LPM_PER_V[8] * 50.0f);
01130 
01131     can.write(temp_msg);
01132 }
01133 
01134 void CAN_TX_DDV_VALVE_DEADZONE(void) {
01135     CANMessage temp_msg;
01136     float temp_valve_deadzone_minus = 0.0f;
01137     float temp_valve_deadzone_plus = 0.0f;
01138     float temp_ddv_center = 0.0f;
01139     
01140     //temp_valve_deadzone_plus = 10000.0f*((double)VALVE_DEADZONE_PLUS-(double)VALVE_CENTER)/((double)VALVE_MAX_POS-(double)VALVE_CENTER);
01141     //temp_valve_deadzone_minus = -10000.0f*((double)VALVE_DEADZONE_MINUS-(double)VALVE_CENTER)/((double)VALVE_MIN_POS-(double)VALVE_CENTER);
01142     temp_valve_deadzone_plus = (double)VALVE_DEADZONE_PLUS;
01143     temp_valve_deadzone_minus = (double)VALVE_DEADZONE_MINUS;
01144     temp_ddv_center = (double)VALVE_CENTER;
01145     
01146     temp_msg.id = CID_TX_INFO;
01147     temp_msg.len = 7;
01148     temp_msg.data[0] = (uint8_t) CTX_SEND_DDV_VALVE_DEADZONE;
01149     temp_msg.data[1] = (uint8_t) temp_valve_deadzone_minus;
01150     temp_msg.data[2] = (uint8_t) ((int) (temp_valve_deadzone_minus) >> 8);
01151     temp_msg.data[3] = (uint8_t) (temp_valve_deadzone_plus);
01152     temp_msg.data[4] = (uint8_t) ((int) (temp_valve_deadzone_plus) >> 8);
01153     temp_msg.data[5] = (uint8_t) (temp_ddv_center);
01154     temp_msg.data[6] = (uint8_t) ((int) (temp_ddv_center) >> 8);
01155 
01156     can.write(temp_msg);
01157 }
01158 
01159 void CAN_TX_VALVE_GAIN_MINUS(void) {
01160     CANMessage temp_msg;
01161     
01162     temp_msg.id = CID_TX_INFO;
01163     temp_msg.len = 6;
01164     temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_GAIN_MINUS;
01165     temp_msg.data[1] = (uint8_t) (VALVE_GAIN_LPM_PER_V[1] * 50.0f);
01166     temp_msg.data[2] = (uint8_t) (VALVE_GAIN_LPM_PER_V[3] * 50.0f);
01167     temp_msg.data[3] = (uint8_t) (VALVE_GAIN_LPM_PER_V[5] * 50.0f);
01168     temp_msg.data[4] = (uint8_t) (VALVE_GAIN_LPM_PER_V[7] * 50.0f);
01169     temp_msg.data[5] = (uint8_t) (VALVE_GAIN_LPM_PER_V[9] * 50.0f);
01170 
01171     can.write(temp_msg);
01172 }
01173 
01174 void CAN_TX_REFENCE_MODE(void) {
01175     CANMessage temp_msg;
01176     
01177     temp_msg.id = CID_TX_INFO;
01178     temp_msg.len = 6;
01179     temp_msg.data[0] = (uint8_t) CTX_SEND_REFENCE_MODE;
01180     temp_msg.data[1] = (uint8_t) REFERENCE_MODE;
01181     temp_msg.data[2] = (uint8_t) (int) (REFERENCE_FREQ * 100.0f);
01182     temp_msg.data[3] = (uint8_t) ((int) (REFERENCE_FREQ * 100.0f) >> 8);
01183     temp_msg.data[4] = (uint8_t) (int) (REFERENCE_MAG * 100.0f);
01184     temp_msg.data[5] = (uint8_t) ((int) (REFERENCE_MAG * 100.0f) >> 8);
01185 
01186     can.write(temp_msg);
01187 }
01188 
01189 void CAN_TX_HOMEPOS_OFFSET(void) {
01190     CANMessage temp_msg;
01191     int16_t send_homepos_offset;
01192     send_homepos_offset = (int16_t) (HOMEPOS_OFFSET);
01193     
01194     temp_msg.id = CID_TX_INFO;
01195     temp_msg.len = 3;
01196     temp_msg.data[0] = (uint8_t) CTX_SEND_HOMEPOS_OFFSET;
01197     temp_msg.data[1] = (uint8_t) send_homepos_offset;
01198     temp_msg.data[2] = (uint8_t) (send_homepos_offset >> 8);
01199 
01200     can.write(temp_msg);
01201 }
01202 
01203 void CAN_TX_HOMPOS_VALVE_OPENING(void) {
01204     CANMessage temp_msg;
01205     int16_t send_homepos_valve_opening;
01206     send_homepos_valve_opening = (int16_t) (HOMEPOS_VALVE_OPENING);
01207     
01208     temp_msg.id = CID_TX_INFO;
01209     temp_msg.len = 3;
01210     temp_msg.data[0] = (uint8_t) CTX_SEND_HOMEPOS_VALVE_OPENING;
01211     temp_msg.data[1] = (uint8_t) send_homepos_valve_opening;
01212     temp_msg.data[2] = (uint8_t) (send_homepos_valve_opening >> 8);
01213 
01214     can.write(temp_msg);
01215 }
01216 
01217 void CAN_TX_VALVE_PWM_VS_VALVE_POS(int8_t canindex) {
01218     CANMessage temp_msg;
01219     int16_t valve_pos_vs_pwm;
01220 //    valve_pos_vs_pwm = (int16_t) (VALVE_POS_VS_PWM[canindex]);
01221     
01222     if(VALVE_POS_VS_PWM[canindex]>= (float) VALVE_CENTER) {
01223         valve_pos_vs_pwm = 10000.0f*((double)VALVE_POS_VS_PWM[canindex]-(double)VALVE_CENTER)/((double)VALVE_MAX_POS-(double)VALVE_CENTER);
01224     } else {
01225         valve_pos_vs_pwm = -10000.0f*((double)VALVE_POS_VS_PWM[canindex]-(double)VALVE_CENTER)/((double)VALVE_MIN_POS-(double)VALVE_CENTER);
01226     }
01227     
01228     int16_t PWM_VALVE_ID;
01229     PWM_VALVE_ID = ID_index_array[canindex] * 1000;
01230     
01231     temp_msg.id = CID_TX_INFO;
01232     temp_msg.len = 5;
01233     temp_msg.data[0] = (uint8_t) CTX_VALVE_PWM_VS_VALVE_POS;
01234     temp_msg.data[1] = (uint8_t) PWM_VALVE_ID;
01235     temp_msg.data[2] = (uint8_t) (PWM_VALVE_ID >> 8);
01236     temp_msg.data[3] = (uint8_t) valve_pos_vs_pwm;
01237     temp_msg.data[4] = (uint8_t) (valve_pos_vs_pwm >> 8);
01238 
01239     can.write(temp_msg);
01240 }
01241 
01242 void CAN_TX_VALVE_POS_VS_FLOWRATE(int8_t canindex) {
01243     CANMessage temp_msg;
01244     int32_t valve_pos_vs_flowrate;
01245     valve_pos_vs_flowrate = (int32_t) (JOINT_VEL[canindex]);
01246 
01247     int16_t VALVE_POS_VALVE_ID = ID_index_array[canindex] * 10 + VALVE_CENTER;
01248     int16_t temp_valve_pos = 0;
01249     if(VALVE_POS_VALVE_ID>=VALVE_CENTER) {
01250         temp_valve_pos = (int16_t) (10000.0f*((double)VALVE_POS_VALVE_ID-(double)VALVE_CENTER)/((double)VALVE_MAX_POS-(double)VALVE_CENTER));
01251     } else {
01252         temp_valve_pos = (int16_t) (-10000.0f*((double)VALVE_POS_VALVE_ID-(double)VALVE_CENTER)/((double)VALVE_MIN_POS-(double)VALVE_CENTER));
01253     }
01254     
01255     temp_msg.id = CID_TX_INFO;
01256     temp_msg.len = 8;
01257     temp_msg.data[0] = (uint8_t) CTX_VALVE_POS_VS_FLOWRATE;
01258     temp_msg.data[1] = (uint8_t) temp_valve_pos;
01259     temp_msg.data[2] = (uint8_t) (temp_valve_pos >> 8);
01260     temp_msg.data[5] = (uint8_t) valve_pos_vs_flowrate;
01261     temp_msg.data[6] = (uint8_t) (valve_pos_vs_flowrate >> 8);
01262     temp_msg.data[7] = (uint8_t) (valve_pos_vs_flowrate >> 16);
01263     temp_msg.data[7] = (uint8_t) (valve_pos_vs_flowrate >> 24);
01264 
01265     can.write(temp_msg);
01266 }
01267 
01268 void CAN_TX_VALVE_POS_NUM(void) {
01269     CANMessage temp_msg;
01270     int32_t valve_pos_num;
01271     valve_pos_num = (int16_t) VALVE_POS_NUM;
01272     
01273     temp_msg.id = CID_TX_INFO;
01274     temp_msg.len = 3;
01275     temp_msg.data[0] = (uint8_t) CTX_VALVE_POS_NUM;
01276     temp_msg.data[1] = (uint8_t) valve_pos_num;
01277     temp_msg.data[2] = (uint8_t) (valve_pos_num >> 8);
01278 
01279     can.write(temp_msg);
01280 }
01281 
01282 void CAN_TX_DDV_VALVE_MAX_MIN_POS(void) {
01283     CANMessage temp_msg;
01284     
01285     float temp_valve_max_pos = 0.0f;
01286     float temp_valve_min_pos = 0.0f;
01287     float temp_ddv_center = 0.0f;
01288     
01289     temp_valve_max_pos = VALVE_MAX_POS;
01290     temp_valve_min_pos = VALVE_MIN_POS;
01291     temp_ddv_center = VALVE_CENTER;
01292     
01293     temp_msg.id = CID_TX_INFO;
01294     temp_msg.len = 7;
01295     temp_msg.data[0] = (uint8_t) CTX_VALVE_MAX_MIN_POS;
01296     temp_msg.data[1] = (uint8_t) temp_valve_max_pos;
01297     temp_msg.data[2] = (uint8_t) ((int) (temp_valve_max_pos) >> 8);
01298     temp_msg.data[3] = (uint8_t) (temp_valve_min_pos);
01299     temp_msg.data[4] = (uint8_t) ((int) (temp_valve_min_pos) >> 8);
01300     temp_msg.data[5] = (uint8_t) (temp_ddv_center);
01301     temp_msg.data[6] = (uint8_t) ((int) (temp_ddv_center) >> 8);
01302 
01303     can.write(temp_msg);
01304 }
01305 
01306 /******************************************************************************
01307  Sensor & State Transmission Functions
01308 *******************************************************************************/
01309 
01310 void CAN_TX_POSITION_FT(int16_t t_pos, int16_t t_vel, int16_t t_torq) {
01311     CANMessage temp_msg;
01312 
01313     temp_msg.id = CID_TX_POSITION;
01314     temp_msg.len = 6;
01315     temp_msg.data[0] = (uint8_t) t_pos;
01316     temp_msg.data[1] = (uint8_t) (t_pos >> 8);
01317     temp_msg.data[2] = (uint8_t) t_vel;
01318     temp_msg.data[3] = (uint8_t) (t_vel >> 8);
01319     temp_msg.data[4] = (uint8_t) t_torq;
01320     temp_msg.data[5] = (uint8_t) (t_torq >> 8);
01321 
01322     can.write(temp_msg);
01323 }
01324 
01325 void CAN_TX_POSITION_PRESSURE(int16_t t_pos, int16_t t_vel, int16_t t_pa, int16_t t_pb) {
01326     
01327     CANMessage temp_msg;
01328 
01329     temp_msg.id = CID_TX_POSITION;
01330     temp_msg.len = 8;
01331     temp_msg.data[0] = (uint8_t) t_pos;
01332     temp_msg.data[1] = (uint8_t) (t_pos >> 8);
01333     temp_msg.data[2] = (uint8_t) t_vel;
01334     temp_msg.data[3] = (uint8_t) (t_vel >> 8);
01335     temp_msg.data[4] = (uint8_t) t_pa;
01336     temp_msg.data[5] = (uint8_t) (t_pa >> 8);
01337     temp_msg.data[6] = (uint8_t) t_pb;
01338     temp_msg.data[7] = (uint8_t) (t_pb >> 8);
01339 
01340     can.write(temp_msg);
01341 }
01342 
01343 //void CAN_TX_TORQUE(int16_t t_valve_pos, int16_t t_vout) {
01344 //    CANMessage temp_msg;
01345 //
01346 //    temp_msg.id = CID_TX_TORQUE;
01347 //    temp_msg.len = 4;
01348 //    temp_msg.data[0] = (uint8_t) t_valve_pos;
01349 //    temp_msg.data[1] = (uint8_t) (t_valve_pos >> 8);
01350 //    temp_msg.data[2] = (uint8_t) t_vout;
01351 //    temp_msg.data[3] = (uint8_t) (t_vout >> 8);
01352 //
01353 //    can.write(temp_msg);
01354 //}
01355 
01356 void CAN_TX_TORQUE(int16_t t_valve_pos) {
01357     CANMessage temp_msg;
01358 
01359     temp_msg.id = CID_TX_TORQUE;
01360     temp_msg.len = 2;
01361     temp_msg.data[0] = (uint8_t) t_valve_pos;
01362     temp_msg.data[1] = (uint8_t) (t_valve_pos >> 8);
01363 
01364     can.write(temp_msg);
01365 }
01366 
01367 void CAN_TX_PRES(int16_t t_pres_a, int16_t t_pres_b) {
01368     CANMessage temp_msg;
01369 
01370     temp_msg.id = CID_TX_PRES;
01371     temp_msg.len = 4;
01372     temp_msg.data[0] = (uint8_t) t_pres_a;
01373     temp_msg.data[1] = (uint8_t) (t_pres_a >> 8);
01374     temp_msg.data[2] = (uint8_t) t_pres_b;
01375     temp_msg.data[3] = (uint8_t) (t_pres_b >> 8);
01376 
01377     can.write(temp_msg);
01378 }
01379 
01380 void CAN_TX_PWM(int16_t t_pwm) {
01381     CANMessage temp_msg;
01382 
01383     temp_msg.id = CID_TX_VOUT;
01384     temp_msg.len = 2;
01385     temp_msg.data[0] = (uint8_t) t_pwm;
01386     temp_msg.data[1] = (uint8_t) (t_pwm >> 8);
01387 
01388     can.write(temp_msg);
01389 }
01390 
01391 void CAN_TX_VALVE_POSITION(int16_t t_valve_pos, int16_t t_ref_valve_pos, int16_t t_pwm)
01392 {
01393     CANMessage temp_msg;
01394 
01395     temp_msg.id = CID_TX_VALVE_POSITION;
01396     temp_msg.len = 6;
01397     temp_msg.data[0] = (uint8_t) t_valve_pos;
01398     temp_msg.data[1] = (uint8_t) (t_valve_pos >> 8);
01399     temp_msg.data[2] = (uint8_t) t_ref_valve_pos;
01400     temp_msg.data[3] = (uint8_t) (t_ref_valve_pos >> 8);
01401     temp_msg.data[4] = (uint8_t) t_pwm;
01402     temp_msg.data[5] = (uint8_t) (t_pwm >> 8);
01403     
01404 
01405     can.write(temp_msg);
01406 }
01407 
01408 
01409 
01410 
01411 
01412 
01413 
01414 
01415 
01416