mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-25 13:41:23 +01:00
Add version, analogue reads working
This commit is contained in:
parent
a480a5a3d2
commit
c8fea3a4a7
@ -48,6 +48,7 @@
|
|||||||
#include "DIAG.h"
|
#include "DIAG.h"
|
||||||
#include "FSH.h"
|
#include "FSH.h"
|
||||||
#include "EX-IOExpanderPins.h"
|
#include "EX-IOExpanderPins.h"
|
||||||
|
#include "IO_EXIOExpander_version.h"
|
||||||
|
|
||||||
// Include user defined pin maps in myEX-IOExpander if defined
|
// Include user defined pin maps in myEX-IOExpander if defined
|
||||||
#if __has_include ("myEX-IOExpander.h")
|
#if __has_include ("myEX-IOExpander.h")
|
||||||
@ -60,13 +61,13 @@
|
|||||||
*/
|
*/
|
||||||
class EXIOExpander : public IODevice {
|
class EXIOExpander : public IODevice {
|
||||||
public:
|
public:
|
||||||
static void create(VPIN vpin, int nPins, uint8_t i2cAddress, byte numDigitalPins, byte numAnaloguePins) {
|
static void create(VPIN vpin, int nPins, uint8_t i2cAddress, int numDigitalPins, int numAnaloguePins) {
|
||||||
if (checkNoOverlap(vpin, nPins, i2cAddress)) new EXIOExpander(vpin, nPins, i2cAddress, numDigitalPins, numAnaloguePins);
|
if (checkNoOverlap(vpin, nPins, i2cAddress)) new EXIOExpander(vpin, nPins, i2cAddress, numDigitalPins, numAnaloguePins);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Constructor
|
// Constructor
|
||||||
EXIOExpander(VPIN firstVpin, int nPins, uint8_t i2cAddress, byte numDigitalPins, byte numAnaloguePins) {
|
EXIOExpander(VPIN firstVpin, int nPins, uint8_t i2cAddress, int numDigitalPins, int numAnaloguePins) {
|
||||||
_firstVpin = firstVpin;
|
_firstVpin = firstVpin;
|
||||||
_nPins = nPins;
|
_nPins = nPins;
|
||||||
_i2cAddress = i2cAddress;
|
_i2cAddress = i2cAddress;
|
||||||
@ -74,8 +75,8 @@ private:
|
|||||||
_numAnaloguePins = numAnaloguePins;
|
_numAnaloguePins = numAnaloguePins;
|
||||||
_digitalOutBuffer = (byte *)calloc(_numDigitalPins + 1, 1);
|
_digitalOutBuffer = (byte *)calloc(_numDigitalPins + 1, 1);
|
||||||
_digitalInBuffer = (byte *)calloc(_numDigitalPins, 1);
|
_digitalInBuffer = (byte *)calloc(_numDigitalPins, 1);
|
||||||
_analogueOutBuffer = (byte *)calloc(_numAnaloguePins + 1, 1);
|
_analogueValues = (uint16_t *)calloc(_numAnaloguePins, 1);
|
||||||
_analogueInBuffer = (byte *)calloc(_numAnaloguePins, 1);
|
_currentAPin = _nPins - _numAnaloguePins;
|
||||||
addDevice(this);
|
addDevice(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +85,7 @@ private:
|
|||||||
uint8_t _check = I2CManager.checkAddress(_i2cAddress);
|
uint8_t _check = I2CManager.checkAddress(_i2cAddress);
|
||||||
if (I2CManager.exists(_i2cAddress)) {
|
if (I2CManager.exists(_i2cAddress)) {
|
||||||
_activity = EXIOINIT; // First thing to do is configure EX-IOExpander device
|
_activity = EXIOINIT; // First thing to do is configure EX-IOExpander device
|
||||||
|
DIAG(F("EX-IOExpander x%x using driver version %S"), _i2cAddress, EXIO_VERSION);
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
_display();
|
_display();
|
||||||
#endif
|
#endif
|
||||||
@ -105,10 +107,22 @@ private:
|
|||||||
I2CManager.write(_i2cAddress, _setupBuffer, 3, &_i2crb);
|
I2CManager.write(_i2cAddress, _setupBuffer, 3, &_i2crb);
|
||||||
_activity = EXIORDY;
|
_activity = EXIORDY;
|
||||||
break;
|
break;
|
||||||
|
case EXIORDY:
|
||||||
|
_analogueOutBuffer[0] = EXIORDAN;
|
||||||
|
_analogueOutBuffer[1] = _currentAPin - _numDigitalPins;
|
||||||
|
I2CManager.read(_i2cAddress, _analogueInBuffer, 2, _analogueOutBuffer, 2, &_i2crb);
|
||||||
|
_analogueValues[_currentAPin] = (_analogueInBuffer[1] << 8) + _analogueInBuffer[0];
|
||||||
|
if (++_currentAPin >= _numDigitalPins + _numAnaloguePins) _currentAPin = _nPins - _numAnaloguePins;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// delayUntil(currentMicros + 2000000); // Delay 2 seconds while bug fixing/developing
|
||||||
|
}
|
||||||
|
|
||||||
|
int _readAnalogue(VPIN vpin) override {
|
||||||
|
int pin = vpin - _firstVpin;
|
||||||
|
return _analogueValues[pin];
|
||||||
}
|
}
|
||||||
|
|
||||||
void _display() override {
|
void _display() override {
|
||||||
@ -124,8 +138,10 @@ private:
|
|||||||
uint8_t _setupBuffer[3];
|
uint8_t _setupBuffer[3];
|
||||||
byte * _digitalOutBuffer = NULL;
|
byte * _digitalOutBuffer = NULL;
|
||||||
byte * _digitalInBuffer = NULL;
|
byte * _digitalInBuffer = NULL;
|
||||||
byte * _analogueOutBuffer = NULL;
|
byte _analogueInBuffer[2];
|
||||||
byte * _analogueInBuffer = NULL;
|
byte _analogueOutBuffer[2];
|
||||||
|
uint16_t * _analogueValues = NULL;
|
||||||
|
uint8_t _currentAPin; // Current analogue pin to read
|
||||||
uint8_t _activity;
|
uint8_t _activity;
|
||||||
I2CRB _i2crb;
|
I2CRB _i2crb;
|
||||||
|
|
||||||
@ -134,6 +150,8 @@ private:
|
|||||||
EXIORDY = 0xE1, // Flag we have completed setup procedure, also for EX-IO to ACK setup
|
EXIORDY = 0xE1, // Flag we have completed setup procedure, also for EX-IO to ACK setup
|
||||||
EXIODDIR = 0xE2, // Flag we're sending digital pin direction configuration
|
EXIODDIR = 0xE2, // Flag we're sending digital pin direction configuration
|
||||||
EXIODPUP = 0xE3, // Flag we're sending digital pin pullup configuration
|
EXIODPUP = 0xE3, // Flag we're sending digital pin pullup configuration
|
||||||
|
EXIOOP = 0xE4, // Flag to say we're operating normally
|
||||||
|
EXIORDAN = 0xE5, // Flag to read an analogue input
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
10
IO_EXIOExpander_version.h
Normal file
10
IO_EXIOExpander_version.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef IO_EXIOEXPANDER_VERSION_H
|
||||||
|
#define IO_EXIOEXPANDER_VERSION_H
|
||||||
|
|
||||||
|
#include "StringFormatter.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define EXIO_VERSION "0.0.1alpha"
|
||||||
|
// 0.0.1 Initial version for alpha testing
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user