diff --git a/CHANGELOG.md b/CHANGELOG.md index 453b8a4..37ecdde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,23 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [1.4.0](https://github.com/rdkcentral/python_raft/compare/1.3.1...1.4.0) + +- Update #151: Added missing rcCodes [`#152`](https://github.com/rdkcentral/python_raft/pull/152) +- Release 1.3.1: master -> develop [`#156`](https://github.com/rdkcentral/python_raft/pull/156) +- Update #151: Added example olimex key config and test for all keys [`994ec5b`](https://github.com/rdkcentral/python_raft/commit/994ec5ba885527b5f6ee43c37fe09f576f4e48fa) + #### [1.3.1](https://github.com/rdkcentral/python_raft/compare/1.3.0...1.3.1) +> 3 March 2025 + +- Release 1.3.1: release/1.3.1 -> master [`#155`](https://github.com/rdkcentral/python_raft/pull/155) - Fix #153: Added 30 timeout readUntil in olimex sendKey [`#154`](https://github.com/rdkcentral/python_raft/pull/154) - Fix 149: Correct powerKasa to use is_on/is_off properties correctly [`#150`](https://github.com/rdkcentral/python_raft/pull/150) - Release 1.3.0: master -> develop [`#145`](https://github.com/rdkcentral/python_raft/pull/145) - Merge pull request #154 from rdkcentral/feature/gh153_bugfix_olimex_keysend_timeout [`#153`](https://github.com/rdkcentral/python_raft/issues/153) - Fix #153: Added 30 timeout readUntil in olimex sendKey [`#153`](https://github.com/rdkcentral/python_raft/issues/153) +- Bumped changelog [`5a0b61f`](https://github.com/rdkcentral/python_raft/commit/5a0b61f836038341df875ab9973bc8e256b41276) #### [1.3.0](https://github.com/rdkcentral/python_raft/compare/1.2.2...1.3.0) diff --git a/examples/configs/example_keymap.yml b/examples/configs/example_keymap.yml new file mode 100644 index 0000000..ed4a621 --- /dev/null +++ b/examples/configs/example_keymap.yml @@ -0,0 +1,141 @@ +# Remote Commander Key Translation Maps + +remoteMaps: + remoteCommanderMap0: + name : "example_all_keys" + prefix: "" + codes: + A: "A" + ANTENNA: "ANTENNA" + APPS: "APPS" + ARC: "ARC" + ARROW_UP: "ARROW_UP" + ARROW_DOWN: "ARROW_DOWN" + ARROW_LEFT: "ARROW_LEFT" + ARROW_RIGHT: "ARROW_RIGHT" + AUDIO: "AUDIO" + AUD_DESC: "AUD_DESC" + AUX: "AUX" + B: "B" + BI: "BI" + BACK: "BACK" + BAND: "BAND" + BLK: "BLK" + BLUE: "BLUE" + BLUETOOTH: "BLUETOOTH" + C: "C" + CANCEL: "CANCEL" + CBL_SAT: "CBL_SAT" + CCTT: "CCTT" + CH_SCAN: "CH_SCAN" + CHANNEL_UP: "CHANNEL_UP" + CHANNEL_DOWN: "CHANNEL_DOWN" + CI_PLUS: "CI+" + CLONE: "CLONE" + CROSS: "CROSS" + CSM: "CSM" + CTC: "CTC" + CVBS: "CVBS" + D: "D" + D2D3: "D2D3" + DCR: "DCR" + DISC_MENU: "DISC_MENU" + DISNEY: "DISNEY" + DVD: "DVD" + ECO: "ECO" + ELLIPSIS: "ELLIPSIS" + EJECT: "EJECT" + ENHANCER: "ENHANCER" + EXIT: "EXIT" + FAC: "FAC" + FFORWARD: "FFORWARD" + GREEN: "GREEN" + GUIDE: "GUIDE" + HDMI: "HDMI" + HEART: "HEART" + HELP: "HELP" + HOME: "HOME" + INFO: "INFO" + INPUT_DOWN: "INPUT_DOWN" + INPUT_UP: "INPUT_UP" + INTERNET: "INTERNET" + INTERNET_RADIO: "INTERNET_RADIO" + LAST: "LAST" + LIGHT_SENSOR: "LIGHT_SENSOR" + LOBATT: "LOBATT" + LOG_LED: "LOG_LED" + MENU: "MENU" + MIC: "MIC" + MIRACAST: "MIRACAST" + MODE: "MODE" + MORE: "MORE" + MOVIE: "MOVIE" + MUSIC: "MUSIC" + MUTE: "MUTE" + NETFLIX: "NETFLIX" + NUM_0: "NUM_0" + NUM_1: "NUM_1" + NUM_2: "NUM_2" + NUM_3: "NUM_3" + NUM_4: "NUM_4" + NUM_5: "NUM_5" + NUM_6: "NUM_6" + NUM_7: "NUM_7" + NUM_8: "NUM_8" + NUM_9: "NUM_9" + OPTIONS: "OPTIONS" + PAGE_DOWN: "PAGE_DOWN" + PAGE_UP: "PAGE_UP" + PARENT: "PARENT" + PARTY: "PARTY" + PASSTHROUGH: "PASSTHROUGH" + PATTERN: "PATTERN" + PAUSE: "PAUSE" + PEACOCK: "PEACOCK" + PHONO: "PHONO" + PIC: "PIC" + PICK_UP: "PICK_UP" + PLAY: "PLAY" + POPUP_MENU: "POPUP_MENU" + POWER: "POWER" + PRESET_LEFT: "PRESET_LEFT" + PRESET_RIGHT: "PRESET_RIGHT" + PREV_CH: "PREV_CH" + PRIME_VIDEO: "PRIME_VIDEO" + QUESTION: "QUESTION" + RECORD: "RECORD" + RED: "RED" + REGIN: "REGIN" + REPLAY: "REPLAY" + RESERVE1: "RESERVE1" + RESERVE2: "RESERVE2" + REWIND: "REWIND" + RGYB: "RGYB" + RJ45: "RJ45" + RS232: "RS232" + RESET: "RESET" + SEARCH: "SEARCH" + SELECT: "SELECT" + SETUP: "SETUP" + SKY: "SKY" + SOURCE: "SOURCE" + STANDBY: "STANDBY" + STATUS: "STATUS" + STOP: "STOP" + SUBTITLE: "SUBTITLE" + SURROUND: "SURROUND" + SUR_DECODE: "SUR_DECODE" + TEST: "TEST" + TEXT: "TEXT" + TOOLS: "TOOLS" + TUNING_LEFT: "TUNING_LEFT" + TUNING_RIGHT: "TUNING_RIGHT" + USB: "USB" + VGA: "VGA" + VIRGIN: "VIRGIN" + VOL_DOWN: "VOL_DOWN" + VOL_UP: "VOL_UP" + WIFI_SSID: "WIFI_SSID" + WP: "WP" + XFINITY: "XFINITY" + YELLOW: "YELLOW" diff --git a/examples/configs/example_olimex_keys.yml b/examples/configs/example_olimex_keys.yml new file mode 100644 index 0000000..ca31f61 --- /dev/null +++ b/examples/configs/example_olimex_keys.yml @@ -0,0 +1,707 @@ +# Remote Commander Key Translation Maps + +remoteMaps: + remoteCommanderMap0: + name : "apple_tv" + prefix: "NEC_b=" + codes: + MENU: "Menu" + PAUSE: "Pause" + ARROW_UP: "NavUp" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + + remoteCommanderMap1: + name : "denon_rc1227_zone1" + prefix: "PANA_b=" + codes: + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + AUX: "Aux" + BACK: "Back" + BLURAY: "BluRay" + BLUETOOTH: "Bluetooth" + CBL_SAT: "CblSat" + CHANNEL_DOWN: "ChPgDown" + CHANNEL_UP: "ChPgUp" + DVD: "Dvd" + ECO: "Eco" + BLUE: "Game" + INFO: "Info" + INTERNET_RADIO: "InternetRadio" + MEDIA_PLAYER: "MediaPlayer" + GREEN: "Movie" + RED: "Music" + MUTE: "Mute" + SELECT: "NavCenter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + OPTIONS: "Option" + PAUSE: "Pause" + PHONO: "Phono" + YELLOW: "Pure" + SETUP: "Setup" + STANDBY: "Sleep" + FFORWARD: "Tune+" + REWIND: "Tune-" + TUNER: "Tuner" + AUDIO: "TvAudio" + USB: "Usb" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + + remoteCommanderMap2: + name: "denon_rc1227_zone2" + prefix: "PANA_c=" + codes: + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + AUX: "Aux" + BACK: "Back" + BLURAY: "BluRay" + BLUETOOTH: "Bluetooth" + CBL_SAT: "CblSat" + CHANNEL_DOWN: "ChPgDown" + CHANNEL_UP: "ChPgUp" + DVD: "Dvd" + BLUE: "Game" + INTERNET_RADIO: "InternetRadio" + MEDIA_PLAYER: "MediaPlayer" + MUTE: "Mute" + SELECT: "NavCenter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + PHONO: "Phono" + STANDBY: "Sleep" + FFORWARD: "Tune+" + REWIND: "Tune-" + TUNER: "Tuner" + AUDIO: "TvAudio" + USB: "Usb" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + + remoteCommanderMap3: + name: "hisense_platco" + prefix: "XMP_a=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + CROSS: "Cross" + DISNEY: "Disney" + HOME: "Home" + SOURCE: "Input" + MENU: "Menu" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + NETFLIX: "Netflix" + POWER: "OnOff" + OPTIONS: "Options" + PEACOCK: "Peacock" + PRIME_VIDEO: "PrimeVideo" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + + remoteCommanderMap4: + name: "xumo_pr1" + prefix: "XMP_e=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + CROSS: "Cross" + HOME: "Home" + SOURCE: "Input" + MENU: "Menu" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + NETFLIX: "Netflix" + POWER: "OnOff" + OPTIONS: "Options" + PEACOCK: "Peacock" + PRIME_VIDEO: "PrimeVideo" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + XUMO: "Xumo" + + remoteCommanderMap5: + name: "panasonic_dp-ub820" + prefix: "PANA_a=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + AUDIO: "Audio" + BLUE: "Blue" + CANCEL: "Cancel" + EXIT: "Exit" + GREEN: "Green" + HOME: "Home" + INTERNET: "Internet" + MIRACAST: "Miracast" + SELECT: "NavCenter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + NETFLIX: "Netflix" + FFORWARD: "Next" + STANDBY: "OnOff" + EJECT: "OpenClose" + OPTIONS: "Option" + PAUSE: "Pause" + PLAY: "Play" + POPUP_MENU: "PopUpMenu" + REWIND: "Previous" + RED: "Red" + BACK: "Return" + SEARCH_BACK: "SearchBackward" + SEARCH_FWD: "SearchForward" + STATUS: "Status" + STOP: "Stop" + MENU: "TopMenu" + SOURCE: "TvInputAv" + POWER: "TvOnOff" + VOL_DOWN: "TvVolDown" + VOL_UP: "TvVolUp" + YELLOW: "Yellow" + + remoteCommanderMap6: + name: "rav575_zone1" + prefix: "NEC_c=" + codes: + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + BAND: "Band" + BLUE: "Blue" + BLUETOOTH: "Bluetooth" + DISPLAY: "Display" + ENHANCER: "Enhancer" + GREEN: "Green" + HOME: "Home" + CHANNEL_DOWN: "InputDown" + CHANNEL_UP: "InputUp" + REWIND: "MemLeft" + PLAY: "MemPlay" + FFORWARD: "MemRight" + MODE: "Mode" + MUTE: "Mute" + SELECT: "NavCenter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + INTERNET: "Net" + POWER: "OnOff" + OPTIONS: "Option" + PARTY: "Party" + POPUP_MENU: "PopUpMenu" + PRESET_LEFT: "PresetLeft" + PRESET_RIGHT: "PresetRight" + PROG_LEFT: "ProgLeft" + PROG_RIGHT: "ProgRight" + PASSTHROUGH: "PureDirect" + RED: "Red" + BACK: "Return" + SETUP: "Setup" + STANDBY: "Sleep" + STRAIGHT: "Straight" + SUR_DECODE: "SurDecode" + MENU: "TopMenu" + SEARCH_BACK: "TuningLeft" + SEARCH_FWD: "TuningRight" + USB: "Usb" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + YELLOW: "Yellow" + + remoteCommanderMap7: + name: "rav575_zone2" + prefix: "NEC_d=" + codes: + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + BAND: "Band" + BLUE: "Blue" + BLUETOOTH: "Bluetooth" + DISPLAY: "Display" + ENHANCER: "Enhancer" + GREEN: "Green" + HOME: "Home" + CHANNEL_DOWN: "InputDown" + CHANNEL_UP: "InputUp" + REWIND: "MemLeft" + PLAY: "MemPlay" + FFORWARD: "MemRight" + MODE: "Mode" + MUTE: "Mute" + SELECT: "NavCenter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + INTERNET: "Net" + POWER: "OnOff" + OPTIONS: "Option" + PARTY: "Party" + POPUP_MENU: "PopUpMenu" + PRESET_LEFT: "PresetLeft" + PRESET_RIGHT: "PresetRight" + PROG_LEFT: "ProgLeft" + PROG_RIGHT: "ProgRight" + RED: "Red" + BACK: "Return" + SETUP: "Setup" + STANDBY: "Sleep" + MENU: "TopMenu" + SEARCH_BACK: "TuningLeft" + SEARCH_FWD: "TuningRight" + USB: "Usb" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + YELLOW: "Yellow" + + remoteCommanderMap8: + name: "samsung_ubd-k8500" + prefix: "SAM_a=" + codes: + RED: "A" + GREEN: "B" + YELLOW: "C" + BLUE: "D" + DISC_MENU: "DiscMenu" + EJECT: "Eject" + BACK: "Back" + HOME: "Home" + INFO: "Info" + SELECT: "NavEnter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + FFORWARD: "Next" + STANDBY: "OnOff" + PAUSE: "Pause" + REWIND: "Previous" + STOP: "Stop" + POWER: "TvPower" + SOURCE: "TvSource" + VOL_DOWN: "TvVolDown" + VOL_UP: "TvVolUp" + MENU: "TitleMenu" + TOOLS: "Tools" + + remoteCommanderMap9: + name: "sony_ubp-x800m2" + prefix: "SIRC_a=" + codes: + AUDIO: "Audio" + STANDBY: "OnOff" + BLUE: "Blue" + DISPLAY: "Display" + EJECT: "Eject" + SEARCH_FWD: "Forward" + GREEN: "Green" + HEART: "Heart" + HOME: "Home" + MUTE: "Mute" + SELECT: "NavEnter" + ARROW_DOWN: "NavDown" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + NETFLIX: "Netflix" + FFORWARD: "Next" + OPTIONS: "Options" + PAUSE: "Pause" + PLAY: "Play" + POPUP_MENU: "PopUpMenu" + REWIND: "Previous" + RED: "Red" + BACK: "Return" + SEARCH_BACK: "Rewind" + STOP: "Stop" + SUBTITLE: "Subtitle" + SOURCE: "TvInput" + POWER: "TvOnOff" + MENU: "TopMenu" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + YELLOW: "Yellow" + + remoteCommanderMap10: + name: "tpv" + prefix: "TPV=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + THREE_D: "2D3D" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + ANTENNA: "AntennaCable" + ARC: "Arc" + AUDIO: "Audio" + BI: "BI" + BLK: "Blk" + CCTT: "Cctt" + CHANNEL_UP: "Ch+" + CHANNEL_DOWN: "Ch-" + CH_SCAN: "ChScan" + CI_PLUS: "Ci+" + CLONE: "Clone" + CSM: "Csm" + CTC: "Ctc" + CVBS: "Cvbs" + DCR: "Dcr" + FAC: "Fac" + HDMI: "Hdmi" + LIGHT_SENSOR: "LightSensor" + LOG_LED: "LogLed" + MENU: "Menu" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + PATTERN: "Pattern" + PIC: "Pic" + PREV_CH: "PreCh" + REGIN: "Regin" + RESERVE1: "Reserve1" + RESERVE2: "Reserve2" + RJ45: "Rj45" + RS232: "Rs232" + RESET: "Rst" + TEST: "Test" + USB: "Usb" + VGA: "Vga" + VIRGIN: "Virgin" + VOL_DOWN: "VolBuzz" + VOL_UP: "VolMax" + WIFI_SSID: "WifiSsid" + WP: "Wp" + YPBPR_SCART: "YpbprScart" + + remoteCommanderMap11: + name: "xr100" + prefix: "XMP_d=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + CROSS: "Cross" + HOME: "Home" + SOURCE: "Input" + MENU: "Menu" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + PICK_UP: "PickUp" # Not a key on the remote but a signal it can send. + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + + remoteCommanderMap12: + name: "llama_a" + prefix: "RC6_a=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + CROSS: "Cross" + HOME: "Home" + MENU: "Menu" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + PICK_UP: "PickUp" # Not a key on the remote but a signal it can send. + RGYB: "Rgyb" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + + remoteCommanderMap13: + name: "llama_b" + prefix: "RC6_b=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + CROSS: "Cross" + HOME: "Home" + MENU: "Menu" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + RGYB: "Rgyb" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + + remoteCommanderMap14: + name: "llama_c" + prefix: "RC6_c=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + BLUE: "BlueDot" + CHANNEL_UP: "Ch+" + CHANNEL_DOWN: "Ch-" + FFORWARD: "Forward" + GREEN: "GreenDot" + HOME: "Home" + SOURCE: "Input" + SEARCH: "Mag" + MENU: "Menu" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + RECORD: "R" + RED: "RedDot" + REWIND: "Rewind" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + YELLOW: "YellowDot" + + remoteCommanderMap15: + name: "llama_d" + prefix: "RC6_d=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + BACK: "Back" + BLUE: "BlueDot" + CHANNEL_UP: "Ch+" + CHANNEL_DOWN: "Ch-" + FFORWARD: "Forward" + GREEN: "GreenDot" + HOME: "Home" + INFO: "I" + SOURCE: "Input" + SEARCH: "Mag" + MENU: "Menu" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + QUESTION: "Question" + RECORD: "R" + RED: "RedDot" + REWIND: "Rewind" + SKY: "Sky" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + YELLOW: "YellowDot" + + remoteCommanderMap16: + name: "xfinity1" + prefix: "XMP_b=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + A: "A" + B: "B" + BACK: "Back" + C: "C" + CHANNEL_UP: "Ch+" + CHANNEL_DOWN: "Ch-" + D: "D" + EXIT: "Exit" + FFORWARD: "Forward" + GUIDE: "Guide" + INFO: "I" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + PAGE_DOWN: "PgDown" + PAGE_UP: "PgUp" + RECORD: "Record" + REWIND: "Rewind" + SOURCE: "TvInput" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + XFINITY: "Xfinity" + + remoteCommanderMap17: + name: "xfinity2" + prefix: "XMP_c=" + codes: + NUM_0: "0" + NUM_1: "1" + NUM_2: "2" + NUM_3: "3" + NUM_4: "4" + NUM_5: "5" + NUM_6: "6" + NUM_7: "7" + NUM_8: "8" + NUM_9: "9" + A: "A" + B: "B" + C: "C" + CHANNEL_UP: "Ch+" + CHANNEL_DOWN: "Ch-" + D: "D" + EXIT: "Exit" + FFORWARD: "Forward" + GUIDE: "Guide" + INFO: "Info" + PREV_CH: "Last" + MIC: "Mic" + MUTE: "Mute" + ARROW_DOWN: "NavDown" + SELECT: "NavEnter" + ARROW_LEFT: "NavLeft" + ARROW_RIGHT: "NavRight" + ARROW_UP: "NavUp" + POWER: "OnOff" + PAUSE: "Pause" + PAGE_DOWN: "PgDown" + PAGE_UP: "PgUp" + RECORD: "Record" + REPLAY: "Replay" + REWIND: "Rewind" + SETUP: "Setup" + SOURCE: "TvInput" + STANDBY: "TvPower" + VOL_DOWN: "VolDown" + VOL_UP: "VolUp" + XFINITY: "Xfinity" \ No newline at end of file diff --git a/framework/core/rcCodes.py b/framework/core/rcCodes.py index 5085c1d..65ff247 100644 --- a/framework/core/rcCodes.py +++ b/framework/core/rcCodes.py @@ -33,103 +33,145 @@ from enum import Enum class rcCode(Enum): - #------ PORTABLE FOR /proc ---------- - NUM_0 = "0x00" - NUM_1 = "0x01" - NUM_2 = "0x02" - NUM_3 = "0x03" - NUM_4 = "0x04" - NUM_5 = "0x05" - NUM_6 = "0x06" - NUM_7 = "0x07" - NUM_8 = "0x08" - NUM_9 = "0x09" - # PREVPROG = "0x0A" # No action - POWER = "0x0C" - MUTE = "0x0D" - VOL_UP = "0x10" # No actionon the TV with IR, may work via bluetooth - VOL_DOWN = "0x11" # No actionon the TV with IR, may work via bluetooth - CHANNEL_UP = "0x20" - CHANNEL_DOWN = "0x21" - PAUSE = "0x24" - FFWD = "0x28" - FORWARD = "0x28" - FFORWARD = "0x28" - #HELP = "0x29" # just brings up home screen and no action - #UNPAIRED = "0x2A" # no visible action - #POWERON = "0x2B" # No action - #POWEROFF = "0x2C" # No action - AUDDESC = "0x2D" - SUBT = "0x2E" # Subtitle section via ? - #TEXT = "0x3C" # No visible action - REWIND = "0x3D" - PLAY = "0x3E" - STOP = "0x3F" - RECORD = "0x40" - LOBATT = "0x47" # displays popup for battery - UP = "0x58" - DOWN = "0x59" - LEFT = "0x5A" - RIGHT = "0x5B" - SELECT = "0x5C" - RED = "0x6D" - GREEN = "0x6E" - YELLOW = "0x6F" - BLUE = "0x70" - #BOXOFF = "0x7D" # no action - SEARCH = "0x7E" # Search Key - #PARENT = "0x7F" # No action - SKY = "0x80" - HELP = "0x81" # ? Key - BACKUP = "0x83" - EXIT = "0xCE" - #TV = "0x84" # No action - #MORE = "0xCB" # No Action - HOME = "0xCC" # Previously TVGuide - APPS = "0xF5" # ... Key - #------ PRIVATE FOR LLAMA-USER ------ + THREE_D = "3d" + A = "A" + ANTENNA = "ANTENNA" + APPS = "APPS" + ARC = "ARC" + ARROW_UP = "ARROW_UP" + ARROW_DOWN = "ARROW_DOWN" + ARROW_LEFT = "ARROW_LEFT" + ARROW_RIGHT = "ARROW_RIGHT" + AUDIO = "AUDIO" + AUD_DESC = "AUD_DESC" + AUX = "AUX" + B = "B" + BI = "BI" BACK = "BACK" + BAND = "BAND" + BLK = "BLK" + BLUE = "BLUE" + BLUETOOTH = "BLUETOOTH" + BLURAY = "BLURAY" + C = "C" + CANCEL = "CANCEL" + CBL_SAT = "CBL_SAT" + CCTT = "CCTT" + CH_SCAN = "CH_SCAN" + CHANNEL_UP = "CHANNEL_UP" + CHANNEL_DOWN = "CHANNEL_DOWN" + CI_PLUS = "CI+" + CLONE = "CLONE" CROSS = "CROSS" - MIC = "MIC" - RGYB = "RGYB" - PICK_UP = "PICK_UP" - #------ PRIVATE FOR TPV-006 --------- - TEST = "TEST" - RST = "RST" - FAC = "FAC" CSM = "CSM" - PATTERN = "PATTERN" - ANTENNA_CABLE = "ANTENNA_CABLE" - PRE_CH = "PRE_CH" - VOL_MAX = "VOL_MAX" CTC = "CTC" - VOL_BUZZ = "VOL_BUZZ" - MENU = "MENU" - BI = "BI" - CH_SCAN = "CH_SCAN" - CCTT = "CCTT" - PIC = "PIC" - LOG_LED = "LOG_LED" - AUDIO = "AUDIO" - D2D3 = "D2D3" - ARC = "ARC" - CIP = "CIP" - VIRGIN = "VIRGIN" CVBS = "CVBS" - YPBPR_SCART = "YPBPR_SCART" + D = "D" + D2D3 = "D2D3" + DCR = "DCR" + DISC_MENU = "DISC_MENU" + DISNEY = "DISNEY" + DISPLAY = "DISPLAY" + DVD = "DVD" + ECO = "ECO" + ELLIPSIS = "ELLIPSIS" + EJECT = "EJECT" + ENHANCER = "ENHANCER" + EXIT = "EXIT" + FAC = "FAC" + FFORWARD = "FFORWARD" + GREEN = "GREEN" + GUIDE = "GUIDE" HDMI = "HDMI" - VGA = "VGA" + HEART = "HEART" + HELP = "HELP" + HOME = "HOME" + INFO = "INFO" + INTERNET = "INTERNET" + INTERNET_RADIO = "INTERNET_RADIO" + LAST = "LAST" + LIGHT_SENSOR = "LIGHT_SENSOR" + LOBATT = "LOBATT" + LOG_LED = "LOG_LED" + MEDIA_PLAYER = "MEDIA_PLAYER" + MENU = "MENU" + MIC = "MIC" + MIRACAST = "MIRACAST" + MODE = "MODE" + MORE = "MORE" + MOVIE = "MOVIE" + MUSIC = "MUSIC" + MUTE = "MUTE" + NETFLIX = "NETFLIX" + NUM_0 = "NUM_0" + NUM_1 = "NUM_1" + NUM_2 = "NUM_2" + NUM_3 = "NUM_3" + NUM_4 = "NUM_4" + NUM_5 = "NUM_5" + NUM_6 = "NUM_6" + NUM_7 = "NUM_7" + NUM_8 = "NUM_8" + NUM_9 = "NUM_9" + OPTIONS = "OPTIONS" + PAGE_DOWN = "PAGE_DOWN" + PAGE_UP = "PAGE_UP" + PARENT = "PARENT" + PARTY = "PARTY" + PASSTHROUGH = "PASSTHROUGH" + PATTERN = "PATTERN" + PAUSE = "PAUSE" + PEACOCK = "PEACOCK" + PHONO = "PHONO" + PIC = "PIC" + PICK_UP = "PICK_UP" + PLAY = "PLAY" + POPUP_MENU = "POPUP_MENU" + POWER = "POWER" + PRESET_LEFT = "PRESET_LEFT" + PRESET_RIGHT = "PRESET_RIGHT" + PREV_CH = "PREV_CH" + PROG_LEFT = "PROG_LEFT" + PROG_RIGHT = "PROG_RIGHT" + PRIME_VIDEO = "PRIME_VIDEO" + QUESTION = "QUESTION" + RECORD = "RECORD" + RED = "RED" REGIN = "REGIN" - CLONE = "CLONE" + REPLAY = "REPLAY" RESERVE1 = "RESERVE1" - DCR = "DCR" - WIFI_SSID = "WIFI_SSID" - BLK = "BLK" - WP = "WP" - LIGHT_SENSOR = "LIGHT_SENSOR" - USB = "USB" + RESERVE2 = "RESERVE2" + REWIND = "REWIND" + RGYB = "RGYB" RJ45 = "RJ45" RS232 = "RS232" - RESERVE2 = "RESERVE2" - #------------------------------------ - + RESET = "RESET" + SEARCH = "SEARCH" + SEARCH_BACK = "SEARCH_BACK" + SEARCH_FWD = "SEARCH_FWD" + SELECT = "SELECT" + SETUP = "SETUP" + SKY = "SKY" + SOURCE = "SOURCE" + STANDBY = "STANDBY" + STATUS = "STATUS" + STOP = "STOP" + STRAIGHT = "STRAIGHT" + SUBTITLE = "SUBTITLE" + SURROUND = "SURROUND" + SUR_DECODE = "SUR_DECODE" + TEST = "TEST" + TEXT = "TEXT" + TOOLS = "TOOLS" + TUNER = "TUNER" + USB = "USB" + VGA = "VGA" + VIRGIN = "VIRGIN" + VOL_DOWN = "VOL_DOWN" + VOL_UP = "VOL_UP" + WIFI_SSID = "WIFI_SSID" + WP = "WP" + XFINITY = "XFINITY" + XUMO = "XUMO" + YELLOW = "YELLOW" + YPBPR_SCART = "YPBPR_SCART" diff --git a/tests/remoteController_test.py b/tests/commonRemoteTests/remoteController_test.py similarity index 98% rename from tests/remoteController_test.py rename to tests/commonRemoteTests/remoteController_test.py index 38cb9fd..7c50e80 100755 --- a/tests/remoteController_test.py +++ b/tests/commonRemoteTests/remoteController_test.py @@ -26,7 +26,7 @@ # Add the framework path to system dir_path = os.path.dirname(os.path.realpath(__file__)) -sys.path.append(dir_path+"/../") +sys.path.append(dir_path+"/../../") from framework.core.rcCodes import rcCode as rc from framework.core.logModule import logModule diff --git a/tests/commonRemoteTests/sendAllKeys.py b/tests/commonRemoteTests/sendAllKeys.py new file mode 100755 index 0000000..cf39b8f --- /dev/null +++ b/tests/commonRemoteTests/sendAllKeys.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +#** ***************************************************************************** +# * +# * If not stated otherwise in this file or this component's LICENSE file the +# * following copyright and licenses apply: +# * +# * Copyright 2023 RDK Management +# * +# * Licensed under the Apache License, Version 2.0 (the "License"); +# * you may not use this file except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * +# http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# * +#* ****************************************************************************** + +import os +import sys + +# Add the framework path to system +dir_path = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(dir_path+"/../../") + +from framework.core.rcCodes import rcCode as rc +from framework.core.logModule import logModule +from framework.core.testControl import testController + +class sendAllKeysTest(testController): + + def __init__(self): + super().__init__("commonRemote sendAllKeysTest", level=logModule.DEBUG) + + def testFunction(self): + map_keys = list(self.commonRemote.remoteMap.currentMap.get("codes", {}).keys()) + for key in map_keys: + self.log.stepStart(f"Testing key: [{key}]") + code = rc[key] + res = self.commonRemote.sendKey(code) + self.log.stepResult(res, "Result of sendKey") + + def testEndFunction(self, powerOff=True): + return super().testEndFunction(powerOff=False) + + + +if __name__ == "__main__": + sendAllKeysTest().run() \ No newline at end of file diff --git a/tests/commonRemoteTests/validate_keymap_config.py b/tests/commonRemoteTests/validate_keymap_config.py new file mode 100755 index 0000000..6468e15 --- /dev/null +++ b/tests/commonRemoteTests/validate_keymap_config.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python3 +#** ***************************************************************************** +# * +# * If not stated otherwise in this file or this component"s LICENSE file the +# * following copyright and licenses apply: +# * +# * Copyright 2023 RDK Management +# * +# * Licensed under the Apache License, Version 2.0 (the "License"); +# * you may not use this file except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * +# http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# * +#* ****************************************************************************** + +import argparse +import os +import sys + +import yaml + +# Add the framework path to system +dir_path = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(dir_path+"/../../") + +from framework.core.rcCodes import rcCode as rc + + +class ArgParser(argparse.ArgumentParser): + + def __init__(self): + super().__init__() + self.add_argument("keymap_file", + action = "store", + help = "Keymap file to validate", + metavar = "KEYMAP_FILe") + self.add_argument("--map-name", + action = "store", + help = "Individual key map in the file to validate, selected by name.", + dest = "keymap_name", + default = None) + self.add_argument("--map-index", + action = "store", + help = "Individual key map in the file to validate, selected by index.", + dest = "keymap_index", + default = None, + type = int) + self._args = self.parse_args() + + @property + def keymap_file(self): + return self._args.keymap_file + + @property + def keymap_name(self): + return self._args.keymap_name + + @property + def keymap_index(self): + return self._args.keymap_index + +class MissingNameError(BaseException): + msg = "The keymap does not have a name set." + +class MissingCodesError(BaseException): + + def __init__(self,name:str): + super().__init__() + self.msg = f"The keymap {name} has no codes set." + +class CodesTypeError(BaseException): + + def __init__(self, name:str): + super().__init__() + self.msg = f"Keymap [{name}]'s codes section not valid\n" \ + "The codes key must have a dictionary value e.g.\n" \ + "codes:\n NUM_0: \"ZERO\"\n NUM_1: \"ONE\"" + +class InvalidCodesError(BaseException): + _deprecated_keys = { + "ANTENNA_CABLE": "ANTENNA", + "AUDDESC": "AUD_DESC", + "BACKUP": "BACK", + "BOXOFF": "POWER", + "CIP": "CI_PLUS", + "DOWN" : "ARROW_DOWN", + "FFWD": "FFORWARD", + "FORWARD": "FFORWARD", + "LEFT": "ARROW_LEFT", + "POWEROFF": "POWER", + "POWERON": "POWER", + "PREVPROG": "PREV_CH", + "PRE_CH": "PREV_CH", + "RIGHT": "ARROW_RIGHT", + "RST": "RESET", + "SUBT": "SUBTITLE", + "TV": "SOURCE", + "UNPAIRED": "PICK_UP", + "UP": "ARROW_UP", + "VOL_BUZZ": "VOL_DOWN", + "VOL_MAX": "VOL_UP" + } + + def __init__(self,name: str, invalid_codes: list): + super().__init__() + self.msg = "" + self._substitutions = [] + for code in invalid_codes: + if code in self._deprecated_keys.keys(): + self._substitutions.append(f"{code} => {self._deprecated_keys.get(code)}") + invalid_codes.remove(code) + self._invalid_codes = invalid_codes + if len(self._invalid_codes) > 0: + self.msg += f"The following codes in keymap [{name}] are not valid:\n\t" + "\n\t".join(self._invalid_codes) + if len(self._substitutions) > 0: + if len(self.msg) > 0: + self.msg += "\n" + self.msg += f"The follow codes in keymap [{name}] have been deprecated.\nBelow are possible substitutions:\n\t" \ + + "\n\t".join(self._substitutions) + +def validate_keymap(keymap_dict): + map_name = keymap_dict.get("name",None) + if map_name is None: + raise MissingNameError() + codes = keymap_dict.get("codes", None) + if codes is None: + raise MissingCodesError(map_name) + if not isinstance(codes, dict): + raise CodesTypeError(map_name) + failed_codes = [] + valid_codes = dir(rc) + for key in codes.keys(): + if key not in valid_codes: + failed_codes.append(key) + if failed_codes: + raise InvalidCodesError(map_name, failed_codes) + print(f"Keymap [{map_name}] is valid.") + +def validate_keymaps(keymaps_list): + passed = True + for index, map in enumerate(REMOTE_MAPS): + try: + validate_keymap(map) + except MissingNameError as e: + print(f"Keymap at index {index} does not have a name set") + passed = False + except(MissingCodesError, CodesTypeError, InvalidCodesError) as e: + print(e.msg) + passed = False + return passed + +if __name__ == "__main__": + ARGS = ArgParser() + try: + with open(ARGS.keymap_file, "r", encoding="utf-8") as KEYMAP_FILE: + KEYMAPS = yaml.load(KEYMAP_FILE, yaml.SafeLoader) + except Exception as e: + print(f"Cannot open specified keymap file. [{ARGS.keymap_file}]:\n{e}") + raise SystemExit(1) + REMOTE_MAPS = KEYMAPS.get("remoteMaps",{}) + if isinstance(REMOTE_MAPS,dict): + REMOTE_MAPS = list(map(lambda x: REMOTE_MAPS.get(x),REMOTE_MAPS.keys())) + if ARGS.keymap_name: + found_keymap = list(filter(lambda x: x.get("name") == ARGS.keymap_name, REMOTE_MAPS)) + if found_keymap: + try: + validate_keymap(found_keymap[0]) + raise SystemExit(0) + except (MissingNameError, + MissingCodesError, + CodesTypeError, + InvalidCodesError) as e: + print(e.msg) + raise SystemExit(1) + else: + print(f"No keymap found with the name [{ARGS.keymap_name}]") + raise SystemExit(1) + if isinstance(ARGS.keymap_index, int): + try: + found_keymap = REMOTE_MAPS[ARGS.keymap_index] + except IndexError: + print(f"Map index provided [{ARGS.keymap_index}] out of range for keymap file") + raise SystemExit(1) + try: + validate_keymap(found_keymap) + raise SystemExit(0) + except (MissingNameError, + MissingCodesError, + CodesTypeError, + InvalidCodesError) as e: + print(e.msg) + raise SystemExit(1) + if validate_keymaps(REMOTE_MAPS) is False: + raise SystemExit(1) + +