mirror of
https://github.com/KevinMidboe/xserve-io.git
synced 2025-10-29 18:00:22 +00:00
Running all devices
This commit is contained in:
331
all-functions/all-functions.ino
Normal file
331
all-functions/all-functions.ino
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
#include "Wire.h"
|
||||||
|
#include <PCA9554.h> // Load the PCA9554 Library
|
||||||
|
|
||||||
|
#define TCAADDR 0x70
|
||||||
|
|
||||||
|
// byte saa1064 = 0x3B;
|
||||||
|
PCA9554 ioCon1(0x24); // Create an object at this address
|
||||||
|
|
||||||
|
|
||||||
|
// LEDs have two addresses, one for RED another for GREEN
|
||||||
|
bool fanGreenLED;
|
||||||
|
bool fanRedLED;
|
||||||
|
bool tempGreenLED;
|
||||||
|
bool tempRedLED;
|
||||||
|
bool powerGreenLED;
|
||||||
|
bool powerRedLED;
|
||||||
|
bool modeSelect;
|
||||||
|
|
||||||
|
bool nic1State = 0;
|
||||||
|
bool nic2State = 0;
|
||||||
|
bool lockButtonState = 1;
|
||||||
|
bool modeButtonState = 1;
|
||||||
|
|
||||||
|
int powerState = 0;
|
||||||
|
// first bit is current value, second bit is alarm state
|
||||||
|
int fanState[2] = {0, 0};
|
||||||
|
int tempState[2] = {0, 0};
|
||||||
|
|
||||||
|
byte centerColumnsMemoryMap[2][4] = {
|
||||||
|
{0b00000000, 0b00000000, 0b00000000, 0b00000000}, // left column
|
||||||
|
{0b00000000, 0b00000000, 0b00000000, 0b00000000} // right column
|
||||||
|
};
|
||||||
|
|
||||||
|
byte ioHash = 0;
|
||||||
|
|
||||||
|
// --- ADDRESS MAPs ---
|
||||||
|
int IOMapLength = 8;
|
||||||
|
bool* mapIO[8] = {&powerGreenLED, &powerRedLED, &fanGreenLED, &fanRedLED, &tempGreenLED, &tempRedLED, &lockButtonState, &modeSelect};
|
||||||
|
// bool mapNics[3] = {nic1State, nic2State};
|
||||||
|
|
||||||
|
// --- PIN DEFINITIONS ---
|
||||||
|
int POWER_FAIL_PIN = 8;
|
||||||
|
int FAN_PIN = 9;
|
||||||
|
int POWER_PIN = 12;
|
||||||
|
int NIC_1_PIN = 10;
|
||||||
|
int NIC_2_PIN = 11;
|
||||||
|
int BUTTON_LOCK_PIN = A3;
|
||||||
|
int BUTTON_MODE_PIN = A2;
|
||||||
|
|
||||||
|
unsigned long lastDebounceTimeLock = 0;
|
||||||
|
unsigned long lastDebounceTimeMode = 0;
|
||||||
|
const int DEBOUNCE_DELAY = 30;
|
||||||
|
|
||||||
|
unsigned long lastUpdateIO = 0;
|
||||||
|
const int IO_UPDATE_INTERVAL = 200;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
// Serial.println(mapIO[0]);
|
||||||
|
pinMode(POWER_FAIL_PIN, INPUT);
|
||||||
|
pinMode(FAN_PIN, INPUT);
|
||||||
|
pinMode(NIC_1_PIN, INPUT);
|
||||||
|
pinMode(NIC_2_PIN, INPUT);
|
||||||
|
pinMode(POWER_PIN, INPUT);
|
||||||
|
|
||||||
|
pinMode(BUTTON_LOCK_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(BUTTON_MODE_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
Serial.println("setup all pinouts");
|
||||||
|
Wire.begin(); // start up I2C bus
|
||||||
|
Serial.println("i2c setup");
|
||||||
|
|
||||||
|
ioCon1.portMode(ALLOUTPUT);
|
||||||
|
Serial.println("iocon1 setup");
|
||||||
|
|
||||||
|
delay(500);
|
||||||
|
|
||||||
|
selectRightHalf();
|
||||||
|
lightUpIO();
|
||||||
|
selectLeftHalf();
|
||||||
|
lightUpIO();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightUpIO() {
|
||||||
|
Serial.println("ligthing up top io");
|
||||||
|
for (int i = 0; i < IOMapLength; ++i) {
|
||||||
|
ioCon1.digitalWrite(i, mapIO[i]);
|
||||||
|
}
|
||||||
|
Serial.println("finished ligthing up top io");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
|
||||||
|
void updateTime() {
|
||||||
|
currentTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
int fanBlinkCounter = 0;
|
||||||
|
|
||||||
|
unsigned long fanToggledAt;
|
||||||
|
void updateFanState(int state) {
|
||||||
|
// fan changed and did so within 1 second
|
||||||
|
bool stateChanged = state != fanState[0];
|
||||||
|
fanState[0] = state;
|
||||||
|
|
||||||
|
// detect that blinking is happening
|
||||||
|
if (stateChanged && (currentTime - fanToggledAt > 250)) {
|
||||||
|
fanState[1] = 1;
|
||||||
|
fanToggledAt = currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// detect that blinking stopped
|
||||||
|
// if alarm && it changes && it has been more then 2 times the frex since last toggle
|
||||||
|
if (fanState[1] == 1 && (currentTime > fanToggledAt + 1000)) {
|
||||||
|
// nothing to see here
|
||||||
|
fanState[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long tempToggledAt;
|
||||||
|
void updateTempState(int state) {
|
||||||
|
bool stateChanged = state != tempState[0];
|
||||||
|
tempState[0] = state;
|
||||||
|
|
||||||
|
// was 2 seconds ago last time it toggled
|
||||||
|
if (stateChanged == 1 && (currentTime - tempToggledAt > 250)) {
|
||||||
|
tempState[1] = 1;
|
||||||
|
tempToggledAt = currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// detect that blinking stopped
|
||||||
|
// if alarm && it changes && it has been more then 2 times the frex since last toggle
|
||||||
|
if (tempState[1] == 1 && (currentTime > tempToggledAt + 1000)) {
|
||||||
|
// nothing to see here
|
||||||
|
tempState[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO check that this goes RED when off
|
||||||
|
void greenRed(bool* greenLED, bool* redLED, bool value) {
|
||||||
|
// if no power set red led
|
||||||
|
if (value == 0) {
|
||||||
|
*greenLED = 0;
|
||||||
|
*redLED = 1;
|
||||||
|
// else if power set green led
|
||||||
|
} else {
|
||||||
|
*greenLED = 1;
|
||||||
|
*redLED = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void greenRedOnAlarm(bool* greedLED, bool* redLED, bool alarm) {
|
||||||
|
// if not alarm set green led
|
||||||
|
if (alarm == 0) {
|
||||||
|
*greedLED = 1;
|
||||||
|
*redLED = 0;
|
||||||
|
// if alarm set red led
|
||||||
|
} else {
|
||||||
|
*greedLED = 0;
|
||||||
|
*redLED = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void greenRedBlinkOnAlarm(bool* greenLED, bool* redLED, bool value, bool alarm) {
|
||||||
|
// void greenRedBlinkOnAlarm(bool* greenLED, bool* redLED, bool* currentState, bool* alarmState) {
|
||||||
|
// if no alarm --> set green led
|
||||||
|
if (alarm == 0) {
|
||||||
|
*greenLED = 1;
|
||||||
|
*redLED = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// everything below assumes alarm state
|
||||||
|
// alarm and signal --> red led (blink on)
|
||||||
|
if (value == 0) {
|
||||||
|
*greenLED = 0;
|
||||||
|
*redLED = 1;
|
||||||
|
}
|
||||||
|
// alarm and no signal --> no led (blink off)
|
||||||
|
else {
|
||||||
|
*greenLED = 0;
|
||||||
|
*redLED = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeIOLEDPoweredOff() {
|
||||||
|
ioCon1.digitalWrite(0, HIGH);
|
||||||
|
ioCon1.digitalWrite(1, LOW);
|
||||||
|
ioCon1.digitalWrite(2, HIGH);
|
||||||
|
ioCon1.digitalWrite(3, HIGH);
|
||||||
|
ioCon1.digitalWrite(4, HIGH);
|
||||||
|
ioCon1.digitalWrite(5, HIGH);
|
||||||
|
ioCon1.digitalWrite(6, *(mapIO[6]) == 1 ? 0 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateIOLED() {
|
||||||
|
if (powerState == 0) {
|
||||||
|
writeIOLEDPoweredOff();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < IOMapLength; ++i) {
|
||||||
|
ioCon1.digitalWrite(i, *(mapIO[i]) == 1 ? 0 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int lastIOHash = -1;
|
||||||
|
bool shouldUpdateIOLed() {
|
||||||
|
greenRedBlinkOnAlarm(&fanGreenLED, &fanRedLED, fanState[0], fanState[1]);
|
||||||
|
greenRedOnAlarm(&tempGreenLED, &tempRedLED, tempState[1]);
|
||||||
|
greenRed(&powerGreenLED, &powerRedLED, powerState);
|
||||||
|
|
||||||
|
byte ioHash = 0;
|
||||||
|
for (byte i = 0; i < IOMapLength; i++)
|
||||||
|
{
|
||||||
|
bitWrite(ioHash, i, *(mapIO[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioHash == lastIOHash) {
|
||||||
|
// Don't update i2c ctrl if same value
|
||||||
|
// Serial.println("Not updating!!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serial.println("Updating IO!!");
|
||||||
|
lastIOHash = ioHash;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateState() {
|
||||||
|
bool fanS = digitalRead(FAN_PIN);
|
||||||
|
updateFanState(fanS);
|
||||||
|
updateTempState(fanS);
|
||||||
|
powerState = digitalRead(POWER_PIN);
|
||||||
|
|
||||||
|
nic1State = !digitalRead(NIC_1_PIN);
|
||||||
|
nic2State = !digitalRead(NIC_2_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool handleButtonPress(int address, bool* value, long unsigned int* debounce) {
|
||||||
|
bool btnVal = !digitalRead(address);
|
||||||
|
|
||||||
|
if (btnVal != *value) {
|
||||||
|
*debounce = currentTime;
|
||||||
|
*value = btnVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*debounce > 0 && (currentTime - *debounce) > DEBOUNCE_DELAY) {
|
||||||
|
*debounce = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeModes() {
|
||||||
|
bool btnVal = !digitalRead(BUTTON_MODE_PIN);
|
||||||
|
|
||||||
|
if (btnVal == 1) {
|
||||||
|
modeSelect = !modeSelect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tcaselect(uint8_t i) {
|
||||||
|
if (i > 7) return;
|
||||||
|
|
||||||
|
Wire.beginTransmission(TCAADDR);
|
||||||
|
Wire.write(1 << i);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectLeftHalf() {
|
||||||
|
tcaselect(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectRightHalf() {
|
||||||
|
tcaselect(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeEthernetActivity() {
|
||||||
|
selectLeftHalf();
|
||||||
|
resetEthernetBit(centerColumnsMemoryMap[0]);
|
||||||
|
computeEthernetActivity(centerColumnsMemoryMap[0], nic1State);
|
||||||
|
writeCenterColumnFirstBank(centerColumnsMemoryMap[0]);
|
||||||
|
delay(1);
|
||||||
|
|
||||||
|
selectRightHalf();
|
||||||
|
resetEthernetBit(centerColumnsMemoryMap[1]);
|
||||||
|
computeEthernetActivity(centerColumnsMemoryMap[1], nic2State);
|
||||||
|
writeCenterColumnFirstBank(centerColumnsMemoryMap[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Serial.println("loop start");
|
||||||
|
|
||||||
|
updateTime();
|
||||||
|
updateState();
|
||||||
|
handleButtonPress(BUTTON_LOCK_PIN, &lockButtonState, &lastDebounceTimeLock);
|
||||||
|
if (handleButtonPress(BUTTON_MODE_PIN, &modeButtonState, &lastDebounceTimeMode)) {
|
||||||
|
changeModes();
|
||||||
|
}
|
||||||
|
|
||||||
|
writeEthernetActivity();
|
||||||
|
|
||||||
|
if (shouldUpdateIOLed() == true) {
|
||||||
|
resetBanks(centerColumnsMemoryMap[0]);
|
||||||
|
|
||||||
|
selectLeftHalf();
|
||||||
|
updateIOLED();
|
||||||
|
// displayUpToNumber(21);
|
||||||
|
displayPercentage(centerColumnsMemoryMap[0], 0.91);
|
||||||
|
|
||||||
|
delay(1);
|
||||||
|
resetBanks(centerColumnsMemoryMap[1]);
|
||||||
|
selectRightHalf();
|
||||||
|
updateIOLED();
|
||||||
|
displayUpToNumber(centerColumnsMemoryMap[1], random(24));
|
||||||
|
}
|
||||||
|
// if (currentTime - lastUpdateIO > IO_UPDATE_INTERVAL) {
|
||||||
|
// lastUpdateIO = currentTime;
|
||||||
|
// updateIOLED();
|
||||||
|
// }
|
||||||
|
// selectRightHalf();
|
||||||
|
// selectLeftHalf();
|
||||||
|
// shouldUpdateIOLed
|
||||||
|
|
||||||
|
// updateRightIOLED();
|
||||||
|
|
||||||
|
delay(20);
|
||||||
|
// Serial.println("loop end");
|
||||||
|
}
|
||||||
123
all-functions/center-column-saa1064.ino
Normal file
123
all-functions/center-column-saa1064.ino
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
// #include "Wire.h" // enable I2C bus
|
||||||
|
|
||||||
|
byte saa1064 = 0x3B; // define the I2C bus address for our SAA1064
|
||||||
|
|
||||||
|
byte bank1;
|
||||||
|
byte bank2;
|
||||||
|
byte bank3;
|
||||||
|
byte bank4;
|
||||||
|
|
||||||
|
int TOTAL_LEDS = 23;
|
||||||
|
byte activityLED = 0b00000001;
|
||||||
|
byte leds[23][4] = {
|
||||||
|
{0b00000010, 0b00000000, 0b00000000, 0b00000000}, // 1
|
||||||
|
{0b00000000, 0b00000010, 0b00000000, 0b00000000}, // 2
|
||||||
|
{0b00000100, 0b00000000, 0b00000000, 0b00000000}, // 3
|
||||||
|
{0b00000000, 0b00000100, 0b00000000, 0b00000000}, // 4
|
||||||
|
{0b00001000, 0b00000000, 0b00000000, 0b00000000}, // 5
|
||||||
|
{0b00000000, 0b00001000, 0b00000000, 0b00000000}, // 6
|
||||||
|
{0b00010000, 0b00000000, 0b00000000, 0b00000000}, // 7
|
||||||
|
{0b00000000, 0b00010000, 0b00000000, 0b00000000}, // 8
|
||||||
|
{0b00100000, 0b00000000, 0b00000000, 0b00000000}, // 9
|
||||||
|
{0b00000000, 0b00100000, 0b00000000, 0b00000000}, // 10
|
||||||
|
{0b01000000, 0b00000000, 0b00000000, 0b00000000}, // 11
|
||||||
|
{0b00000000, 0b01000000, 0b00000000, 0b00000000}, // 12
|
||||||
|
{0b00000000, 0b00000000, 0b00000001, 0b00000000}, // 13
|
||||||
|
{0b00000000, 0b00000000, 0b00000000, 0b00000001}, // 14
|
||||||
|
{0b00000000, 0b00000000, 0b00000010, 0b00000000}, // 15
|
||||||
|
{0b00000000, 0b00000000, 0b00000000, 0b00000010}, // 16
|
||||||
|
{0b00000000, 0b00000000, 0b00000100, 0b00000000}, // 17
|
||||||
|
{0b00000000, 0b00000000, 0b00000000, 0b00000100}, // 18
|
||||||
|
{0b00000000, 0b00000000, 0b00001000, 0b00000000}, // 19
|
||||||
|
{0b00000000, 0b00000000, 0b00000000, 0b00001000}, // 20
|
||||||
|
{0b00000000, 0b00000000, 0b00010000, 0b00000000}, // 21
|
||||||
|
{0b00000000, 0b00000000, 0b00100000, 0b00000000}, // 22
|
||||||
|
{0b00000000, 0b00000000, 0b01000000, 0b00000000} // 23
|
||||||
|
};
|
||||||
|
|
||||||
|
// void setup()
|
||||||
|
// {
|
||||||
|
// Wire.begin(); // start up I2C bus
|
||||||
|
|
||||||
|
// Serial.println("setting up ports");
|
||||||
|
|
||||||
|
// resetBanks();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// resetBanks();
|
||||||
|
|
||||||
|
|
||||||
|
void writeCenterColumn(byte* banks) {
|
||||||
|
Wire.beginTransmission(saa1064);
|
||||||
|
Wire.write(1);
|
||||||
|
|
||||||
|
Wire.write(banks[0]);
|
||||||
|
Wire.write(banks[1]);
|
||||||
|
Wire.write(banks[2]);
|
||||||
|
Wire.write(banks[3]);
|
||||||
|
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeCenterColumnFirstBank(byte* banks) {
|
||||||
|
Wire.beginTransmission(saa1064);
|
||||||
|
Wire.write(1);
|
||||||
|
|
||||||
|
Wire.write(banks[0]);
|
||||||
|
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO prevent this from overwriting ethernet bit
|
||||||
|
void resetBanks(byte* banks) {
|
||||||
|
banks[0] = 0;
|
||||||
|
banks[1] = 0;
|
||||||
|
banks[2] = 0;
|
||||||
|
banks[3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void resetEthernetBit(byte* banks) {
|
||||||
|
bitWrite(banks[0], 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayNumber(byte* banks, int number) {
|
||||||
|
banks[0] = leds[number - 1][0];
|
||||||
|
banks[1] = leds[number - 1][1];
|
||||||
|
banks[2] = leds[number - 1][2];
|
||||||
|
banks[3] = leds[number - 1][3];
|
||||||
|
|
||||||
|
writeCenterColumn(banks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayUpToNumber(byte* banks, int number) {
|
||||||
|
for (int i = 0; i < number; i++) {
|
||||||
|
banks[0] |= leds[i][0];
|
||||||
|
banks[1] |= leds[i][1];
|
||||||
|
banks[2] |= leds[i][2];
|
||||||
|
banks[3] |= leds[i][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
writeCenterColumn(banks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayNumbers(byte* banks, int* numbersList, size_t length) {
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int num = numbersList[i] - 1;
|
||||||
|
banks[0] |= leds[num][0];
|
||||||
|
banks[1] |= leds[num][1];
|
||||||
|
banks[2] |= leds[num][2];
|
||||||
|
banks[3] |= leds[num][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
writeCenterColumn(banks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayPercentage(byte* banks, double percentDecimal) {
|
||||||
|
int numberOfTotal = round(percentDecimal * TOTAL_LEDS);
|
||||||
|
displayUpToNumber(banks, numberOfTotal);
|
||||||
|
}
|
||||||
|
|
||||||
|
void computeEthernetActivity(byte* banks, bool val) {
|
||||||
|
// bitWrite(bank1, 0, val);
|
||||||
|
banks[0] |= val; // 0 or 1
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user