42#define CHIP_NAME "General MULTI_BUTTON"
43#define MANUFACTURER_NAME "General"
44#define SUPPLY_VOLTAGE_MIN 1.8f
45#define SUPPLY_VOLTAGE_MAX 5.5f
46#define MAX_CURRENT 1.0f
47#define TEMPERATURE_MIN -40.0f
48#define TEMPERATURE_MAX 125.0f
49#define DRIVER_VERSION 1000
54#define MULTI_BUTTON_SHORT_TIME (1000 * 1000)
55#define MULTI_BUTTON_LONG_TIME (3 * 1000 * 1000)
56#define MULTI_BUTTON_REPEAT_TIME (200 * 1000)
57#define MULTI_BUTTON_INTERVAL (5 * 1000)
58#define MULTI_BUTTON_TIMEOUT (1000 * 1000)
59#define MULTI_BUTTON_REPEAT_CNT (2)
60#define MULTI_BUTTON_PERIOD (200 * 1000)
91 offset = handle->
col * row + col;
127 offset = handle->
col * row + col;
133 handle->
debug_print(
"multi_button: timestamp read failed.\n");
139 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
decode[0].
t.
s) * 1000000 +
148 multi_button.
times = 0;
153 if ((uint32_t)(diff) >= handle->
long_time)
160 multi_button.
times = 0;
169 multi_button.
times = 0;
176 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
decode[1].
t.
s) * 1000000 +
183 multi_button.
times = 0;
185 a_multi_button_reset(handle, row, col);
192 multi_button.
times = 0;
194 a_multi_button_reset(handle, row, col);
203 multi_button.
times = 1;
205 a_multi_button_reset(handle, row, col);
211 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
last_time.
s) * 1000000 +
218 for (i = 0; i < len; i++)
222 diff2 = (int64_t)((int64_t)handle->
button[offset].
decode[i + 1].
t.
s -
230 for (i = 1; i < len; i += 2)
234 handle->
debug_print(
"multi_button: double click error.\n");
235 a_multi_button_reset(handle, row, col);
242 multi_button.
times = 2;
244 a_multi_button_reset(handle, row, col);
249 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
last_time.
s) * 1000000 +
256 for (i = 0; i < len; i++)
260 diff2 = (int64_t)((int64_t)handle->
button[offset].
decode[i + 1].
t.
s -
268 for (i = 1; i < len; i += 2)
272 handle->
debug_print(
"multi_button: triple click error.\n");
273 a_multi_button_reset(handle, row, col);
280 multi_button.
times = 3;
282 a_multi_button_reset(handle, row, col);
289 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
last_time.
s) * 1000000 +
296 for (i = 0; i < len; i++)
300 diff2 = (int64_t)((int64_t)handle->
button[offset].
decode[i + 1].
t.
s -
308 for (i = 1; i < len; i += 2)
312 handle->
debug_print(
"multi_button: repeat click error.\n");
313 a_multi_button_reset(handle, row, col);
322 a_multi_button_reset(handle, row, col);
327 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
last_time.
s) * 1000000 +
329 if ((uint32_t)(diff) >= handle->
timeout)
331 handle->
debug_print(
"multi_button: reset checking.\n");
332 a_multi_button_reset(handle, row, col);
359static uint8_t a_multi_button_single(
multi_button_handle_t *handle, uint8_t row, uint8_t col, uint8_t level)
362 uint8_t press_release;
367 offset = handle->
col * row + col;
399 handle->
debug_print(
"multi_button: timestamp read failed.\n");
403 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
button[offset].
last_time.
s) * 1000000 +
405 if (press_release != 0)
409 if ((uint32_t)(diff) < handle->
interval)
411 handle->
debug_print(
"multi_button: press too fast.\n");
412 a_multi_button_reset(handle, row, col);
422 if ((uint32_t)(diff) < handle->
interval)
424 handle->
debug_print(
"multi_button: release too fast.\n");
425 a_multi_button_reset(handle, row, col);
432 if (press_release != 0)
439 multi_button.
times = 0;
450 multi_button.
times = 0;
457 a_multi_button_reset(handle, row, col);
459 if (press_release != 0)
469 handle->
debug_print(
"multi_button: double press.\n");
470 a_multi_button_reset(handle, row, col);
485 handle->
debug_print(
"multi_button: double release.\n");
486 a_multi_button_reset(handle, row, col);
508 for (i = 0; i < handle->
row; i++)
515 handle->
debug_print(
"multi_button: matrix write row failed.\n");
525 handle->
debug_print(
"multi_button: matrix write row failed.\n");
558 handle->
debug_print(
"multi_button: timestamp read failed.\n");
562 diff = (int64_t)((int64_t)t.
s - (int64_t)handle->
check_time.
s) * 1000000 +
564 if ((uint32_t)(diff) > handle->
period)
569 for (i = 0; i < handle->
row; i++)
571 res = a_multi_button_set_matrix_level(handle, i);
579 handle->
debug_print(
"multi_button: matrix read row failed.\n");
583 for (j = 0; j < handle->
col; j++)
585 res = a_multi_button_single(handle, i, j, (col_array >> j) & 0x1);
590 if ((uint32_t)(diff) >= handle->
period)
592 res = a_multi_button_single_period(handle, i, j);
637 handle->
debug_print(
"multi_button: row can't be 0.\n");
643 handle->
debug_print(
"multi_button: col can't be 0.\n");
668 handle->
debug_print(
"multi_button: matrix_init is null.\n");
674 handle->
debug_print(
"multi_button: matrix_deinit is null.\n");
680 handle->
debug_print(
"multi_button: matrix_write_row is null.\n");
686 handle->
debug_print(
"multi_button: matrix_read_row is null.\n");
692 handle->
debug_print(
"multi_button: timestamp_read is null.\n");
698 handle->
debug_print(
"multi_button: delay_ms is null.\n");
704 handle->
debug_print(
"multi_button: receive_callback is null.\n");
714 handle->
debug_print(
"multi_button: timestamp read failed.\n");
720 a_multi_button_set_param(handle);
721 for (i = 0; i < row; i++)
723 for (j = 0; j < col; j++)
725 offset = handle->
row * i + j;
726 a_multi_button_reset(handle, row, col);
737 handle->
debug_print(
"multi_button: matrix init failed.\n");
772 handle->
debug_print(
"multi_button: matrix deinit failed.\n");
1140 *period = handle->
period;