126 lines
3.7 KiB
C++

#include "coils.h"
void mbToCoils(ModbusSerial& mb);
void coilsToShiftOutRegisters(size_t i);
void outputShiftOutRegisters();
Coils coils;
ShiftOutRegistersUnion shiftOutRegisters;
size_t digitIndex;
void setupCoils(ModbusSerial& mb) {
pinMode(DATA_PIN_595, OUTPUT);
pinMode(OE_PIN_595, OUTPUT);
pinMode(LATCH_PIN_595, OUTPUT);
pinMode(CLOCK_PIN_595, OUTPUT);
digitalWrite(OE_PIN_595, LOW);
for (size_t i = 0; i < COIL_COUNT; i++)
mb.addCoil (i);
}
void coilsTask(ModbusSerial& mb) {
mbToCoils(mb);
coilsToShiftOutRegisters(digitIndex);
digitIndex = (digitIndex + 1) % 4;
outputShiftOutRegisters();
}
void mbToCoils(ModbusSerial& mb) {
coils.relays.J1 = mb.coil(0);
coils.relays.J2 = mb.coil(1);
coils.relays.J3 = mb.coil(2);
coils.relays.J4 = mb.coil(3);
coils.relays.J5 = mb.coil(4);
coils.relays.J6 = mb.coil(5);
coils.relays.J7 = mb.coil(6);
coils.relays.J8 = mb.coil(7);
coils.digit0.A = mb.coil(8);
coils.digit0.B = mb.coil(9);
coils.digit0.C = mb.coil(10);
coils.digit0.D = mb.coil(11);
coils.digit0.E = mb.coil(12);
coils.digit0.F = mb.coil(13);
coils.digit0.G = mb.coil(14);
coils.digit0.H = mb.coil(15);
coils.digit1.A = mb.coil(16);
coils.digit1.B = mb.coil(17);
coils.digit1.C = mb.coil(18);
coils.digit1.D = mb.coil(19);
coils.digit1.E = mb.coil(20);
coils.digit1.F = mb.coil(21);
coils.digit1.G = mb.coil(22);
coils.digit1.H = mb.coil(23);
coils.digit2.A = mb.coil(24);
coils.digit2.B = mb.coil(25);
coils.digit2.C = mb.coil(26);
coils.digit2.D = mb.coil(27);
coils.digit2.E = mb.coil(28);
coils.digit2.F = mb.coil(29);
coils.digit2.G = mb.coil(30);
coils.digit2.H = mb.coil(31);
coils.digit3.A = mb.coil(32);
coils.digit3.B = mb.coil(33);
coils.digit3.C = mb.coil(34);
coils.digit3.D = mb.coil(35);
coils.digit3.E = mb.coil(36);
coils.digit3.F = mb.coil(37);
coils.digit3.G = mb.coil(38);
coils.digit3.H = mb.coil(39);
}
void coilsToShiftOutRegisters(size_t i) {
switch(i) {
case 0:
shiftOutRegisters.shiftOutRegisters.u6 = coils.digit0;
shiftOutRegisters.shiftOutRegisters.u8.G1 = 0;
shiftOutRegisters.shiftOutRegisters.u8.G2 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G3 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G4 = 1;
shiftOutRegisters.shiftOutRegisters.u5 = coils.relays;
break;
case 1:
shiftOutRegisters.shiftOutRegisters.u6 = coils.digit1;
shiftOutRegisters.shiftOutRegisters.u8.G1 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G2 = 0;
shiftOutRegisters.shiftOutRegisters.u8.G3 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G4 = 1;
shiftOutRegisters.shiftOutRegisters.u5 = coils.relays;
break;
case 2:
shiftOutRegisters.shiftOutRegisters.u6 = coils.digit2;
shiftOutRegisters.shiftOutRegisters.u8.G1 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G2 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G3 = 0;
shiftOutRegisters.shiftOutRegisters.u8.G4 = 1;
shiftOutRegisters.shiftOutRegisters.u5 = coils.relays;
break;
default:
shiftOutRegisters.shiftOutRegisters.u6 = coils.digit3;
shiftOutRegisters.shiftOutRegisters.u8.G1 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G2 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G3 = 1;
shiftOutRegisters.shiftOutRegisters.u8.G4 = 0;
shiftOutRegisters.shiftOutRegisters.u5 = coils.relays;
break;
}
}
void outputShiftOutRegisters() {
digitalWrite(LATCH_PIN_595, LOW);
shiftOut(DATA_PIN_595, CLOCK_PIN_595, MSBFIRST, shiftOutRegisters.bytes[2]);
shiftOut(DATA_PIN_595, CLOCK_PIN_595, MSBFIRST, shiftOutRegisters.bytes[1]);
shiftOut(DATA_PIN_595, CLOCK_PIN_595, MSBFIRST, shiftOutRegisters.bytes[0]);
digitalWrite(LATCH_PIN_595, HIGH);
}