The original USB relay code can query the GPIO lines to see which relays
are enabled. We only have one way communication to the power sockets so
they might be in a different state to that requested, but store the
state we think we should have so when asked we can return it, rather
than always returning that everything is off.
uint32_t serno;
unsigned long cmd = 0;
int repeat = 0, wait = 0;
uint32_t serno;
unsigned long cmd = 0;
int repeat = 0, wait = 0;
PROGMEM const char usbHidReportDescriptor[22] = {
0x06, 0x00, 0xff, /* USAGE PAGE (Generic Desktop) */
PROGMEM const char usbHidReportDescriptor[22] = {
0x06, 0x00, 0xff, /* USAGE PAGE (Generic Desktop) */
for (i = 0; i < 5; i++) {
data[i] = serno_str[i + 1];
}
for (i = 0; i < 5; i++) {
data[i] = serno_str[i + 1];
}
- data[5] = data[6] = data[7] = 0;
- if (PORTB & (1 << PB0)) {
- data[7] = 1;
- }
+ data[5] = data[6] = 0;
+ data[7] = state;
{
if (data[0] == CMD_ALL_ON) {
cmd = serno | 0xd;
{
if (data[0] == CMD_ALL_ON) {
cmd = serno | 0xd;
wait = 200;
repeat = 5;
} else if (data[0] == CMD_ALL_OFF) {
cmd = serno | 0xc;
wait = 200;
repeat = 5;
} else if (data[0] == CMD_ALL_OFF) {
cmd = serno | 0xc;
wait = 10;
repeat = 5;
} else if (data[0] == CMD_ON) {
wait = 10;
repeat = 5;
} else if (data[0] == CMD_ON) {
switch (data[1]) {
case 1:
cmd = serno | 0xf;
switch (data[1]) {
case 1:
cmd = serno | 0xf;
break;
case 2:
cmd = serno | 0x7;
break;
case 2:
cmd = serno | 0x7;
break;
case 3:
cmd = serno | 0xb;
break;
case 3:
cmd = serno | 0xb;
break;
case 4:
cmd = serno | 0x3;
break;
case 4:
cmd = serno | 0x3;
+ repeat = 5;
+ state |= (1 << (data[1] - 1));
} else if (data[0] == CMD_OFF) {
wait = 200;
switch (data[1]) {
case 1:
cmd = serno | 0xe;
} else if (data[0] == CMD_OFF) {
wait = 200;
switch (data[1]) {
case 1:
cmd = serno | 0xe;
break;
case 2:
cmd = serno | 0x6;
break;
case 2:
cmd = serno | 0x6;
break;
case 3:
cmd = serno | 0xa;
break;
case 3:
cmd = serno | 0xa;
break;
case 4:
cmd = serno | 0x2;
break;
case 4:
cmd = serno | 0x2;
+ repeat = 5;
+ state &= ~(1 << (data[1] - 1));
} else if (data[0] == CMD_SET_SERIAL) {
update_serno(&data[1], 6);
}
} else if (data[0] == CMD_SET_SERIAL) {
update_serno(&data[1], 6);
}