int main(){
    reportBuffer[0] = 0x00;//(1<<1);
    wdt_enable(WDTO_1S);
    usbInit();
    usbDeviceDisconnect();
    register uint8_t i=0;
    while(--i){
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    
    sei();

    CLR(DDRB, PB0);
    SET(DDRD, PD7);
    TCCR0B = 5; //prescale TC0 1024, 20 MHz -> 50 ns * 1024 * 255 = 13.056 ms

    while(1){
        usbPoll();
        wdt_reset();
        if(CHK(TIFR0, TOV0)){
            TIFR0 = 1<<TOV0;
            TCNT0 = 0;
            if(CHK(PINB, PB0) && changed == 0){
                keydown = 1;
                if (prev == keydown) changed = 0;
                else changed = 1;
                prev = 1;
            }else{
                keydown = 0;
                if (prev == keydown) changed =0;
                else changed = 1;
                prev = 0;
            }
        }
        if(changed){
            changed = 0;
            TIFR0 = 1<<TOV0;
            TCNT0 = 0;
            if(keydown){
                reportBuffer[0] = 0x02;
            }else{
                reportBuffer[0] = 0x00;
            }
            TOG(PORTD, PD7);
            wdt_reset();
            usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
        }
    }
}
 uchar	usbFunctionSetup(uchar data[8]){
    usbRequest_t    *rq = (void *)data;
    TOG(PORTB, PB0);

    usbMsgPtr = reportBuffer;
    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* class request type */
        if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
            /* we only have one report type, so don't look at wValue */
            return sizeof(reportBuffer);
        }else if(rq->bRequest == USBRQ_HID_GET_IDLE){
            usbMsgPtr = &idleRate;
            return 1;
        }else if(rq->bRequest == USBRQ_HID_SET_IDLE){
            idleRate = rq->wValue.bytes[1];
        }
    }else{
        /* no vendor specific requests implemented */
    }
	return 0;
}
__interrupt void CCR0_ISR(void){
		SECOND_TIMER++;
		TOUT=1;
		TOG (P1OUT,0x01);
		CLR (TACCTL0, CCIFG);
}