コード例 #1
0
ファイル: ui.c プロジェクト: InSoonPark/asf
void ui_process(uint16_t framenumber)
{
	static uint8_t cpt_sof = 0;
	static bool btn_last_state = false;
	static bool sequence_running = false;
	static uint8_t sequence_pos = 0;

	bool b_btn_state, success;
	uint8_t value;

	if ((framenumber % 1000) == 0) {
		LED_On(LED_0_PIN);
	}
	if ((framenumber % 1000) == 500) {
		LED_Off(LED_0_PIN);
	}
	/* Scan process running each 5ms */
	cpt_sof++;
	
	if(button_function) {
		if (cpt_sof < 5) {
			return;
		}
		cpt_sof = 0;
		/* Uses buttons to move mouse */
		if (!port_pin_get_input_level(BUTTON_0_PIN)) {
			udi_hid_mouse_moveY(-MOUSE_MOVE_RANGE);
		}
	} else {
		if ((cpt_sof % 2) == 0) {
			return;
		}
		// Scan buttons on switch 0 to send keys sequence
		b_btn_state = (!port_pin_get_input_level(BUTTON_0_PIN));
		if (b_btn_state != btn_last_state) {
			btn_last_state = b_btn_state;
			if (btn_wakeup) {
				if (!b_btn_state) {
					btn_wakeup = false;
				}
			} else {
				sequence_running = true;
			}
		}
		// Sequence process running each period
		if (SEQUENCE_PERIOD > cpt_sof) {
			return;
		}
		cpt_sof = 0;

		if (sequence_running) {
			// Send next key
			value = ui_sequence[sequence_pos].value;
			if (value!=0) {
				if (ui_sequence[sequence_pos].b_modifier) {
					if (ui_sequence[sequence_pos].b_down) {
						success = udi_hid_kbd_modifier_down(value);
					} else {
						success = udi_hid_kbd_modifier_up(value);
					}
				} else {
					if (ui_sequence[sequence_pos].b_down) {
						success = udi_hid_kbd_down(value);
					} else {
						success = udi_hid_kbd_up(value);
					}
				}	
				if (!success) {
					return; // Retry it on next schedule
				}
			}
			// Valid sequence position
			sequence_pos++;
			if (sequence_pos >=
				sizeof(ui_sequence) / sizeof(ui_sequence[0])) {
				sequence_pos = 0;
				sequence_running = false;
				button_function  = 1;
			}
		}
	}
}
コード例 #2
0
ファイル: ui.c プロジェクト: AndreyMostovov/asf
void ui_process(uint16_t framenumber)
{
	bool b_btn_state, success;
	static bool btn_last_state = false;
	static bool sequence_running = false;
	static uint8_t u8_sequence_pos = 0;
	uint8_t u8_value;
	static uint16_t cpt_sof = 0;

	if ((framenumber % 1000) == 0) {
		LED_On(LED0);
	}
	if ((framenumber % 1000) == 500) {
		LED_Off(LED0);
	}
	/* Scan process running each 2ms */
	cpt_sof++;
	if ((cpt_sof % 2) == 0) {
		return;
	}

	/* Buttons down to send keys sequence */
	b_btn_state = (!ioport_get_pin_level(GPIO_PUSH_BUTTON_1));
	if (b_btn_state != btn_last_state) {
		btn_last_state = b_btn_state;
		if (btn_wakeup) {
			if (!b_btn_state) {
				btn_wakeup = false;
			}
		} else {
			sequence_running = true;
		}
	}

	/* Sequence process running each period */
	if (SEQUENCE_PERIOD > cpt_sof) {
		return;
	}
	cpt_sof = 0;

	if (sequence_running) {
		/* Send next key */
		u8_value = ui_sequence[u8_sequence_pos].u8_value;
		if (u8_value!=0) {
			if (ui_sequence[u8_sequence_pos].b_modifier) {
				if (ui_sequence[u8_sequence_pos].b_down) {
					success = udi_hid_kbd_modifier_down(u8_value);
				} else {
					success = udi_hid_kbd_modifier_up(u8_value);
				}
			} else {
				if (ui_sequence[u8_sequence_pos].b_down) {
					success = udi_hid_kbd_down(u8_value);
				} else {
					success = udi_hid_kbd_up(u8_value);
				}
			}
			if (!success) {
				return; /* Retry it on next schedule */
			}
		}
		/* Valid sequence position */
		u8_sequence_pos++;
		if (u8_sequence_pos >=
			sizeof(ui_sequence) / sizeof(ui_sequence[0])) {
			u8_sequence_pos = 0;
			sequence_running = false;
		}
	}
}
コード例 #3
0
ファイル: ui.c プロジェクト: AndreyMostovov/asf
void ui_process(uint16_t framenumber)
{
	bool b_btn_state, sucess;
	static bool btn_last_state = false;
	static bool sequence_running = false;
	static uint8_t u8_sequence_pos = 0;
	uint8_t u8_value;
	static uint16_t cpt_sof = 0;

	if ((framenumber % 1000) == 0) {
		LED_On(LED1_GPIO);
	}
	if ((framenumber % 1000) == 500) {
		LED_Off(LED1_GPIO);
	}
	// Scan process running each 2ms
	cpt_sof++;
	if ((cpt_sof % 2) == 0) {
		return;
	}

	// Scan buttons on switch 0 to send keys sequence
	b_btn_state = (gpio_pin_is_low(GPIO_PUSH_BUTTON_0)) ? true : false;
	if (b_btn_state != btn_last_state) {
		btn_last_state = b_btn_state;
		sequence_running = true;
	}

	// Sequence process running each period
	if (SEQUENCE_PERIOD > cpt_sof) {
		return;
	}
	cpt_sof = 0;

	if (sequence_running) {
		// Send next key
		u8_value = ui_sequence[u8_sequence_pos].u8_value;
		if (u8_value!=0) {
			if (ui_sequence[u8_sequence_pos].b_modifier) {
				if (ui_sequence[u8_sequence_pos].b_down) {
					sucess = udi_hid_kbd_modifier_down(u8_value);
				} else {
					sucess = udi_hid_kbd_modifier_up(u8_value);
				}
			} else {
				if (ui_sequence[u8_sequence_pos].b_down) {
					sucess = udi_hid_kbd_down(u8_value);
				} else {
					sucess = udi_hid_kbd_up(u8_value);
				}
			}
			if (!sucess) {
				return; // Retry it on next schedule
			}
		}
		// Valid sequence position
		u8_sequence_pos++;
		if (u8_sequence_pos >=
			sizeof(ui_sequence) / sizeof(ui_sequence[0])) {
			u8_sequence_pos = 0;
			sequence_running = false;
		}
	}
}
コード例 #4
0
ファイル: ui.c プロジェクト: AndreyMostovov/asf
void ui_process(uint16_t framenumber)
{
	bool b_btn_state, sucess;
	static bool btn_last_state = false;
	static bool sequence_running = false;
	static uint8_t u8_sequence_pos = 0;
	uint8_t u8_value;
	static uint16_t cpt_sof = 0;

	if ((framenumber % 1000) == 0) {
		LED_On(LED0);
	}
	if ((framenumber % 1000) == 500) {
		LED_Off(LED0);
	}
	/* Scan process running each 2ms */
	cpt_sof++;
	if ((cpt_sof % 2) == 0) {
		return;
	}

	/* Uses buttons to move mouse */
	if (!ioport_get_pin_level(GPIO_PUSH_BUTTON_1)) {
		move_count --;
		switch(move_dir) {
		case MOVE_UP:
			udi_hid_mouse_moveY(-MOUSE_MOVE_RANGE);
			if (move_count < 0) {
				move_dir = MOVE_RIGHT;
				move_count = MOUSE_MOVE_COUNT;
			}
			break;
		case MOVE_RIGHT:
			udi_hid_mouse_moveX(+MOUSE_MOVE_RANGE);
			if (move_count < 0) {
				move_dir = MOVE_DOWN;
				move_count = MOUSE_MOVE_COUNT;
			}
			break;
		case MOVE_DOWN:
			udi_hid_mouse_moveY(+MOUSE_MOVE_RANGE);
			if (move_count < 0) {
				move_dir = MOVE_LEFT;
				move_count = MOUSE_MOVE_COUNT;
			}
			break;
		case MOVE_LEFT:
			udi_hid_mouse_moveX(-MOUSE_MOVE_RANGE);
			if (move_count < 0) {
				move_dir = MOVE_UP;
				move_count = MOUSE_MOVE_COUNT;
			}
			break;
		}
	}
	
	/* Both buttons down to send keys sequence */
	b_btn_state = (!ioport_get_pin_level(GPIO_PUSH_BUTTON_1));
	if (b_btn_state != btn_last_state) {
		btn_last_state = b_btn_state;
		sequence_running = true;
	}

	/* Sequence process running each period */
	if (SEQUENCE_PERIOD > cpt_sof) {
		return;
	}
	cpt_sof = 0;

	if (sequence_running) {
		/* Send next key */
		u8_value = ui_sequence[u8_sequence_pos].u8_value;
		if (u8_value!=0) {
			if (ui_sequence[u8_sequence_pos].b_modifier) {
				if (ui_sequence[u8_sequence_pos].b_down) {
					sucess = udi_hid_kbd_modifier_down(u8_value);
				} else {
					sucess = udi_hid_kbd_modifier_up(u8_value);
				}
			} else {
				if (ui_sequence[u8_sequence_pos].b_down) {
					sucess = udi_hid_kbd_down(u8_value);
				} else {
					sucess = udi_hid_kbd_up(u8_value);
				}
			}
			if (!sucess) {
				return; /* Retry it on next schedule */
			}
		}
		/* Valid sequence position */
		u8_sequence_pos++;
		if (u8_sequence_pos >=
			sizeof(ui_sequence) / sizeof(ui_sequence[0])) {
			u8_sequence_pos = 0;
			sequence_running = false;
		}
	}
}
コード例 #5
0
/**
 * @brief Notify the application when ZID report data is received from the paired device.
 *  
 * @param PairingRef Pairing reference.
 * @param num_report_records number of Report records.
 * @param *zid_report_data_record_ptr pointer to the report data received.
 * @param  RxLinkQuality    LQI value of the report data frame.
 * @param  RxFlags          Receive flags.
 */
static void zid_report_data_indication(uint8_t PairingRef, uint8_t num_report_records,
                                                zid_report_data_record_t *zid_report_data_record_ptr, uint8_t RxLinkQuality, uint8_t RxFlags)
{          
   
                  
                  
     for(uint8_t i=0;i<num_report_records;i++)
     {  
    
         switch(zid_report_data_record_ptr->report_desc_identifier)
         {
         case MOUSE:
         {
            
             mouse_desc_t *mouse_desc;
             mouse_desc = (mouse_desc_t *)zid_report_data_record_ptr->report_data;
			 
				udi_hid_mouse_btnleft(mouse_desc->button0); 
				udi_hid_mouse_btnright(mouse_desc->button1);
			   
				if((0x80==(mouse_desc->button2)))
				{   
					udi_hid_mouse_moveScroll((mouse_desc->y_coordinate));
					mouse_desc->y_coordinate = 0;
				}
				else if(0x01==(mouse_desc->button2))
				{ 
					udi_hid_mouse_btnmiddle(0x01);
				}
				udi_hid_mouse_moveX((mouse_desc->x_coordinate));
				udi_hid_mouse_moveY((mouse_desc->y_coordinate));
			 
          
             break;
         }
         case KEYBOARD:
         {
             if(zid_report_data_record_ptr->report_type == INPUT)
             {
                 
                 keyboard_input_desc_t *keyboard_input_desc;
                 keyboard_input_desc = (keyboard_input_desc_t *)zid_report_data_record_ptr->report_data;
                    if(main_b_kbd_enable)
                    {   
						if(keyboard_input_desc->modifier_keys)
						{
							udi_hid_kbd_modifier_down(keyboard_input_desc->modifier_keys);
							udi_hid_kbd_modifier_up(keyboard_input_desc->modifier_keys);
						}
					                    
						for(uint8_t j=0;j<4;j++)
						{  
							if(keyboard_input_desc->key_code[j])
							{    
								udi_hid_kbd_down(keyboard_input_desc->key_code[j]);
								udi_hid_kbd_up(keyboard_input_desc->key_code[j]);
							}   
                   
						}
						uint16_t u_value;
						u_value= convert_byte_array_to_16_bit(&(keyboard_input_desc->key_code[4]));
						if(u_value)
						{   
							udi_hid_mkbd_modifier_down(u_value);
							udi_hid_mkbd_modifier_up(u_value);
						}
					}
              
             }
             else
             {
                /* Application can implement for other report types.*/
             }
             break;
         }
         default:
		 break;
         }
         zid_report_data_record_ptr++;
     }

    RxLinkQuality = RxLinkQuality;
    RxFlags = RxFlags;

}
コード例 #6
0
ファイル: main.c プロジェクト: Ashum812/USB-Rubber-Ducky
// initializes the SD/MMC memory resources: GPIO, SPI and MMC
//-------------------------------------------------------------------
static void sd_mmc_resources_init(long pba_hz) {
	
	// GPIO pins used for SD/MMC interface
	static const gpio_map_t SD_MMC_SPI_GPIO_MAP = {
	{SD_MMC_SPI_SCK_PIN,  SD_MMC_SPI_SCK_FUNCTION },  // SPI Clock.
	{SD_MMC_SPI_MISO_PIN, SD_MMC_SPI_MISO_FUNCTION},  // MISO.
	{SD_MMC_SPI_MOSI_PIN, SD_MMC_SPI_MOSI_FUNCTION},  // MOSI.
	{SD_MMC_SPI_NPCS_PIN, SD_MMC_SPI_NPCS_FUNCTION}   // Chip Select NPCS.
	};

	// SPI options.
	spi_options_t spiOptions = {
		.reg          = SD_MMC_SPI_NPCS,
		.baudrate     = SD_MMC_SPI_MASTER_SPEED,  // Defined in conf_sd_mmc_spi.h.
		.bits         = SD_MMC_SPI_BITS,          // Defined in conf_sd_mmc_spi.h.
		.spck_delay   = 0,
		.trans_delay  = 0,
		.stay_act     = 1,
		.spi_mode     = 0,
		.modfdis      = 1
	};

	// assign I/Os to SPI.
	gpio_enable_module(SD_MMC_SPI_GPIO_MAP,
	sizeof(SD_MMC_SPI_GPIO_MAP) / sizeof(SD_MMC_SPI_GPIO_MAP[0]));

	// initialize as master.
	spi_initMaster(SD_MMC_SPI, &spiOptions);

	// set SPI selection mode: variable_ps, pcs_decode, delay.
	spi_selectionMode(SD_MMC_SPI, 0, 0, 0);

	// enable SPI module.
	spi_enable(SD_MMC_SPI);

	// Initialize SD/MMC driver with SPI clock (PBA).
	sd_mmc_spi_init(spiOptions, pba_hz);
}

// process a USB frame
//-------------------------------------------------------------------
void process_frame(uint16_t framenumber)
{
	static uint8_t cpt_sof = 0;
	static injectState_t state = state_START_INJECT;
	static uint8_t wait = 0;
	static uint16_t debounce = 0;
	static uint16_t injectToken = 0x0000;
	
	static uint16_t delay = 0;
	
	// scan process running each 2ms
	cpt_sof++;
	if( 2 > cpt_sof )
	return;
	cpt_sof = 0;
	
	// pulse led
	LED_Set_Intensity( LED0, framenumber >> 1 );
	
	// debounce switch
	if( debounce > 0 ) --debounce;
	
	//delay a random amount
	if(delay == 0){
		// injection state machine
		switch(state) {

			case state_IDLE:
			// check switch
			if( gpio_get_pin_value(GPIO_JOYSTICK_PUSH) == GPIO_JOYSTICK_PUSH_PRESSED ) {
			
				// debounce
				if( debounce == 0 ) {
					state = state_START_INJECT;
					debounce = 250;
				}
			}
			break;
		
			case state_START_INJECT:
			file_open(FOPEN_MODE_R);
			state = state_INJECTING;
			break;
		
			case state_INJECTING:
		
			if( file_eof() ) {
				file_close();
				state = state_IDLE;
				break;
			}
		
			injectToken = ( file_getc() | ( file_getc() << 8 ) );
		
			if( ( injectToken&0xff ) == 0x00 ) {
				wait = injectToken>>8;
				state = state_WAIT;
			}
			else if( ( injectToken>>8 ) == 0x00 ) {
				state = state_KEY_DOWN;
			}
			else {
				state = state_MOD_DOWN;
			}
			break;
		
			case state_KEY_DOWN:
			udi_hid_kbd_down(injectToken&0xff);
			state = state_KEY_UP;
			delay = rand() % MAX_DELAY;
			break;

			case state_KEY_UP:
			udi_hid_kbd_up(injectToken&0xff);
			state = state_INJECTING;
			delay = rand() % MAX_DELAY;
			break;
		
			case state_MOD_DOWN:
			udi_hid_kbd_modifier_down(injectToken>>8);
			state = state_MOD_KEY_DOWN;
			delay = rand() % MAX_DELAY;
			break;

			case state_MOD_KEY_DOWN:
			udi_hid_kbd_down(injectToken&0xff);
			state = state_MOD_KEY_UP;
			delay = rand() % MAX_DELAY;
			break;

			case state_MOD_KEY_UP:
			udi_hid_kbd_up(injectToken&0xff);
			state = state_MOD_UP;
			delay = rand() % MAX_DELAY;
			break;
		
			case state_MOD_UP:
			udi_hid_kbd_modifier_up(injectToken>>8);
			state = state_INJECTING;
			delay = rand() % 50;
			break;
		
			case state_WAIT:
			if( --wait == 0 ) {
				state = state_INJECTING;
			}
			break;
		
			default:
			state = state_IDLE;
		}
コード例 #7
0
/**
 * \brief Check the status of the keyboard
 *
 * \param keybuffer  a keyboard_event struct to store keyboard status
 */
void keyboard_get_key_state(struct keyboard_event *keybuffer)
{
	// Variable to hold the key mask
	static uint8_t key_state;
	char key;

	if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_UP)) && !(key_state & KEYBOARD_UP_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_UP_MASK;
                keybuffer->keycode = KEYBOARD_UP;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_UP);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_UP)) && (key_state & KEYBOARD_UP_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_UP_MASK;
                keybuffer->keycode = KEYBOARD_UP;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_UP);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_UP);
                }
        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_DOWN)) && !(key_state & KEYBOARD_DOWN_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_DOWN_MASK;
                keybuffer->keycode = KEYBOARD_DOWN;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_DOWN);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_DOWN)) && (key_state & KEYBOARD_DOWN_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_DOWN_MASK;
                keybuffer->keycode = KEYBOARD_DOWN;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_DOWN);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_DOWN);
                }
        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_LEFT)) && !(key_state & KEYBOARD_LEFT_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_LEFT_MASK;
                keybuffer->keycode = KEYBOARD_LEFT;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_LEFT);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_LEFT)) && (key_state & KEYBOARD_LEFT_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_LEFT_MASK;
                keybuffer->keycode = KEYBOARD_LEFT;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_LEFT);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_LEFT);
                }
        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_RIGHT)) && !(key_state & KEYBOARD_RIGHT_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_RIGHT_MASK;
                keybuffer->keycode = KEYBOARD_RIGHT;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_RIGHT);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_RIGHT)) && (key_state & KEYBOARD_RIGHT_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_RIGHT_MASK;
                keybuffer->keycode = KEYBOARD_RIGHT;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_RIGHT);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_RIGHT);
                }
        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_START)) && !(key_state & KEYBOARD_START_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_START_MASK;
                keybuffer->keycode = KEYBOARD_START;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_ENTER);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_START)) && (key_state & KEYBOARD_START_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_START_MASK;
                keybuffer->keycode = KEYBOARD_START;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_START);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_ENTER);
                }

        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_SELECT)) && !(key_state & KEYBOARD_SELECT_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_SELECT_MASK;
                keybuffer->keycode = KEYBOARD_SELECT;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_SPACEBAR);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_SELECT)) && (key_state & KEYBOARD_SELECT_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_SELECT_MASK;
                keybuffer->keycode = KEYBOARD_SELECT;
                keybuffer->type = KEYBOARD_RELEASE;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_SPACEBAR);
                }
        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_A)) && !(key_state & KEYBOARD_A_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_A_MASK;
                keybuffer->keycode = KEYBOARD_A;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_A);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_A)) && (key_state & KEYBOARD_A_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_A_MASK;
                keybuffer->keycode = KEYBOARD_A;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_A);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_A);
                }
        } else if ((gpio_pin_is_low(GPIO_PUSH_BUTTON_B)) && !(key_state & KEYBOARD_B_MASK)) {
                // Key pressed
                key_state |= KEYBOARD_B_MASK;
                keybuffer->keycode = KEYBOARD_B;
                keybuffer->type = KEYBOARD_PRESS;
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_down(HID_B);
                }
        } else if ((gpio_pin_is_high(GPIO_PUSH_BUTTON_B)) && (key_state & KEYBOARD_B_MASK)) {
                // Key released
                key_state &= ~KEYBOARD_B_MASK;
                keybuffer->keycode = KEYBOARD_B;
                keybuffer->type = KEYBOARD_RELEASE;
                keybuffer->konami = konami_checker(KEYBOARD_B);
                if (my_flag_autorize_keyboard_events) {
                    udi_hid_kbd_up(HID_B);
                }
        // } else if ((key = cdc_getkey()) != KEYBOARD_NO_KEY) {
        //         keybuffer->keycode = key;
        //         keybuffer->type = KEYBOARD_RELEASE;
        } else {
		keybuffer->keycode = KEYBOARD_NO_KEY;
		keybuffer->type = KEYBOARD_NO_EVENT;
	}
}