Hi,
I would like display all keycode azerty Keyboard, I started to use uart_event_handle() and I modified send_key_scan_press_release() for the modifier position key [MODIFIER_KEY_POS]. When I connected to smartphone and I receive the character 'c', I display 5 keys: 12345 and when I receive the character 'd', I display 5 keys : &é"'( it's OK. but when I receive the character 'e' , I display: 123'( . I just added for case 'e' the line kb_key_shift_ctrl_alt_altgr = NO_SPECIFIC_KEY_CODE; after while(size < MAX_KEYS_IN_ONE_REPOR)
{
...
}
I can't understand why the SHIFT key seems to be released on the fourth character. 123' (normally number 4) then 5?
static uint8_t m_sample_key_press_scan_str_number[] = /**< Key pattern to be sent when the key press button has been pushed. */
{
0x1E,
0x1F,
0x20,
0x21,
0x22,
0x28 /* Key Return */
};
uint8_t kb_key_shift_ctrl_alt_altgr; // variable for input report MODIFER_KEY_POS, see macro SHIFT_KEY_CODE, CTRL_KEY_CODE....
void uart_event_handle(app_uart_evt_t * p_event) //$at_06_04_22
{
uint8_t message[UARTE_MAX_DATA_LEN] = "UART OK";
uint8_t message_erase_bonds[] = "wait cmd Erase bonds";
uint8_t i;
static uint8_t * p_key = m_sample_key_press_scan_str;
static uint8_t size = 0;
static uint8_t data_array[UARTE_MAX_DATA_LEN];
static uint8_t index = 0;
//uint32_t err_code;
switch (p_event->evt_type)
{
case APP_UART_DATA_READY:
UNUSED_VARIABLE(app_uart_get(&data_array[index]));
switch(data_array[0])
{
case 'a':
for (i = 0; i < strlen((const char*)message_erase_bonds); i++)
{
app_uart_put(message_erase_bonds[i]);
}
break;
case 'b':
advertising_start(true);
break;
case 'c':
p_key = m_sample_key_press_scan_str_number;
kb_key_shift_ctrl_alt_altgr = SHIFT_KEY_CODE;
size = 0;
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
while (size < MAX_KEYS_IN_ONE_REPORT)
{
keys_send(1, p_key);
p_key++;
size++;
}
}
break;
case 'd':
p_key = m_sample_key_press_scan_str_number;
kb_key_shift_ctrl_alt_altgr = NO_SPECIFIC_KEY_CODE;
size = 0;
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
while (size < MAX_KEYS_IN_ONE_REPORT)
{
keys_send(1, p_key);
p_key++;
size++;
}
}
break;
case 'e':
p_key = m_sample_key_press_scan_str_number;
kb_key_shift_ctrl_alt_altgr = SHIFT_KEY_CODE;
size = 0;
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
while (size < MAX_KEYS_IN_ONE_REPORT)
{
keys_send(1, p_key);
p_key++;
size++;
}
}
kb_key_shift_ctrl_alt_altgr = NO_SPECIFIC_KEY_CODE;
break;
default:
for (i = 0; i < strlen((const char*)message); i++)
{
app_uart_put(message[i]);
}
break;
}
break;
case APP_UART_COMMUNICATION_ERROR:
APP_ERROR_HANDLER(p_event->data.error_communication);
break;
case APP_UART_FIFO_ERROR:
APP_ERROR_HANDLER(p_event->data.error_code);
break;
default:
break;
}
}
static uint32_t send_key_scan_press_release(ble_hids_t * p_hids,
uint8_t * p_key_pattern,
uint16_t pattern_len,
uint16_t pattern_offset,
uint16_t * p_actual_len)
{
ret_code_t err_code;
uint16_t offset;
uint16_t data_len;
uint8_t data[INPUT_REPORT_KEYS_MAX_LEN];
// HID Report Descriptor enumerates an array of size 6, the pattern hence shall not be any
// longer than this.
STATIC_ASSERT((INPUT_REPORT_KEYS_MAX_LEN - 2) == 6);
ASSERT(pattern_len <= (INPUT_REPORT_KEYS_MAX_LEN - 2));
offset = pattern_offset;
data_len = pattern_len;
do
{
// Reset the data buffer.
memset(data, 0, sizeof(data));
// Copy the scan code.
memcpy(data + SCAN_CODE_POS + offset, p_key_pattern + offset, data_len - offset);
/*
if (bsp_button_is_pressed(SHIFT_BUTTON_ID))
{
data[MODIFIER_KEY_POS] |= SHIFT_KEY_CODE;
}
*/
data[MODIFIER_KEY_POS] |= kb_key_shift_ctrl_alt_altgr; //$at_12_04_22
if (!m_in_boot_mode)
{
err_code = ble_hids_inp_rep_send(p_hids,
INPUT_REPORT_KEYS_INDEX,
INPUT_REPORT_KEYS_MAX_LEN,
data,
m_conn_handle);
}
else
{
err_code = ble_hids_boot_kb_inp_rep_send(p_hids,
INPUT_REPORT_KEYS_MAX_LEN,
data,
m_conn_handle);
}
if (err_code != NRF_SUCCESS)
{
break;
}
offset++;
}
while (offset <= data_len);
*p_actual_len = offset;
return err_code;
}
thanks for help
Alexandre