#include "WgdKeyboard.h" using namespace doste; using namespace doste::dvm; IKeyboard* WgdKeyboard::instance=NULL; OnEvent(IKeyboard, keyEvent) { WgdKeyboard::cbPress(); } IMPLEMENT_EVENTS(IKeyboard, doste::Agent); std::list WgdKeyboard::keyList; std::bitset<143> WgdKeyboard::keys; std::bitset<143> WgdKeyboard::oldKeys; std::map WgdKeyboard::keyMap; IKeyboard::IKeyboard() { registerEvents(); } void WgdKeyboard::init() { //OAIASSERT(!instance, "Keyboard already initialised"); setup(); instance = new IKeyboard(); } void WgdKeyboard::setup() { //Setup key map. keyMap[wgd::Keyboard::KEY_LEFT] = KEY_LEFT; keyMap[wgd::Keyboard::KEY_UP] = KEY_UP; keyMap[wgd::Keyboard::KEY_RIGHT] = KEY_RIGHT; keyMap[wgd::Keyboard::KEY_DOWN] = KEY_DOWN; keyMap[wgd::Keyboard::KEY_RETURN] = KEY_RETURN; keyMap[wgd::Keyboard::KEY_SPACE] = KEY_SPACE; keyMap[wgd::Keyboard::KEY_CTRL] = KEY_CTRL; keyMap[wgd::Keyboard::KEY_SHIFT] = KEY_SHIFT; keyMap[wgd::Keyboard::KEY_RCTRL] = KEY_RCTRL; keyMap[wgd::Keyboard::KEY_RSHIFT] = KEY_RSHIFT; keyMap[wgd::Keyboard::KEY_ALT] = KEY_ALT; keyMap[wgd::Keyboard::KEY_ALTGR] = KEY_ALTGR; keyMap[wgd::Keyboard::KEY_DEL] = KEY_DEL; keyMap[wgd::Keyboard::KEY_BKSPACE] = KEY_BKSPACE; keyMap[wgd::Keyboard::KEY_END] = KEY_END; keyMap[wgd::Keyboard::KEY_PGDOWN] = KEY_PGDOWN; keyMap[wgd::Keyboard::KEY_PGUP] = KEY_PGUP; keyMap[wgd::Keyboard::KEY_HOME] = KEY_HOME; keyMap[wgd::Keyboard::KEY_INSERT] = KEY_INSERT; keyMap[wgd::Keyboard::KEY_PAUSE] = KEY_PAUSE; keyMap[wgd::Keyboard::KEY_TAB] = KEY_TAB; keyMap[wgd::Keyboard::KEY_ESCAPE] = KEY_ESCAPE; keyMap[wgd::Keyboard::KEY_F1] = KEY_F1; keyMap[wgd::Keyboard::KEY_F2] = KEY_F2; keyMap[wgd::Keyboard::KEY_F3] = KEY_F3; keyMap[wgd::Keyboard::KEY_F4] = KEY_F4; keyMap[wgd::Keyboard::KEY_F5] = KEY_F5; keyMap[wgd::Keyboard::KEY_F6] = KEY_F6; keyMap[wgd::Keyboard::KEY_F7] = KEY_F7; keyMap[wgd::Keyboard::KEY_F8] = KEY_F8; keyMap[wgd::Keyboard::KEY_F9] = KEY_F9; keyMap[wgd::Keyboard::KEY_F10] = KEY_F10; keyMap[wgd::Keyboard::KEY_F11] = KEY_F11; keyMap[wgd::Keyboard::KEY_F12] = KEY_F12; //keyMap[-17] = '/'; //keyMap[(OID)-115] = KEY_ENTER; } void WgdKeyboard::cbPress() { //Get key code OID key = wgd::WGD[wgd::ix::input][wgd::ix::keyboard]["key"]; unsigned char keyCode = keyMap[key]; if (!keyCode) { keyCode = (int)key; if (keyCode >= 'a' && keyCode <= 'z') keyCode -= 32; } //If new, add to list of pressed keys if (keyCode && !keys[keyCode]) keyList.push_back(key); } bool WgdKeyboard::keyUp(char keyCode) { if (keyCode >= 'a' && keyCode <= 'z') keyCode -= 32; return !keys[keyCode]; } bool WgdKeyboard::keyDown(char keyCode) { if (keyCode >= 'a' && keyCode <= 'z') keyCode -= 32; return keys[keyCode]; } bool WgdKeyboard::keyPressed(char keyCode) { if (keyCode >= 'a' && keyCode <= 'z') keyCode -= 32; return keys[keyCode] && !oldKeys[keyCode]; } bool WgdKeyboard::keyUp(KeyVal keyCode) { return !keys[keyCode]; } bool WgdKeyboard::keyDown(KeyVal keyCode) { return keys[keyCode]; } bool WgdKeyboard::keyPressed(KeyVal keyCode) { return keys[keyCode] && !oldKeys[keyCode]; } bool WgdKeyboard::cbCheckRelease(const wgd::OID& key) { char str[20]; key.toString(str, 20); bool keyDown = wgd::WGD[wgd::ix::input][wgd::ix::keyboard][wgd::ix::keys][key]; unsigned char keyCode = keyMap[key]; if (!keyCode) { keyCode = (int)key; if (keyCode >= 'a' && keyCode <= 'z') keyCode -= 32; } keys[keyCode] = keyDown; return !keyDown; } void WgdKeyboard::update() { oldKeys = keys; keyList.remove_if(cbCheckRelease); }