Encoder/Decoder für die Datenbytes der Märklin CAN Nachrichten

Bibliothek

Projektcs2_parse
Librarylibcs2_parse.a
Includedateics2.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