102 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // Copyright 2022 QMK
 | |
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| #include "secure.h"
 | |
| #include "timer.h"
 | |
| 
 | |
| #ifndef SECURE_UNLOCK_TIMEOUT
 | |
| #    define SECURE_UNLOCK_TIMEOUT 5000
 | |
| #endif
 | |
| 
 | |
| #ifndef SECURE_IDLE_TIMEOUT
 | |
| #    define SECURE_IDLE_TIMEOUT 60000
 | |
| #endif
 | |
| 
 | |
| #ifndef SECURE_UNLOCK_SEQUENCE
 | |
| #    define SECURE_UNLOCK_SEQUENCE \
 | |
|         {                          \
 | |
|             { 0, 0 }               \
 | |
|         }
 | |
| #endif
 | |
| 
 | |
| static secure_status_t secure_status = SECURE_LOCKED;
 | |
| static uint32_t        unlock_time   = 0;
 | |
| static uint32_t        idle_time     = 0;
 | |
| 
 | |
| static void secure_hook(secure_status_t secure_status) {
 | |
|     secure_hook_quantum(secure_status);
 | |
|     secure_hook_kb(secure_status);
 | |
| }
 | |
| 
 | |
| secure_status_t secure_get_status(void) {
 | |
|     return secure_status;
 | |
| }
 | |
| 
 | |
| void secure_lock(void) {
 | |
|     secure_status = SECURE_LOCKED;
 | |
|     secure_hook(secure_status);
 | |
| }
 | |
| 
 | |
| void secure_unlock(void) {
 | |
|     secure_status = SECURE_UNLOCKED;
 | |
|     idle_time     = timer_read32();
 | |
|     secure_hook(secure_status);
 | |
| }
 | |
| 
 | |
| void secure_request_unlock(void) {
 | |
|     if (secure_status == SECURE_LOCKED) {
 | |
|         secure_status = SECURE_PENDING;
 | |
|         unlock_time   = timer_read32();
 | |
|     }
 | |
|     secure_hook(secure_status);
 | |
| }
 | |
| 
 | |
| void secure_activity_event(void) {
 | |
|     if (secure_status == SECURE_UNLOCKED) {
 | |
|         idle_time = timer_read32();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void secure_keypress_event(uint8_t row, uint8_t col) {
 | |
|     static const uint8_t sequence[][2] = SECURE_UNLOCK_SEQUENCE;
 | |
|     static const uint8_t sequence_len  = sizeof(sequence) / sizeof(sequence[0]);
 | |
| 
 | |
|     static uint8_t offset = 0;
 | |
|     if ((sequence[offset][0] == row) && (sequence[offset][1] == col)) {
 | |
|         offset++;
 | |
|         if (offset == sequence_len) {
 | |
|             offset = 0;
 | |
|             secure_unlock();
 | |
|         }
 | |
|     } else {
 | |
|         offset = 0;
 | |
|         secure_lock();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void secure_task(void) {
 | |
| #if SECURE_UNLOCK_TIMEOUT != 0
 | |
|     // handle unlock timeout
 | |
|     if (secure_status == SECURE_PENDING) {
 | |
|         if (timer_elapsed32(unlock_time) >= SECURE_UNLOCK_TIMEOUT) {
 | |
|             secure_lock();
 | |
|         }
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #if SECURE_IDLE_TIMEOUT != 0
 | |
|     // handle idle timeout
 | |
|     if (secure_status == SECURE_UNLOCKED) {
 | |
|         if (timer_elapsed32(idle_time) >= SECURE_IDLE_TIMEOUT) {
 | |
|             secure_lock();
 | |
|         }
 | |
|     }
 | |
| #endif
 | |
| }
 | |
| 
 | |
| __attribute__((weak)) bool secure_hook_user(secure_status_t secure_status) {
 | |
|     return true;
 | |
| }
 | |
| __attribute__((weak)) bool secure_hook_kb(secure_status_t secure_status) {
 | |
|     return secure_hook_user(secure_status);
 | |
| }
 | 
