#include <packets2021.h> #include <Adafruit_NeoPixel.h> #include <LedControlcustomized.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <DigitLedDisplay.h> // WiFi credentials #define WIFI_SSID "omiderfani" #define WIFI_PASS "******" // Network settings #define UDP_PORT 20777 #define MAX_PACKET_SIZE 2048 // NeoPixel settings #define PIN D4 #define NUMPIXELS 24 // Colors #define COLOR_RED 0xFF0000 #define COLOR_GREEN 0x00FF00 #define COLOR_BLUE 0x0000FF <br class="avia-permanent-lb"> <br class="avia-permanent-lb"> uint32_t revLightColors[3] = {COLOR_GREEN, COLOR_RED, COLOR_BLUE}; // Set your Static IP address IPAddress local_IP(192, 168, 1, 5); // Set your Gateway IP address IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); //IPAddress primaryDNS(8, 8, 8, 8); //optional //IPAddress secondaryDNS(8, 8, 4, 4); //optional WiFiUDP UDP; Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); LedControl lc = LedControl(D0, D2, D1, 1); //DATA IN,CLK,CS // Digit 7 segment DigitLedDisplay ld = DigitLedDisplay(D6, D7, D8); //DIN, CS, CLK byte packet[MAX_PACKET_SIZE]; byte matrix_map[13][8] = { {0x00, 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6}, // R {0xFF, 0x3C, 0x0C, 0x24, 0x30, 0x38, 0x3C, 0x3C}, // N {0x00, 0x18, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E}, // 1 {0x00, 0x3C, 0x66, 0x06, 0x0C, 0x30, 0x60, 0x7E}, // 2 {0x00, 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C}, // 3 {0x00, 0x0C, 0x1C, 0x2C, 0x4C, 0x7E, 0x0C, 0x0C}, // 4 {0x00, 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C}, // 5 {0x00, 0x3C, 0x66, 0x60, 0x7C, 0x66, 0x66, 0x3C}, // 6 {0x00, 0x7E, 0x66, 0x0C, 0x0C, 0x18, 0x18, 0x18}, // 7 {0x00, 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C}, // 8 {0xFF, 0x03, 0x99, 0x99, 0x83, 0x9F, 0x9F, 0x0F}, // P {0xFB, 0xF3, 0xC3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1}, // F1 {0x04, 0x0C, 0x3C, 0x0C, 0x0C, 0x0C, 0x3E, 0x3E} // F2 }; typedef enum { MOTION, SESSION, LAP, EVENT, PARTICIPANTS, SETUPS, TELEMETRY, CARSTATUS, FINALCLASS, LOBBYINFO, CARDAMAGE, History } packet_type_t; float glat = 0; // Longitudinal G-Force component int gear = 0; int drs = 0; int rev = 0; int revb = 0; int spd = 0; int ETEM = 0; //Engine temperature (celsius) int drsAllowed = 0; int RPM = 0; int fuelmix = 0; int pit = 0; int tyre = 0; int ersm = 0; int flag = 0; int tyretrr = 0; int tyretrl = 0; int tyretfr = 0; int tyretfl = 0; int temp = 0; float wtyrewrr = 0;//Rear Right (RR)Tyre wear=1 float wtyrewrl = 0;//Rear Left (RL)Tyre wear-0 float wtyrewfr = 0; //front Left (FL)Tyre wear-4 float wtyrewfl = 0; //front Right (FL)Tyre wear-3 int wtyrerr = 0; // Tyre damage (percentage) int wtyrerl = 0; int wtyrefl = 0; int wtyrefr = 0; int DRSX = 0; int tyretype = 0; float MGUK = 0; float MGUH = 0; float DERS = 0; float erse = 0; int DRSF = 0; volatile uint8_t blink_state = 0; uint8_t blink_r = 0; uint8_t blink_g = 0; uint8_t blink_b = 0; void ICACHE_RAM_ATTR timerISR() { switch (blink_state) { case 0: blink_state = 1; timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE); timer1_write(5000000); // 1 second break; case 1: blink_state = 2; timer1_write(5000000); // 1 second break; case 2: timer1_disable(); blink_state = 0; break; default: break; } } void Blink(uint8_t r, uint8_t g, uint8_t b) { if (blink_state == 0) { blink_r = r; blink_g = g; blink_b = b; timerISR(); } } <br class="avia-permanent-lb"> void printByte(byte character []) { int i = 0; for (i = 0; i < 8; i++) { lc.setRow(0, i, character[i]); } } void setup() { pixels.setBrightness(15); ld.setBright(6); lc.setIntensity(0, 4); ld.setDigitLimit(8); //DigitLedDisplay lc.shutdown(0, false); //The MAX72XX lc.clearDisplay(0); // Setup serial port Serial.begin(115200); // Serial.println(); // Configures static IP address if (!WiFi.config(local_IP, gateway, subnet)) { Serial.println("STA Failed to configure"); } // Begin WiFi WiFi.begin(WIFI_SSID, WIFI_PASS); // Connecting to WiFi... // Serial.print("Connecting to "); // Serial.print(WIFI_SSID); // Loop continuously while WiFi is not connected while (WiFi.status() != WL_CONNECTED) { printByte(matrix_map[11]); delay(100); printByte(matrix_map[12]); } ld.write(3, B01100011); delay(200); ld.write(4, B00011101); delay(50); UDP.begin(UDP_PORT); ld.printDigit(2021,2); delay(0); pixels.clear(); timer1_attachInterrupt(timerISR); // Add ISR Function } void loop() { // If packet received... int packetSize = UDP.parsePacket(); struct NetworkPacket * networkPacket; struct PacketMotionData * packetMotionData; struct CarMotionData * motionData; struct CarTelemetryData telemetryData; struct CarStatusData statusData; struct CarDamageData dmgData; if (packetSize) { int len = UDP.read(packet, MAX_PACKET_SIZE); if (len) { networkPacket = (NetworkPacket *)packet; int playerIndex = networkPacket->header.m_playerCarIndex; switch (networkPacket->header.m_packetId) { case MOTION: // packetMotionData = (PacketMotionData *)networkPacket; // motionData = &((PacketMotionData *)networkPacket)->m_carMotionData[playerIndex]; // glat = motionData->m_gForceLongitudinal; break; case SESSION: break; case LAP: break; case EVENT: break; case PARTICIPANTS: break; case SETUPS: break; case TELEMETRY: telemetryData = ((PacketCarTelemetryData *)networkPacket)->m_carTelemetryData[playerIndex]; tyretrr = telemetryData.m_tyresInnerTemperature[1]; tyretrl = telemetryData.m_tyresInnerTemperature[0]; tyretfr = telemetryData.m_tyresInnerTemperature[3]; tyretfl = telemetryData.m_tyresInnerTemperature[2]; temp = telemetryData.m_engineTemperature; drs = telemetryData.m_drs; spd = telemetryData.m_speed; RPM = telemetryData.m_engineRPM; gear = telemetryData.m_gear; rev = telemetryData.m_revLightsPercent; // revb = telemetryData.m_revLightsBitValue; break; case CARSTATUS: statusData = ((PacketCarStatusData *)networkPacket)->m_carStatusData[playerIndex]; drsAllowed = statusData.m_drsAllowed; fuelmix = statusData.m_fuelMix; flag = statusData.m_vehicleFiaFlags; //FIA Flags ersm = statusData.m_ersDeployMode; pit = statusData.m_pitLimiterStatus; // tyre = statusData.m_actualTyreCompound; //TyreCompound- C type erse = statusData.m_ersStoreEnergy; DRSX = statusData.m_drsActivationDistance; break; case FINALCLASS: break; case LOBBYINFO: break; case CARDAMAGE: dmgData = ((PacketCarDamageData *)networkPacket)->m_carDamageData[playerIndex]; wtyrerr = dmgData.m_tyresDamage[1]; wtyrerl = dmgData.m_tyresDamage[0]; wtyrefr = dmgData.m_tyresDamage[3]; wtyrefl = dmgData.m_tyresDamage[2]; DRSF = dmgData.m_drsFault; break; //case History: // break; } pixels.clear(); ld.clear(); ld.printDigit(RPM, -1); ld.printDigit(spd, 5); //Tyre if (tyretfl>=110){ pixels.setPixelColor((21), 255, 0, 0); ld.write(5, B00011101); } else if (tyretfl<79){ pixels.setPixelColor((21), 0, 0, 255-tyretfl); } else{ pixels.setPixelColor((21), 0, tyretfl, 0); } if (tyretrl>=110){ pixels.setPixelColor((22), 255, 0, 0); ld.write(5, B00011101); }else if (tyretrl<79){ pixels.setPixelColor((22), 0, 0, 255-tyretrl); } else{ pixels.setPixelColor((22), 0, tyretrl, 0); } if (tyretfr>=110){ pixels.setPixelColor((18), 255, 0, 0); ld.write(5, B00011101); }else if (tyretfr<79){ pixels.setPixelColor((18), 0, 0, 255-tyretfr); } else { pixels.setPixelColor((18), 0, tyretfr, 0); } if (tyretrr>=110){ pixels.setPixelColor((17), 255, 0, 0); ld.write(5, B00011101); }else if (tyretrr<79){ pixels.setPixelColor((17), 0, 0, 255-tyretrr); } else { pixels.setPixelColor((17), 0, tyretrr, 0); } //Engine temperature if (temp>=120){ pixels.setPixelColor((19), temp,0, 0); } // flag if (flag == 0) { pixels.setPixelColor((23), 0, 0, 0); pixels.setPixelColor((16), 0, 0, 0); } else if (flag == 1) { Blink( 0, 255, 10); } else if (flag == 2) { Blink( 0, 0, 255); } else if (flag == 3) { Blink( 250, 170, 0); } else if (flag == 4) { Blink ( 255, 0, 0); } if (blink_state == 1) { pixels.setPixelColor (16, blink_r, blink_g, blink_b); } else if (blink_state == 2) { pixels.setPixelColor (23, blink_r, blink_g, blink_b); } // Slip indicator each wheel if (DRSF == 1){ ld.write(5, B00000100); } if (DRSX> 0){ ld.write(5, B01000000); } if (fuelmix== 0){ ld.write(5, B10000001); } //PIT Limiter if (pit == 1) { printByte(matrix_map[10]); } else { // Display Gear printByte(matrix_map[gear + 1]); } // Display ERS if (ersm == 0) { pixels.setPixelColor((20), 0, 0, 0); } else if (ersm == 1) { pixels.setPixelColor((20), 100, 50, 50); } else if (ersm == 2) { pixels.setPixelColor((20), 255, 0, 255); } else if (ersm == 3) { pixels.setPixelColor((20), 0, 255, 0); pixels.setPixelColor((19), 0, 255, 0); } // Display DRS if (drsAllowed == 0) { if (drs == 0) { pixels.setPixelColor((0), 0, 0, 55); } else if (drs == 1) { pixels.setPixelColor((0), 255, 0, 255); pixels.setPixelColor((1), 255, 0, 255); lc.setRow(0, 0, B10100101); } } else if (drsAllowed == 1) { if (drs == 0) { lc.setRow(0, 0, B10000001); pixels.setPixelColor((0), 100, 255, 0); } } // Display RevLight int n = rev / 7; int color; for (int i = 1; i < n + 1; ++i) { color = revLightColors[(i - 1) / 5]; pixels.setPixelColor(i, color); } if (rev == 100) { pixels.fill(COLOR_BLUE, 1, 15); } pixels.begin(); pixels.show(); delay(0); } } }