X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=main.c;h=73d6f34a479cd214f7a80916e8640e44eb9dc22e;hb=7a3fef65363947580a3bacad07281f7c9e53c688;hp=5805cee2720064c13b1c4b1341444b93a7b0f448;hpb=7a2d9ddd539a4d578f0da6c3428456946e4011b7;p=energenie-attiny.git diff --git a/main.c b/main.c index 5805cee..73d6f34 100644 --- a/main.c +++ b/main.c @@ -28,6 +28,8 @@ #include "usbdrv.h" #include "libs-device/osccal.h" +#define REPEAT_COUNT 10 + #define CMD_ALL_ON 0xfe #define CMD_ALL_OFF 0xfc #define CMD_ON 0xff @@ -41,6 +43,7 @@ int serno_str[] = { uint32_t serno; unsigned long cmd = 0; int repeat = 0, wait = 0; +uint8_t state = 0; PROGMEM const char usbHidReportDescriptor[22] = { 0x06, 0x00, 0xff, /* USAGE PAGE (Generic Desktop) */ @@ -148,10 +151,8 @@ uchar usbFunctionRead(uchar *data, uchar len) 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; return len; } @@ -162,56 +163,54 @@ uchar usbFunctionWrite(uchar *data, uchar len) { if (data[0] == CMD_ALL_ON) { cmd = serno | 0xd; + state = 0xf; wait = 200; - repeat = 5; + repeat = REPEAT_COUNT; } else if (data[0] == CMD_ALL_OFF) { cmd = serno | 0xc; + state = 0; wait = 10; - repeat = 5; + repeat = REPEAT_COUNT; } else if (data[0] == CMD_ON) { wait = 200; switch (data[1]) { case 1: cmd = serno | 0xf; - repeat = 5; break; case 2: cmd = serno | 0x7; - repeat = 5; break; case 3: cmd = serno | 0xb; - repeat = 5; break; case 4: cmd = serno | 0x3; - repeat = 5; break; default: - break; + return len; } + repeat = REPEAT_COUNT; + state |= (1 << (data[1] - 1)); } else if (data[0] == CMD_OFF) { wait = 200; switch (data[1]) { case 1: cmd = serno | 0xe; - repeat = 5; break; case 2: cmd = serno | 0x6; - repeat = 5; break; case 3: cmd = serno | 0xa; - repeat = 5; break; case 4: cmd = serno | 0x2; - repeat = 5; break; default: - break; + return len; } + repeat = REPEAT_COUNT; + state &= ~(1 << (data[1] - 1)); } else if (data[0] == CMD_SET_SERIAL) { update_serno(&data[1], 6); }