179 lines
5.6 KiB
C++
Executable File
179 lines
5.6 KiB
C++
Executable File
//------------------------------------------------------------------------
|
|
//
|
|
// OpenDCC - NmraDcc.cpp
|
|
//
|
|
// Copyright (c) 2008 Alex Shepherd
|
|
//
|
|
// This source file is subject of the GNU general public license 2,
|
|
// that is available at the world-wide-web at
|
|
// http://www.gnu.org/licenses/gpl.txt
|
|
//
|
|
//------------------------------------------------------------------------
|
|
//
|
|
// file: NmraDccTest.cpp
|
|
// author: Alex Shepherd
|
|
// webpage: http://opendcc.org/
|
|
// history: 2008-03-20 Initial Version
|
|
//
|
|
//------------------------------------------------------------------------
|
|
//
|
|
// purpose: Provide a simplified interface to decode NMRA DCC packets
|
|
// and build DCC MutliFunction and Stationary Decoders
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
// Uncomment the following Line to Enable Service Mode CV Programming
|
|
#define NMRA_DCC_PROCESS_SERVICEMODE
|
|
|
|
// Uncomment the following line to Enable MutliFunction Decoder Operations
|
|
#define NMRA_DCC_PROCESS_MULTIFUNCTION
|
|
|
|
#if defined(ARDUINO) && ARDUINO >= 100
|
|
#include "Arduino.h"
|
|
#else
|
|
#include "WProgram.h"
|
|
#endif
|
|
|
|
#ifndef NMRADCC_IS_IN
|
|
#define NMRADCC_IS_IN
|
|
|
|
#define MAX_DCC_MESSAGE_LEN 6 // including XOR-Byte
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t Size ;
|
|
uint8_t PreambleBits ;
|
|
uint8_t Data[MAX_DCC_MESSAGE_LEN] ;
|
|
} DCC_MSG ;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// This section contains the NMRA Assigned DCC Manufacturer Id Codes that
|
|
// are used in projects
|
|
//
|
|
// This value is to be used for CV8
|
|
//--------------------------------------------------------------------------
|
|
|
|
#define MAN_ID_JMRI 0x12
|
|
#define MAN_ID_DIY 0x0D
|
|
#define MAN_ID_SILICON_RAILWAY 0x21
|
|
|
|
//--------------------------------------------------------------------------
|
|
// This section contains the Product/Version Id Codes for projects
|
|
//
|
|
// This value is to be used for CV7
|
|
//
|
|
// NOTE: Each Product/Version Id Code needs to be UNIQUE for that particular
|
|
// the DCC Manufacturer Id Code
|
|
//--------------------------------------------------------------------------
|
|
|
|
// Product/Version Id Codes allocated under: MAN_ID_JMRI
|
|
|
|
// Product/Version Id Codes allocated under: MAN_ID_DIY
|
|
|
|
// Standard CV Addresses
|
|
#define CV_ACCESSORY_DECODER_ADDRESS_LSB 1
|
|
#define CV_ACCESSORY_DECODER_ADDRESS_MSB 9
|
|
|
|
#define CV_MULTIFUNCTION_PRIMARY_ADDRESS 1
|
|
#define CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB 17
|
|
#define CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB 18
|
|
|
|
#define CV_VERSION_ID 7
|
|
#define CV_MANUFACTURER_ID 8
|
|
#define CV_29_CONFIG 29
|
|
#define MAXCV E2END // the upper limit of the CV value currently defined to max memory.
|
|
|
|
typedef enum
|
|
{
|
|
FN_0_4 = 1,
|
|
FN_5_8,
|
|
FN_9_12,
|
|
FN_13_20,
|
|
FN_21_28
|
|
} FN_GROUP;
|
|
|
|
#define FN_BIT_00 0x10
|
|
#define FN_BIT_01 0x01
|
|
#define FN_BIT_02 0x02
|
|
#define FN_BIT_03 0x04
|
|
#define FN_BIT_04 0x08
|
|
|
|
#define FN_BIT_05 0x01
|
|
#define FN_BIT_06 0x02
|
|
#define FN_BIT_07 0x04
|
|
#define FN_BIT_08 0x08
|
|
|
|
#define FN_BIT_09 0x01
|
|
#define FN_BIT_10 0x02
|
|
#define FN_BIT_11 0x04
|
|
#define FN_BIT_12 0x08
|
|
|
|
#define FN_BIT_13 0x01
|
|
#define FN_BIT_14 0x02
|
|
#define FN_BIT_15 0x04
|
|
#define FN_BIT_16 0x08
|
|
#define FN_BIT_17 0x10
|
|
#define FN_BIT_18 0x20
|
|
#define FN_BIT_19 0x40
|
|
#define FN_BIT_20 0x80
|
|
|
|
#define FN_BIT_21 0x01
|
|
#define FN_BIT_22 0x02
|
|
#define FN_BIT_23 0x04
|
|
#define FN_BIT_24 0x08
|
|
#define FN_BIT_25 0x10
|
|
#define FN_BIT_26 0x20
|
|
#define FN_BIT_27 0x40
|
|
#define FN_BIT_28 0x80
|
|
|
|
class NmraDcc
|
|
{
|
|
private:
|
|
DCC_MSG Msg ;
|
|
|
|
public:
|
|
NmraDcc();
|
|
|
|
// Flag values to be logically ORed together and passed into the init() method
|
|
#define FLAGS_MY_ADDRESS_ONLY 0x01 // Only process DCC Packets with My Address
|
|
#define FLAGS_OUTPUT_ADDRESS_MODE 0x40 // CV 29/541 bit 6
|
|
#define FLAGS_DCC_ACCESSORY_DECODER 0x80 // CV 29/541 bit 7
|
|
void pin( uint8_t ExtIntNum, uint8_t ExtIntPinNum, uint8_t EnablePullup);
|
|
void init( uint8_t ManufacturerId, uint8_t VersionId, uint8_t Flags, uint8_t OpsModeAddressBaseCV );
|
|
uint8_t process();
|
|
uint8_t getCV( uint16_t CV );
|
|
uint8_t setCV( uint16_t CV, uint8_t Value);
|
|
uint8_t isSetCVReady( void );
|
|
|
|
// #define DCC_DEBUG
|
|
#ifdef DCC_DEBUG
|
|
uint8_t getIntCount(void);
|
|
uint8_t getTickCount(void);
|
|
uint8_t getBitCount(void);
|
|
uint8_t getState(void);
|
|
#endif
|
|
|
|
};
|
|
|
|
extern void notifyDccReset(uint8_t hardReset ) __attribute__ ((weak));
|
|
extern void notifyDccIdle(void) __attribute__ ((weak));
|
|
|
|
extern void notifyDccSpeed( uint16_t Addr, uint8_t Speed, uint8_t ForwardDir, uint8_t MaxSpeed ) __attribute__ ((weak));
|
|
extern void notifyDccFunc( uint16_t Addr, FN_GROUP FuncGrp, uint8_t FuncState) __attribute__ ((weak));
|
|
|
|
extern void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) __attribute__ ((weak));
|
|
|
|
extern void notifyDccSigState( uint16_t Addr, uint8_t OutputIndex, uint8_t State) __attribute__ ((weak));
|
|
|
|
extern void notifyDccMsg( DCC_MSG * Msg ) __attribute__ ((weak));
|
|
|
|
extern uint8_t notifyCVValid( uint16_t CV, uint8_t Writable ) __attribute__ ((weak));
|
|
extern uint8_t notifyCVRead( uint16_t CV) __attribute__ ((weak));
|
|
extern uint8_t notifyCVWrite( uint16_t CV, uint8_t Value) __attribute__ ((weak));
|
|
extern uint8_t notifyIsSetCVReady(void) __attribute__ ((weak));
|
|
extern void notifyCVChange( uint16_t CV, uint8_t Value) __attribute__ ((weak));
|
|
extern void notifyCVResetFactoryDefault(void) __attribute__ ((weak));
|
|
|
|
extern void notifyCVAck(void) __attribute__ ((weak));
|
|
#endif
|