static void printLazyFnState(void){ printStringFromFlash(str_select_lazy_fn); printStringFromFlash(str_space); printStringFromFlash(str_colon); printStringFromFlash(str_space); if(isLazyFn()){ printStringFromFlash(str_on); }else{ printStringFromFlash(str_off); } }
// function that determine keymap // 0 = normal, 1 = fn, 2 = beyond_fn uint8_t getLayer(void) { uint8_t col, row, keyidx, cur, gLayer; /* 게으른 FN이 작동되는 상황 정리; - 첫키로 FN이 눌려야 한다. 이미 다른 키가 눌려있다면 작동 안 함; <- 불편할 수 있으므로 기본 레이어일 경우에는 다른 키들이 눌려져 있어도 FN이 작동하도록 한다. : - 작동이 된 후에는 모든 키가 release 되는 순간까지 layer를 유지 시킨다. (즉, 모든 키가 release 되고 1프레임 후에 작동 해제 되어야한다. ps2의 경우 제일 마지막 키의 release값을 처리해야하기 때문에.) */ if(_currentLazyLayer > 0) return _currentLazyLayer; gLayer= 0; // fn이 가장 우선, 다음 fn2 uint8_t *gMatrix = getCurrentMatrix(); for(row=0;row<ROWS;row++){ if(gMatrix[row] == 0) continue; for(col=0;col<COLUMNS;col++){ cur = gMatrix[row] & BV(col); if(cur){ keyidx = getCurrentKeyindex(_fnScanLayer, row, col); keyidx = getDualActionKeyWhenCompound(keyidx); // fn 키는 무조건 다운 액션을 적용; #ifdef DEBUG_QUICK_BOOTLOADER // for test if(col == 0 && row == 0){ wdt_enable(WDTO_15MS); while(1); } #endif // DEBUG_PRINT(("col= %d, row= %d keymap\n", col, row)); if(keyidx == KEY_FN){ gLayer = LAYER_FN; }else if(keyidx == KEY_FN2){ gLayer = LAYER_FN2; }else if(keyidx == KEY_FN3){ gLayer = LAYER_FN3; }else if(keyidx == KEY_NOR){ if(_fnScanLayer == LAYER_FN2){ // _fnScanLayer은 2를 유지하면서 스캔할 레이어는 0으로 반환; _isFnPressed = true; return LAYER_NORMAL; } } if(gLayer > 0){ // _fnScanLayer은 0을 유지하면서 스캔할 레이어는 1로 반환; if(isLazyFn()){ if(isReleaseAllPrev() || _isFnPressed == false){ _currentLazyLayer = gLayer; }else{ return _fnScanLayer; } } _isFnPressed = true; return gLayer; } } } } if(isBeyondFN()) { _fnScanLayer = isBeyondFN(); }else{ _fnScanLayer = LAYER_NORMAL; } _isFnPressed = false; return _fnScanLayer; }