예제 #1
0
// 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;
}
예제 #2
0
//----------------------------------------------------------
ofMatrix4x4 ofGLRenderer::getCurrentNormalMatrix() const{
	return ofMatrix4x4::getTransposedOf(getCurrentMatrix(OF_MATRIX_MODELVIEW).getInverse());
}
예제 #3
0
void setPrevMatrix(void){
    memcpy(prevMatrix, getCurrentMatrix(), ROWS);
}