ErgoDox로 모스 입력해주세요.

8407 단어 ergodox
이 투고는 ErgoDox Advent Calendar 2016의 16일째 글이다.
하다
ErgoDox에 모스 코드 입력 버튼 설치pic.twitter.com/8nbV07FLi4-미야(@miyaoka)2016년 12월 27일.
a에서 z까지 숫자와 공간을 표시할 수 있습니다.
CapsLock을 더하면 대문자, 일본어 IME로 설정하면 로마자를 입력할 수 있습니다.
할 수 있다고는 하지만 실용성이 없다는 것도 안다.
무엇 때문에
ErgoDox는 펌웨어를 가지고 놀았기 때문에 펌웨어 소재를 좀 더 쓰고 싶어요.
어떠하다
  • 모스코드의 입력이 어려워서 여러 번 다시 찍었는데...더 멋있게 하고 싶어
  • C 언어를 잘 몰라서 버퍼가 한도를 초과해서 실행됩니다.항상 경량급 언어를 사용해서 미안합니다.
  • 이루어지다
    Merge branch 'morse' · miyaoka/qmk_firmware@9f2dcde
    keymap.c
    #define MORSE_TERM_SHORT 120
    #define MORSE_TERM_CHARA MORSE_TERM_SHORT * 3
    #define MORSE_TERM_WORD MORSE_TERM_SHORT * 7
    
    단점 길이 120ms, 문자 간의 3배, 단어 간의 7배.
    이 간격이 조금 더 짧으면 더 멋지게 쿵쿵 할 수 있을 것 같아요.
    keymap.c
        case MORSE:
          if (record->event.pressed) {
            last_morse_timer = 0;
            return false;
            break;
          }
          if (!hold_timers[record->event.key.row][record->event.key.col]) {
            return false;
            break;
          }
    
          morse_el = timer_elapsed (hold_timers[record->event.key.row][record->event.key.col]) < MORSE_TERM_SHORT
          ? morse_short
          : morse_long;
    
          strcat(morse_buffer, morse_el);
    
          last_morse_timer = timer_read();
    
          dprintf("%s", morse_el);
    
          return false;
          break;
    
    여기는 모드 입력에 사용할 벨을 처리하고 있습니다.
    hold_타임즈라는 곳에는 전체 키를 저장한 타이머가 부호적으로 저장되어 있으며, 그곳에서 발표될 때 유지 시간으로 짧은지 길은지 판단한 후 입력 버퍼에 추가된다.
    마지막으로 발표된 시기는 여기에 기록한다.
    keymap.c
    void process_morse(void) {
      if (last_morse_timer == 0){
        return;
      }
      uint16_t t = timer_elapsed (last_morse_timer);
    
      // type space
      if (MORSE_TERM_WORD < t){
        type_code(KC_SPC);
        dprint("\n");
        last_morse_timer = 0;
        return;
      }
    
      if (t < MORSE_TERM_CHARA || morse_buffer[0] == '\0'){
        return;
      }
    
      // type chara
      int i;
      for(i = 0; i < 36; i++) {
        if (strcmp(morse_codes[i], morse_buffer) == 0) {
          dprint(" ");
          type_code(KC_A + i);
          break;
        }
      }
      dprint("\n");
      morse_buffer[0] = '\0';
    }
    
    그리고 프레임마다 호출되는 처리가 바로 여기입니다.(말은 그렇게 하지만 제대로 조사하지 않아서 키보드가 어떤 업데이트 주파수로 돌아가는지 모르겠다.)
    마지막 발표 시간부터 경과된 시간을 보면 단어 사이의 길이가 지나면 출력 빈칸이 끝난다.
    문자 사이의 길이가 지나면 버퍼링 코드에서 문자를 출력합니다.
    어떠하다
    짧은 점에 비해 긴 점의 길이는 3배인데, 마치 모스 신호의 규격과 같다
  • 단점의 판정은 단점 시간 이하
  • 장점에 대한 판정은 그 이상
  • 이렇게 처리하니까 3배의 관계도 없는데 어떻게 하면 좋을까...
    그리고 코드의 판정은 문자 배열로 하는 것이 비교적 느리다.양갈래라서 바이너리로 하면 될 것 같은데 실제로는 양갈래라서 2보 못 들어갈 것 같은데 어떻게 하면 좋을까.

    좋은 웹페이지 즐겨찾기