JetiExBus Library verbessertes Interface

Hallo!

Ich habe das User Interface für die Library erweitert:

In der Deklaration der Sensoren kommt jetzt der Parameter priority hinzu.
Der bewirkt, dass der Wert erst nach N mal Durchlaufen aller Sensoren
übertragen wird, wobei N der Prio-Wert ist.

Beispiel:
C++:
// Attention! parameter priority added. Value will be send after every N times of completed sets
// of all sensors are sent. Where N is priority.
JETISENSOR_CONST sensors[] PROGMEM = {
    //id,           name,            unit,               dataType, precision, priority
    { ID_CLIMB,     "Vario",         "m/s",  JetiSensor::TYPE_14b, 2,          0 },
    { ID_ALTITUDE,  "AltRelat.",     "m",    JetiSensor::TYPE_14b, 1,          4 },
#ifdef GPS
    { ID_GPSLON,    "GPS Longitude", "",     JetiSensor::TYPE_GPS, 0,          3 },
    { ID_GPSLAT,    "GPS Latitude",  "",     JetiSensor::TYPE_GPS, 0,          3 },
    { ID_GPSSPD,    "GPS Speed",     "m/s",  JetiSensor::TYPE_14b, 2,          3 },
    { ID_GPSALT,    "GPS Altitude",  "m",    JetiSensor::TYPE_14b, 1,          4 },
    { ID_GPSTIME,   "GPS Time",       " ",   JetiSensor::TYPE_DT,  0,          0 },
    { ID_GPSDATE,   "GPS Date",       " ",   JetiSensor::TYPE_DT,  1,         50 },
    { ID_GPSVEH,    "GPS Vehicles",   "",    JetiSensor::TYPE_6b,  0,         10 },
#endif    
    0                           // end of array
};

Bei den Funktionen zum Schreiben der Sensorwerte kommt jetzt ein weiterer Parameter "bool valid" hinzu.
Der ersetzt das bisherige "-1" als Wert für invalid was ein Design Fehler war.

Beispiel:
C++:
void DecodeUBX(uint8_t Class, uint8_t ID) {

    bool valid = false;
    bool sendTm = false;
    static uint8_t prevSec = 0;
    uint8_t sec = 0; // init. sec prevents warning

    if ( Class == 1 && ID == 7 ) {  //ID 7 is NavPvt

        if ( NavPvt.Val.fixType == 3 )
        {
            valid = true;
            sec = NavPvt.Val.sec;
            if ( prevSec != sec )
                sendTm = true;
        }
       
        exBus.SetSensorValueGPS (ID_GPSLAT, false, (double)NavPvt.Val.lat/10000000, valid);
        exBus.SetSensorValueGPS (ID_GPSLON, true,  (double)NavPvt.Val.lon/10000000, valid);
        exBus.SetSensorValue (ID_GPSALT, round(NavPvt.Val.height/100), valid);
        exBus.SetSensorValue (ID_GPSSPD, round(NavPvt.Val.gSpeed/10), valid);
        exBus.SetSensorValueTime(ID_GPSTIME, NavPvt.Val.hour, NavPvt.Val.min, sec, sendTm);
        exBus.SetSensorValueDate(ID_GPSDATE, NavPvt.Val.day, NavPvt.Val.month, NavPvt.Val.year, valid);
        exBus.SetSensorValue (ID_GPSVEH, NavPvt.Val.numSV, valid);

        if ( valid )
            prevSec = sec;
    }    
}

Das Ergebnis im Logfile über 100 Sekunden sieht so aus:
Perl:
  {
    'dimension' => 'm/s',
    'dataType' => '1',
    'name' => 'Vario',
    'countsPerSecond' => '33.6212122717922',
    'count' => 3383,
    'decimals' => '2'
  },
  {
    'count' => 1232,
    'countsPerSecond' => '12.2463991411616',
    'decimals' => '1',
    'name' => 'Hoehe',
    'dimension' => 'm',
    'dataType' => '1'
  },
  {
    'dimension' => '',
    'dataType' => '9',
    'countsPerSecond' => '16.2156250621384',
    'decimals' => '1',
    'count' => 1631,
    'name' => 'GPS Longitude'
  },
  {
    'dimension' => '',
    'dataType' => '9',
    'count' => 1635,
    'countsPerSecond' => '16.2523235355513',
    'decimals' => '0',
    'name' => 'GPS Latitude'
  },
  {
    'name' => 'GPS Speed',
    'countsPerSecond' => '16.2523235355513',
    'decimals' => '2',
    'count' => 1635,
    'dataType' => '1',
    'dimension' => 'm/s'
  },
  {
    'countsPerSecond' => '12.2340266942288',
    'count' => 1231,
    'decimals' => '1',
    'name' => 'GPS Altitude',
    'dimension' => 'm',
    'dataType' => '1'
  },
  {
    'name' => 'GPS Time',
    'decimals' => '0',
    'countsPerSecond' => '3.46798856663135',
    'count' => 347,
    'dimension' => ' ',
    'dataType' => '5'
  },
  {
    'decimals' => '1',
    'countsPerSecond' => '1.15259333500376',
    'count' => 115,
    'name' => 'GPS Date',
    'dimension' => ' ',
    'dataType' => '5'
  },
  {
    'dataType' => '0',
    'dimension' => '',
    'name' => 'GPS Vehicles',
    'countsPerSecond' => '4.97210648263243',
    'decimals' => '0',
    'count' => 500
  }

Das Vario wird also mit prio 0 stark bevorzugt. Wie man vielleicht nach dem Code erwarten würde, wird die Zeit aber nicht nur einmal pro Sekunde übertragen sondern mehrmals. Das liegt daran, dass die Daten vom GPS Modul nur im 1/10 Sekunden Abstand kommen und so auch nicht schneller auf "invalid" gesetzt werden können.
Die Daten Vario und Höhe werden hier alle 13,5 mS generiert und zur Library geschrieben. Hier sind die Sensoren schneller als die Telemetrieübertragung.
Aber über 33 Übertragungen pro Sekunde mit frischen Werten reichen auf jeden Fall für einen flüssigen Varioton mit wenig Latenz.

Gruß
Dieter
 
Ansicht hell / dunkel umschalten
Oben Unten