Asi mně nějak nedochází, co řešíš. Máš jakýsi definiční soubor v jakémsi formátu a máš data, která jsou formátovaná podle té definice.
No tak si musíš napsat parser toho definičního souboru, zparsovat ho, uložit výsledek do nějaké rozumné struktury v paměti a potom data dekódovat na základě té struktury. V čem je teda problém? Nechceš to přeformulovat na trochu jinou otázku než "jak to udělám"?
Diky za poznamku, asi jsem to vysvetlil spatne. Jelikoz neocekavam nejake kusy kodu apod. jen rady, jakym zpusobem toto implementovat, tak jsem to psal obecneji. Takze:
Po sbernici prijimam a vysilam data, kde ramec vypada zjendodusene nasledovne:
ID (1byte), Data (2 - 4 - 8 bytes delka se lisi)
Karta od National Instrument umi pres jejich C API vycist tyto data do struktury, ktera vypada nasledovne:
typedef struct
{
ID;
timestamp;
data_length;
UINT8 data[8];
} NITYPE_LIN_STRUCT
Priklad: ID = 48; timestamp = 5000; data_length = 4; data = 0A 25 3C 10 (hex) => data[8] = {10, 37, 60, 10, 0, 0, 0, 0}
Mam externi soubor ldf (LIN description file) ktery mi popisuje vnitrni strukturu prijatych dat podle ID zpravy (tento soubor je nezavisly na NI karte a je dodavan od treti strany):
Kus vypisu z toho souboru vypada nasledovne:
Frames {
BCM_LIN5_A : 48, BCM_Gp, 4 { (nazev zpravy, ID zpravy, nepodstatne, delka zpravy v bytech)
UserSetMinute, 0; (sub-informace, bit offset - tento parametr zacina na bitu 0)
UserSetSecond, 8; (sub-informace, bit offset - tento parametr zacina na bitu 8)
UserSetHour, 16;
CarModeL5, 24;
}
BCM_LIN5_C : 55, BCM_Gp, 8 {
RHSBLSlewRateRequest, 0;
RHFrontSMRequest, 4;
LHFrontSMRequest, 6;
RHSBLPWMDutyRequest, 8;
RHDRLPosSlewRateRequest, 16;
LHSBLSlewRateRequest, 20;
RHDRLPosPWMDutyReq, 24;
LHDRLPosSlewRateReq, 32;
LHDRLPosPWMDutyReq, 40;
LHSBLPWMDutyRequest, 48;
}
CLOCK_A : 49, CLOCK, 4 {
CLKHWPartNo, 0;
CLKFaultStatus, 16;
.
.
.
} // End of Frame description
Takze pro nas prikald,
UserSetMinute = 16 (0x10)
UserSetSecond = 60 (0x3C)
UserSetHour = 37 (0x25)
CarModeL5 = 10 (0x0A)
Problem je, ze ten definicni soubor se meni projekt od projektu. Takze priste muze byt na ID 48 zprava GetParam, delka 2 byte a muze v sobe mit zakodovanych 8 informaci, kazda po dvou bitech.
Otazka zni, jaky zpusob zvolit pro predzpracovani teto informace pro nasledny vypis na obrazovku?
priklad:
NITYPE_LIN_STRUCT data[256]; // mam nactenych 256 zprav
ReadData(&data);
for(i = 0; i < pocet_zprav; i++)
{
printf("ID: %d, Time: %d, Data Length: %d, Byte1: %d, Byte2: %d, Byte3: %d Byte4: %d, Byte5: %d....\n", data[i].ID, data[i].timestamp, ....)
for(j = 0; j < pocet_sub_informaci; j++)
printf("%sz: %d\n", [b]data[/b], [b]hodnota[/b]);
}
Jakym zpusobem udelat predzpracovani dat z externiho souboru (jak je manageovat), abych k nim potom pri vypisu mohl pristoupit a pomoci nich dekodoval onech 2-4-8 prijatych bytu?
Cili, otevru soubor -> predzpracovani dat a ulozeni nekam -> mozno spustit monitorovani sbernice (data uz jsou predpripravena a vim, podle jakeho klice dekodovat)