View Single Post
Old 06-17-2021, 01:16 PM   #531
geek1011
Wizard
geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.geek1011 ought to be getting tired of karma fortunes by now.
 
Posts: 2,808
Karma: 7423683
Join Date: May 2016
Location: Ontario, Canada
Device: Kobo Mini, Aura Edition 2 v1, Clara HD
Quote:
Originally Posted by geek1011 View Post
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
}

Last edited by geek1011; 06-17-2021 at 01:25 PM.
geek1011 is offline   Reply With Quote