Encoder/Decoder für die Datenbytes der Märklin CAN
Nachrichten
Bibliothek
| Projekt | cs2_parse |
| Library | libcs2_parse.a |
| Includedatei | cs2.h |
Definitionen
Konstanten
Konstanten für Anzahl Datenbytes in CAN Frame
#define CS2_NUM_CAN_BYTES 8
Konstanten füer Auswertung CS2 CAN Id
#define CS2_SHIFT_HASH 0
#define CS2_SHIFT_RESP 16
#define CS2_SHIFT_COMMAND 17
#define CS2_SHIFT_PRIO 25
#define CS2_MASK_HASH BIT_MASK( 0, 15)
#define CS2_MASK_RESP BIT_MASK(16, 16)
#define CS2_MASK_COMMAND BIT_MASK(17, 24)
#define CS2_MASK_PRIO BIT_MASK(25, 29)
#define CS2_SHIFT_HASH_MSB 3
#define CS2_MASK_HASH_MAGIC BIT_MASK(7,9)
#define CS2_HASH_MAGIC BIT_MASK(8,9)
#define CS2_MASK_HASH_LOW_BYTE BIT_MASK(0, 7)
#define CS2_MASK_HASH_HIGH_BYTE BIT_MASK(7,15)
Konstanten für Folgenummer
#define CS2_FOLGENUMMER_LOW BIT_MASK( 0, 6)
#define CS2_FOLGENUMMER_HIGH BIT_MASK(10,15)
Konstanten für das prio Feld
#ifdef CS2_USE_PRIO
#define CS2_PRIO_0 0 /* not prio set */
#define CS2_PRIO_1 1 /* Stopp / Go / Kurzschluss-Meldungen */
#define CS2_PRIO_2 2 /* Rueckmeldungen */
#define CS2_PRIO_3 3 /* Lok anhalten */
#define CS2_PRIO_4 4 /* Lok / Zubehoerbefehle */
#else
#define CS2_PRIO_0 0 /* not prio set */
#define CS2_PRIO_1 0 /* Stopp / Go / Kurzschluss-Meldungen */
#define CS2_PRIO_2 0 /* Rueckmeldungen */
#define CS2_PRIO_3 0 /* Lok anhalten */
#define CS2_PRIO_4 0 /* Lok / Zubehoerbefehle */
#endif
Konstanten für CAN Kommandos (Command Feld der CS2 can id
#define CS2_CMD_SYSTEM 0x00
#define CS2_CMD_DISCOVERY 0x01
#define CS2_CMD_BIND 0x02
#define CS2_CMD_MFX_VERIFY 0x03
#define CS2_CMD_SPEED 0x04
#define CS2_CMD_DIRECTION 0x05
#define CS2_CMD_FUNCTION 0x06
#define CS2_CMD_READ_CONFIG 0x07
#define CS2_CMD_WRITE_CONFIG 0x08
#define CS2_CMD_ACC_SWITCH 0x0B
#define CS2_CMD_ACC_CONF 0x0C
#define CS2_CMD_S88_POLL 0x10
#define CS2_CMD_S88_EVENT 0x11
#define CS2_CMD_SX1_EVENT 0x12
#define CS2_CMD_PING 0x18
#define CS2_CMD_OFFER_UPDATE 0x19
#define CS2_CMD_READ_CFG_DATA 0x1A
#define CS2_CMD_BOOTLDR_CAN 0x1B
#define CS2_CMD_BOOTLDR_TRACK 0x1C
#define CS2_CMD_STATUS 0x1D
#define CS2_CMD_CONFIG_QUERY 0x20
#define CS2_CMD_CFGDAT_STREAM 0x21
#define CS2_CMD_CONNECT_6021 0x22
#define CS2_CMD_AUTOMATIC 0x30
#define CS2_CMD_DEBUG_MESSAGE 0x42
Konstanten für Subcommand des CS2 system Kommando (data byte 4)
#define CS2_SUBCMD_SYSTEM_STOP 0x00
#define CS2_SUBCMD_SYSTEM_GO 0x01
#define CS2_SUBCMD_SYSTEM_HALT 0x02
#define CS2_SUBCMD_SYSTEM_EMERGENCY_HALT 0x03
#define CS2_SUBCMD_SYSTEM_CYCLE_END 0x04
#define CS2_SUBCMD_SYSTEM_DATA_PROTOCOLL 0x05
#define CS2_SUBCMD_SYSTEM_DECODER_TIMEING 0x06
#define CS2_SUBCMD_SYSTEM_MFX_FAST_READ 0x07
#define CS2_SUBCMD_SYSTEM_TRACK_PROTOCOLL 0x08
#define CS2_SUBCMD_SYSTEM_RESET_MFX_COUNTER 0x09
#define CS2_SUBCMD_SYSTEM_OVERLOAD 0x0A
#define CS2_SUBCMD_SYSTEM_STATUS 0x0B
#define CS2_SUBCMD_SYSTEM_SYSTEM_ID 0x0C
#define CS2_SUBCMD_SYSTEM_MFX_SEEK 0x30
#define CS2_SUBCMD_SYSTEM_SYSTEM_RESET 0x80
Konstanten für uids im CS2 system
#define CS2_UID_BROADCAST 0x00000000l
Konstanten für Lok Datenprotokoll
(MR_CS2_SUBCMD_SYSTEM_DATA_PROTOCOLL)
#define CS2_DATA_PROTO_MM2_2040 0
#define CS2_DATA_PROTO_MM2_LOK_20 1
#define CS2_DATA_PROTO_MM2_FKT_40 2
#define CS2_DATA_PROTO_DCC_SHORT_ADDR_28 0
#define CS2_DATA_PROTO_DCC_SHORT_ADDR_14 1
#define CS2_DATA_PROTO_DCC_SHORT_ADDR_126 2
#define CS2_DATA_PROTO_DCC_LONG_ADDR_28 3
#define CS2_DATA_PROTO_DCC_LONG_ADDR_126 4
Konstanten für Gleisprotokoll Bitmaske
(MR_CS2_SUBCMD_SYSTEM_TRACK_PROTOCOLL)
#define CS2_TRACK_PROTO_MM2 0x01
#define CS2_TRACK_PROTO_MFX 0x02
#define CS2_TRACK_PROTO_DCC 0x04
#define CS2_TRACK_PROTO_RES1 0x08
#define CS2_TRACK_PROTO_RES2 0x10
#define CS2_TRACK_PROTO_RES3 0x20
#define CS2_TRACK_PROTO_RES4 0x40
#define CS2_TRACK_PROTO_RES5 0x80
Konstanten für range/protcoll Feld von lok discovery
#define CS2_DISCOVERY_MFX_1 0
#define CS2_DISCOVERY_MFX_2 32
#define CS2_DISCOVERY_MM2_1 33
#define CS2_DISCOVERY_MM2_2 34
#define CS2_DISCOVERY_DCC_1 35
#define CS2_DISCOVERY_DCC_2 36
#define CS2_DISCOVERY_DCC_3 37
#define CS2_DISCOVERY_SX1_1 38
#define CS2_DISCOVERY_SX1_2 39
#define CS2_DISCOVERY_MFX_3 64
#define CS2_DISCOVERY_MFX_4 96
#define CS2_DISCOVERY_MM2_3 98
#define CS2_DISCOVERY_DCC_4 99
#define CS2_DISCOVERY_DCC_5 100
#define CS2_DISCOVERY_SX1_3 101
#define CS2_DISCOVERY_SX1_4 102
cv addresse für SX1
#define CS2_SX1_CV_ADDRESS 1
#define CS2_SX1_CV_MAXSPEED 2
#define CS2_SX1_CV_ACCELERATION 3
#define CS2_SX1_CV_PULSEWIDTH 4
#define CS2_SX1_CV_STOPPART 5
Konstanten für Position im Kommando "switch acc"
#define CS2_POSITION_RED 0x00
#define CS2_POSITION_GREEN 0x01
#define CS2_POSITION_YELLOW 0x02
#define CS2_POSITION_WHITE 0x03
Konstanten für Device id im ping Kommando
#define CS2_DEVID_GFP 0x0000
#define CS2_DEVID_GLEISBOX 0x0010
#define CS2_DEVID_CONNECT 0x0020
#define CS2_DEVID_MS2_1 0x0030
#define CS2_DEVID_MS2_2 0x0032
#define CS2_DEVID_CS2 0xEEEE
#define CS2_DEVID_WIRELESS 0xFFE0
#define CS2_DEVID_WIRED 0xFFF0
#define CS2_DEVID_CS2GUI 0xFFFF
Namen fü cfg data
#define CS2_CFG_LOCINFO "lokinfo"
#define CS2_CFG_LOCNAMES "loknamen"
#define CS2_CFG_MAGINFO "maginfo"
#define CS2_CFG_LOCDB "lokdb"
#define CS2_CFG_LANG "lang"
#define CS2_CFG_LDBVER "ldbver"
#define CS2_CFG_LANGVER "langver"
#define CS2_CFG_LOKS "loks"
#define CS2_CFG_MAGS "mags"
#define CS2_CFG_GBS "gbs"
#define CS2_CFG_GBS_PAGE "gbs-"
#define CS2_CFG_FS "fs"
#define CS2_CFG_LOK_STAT "lokstat"
#define CS2_CFG_MAG_STAT "magstat"
#define CS2_CFG_GBS_STAT "gbsstat"
#define CS2_CFG_FS_STAT "fsstat"
#define CS2_CFG_MS2_CONF "ms2-conf"
#define CS2_CFG_LOKLISTE "lokliste"
#define CS2_CFG_FILES "files"
#define CS2_CFG_DLC 8
Namen für cs2 Daeien
#define CS2_FILE_EXTENSION ".cs2"
#define CS2_GLEISBILD_PAGE_SUBDIR "gleisbilder/"
Funktionen
Funktionen für Umgang mit CAN Id
unsigned short Cs2CalcHash(unsigned long Uid);
unsigned short Cs2CalcHashFromFolgenummer(unsigned int Folgenummer);
BOOL Cs2IsCs2Msg(unsigned Hash, unsigned Command);
void Cs2DecodeId(unsigned long CanId, unsigned *Hash, unsigned *Response,
unsigned *Command, unsigned *Prio);
unsigned long Cs2EncodeId(unsigned short Hash, unsigned Response,
unsigned Command, unsigned Prio);
unsigned short Cs2CalcCrc(unsigned char *data, unsigned int length);
Decode Functionen für System Subcmds
void Cs2DecSysStop(unsigned char *CanData, unsigned long *Uid);
void Cs2DecSysGo(unsigned char *CanData, unsigned long *Uid);
void Cs2DecSysHalt(unsigned char *CanData, unsigned long *Uid);
void Cs2DecSysEmergencyHalt(unsigned char *CanData, unsigned long *Uid);
void Cs2DecSysCycleEnd(unsigned char *CanData, unsigned long *Uid);
void Cs2DecSysDataProtocoll(unsigned char *CanData, unsigned long *Uid,
int *Proto);
void Cs2DecSysDecoderTimeing(unsigned char *CanData, unsigned long *Uid,
int *Time);
void Cs2DecSysMfxFastRead(unsigned char *CanData, unsigned long *Uid,
int *MfxSid);
void Cs2DecSysTrackProtocoll(unsigned char *CanData, unsigned long *Uid,
int *Proto);
void Cs2DecSysResetMfxCounter(unsigned char *CanData, unsigned long *Uid,
int *Counter);
void Cs2DecSysOverload(unsigned char *CanData, unsigned long *Uid,
int *Channel);
void Cs2DecSysStatus6(unsigned char *CanData, unsigned long *Uid,
int *Channel);
void Cs2DecSysStatus7(unsigned char *CanData, unsigned long *Uid,
int *Channel, int *Set);
void Cs2DecSysStatus8(unsigned char *CanData, unsigned long *Uid,
int *Channel, int *Value);
void Cs2DecSysSystemId5(unsigned char *CanData, unsigned long *Uid);
void Cs2DecSysSystemId7(unsigned char *CanData, unsigned long *Uid,
int *Id);
void Cs2DecSysSystemReset(unsigned char *CanData, unsigned long *Uid,
int *ResteTarget);
Decode Functionen für System Subcmds
void Cs2EncSysStop(unsigned char *CanData, unsigned long Uid);
void Cs2EncSysGo(unsigned char *CanData, unsigned long Uid);
void Cs2EncSysHalt(unsigned char *CanData, unsigned long Uid);
void Cs2EncSysEmergencyHalt(unsigned char *CanData, unsigned long Uid);
void Cs2EncSysCycleEnd(unsigned char *CanData, unsigned long Uid);
void Cs2EncSysDataProtocoll(unsigned char *CanData, unsigned long Uid,
int Proto);
void Cs2EncSysDecoderTimeing(unsigned char *CanData, unsigned long Uid,
int Time);
void Cs2EncSysMfxFastRead(unsigned char *CanData, unsigned long Uid,
int MfxSid);
void Cs2EncSysTrackProtocoll(unsigned char *CanData, unsigned long Uid,
int Proto);
void Cs2EncSysResetMfxCounter(unsigned char *CanData, unsigned long Uid,
int Counter);
void Cs2EncSysOverload(unsigned char *CanData, unsigned long Uid,
int Channel);
void Cs2EncSysStatus6(unsigned char *CanData, unsigned long Uid,
int Channel);
void Cs2EncSysStatus7(unsigned char *CanData, unsigned long Uid,
int Channel, int Set);
void Cs2EncSysStatus8(unsigned char *CanData, unsigned long Uid,
int Channel, int Value);
void Cs2EncSysSystemId5(unsigned char *CanData, unsigned long Uid);
void Cs2EncSysSystemId7(unsigned char *CanData, unsigned long Uid,
int Id);
void Cs2EncSysSystemReset(unsigned char *CanData, unsigned long Uid,
int ResteTarget);
Decode Functionen für CAN Kommandos
void Cs2DecDiscovery0(unsigned char *CanData);
void Cs2DecDiscovery1(unsigned char *CanData, int *Proto);
void Cs2DecDiscovery5(unsigned char *CanData, unsigned long *Uid,
int *Range);
void Cs2DecDiscovery6(unsigned char *CanData, unsigned long *Uid,
int *Range, int *Ask);
void Cs2DecBind(unsigned char *CanData, unsigned long *Uid,
unsigned int *Sid);
void Cs2DecMfxVerify6(unsigned char *CanData, unsigned long *Uid,
unsigned int *Sid);
void Cs2DecMfxVerify7(unsigned char *CanData, unsigned long *Uid,
unsigned int *Sid, int *Ask);
void Cs2DecSpeed4(unsigned char *CanData, unsigned long *LocId);
void Cs2DecSpeed6(unsigned char *CanData, unsigned long *LocId, int *Speed);
void Cs2DecDirection4(unsigned char *CanData, unsigned long *LocId);
void Cs2DecDirection5(unsigned char *CanData, unsigned long *LocId,
int *Direction);
void Cs2DecFunction5(unsigned char *CanData, unsigned long *LocId,
int *Function);
void Cs2DecFunction6(unsigned char *CanData, unsigned long *LocId,
int *Function, int *Value);
void Cs2DecFunction8(unsigned char *CanData, unsigned long *LocId,
int *Function, int *Value, int *FktVal);
void Cs2DecReadConfig6(unsigned char *CanData, unsigned long *LocId,
int *CvIndex);
void Cs2DecReadConfig7(unsigned char *CanData, unsigned long *LocId,
int *CvIndex, int *Param);
void Cs2DecWriteConfig(unsigned char *CanData, unsigned long *LocId,
int *CvIndex, int *Value, int *CtrlRslt);
void Cs2DecAccSwitch6(unsigned char *CanData, unsigned long *LocId,
int *Position, int *Current);
void Cs2DecAccSwitch8(unsigned char *CanData, unsigned long *LocId,
int *Position, int *Current, int *TimeFkt);
void Cs2DecS88Poll5(unsigned char *CanData, unsigned long *Uid,
int *NumModuls);
void Cs2DecS88Poll7(unsigned char *CanData, unsigned long *Uid,
int *Modul, int *State);
void Cs2DecS88Event4(unsigned char *CanData, int *Device, int *Contact);
void Cs2DecS88Event5(unsigned char *CanData, int *Device, int *Contact,
int *Param);
void Cs2DecS88Event8(unsigned char *CanData, int *Device, int *Contact,
int *StateOld, int *StateNew, int *Time);
void Cs2DecPing0(unsigned char *CanData);
void Cs2DecPing8(unsigned char *CanData, unsigned long *Uid,
int *SwVersion, int *DeviceId);
void Cs2DecCanBootldr(unsigned char *CanData, char *Bytes);
void Cs2DecStatus5(unsigned char *CanData, unsigned long *Uid, int *Index);
void Cs2DecStatus6(unsigned char *CanData, unsigned long *Uid, int *Index,
int *NumPackets);
void Cs2DecStatus8(unsigned char *CanData, char *Bytes);
#define Cs2DecConfigQuery0(CanMsg)
void Cs2DecConfigQuery(unsigned char *CanData, char *FileName);
void Cs2DecCfgdatStream6(unsigned char *CanData, unsigned long *Length,
int *Crc);
void Cs2DecCfgdatStream7(unsigned char *CanData, unsigned long *Length,
int *Crc);
void Cs2DecCfgdatStream8(unsigned char *CanData, char *Bytes);
void Cs2DecAutomatic6(unsigned char *CanData, int *DeviceId, int *Func,
int *Status, int *Param);
void Cs2DecAutomatic8(unsigned char *CanData, int *DeviceId, int *Func,
unsigned long *LocId);
void Cs2DecDebugMessage(unsigned char *CanData, char *Message);
Encode Functionen für CAN Kommandos
void Cs2EncDiscovery0(unsigned char *CanData);
void Cs2EncDiscovery1(unsigned char *CanData, int Proto);
void Cs2EncDiscovery5(unsigned char *CanData, unsigned long Uid,
int Range);
void Cs2EncDiscovery6(unsigned char *CanData, unsigned long Uid,
int Range, int Ask);
void Cs2EncBind(unsigned char *CanData, unsigned long Uid,
unsigned int Sid);
void Cs2EncMfxVerify6(unsigned char *CanData, unsigned long Uid,
unsigned int Sid);
void Cs2EncMfxVerify7(unsigned char *CanData, unsigned long Uid,
unsigned int Sid, int Ask);
void Cs2EncSpeed4(unsigned char *CanData, unsigned long LocId);
void Cs2EncSpeed6(unsigned char *CanData, unsigned long LocId, int Speed);
void Cs2EncDirection4(unsigned char *CanData, unsigned long LocId);
void Cs2EncDirection5(unsigned char *CanData, unsigned long LocId,
int Direction);
void Cs2EncFunction5(unsigned char *CanData, unsigned long LocId,
int Function);
void Cs2EncFunction6(unsigned char *CanData, unsigned long LocId,
int Function, int Value);
void Cs2EncFunction8(unsigned char *CanData, unsigned long LocId,
int Function, int Value, int FktVal);
void Cs2EncReadConfig6(unsigned char *CanData, unsigned long LocId,
int CvIndex);
void Cs2EncReadConfig7(unsigned char *CanData, unsigned long LocId,
int CvIndex, int Param);
void Cs2EncWriteConfig(unsigned char *CanData, unsigned long LocId,
int CvIndex, int Value, int CtrlRslt);
void Cs2EncAccSwitch6(unsigned char *CanData, unsigned long LocId,
int Position, int Current);
void Cs2EncAccSwitch8(unsigned char *CanData, unsigned long LocId,
int Position, int Current, int TimeFkt);
void Cs2EncS88Poll5(unsigned char *CanData, unsigned long Uid,
int NumModuls);
void Cs2EncS88Poll7(unsigned char *CanData, unsigned long Uid,
int Modul, int State);
void Cs2EncS88Event4(unsigned char *CanData, int Device, int Contact);
void Cs2EncS88Event5(unsigned char *CanData, int Device, int Contact,
int Param);
void Cs2EncS88Event8(unsigned char *CanData, int Device, int Contact,
int StateOld, int StateNew, int Time);
void Cs2EncPing0(unsigned char *CanData);
void Cs2EncPing8(unsigned char *CanData, unsigned long Uid,
int SwVersion, int DeviceId);
void Cs2EncCanBootldr(unsigned char *CanData, char *Bytes);
void Cs2EncStatus5(unsigned char *CanData, unsigned long Uid, int Index);
void Cs2EncStatus6(unsigned char *CanData, unsigned long Uid, int Index,
int NumPackets);
void Cs2EncStatus8(unsigned char *CanData, char *Bytes);
void Cs2EncConfigQuery0(unsigned char *CanData);
void Cs2EncConfigQuery(unsigned char *CanData, char *FileName);
void Cs2EncCfgdatStream6(unsigned char *CanData, unsigned long Length,
int Crc);
void Cs2EncCfgdatStream7(unsigned char *CanData, unsigned long Length,
int Crc);
void Cs2EncCfgdatStream8(unsigned char *CanData, char *Bytes);
void Cs2EncAutomatic6(unsigned char *CanData, int DeviceId, int Func,
int Status, int Param);
void Cs2EncAutomatic8(unsigned char *CanData, int DeviceId, int Func,
unsigned long LocId);
void Cs2EncDebugMessage(unsigned char *CanData, char *Message);
Encoder/Decoder für den Status Info Datenblock
int Cs2StatusInfoEncode(char *Buffer, int NumCfg, int NumStat,
unsigned long SerienNummer, char *ArtikelNummer,
char *ArtikelName);
void Cs2StatusInfoDecode(char *Buffer, int *NumCfg, int *NumStat,
unsigned long *SerienNummer, char *ArtikelNummer,
char *ArtikelName);
Zurück zur Modellbahn Startseite -
Zurück zur Homepage