126 lines
3.7 KiB
C++
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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|