gn_error enterchar(gn_data *data, struct gn_statemachine *state) { unsigned char ch; gn_error error = GN_ERR_NONE; gn_data_clear(data); console_raw(); while ((error = GN_ERR_NONE) && (read(0, &ch, 1) > 0)) { switch (ch) { case '\r': break; case '\n': data->key_code = GN_KEY_MENU; presskey(data, state); break; #ifdef WIN32 case '\033': #else case '\e': #endif data->key_code = GN_KEY_NAMES; presskey(data, state); break; default: data->character = ch; error = gn_sm_functions(GN_OP_EnterChar, data, state); if (error != GN_ERR_NONE) fprintf(stderr, _("Error entering char: %s\n"), gn_error_print(error)); break; } } return error; }
gn_error presskeysequence(gn_data *data, struct gn_statemachine *state) { gn_error error = GN_ERR_NONE; unsigned char *syms = "0123456789#*PGR+-UDMN"; gn_key_code keys[] = {GN_KEY_0, GN_KEY_1, GN_KEY_2, GN_KEY_3, GN_KEY_4, GN_KEY_5, GN_KEY_6, GN_KEY_7, GN_KEY_8, GN_KEY_9, GN_KEY_HASH, GN_KEY_ASTERISK, GN_KEY_POWER, GN_KEY_GREEN, GN_KEY_RED, GN_KEY_INCREASEVOLUME, GN_KEY_DECREASEVOLUME, GN_KEY_UP, GN_KEY_DOWN, GN_KEY_MENU, GN_KEY_NAMES}; unsigned char ch, *pos; gn_data_clear(data); console_raw(); while (read(0, &ch, 1) > 0) { if ((pos = strchr(syms, toupper(ch))) != NULL) data->key_code = keys[pos - syms]; else continue; error = presskey(data, state); } return error; }
void MainWindow::releasedBtnDown() { if(stateBtnDown_Toggled == false) { stateBtnDown_Pushed = false; } else { stateBtnDown_Pushed = !stateBtnDown_Pushed; } if(isPushedBtnDown()) { btnDown->setText("[D]"); labelDown->setText("DOWN"); presskey( KEY_TYPE_DOWN , KEY_EVT_PRESSED ); } else { btnDown->setText("D"); labelDown->setText(""); presskey( KEY_TYPE_DOWN , KEY_EVT_RELEASED ); } }
void MainWindow::releasedBtnEnter() { if(stateBtnEnter_Toggled == false) { stateBtnEnter_Pushed = false; } else { stateBtnEnter_Pushed = !stateBtnEnter_Pushed; } if(isPushedBtnEnter()) { btnEnter->setText("[E]"); labelEnter->setText("ENTER"); presskey( KEY_TYPE_ENTER , KEY_EVT_PRESSED ); } else { btnEnter->setText("ENT"); labelEnter->setText(""); presskey( KEY_TYPE_ENTER , KEY_EVT_RELEASED ); } }
/* ENTERボタン押下処理 */ void MainWindow::pressedBtnEnter() { if(stateBtnEnter_Toggled == false) { btnEnter->setText("[E]"); labelEnter->setText("ENTER"); stateBtnEnter_Pushed = true; presskey( KEY_TYPE_ENTER , KEY_EVT_PRESSED ); } }
/* BACKボタン押下処理 */ void MainWindow::pressedBtnBack() { if(stateBtnBack_Toggled == false) { btnBack->setText("[B]"); labelBack->setText(" BACK"); stateBtnBack_Pushed = true; presskey( KEY_TYPE_CLEAR , KEY_EVT_PRESSED ); } }
void MainWindow::releasedBtnBack() { if(stateBtnBack_Toggled == false) { stateBtnBack_Pushed = false; } else { stateBtnBack_Pushed = !stateBtnBack_Pushed; } if(isPushedBtnBack()) { btnBack->setText("[B]"); labelBack->setText(" BACK"); presskey( KEY_TYPE_CLEAR , KEY_EVT_PRESSED ); } else { btnBack->setText("BACK"); labelBack->setText(""); presskey( KEY_TYPE_CLEAR , KEY_EVT_RELEASED ); } }
/* 右ボタン押下処理 */ void MainWindow::pressedBtnRight() { if(stateBtnRight_Toggled == false) { btnRight->setText("[R]"); labelRight->setText("RIGHT"); stateBtnRight_Pushed = true; presskey( KEY_TYPE_RIGHT , KEY_EVT_PRESSED ); } }
void MainWindow::releasedBtnRight() { if(stateBtnRight_Toggled == false) { stateBtnRight_Pushed = false; } else { stateBtnRight_Pushed = !stateBtnRight_Pushed; } if(isPushedBtnRight()) { btnRight->setText("[R]"); labelRight->setText("RIGHT"); presskey( KEY_TYPE_RIGHT , KEY_EVT_PRESSED ); } else { btnRight->setText("R"); labelRight->setText(""); presskey( KEY_TYPE_RIGHT , KEY_EVT_RELEASED ); } }
/* 左ボタン押下処理 */ void MainWindow::pressedBtnLeft() { if(stateBtnLeft_Toggled == false) { btnLeft->setText("[L]"); labelLeft->setText(" LEFT"); stateBtnLeft_Pushed = true; presskey( KEY_TYPE_LEFT , KEY_EVT_PRESSED ); } }
void MainWindow::releasedBtnLeft() { if(stateBtnLeft_Toggled == false) { stateBtnLeft_Pushed = false; } else { stateBtnLeft_Pushed = !stateBtnLeft_Pushed; } if(isPushedBtnLeft()) { btnLeft->setText("[L]"); labelLeft->setText(" LEFT"); presskey( KEY_TYPE_LEFT , KEY_EVT_PRESSED ); } else { btnLeft->setText("L"); labelLeft->setText(""); presskey( KEY_TYPE_LEFT , KEY_EVT_RELEASED ); } }
/* 下ボタン押下処理 */ void MainWindow::pressedBtnDown() { if(stateBtnDown_Toggled == false) { btnDown->setText("[D]"); labelDown->setText("DOWN"); stateBtnDown_Pushed = true; presskey( KEY_TYPE_DOWN , KEY_EVT_PRESSED ); } }
void MainWindow::releasedBtnUp() { if(stateBtnUp_Toggled == false) { stateBtnUp_Pushed = false; } else { stateBtnUp_Pushed = !stateBtnUp_Pushed; } if(isPushedBtnUp()) { btnUp->setText("[U]"); labelUp->setText(" UP"); presskey( KEY_TYPE_UP , KEY_EVT_PRESSED ); } else { btnUp->setText("U"); labelUp->setText(""); presskey( KEY_TYPE_UP , KEY_EVT_RELEASED ); } }
/* 上ボタン押下処理 */ void MainWindow::pressedBtnUp() { if(stateBtnUp_Toggled == false) { btnUp->setText("[U]"); labelUp->setText(" UP"); stateBtnUp_Pushed = true; presskey( KEY_TYPE_UP , KEY_EVT_PRESSED ); } }
void pokerMode(){ while (1) { for (r = 0; r < ROWS; r++) { pullDownRows(r); read_cols(r); unselect_rows(); } for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { if (keystate[r][c] > 0x08) { if (keytype[r][c] == 0x01) { if (FN == 0x00) presskey(hexaKeys[r][c]); else if (FN == 0x01) presskey(hexaKeys2[r][c]); } else if (keytype[r][c] == 0x02) { pressModifierKeys(hexaKeys[r][c]); } else if (keytype[r][c] == 0x04 && FN == 0x00) { FN = 0x02; } } else { if (keytype[r][c] == 0x01) { if (FN == 0x00) releasekey(hexaKeys[r][c]); else if (FN == 0x01) releasekey(hexaKeys2[r][c]); } else if (keytype[r][c] == 0x02) { releaseModifierKeys(hexaKeys[r][c]); } else if (keytype[r][c] == 0x04 && FN == 0x01) { FN = 0x04; } } } } if(FN==0x02){FN=0x01;releaseAll();} else if(FN==0x04){FN=0x00;releaseAll();} usb_keyboard_send(); /////////////////////////////////// } }
void usb_keyboard_class::press(uint16_t n) { uint8_t key, mod, msb, modrestore=0; msb = n >> 8; if (msb >= 0xC2 && msb <= 0xDF) { n = (n & 0x3F) | ((uint16_t)(msb & 0x1F) << 6); } else if (msb == 0x80) { presskey(0, n); return; } else if (msb == 0x40) { presskey(n, 0); return; } KEYCODE_TYPE keycode = unicode_to_keycode(n); if (!keycode) return; #ifdef DEADKEYS_MASK KEYCODE_TYPE deadkeycode = deadkey_to_keycode(keycode); if (deadkeycode) { modrestore = keyboard_report_data[0]; if (modrestore) { keyboard_report_data[0] = 0; send_now(); } // TODO: test if operating systems recognize // deadkey sequences when other keys are held mod = keycode_to_modifier(deadkeycode); key = keycode_to_key(deadkeycode); presskey(key, mod); releasekey(key, mod); } #endif mod = keycode_to_modifier(keycode); key = keycode_to_key(keycode); presskey(key, mod | modrestore); }
//用sbrk分配内存,brk释放内存比较方便 int main(){ void* p1 = sbrk(4);//RXXX printf("p1 = %p\n",p1); void *p2 = sbrk(4);//XXXX RXXX printf("p2 = %p\n",p2); void *p3 = sbrk(4);//XXXX XXXX RXXX printf("p3 = %p\n",p3); void *p4 = sbrk(4);//XXXX XXXX XXXX RXXX printf("p4 = %p\n",p4); void *p5 = sbrk(0);//XXXX XXXX XXXX XXXX R printf("p5 = %p\n",p5); int* pn = (int*)p1; pn[0] = 0; pn[1] = 1; pn[2] = 2; pn[3] = 3; pn[1023] = 1023;//1页的最后一个整型 printf("%d,%d,%d,%d,%d\n",pn[0],pn[1],pn[2],pn[3],pn[1023]); // pn[1024] = 1024;//Segmentation fault (core dumped) void* p6 = sbrk(-8);//XXXX XXXX ---- ---- R printf("p6 = %p\n",p6);//p5 void *p7 = sbrk(-8);//---- ---- R--- ---- - printf("p7 = %p\n",p7);//p3 printf("------------\n"); int page = getpagesize(); printf("%p\n",sbrk(page)); presskey(); printf("%p\n",sbrk(1)); presskey(); printf("%p\n",sbrk(-1)); presskey(); printf("%p\n",sbrk(-page)); presskey(); printf("------------\n"); p1 = sbrk(0); //R--- ---- ---- ---- - printf("p1 = %p\n",p1); brk(p2 = p1 + 4);//XXXX S--- ---- ---- - printf("p2 = %p\n",p2); brk(p3 = p2 + 4);//XXXX XXXX S--- ---- - printf("p3 = %p\n",p3); brk(p4 = p3 + 4);//XXXX XXXX XXXX S printf("p4 = %p\n",p4); brk(p5 = p4 + 4);//XXXX XXXX XXXX XXXX S printf("p5 = %p\n",p5); pn = (int*)p1; pn[0] = 0; pn[1] = 1; pn[2] = 2; pn[3] = 3; pn[1023] = 1023;//1页的最后一个整型 printf("%d,%d,%d,%d,%d\n",pn[0],pn[1],pn[2],pn[3],pn[1023]); // pn[1024] = 1024; brk(p3);//XXXX XXXX S--- ---- - brk(p1);//S--- ---- ---- ---- - // pn[0] = 0;//已经解除映射了,不能再给pn[0]赋值了 printf("------------------\n"); void * begin = sbrk(sizeof(int)); if((intptr_t)begin == -1){ perror("sbrk"); return -1; } pn = (int*)begin; *pn = 1234; double *pd = (double*)sbrk(sizeof(double)); if((intptr_t)pd == -1){ perror("sbrk"); return -1; } *pd = 3.14; char* psz = (char*)sbrk(256 * sizeof(char)); if((intptr_t)psz == -1){ perror("sbrk"); return -1; } sprintf(psz,"Hello, World !"); printf("%d,%g,%s\n",*pn,*pd,psz); brk(begin); return 0; }