mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-23 08:06:13 +01:00
Improve formatting of I2CAddress data type in diagnostics.
This commit is contained in:
parent
dd0ee8b50a
commit
9dd9990979
13
IODevice.cpp
13
IODevice.cpp
|
@ -74,6 +74,13 @@ void IODevice::begin() {
|
||||||
MCP23017::create(180, 16, 0x21);
|
MCP23017::create(180, 16, 0x21);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset() function to reinitialise all devices
|
||||||
|
void IODevice::reset() {
|
||||||
|
for (IODevice *dev = _firstDevice; dev != NULL; dev = dev->_nextDevice) {
|
||||||
|
dev->_begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Overarching static loop() method for the IODevice subsystem. Works through the
|
// Overarching static loop() method for the IODevice subsystem. Works through the
|
||||||
// list of installed devices and calls their individual _loop() method.
|
// list of installed devices and calls their individual _loop() method.
|
||||||
// Devices may or may not implement this, but if they do it is useful for things like animations
|
// Devices may or may not implement this, but if they do it is useful for things like animations
|
||||||
|
@ -302,9 +309,9 @@ IODevice *IODevice::findDeviceFollowing(VPIN vpin) {
|
||||||
|
|
||||||
// Private helper function to check for vpin overlap. Run during setup only.
|
// Private helper function to check for vpin overlap. Run during setup only.
|
||||||
// returns true if pins DONT overlap with existing device
|
// returns true if pins DONT overlap with existing device
|
||||||
bool IODevice::checkNoOverlap(VPIN firstPin, uint8_t nPins, uint8_t i2cAddress) {
|
bool IODevice::checkNoOverlap(VPIN firstPin, uint8_t nPins, I2CAddress i2cAddress) {
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("Check no overlap %d %d 0x%x"), firstPin,nPins,i2cAddress);
|
DIAG(F("Check no overlap %d %d %s"), firstPin,nPins,i2cAddress.toString());
|
||||||
#endif
|
#endif
|
||||||
VPIN lastPin=firstPin+nPins-1;
|
VPIN lastPin=firstPin+nPins-1;
|
||||||
for (IODevice *dev = _firstDevice; dev != 0; dev = dev->_nextDevice) {
|
for (IODevice *dev = _firstDevice; dev != 0; dev = dev->_nextDevice) {
|
||||||
|
@ -322,7 +329,7 @@ bool IODevice::checkNoOverlap(VPIN firstPin, uint8_t nPins, uint8_t i2cAddress)
|
||||||
}
|
}
|
||||||
// Check for overlapping I2C address
|
// Check for overlapping I2C address
|
||||||
if (i2cAddress && dev->_I2CAddress==i2cAddress) {
|
if (i2cAddress && dev->_I2CAddress==i2cAddress) {
|
||||||
DIAG(F("WARNING HAL Overlap. i2c Addr 0x%x ignored."),(int)i2cAddress);
|
DIAG(F("WARNING HAL Overlap. i2c Addr %s ignored."),i2cAddress.toString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,6 +113,10 @@ public:
|
||||||
// Also, the _begin method of any existing instances is called from here.
|
// Also, the _begin method of any existing instances is called from here.
|
||||||
static void begin();
|
static void begin();
|
||||||
|
|
||||||
|
// reset function to invoke all driver's _begin() methods again, to
|
||||||
|
// reset the state of the devices and reinitialise.
|
||||||
|
static void reset();
|
||||||
|
|
||||||
// configure is used invoke an IODevice instance's _configure method
|
// configure is used invoke an IODevice instance's _configure method
|
||||||
static bool configure(VPIN vpin, ConfigTypeEnum configType, int paramCount, int params[]);
|
static bool configure(VPIN vpin, ConfigTypeEnum configType, int paramCount, int params[]);
|
||||||
|
|
||||||
|
@ -165,7 +169,7 @@ public:
|
||||||
void setGPIOInterruptPin(int16_t pinNumber);
|
void setGPIOInterruptPin(int16_t pinNumber);
|
||||||
|
|
||||||
// Method to check if pins will overlap before creating new device.
|
// Method to check if pins will overlap before creating new device.
|
||||||
static bool checkNoOverlap(VPIN firstPin, uint8_t nPins=1, uint8_t i2cAddress=0);
|
static bool checkNoOverlap(VPIN firstPin, uint8_t nPins=1, I2CAddress i2cAddress=0);
|
||||||
|
|
||||||
// Method used by IODevice filters to locate slave pins that may be overlayed by their own
|
// Method used by IODevice filters to locate slave pins that may be overlayed by their own
|
||||||
// pin range.
|
// pin range.
|
||||||
|
|
|
@ -85,7 +85,7 @@ private:
|
||||||
_display();
|
_display();
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
DIAG(F("ADS111x device not found, I2C:%x"), (int)_I2CAddress);
|
DIAG(F("ADS111x device not found, I2C:%s"), _I2CAddress.toString());
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ private:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { // error status
|
} else { // error status
|
||||||
DIAG(F("ADS111x I2C:x%x Error:%d %S"), (int)_I2CAddress, status, I2CManager.getErrorMessage(status));
|
DIAG(F("ADS111x I2C:%s Error:%d %S"), _I2CAddress.toString(), status, I2CManager.getErrorMessage(status));
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void _display() override {
|
void _display() override {
|
||||||
DIAG(F("ADS111x I2C:x%x Configured on Vpins:%d-%d %S"), (int)_I2CAddress, _firstVpin, _firstVpin+_nPins-1,
|
DIAG(F("ADS111x I2C:%s Configured on Vpins:%d-%d %S"), _I2CAddress.toString(), _firstVpin, _firstVpin+_nPins-1,
|
||||||
_deviceState == DEVSTATE_FAILED ? F("OFFLINE") : F(""));
|
_deviceState == DEVSTATE_FAILED ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ static void create(uint8_t _I2CAddress) {
|
||||||
// XXXX change thistosave2 bytes
|
// XXXX change thistosave2 bytes
|
||||||
if (_checkforclock == 0) {
|
if (_checkforclock == 0) {
|
||||||
FAST_CLOCK_EXISTS = true;
|
FAST_CLOCK_EXISTS = true;
|
||||||
//DIAG(F("I2C Fast Clock found at x%x"), _I2CAddress);
|
//DIAG(F("I2C Fast Clock found at %s"), _I2CAddress.toString());
|
||||||
new EXFastClock(_I2CAddress);
|
new EXFastClock(_I2CAddress);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -68,7 +68,6 @@ static void create(uint8_t _I2CAddress) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t _I2CAddress;
|
|
||||||
|
|
||||||
|
|
||||||
// Initialisation of Fastclock
|
// Initialisation of Fastclock
|
||||||
|
@ -84,7 +83,7 @@ void _begin() override {
|
||||||
} else {
|
} else {
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
//LCD(6,F("CLOCK NOT FOUND"));
|
//LCD(6,F("CLOCK NOT FOUND"));
|
||||||
DIAG(F("Fast Clock Not Found at address %d"), _I2CAddress);
|
DIAG(F("Fast Clock Not Found at address %s"), _I2CAddress.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,7 +119,7 @@ void _loop(unsigned long currentMicros) override{
|
||||||
|
|
||||||
// Display EX-FastClock device driver info.
|
// Display EX-FastClock device driver info.
|
||||||
void _display() {
|
void _display() {
|
||||||
DIAG(F("FastCLock on I2C:x%x - %S"), _I2CAddress, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
DIAG(F("FastCLock on I2C:%s - %S"), _I2CAddress.toString(), (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -63,7 +63,7 @@ private:
|
||||||
EXIOExpander(VPIN firstVpin, int nPins, I2CAddress i2cAddress, int numDigitalPins, int numAnaloguePins) {
|
EXIOExpander(VPIN firstVpin, int nPins, I2CAddress i2cAddress, int numDigitalPins, int numAnaloguePins) {
|
||||||
_firstVpin = firstVpin;
|
_firstVpin = firstVpin;
|
||||||
_nPins = nPins;
|
_nPins = nPins;
|
||||||
_i2cAddress = i2cAddress;
|
_I2CAddress = i2cAddress;
|
||||||
_numDigitalPins = numDigitalPins;
|
_numDigitalPins = numDigitalPins;
|
||||||
_numAnaloguePins = numAnaloguePins;
|
_numAnaloguePins = numAnaloguePins;
|
||||||
_digitalPinBytes = (numDigitalPins+7)/8;
|
_digitalPinBytes = (numDigitalPins+7)/8;
|
||||||
|
@ -76,31 +76,31 @@ private:
|
||||||
void _begin() {
|
void _begin() {
|
||||||
// Initialise EX-IOExander device
|
// Initialise EX-IOExander device
|
||||||
I2CManager.begin();
|
I2CManager.begin();
|
||||||
if (I2CManager.exists(_i2cAddress)) {
|
if (I2CManager.exists(_I2CAddress)) {
|
||||||
_digitalOutBuffer[0] = EXIOINIT;
|
_digitalOutBuffer[0] = EXIOINIT;
|
||||||
_digitalOutBuffer[1] = _numDigitalPins;
|
_digitalOutBuffer[1] = _numDigitalPins;
|
||||||
_digitalOutBuffer[2] = _numAnaloguePins;
|
_digitalOutBuffer[2] = _numAnaloguePins;
|
||||||
// Send config, if EXIORDY returned, we're good, otherwise go offline
|
// Send config, if EXIORDY returned, we're good, otherwise go offline
|
||||||
I2CManager.read(_i2cAddress, _commandBuffer, 1, _digitalOutBuffer, 3);
|
I2CManager.read(_I2CAddress, _commandBuffer, 1, _digitalOutBuffer, 3);
|
||||||
if (_commandBuffer[0] != EXIORDY) {
|
if (_commandBuffer[0] != EXIORDY) {
|
||||||
DIAG(F("ERROR configuring EX-IOExpander device, I2C:x%x"), (int)_i2cAddress);
|
DIAG(F("ERROR configuring EX-IOExpander device, I2C:%s"), _I2CAddress.toString());
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Attempt to get version, if we don't get it, we don't care, don't go offline
|
// Attempt to get version, if we don't get it, we don't care, don't go offline
|
||||||
// Using digital in buffer in reverse to save RAM
|
// Using digital in buffer in reverse to save RAM
|
||||||
_commandBuffer[0] = EXIOVER;
|
_commandBuffer[0] = EXIOVER;
|
||||||
I2CManager.read(_i2cAddress, _versionBuffer, 3, _commandBuffer, 1);
|
I2CManager.read(_I2CAddress, _versionBuffer, 3, _commandBuffer, 1);
|
||||||
_majorVer = _versionBuffer[0];
|
_majorVer = _versionBuffer[0];
|
||||||
_minorVer = _versionBuffer[1];
|
_minorVer = _versionBuffer[1];
|
||||||
_patchVer = _versionBuffer[2];
|
_patchVer = _versionBuffer[2];
|
||||||
DIAG(F("EX-IOExpander device found, I2C:x%x, Version v%d.%d.%d"),
|
DIAG(F("EX-IOExpander device found, I2C:%s, Version v%d.%d.%d"),
|
||||||
(int)_i2cAddress, _versionBuffer[0], _versionBuffer[1], _versionBuffer[2]);
|
_I2CAddress.toString(), _versionBuffer[0], _versionBuffer[1], _versionBuffer[2]);
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
_display();
|
_display();
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
DIAG(F("EX-IOExpander device not found, I2C:x%x"), (int)_i2cAddress);
|
DIAG(F("EX-IOExpander device not found, I2C:%s"), _I2CAddress.toString());
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ private:
|
||||||
_digitalOutBuffer[0] = EXIODPUP;
|
_digitalOutBuffer[0] = EXIODPUP;
|
||||||
_digitalOutBuffer[1] = pin;
|
_digitalOutBuffer[1] = pin;
|
||||||
_digitalOutBuffer[2] = pullup;
|
_digitalOutBuffer[2] = pullup;
|
||||||
I2CManager.write(_i2cAddress, _digitalOutBuffer, 3);
|
I2CManager.write(_I2CAddress, _digitalOutBuffer, 3);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,16 +130,16 @@ private:
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
_analogueOutBuffer[0] = EXIOENAN;
|
_analogueOutBuffer[0] = EXIOENAN;
|
||||||
_analogueOutBuffer[1] = pin;
|
_analogueOutBuffer[1] = pin;
|
||||||
I2CManager.write(_i2cAddress, _analogueOutBuffer, 2);
|
I2CManager.write(_I2CAddress, _analogueOutBuffer, 2);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _loop(unsigned long currentMicros) override {
|
void _loop(unsigned long currentMicros) override {
|
||||||
(void)currentMicros; // remove warning
|
(void)currentMicros; // remove warning
|
||||||
_commandBuffer[0] = EXIORDD;
|
_commandBuffer[0] = EXIORDD;
|
||||||
I2CManager.read(_i2cAddress, _digitalInputStates, _digitalPinBytes, _commandBuffer, 1);
|
I2CManager.read(_I2CAddress, _digitalInputStates, _digitalPinBytes, _commandBuffer, 1);
|
||||||
_commandBuffer[0] = EXIORDAN;
|
_commandBuffer[0] = EXIORDAN;
|
||||||
I2CManager.read(_i2cAddress, _analogueInputStates, _analoguePinBytes, _commandBuffer, 1);
|
I2CManager.read(_I2CAddress, _analogueInputStates, _analoguePinBytes, _commandBuffer, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int _readAnalogue(VPIN vpin) override {
|
int _readAnalogue(VPIN vpin) override {
|
||||||
|
@ -164,7 +164,7 @@ private:
|
||||||
_digitalOutBuffer[0] = EXIOWRD;
|
_digitalOutBuffer[0] = EXIOWRD;
|
||||||
_digitalOutBuffer[1] = pin;
|
_digitalOutBuffer[1] = pin;
|
||||||
_digitalOutBuffer[2] = value;
|
_digitalOutBuffer[2] = value;
|
||||||
I2CManager.write(_i2cAddress, _digitalOutBuffer, 3);
|
I2CManager.write(_I2CAddress, _digitalOutBuffer, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _display() override {
|
void _display() override {
|
||||||
|
@ -176,14 +176,13 @@ private:
|
||||||
_firstAnalogue = _firstVpin + _numDigitalPins;
|
_firstAnalogue = _firstVpin + _numDigitalPins;
|
||||||
_lastAnalogue = _firstVpin + _nPins - 1;
|
_lastAnalogue = _firstVpin + _nPins - 1;
|
||||||
}
|
}
|
||||||
DIAG(F("EX-IOExpander I2C:x%x v%d.%d.%d: %d Digital Vpins %d-%d, %d Analogue Vpins %d-%d %S"),
|
DIAG(F("EX-IOExpander I2C:%s v%d.%d.%d: %d Digital Vpins %d-%d, %d Analogue Vpins %d-%d %S"),
|
||||||
(int)_i2cAddress, _majorVer, _minorVer, _patchVer,
|
_I2CAddress.toString(), _majorVer, _minorVer, _patchVer,
|
||||||
_numDigitalPins, _firstVpin, _firstVpin + _numDigitalPins - 1,
|
_numDigitalPins, _firstVpin, _firstVpin + _numDigitalPins - 1,
|
||||||
_numAnaloguePins, _firstAnalogue, _lastAnalogue,
|
_numAnaloguePins, _firstAnalogue, _lastAnalogue,
|
||||||
_deviceState == DEVSTATE_FAILED ? F("OFFLINE") : F(""));
|
_deviceState == DEVSTATE_FAILED ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t _i2cAddress;
|
|
||||||
uint8_t _numDigitalPins;
|
uint8_t _numDigitalPins;
|
||||||
uint8_t _numAnaloguePins;
|
uint8_t _numAnaloguePins;
|
||||||
byte _analogueOutBuffer[2];
|
byte _analogueOutBuffer[2];
|
||||||
|
|
|
@ -106,15 +106,15 @@ void EXTurntable::_writeAnalogue(VPIN vpin, int value, uint8_t activity, uint16_
|
||||||
DIAG(F("EX-Turntable WriteAnalogue Vpin:%d Value:%d Activity:%d Duration:%d"),
|
DIAG(F("EX-Turntable WriteAnalogue Vpin:%d Value:%d Activity:%d Duration:%d"),
|
||||||
vpin, value, activity, duration);
|
vpin, value, activity, duration);
|
||||||
DIAG(F("I2CManager write I2C Address:%d stepsMSB:%d stepsLSB:%d activity:%d"),
|
DIAG(F("I2CManager write I2C Address:%d stepsMSB:%d stepsLSB:%d activity:%d"),
|
||||||
(int)_I2CAddress, stepsMSB, stepsLSB, activity);
|
_I2CAddress.toString(), stepsMSB, stepsLSB, activity);
|
||||||
#endif
|
#endif
|
||||||
_stepperStatus = 1; // Tell the device driver Turntable-EX is busy
|
_stepperStatus = 1; // Tell the device driver Turntable-EX is busy
|
||||||
I2CManager.write((int)_I2CAddress, 3, stepsMSB, stepsLSB, activity);
|
I2CManager.write(_I2CAddress, 3, stepsMSB, stepsLSB, activity);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display Turnetable-EX device driver info.
|
// Display Turnetable-EX device driver info.
|
||||||
void EXTurntable::_display() {
|
void EXTurntable::_display() {
|
||||||
DIAG(F("EX-Turntable I2C:x%x Configured on Vpins:%d-%d %S"), (int)_I2CAddress, (int)_firstVpin,
|
DIAG(F("EX-Turntable I2C:%s Configured on Vpins:%d-%d %S"), _I2CAddress.toString(), (int)_firstVpin,
|
||||||
(int)_firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
(int)_firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ void GPIOBase<T>::_begin() {
|
||||||
_setupDevice();
|
_setupDevice();
|
||||||
_deviceState = DEVSTATE_NORMAL;
|
_deviceState = DEVSTATE_NORMAL;
|
||||||
} else {
|
} else {
|
||||||
DIAG(F("%S I2C:x%x Device not detected"), _deviceName, (int)_I2CAddress);
|
DIAG(F("%S I2C:%s Device not detected"), _deviceName, _I2CAddress.toString());
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ bool GPIOBase<T>::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
|
||||||
bool pullup = params[0];
|
bool pullup = params[0];
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("%S I2C:x%x Config Pin:%d Val:%d"), _deviceName, (int)_I2CAddress, pin, pullup);
|
DIAG(F("%S I2C:%s Config Pin:%d Val:%d"), _deviceName, _I2CAddress.toString(), pin, pullup);
|
||||||
#endif
|
#endif
|
||||||
uint16_t mask = 1 << pin;
|
uint16_t mask = 1 << pin;
|
||||||
if (pullup)
|
if (pullup)
|
||||||
|
@ -151,7 +151,7 @@ void GPIOBase<T>::_loop(unsigned long currentMicros) {
|
||||||
_deviceState = DEVSTATE_NORMAL;
|
_deviceState = DEVSTATE_NORMAL;
|
||||||
} else {
|
} else {
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
DIAG(F("%S I2C:x%x Error:%d %S"), _deviceName, (int)_I2CAddress, status,
|
DIAG(F("%S I2C:%s Error:%d %S"), _deviceName, _I2CAddress.toString(), status,
|
||||||
I2CManager.getErrorMessage(status));
|
I2CManager.getErrorMessage(status));
|
||||||
}
|
}
|
||||||
_processCompletion(status);
|
_processCompletion(status);
|
||||||
|
@ -174,7 +174,7 @@ void GPIOBase<T>::_loop(unsigned long currentMicros) {
|
||||||
|
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
if (differences)
|
if (differences)
|
||||||
DIAG(F("%S I2C:x%x PortStates:%x"), _deviceName, (int)_I2CAddress, _portInputState);
|
DIAG(F("%S I2C:%s PortStates:%x"), _deviceName, _I2CAddress.toString(), _portInputState);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ void GPIOBase<T>::_loop(unsigned long currentMicros) {
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void GPIOBase<T>::_display() {
|
void GPIOBase<T>::_display() {
|
||||||
DIAG(F("%S I2C:x%x Configured on Vpins:%d-%d %S"), _deviceName, (int)_I2CAddress,
|
DIAG(F("%S I2C:%s Configured on Vpins:%d-%d %S"), _deviceName, _I2CAddress.toString(),
|
||||||
_firstVpin, _firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
_firstVpin, _firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ void GPIOBase<T>::_write(VPIN vpin, int value) {
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
T mask = 1 << pin;
|
T mask = 1 << pin;
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("%S I2C:x%x Write Pin:%d Val:%d"), _deviceName, (int)_I2CAddress, pin, value);
|
DIAG(F("%S I2C:%s Write Pin:%d Val:%d"), _deviceName, _I2CAddress.toString(), pin, value);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set port mode output if currently not output mode
|
// Set port mode output if currently not output mode
|
||||||
|
@ -240,7 +240,7 @@ int GPIOBase<T>::_read(VPIN vpin) {
|
||||||
// Set unused pin and write mode pin value to 1
|
// Set unused pin and write mode pin value to 1
|
||||||
_portInputState |= ~_portInUse | _portMode;
|
_portInputState |= ~_portInUse | _portMode;
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("%S I2C:x%x PortStates:%x"), _deviceName, (int)_I2CAddress, _portInputState);
|
DIAG(F("%S I2C:%s PortStates:%x"), _deviceName, _I2CAddress.toString(), _portInputState);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return (_portInputState & mask) ? 0 : 1; // Invert state (5v=0, 0v=1)
|
return (_portInputState & mask) ? 0 : 1; // Invert state (5v=0, 0v=1)
|
||||||
|
|
|
@ -86,32 +86,38 @@ protected:
|
||||||
_buffer = (char *)calloc(_numRows*_numCols, sizeof(char));
|
_buffer = (char *)calloc(_numRows*_numCols, sizeof(char));
|
||||||
_rowGeneration = (uint8_t *)calloc(_numRows, sizeof(uint8_t));
|
_rowGeneration = (uint8_t *)calloc(_numRows, sizeof(uint8_t));
|
||||||
_lastRowGeneration = (uint8_t *)calloc(_numRows, sizeof(uint8_t));
|
_lastRowGeneration = (uint8_t *)calloc(_numRows, sizeof(uint8_t));
|
||||||
|
// Fill buffer with spaces
|
||||||
|
memset(_buffer, ' ', _numCols*_numRows);
|
||||||
|
|
||||||
|
// Create OLED driver
|
||||||
|
oled = new SSD1306AsciiWire();
|
||||||
|
|
||||||
|
// Clear the entire screen
|
||||||
|
oled->clearNative();
|
||||||
|
|
||||||
addDevice(this);
|
addDevice(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Device-specific initialisation
|
// Device-specific initialisation
|
||||||
void _begin() override {
|
void _begin() override {
|
||||||
// Create OLED driver
|
|
||||||
oled = new SSD1306AsciiWire();
|
|
||||||
// Initialise device
|
// Initialise device
|
||||||
if (oled->begin(_I2CAddress, _width, _height)) {
|
if (oled->begin(_I2CAddress, _width, _height)) {
|
||||||
// Store pointer to this object into CS display hook, so that we
|
// Store pointer to this object into CS display hook, so that we
|
||||||
// will intercept any subsequent calls to lcdDisplay methods.
|
// will intercept any subsequent calls to lcdDisplay methods.
|
||||||
DisplayInterface::lcdDisplay = this;
|
DisplayInterface::lcdDisplay = this;
|
||||||
|
|
||||||
DIAG(F("OLEDDisplay installed on address x%x"), (int)_I2CAddress);
|
DIAG(F("OLEDDisplay installed on address %s"), _I2CAddress.toString());
|
||||||
|
|
||||||
// First clear the entire screen
|
|
||||||
oled->clearNative();
|
|
||||||
|
|
||||||
// Set first two lines on screen
|
// Set first two lines on screen
|
||||||
LCD(0,F("DCC++ EX v%S"),F(VERSION));
|
LCD(0,F("DCC++ EX v%S"),F(VERSION));
|
||||||
LCD(1,F("Lic GPLv3"));
|
LCD(1,F("Lic GPLv3"));
|
||||||
|
|
||||||
|
// Force all rows to be redrawn
|
||||||
|
for (uint8_t row=0; row<_numRows; row++)
|
||||||
|
_rowGeneration[row]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void _loop(unsigned long) override {
|
void _loop(unsigned long) override {
|
||||||
|
|
||||||
// Loop through the buffer and if a row has changed
|
// Loop through the buffer and if a row has changed
|
||||||
|
@ -196,7 +202,7 @@ protected:
|
||||||
|
|
||||||
// Display information about the device.
|
// Display information about the device.
|
||||||
void _display() {
|
void _display() {
|
||||||
DIAG(F("OLEDDisplay Configured addr x%x"), (int)_I2CAddress);
|
DIAG(F("OLEDDisplay Configured addr %s"), _I2CAddress.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -239,13 +239,13 @@ void PCA9685::updatePosition(uint8_t pin) {
|
||||||
// between 0 and 4095 for the PWM mark-to-period ratio, with 4095 being 100%.
|
// between 0 and 4095 for the PWM mark-to-period ratio, with 4095 being 100%.
|
||||||
void PCA9685::writeDevice(uint8_t pin, int value) {
|
void PCA9685::writeDevice(uint8_t pin, int value) {
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("PCA9685 I2C:x%x WriteDevice Pin:%d Value:%d"), (int)_I2CAddress, pin, value);
|
DIAG(F("PCA9685 I2C:%s WriteDevice Pin:%d Value:%d"), _I2CAddress.toString(), pin, value);
|
||||||
#endif
|
#endif
|
||||||
// Wait for previous request to complete
|
// Wait for previous request to complete
|
||||||
uint8_t status = requestBlock.wait();
|
uint8_t status = requestBlock.wait();
|
||||||
if (status != I2C_STATUS_OK) {
|
if (status != I2C_STATUS_OK) {
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
DIAG(F("PCA9685 I2C:x%x failed %S"), (int)_I2CAddress, I2CManager.getErrorMessage(status));
|
DIAG(F("PCA9685 I2C:%s failed %S"), _I2CAddress.toString(), I2CManager.getErrorMessage(status));
|
||||||
} else {
|
} else {
|
||||||
// Set up new request.
|
// Set up new request.
|
||||||
outputBuffer[0] = PCA9685_FIRST_SERVO + 4 * pin;
|
outputBuffer[0] = PCA9685_FIRST_SERVO + 4 * pin;
|
||||||
|
@ -259,7 +259,7 @@ void PCA9685::writeDevice(uint8_t pin, int value) {
|
||||||
|
|
||||||
// Display details of this device.
|
// Display details of this device.
|
||||||
void PCA9685::_display() {
|
void PCA9685::_display() {
|
||||||
DIAG(F("PCA9685 I2C:x%x Configured on Vpins:%d-%d %S"), (int)_I2CAddress, (int)_firstVpin,
|
DIAG(F("PCA9685 I2C:%s Configured on Vpins:%d-%d %S"), _I2CAddress.toString(), (int)_firstVpin,
|
||||||
(int)_firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
(int)_firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,8 +101,8 @@ private:
|
||||||
void _writeAnalogue(VPIN vpin, int value, uint8_t param1, uint16_t param2) override {
|
void _writeAnalogue(VPIN vpin, int value, uint8_t param1, uint16_t param2) override {
|
||||||
(void)param1; (void)param2; // suppress compiler warning
|
(void)param1; (void)param2; // suppress compiler warning
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("PCA9685pwm WriteAnalogue Vpin:%d Value:%d Profile:%d Duration:%d %S"),
|
DIAG(F("PCA9685pwm WriteAnalogue Vpin:%d Value:%d %S"),
|
||||||
vpin, value, profile, duration, _deviceState == DEVSTATE_FAILED?F("DEVSTATE_FAILED"):F(""));
|
vpin, value, _deviceState == DEVSTATE_FAILED?F("DEVSTATE_FAILED"):F(""));
|
||||||
#endif
|
#endif
|
||||||
if (_deviceState == DEVSTATE_FAILED) return;
|
if (_deviceState == DEVSTATE_FAILED) return;
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
|
@ -114,7 +114,7 @@ private:
|
||||||
|
|
||||||
// Display details of this device.
|
// Display details of this device.
|
||||||
void _display() override {
|
void _display() override {
|
||||||
DIAG(F("PCA9685pwm I2C:x%x Configured on Vpins:%d-%d %S"), (int)_I2CAddress, (int)_firstVpin,
|
DIAG(F("PCA9685pwm I2C:%s Configured on Vpins:%d-%d %S"), _I2CAddress.toString(), (int)_firstVpin,
|
||||||
(int)_firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
(int)_firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,13 +122,13 @@ private:
|
||||||
// between 0 and 4095 for the PWM mark-to-period ratio, with 4095 being 100%.
|
// between 0 and 4095 for the PWM mark-to-period ratio, with 4095 being 100%.
|
||||||
void writeDevice(uint8_t pin, int value) {
|
void writeDevice(uint8_t pin, int value) {
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
DIAG(F("PCA9685pwm I2C:x%x WriteDevice Pin:%d Value:%d"), (int)_I2CAddress, pin, value);
|
DIAG(F("PCA9685pwm I2C:%s WriteDevice Pin:%d Value:%d"), _I2CAddress.toString(), pin, value);
|
||||||
#endif
|
#endif
|
||||||
// Wait for previous request to complete
|
// Wait for previous request to complete
|
||||||
uint8_t status = requestBlock.wait();
|
uint8_t status = requestBlock.wait();
|
||||||
if (status != I2C_STATUS_OK) {
|
if (status != I2C_STATUS_OK) {
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
DIAG(F("PCA9685pwm I2C:x%x failed %S"), (int)_I2CAddress, I2CManager.getErrorMessage(status));
|
DIAG(F("PCA9685pwm I2C:%s failed %S"), _I2CAddress.toString(), I2CManager.getErrorMessage(status));
|
||||||
} else {
|
} else {
|
||||||
// Set up new request.
|
// Set up new request.
|
||||||
outputBuffer[0] = PCA9685_FIRST_SERVO + 4 * pin;
|
outputBuffer[0] = PCA9685_FIRST_SERVO + 4 * pin;
|
||||||
|
|
|
@ -104,7 +104,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void _display() override {
|
void _display() override {
|
||||||
DIAG(F("Rotary Encoder I2C:x%x v%d.%d.%d Configured on Vpin:%d-%d %S"), (int)_I2CAddress, _majorVer, _minorVer, _patchVer,
|
DIAG(F("Rotary Encoder I2C:%s v%d.%d.%d Configured on Vpin:%d-%d %S"), _I2CAddress.toString(), _majorVer, _minorVer, _patchVer,
|
||||||
(int)_firstVpin, _firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
(int)_firstVpin, _firstVpin+_nPins-1, (_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
30
IO_VL53L0X.h
30
IO_VL53L0X.h
|
@ -159,7 +159,9 @@ protected:
|
||||||
if (_xshutPin == VPIN_NONE && I2CManager.exists(_I2CAddress)) {
|
if (_xshutPin == VPIN_NONE && I2CManager.exists(_I2CAddress)) {
|
||||||
// Device already present on this address, so skip the address initialisation.
|
// Device already present on this address, so skip the address initialisation.
|
||||||
_nextState = STATE_CONFIGUREDEVICE;
|
_nextState = STATE_CONFIGUREDEVICE;
|
||||||
}
|
} else
|
||||||
|
_nextState = STATE_INIT;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _loop(unsigned long currentMicros) override {
|
void _loop(unsigned long currentMicros) override {
|
||||||
|
@ -171,7 +173,7 @@ protected:
|
||||||
// If no XSHUT pin is configured, then only one device is supported.
|
// If no XSHUT pin is configured, then only one device is supported.
|
||||||
if (_xshutPin != VPIN_NONE) IODevice::write(_xshutPin, 0);
|
if (_xshutPin != VPIN_NONE) IODevice::write(_xshutPin, 0);
|
||||||
_nextState = STATE_RESTARTMODULE;
|
_nextState = STATE_RESTARTMODULE;
|
||||||
delayUntil(currentMicros+1000);
|
delayUntil(currentMicros+10000);
|
||||||
break;
|
break;
|
||||||
case STATE_RESTARTMODULE:
|
case STATE_RESTARTMODULE:
|
||||||
// On second entry, set XSHUT pin high to allow this module to restart.
|
// On second entry, set XSHUT pin high to allow this module to restart.
|
||||||
|
@ -183,9 +185,8 @@ protected:
|
||||||
// shared flag accessible to all device instances.
|
// shared flag accessible to all device instances.
|
||||||
if (_addressConfigInProgress) return;
|
if (_addressConfigInProgress) return;
|
||||||
_addressConfigInProgress = true;
|
_addressConfigInProgress = true;
|
||||||
// Set XSHUT pin (if connected). Because of supply voltage differences,
|
// Set XSHUT pin (if connected) to bring the module out of sleep mode.
|
||||||
// drive the signal through the digital output's pull-up resistor.
|
if (_xshutPin != VPIN_NONE) IODevice::write(_xshutPin, 1);
|
||||||
if (_xshutPin != VPIN_NONE) IODevice::configureInput(_xshutPin, 1);
|
|
||||||
// Allow the module time to restart
|
// Allow the module time to restart
|
||||||
delayUntil(currentMicros+10000);
|
delayUntil(currentMicros+10000);
|
||||||
_nextState = STATE_CONFIGUREADDRESS;
|
_nextState = STATE_CONFIGUREADDRESS;
|
||||||
|
@ -202,15 +203,12 @@ protected:
|
||||||
I2CManager.write(VL53L0X_I2C_DEFAULT_ADDRESS, 2, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, _I2CAddress);
|
I2CManager.write(VL53L0X_I2C_DEFAULT_ADDRESS, 2, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, _I2CAddress);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
_addressConfigInProgress = false;
|
delayUntil(currentMicros+10000);
|
||||||
_nextState = STATE_SKIP;
|
|
||||||
break;
|
|
||||||
case STATE_SKIP:
|
|
||||||
// Do nothing on the third entry.
|
|
||||||
_nextState = STATE_CONFIGUREDEVICE;
|
|
||||||
break;
|
break;
|
||||||
case STATE_CONFIGUREDEVICE:
|
case STATE_CONFIGUREDEVICE:
|
||||||
// On next entry, check if device address has been set.
|
// Allow next VL53L0X device to be configured
|
||||||
|
_addressConfigInProgress = false;
|
||||||
|
// Now check if device address has been set.
|
||||||
if (I2CManager.exists(_I2CAddress)) {
|
if (I2CManager.exists(_I2CAddress)) {
|
||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
_display();
|
_display();
|
||||||
|
@ -220,7 +218,7 @@ protected:
|
||||||
read_reg(VL53L0X_CONFIG_PAD_SCL_SDA__EXTSUP_HV) | 0x01);
|
read_reg(VL53L0X_CONFIG_PAD_SCL_SDA__EXTSUP_HV) | 0x01);
|
||||||
_nextState = STATE_INITIATESCAN;
|
_nextState = STATE_INITIATESCAN;
|
||||||
} else {
|
} else {
|
||||||
DIAG(F("VL53L0X I2C:x%x device not responding"), (int)_I2CAddress);
|
DIAG(F("VL53L0X I2C:%s device not responding"), _I2CAddress.toString());
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
_nextState = STATE_FAILED;
|
_nextState = STATE_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -285,7 +283,7 @@ protected:
|
||||||
|
|
||||||
// Function to report a failed I2C operation. Put the device off-line.
|
// Function to report a failed I2C operation. Put the device off-line.
|
||||||
void reportError(uint8_t status) {
|
void reportError(uint8_t status) {
|
||||||
DIAG(F("VL53L0X I2C:x%x Error:%d %S"), (int)_I2CAddress, status, I2CManager.getErrorMessage(status));
|
DIAG(F("VL53L0X I2C:%s Error:%d %S"), _I2CAddress.toString(), status, I2CManager.getErrorMessage(status));
|
||||||
_deviceState = DEVSTATE_FAILED;
|
_deviceState = DEVSTATE_FAILED;
|
||||||
_value = false;
|
_value = false;
|
||||||
}
|
}
|
||||||
|
@ -314,8 +312,8 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
void _display() override {
|
void _display() override {
|
||||||
DIAG(F("VL53L0X I2C:x%x Configured on Vpins:%d-%d On:%dmm Off:%dmm %S"),
|
DIAG(F("VL53L0X I2C:%s Configured on Vpins:%d-%d On:%dmm Off:%dmm %S"),
|
||||||
(int)_I2CAddress, _firstVpin, _firstVpin+_nPins-1, _onThreshold, _offThreshold,
|
_I2CAddress.toString(), _firstVpin, _firstVpin+_nPins-1, _onThreshold, _offThreshold,
|
||||||
(_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
(_deviceState==DEVSTATE_FAILED) ? F("OFFLINE") : F(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ LiquidCrystal_I2C::LiquidCrystal_I2C(I2CAddress lcd_Addr, uint8_t lcd_cols,
|
||||||
I2CManager.setClock(100000L); // PCF8574 is spec'd to 100kHz.
|
I2CManager.setClock(100000L); // PCF8574 is spec'd to 100kHz.
|
||||||
|
|
||||||
if (I2CManager.exists(lcd_Addr)) {
|
if (I2CManager.exists(lcd_Addr)) {
|
||||||
DIAG(F("%dx%d LCD configured on I2C:x%x"), (int)lcd_cols, (int)lcd_rows, (int)lcd_Addr);
|
DIAG(F("%dx%d LCD configured on I2C:%s"), (int)lcd_cols, (int)lcd_rows, (int)lcd_Addr);
|
||||||
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
|
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
|
||||||
begin();
|
begin();
|
||||||
backlight();
|
backlight();
|
||||||
|
|
|
@ -197,7 +197,7 @@ bool SSD1306AsciiWire::begin(I2CAddress address, int width, int height) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Device found
|
// Device found
|
||||||
DIAG(F("%dx%d OLED display configured on I2C:x%x"), m_displayWidth, m_displayHeight, (int)m_i2cAddr);
|
DIAG(F("%dx%d OLED display configured on I2C:%s"), m_displayWidth, m_displayHeight, m_i2cAddr.toString());
|
||||||
clear();
|
clear();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user