- Multifunkciós adattároló érkezett a Patriot színeiben
- Egyedi megjelenésű Radeon VGA a Yeston és a GravaStar keze nyomán
- 5:4 képarányú SXGA monitor jön ősszel az EIZO berkeiből
- Úgy tér vissza a Commodore 64, ahogy titkon mindenki várja
- A hírek szerint a jövő év végére érkezhet a sokat pletykált NVIDIA N1X SoC
- Úgy tér vissza a Commodore 64, ahogy titkon mindenki várja
- Milyen belső merevlemezt vegyek?
- OLED TV topic
- Iszonyatos mennyiségű hulladékkal járhat a Windows 10 terméktámogatásának vége
- Milyen billentyűzetet vegyek?
- Autós kamerák
- Milyen TV-t vegyek?
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Milyen videókártyát?
Új hozzászólás Aktív témák
-
Domonkos
addikt
Hey, tobbi szaktarsam! Hogy halad az a touch-typist-a valas?
Ebben a lepesben feldolgozzuk a billentyuzet eddig begyujtott allapotat. Amink van, az a
keys_down
valtozoban 1-1 bit arrol, hogy az adott billentyu eppen nyomva van-e tartva vagy sem; es amit szeretnenk az valami olyasmi, ami jol leirja hogy a billentyuzeten "valojaban" mi is tortent.
Ez a megfogalmaaz ugyan egy kicsit tag, de a legeslegegyszerubb esetben csak annyirol van szo, hogy a billentyukhoz (a kiosztasnak megfelelo) karaktereket fogunk rendelni.
Hogy melyik kiosztashoz? Hat... azt is nekunk kell implementalni - egyebkent termeszetesen dvorak.Szoval mit is kell egy ilyen lepesnek megtennie?
Nezzuk mondjuk ezt az egyszeru implementaciot:static void
process_keys(void)
{
static kb_state_t prev_key_state = 0;
if (keys_down == prev_key_state) {
return;
}
memset(keys, 0, sizeof (keys));
uint8_t n = 0;
for (kp_t i = 0; i < N_KEYS && n < NKRO; i++) {
if (!BIT_AT(keys_down, i)) {
continue;
}
keys[n++] = get_keycode(i, true);
}
}Rogton a fuggveny elejen van egy fuggveny-szkopu valtozo deklaralva, ami arra van hasznalva, hogy ha a billentyuzet fizikai allapotaban nem tortent valtozas az elozo scan ota, akkor a feldolgozast is rovidre tudjuk zarni.
Itt szinten megjegyeznem, hogy a billentyuzetek kuldhetnenek teljesen valid allapotfrissiteseket akkor is, ha amugy nem tortent lenyomas vagy egyeb - ahogy azt pledaul az eredeti peldaprogram is tette ~10s inaktivitas utan, de tradicionalisan senki sem ir aszinkron firmware-t az elso probalkozasra. Ebben a blogban mi is maradunk az alapoknal.
Egyebkent meg csak vegig kell mennunk az osszes billentyun es reagalni azokra, amik le vannak nyomva. Azert csak azokra, mert az USB-n csak azt a maximum 6 (NKRO) karaktert kell kikuldenunk, amit epp nyomva tartunk. Jogos kerdes lehet, hogy mi van akkor, ha nem csak a lenyomott, de a felengedett billentyukre is szeretnenk reagalni. Termeszeteser azt is itt tudnank megtenni - ahogy a makrokat es az egyeb ujhullamos dolgokat is itt lenne erdemes lerendeznunk, de a fuggveny mar igy is majdnem 20 sor hosszu, szoval ezek implementalasa az olvasora fognak maradni. Tovabba aget_keycode()
fuggveny is azert hivhato meg 2 parameterrel, mert a billentyuk egyebkent siman csinalhatnanak 2 kulonbozo dolgot is lenyomasra es felengedesre. Amugy a retegek hasznalatanal szinte elengedhetetlen lesz, hogy akkor is jo karaktert kapjunk vissza, ha a lenyomas es felengedes kozt valahogy sikerult reteget valtanunk. Ezt azert hagytam benne a kodban, mert ha a vegen meg lesz erdeklodo, akkor errol szivesen irok. Egyebkent erdeklodes hianyaban el fog maradni - es a nem hasznalt argumentrol kapott figyelmeztetes a ti lelketeken fog szaradni.
Osszegezve itt annyi tortenik csak, hogy a nem lenyomott billentyuket kihagyjuk, a lenyomottakhoz pedig kikeressuk a megfelelo betut (/karaktert/funkciot/makrot/stb.)Mivel a
keys[]
tomb csakN_KEYS
hosszu, igy a feldolgozastN_KEYS
darab billentyu rogzitese utan meg kell szakitanunk. Bar erre szinten vannak szofisztikaltabb megoldasok is, azok sajnos nem fernek be 20 sorba. Amugy, igen, ennel az implementacional a hardveres elrendezes befolyasolni fogja azt, hogyN_KEYS
+ billenty leutese eseten mik is lesznek azok a billentyuk amiket kikuldunk.
Ez a fuggveny onmagaban is meg tudna tolteni egy teljes blogot - mar igy is eleget irtam rola - szoval inkabb itt vannak az egyeb implicit modon hasznalt dolgok:#define BIT_AT(num, n) (!!(num & (1ull << n)))
#define NKRO 6
typedef uint8_t kc_t;
typedef uint8_t kp_t;
kc_t keys[NKRO] = { 0 };Ha valamit kihagytam, akkor szivesen valaszolok minden kapcsolodo kerdesre!
Új hozzászólás Aktív témák
- Jelszókezelők
- Úgy tér vissza a Commodore 64, ahogy titkon mindenki várja
- Samsung Galaxy S25 - végre van kicsi!
- Milyen belső merevlemezt vegyek?
- Autós topik látogatók beszélgetős, offolós topikja
- Kodi és kiegészítői magyar nyelvű online tartalmakhoz (Linux, Windows)
- OLED TV topic
- Wuthering Waves
- EAFC 25
- Mercedes topic
- További aktív témák...
- ASUS TUF Gaming A620M-Plus + AMD Ryzen 5 8400F + 16GB 5600MHz Kingston Fury Beast + hűtő
- Eladó Erős Gamer PC - Akár Cyberpunk 2077-re Is Készen! (Ryzen 3 2200G RX 570 8GB 32GB RAM AIO
- MacBook Pro 2019 '16 2,6 Ghz 6mag Intel Core i7 16/512gb - Space Gray Touch Bar
- Xiaomi 13T 256GB, Kártyafüggetlen, 1 Év Garanciával
- Honor Magic6 Lite 256GB, Kártyafüggetlen, 1 Év Garanciával
- Bomba ár! Dell Inspiron 15 3511 - i5-11GEN I 8GB I 256SSD I HDMI I 15,6" FHD I Cam I W11 I Gari
- Csere-Beszámítás! RTX Számítógép játékra! I7 6700 / RTX 2060 6GB / 32GB DDR4 / 250SSD+500HDD
- Új! HP 230 Vezetéknélküli USB-s Billentyűzet
- Telefon felvásárlás!! iPhone 15/iPhone 15 Plus/iPhone 15 Pro/iPhone 15 Pro Max
- Beszámítás! Sony PlayStation 5 825GB SSD lemezes konzol extra kontrollerrel garanciával hibátlan
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest