--variable-- --type-- --pos-- EepromSchemeVersion ULONG(4) 0 DCC start address: UINT(2) 4 steps per revolution: LONG(4) 10 number of tracks: BYTE(1) 14 reverse default direction: BYTE(1) 15 speed [steps per second]: UINT(2) 16 acceleration steps: UINT(2) 18
Of zou het theoretisch voor kunnen komen dat het brugspoor op meer plekken omgepoold moet worden?
struct{ uint32_t version ; uint16_t startAddress ; uint32_t stepsPerRevolution ; // or 'circumreference' uint8_t nTracks ; // zou deze elders opslaan, zie verderop uint8_t defaultDirection ; uint16_t speed ; uint16_t acceleration ;} setting ;
// usagevoid someFunc(){ settings.version = 0xCC33 ; // write int variable = settings.nTracks ; // read}
// to storevoid storeSettings(){ int eeAddress = 0x0000 ; EEPROM.put( eeAddress, settings ) ; // stores all settings}void loadSettings(){ int eeAddress = 0x0000 ; EEPROM.get( eeAddress, settings ) ; // loads all settings }
struct{ uint8_t nTracks ; // hold the amount of tracks. uint32_t positions[40] ; // choose 40 as maximum limit, may be more.} tracks ;// usageuint32_t getPosition( int index ){ return tracks.position[index] & 0x7FFF ; // return all bit but MSB (relay state)}uint8_t getRelayState( int index ){ return tracks.position[index] >> 15 ; // return the state bit.}void setPosition( uint32_t position, uint8_t relayState ){ uint8_t index = tracks.nTracks ; // position OR relayState tracks.position[index] = ( position & 0x7FFF ) | ( relayState << 15 ) ; tracks.nTracks ++ ; // increment every time when a track is stored}
// to store in eepromvoid storeTracks(){ int eeAddress = sizeof( settings ) ; // I calculate the first free address behind the settings structure EEPROM.put( eeAddress, tracks ) ; // stores all settings}void loadTracks(){ int eeAddress = sizeof( settings ) ; EEPROM.get( eeAddress, tracks ) ; // stores all settings }
void updatePosition( uint32_t position, uint8_t relayState, uint8_t index ) // index moved to argument{ // position OR relayState tracks.position[index] = ( position & 0x7FFF ) | ( relayState << 15 ) ;}// usageupdatePosition( currentPos, currentRelayState, currentTrack ) ;// when done update call storeTracks() ; to commit the change to EEPROM