On Thu, Mar 19, 2015 at 1:24 PM, Maksim Yevmenkin
<[email protected]> wrote:
>> Hi,
>>
>> It's not for production use, but if someone comes across this post in
>> the future maybe save a few minutes when tinkering and
>> troubleshooting.
>>
>> I changed the Makefile so it will 'more easily' build as a standalone
>> outside /usr/src
>> I added the syslog line around ln 324 in server.c - just wanted to see
>> that data was coming in.
>>
>> do {
>> len = read(fd, &data, to_read);
>> syslog(LOG_ERR,"%s",data.b);
>> } while (len < 0 && errno == EINTR);
>
> ok, thanks.
>
> so, yes, please check your hid report format.
>
> this it the input report you should be using (this is taken from your
> hid descriptor)
>
> Input   id=1 size=8 count=6 page=Keyboard
> usage=Reserved_(no_event_indicated), logical range 0..255
>
> so, it means that on-the-wire packet should be 10 bytes
>
> byte 0: 0xA1 -- bluetooth header
> byte 1: 0x01 -- hid report id
> byte 2: 0xXX -- bitmask for modifier key pressed, i.e. ctrl, shift, alt, etc.
> byte 3: 0x00 -- padding
> byte 4: 0xXX -- key code pressed #1
> byte 5: 0xXX -- key code pressed #2
> byte 6: 0xXX -- key code pressed #3
> byte 7: 0xXX -- key code pressed #4
> byte 8: 0xXX -- key code pressed #5
> byte 9: 0xXX -- key code pressed #6
>
> hid repot should tell which keys (scan codes 1..6) are pressed
> currently, and, which modifier keys are pressed currently (byte 2). if
> no keys are pressed currently, then, 0x00 should be used. host should
> keep track of which keys were pressed previously, and, effectively
> build a press/release logic itself. meaning if hid report N had key
> code K, and, hid report N+1 did not have key code K, then it means
> that key code K was pressed and subsequently released.
>
> here is another example that my be easier to understand. suppose we
> start with no keys pressed. hid report will look like
>
> byte 0: 0xA1
> byte 1: 0x01
> byte 2: 0x00
> byte 3: 0x00
> byte 4: 0x00
> byte 5: 0x00
> byte 6: 0x00
> byte 7: 0x00
> byte 8: 0x00
> byte 9: 0x00
>
> now, suppose key 'a' was pressed and then released. two hid reports
> will go out, i.e.
>
> byte 0: 0xA1
> byte 1: 0x01
> byte 2: 0x00
> byte 3: 0x00
> byte 4: key code for 'a' key
> byte 5: 0x00
> byte 6: 0x00
> byte 7: 0x00
> byte 8: 0x00
> byte 9: 0x00
>
> followed by
>
> byte 0: 0xA1
> byte 1: 0x01
> byte 2: 0x00
> byte 3: 0x00
> byte 4: 0x00
> byte 5: 0x00
> byte 6: 0x00
> byte 7: 0x00
> byte 8: 0x00
> byte 9: 0x00
>
> meaning key 'a' was released and no other keys were pressed.
>
> i hope it makes sense to you.
>
> thanks,
> max

I finally have it working, except for some reason it's repeating last
character. ('1' in the following example)

Sending 'ABEF010231' to FIFO buffer, the client "types" the following:

ABEF010231111111111111111111111111111111111111111111111111111111111111

1 forever, until i send another string of data to FIFO buffer, then it
again repeats the last key as if it were stuck.

i have 'release' key defined as

/* empty struct for key release */
struct hidrep_keyb_t * releasekey = (void *)hidrep;
releasekey->btcode = 0xA1;
releasekey->rep_id = REPORTID_KEYBD;
releasekey->modify = 0x00;
releasekey->pad = 0x00;
releasekey->key[0] = 0x00;
releasekey->key[1] = 0x00;
releasekey->key[2] = 0x00;
releasekey->key[3] = 0x00;
releasekey->key[4] = 0x00;
releasekey->key[5] = 0x00;


here's the loop, for each character in FIFO buffer

vkeyb->btcode = 0xA1;
vkeyb->rep_id = REPORTID_KEYBD;
vkeyb->modify = shiftkey(sfifo[i]);
vkeyb->pad = 0x00;
vkeyb->key[0] = retkey(sfifo[i]); /* key press */
vkeyb->key[1] = 0x00;
vkeyb->key[2] = 0x00;
vkeyb->key[3] = 0x00;
vkeyb->key[4] = 0x00;
vkeyb->key[5] = 0x00;
send ( intrsockfd, vkeyb,sizeof(struct hidrep_keyb_t), MSG_NOSIGNAL );
printf("sent data %d %lu\n",vkeyb->key[0],sizeof(struct hidrep_keyb_t));
send ( intrsockfd, releasekey,sizeof(struct hidrep_keyb_t), MSG_NOSIGNAL );
printf("sent release\n");
fflush(stdout);

it does 'shift' 0x2 modifier on A-Z


I think I'm missing something with the release key.

Thank you,

-- 
Waitman Gobble
Los Altos California USA
510-830-7975
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bluetooth
To unsubscribe, send any mail to "[email protected]"

Reply via email to