Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 5 of 5

Thread: T3: generating special symbols with USB keyboard

  1. #1
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,606

    T3: generating special symbols with USB keyboard

    On a US keyboard the copyright symbol can be typed by holding down an ALT key, typing 0169 on the numeric keypad and then releasing the ALT key. I've been playing with the USB keyboard code and can't figure out how to get this to work. The ALT, SHIFT etc. keys are only modifiers of a typed key and there doesn't seem to be a way to say "hold down the ALT key".
    How can the copyright and other special symbols be typed with the Teensy 3 USB keyboard?

    Thanks
    Pete

  2. #2
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,606
    Here's the code for my most recent attempt to generate the copyright symbol:

    Pete

    Code:
    // Play with Teensy 3 USB keyboard
    // Type AbC on first line (works)
    // Type the copyright symbol on the second line (fails)
    
    int led = 13;
    
    int keypress(uint8_t key, uint8_t modifier)
    {
      int r;
      keyboard_modifier_keys = modifier;
      keyboard_keys[0] = key;
      keyboard_keys[1] = 0;
      keyboard_keys[2] = 0;
      keyboard_keys[3] = 0;
      keyboard_keys[4] = 0;
      keyboard_keys[5] = 0;
      return usb_keyboard_send();
    }
    
    
    int key_release_all(void)
    {
      delay(1);
      keyboard_modifier_keys = 0;
      keyboard_keys[0] = 0;
      keyboard_keys[1] = 0;
      keyboard_keys[2] = 0;
      keyboard_keys[3] = 0;
      keyboard_keys[4] = 0;
      keyboard_keys[5] = 0;
      return usb_keyboard_send();  
    }
    
    // the setup routine runs once when you press reset:
    void setup() {
      pinMode(led, OUTPUT);   
    
      // flash led for 10 seconds
      for (int i=0; i < 10; i++) {
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(500);
      }
    
      usb_keyboard_press(KEY_A,MODIFIERKEY_SHIFT);
      usb_keyboard_press(KEY_B,0);
      usb_keyboard_press(KEY_C,MODIFIERKEY_SHIFT);
      usb_keyboard_press(KEY_ENTER,0);
    
      // Use my modified key press code to try to generate
      // copyright symbol
      // light up the LED if this first one fails
      if(keypress(0,MODIFIERKEY_LEFT_ALT) < 0)digitalWrite(led, HIGH);
      keypress(KEYPAD_0,MODIFIERKEY_LEFT_ALT);
      keypress(KEYPAD_1,MODIFIERKEY_LEFT_ALT);
      keypress(KEYPAD_6,MODIFIERKEY_LEFT_ALT);
      keypress(KEYPAD_9,MODIFIERKEY_LEFT_ALT);
      key_release_all();
      keypress(KEY_ENTER,0);
      key_release_all();
    
    }
    
    // the loop routine runs over and over again forever:
    void loop() {           
    }

  3. #3
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,606
    Aha. Figured it out.
    Code:
      keyboard_modifier_keys = MODIFIERKEY_LEFT_ALT;
      keyboard_keys[0] = KEYPAD_0;
      keyboard_keys[1] = KEYPAD_1;
      keyboard_keys[2] = KEYPAD_6;
      keyboard_keys[3] = KEYPAD_9;
      keyboard_keys[4] = 0;
      keyboard_keys[5] = 0;
      usb_keyboard_send();  
      usb_keyboard_release_all();
    Pete

  4. #4
    Senior Member
    Join Date
    Nov 2012
    Location
    Boston, MA, USA
    Posts
    1,112
    Thanks for documenting your workaround. (I would not have expected it to work, since it seems to be saying that all four numeral keys are pressed simultaneously).

    An alternative approach would be to use the US International keyboard layout which, besides the more common accented Latin letters, also gives you (Right Alt, c).

    Click image for larger version. 

Name:	420px-KB_US-International.svg.png 
Views:	560 
Size:	21.6 KB 
ID:	165

  5. #5
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,606
    it seems to be saying that all four numeral keys are pressed simultaneously
    This seems to be its way of allowing you to simulate multiple keypresses while one or more modifier keys (shift, alt ,etc) are also held down. In which case you can simulate a sequence of up to six keys in a row!
    I haven't found any other way of doing it.

    Pete

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •