Quote:
Originally Posted by geek1011
I think I might be able to dig up what the AVRCP key stuff is for though, which should clear things up a bit. For anyone interested, here's the hex I need to figure out the encoding of to be able to give a more confident response about what the A2DP and AVRCP stuff is for:
|
I have everything important. It's a bit underwhelming though, and kinda inconclusive. It looks like the real key mapping is done in Nickel rather than Kobo's input plugin, and I don't have time right now to do deeper digging there.
Code:
000 {1364017488 1 38 0}
016 {KEY_SELECT -1 Key_Select 0 0 0}
028 {KEY_UP -1 Key_Up 0 0 0}
040 {KEY_DOWN -1 Key_Down 0 0 0}
052 {KEY_LEFT -1 Key_Left 0 0 0}
064 {KEY_RIGHT -1 Key_Right 0 0 0}
076 {KEY_MENU -1 Key_Menu 0 0 0}
088 {KEY_PROGRAM -1 Key_HomePage 0 0 0}
100 {KEY_FAVORITES -1 Key_Favorites 0 0 0}
112 {KEY_EXIT -1 Key_Escape 0 0 0}
124 {KEY_0 -1 Key_0 0 0 0}
136 {KEY_1 -1 Key_1 0 0 0}
148 {KEY_2 -1 Key_2 0 0 0}
160 {KEY_3 -1 Key_3 0 0 0}
172 {KEY_4 -1 Key_4 0 0 0}
184 {KEY_5 -1 Key_5 0 0 0}
196 {KEY_6 -1 Key_6 0 0 0}
208 {KEY_7 -1 Key_7 0 0 0}
220 {KEY_8 -1 Key_8 0 0 0}
232 {KEY_9 -1 Key_9 0 0 0}
244 {KEY_DOT -1 Key_Period 0 0 0}
256 {KEY_ENTER -1 Key_Enter 0 0 0}
268 {KEY_CHANNELUP -1 Key_ChannelUp 0 0 0}
280 {KEY_CHANNELDOWN -1 Key_ChannelDown 0 0 0}
292 {KEY_LAST -1 Key_MediaLast 0 0 0}
304 {KEY_CONFIG -1 Key_View 0 0 0}
316 {KEY_INFO -1 Key_View 0 0 0}
328 {KEY_POWER2 -1 Key_Escape 0 0 0}
340 {KEY_VOLUMEUP -1 Key_VolumeUp 0 0 0}
352 {KEY_VOLUMEDOWN -1 Key_VolumeDown 0 0 0}
364 {KEY_MUTE -1 Key_VolumeMute 0 0 0}
376 {KEY_PLAYCD -1 Key_MediaPlay 0 0 0}
388 {KEY_STOPCD -1 Key_MediaStop 0 0 0}
400 {KEY_PAUSECD -1 Key_MediaPause 0 0 0}
412 {KEY_NEXTSONG -1 Key_MediaNext 0 0 0}
424 {KEY_PREVIOUSSONG -1 Key_MediaPrevious 0 0 0}
436 {KEY_RECORD -1 Key_MediaRecord 0 0 0}
448 {KEY_REWIND -1 Key_AudioRewind 0 0 0}
460 {KEY_FASTFORWARD -1 Key_AudioForward 0 0 0}
472 EOF
Spoiler:
Code:
package main
import (
"bufio"
"encoding/binary"
"fmt"
"io"
"os"
"strconv"
"strings"
)
func init() {
if err := loadKeys(); err != nil {
panic(err)
}
if err := loadLinuxKeys(); err != nil {
panic(err)
}
}
func main() {
m, err := keyMap()
if err != nil {
panic(err)
}
_ = m
}
type QtKey int32
func (k QtKey) String() string {
if n, ok := QtKeys[int32(k)]; ok {
return n
}
return fmt.Sprintf("QtKey(%d)", k)
}
var QtKeys map[int32]string
func loadKeys() error {
QtKeys = map[int32]string{}
f, err := os.Open("/usr/include/qt5/QtCore/qnamespace.h")
if err != nil {
return err
}
defer f.Close()
r := bufio.NewScanner(f)
for r.Scan() {
tok := r.Text()
if !strings.HasPrefix(tok, " Key_") {
continue
}
spl := strings.Split(tok, " = ")
if v, err := strconv.ParseInt(strings.Split(spl[1], ",")[0], 0, 32); err != nil {
if !strings.HasPrefix(spl[1], "Key") {
return err
}
} else {
QtKeys[int32(v)] = strings.TrimSpace(spl[0])
}
}
if err := r.Err(); err != nil {
return err
}
return nil
}
type LinuxKey int16
func (k LinuxKey) String() string {
if n, ok := LinuxKeys[int16(k)]; ok {
return n
}
return fmt.Sprintf("LinuxKey(%d)", k)
}
var LinuxKeys map[int16]string
func loadLinuxKeys() error {
LinuxKeys = map[int16]string{}
f, err := os.Open("/usr/include/linux/input-event-codes.h")
if err != nil {
return err
}
defer f.Close()
r := bufio.NewScanner(f)
for r.Scan() {
tok := r.Text()
if !strings.HasPrefix(tok, "#define KEY_") {
continue
}
spl := strings.Fields(tok)
if v, err := strconv.ParseInt(spl[2], 0, 16); err != nil {
if !strings.HasPrefix(strings.TrimLeft(spl[2], "("), "KEY_") {
return err
}
} else {
LinuxKeys[int16(v)] = strings.TrimSpace(spl[1])
}
}
if err := r.Err(); err != nil {
return err
}
return nil
}
type KeyMap struct {
KeyMapHeader
Entry []KeyMapEntry
}
type KeyMapHeader struct {
Magic int32
H2 int32
H3 int32
H4 int32
}
type KeyMapEntry struct {
In LinuxKey
E1 int16
Out QtKey
E2 int8
E3 int8
E4 int16
}
func keyMap() (*KeyMap, error) {
f, err := os.Open("/home/patrick/src/qrc/test/17623/keys/avrcp.qmap")
if err != nil {
panic(err)
}
defer f.Close()
var m KeyMap
if off, err := f.Seek(0, io.SeekCurrent); err != nil {
return nil, err
} else {
fmt.Printf("% 04d ", off)
}
if err := binary.Read(f, binary.BigEndian, &m.KeyMapHeader); err != nil {
panic(err)
}
fmt.Printf("%v\n", m.KeyMapHeader)
for {
var it KeyMapEntry
if off, err := f.Seek(0, io.SeekCurrent); err != nil {
return nil, err
} else {
fmt.Printf("% 04d ", off)
}
if err := binary.Read(f, binary.BigEndian, &it); err == io.EOF {
fmt.Printf("EOF\n")
break
} else if err != nil {
return nil, err
}
fmt.Printf("%v\n", it)
m.Entry = append(m.Entry, it)
}
return &m, nil
}