From c173d795c6fc610dd2861e1f725bf4aac922ecb1 Mon Sep 17 00:00:00 2001 From: Adrian Woodley Date: Tue, 5 Jun 2018 23:25:53 +0800 Subject: [PATCH] Almost working. --- main.c | 191 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 125 insertions(+), 66 deletions(-) diff --git a/main.c b/main.c index 287feda..c04673b 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include #include /* for sei() */ +#include #include #include /* for _delay_ms() */ @@ -13,7 +14,36 @@ /* ----------------------------- USB interface ----------------------------- */ /* ------------------------------------------------------------------------- */ -PROGMEM const char usbHidReportDescriptor[52] = { /* USB report descriptor, size must match usbconfig.h */ +// PROGMEM const char usbHidReportDescriptor[52] = { /* USB report descriptor, size must match usbconfig.h */ +// 0x05, 0x01, // USAGE_PAGE (Generic Desktop) +// 0x09, 0x02, // USAGE (Mouse) +// 0xa1, 0x01, // COLLECTION (Application) +// 0x09, 0x01, // USAGE (Pointer) +// 0xA1, 0x00, // COLLECTION (Physical) +// 0x05, 0x09, // USAGE_PAGE (Button) +// 0x19, 0x01, // USAGE_MINIMUM +// 0x29, 0x03, // USAGE_MAXIMUM +// 0x15, 0x00, // LOGICAL_MINIMUM (0) +// 0x25, 0x01, // LOGICAL_MAXIMUM (1) +// 0x95, 0x03, // REPORT_COUNT (3) +// 0x75, 0x01, // REPORT_SIZE (1) +// 0x81, 0x02, // INPUT (Data,Var,Abs) +// 0x95, 0x01, // REPORT_COUNT (1) +// 0x75, 0x05, // REPORT_SIZE (5) +// 0x81, 0x03, // INPUT (Const,Var,Abs) +// 0x05, 0x01, // USAGE_PAGE (Generic Desktop) +// 0x09, 0x30, // USAGE (X) +// 0x09, 0x31, // USAGE (Y) +// 0x09, 0x38, // USAGE (Wheel) +// 0x15, 0x81, // LOGICAL_MINIMUM (-127) +// 0x25, 0x7F, // LOGICAL_MAXIMUM (127) +// 0x75, 0x08, // REPORT_SIZE (8) +// 0x95, 0x03, // REPORT_COUNT (3) +// 0x81, 0x06, // INPUT (Data,Var,Rel) +// 0xC0, // END_COLLECTION +// 0xC0, // END COLLECTION +// }; +PROGMEM const char usbHidReportDescriptor[] = { /* USB report descriptor, size must match usbconfig.h */ 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xa1, 0x01, // COLLECTION (Application) @@ -33,12 +63,14 @@ PROGMEM const char usbHidReportDescriptor[52] = { /* USB report descriptor, size 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) - 0x09, 0x38, // USAGE (Wheel) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7F, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x03, // REPORT_COUNT (3) + 0x95, 0x03, // REPORT_COUNT (2) 0x81, 0x06, // INPUT (Data,Var,Rel) + 0x09, 0x38, // USAGE (Wheel) + 0x95, 0x01, // REPORT_COUNT (1) + 0x81, 0x06, // INPUT (Data, Variable, Relative) 0xC0, // END_COLLECTION 0xC0, // END COLLECTION }; @@ -60,22 +92,6 @@ static report_t reportBuffer; static uchar idleRate; /* repeat rate for keyboards, never used for mice */ -/* The following function advances sin/cos by a fixed angle - * and stores the difference to the previous coordinates in the report - * descriptor. - * The algorithm is the simulation of a second order differential equation. - */ -// static void advanceCircleByFixedAngle(void) -// { -// char d; - -// #define DIVIDE_BY_64(val) (val + (val > 0 ? 32 : -32)) >> 6 /* rounding divide */ -// reportBuffer.dx = d = DIVIDE_BY_64(cosinus); -// sinus += d; -// reportBuffer.dy = d = DIVIDE_BY_64(sinus); -// cosinus -= d; -// } - static void read_Wheel(void) { reportBuffer.dx = 0; @@ -84,7 +100,9 @@ static void read_Wheel(void) int Direction = (AnalogIn < 512) ? -1 : 1; - // PORTD = 0; + timing = get_timing(AnalogIn); + + // PINB |= _BV(PB1); if (AnalogIn < LowerDead[Debounce] || AnalogIn > UpperDead[Debounce]) { @@ -92,7 +110,9 @@ static void read_Wheel(void) { reportBuffer.dWheel = Direction; Debounce = 0; - // ticktock = 0; + ticktock = 0; + PINB |= _BV(PB1); + // PINB &= ~(1< 0) + + if (ticktock > 10) { - PINB |= _BV(PB1); - usbPoll(); + // PINB |= _BV(PB1); + + // usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer)); + // PINB |= (1< 250 ms */ + // wdt_reset(); + _delay_ms(4); + } + usbDeviceConnect(); /* ADC Settings */ // prescaler = 128 ADCSRA = (1< 250 ms */ - wdt_reset(); - _delay_ms(2); - } - usbDeviceConnect(); sei(); - wdt_enable(WDTO_1S); + // wdt_enable(WDTO_1S); } usbMsgLen_t usbFunctionSetup(uchar data[8]) { -usbRequest_t *rq = (void *)data; + usbRequest_t *rq = (void *)data; /* The following requests are never used. But since they are required by * the specification, we implement them in this example. @@ -237,12 +276,14 @@ usbRequest_t *rq = (void *)data; } // Called by V-USB after device reset -void hadUsbReset() { +void hadUsbReset() +{ + cli(); int frameLength, targetLength = (unsigned)(1499 * (double)F_CPU / 10.5e6 + 0.5); int bestDeviation = 9999; uchar trialCal, bestCal, step, region; - bestCal = 0; + bestCal = OSCCAL; // do a binary search in regions 0-127 and 128-255 to get optimum OSCCAL for(region = 0; region <= 1; region++) { @@ -266,6 +307,7 @@ void hadUsbReset() { } OSCCAL = bestCal; + sei(); } /* ------------------------------------------------------------------------- */ @@ -290,10 +332,27 @@ int main(void) // _delay_ms(500); // } - for(;;){ /* main event loop */ + for(;;) + { /* main event loop */ + // if (USBIN&USBMASK) + // { + // sleep_cpu(); // sleep, except at SE0, until SOF + // } // DBG1(0x02, 0, 0); /* debug output: main loop iterates */ - // wdt_reset(); - + //wdt_reset(); + usbPoll(); + // usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer)); + // PINB |= _BV(PB1); + // if(usbInterruptIsReady()) + // { + // // PINB |= _BV(PB1); + + // // /* called after every poll of the interrupt endpoint */ + // // read_Wheel(); + // // // DBG1(0x03, 0, 0); /* debug output: interrupt report prepared */ + // usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer)); + // clearReport(); + // } } return 0;