Example #1
0
static void blinkCapsLockLED(void) {
	static int gCounter = 0;
	static int gDelayCounter = 0;
	static uint8_t gLEDState = 1;
	const uint8_t gCountMAX = 200;
	uint8_t led = LEDCAPS;
	uint8_t gIsOn = 0;

#ifdef ENABLE_BOOTMAPPER
	if(isBootMapper()){
		gIsOn = 1;
	}
#endif	

	if(gIsOn == 1){
		++gDelayCounter;
		if(gDelayCounter > blinkLedCountDelay){
			gCounter++;
			if(gCounter > gCountMAX){
				if(getLEDState() & LED_STATE_CAPS){	// Caps Lock이 켜져 있을때는 커졌다 켜지고;
					if(gLEDState == 1){
						turnOffLED(led);
					}else{
						turnOnLED(led);
						gDelayCounter = 0;
					}
				}else{	// Caps Lock이 꺼져 있을 때는 켜졌다 꺼진다.
					if(gLEDState == 1){
						turnOnLED(led);
					}else{
						turnOffLED(led);
						gDelayCounter = 0;
					}
				}
				gLEDState ^= 1;
				gCounter = 0;
			}
		}
	}else{
		gCounter = 0;
		gLEDState = 1;
	}
}
Example #2
0
/**
 * This function is called whenever we receive a setup request via USB.
 * \param data[8] eight bytes of data we received
 * \return number of bytes to use, or 0xff if usbFunctionWrite() should be
 * called
 */
usbMsgLen_t usbFunctionSetup(uint8_t data[8]) {

    delegateInterfaceReadyUsb();

    static uint8_t readyForNext = 0;

    usbRequest_t *rq = (void *)data;
//    DBG1(0xCC, data, 8);

    if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) {
        // class request type
        if (rq->bRequest == USBRQ_HID_GET_REPORT) {
            if (rq->wValue.word == HID_REPORT_KEBOARD)
            {
                // wValue: ReportType (highbyte), ReportID (lowbyte)
                usbMsgPtr = (usbMsgPtr_t)&reportKeyboard;
                return sizeof(reportKeyboard);
            }else if(rq->wValue.word == HID_REPORT_BOOT){

            	if(rq->wLength.word == OPTION_GET_REPORT_LENGTH_RAINBOW){	// ready for rainbow color setting;
            		readyForNext = NEXT_RAINBOW;
            	}else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){
            	    readyForNext = rq->wLength.word;
            	}


            }else if(rq->wValue.word == HID_REPORT_OPTION){
            	// length : rq->wLength.word 필요한 리포트를 length로 구분한다.

            	if(rq->wLength.word == OPTION_GET_REPORT_LENGTH_INFO){
            		// report led2 info
            	    static option_info_t optionsBuffer;
            	    getOptions(&optionsBuffer);
            		usbMsgPtr = (usbMsgPtr_t)&optionsBuffer;
            		return sizeof(optionsBuffer); //OPTION_GET_REPORT_LENGTH_INFO;
            	}else if(rq->wLength.word == OPTION_GET_REPORT_LENGTH_TOGGLE_BOOTMAPPER){
            	    static bool gIsBootloader;
            	    if(isBootMapper()){
                        setToBootMapper(false);
                        gIsBootloader = false;
                    }else{
                        setToBootMapper(true);
                        gIsBootloader = true;
                    }
            	    usbMsgPtr = (usbMsgPtr_t)&gIsBootloader;
            	    return 1;
#if HAS_OPTIONS
            	}else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER4){
                    // keymap
                    usbMsgFlags = USB_FLG_MSGPTR_IS_ROM;
                    usbMsgPtr = (usbMsgPtr_t)(KEYMAP_ADDRESS + (ROWS * COLUMNS * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1)));
                    return OPTION_GET_REPORT_LENGTH_KEYMAP;
                }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_MACRO12){
                    // cst macro
                    usbMsgFlags = USB_FLG_MSGPTR_IS_ROM;
                    usbMsgPtr = (usbMsgPtr_t)(CUSTOM_MACRO_ADDRESS+(CUSTOM_MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_MACRO1)));
                    return CUSTOM_MACRO_SIZE_MAX;

                }else if(rq->wLength.word == OPTION_GET_OPTION_INDEX_DUALACTION){
                    // dual action
                    usbMsgFlags = USB_FLG_MSGPTR_IS_ROM;
                    usbMsgPtr = (usbMsgPtr_t)(DUALACTION_ADDRESS);
                    return DUALACTION_BYTES;

                }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){
                    usbMsgFlags = USB_FLG_USE_USER_RW;
                    usbMsgPtr = (usbMsgPtr_t)(EEPROM_MACRO+(MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_QUICK_MACRO1)));
                    return MACRO_SIZE_MAX;
#else
                }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER4){
                    // keymap
                    usbMsgFlags = USB_FLG_MSGPTR_IS_ROM;
                    usbMsgPtr = (usbMsgPtr_t)(KEYMAP_ADDRESS + (ROWS * COLUMNS * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1)));
                    return OPTION_GET_REPORT_LENGTH_KEYMAP;
                }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_MACRO12){
                    // cst macro
                    usbMsgFlags = USB_FLG_MSGPTR_IS_ROM;
                    usbMsgPtr = (usbMsgPtr_t)(CUSTOM_MACRO_ADDRESS+(CUSTOM_MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_MACRO1)));
                    return CUSTOM_MACRO_SIZE_MAX;

                }else if(rq->wLength.word == OPTION_GET_OPTION_INDEX_DUALACTION){
                    // dual action
                    usbMsgFlags = USB_FLG_MSGPTR_IS_ROM;
                    usbMsgPtr = (usbMsgPtr_t)(DUALACTION_ADDRESS);
                    return DUALACTION_BYTES;

                }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){
                    usbMsgFlags = USB_FLG_USE_USER_RW;
                    usbMsgPtr = (usbMsgPtr_t)(EEPROM_MACRO+(MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_QUICK_MACRO1)));
                    return MACRO_SIZE_MAX;

#endif
            	}else {
            		return rq->wLength.word;
            	}
            }
        } else if (rq->bRequest == USBRQ_HID_SET_REPORT) {
//        	DBG1(0xAA, (uchar *)&rq->wValue.word, 2);
        	// 02 03 : Report Type: 0x03,  ReportID: 0x02
        	// 01 03 : Report Type: 0x03,  ReportID: 0x01
            // Report Type: 0x02(Out)/ReportID: 0x00(none) && Interface: 0(keyboard)
            if (rq->wValue.word == HID_REPORT_KEBOARD && rq->wIndex.word == 0)
            {
                // We expect one byte reports
                expectReport = 1;
                return USB_NO_MSG; // Call usbFunctionWrite with data
            }else if(rq->wValue.word == HID_REPORT_BOOT){
                // boot
//                isStart = 1;
                if(readyForNext == NEXT_RAINBOW){
                	data[1] = OPTION_INDEX_COLOR_RAINBOW_INIT;
                	// init setting;
                	setOptions((uint8_t *)data);
                	expectReport = 4;
                }else if(readyForNext >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && readyForNext <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){
                    // write quick macro
                    IsAddressHead = true;
                    quickMacroAddress = EEPROM_MACRO + (MACRO_SIZE_MAX * (readyForNext - OPTION_GET_REPORT_LENGTH_QUICK_MACRO1));
                    expectReport = 5;
                }
                readyForNext = 0;

                return USB_NO_MSG; // Call usbFunctionWrite with data
            }else if(rq->wValue.word == HID_REPORT_OPTION){
            	// options
                expectReport = 2;

                return USB_NO_MSG; // Call usbFunctionWrite with data
            }
        } else if (rq->bRequest == USBRQ_HID_GET_IDLE) {
            usbMsgPtr = idleRate;
//            DBG1(0x71, (uchar *)&idleRate, 1);
            return 1;
        } else if (rq->bRequest == USBRQ_HID_SET_IDLE) {

            delegateInitInterfaceUsb();

            idleRate = rq->wValue.bytes[1];
//            DBG1(0x70, (uchar *)&idleRate, 1);

        } else if (rq->bRequest == USBRQ_HID_GET_PROTOCOL) {
            if (rq->wValue.bytes[1] < 1) {
                protocolVer = rq->wValue.bytes[1];
            }
        } else if(rq->bRequest == USBRQ_HID_SET_PROTOCOL) {
            usbMsgPtr = protocolVer;
            return 1;
        }
    } else {        
        // no vendor specific requests implemented
    }

    return 0;
}