<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=47&amp;t=18719&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-06-28T17:58:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=18719&amp;mode</id>
<entry>
<author><name><![CDATA[MajkyyM]]></name></author>
<updated>2017-06-28T17:58:35+01:00</updated>
<published>2017-06-28T17:58:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18719&amp;p=191411#p191411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18719&amp;p=191411#p191411"/>
<title type="html"><![CDATA[Aruduino Mega+ CAN bus shield+ HD44780 błędy na wyświetlaczu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18719&amp;p=191411#p191411"><![CDATA[
Jako, że to mój pierwszy post, chciałbym się przywitać.<br /><br />A więc, Dzień dobry <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Z samym Arduino mam do czynienia od ok. pół roku. Stąd też moje możliwości programowania nie są zbyt duże, aczkolwiek na moje potrzeby wystarcza(nie chwaląc się oczywiście).<br />Chcę się uczyć, aby móc dobudowywać kolejne części kodu, jednak na razie muszę bazować na efektach innych osób.<br /><br />Przechodząc do meritum, buduję kokpit z prawdziwego auta do gry Euro Truck Simulator 2. Ktoś może powiedzieć, że biorę się za zbyt trudne rzeczy jak na tak małe doświadczenie.<br /><br />Do tego celu chcę użyć Arduino Mega2560 z shield CanBUS od Elecfreaks.<br />Shield ma obsługiwać licznik z samochodu poprzez szynę CAN(ustawienie prędkości szyny 500 k).<br /><br />Natomiast wyświetlacz HD44780 ma wyświetlać dane, których nie ma na liczniku z samochodu, czyli np. :<br />odległość(z nawigacji), ograniczenie prędkości itd.<br /><br />Sam licznik działa dość dobrze, jednak mam problemy z ogarnięciem wyświetlacza.<br />Bez podłączonego shield'a, wyświetlacz poprawnie pokazuje żadane wartości.<br /><br />Kiedy jest zamontowany &quot;CAN BUS&quot; i wgrany odpowiedni szkic na Arduino, wyświetlacz zamiast pokazywać ww. dane, pokazuje albo &quot;krzaczki&quot;, albo ciąg znaków&quot; HHHHHH&quot;.<br /><br />Wklejam linki ze szkicami, a także plugin obsługujący telemetrię z gry oraz jakie dane ma wysyłać na port szeregowy.<br /><br />Kolega programista z którym rozmawiałem, wspominał o przesłaniu danych przeznaczonych dla wyświetlacza w postaci zserializowanego stringa, a dopiero na Arduino miały by być te dane odpowiednio przetworzone.<br />Inny znajomy wspominał o odfiltrowaniu danych dla wyświetlacza.<br /><br />W pewnym momencie pogubiłem się.<br /><br /><br />Linki:<br /><br />Wersja bez CAN BUS, sam wyświetlacz i serwomechanizmy:<br />[syntax=cpp]/*<br />Copyright (c) 2013, Silas Parker<br />All rights reserved.<br /><br />Redistribution and use in source and binary forms, with or without modification,<br />are permitted provided that the following conditions are met:<br /><br />    Redistributions of source code must retain the above copyright notice, this<br />    list of conditions and the following disclaimer.<br />    Redistributions in binary form must reproduce the above copyright notice,<br />    this list of conditions and the following disclaimer in the documentation<br />    and/or other materials provided with the distribution.<br />    The name of Silas Parker may not be used to endorse or promote products<br />    derived from this software without specific prior written permission.<br /><br />THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND<br />ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED<br />WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE<br />DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE<br />FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL<br />DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,<br />OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br />OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br />*/<br /><br />#include &lt;LiquidCrystal.h&gt;<br />#include &lt;Servo.h&gt;<br /><br />const int SPEEDO_PIN      = A1;<br />const int RPM_PIN         = A0;<br />const int LO              = A2;<br />const int check           = A3;<br />const int Rew             = A4;<br />const int poz             = A5;<br />const int LEFT_INDICATOR  = 8;<br />const int RIGHT_INDICATOR = 9;<br />const int PARKING_BREAK   = 10;<br />const int FUEL_WARNING    = 11;<br />const int LOW_BEAM        = 12;<br />const int HIGH_BEAM       = 13;<br /><br />// Servo variables<br />Servo speedo;<br />Servo rpm;<br /><br /><br /><br />#define PACKET_SYNC 0xFF<br />#define PACKET_VER  2<br /><br />#define SERVO_DIR_NORMAL false<br />#define SERVO_DIR_INVERT true<br /><br />int serial_byte;<br /><br />LiquidCrystal lcd(28, 30, 38, 36, 34, 32);<br /><br />void setup()<br />{<br />  Serial.begin(115200);<br />  <br />  lcd.begin(16, 2);<br />  lcd.print(&quot;Self Test&quot;);<br />  <br />  // Initialise servos<br />  speedo.attach(SPEEDO_PIN);<br />  speedo.write(180);<br />  <br />  rpm.attach(RPM_PIN);<br />  rpm.write(180);<br />  <br />  // Initialise LEDs<br />  pinMode(LEFT_INDICATOR, OUTPUT);<br />  pinMode(RIGHT_INDICATOR, OUTPUT);<br />  pinMode(PARKING_BREAK, OUTPUT);<br />  pinMode(FUEL_WARNING, OUTPUT);<br />  pinMode(LOW_BEAM, OUTPUT);<br />  pinMode(HIGH_BEAM, OUTPUT);<br />  pinMode(LO, OUTPUT);<br />  pinMode(check, OUTPUT);<br />  pinMode(Rew, OUTPUT);<br />  pinMode(poz, OUTPUT);          <br /> <br />      <br />    <br />       <br />  <br />  digitalWrite(LEFT_INDICATOR, 0);<br />  digitalWrite(RIGHT_INDICATOR, 0);<br />  digitalWrite(PARKING_BREAK, 0);<br />  digitalWrite(FUEL_WARNING, 0);<br />  digitalWrite(LOW_BEAM, 0);<br />  digitalWrite(HIGH_BEAM, 0);<br />  digitalWrite(LO, 0);<br />  digitalWrite(check, 0);<br />  digitalWrite(Rew, 0);<br />  digitalWrite(poz, 0);<br />  <br />  delay(500);<br />  <br />  speedo.write(0);<br />  rpm.write(0);<br />  digitalWrite(LEFT_INDICATOR, 1);<br />  digitalWrite(RIGHT_INDICATOR, 1);<br />  digitalWrite(PARKING_BREAK, 1);<br />  digitalWrite(FUEL_WARNING, 1);<br />  digitalWrite(LOW_BEAM, 1);<br />  digitalWrite(HIGH_BEAM, 1);<br />  digitalWrite(LO, 1);<br />  digitalWrite(check, 1);<br />  digitalWrite(Rew, 1);<br />  digitalWrite(poz, 1);<br />  delay(500);<br />  <br />  speedo.write(180);<br />  rpm.write(180);<br />  digitalWrite(LEFT_INDICATOR, 0);<br />  digitalWrite(RIGHT_INDICATOR, 0);<br />  digitalWrite(PARKING_BREAK, 0);<br />  digitalWrite(FUEL_WARNING, 0);<br />  digitalWrite(LOW_BEAM, 0);<br />  digitalWrite(HIGH_BEAM, 0);<br />  digitalWrite(LO, 0);<br />  digitalWrite(check, 0);<br />  digitalWrite(Rew, 0);<br />  digitalWrite(poz, 0);<br />  <br />  lcd.clear();<br />  lcd.print(&quot;Wait&quot;);<br />  <br />  // Wait a second to ensure serial data isn't from re-programming <br />  delay(2500);<br />  lcd.clear();<br />  lcd.print(&quot;Ready&quot;);<br />}<br /><br /><br /><br />void read_serial_byte_set_servo(Servo&amp; servo, bool invert)<br />{<br />  serial_byte = Serial.read();<br />  serial_byte = (serial_byte &lt; 0) ? 0 : ((serial_byte &gt; 180) ? 180 : serial_byte);<br />  if (invert)<br />    servo.write(180 - serial_byte);<br />  else<br />    servo.write(serial_byte);<br />}<br /><br />void skip_serial_byte()<br />{<br />  (void)Serial.read();<br />}<br /><br />void digitalWriteFromBit(int port, int value, int shift)<br />{<br />  digitalWrite(port, (value &gt;&gt; shift) &amp; 0x01);<br />}<br /><br />void loop()<br />{<br />  if (Serial.available() &lt; 16)<br />    return;<br />  <br />  serial_byte = Serial.read();<br />  if (serial_byte != PACKET_SYNC)<br />    return;<br />    <br />  serial_byte = Serial.read();<br />  if (serial_byte != PACKET_VER)<br />  {<br />    lcd.clear();<br />    lcd.print(&quot;PROTOCOL VERSION ERROR&quot;);<br />    return;<br />  }<br />  <br />  read_serial_byte_set_servo(speedo, SERVO_DIR_INVERT); // Speed  <br />  read_serial_byte_set_servo(rpm, SERVO_DIR_INVERT); // RPM<br />  <br />  skip_serial_byte(); // Brake air pressure<br />  skip_serial_byte(); // Brake temperature<br />  skip_serial_byte(); // Fuel ratio<br />  skip_serial_byte(); // Oil pressure<br />  skip_serial_byte(); // Oil temperature<br />  skip_serial_byte(); // Water temperature<br />  skip_serial_byte(); // Battery voltage<br />    <br />  <br />  // Truck lights byte<br />  serial_byte = Serial.read();<br />  digitalWriteFromBit(poz,  serial_byte, 6);  <br />  digitalWriteFromBit(LEFT_INDICATOR,  serial_byte, 5);  <br />  digitalWriteFromBit(RIGHT_INDICATOR, serial_byte, 4);<br />  digitalWriteFromBit(LOW_BEAM, serial_byte, 3); <br />  digitalWriteFromBit(HIGH_BEAM, serial_byte, 2); <br />  digitalWriteFromBit(Rew, serial_byte, 0); <br />  // Warning lights bytes<br /><br />  serial_byte = Serial.read();  <br />  digitalWriteFromBit(PARKING_BREAK, serial_byte, 7);<br />  digitalWriteFromBit(LO, serial_byte, 5); <br />  digitalWriteFromBit(check, serial_byte, 6); <br />  digitalWriteFromBit(FUEL_WARNING, serial_byte, 3);  <br />  <br /> <br />  // Enabled flags<br />  serial_byte = Serial.read();<br />  <br />  // Text length<br />  int text_len = Serial.read();<br />  <br />  // Followed by text<br />  if (0 &lt; text_len &amp;&amp; text_len &lt; 127)<br />  {<br />    lcd.clear();<br />    for (int i = 0; i &lt; text_len; ++i)<br />    {<br />      while (Serial.available() == 0) // Wait for data if slow<br />      {<br />        delay(2);<br />      }<br />      serial_byte = Serial.read();<br />      if (serial_byte &lt; 0 &amp;&amp; serial_byte &gt; 127)<br />        return;<br />      <br />      if (serial_byte == '\n')<br />        lcd.setCursor(0, 1);<br />      else<br />        lcd.print(char(serial_byte));<br />//      delay(2);<br />    }<br />  }<br />  <br />}[/syntax]<br /><br /><br />Wersja z CAN BUS i wyświetlaczem:<br />[syntax=cpp]/*<br />Copyright (c) 2013, Silas Parker<br />All rights reserved.<br /><br />Redistribution and use in source and binary forms, with or without modification,<br />are permitted provided that the following conditions are met:<br /><br />    Redistributions of source code must retain the above copyright notice, this<br />    list of conditions and the following disclaimer.<br />    Redistributions in binary form must reproduce the above copyright notice,<br />    this list of conditions and the following disclaimer in the documentation<br />    and/or other materials provided with the distribution.<br />    The name of Silas Parker may not be used to endorse or promote products<br />    derived from this software without specific prior written permission.<br /><br />THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND<br />ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED<br />WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE<br />DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE<br />FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL<br />DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,<br />OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br />OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br />*/<br /><br />/*<br />Source Code modified by Leon Bataille under the above mentioned license.<br />2015<br />*/<br /><br /><br /><br />#include &lt;mcp_can.h&gt;<br />#include &lt;SPI.h&gt;<br />#include &lt;Servo.h&gt;<br />#include &lt;Wire.h&gt;<br />#include &lt;LiquidCrystal.h&gt;<br /><br />#define lo8(x) ((int)(x)&amp;0xff)<br />#define hi8(x) ((int)(x)&gt;&gt;8)<br /><br />//Sketch information #DO NOT REMOVE!<br />String game = &quot;Euro Truck Sim 2&quot;;<br />String vendor = &quot;Leon Bataille&quot;;<br />//END Sketch information<br /><br /><br />//const int SPEEDO_PIN      = A1;<br />//const int RPM_PIN         = A0;<br />const int LEFT_INDICATOR  = 40;<br />const int RIGHT_INDICATOR = 42;<br />const int PARKING_BREAK   = 44;<br />const int FUEL_WARNING    = 46;<br />// Servo variables<br />Servo speedo;<br />Servo rpm;<br />Servo fuel;<br /><br />int fernlicht = 48;<br />int nebellicht = 50;<br />int bremse = 52;<br /><br />int engine_rpm;<br />boolean hgb = false;<br />int blinker;<br />int temp;<br />float engine_fuel;<br /><br />#define PACKET_SYNC 0xFF<br />#define PACKET_VER  2<br /><br />#define SERVO_DIR_NORMAL true<br />#define SERVO_DIR_INVERT false<br /><br />int speed ;<br /><br />int serial_byte;<br /><br />const int SPI_CS_PIN = 10;<br /><br />MCP_CAN CAN(SPI_CS_PIN);// Set CS pin<br /><br />LiquidCrystal lcd(28, 30, 38, 36, 34, 32);<br />void setup()<br />{<br /> <br />  pinMode(fernlicht, OUTPUT);<br />  pinMode(nebellicht, OUTPUT); <br />  pinMode(bremse, OUTPUT);<br /><br />  Serial.begin(115200);<br />  // Initialise LEDs<br />  pinMode(LEFT_INDICATOR, OUTPUT);<br />  pinMode(RIGHT_INDICATOR, OUTPUT);<br />  pinMode(PARKING_BREAK, OUTPUT);<br />  pinMode(FUEL_WARNING, OUTPUT);<br />  <br />  digitalWrite(LEFT_INDICATOR, 0);<br />  digitalWrite(RIGHT_INDICATOR, 0);<br />  digitalWrite(PARKING_BREAK, 0);<br />  digitalWrite(FUEL_WARNING, 0);<br />  // Wait a second to ensure serial data isn't from re-programming <br />  delay(1000);<br />  <br /><br />  <br />  lcd.begin(16, 2);<br />  lcd.clear();<br />  lcd.setCursor(0,0);<br />  lcd.print(&quot;Uruchamianie&quot;);<br />  lcd.setCursor(0,1);<br />  lcd.print(&quot;systemu...&quot;); <br />  START_INIT:<br /><br />    if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k<br />    {<br />        Serial.println(&quot;CAN BUS Shield uruchomiono poprawnie!&quot;);<br />    }<br />    else<br />    {<br />        Serial.println(&quot;Błąd uruchomienia CAN BUS Shield&quot;);<br />        Serial.println(&quot;Uruchom CAN BUS Shield ponownie&quot;);<br />        delay(100);<br />        goto START_INIT;<br />    }<br />    <br />    //Tachotest RPM<br />   unsigned char stmp59&#91;8&#93; ={0x4A, 0x4A, 0xFF, 0xFF, 0x5D, 0xFF, 0xFF, 0xFF};<br />    CAN.sendMsgBuf(0x201, 8, 8, stmp59);<br /> <br />    unsigned char stmp12&#91;8&#93; = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};<br />        CAN.sendMsgBuf(0x420, 2, 8, stmp12);<br /><br /><br />  delay(3000);  <br />  lcd.clear();<br />  lcd.print(&quot;Prosze czekac&quot;);<br />  <br />  // Wait a second to ensure serial data isn't from re-programming <br />  delay(2500);<br />  lcd.clear();<br />  lcd.print(&quot;Gotowy&quot;);<br /> <br />}<br /><br /><br /><br /><br /><br />void read_serial_byte_set_servo(Servo&amp; servo, bool invert)<br />{<br />  <br />  serial_byte = Serial.read();<br />  serial_byte = (serial_byte &lt; 0) ? 0 : ((serial_byte &gt; 180) ? 180 : serial_byte);<br />  //Tempo<br />    if (invert) {<br />      speed = serial_byte * 0.55;//(180 * 0.6 - serial_byte * -0.6)-110;<br />      }<br />    else {<br />      speed = (serial_byte * 0.6)-110;<br />      }<br /> //     servo.write(180 - serial_byte);<br />    <br />        <br />      if (speed&gt; 1) {<br />          //KMH aktualisieren<br />          for(int i=0;i&lt;5;i++){<br />            unsigned char stmp&#91;8&#93; = {speed,0,0,0,0,0,0,0};<br />            CAN.sendMsgBuf(0x201, 4, 16, stmp);<br />               unsigned char stmp25&#91;8&#93; = {0x78, 0x00, 0x59, 0xFF, 0xC0, 0x00, 0x20,0x51};<br />        CAN.sendMsgBuf(0x430, 4, 16, stmp25);<br /><br />            }<br />            }<br />            /*<br />            //Wenn Nadel auf 0 geht, KMH neu schreiben<br />            FreqCounter::f_comp= 8;             // Kompensation einstellen<br />            FreqCounter::start(100);           // Zähler starten für 1000ms<br />            while (FreqCounter::f_ready == 0)   // warten bis der Zähler fertig ist<br />            freq=FreqCounter::f_freq;           // Ergebnis lesen<br />            freq=freq*10; <br />            <br />            */           <br />          else{<br />            unsigned char stmp&#91;8&#93; = {speed,0,0,0,0,0,0,0};<br />            CAN.sendMsgBuf(0x201, 4, 16, stmp);<br />     unsigned char stmp21&#91;8&#93; = {0x91, 0x00, 0x59, 0xFF, 0xC0, 0x00, 0x20,0x51};<br />        CAN.sendMsgBuf(0x430, 4, 16, stmp21);<br />            }<br />     <br /><br />     <br />}<br />void read_serial_byte_set_servo2(Servo&amp; servo, bool invert){<br />  serial_byte = Serial.read();<br />  serial_byte = (serial_byte &lt; 0) ? 0 : ((serial_byte &gt; 180) ? 180 : serial_byte);<br />  <br />  //RPM<br />  if (invert){<br />      //servo.write(180 - serial_byte);<br />      engine_rpm = (180 * 0.5 - serial_byte * -0.5)-90;  <br />      unsigned char stmp4&#91;&#93; = {1,0,0,0,engine_rpm,0,0,0}; <br /> CAN.sendMsgBuf(0x201, 0, 8, stmp4);<br />     unsigned char stmp1&#91;8&#93; = {0x59, 0x00, 0x59, 0xFF, 0xC0, 0x00, 0x20,0x51};<br />        CAN.sendMsgBuf(0x420, 4, 16, stmp1);<br />      <br />      <br />      }<br />    else{<br />      //servo.write(serial_byte);<br />     engine_rpm = (serial_byte * 0.5)-90;  <br />      unsigned char stmp4&#91;&#93; = {1,0,0,0,engine_rpm,0,0,0};<br />      CAN.sendMsgBuf(0x201, 0, 8, stmp4);<br />    unsigned char stmp1&#91;8&#93; = {0x59, 0x00, 0x59, 0xFF, 0xC0, 0x00, 0x20,0x51};<br />        CAN.sendMsgBuf(0x420, 4, 16, stmp1);<br />        }<br />  }<br />  <br />void read_serial_byte_set_servo_fuel(Servo&amp; servo, bool invert)<br />{<br />  serial_byte = Serial.read();<br />  serial_byte = (serial_byte &lt; 0) ? 0 : ((serial_byte &gt; 180) ? 180 : serial_byte);<br />  if (invert){<br />   engine_fuel = (180+serial_byte);<br />    //servo.write(85 - serial_byte); //set lower than the tach and speedo to limit movement.<br />     unsigned char stmp12&#91;&#93; = {engine_fuel,0,0,0,0,0,0,0}; <br />     CAN.sendMsgBuf(0x420, 0, 8, stmp12);<br />  }<br />  else {<br />    //servo.write(serial_byte);<br />    engine_fuel = (180-serial_byte);<br />    unsigned char stmp12&#91;&#93; = {engine_fuel,0,0,0,0,0,0,0}; <br />     CAN.sendMsgBuf(0x420, 0, 8, stmp12);<br />}<br />}<br />    <br /><br />void skip_serial_byte()<br />{<br />  (void)Serial.read();<br />}<br /><br />void digitalWriteFromBit(int port, int value, int shift)<br />{<br />  //int portnumber = port;<br />  digitalWrite(port, (value &gt;&gt; shift) &amp; 0x01);<br />  <br />  if ((analogRead(2) &lt; 350) &amp;&amp; (analogRead(3) &lt; 350)) {<br />    //kein Blinker<br />    blinker = 0;<br />    <br />    }<br />  else if ((analogRead(2) &gt; 350) &amp;&amp; (analogRead(3) &lt; 350)) {<br />    //linker Blinker<br />    blinker = 1;<br />    <br />    }<br />  else if ((analogRead(3) &gt; 350) &amp;&amp; (analogRead(2) &lt; 350 )){<br />    //rechter Blinker<br />    blinker = 2;<br />    <br />    }<br />  else if ((analogRead(3) &gt; 350) &amp;&amp; (analogRead(2) &gt; 350 )){<br />    //Warnblinker<br />    blinker = 3;<br />    }<br />    <br />    unsigned char stmp15&#91;&#93; = {blinker,0,hgb,0,0,0,0,0}; //1,0 = links; 2,0 = rechts; 3,0 = Warn<br />    CAN.sendMsgBuf(0x470, 0, 8, stmp15);<br />  <br />   <br />}<br /><br />void loop()<br />{<br />   /*  unsigned char stmp&#91;8&#93; = {0x76, 0x00, 0x59, 0xFF, 0xC0, 0x00, 0x20,0x51};<br />        CAN.sendMsgBuf(0x420, 4, 16, stmp);<br />        */<br />  if (Serial.available() &lt; 16)<br />    return;<br />  <br />  serial_byte = Serial.read();<br />  if (serial_byte != PACKET_SYNC)<br />    return;<br />    <br />  serial_byte = Serial.read();<br />  if (serial_byte != PACKET_VER)<br /> <br /><br /> <br />  <br />  read_serial_byte_set_servo(speedo, SERVO_DIR_NORMAL); // Speed  <br />  read_serial_byte_set_servo2(rpm, SERVO_DIR_NORMAL); // RPM<br />  delay(30);<br />  <br />  skip_serial_byte(); // Brake air pressure<br />  skip_serial_byte(); // Brake temperature<br />read_serial_byte_set_servo_fuel(fuel, SERVO_DIR_INVERT); // Fuel ratio<br /> skip_serial_byte(); // Oil temperature<br />  skip_serial_byte(); //Water temperature<br />  skip_serial_byte(); // Battery voltage<br />    <br />  <br />  // Truck lights byte<br />  serial_byte = Serial.read();<br />  <br />  digitalWriteFromBit(LEFT_INDICATOR,  serial_byte, 5);  <br /><br />  digitalWriteFromBit(RIGHT_INDICATOR, serial_byte, 4);<br />  <br />  // Warning lights bytes<br /><br />  serial_byte = Serial.read();  <br />  digitalWriteFromBit(PARKING_BREAK, serial_byte, 7);<br />  digitalWriteFromBit(FUEL_WARNING, serial_byte, 3);  <br />   // Enabled flags<br />  serial_byte = Serial.read();<br />  <br />  // Text length<br />  int text_len = Serial.read();<br />  <br /> if (0 &lt; text_len &amp;&amp; text_len &lt; 127)<br />  {<br />    lcd.clear();<br />    for (int i = 0; i &lt; text_len; ++i)<br />    {<br />      while (Serial.available() == 0) // Wait for data if slow<br />         serial_byte = Serial.read();<br />      if (serial_byte &lt; 0 &amp;&amp; serial_byte &gt; 127)<br />        return;<br />      <br />      if (serial_byte == '\n')<br />        lcd.setCursor(0, 1);<br />      else<br />        lcd.write(char(serial_byte));<br />      <br />delay(5);<br />    }<br />  }<br /><br /><br /><br /><br />}[/syntax]<br />Plik obsługujący port szeregowy(.cpp jeden z elementów biblioteki .dll, gotowy do skompilowania)<br />[syntax=cpp]/*<br />Copyright (c) 2013, Silas Parker<br />All rights reserved.<br /><br />Redistribution and use in source and binary forms, with or without modification,<br />are permitted provided that the following conditions are met:<br /><br />    Redistributions of source code must retain the above copyright notice, this<br />    list of conditions and the following disclaimer.<br />    Redistributions in binary form must reproduce the above copyright notice,<br />    this list of conditions and the following disclaimer in the documentation<br />    and/or other materials provided with the distribution.<br />    The name of Silas Parker may not be used to endorse or promote products<br />    derived from this software without specific prior written permission.<br /><br />THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND<br />ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED<br />WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE<br />DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE<br />FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL<br />DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,<br />OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br />OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br />*/<br /><br />#include &quot;serial.hpp&quot;<br /><br />Serial::Serial() : com_port(INVALID_HANDLE_VALUE)<br />{}<br /><br />Serial::~Serial()<br />{<br />  close();<br />}<br /><br />bool Serial::is_valid() const<br />{<br />  return com_port != INVALID_HANDLE_VALUE;<br />}<br /><br />bool Serial::open(const std::string&amp; name, std::string&amp; errmsg)<br />{<br />  bool retval = false;<br />  DCB config;<br />  <br />  errmsg.clear();<br />  <br />  // If port already open, ignore call<br />  if (com_port != INVALID_HANDLE_VALUE)<br />  {<br />    errmsg = &quot;COM port already open&quot;;<br />    goto exit; <br />  }<br />  <br />  // Open COM port<br />  com_port = CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL,<br />    OPEN_EXISTING, 0, NULL);<br />  if (com_port == INVALID_HANDLE_VALUE)<br />  {<br />    errmsg = &quot;Can not open COM port&quot;;<br />    goto exit;<br />  }<br />  <br />  // Get current config<br />  config.DCBlength = sizeof(config);<br />  if (!GetCommState(com_port, &amp;config))<br />  {<br />    errmsg = &quot;Can not get COM port config&quot;;<br />    goto exit;<br />  }<br />  <br />  // Set defaults<br />  config.BaudRate = CBR_115200;<br />  config.StopBits = ONESTOPBIT;<br />  config.Parity =   NOPARITY;<br />  config.ByteSize = 8;<br />  <br />  // Set config<br />  if (!SetCommState(com_port, &amp;config))<br />  {<br />    errmsg = &quot;Can not set COM port config&quot;;<br />    goto exit;<br />  }<br />  <br />  retval = true;<br /><br />exit:<br />  if (retval == false)<br />  {<br />    close();<br />  }<br />  return retval;<br />}<br /><br />void Serial::close()<br />{<br />  if (com_port != INVALID_HANDLE_VALUE)  <br />  {<br />    CloseHandle(com_port);<br />    com_port = INVALID_HANDLE_VALUE;<br />  }<br />}<br /><br />void Serial::write(const unsigned char* data, unsigned length)<br />{<br />  if (data == 0 || length == 0)<br />    return;<br /><br />  if (com_port != INVALID_HANDLE_VALUE)  <br />  {<br />    unsigned long wrote;<br />    WriteFile(com_port, data, length, &amp;wrote, NULL);<br />    FlushFileBuffers(com_port);<br />  }<br />}[/syntax]<br /><br /><br /><br /><br /><br />I główny plik plugin'u(plik .cpp gotowy do skompilowania do biblioteki .dll):<br />[syntax=cpp]/*<br />Copyright (c) 2013, Silas Parker<br />All rights reserved.<br /><br />Redistribution and use in source and binary forms, with or without modification,<br />are permitted provided that the following conditions are met:<br /><br />    Redistributions of source code must retain the above copyright notice, this<br />    list of conditions and the following disclaimer.<br />    Redistributions in binary form must reproduce the above copyright notice,<br />    this list of conditions and the following disclaimer in the documentation<br />    and/or other materials provided with the distribution.<br />    The name of Silas Parker may not be used to endorse or promote products<br />    derived from this software without specific prior written permission.<br /><br />THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND<br />ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED<br />WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE<br />DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE<br />FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL<br />DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,<br />OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br />OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br />*/<br /><br /><br />#define WINVER 0x0500<br />#define _WIN32_WINNT 0x0500<br />#include &lt;windows.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;assert.h&gt;<br />#include &lt;stdarg.h&gt;<br />#include &lt;sstream&gt;<br /><br />#include &lt;scssdk_telemetry.h&gt;<br />#include &lt;eurotrucks2/scssdk_telemetry_eut2.h&gt;<br /><br />#include &quot;serial.hpp&quot;<br />#include &quot;options.hpp&quot;<br /><br />static const float METERS_PER_SEC_TO_MILES_PER_HOUR = 2.2369f;<br />static const float METERS_PER_SEC_TO_KM_PER_HOUR = 3.6f;<br /><br />// Game log file<br />scs_log_t game_log = NULL;<br /><br />// COM port file<br />Serial serial_port;<br /><br />unsigned long last_update = 0;<br /><br />// Packet<br />#define PACKET_MAX_SIZE 720 // Can send a maximum of 720 bytes per frame at 20 FPS over a 115200 bps line<br />#define PACKET_SYNC 0xFF<br />#define PACKET_VER  2<br /><br />unsigned char packet&#91;PACKET_MAX_SIZE&#93;;<br /><br /><br />#define PACKBOOL(A,B,C,D,E,F,G,H) \<br />  (((unsigned char)(A) &lt;&lt; 7) | ((unsigned char)(B) &lt;&lt; 6) | \<br />  ((unsigned char)(C) &lt;&lt; 5) | ((unsigned char)(D) &lt;&lt; 4) | \<br />  ((unsigned char)(E) &lt;&lt; 3) | ((unsigned char)(F) &lt;&lt; 2) | \<br />  ((unsigned char)(G) &lt;&lt; 1) | ((unsigned char)(H)))<br /><br /><br />// Telemetry data<br />struct telemetry_state_t<br />{<br />  float speed; // Meters per Second<br />    float   engine_rpm; // RPM<br /><br />  int   engine_gear; // &gt;0 Forward, 0 Neutral, &lt;0 Reverse<br />  <br />  bool  parking_brake;<br />  bool  motor_brake;<br />  <br />  float brake_air_pressure; // PSI<br />  bool  brake_air_pressure_warning;<br />  bool  brake_air_pressure_emergency;<br />  float brake_temperature;<br />  <br />  float fuel; // Liters<br />  bool  fuel_warning;<br />  float fuel_average_consumption; // Liters / KM<br />  float fuel_capacity; // Liters<br />    <br />  float oil_pressure; // PSI<br />  bool  oil_pressure_warning;<br />  float oil_temperature; // Celsius<br />  <br />  float water_temperature; // Celsius<br />  bool  water_temperature_warning;<br />  <br />  float battery_voltage; // Volts<br />  bool  battery_voltage_warning;<br />  <br />  bool  electric_enabled;<br />  bool  engine_enabled;<br />  <br />  bool  light_lblinker;<br />  bool  light_rblinker;<br />  bool  light_parking;<br />  bool  light_low_beam;  // Dipped headlights<br />  bool  light_high_beam; // Full headlights<br />  bool  light_brake;<br />  bool  light_reverse;<br /><br />  float odometer; // Kilometres<br />  <br />} telemetry;<br /><br /><br />Options option_file;<br /><br /><br />unsigned char float_to_byte(float value)<br />{<br />  return<br />    (value &gt; 254.0f) ? 254 : // Sync byte is 255 so avoid that<br />    ((value &lt; 0.0f) ? 0 :<br />    (unsigned char)(value));<br />}<br /><br />void send_empty_packet()<br />{<br />  memset(packet, 0, PACKET_MAX_SIZE); <br />  packet&#91;0&#93; = PACKET_SYNC;<br />  packet&#91;1&#93; = PACKET_VER;<br />  <br />  serial_port.write(packet, 16);<br />}<br /><br />SCSAPI_VOID telemetry_frame_end(const scs_event_t /*event*/, const void *const /*event_info*/, const scs_context_t /*context*/)<br />{<br />  if (!serial_port.is_valid())<br />    return;<br />    <br />  const unsigned long now = GetTickCount();<br />  const unsigned long diff = now - last_update;<br />  if (diff &lt; 50)<br />    return;<br />    <br />  last_update = now;<br />  <br />  const float speed_mph = telemetry.speed * METERS_PER_SEC_TO_MILES_PER_HOUR;<br />  const float speed_kph = telemetry.speed * METERS_PER_SEC_TO_KM_PER_HOUR;<br />  <br />  const float fuel_ratio = telemetry.fuel /  telemetry.fuel_capacity;<br />  <br /><br />  <br />  unsigned idx = 0;<br />  <br />  memset(packet, 0, PACKET_MAX_SIZE);<br />  <br />#define PUT_BYTE(X) packet&#91;idx++&#93; = (unsigned char)(X)<br />#define PUT_BYTE_FLOAT(X) packet&#91;idx++&#93; = (unsigned char)(float_to_byte(X))<br />#define GETFLTOPT(X) (option_file.get_option_float(X, 1.0f))<br />  <br />  // Packet header<br />  PUT_BYTE(PACKET_SYNC);<br />  PUT_BYTE(PACKET_VER);<br />  <br />  // Convert data for output by servos<br />  // Adjust the constant values to map to servo range<br />  <br />  PUT_BYTE_FLOAT(fabs(telemetry.speed) *        GETFLTOPT(&quot;factor_speed&quot;)); // Absolute value for when reversing<br />  PUT_BYTE_FLOAT(telemetry.engine_rpm *         GETFLTOPT(&quot;factor_engine_rpm&quot;));<br />  PUT_BYTE_FLOAT(telemetry.brake_air_pressure * GETFLTOPT(&quot;factor_brake_air_pressure&quot;));<br />  PUT_BYTE_FLOAT(telemetry.brake_temperature *  GETFLTOPT(&quot;factor_brake_temperature&quot;));<br />  PUT_BYTE_FLOAT(fuel_ratio *                   GETFLTOPT(&quot;factor_fuel_ratio&quot;)); // Fuel level<br />  PUT_BYTE_FLOAT(telemetry.oil_pressure *       GETFLTOPT(&quot;factor_oil_pressure&quot;));<br />  PUT_BYTE_FLOAT(telemetry.oil_temperature *    GETFLTOPT(&quot;factor_oil_temperature&quot;));<br />  PUT_BYTE_FLOAT(telemetry.water_temperature *  GETFLTOPT(&quot;factor_water_temperature&quot;));<br />  PUT_BYTE_FLOAT(telemetry.battery_voltage *    GETFLTOPT(&quot;factor_battery_voltage&quot;));<br />  <br />  <br />  // Pack data for LEDs into bytes<br />  <br />  // Truck lights<br />  PUT_BYTE(PACKBOOL(<br />    0, telemetry.light_parking,<br />    telemetry.light_lblinker, telemetry.light_rblinker,<br />    telemetry.light_low_beam, telemetry.light_high_beam,<br />    telemetry.light_brake, telemetry.light_reverse));<br />    <br />  // Warning lights<br />  PUT_BYTE(PACKBOOL(<br />    telemetry.parking_brake, telemetry.motor_brake,<br />    telemetry.brake_air_pressure_warning, telemetry.brake_air_pressure_emergency,<br />    telemetry.fuel_warning, telemetry.battery_voltage_warning,<br />    telemetry.oil_pressure_warning, telemetry.water_temperature_warning));<br />  <br />  // Enabled flags<br />  PUT_BYTE(PACKBOOL(<br />    0,0,0,0,0, 0,<br />    telemetry.electric_enabled, telemetry.engine_enabled));<br />    <br /><br />  // Build string for LCD display<br />    <br />  std::stringstream ss;<br />  if (telemetry.engine_gear &gt; 0)<br />     <br />  {<br />ss &lt;&lt;&quot;D&quot;;<br />ss.width(2);<br />ss &lt;&lt; telemetry.engine_gear;<br />     <br />  }<br />  else if (telemetry.engine_gear == 0)<br />  {<br /> ss &lt;&lt;&quot;N&quot;;<br />  }<br />  else<br />  {<br />  ss &lt;&lt;&quot;R&quot;;<br />    ss.width(2);<br />    ss &lt;&lt; abs(telemetry.engine_gear);<br />  }<br />  <br />  ss &lt;&lt; &quot;\n&quot;;<br />   ss.width(3);<br />  ss &lt;&lt; int(fuel_ratio * 100.0f) &lt;&lt; &quot;% &quot;;<br />  <br />  <br />  ss.width(3);<br />  ss &lt;&lt; abs(int(speed_kph));<br />  ss.width(4);<br />  ss &lt;&lt; &quot;km/h&quot;;<br />  std::string display_str(ss.str());<br />  <br />  // Write length of string<br />  PUT_BYTE(display_str.size());<br />  // Followed by string<br />  display_str.copy((char*)&amp;packet&#91;idx&#93;, PACKET_MAX_SIZE - idx);<br />  idx += display_str.size();<br />  <br />  <br />  serial_port.write(packet, idx);<br />}<br /><br /><br /><br /><br /><br /><br />SCSAPI_VOID telemetry_store_float(const scs_string_t /*name*/, const scs_u32_t /*index*/, const scs_value_t *const value, const scs_context_t context)<br />{<br />    assert(value);<br />    assert(value-&gt;type == SCS_VALUE_TYPE_float);<br />    assert(context);<br />    *static_cast&lt;float *&gt;(context) = value-&gt;value_float.value;<br />}<br /><br />SCSAPI_VOID telemetry_store_bool(const scs_string_t /*name*/, const scs_u32_t /*index*/, const scs_value_t *const value, const scs_context_t context)<br />{<br />    assert(value);<br />    assert(value-&gt;type == SCS_VALUE_TYPE_bool);<br />    assert(context);<br />    *static_cast&lt;bool *&gt;(context) = (value-&gt;value_bool.value != 0);<br />}<br /><br />SCSAPI_VOID telemetry_store_s32(const scs_string_t /*name*/, const scs_u32_t /*index*/, const scs_value_t *const value, const scs_context_t context)<br />{<br />    assert(value);<br />    assert(value-&gt;type == SCS_VALUE_TYPE_s32);<br />    assert(context);<br />    *static_cast&lt;int *&gt;(context) = value-&gt;value_s32.value;<br />}<br /><br />SCSAPI_VOID telemetry_configuration(const scs_event_t /*event*/, const void *const event_info, const scs_context_t /*context*/)<br />{<br />  const struct scs_telemetry_configuration_t *const info = static_cast&lt;const scs_telemetry_configuration_t *&gt;(event_info);<br />  <br />  for (const scs_named_value_t *current = info-&gt;attributes; current-&gt;name; ++current)<br />  {<br />  <br />#define GET_CONFIG(PROPERTY, TYPE) \<br />  if (strcmp(SCS_TELEMETRY_CONFIG_ATTRIBUTE_ ## PROPERTY, current-&gt;name) == 0) \<br />  { telemetry.PROPERTY = current-&gt;value.value_ ## TYPE.value; }<br />  <br />    GET_CONFIG(fuel_capacity, float);<br />    <br />  }<br />}<br /><br />void get_cwd(std::string&amp; str)<br />{<br />  char buffer&#91;256&#93;;<br />  GetCurrentDirectory(256, buffer);<br />  str.assign(buffer);<br />}<br /><br />SCSAPI_RESULT scs_telemetry_init(const scs_u32_t version, const scs_telemetry_init_params_t *const params)<br />{<br />    if (version != SCS_TELEMETRY_VERSION_1_00) {<br />        return SCS_RESULT_unsupported;<br />    }<br /><br />    const scs_telemetry_init_params_v100_t *const version_params = static_cast&lt;const scs_telemetry_init_params_v100_t *&gt;(params);<br />  game_log = version_params-&gt;common.log;<br />  <br />  game_log(SCS_LOG_TYPE_message, &quot;Plugin initialising&quot;);<br />  <br />  std::string cwd;<br />  get_cwd(cwd);<br />  <br />  game_log(SCS_LOG_TYPE_message, (std::string(&quot;Plugin CWD: &quot;) + cwd).c_str());<br />  <br />  std::string option_filepath(cwd + &quot;\\plugins\\dash_plugin.txt&quot;);<br />  if (!option_file.read_file(option_filepath))<br />  {<br />    game_log(SCS_LOG_TYPE_error, (std::string(&quot;Error reading settings file: &quot;) + option_filepath).c_str());<br />    return SCS_RESULT_generic_error;<br />  }<br />  <br />  const std::string com_port = option_file.get_option_string(&quot;comport&quot;, &quot;COM3&quot;);<br />  game_log(SCS_LOG_TYPE_message, (std::string(&quot;Using serial port: &quot;) + com_port).c_str());<br />  <br />  // Open COM port<br />  std::string errmsg;<br />  if (!serial_port.open(com_port, errmsg))<br />  {<br />    game_log(SCS_LOG_TYPE_error, errmsg.c_str());<br />    return SCS_RESULT_generic_error;<br />  }<br />    <br />  send_empty_packet();<br />  <br />  // Register for in game events<br />  bool registered =<br />    (version_params-&gt;register_for_event(<br />      SCS_TELEMETRY_EVENT_frame_end, telemetry_frame_end, NULL) == SCS_RESULT_ok) &amp;&amp;<br />    (version_params-&gt;register_for_event(<br />      SCS_TELEMETRY_EVENT_configuration, telemetry_configuration, NULL) == SCS_RESULT_ok);<br />  <br />  // Register for truck channels<br />  <br />#define REG_CHAN(CHANNEL, TYPE) \<br />  registered &amp;= (version_params-&gt;register_for_channel( \<br />  SCS_TELEMETRY_TRUCK_CHANNEL_ ## CHANNEL, SCS_U32_NIL, SCS_VALUE_TYPE_ ## TYPE, \<br />  SCS_TELEMETRY_CHANNEL_FLAG_none, telemetry_store_ ## TYPE, &amp;telemetry.CHANNEL) == SCS_RESULT_ok)<br />  <br />  REG_CHAN(speed,                         float);<br />  REG_CHAN(engine_rpm,                    float);<br />  REG_CHAN(engine_gear,                   s32);<br />  REG_CHAN(parking_brake,                 bool);<br />  REG_CHAN(motor_brake,                   bool);<br />  REG_CHAN(brake_air_pressure,            float);<br />  REG_CHAN(brake_air_pressure_warning,    bool);<br />  REG_CHAN(brake_air_pressure_emergency,  bool);<br />  REG_CHAN(brake_temperature,             float);<br />  REG_CHAN(fuel,                          float);<br />  REG_CHAN(fuel_warning,                  bool);<br />  REG_CHAN(fuel_average_consumption,      float);<br />  REG_CHAN(oil_pressure,                  float);<br />  REG_CHAN(oil_pressure_warning,          bool);<br />  REG_CHAN(oil_temperature,               float);<br />  REG_CHAN(water_temperature,             float);<br />  REG_CHAN(water_temperature_warning,     bool);<br />  REG_CHAN(battery_voltage,               float);<br />  REG_CHAN(battery_voltage_warning,       bool);<br />  REG_CHAN(electric_enabled,              bool);<br />  REG_CHAN(engine_enabled,                bool);<br />  REG_CHAN(light_lblinker,                bool);<br />  REG_CHAN(light_rblinker,                bool);<br />  REG_CHAN(light_parking,                 bool);<br />  REG_CHAN(light_low_beam,                bool);<br />  REG_CHAN(light_high_beam,               bool);<br />  REG_CHAN(light_brake,                   bool);<br />  REG_CHAN(light_reverse,                 bool);<br />  REG_CHAN(odometer,                      float);<br />  <br /><br />  if (!registered)<br />  {<br />    game_log(SCS_LOG_TYPE_error, &quot;Unable to register callbacks&quot;);<br />        return SCS_RESULT_generic_error;<br />  }<br />  <br />  memset(&amp;telemetry, 0, sizeof(telemetry));<br />  <br />  return SCS_RESULT_ok;<br />}<br /><br />SCSAPI_VOID scs_telemetry_shutdown(void)<br />{<br />  send_empty_packet();<br />  serial_port.close();<br /><br />  game_log(SCS_LOG_TYPE_message, &quot;Plugin shutdown&quot;);<br />    game_log = NULL;<br />}<br /><br />BOOL APIENTRY DllMain(HMODULE /*module*/, DWORD reason_for_call, LPVOID /*reseved*/)<br />{<br />  if (reason_for_call == DLL_PROCESS_DETACH)<br />  {<br />        serial_port.close();<br />    }<br />    return TRUE;<br />}[/syntax]<br />Pliki przeznaczone powyżej(oprócz szkiców) są przeznaczone do kompilacji do biblioteki .dll, która to później obsługuje telemetrię i przesyłanie danych do Arduino.<br /><br /><br />Jeśli byłby ktoś miły nakierować mnie na właściwą drogę do rozwiązania mojego problemu, będę wdzięczny.<br />Nie znalazłem też pomocy w wyszukiwarce, proszę o wyrozumiałość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17458">MajkyyM</a> — 28 cze 2017, o 17:58</p><hr />
]]></content>
</entry>
</feed>