Forum: PC-Programmierung Python can tools c source generator


von Thorben (Gast)


Lesenswert?

Hallo,

für ein CAN Projekt möchte ich gerne den C Source Generator aus dem 
Python Modul "cantools" https://github.com/cantools/cantools nehmen. 
Soweit ist der generierte Code anhand der DBC Datei verständlich nur zu 
einem Teil hätte ich ein paar Fragen.

In meinen Fragen beziehe ich mich auf folgende Datei
https://github.com/cantools/cantools/blob/master/tests/files/c_source/vehicle.h

Hier ein Auszug des Codes für meine Fragen:
1
/**
2
 * The MIT License (MIT)
3
 *
4
 * Copyright (c) 2018-2019 Erik Moqvist
5
 *
6
 * Permission is hereby granted, free of charge, to any person
7
 * obtaining a copy of this software and associated documentation
8
 * files (the "Software"), to deal in the Software without
9
 * restriction, including without limitation the rights to use, copy,
10
 * modify, merge, publish, distribute, sublicense, and/or sell copies
11
 * of the Software, and to permit persons to whom the Software is
12
 * furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be
15
 * included in all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
 * SOFTWARE.
25
 */
26
27
/**
28
29
/**
30
     * Range: 0..255 (0..255 -)
31
     * Scale: 1
32
     * Offset: 0
33
     */
34
    uint8_t accuracy_ins_vel_ne;
35
36
37
/**
38
 * Encode given signal by applying scaling and offset.
39
 *
40
 * @param[in] value Signal to encode.
41
 *
42
 * @return Encoded signal.
43
 */
44
uint8_t vehicle_rt_sb_ins_vel_ned_1_accuracy_ins_vel_ne_encode(double value);
45
46
/**
47
 * Decode given signal by applying scaling and offset.
48
 *
49
 * @param[in] value Signal to decode.
50
 *
51
 * @return Decoded signal.
52
 */
53
double vehicle_rt_sb_ins_vel_ned_1_accuracy_ins_vel_ne_decode(uint8_t value);

Die Type ist uint8_t für das Signal definiert, mit einem Wertebereich 
von 0..255, Scale 1 und Offset 0.
Wozu sind nun die Funktionen encode und decode vorhanden, insbesondere 
von und zur Type double? Für mich müsste es von uint8_t zu uint8_t 
gewandelt werden bzw. sind die Funktionen ohne Sinn. Wo ist hier mein 
Denkfehler?

Beispiel:
1
uint8_t vehicle_rt_sb_ins_vel_ned_1_accuracy_ins_vel_ne_decode(uint8_t value);

von c oder d (Gast)


Lesenswert?

uint8t warumnichtdouble(double wert1, int sig, char name, time_t);


;)

von Thorben (Gast)


Lesenswert?

Ich verstehe deine Antwort nicht

von c oder d (Gast)


Lesenswert?

globale variablen in Funktion
?

Ohne die Funktion zu sehen könnte man vielleicht auf c+- tippen;) WM

von MaWin (Gast)


Lesenswert?

Thorben schrieb:
> uint8_t vehicle_rt_sb_ins_vel_ned_1_accuracy_ins_vel_ne_encode(double
> value);

Bei diesen Funktionsnamen bekommt man ja Hirnkrebs.

von Thorben (Gast)


Lesenswert?

>Bei diesen Funktionsnamen bekommt man ja Hirnkrebs.

Hab schon schlimmere Message- und Signalnamen gesehen. So ist halt die 
Message und das Signal im DBC definiert.

von Eine Vermutung (Gast)


Lesenswert?

Eine recht verbreitete Strategie - eine allgemeine Library arbeitet mit 
dem universellsten Datentyp. Und der Generator passt die reinkommenden 
und ausgehenden Daten an die Library an.

Macht halt weniger Arbeit, als den gesamten Programmcode optimal 
generieren.

von Rolf M. (rmagnus)


Lesenswert?

Thorben schrieb:
> Die Type ist uint8_t für das Signal definiert, mit einem Wertebereich
> von 0..255, Scale 1 und Offset 0.
> Wozu sind nun die Funktionen encode und decode vorhanden, insbesondere
> von und zur Type double?

Die werden vermutlich einfach standardmäßig für jedes Signal generiert.

> Für mich müsste es von uint8_t zu uint8_t gewandelt werden bzw. sind die
> Funktionen ohne Sinn. Wo ist hier mein Denkfehler?

Wäre der Faktor oder der Offset z.B. 0,5, dann müsste man double nehmen. 
Die Software berücksichtigt einfach den Spezialfall "Faktor=1, Offset=0, 
Größe <= 8 Bit" nicht und nimmt für alles double, weil man diesen Fall 
damit auch abdecken kann. Dementsprechend wird dafür dann auch eine 
Umrechnungsfunktion generiert.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.