.

Dependencies:   mbed FastPWM

Files at this revision

API Documentation at this revision

Comitter:
arcannae
Date:
Wed Oct 16 20:47:12 2019 +0000
Commit message:
.

Changed in this revision

FastPWM.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
test.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FastPWM.lib	Wed Oct 16 20:47:12 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/Sissors/code/FastPWM/#c0b2265cff9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 16 20:47:12 2019 +0000
@@ -0,0 +1,750 @@
+/*---------------------------------------------------------------------------------------*
+*Script pour Tableau de bord Scania PGRT                                                 *
+*  ________________                                                                      *
+* / Olivier Flayols\_____________________________________________________________________*
+* V 1.2                                                                                  *
+* Version de test                                                                        *
+*----------------------------------------------------------------------------------------*
+*/
+
+#include "mbed.h"
+#include "FastPWM.h"
+
+//---------- Declaration des Variables et constantes et assigation des broches -----------
+
+DigitalOut led2                     (LED2);
+DigitalOut led1                      (D12);
+
+CAN can1                        (D15, D14);
+CAN can2                         (D4, D10);
+
+Serial COM                  (USBTX, USBRX);
+Serial COM_AR                 (PA_0, PA_1);
+
+Ticker                         CANTransmit;
+Ticker                         CAN0Receive;
+Ticker                         CAN1Receive;
+CANMessage                           BUFRx;
+Ticker                           Send_data;
+
+FastPWM speed_pulse                   (D9);
+
+DigitalIn   input                  (PA_15);
+
+int                        Serial_data[54];
+int                            serial_byte;
+bool                             OCTET0[8]; 
+bool                             OCTET1[8]; 
+bool                             OCTET2[8];
+bool                             OCTET3[8];
+bool                             OCTET4[8];
+int                                counter;
+char                               DATA[8];
+float                               Period;
+int                            truck_speed;
+
+//information du CAN rouge
+
+int                      MainBeamIntended;
+int                    DirectionIndicator;
+int                       OpticruiseLever;
+int                       Retarder = 0xFF;
+int                    CUV_Information[8];
+int                         Tachograph[8];
+int                      CCVS_information;
+int                         speed_mem = 0;
+int                               DLN5[8];
+int         CruiseControl_VehicleSpeed[8];
+int                             HiVeDi[8];
+int                               DATE[8];
+
+enum  OCTET0 {brake_air_press_warning, park_brake, high_beam, low_beam, right_blinker, left_blinker, light_parking};
+enum  OCTET1 {water_temperature_warning, oil_pressure_warning,  batterie_voltage_warning, fuel_warning, brake_air_emergency, motor_brake, wipers};
+enum  OCTET2 {engine_enabled, electric_enabled, left_blinker_state, right_blinker_state, adblue_warning, light_brake,  trailer_connected};
+enum  OCTET3 {wheel_lift_0, wheel_lift_1, wheel_lift_2, wheel_lift_3, wheel_lift_4, wheel_lift_5,  wheel_lift_6, wheel_lift_7};
+enum  OCTET4 {trailer_wheel_lift_0, trailer_wheel_lift_1, trailer_wheel_lift_2, trailer_wheel_lift_3, trailer_wheel_lift_4, trailer_wheel_lift_5,  trailer_wheel_lift_6, trailer_wheel_lift_7};
+enum  Serial_data { speed_ms, LSB_rpm, MSB_rpm, brake_air_pressure_int, fuel_int, oil_pressure_int, oil_temperature_int, water_temperature_int, batterie_voltage_int, average_cosumption_int, adblue, displayed_gear, engine_gear, effective_throttle, effective_brake, effective_clutch, LSB_Fuel_liters,  MSB_Fuel_liters, 
+                    odometer_split_1, odometer_split_2, odometer_split_3, odometer_split_4, game_time_split_1, game_time_split_2, game_time_split_3, game_time_split_4, next_rest_stop_split_1, next_rest_stop_split_2, next_rest_stop_split_3, next_rest_stop_split_4, cruise_control, retarder_steps, 
+                    decimal_oil_pressure, decimal_battery_voltage, decimal_average_consumption, speed_ms_decimal, decimal_fuel_liters, decimal_odometer, decimal_water_temperature, decimal_fuel, decimal_engine_rpm, decimal_brake_air_pressure, wear_engine, wear_transmission, wear_chassis, wear_wheels,
+                    wear_cabin, forward_gear_count, reverse_gear_count, OCTET_0, OCTET_1, OCTET_2, OCTET_3, OCTET_4};
+
+//                       |------------------------------------------------DMI DIAGNOSTIC--------------------------------------------|    ASP1      ASC1-K        CC/VS       CUV       DashDisp      EEC1      EngFLuid      TC01        HiRes       EBC1        ETC1                   20 par ligne  
+const int  PGN[33]     = {0x18FECA0B, 0x18FECA27, 0x18FECA10, 0x18FECA03, 0x18FECA2F, 0x18FECA00, 0x18FECA30, 0x18FECA1E, 0x18FECA3D, 0x18FEAE30, 0x0CFE5A27, 0x18FEF100, 0x18FFB11E, 0x18FEFC27, 0x0CF00400, 0x18FEEF27, 0x0CFE6CEE, 0x18FEC1EE, 0x18F0010B, 0x0CF00203, 
+//                           ETC2        TP2       EngTemp       IEC       FuelEco       DLN7       Weight       ERC1       Cruise       DLN2       EAC1-K       EBS5        DATE
+                          0x18F00503, 0x18FFA103, 0x18FEEE00, 0x18FEF600, 0x18FEF200, 0x18FF8700, 0x18FEEA2F, 0x18F00010, 0x10FF8E11, 0x0CFF8100, 0x18F00627, 0x1CFEAC0B, 0x18FEE6EE};
+              
+                    
+//-------------Mappage des données--------------
+
+int map(int x, int in_min, int in_max, int out_min, int out_max)
+{
+  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+}
+
+float mapf(float x, float in_min, float in_max, float out_min, float out_max)
+{
+  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+}
+
+
+void data_roll()
+{
+    if (counter < 9)
+        {
+        
+      // brake, APS, AWD, Engine, SMS, COO, 53, Transmission, WTA
+        
+        bool engine_malfunction             = Serial_data[wear_engine] / 10;
+        bool transmission_malfunction       = Serial_data[wear_transmission] / 10;
+        
+        bool DM1_amber [9]    = {0, 0, 0, transmission_malfunction, 0, engine_malfunction  , 0, 0};
+        bool DM1_red [9]      = {0, 0, 0, transmission_malfunction, 0, engine_malfunction  , 0, 0};
+    
+        DATA[0] = DM1_amber[counter]*4 + DM1_red[counter]*16;;
+        DATA[1] = 0xFF;
+        DATA[2] = 0xFF;
+        DATA[3] = 0xFF;
+        DATA[4] = 0xFF;
+        DATA[5] = 0xFF;
+        DATA[6] = 0xFF;
+        DATA[7] = 0xFF;
+        }
+
+switch(counter)
+  {
+      
+// AIR1 - Air Supply Pressure
+    case(9):
+    
+    int FrontRearCircuitPressure    = map((Serial_data[brake_air_pressure_int]*10)  + (Serial_data[decimal_brake_air_pressure]/10), 0, 1450, 0, 150);  //1030
+    int ParkBrakePressure           = (FrontRearCircuitPressure < 0) ? 0 : ((FrontRearCircuitPressure > 106) ? 106 : FrontRearCircuitPressure);                 
+    
+    DATA[0] = 0x02;
+    DATA[1] = ParkBrakePressure;   //106 = 8.5 bar park
+    DATA[2] = FrontRearCircuitPressure;
+    DATA[3] = FrontRearCircuitPressure;
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFD;
+    DATA[7] = 0xFF;
+    break;
+
+// ASC1 - Air Suspension Control 1
+    case(10):
+    
+    bool truck_axle_lifted      = (Serial_data[OCTET_3] < 0) ? 0 : ((Serial_data[OCTET_3] > 1) ? 1 : Serial_data[OCTET_3]);
+    bool trailer_axle_lifted    = (Serial_data[OCTET_4] < 0) ? 0 : ((Serial_data[OCTET_4] > 1) ? 1 : Serial_data[OCTET_4]);   
+    
+    DATA[0] = 0xFF;
+    DATA[1] = 0xFF;
+    DATA[2] = 0xFF;
+    DATA[3] = (trailer_axle_lifted*2) * 16;
+    DATA[4] = truck_axle_lifted  * 64;    
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;
+    break;
+
+// CC/VS - Cruise Control / Vehicle Speed
+    case(11):
+    DATA[0] = (OCTET0[park_brake]*4);
+    DATA[1] = CruiseControl_VehicleSpeed[1];
+    DATA[2] = CruiseControl_VehicleSpeed[2];
+    DATA[3] = CruiseControl_VehicleSpeed[3];
+    DATA[4] = CruiseControl_VehicleSpeed[4];
+    DATA[5] = Serial_data[cruise_control];
+    DATA[6] = CruiseControl_VehicleSpeed[6];
+    DATA[7] = CruiseControl_VehicleSpeed[7];
+    break;
+
+// CUV - CUV Information
+    case(12):
+    
+    DATA[0] = (OCTET0[left_blinker]*64) + (OCTET0[right_blinker]*16) + (OCTET0[low_beam]*4) + (OCTET0[high_beam] && OCTET0[low_beam]) ;
+    DATA[1] = CUV_Information[1];
+    DATA[2] = (OCTET0[right_blinker]*64)+(OCTET0[left_blinker]*16);
+    DATA[3] = ((OCTET2[trailer_connected] & OCTET0[right_blinker]) *4) + (OCTET0[left_blinker] & OCTET2[trailer_connected]);
+    DATA[4] = CUV_Information[4];
+    DATA[5] = CUV_Information[5];
+    DATA[6] = CUV_Information[6];
+    DATA[7] = CUV_Information[7];
+    break;
+
+//DASH - Dash Display
+    case(13):
+    DATA[0] = 0xFF;
+    DATA[1] = map((Serial_data[fuel_int]*10) + (Serial_data[decimal_fuel]/10), 0, 1000, 0, 250);
+    DATA[2] = 0xFF;
+    DATA[3] = 0xFF;
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;
+    break;
+
+//EEC1 - Electronic Engine Controler
+    case(14):
+    DATA[0] = 0x02;
+    DATA[1] = 0x00;
+    DATA[2] = 0x00;
+    DATA[3] =  map((((Serial_data[MSB_rpm] << 8) + Serial_data[LSB_rpm])*10) + (Serial_data[decimal_engine_rpm]/10), 0, 25000, 0, 20000) & 0x00FF;
+    DATA[4] = (map((((Serial_data[MSB_rpm] << 8) + Serial_data[LSB_rpm])*10) + (Serial_data[decimal_engine_rpm]/10), 0, 25000, 0, 20000) & 0xFF00)>> 8; 
+    DATA[5] = 0x11;
+    DATA[6] = 0x00;
+    DATA[7] = 0x00;
+    break;
+
+//ENGfLVL - Engine Fluid Level Pressure 1
+    case(15):
+    DATA[0] = 0x09;
+    DATA[1] = 0xFF;
+    DATA[2] = 0xFF;
+    DATA[3] = map((Serial_data[oil_pressure_int]*10) + (Serial_data[decimal_oil_pressure]/10), 0, 810, 0, 175);
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0x00;
+    break;
+
+
+//TCO1
+    case(16):
+    
+     float speed_kmh = 127.0f;
+    //float speed_kmh     = mapf((float(Serial_data[speed_ms]) + (float(Serial_data[speed_ms_decimal]) / 100.0f)) * 3.6f, 0.0f, 125.0f, 1.0f,265.0f);                               //127 = 60kmh
+    truck_speed         = mapf (((Serial_data[speed_ms]*100) + Serial_data[speed_ms_decimal]) *3.6f, 0, 25000, 0, 65023);
+    Period              =  1.0f / speed_kmh;
+    speed_pulse.period  (Period);
+  /*  
+    if (Serial_data[speed_ms] ==  0 && Serial_data[speed_ms_decimal] == 0)
+        {
+        speed_pulse.write                       (1.0f);
+        }else{
+        speed_pulse.write                       (0.5f);
+        }
+  
+    */
+    
+    DATA[0] = Tachograph[0];
+    DATA[1] = Tachograph[1];
+    DATA[2] = Tachograph[2];
+    DATA[3] = 0x00;
+    DATA[4] = Tachograph[4];
+    DATA[5] = Tachograph[5];
+    DATA[6] = truck_speed & 0x00FF;
+    DATA[7] = (truck_speed >> 8) & 0x00FF;
+    break;
+    
+//HiResVDist - Hi Resolution Vehicle Distance
+    case(17):
+    
+    int odometer = (((((Serial_data[odometer_split_4]) << 24)  + ((Serial_data[odometer_split_3]) << 16) + ((Serial_data[odometer_split_2]) << 8) + (Serial_data[odometer_split_1])) *10) + Serial_data[decimal_odometer]) *20;
+    
+    DATA[0] = (odometer & 0x000000FF);
+    DATA[1] = (odometer & 0x0000FF00) >> 8;
+    DATA[2] = (odometer & 0x00FF0000) >> 16;
+    DATA[3] = (odometer & 0xFF000000) >> 24;
+    DATA[4] = HiVeDi[4];
+    DATA[5] = HiVeDi[5];
+    DATA[6] = HiVeDi[6];
+    DATA[7] = HiVeDi[7];
+    break;
+    
+//EBC1
+    case(18):
+    DATA[0] = 0x00;
+    DATA[1] = 0x00;
+    DATA[2] = 0xF3;
+    DATA[3] = 0xFF;
+    DATA[4] = 0xFF;
+    DATA[5] = 0x01;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;   
+    break;
+    
+//ETC1
+    case(19):
+    DATA[0] = 0xCC;
+    DATA[1] = 0x00;
+    DATA[2] = 0x00;
+    DATA[3] = 0xFF;
+    DATA[4] = 0xFC;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;  
+    break;
+    
+//ETC2
+    case(20):
+    //                          N       C1      C2       1       2      3        4       5       6       7       8       9      10      11      12      R1      R2
+    int gear_14[17]        = {0x204E, 0x4331, 0x4332, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x3130, 0x3131, 0x3132, 0x5231, 0x5232};
+    
+    //                          N        1       2      3        4       5       6       7       8       9      10      11      12      R1      R2
+    int gear_12[15]        = {0x204E, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x3130, 0x3131, 0x3132, 0x5231, 0x5232};
+
+    DATA[0] = Serial_data[displayed_gear] + 0x7D;
+    DATA[1] = 0x00;
+    DATA[2] = 0xFF;
+    DATA[3] = Serial_data[engine_gear] + 0x7D;
+    
+    if(Serial_data[forward_gear_count] == 12)
+        {
+        DATA[4] = (gear_12[Serial_data[displayed_gear]] >> 8) & 0x00FF;
+        DATA[5] = (gear_12[Serial_data[displayed_gear]]) & 0x00FF;
+        DATA[6] = (gear_12[Serial_data[engine_gear]] >> 8) & 0x00FF;
+        DATA[7] = (gear_12[Serial_data[engine_gear]]) & 0x00FF;
+        }
+    
+    if(Serial_data[forward_gear_count] == 14)
+        {
+        DATA[4] = (gear_14[Serial_data[displayed_gear]] >> 8) & 0x00FF;
+        DATA[5] = (gear_14[Serial_data[displayed_gear]]) & 0x00FF;
+        DATA[6] = (gear_14[Serial_data[engine_gear]] >> 8) & 0x00FF;
+        DATA[7] = (gear_14[Serial_data[engine_gear]]) & 0x00FF;
+        }
+    
+    break;
+    
+//TP2
+    case(21):
+    //                 R     RL    RC    RH    R0    RP    RM    RE    N    NL    NC    NH    NO    NP    NM    NE    A     AL    AC    AH    AO    AP    AM    AE    M     ML    MC    MH    MO    MP    MM    ME   blank Blank
+//  int GbMode[34] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21};
+    
+    int GbMode;
+    
+    if (Serial_data[displayed_gear] == 0)
+        {
+        GbMode = 0x08;
+        }
+        
+     
+     if (Serial_data[displayed_gear] > 0 && Serial_data[displayed_gear]  < 15)
+        {
+        if(OpticruiseLever == 0x12)
+            {
+            GbMode = 0x10;
+            }
+            if(OpticruiseLever == 0x1A){
+            GbMode = 0x18;
+            }
+        }
+        
+     
+     if ((Serial_data[displayed_gear] > 12 && Serial_data[forward_gear_count] == 12) || (Serial_data[displayed_gear] > 14 && Serial_data[forward_gear_count] == 14))
+        {
+        GbMode = 0x00;
+        }
+   /*     
+    
+    if (Serial_data[displayed_gear] > 14 && Serial_data[forward_gear_count] == 14)
+        {
+        GbMode = 0x00;
+        }
+        
+        
+        }else{
+             GbMode = 0x20; 
+    }
+*/
+    DATA[0] = 0xD0;
+    DATA[1] = 0xFF;
+    DATA[2] = 0x1F;
+    DATA[3] = 0xFE;
+    DATA[4] = GbMode;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFE;  
+    break;
+    
+//EngTemp
+    case(22):
+    DATA[0] = map((Serial_data[water_temperature_int]*10)   + (Serial_data[decimal_water_temperature]/10), -400, 2100, 0, 250);
+    DATA[1] = 0x00;
+    DATA[2] = 0x00;
+    DATA[3] = 0xFF;
+    DATA[4] = 0xFC;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;  
+    break;
+    
+//IEC
+    case(23):
+    DATA[0] = 0xFF;
+    DATA[1] = map(Serial_data[effective_throttle], 0, 100, 0, 75);
+    DATA[2] = 0x3F;
+    DATA[3] = 0xFF;
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;  
+    break;
+    
+//FuelEco
+    case(24):
+    
+    int FuelRate = map(Serial_data[effective_throttle], 0, 100, 0, 1920);
+    int InstFuelEco = map(Serial_data[effective_throttle], 0, 100, 64254, 425); 
+    int derivation = map(Serial_data[effective_throttle], 0, 100, 55000, 0);
+    
+    if(Serial_data[effective_throttle] > 5){
+    InstFuelEco = InstFuelEco - derivation;
+    }
+    
+    if(OCTET2[engine_enabled] == 1){
+        FuelRate = FuelRate + 40;
+        }
+    
+  
+    DATA[0] = FuelRate & 0x00FF;
+    DATA[1] = (FuelRate >> 8) & 0x00FF;
+    DATA[2] = InstFuelEco & 0x00FF;
+    DATA[3] = (InstFuelEco >> 8)  & 0x00FF;
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = map(Serial_data[effective_throttle], 0, 100, 0, 250);
+    DATA[7] = 0xFF;  
+    break;
+    
+    
+//DLN7
+    case(25):
+    
+    int EmptyAdBlue;
+    if(Serial_data[adblue] == 0){
+        EmptyAdBlue = 0x02;
+        }else{
+            EmptyAdBlue = 0x00;
+            }
+        
+        
+    DATA[0] = map(Serial_data[adblue], 0, 100, 0, 250);
+    DATA[1] = EmptyAdBlue;
+    DATA[2] = 0xFF;
+    DATA[3] = 0xFF;
+    DATA[4] = map((Serial_data[fuel_int]*10) + (Serial_data[decimal_fuel]/10), 0, 1000, 0, 250);
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;  
+    break;
+    
+ 
+//Wheight
+    case(26):
+    DATA[0] = rand() % 255;
+    DATA[1] = 0xF8;
+    DATA[2] = 0x11;
+    DATA[3] = 0xFF;
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;  
+    break;
+    
+//ERC1
+    case(27):
+    DATA[0] = 0xC0;
+    DATA[1] = 0x7D - ((Serial_data[retarder_steps] < 0) ? 0 : ((Serial_data[retarder_steps] > 1) ? 1 : Serial_data[retarder_steps]));
+    DATA[2] = 0x7D - ((Serial_data[retarder_steps] < 0) ? 0 : ((Serial_data[retarder_steps] > 1) ? 1 : Serial_data[retarder_steps]));
+    DATA[3] = 0xF3;
+    DATA[4] = 0xFF;
+    DATA[5] = 0xFF;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;  
+    break;
+    
+//Cruise
+    case(28):
+    
+    bool CC_active;
+  
+    if(Serial_data[cruise_control] > 0)
+        {
+            CC_active = 1;
+            speed_mem = Serial_data[cruise_control];
+        }else{
+            CC_active = 0;
+        }
+    
+     if(OCTET2[engine_enabled] == 0)
+        {
+            speed_mem = 0;
+        }
+    
+    DATA[0] = 0x00;
+    DATA[1] = speed_mem;
+    DATA[2] = 0xFF;
+    DATA[3] = 0xFF;
+    DATA[4] = CC_active *2;
+    DATA[5] = CC_active;
+    DATA[6] = 0xFF;
+    DATA[7] = 0xFF;
+    break;
+    
+//DLN2   
+   
+   case(29):
+   
+    bool adblue_low;
+    
+    if(Serial_data[adblue] < 11)
+    {
+        adblue_low = 1;
+        }else{
+            adblue_low = 0;
+            }
+    
+    DATA[0] = 0xA1;  
+    DATA[1] = 0xFF; 
+    DATA[2] = ((OCTET1[oil_pressure_warning] && OCTET2[engine_enabled]) * 16); 
+    DATA[3] = OCTET1[water_temperature_warning] + (adblue_low*16); 
+    DATA[4] = 0xFF; 
+    DATA[5] = 0xFF; 
+    DATA[6] = 0x00;  // champ economie 
+    DATA[7] = 0x00;  // champ economie 
+    break;
+    
+    
+//EAC1 - K   
+    
+    case(30):
+    DATA[0] = 0; 
+    DATA[1] = 0; 
+    DATA[2] = 0; 
+    DATA[3] = 0;
+    DATA[4] = 0;
+    DATA[5] = 0;
+    DATA[6] = 0;
+    DATA[7] = 0; 
+    break;
+    
+    
+ //EBS5
+ 
+    case(31):
+    DATA[0] = map(Serial_data[wear_wheels], 100, 0, 0, 250); 
+    DATA[1] = map(Serial_data[wear_wheels], 100, 0, 0, 250); 
+    DATA[2] = map(Serial_data[wear_wheels], 100, 0, 0, 250); 
+    DATA[3] = map(Serial_data[wear_wheels], 100, 0, 0, 250);
+    DATA[4] = map(Serial_data[wear_wheels], 100, 0, 0, 250);
+    DATA[5] = map(Serial_data[wear_wheels], 100, 0, 0, 250);
+    DATA[6] = map(Serial_data[wear_wheels], 100, 0, 0, 250);
+    DATA[7] = map(Serial_data[wear_wheels], 100, 0, 0, 250);
+    break; 
+    
+ 
+    case(32):
+
+    
+    DATA[0] = DATE[0];  
+    DATA[1] = DATE[1]; 
+    DATA[2] = DATE[2]; 
+    DATA[3] = DATE[3]; 
+    DATA[4] = DATE[4]; 
+    DATA[5] = DATE[5]; 
+    DATA[6] = DATE[6]; 
+    DATA[7] = DATE[7]; 
+    break; 
+    
+    }
+} 
+//------------ envoi des données -------------------
+
+void send()
+{
+    data_roll();
+    
+    if(can1.write(CANMessage(PGN[counter], DATA, 8, CANData, CANExtended)));
+        {
+        counter++;
+        
+        if (counter > 32)
+            {
+            counter = 0;
+            }
+        }
+} 
+
+
+void CAN0receive()
+{
+    if(can1.read(BUFRx)) 
+        {
+        int RX_PGN_0 = BUFRx.id;
+        
+        char SPN[8];
+            
+        for(int i = 0; i < 8; i ++)
+            {
+            SPN[i] =  char(BUFRx.data[i]);  
+            }
+        
+         
+         int filter = RX_PGN_0 & 0x00FFFFFF;
+            
+         if(filter == 0x00FEE617) 
+            {
+            for(int i = 0; i < 8; i ++)
+                {
+                DATE[i] =  char(BUFRx.data[i]);  
+                }
+                
+                //printf("Message recu de : %x \n", BUFRx.id);
+                //printf("%x, %x, %x, %x, %x, %x, %x, %x \n", DATE[0],DATE[1],DATE[2],DATE[3],DATE[4],DATE[5],DATE[6],DATE[7]);
+                //printf("----------------------------------- \n");
+                }
+        }
+}
+
+void CAN1receive()
+{
+   if(can2.read(BUFRx)) 
+        {
+            int RX_PGN = BUFRx.id;
+            char SPN[8];
+            
+            for(int i = 0; i < 8; i ++)
+            {
+            SPN[i] =  char(BUFRx.data[i]);  
+            }
+            
+            
+           
+            if(RX_PGN == 0x18FFB11E)
+                {
+                for(int i = 0; i < 8; i ++)
+                    {
+                    CUV_Information[i] =  char(BUFRx.data[i]);  
+                    }
+                }
+        
+            if(RX_PGN == 0x18FFA103) //infos du levier opticruise (boite de vitesse) RED CAN
+                {
+                OpticruiseLever = SPN[4];
+                }
+         
+            if(RX_PGN == 0x0C001027) //infos du retarder RED CAN
+                {
+                Retarder = SPN[3];
+                
+                }
+                
+            if(RX_PGN == 0x18FEF127) //CC/VS RED CAN
+                {
+                for(int i = 0; i < 8; i ++)
+                    {
+                    CruiseControl_VehicleSpeed[i] =  char(BUFRx.data[i]);  
+                    }
+                CCVS_information = SPN[4] & 0x54;                             // mask: 0b01010100  bouton du cruise control
+                CCVS_information = CCVS_information + ((SPN[3] & 0x04) >> 2); // bouton du cruise control
+                CCVS_information = CCVS_information + ((SPN[0] & 0x04) << 5); // information du frein de park
+                }
+                
+            if(RX_PGN == 0x0CFE6CEE) //infos du TCO
+                {
+                for(int i = 0; i < 8; i ++)
+                    {
+                    Tachograph[i] =  char(BUFRx.data[i]);  
+                    }
+                 } 
+                
+            if(RX_PGN == 0x18FFA027) //accelerateur, rapport haut/bas manuel, retarder auto, selecteur de vitesse (toutes commandes levier opticruise)
+                {
+                for(int i = 0; i < 8; i ++)
+                    {
+                    DLN5[i] =  char(BUFRx.data[i]);  
+                    }
+                }   
+                
+            if(RX_PGN == 0x18FEC1EE) // HiVehicle distance
+                {
+                 for(int i = 0; i < 8; i ++)
+                    {
+                    HiVeDi[i] =  char(BUFRx.data[i]);  
+                    }
+                }   
+     } 
+}
+//-------------------------------------------------------------------------------------------------------Initialisation LOOP ---------------------------------------------------------------------------------------------------    
+
+int main()
+{
+  
+    
+    COM.baud                              (115200);
+    COM_AR.baud                           (115200);    
+    can1.frequency                        (250000);
+    can2.frequency                        (250000);
+    CANTransmit.attach              (&send, 0.001);  
+    CAN0Receive.attach        (&CAN0receive, 0.05);
+    CAN1Receive.attach      (&CAN1receive, 0.0004);
+    speed_pulse.write                       (0.5f);
+    input.mode(PullUp);
+  
+    led1 =  1;
+    wait(1.0);
+    led1  = 0;
+  
+    while(1){
+        
+    if(COM.readable()) {
+
+        serial_byte = COM.getc();
+
+            if(serial_byte != 0xFF) {
+                return;
+            }
+  
+            __disable_irq();
+            
+           serial_byte = COM.getc();
+
+            if(serial_byte != 0x02) {
+                return;
+            }
+            
+            for (int i = 0; i<54; i++)
+            {
+                Serial_data[i] = COM.getc();
+                led1 = !led1;
+            }
+        
+            COM_AR.putc(0xFE);
+            COM_AR.putc(0xFD);
+          
+            COM_AR.putc(OpticruiseLever);
+            COM_AR.putc(Serial_data[OCTET_0]);
+            COM_AR.putc(Serial_data[OCTET_1]);
+            COM_AR.putc(Serial_data[OCTET_2]);
+            COM_AR.putc(Serial_data[OCTET_3]);
+            COM_AR.putc(Serial_data[OCTET_4]);
+            COM_AR.putc(Serial_data[engine_gear]);
+            COM_AR.putc(Serial_data[displayed_gear]);
+            COM_AR.putc(Retarder);
+            COM_AR.putc(Serial_data[retarder_steps]);
+            COM_AR.putc(CUV_Information[0]);
+            COM_AR.putc(CUV_Information[2]);
+            COM_AR.putc(CUV_Information[3]);
+            COM_AR.putc(CUV_Information[7]);
+            COM_AR.putc(CCVS_information);
+            COM_AR.putc(Serial_data[cruise_control]);
+            COM_AR.putc(DLN5[2]);
+            COM_AR.putc(DLN5[5]);
+                     
+            
+            for(int i = 0; i < 8; i ++)
+                {
+                OCTET0[i] = ((int (Serial_data[OCTET_0]) >> i) & 0x01);
+                OCTET1[i] = ((int (Serial_data[OCTET_1]) >> i) & 0x01);
+                OCTET2[i] = ((int (Serial_data[OCTET_2]) >> i) & 0x01);
+                OCTET3[i] = ((int (Serial_data[OCTET_3]) >> i) & 0x01);
+                OCTET4[i] = ((int (Serial_data[OCTET_4]) >> i) & 0x01);
+                }
+            __enable_irq();
+        }
+    }
+}
+//******************************************************************************************************************************************************************************************************************************  
+//******************************************************************************************************** END PROGRAM *********************************************************************************************************
+//******************************************************************************************************************************************************************************************************************************  
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Oct 16 20:47:12 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test.cpp	Wed Oct 16 20:47:12 2019 +0000
@@ -0,0 +1,171 @@
+/*    
+                
+               int filter = RX_PGN & 0x00FFFFFF;
+                
+                
+               // if(filter == 0x00FEF100)
+               // {
+                //can1.write(CANMessage (0x18FEC100, SPN, 8, CANData, CANExtended));
+               // }
+     
+               
+                if(filter == 0x00FE6CEE) 
+                {
+                printf("Message recu de : %x \n", BUFRx.id);
+                printf("%x, %x, %x, %x, %x, %x, %x, %x \n", BUFRx.data[0],BUFRx.data[1],BUFRx.data[2],BUFRx.data[3],BUFRx.data[4],BUFRx.data[5],BUFRx.data[6],BUFRx.data[7]);
+                printf("----------------------------------- \n");
+                }*/
+
+
+
+
+
+
+int SA[5] = {0x27, 0x11, 0x03, 0x00, 0x47};
+
+int testpgn = 0x18FFFF00;
+int count1;
+
+
+
+/*
+
+CANReceive.attach       (&CANreceive, CAN::RxIrq);
+  
+  // DATA[0] = rand() % 255;  
+  //  DATA[1] = rand() % 255; 
+  //  DATA[2] = rand() % 255; 
+  //  DATA[3] = rand() % 255; 
+  //  DATA[4] = rand() % 255; 
+   // DATA[5] = rand() % 255; 
+  //  DATA[6] = rand() % 255; 
+   // DATA[7] = rand() % 255; 
+   
+DATA_1[0] = rand() % 255; 
+DATA_1[1] = rand() % 255; 
+DATA_1[2] = rand() % 255; 
+DATA_1[3] = rand() % 255;
+DATA_1[4] = rand() % 255;
+DATA_1[5] = rand() % 255;
+DATA_1[6] = rand() % 255;
+DATA_1[7] = rand() % 255; 
+
+        can1.write(CANMessage(PGN_T + SATEST, DATA_1, 8, CANData, CANExtended));
+        //can1.write(CANMessage(PGN_T , DATA_1, 8, CANData, CANExtended));
+        //SATEST = SATEST + 1;
+        
+        if(SATEST > 10)
+            {
+            SATEST = 0;
+            PGN_T = PGN_T - 256;
+            }*/
+             //printf("PGN = %x\n",PGN_T + SATEST);
+           // printf("PGN = %x\n",PGN_T);
+
+
+/*
+void data_BAM()
+{
+    
+    
+    switch(counter_2)
+    {
+    
+   
+    //TP-CM
+    case(0):
+    DATA_2[0] = 0x20; //BAM
+    DATA_2[1] = 39;   //nombre total d'octets a transmetre dans le message broadcaster
+    DATA_2[2] = 0;    //CTS(ne pas toucher)  
+    DATA_2[3] = 5;    //nombre  de trame BAM a transmetre
+    DATA_2[4] = 0xFF; //nombre maximal d'octet pouvant etre transmis.
+    DATA_2[5] = 0xE3; //PGN 0x00FEE300
+    DATA_2[6] = 0xFE; //PGN 0x00FEE300
+    DATA_2[7] = 0x00; //non utilisé. 
+    break;
+    
+    //TP-DT
+    case(1):
+    DATA_2[0] = rand() % 255; 
+    DATA_2[1] = rand() % 255; 
+    DATA_2[2] = rand() % 255; 
+    DATA_2[3] = rand() % 255;
+    DATA_2[4] = rand() % 255;
+    DATA_2[5] = rand() % 255;
+    DATA_2[6] = rand() % 255;
+    DATA_2[7] = rand() % 255;  
+    break;
+    
+    case(2):
+    DATA_2[0] = rand() % 255; 
+    DATA_2[1] = rand() % 255; 
+    DATA_2[2] = rand() % 255; 
+    DATA_2[3] = rand() % 255;
+    DATA_2[4] = rand() % 255;
+    DATA_2[5] = rand() % 255;
+    DATA_2[6] = rand() % 255;
+    DATA_2[7] = rand() % 255;  
+    break;
+    
+    }
+}
+*/
+
+ /*
+        printf("------------------------------------- \n");
+        printf("Get data from ID: %x\n",BUFRx.id);
+        printf("DATA: %x, %x, %x, %x, %x, %x, %x, %x \n", BUFRx.data[0],BUFRx.data[1],BUFRx.data[2],BUFRx.data[3],BUFRx.data[4],BUFRx.data[5],BUFRx.data[6],BUFRx.data[7]);
+        */
+
+/*
+if(can2.read(BUFRx)) 
+        {
+        int RX_PGN = BUFRx.id;
+        char RX_DATA[8] = {BUFRx.data[0],BUFRx.data[1],BUFRx.data[2],BUFRx.data[3],BUFRx.data[4],BUFRx.data[5],BUFRx.data[6],BUFRx.data[7]};
+        
+        if(RX_PGN == 0x0CFE6CEE)
+            {
+            RX_DATA[0] =  BUFRx.data[0];
+            RX_DATA[1] =  BUFRx.data[1];
+            RX_DATA[2] =  BUFRx.data[2];
+            RX_DATA[3] =  BUFRx.data[3];
+            RX_DATA[4] =  BUFRx.data[4];
+            RX_DATA[5] =  BUFRx.data[5];
+            RX_DATA[6] =  map(speed_kph, 0, 1300, 0, 33280) & 0x00FF;
+            RX_DATA[7] = (map(speed_kph, 0, 1300, 0, 33280) & 0xFF00)>> 8;
+            
+            }
+            
+        if(RX_PGN == 0x18FEC1EE)
+            {
+            char Veh_Dist[8];
+            Veh_Dist[0] =  (odometer & 0x000000FF);
+            Veh_Dist[1] =  (odometer & 0x0000FF00) >> 8;
+            Veh_Dist[2] =  (odometer & 0x00FF0000) >> 16;
+            Veh_Dist[3] =  (odometer & 0xFF000000) >> 24;
+           
+            Veh_Dist[4] =   rand() % 255;
+            Veh_Dist[5] =   rand() % 255;
+            Veh_Dist[6] =   rand() % 255;
+            Veh_Dist[7] =   rand() % 255;
+
+            can1.write(CANMessage(RX_PGN, Veh_Dist, 8, CANData, CANExtended));
+            }
+   */  
+   
+   
+    /*
+        //          ENGSPDSENS                inc               CAB ILLUM               inc               VEH WEIGHT          CAB INF PROP        ICL INF PROP            inc                    inc               TIMEDATE             AMB COND               GPM1
+        //if(PGN != 0x0CFF0217 && PGN != 0x18AE3317 && PGN != 0x18D0FF17 && PGN != 0x1CDEEE17 && PGN != 0x18FEEA17 && PGN != 0x18FF9617 && PGN !=0x18FFD517 && PGN != 0x19FF4917 && PGN != 0x18FD7D17 && PGN != 0x18FEE617 && PGN != 0x18FEF517 && PGN != 0x18FF6017)
+         
+       // if(PGN == 0x0CFF0217) 
+        //if(PGN == 0x18AE3317) 
+        //if(PGN == 0x1CDEEE17) 
+        //if(PGN == 0x19FF4917) 
+        //if(PGN == 0x18FD7D17)    
+            {
+            printf("------------------------------------- \n");
+            printf("Get data from ID: %x\n",PGN);
+            printf("DATA: %x, %x, %x, %x, %x, %x, %x, %x \n", BUFRx.data[0],BUFRx.data[1],BUFRx.data[2],BUFRx.data[3],BUFRx.data[4],BUFRx.data[5],BUFRx.data[6],BUFRx.data[7]);
+            }
+        */ 
\ No newline at end of file