From ca07675aa383be558295fc82411c677bae207257 Mon Sep 17 00:00:00 2001 From: John Pietrzak Date: Sun, 16 Sep 2012 19:20:44 -0400 Subject: [PATCH] New Keysets I've found a new source of keyset data, so I'm now able to add a few more keysets for brands that were not previously supported. A first pass has been made at keysets for Crown Mustang, Hantarex, Keymat, Konka, and Wiwa, and new keysets added to ADB (I-Can), Sony, and Triax. Also, some tweaks to the macro UI, fixes to a Cisco keyset and an LG timing issue, and improvements to thread management when the app exits. --- dialogs/pireditcommanddialog.cpp | 9 +- dialogs/pireditcommanddialog.h | 10 +- dialogs/pireditcommanddialog.ui | 23 +---- forms/pirmacroform.cpp | 57 ++++++++++-- forms/pirmacroform.h | 18 ++-- forms/pirmacroform.ui | 106 +++++++++++++++++---- keysets/adb.cpp | 63 +++++++++++++ keysets/adb.h | 11 +++ keysets/cisco.cpp | 4 +- keysets/crownmustang.cpp | 57 ++++++++++++ keysets/crownmustang.h | 18 ++++ keysets/haier.cpp | 12 ++- keysets/hantarex.cpp | 126 +++++++++++++++++++++++++ keysets/hantarex.h | 28 ++++++ keysets/keymat.cpp | 114 +++++++++++++++++++++++ keysets/keymat.h | 28 ++++++ keysets/konka.cpp | 113 ++++++++++++++++++++++ keysets/konka.h | 28 ++++++ keysets/lg.cpp | 3 + keysets/sony.cpp | 59 ++++++++++++ keysets/sony.h | 11 +++ keysets/triax.cpp | 150 ++++++++++++++++++++++++++++-- keysets/triax.h | 26 +++++- keysets/wiwa.cpp | 69 ++++++++++++++ keysets/wiwa.h | 18 ++++ mainwindow.cpp | 4 +- pierogi.pro | 14 ++- pierogi.pro.user | 8 +- pirkeysetmanager.cpp | 36 +++++-- pirkeysetmetadata.cpp | 8 ++ pirkeysetmetadata.h | 2 + pirmakenames.cpp | 5 + pirmakenames.h | 5 + protocols/necprotocol.cpp | 1 + qtc_packaging/debian_fremantle/changelog | 6 ++ qtc_packaging/debian_fremantle/control | 4 +- 36 files changed, 1166 insertions(+), 88 deletions(-) create mode 100644 keysets/crownmustang.cpp create mode 100644 keysets/crownmustang.h create mode 100644 keysets/hantarex.cpp create mode 100644 keysets/hantarex.h create mode 100644 keysets/keymat.cpp create mode 100644 keysets/keymat.h create mode 100644 keysets/konka.cpp create mode 100644 keysets/konka.h create mode 100644 keysets/wiwa.cpp create mode 100644 keysets/wiwa.h diff --git a/dialogs/pireditcommanddialog.cpp b/dialogs/pireditcommanddialog.cpp index 837bcaa..a641a6b 100644 --- a/dialogs/pireditcommanddialog.cpp +++ b/dialogs/pireditcommanddialog.cpp @@ -25,7 +25,7 @@ void PIREditCommandDialog::setup( ui->commandValueLabel->setText(name); } - +/* void PIREditCommandDialog::on_moveUpButton_clicked() { emit moveCommandUp(); @@ -37,9 +37,16 @@ void PIREditCommandDialog::on_moveDownButton_clicked() emit moveCommandDown(); accept(); } +*/ void PIREditCommandDialog::on_deleteButton_clicked() { emit deleteCommand(); accept(); } + +void PIREditCommandDialog::on_copyButton_clicked() +{ + emit copyCommand(); + accept(); +} diff --git a/dialogs/pireditcommanddialog.h b/dialogs/pireditcommanddialog.h index 5719fbb..70b61ce 100644 --- a/dialogs/pireditcommanddialog.h +++ b/dialogs/pireditcommanddialog.h @@ -23,13 +23,15 @@ public: signals: void deleteCommand(); - void moveCommandUp(); - void moveCommandDown(); +// void moveCommandUp(); +// void moveCommandDown(); + void copyCommand(); private slots: - void on_moveUpButton_clicked(); - void on_moveDownButton_clicked(); +// void on_moveUpButton_clicked(); +// void on_moveDownButton_clicked(); void on_deleteButton_clicked(); + void on_copyButton_clicked(); private: Ui::PIREditCommandDialog *ui; diff --git a/dialogs/pireditcommanddialog.ui b/dialogs/pireditcommanddialog.ui index 5a5d543..193ae60 100644 --- a/dialogs/pireditcommanddialog.ui +++ b/dialogs/pireditcommanddialog.ui @@ -35,24 +35,9 @@ - + - Move Up - - - - :/icons/br_up_icon&48.png:/icons/br_up_icon&48.png - - - - - - - Move Down - - - - :/icons/br_down_icon&48.png:/icons/br_down_icon&48.png + Copy @@ -77,9 +62,7 @@ - - - + buttonBox diff --git a/forms/pirmacroform.cpp b/forms/pirmacroform.cpp index 4646320..a771185 100644 --- a/forms/pirmacroform.cpp +++ b/forms/pirmacroform.cpp @@ -74,6 +74,7 @@ PIRMacroForm::PIRMacroForm( smd.addPack(mw->getMultitapPack()); // Connect to edit command dialog signals: +/* connect( &ecd, SIGNAL(deleteCommand()), @@ -82,6 +83,14 @@ PIRMacroForm::PIRMacroForm( connect( &ecd, + SIGNAL(copyCommand()), + this, + SLOT(copyCurrentCommand())); +*/ + +/* + connect( + &ecd, SIGNAL(moveCommandUp()), this, SLOT(moveCurrentCommandUp())); @@ -91,6 +100,7 @@ PIRMacroForm::PIRMacroForm( SIGNAL(moveCommandDown()), this, SLOT(moveCurrentCommandDown())); +*/ } @@ -313,9 +323,13 @@ void PIRMacroForm::on_addButton_clicked() } -void PIRMacroForm::deleteCurrentCommand() +//void PIRMacroForm::deleteCurrentCommand() +void PIRMacroForm::on_deleteButton_clicked() { + if (!currentMacro) return; + int index = ui->macroListWidget->currentRow(); + if (currentMacro->deleteCommand(index)) { currentMacro->populateList(ui->macroListWidget); @@ -332,10 +346,23 @@ void PIRMacroForm::deleteCurrentCommand() } -void PIRMacroForm::moveCurrentCommandUp() +//void PIRMacroForm::copyCurrentCommand() +void PIRMacroForm::on_copyButton_clicked() +{ + if (!currentMacro) return; + + // copy constructor dealing with inheritance issues? +} + + +//void PIRMacroForm::moveCurrentCommandUp() +void PIRMacroForm::on_commandUpButton_clicked() { + if (!currentMacro) return; + int index = ui->macroListWidget->currentRow(); - if (currentMacro->moveUp(index)) + + if ((index > 0) && currentMacro->moveUp(index)) { currentMacro->populateList(ui->macroListWidget); ui->macroListWidget->setCurrentRow(index - 1); @@ -345,11 +372,15 @@ void PIRMacroForm::moveCurrentCommandUp() } -void PIRMacroForm::moveCurrentCommandDown() +//void PIRMacroForm::moveCurrentCommandDown() +void PIRMacroForm::on_commandDownIcon_clicked() { + if (!currentMacro) return; + int index = ui->macroListWidget->currentRow(); - if (currentMacro->moveDown(index)) + if ((index < (ui->macroListWidget->count() - 1) && + currentMacro->moveDown(index))) { currentMacro->populateList(ui->macroListWidget); ui->macroListWidget->setCurrentRow(index + 1); @@ -359,7 +390,21 @@ void PIRMacroForm::moveCurrentCommandDown() } +void PIRMacroForm::on_macroListWidget_currentRowChanged(int currentRow) +{ + if (currentRow < 0) + { + ui->deleteButton->setEnabled(false); + } + else + { + ui->deleteButton->setEnabled(true); + } +} + + //void PIRMacroForm::on_macroListWidget_itemClicked(QListWidgetItem *item) +/* void PIRMacroForm::on_macroListWidget_itemClicked() { ecd.setup( @@ -368,6 +413,7 @@ void PIRMacroForm::on_macroListWidget_itemClicked() ecd.exec(); } +*/ /* @@ -400,4 +446,3 @@ void PIRMacroForm::on_newMacroButton_clicked() mainWindow->storeMacros(); } */ - diff --git a/forms/pirmacroform.h b/forms/pirmacroform.h index d9da559..578152e 100644 --- a/forms/pirmacroform.h +++ b/forms/pirmacroform.h @@ -6,7 +6,7 @@ #include "dialogs/pireditmacrodialog.h" #include "dialogs/pirdeletemacrodialog.h" #include "dialogs/pircreatecommanddialog.h" -#include "dialogs/pireditcommanddialog.h" +//#include "dialogs/pireditcommanddialog.h" class PIRMacro; class QComboBox; @@ -44,8 +44,13 @@ private slots: // void on_newMacroButton_clicked(); void on_runButton_clicked(); void on_addButton_clicked(); + void on_commandUpButton_clicked(); + void on_commandDownIcon_clicked(); + void on_deleteButton_clicked(); + void on_copyButton_clicked(); // void on_macroListWidget_itemClicked(QListWidgetItem *item); - void on_macroListWidget_itemClicked(); +// void on_macroListWidget_itemClicked(); + void on_macroListWidget_currentRowChanged(int currentRow); void displayMacro( QTreeWidgetItem *item); @@ -58,9 +63,10 @@ private slots: void deleteMacro( QTreeWidgetItem *item); - void deleteCurrentCommand(); - void moveCurrentCommandUp(); - void moveCurrentCommandDown(); +// void deleteCurrentCommand(); +// void moveCurrentCommandUp(); +// void moveCurrentCommandDown(); +// void copyCurrentCommand(); private: Ui::PIRMacroForm *ui; @@ -69,7 +75,7 @@ private: PIREditMacroDialog emd; PIRDeleteMacroDialog dmd; PIRCreateCommandDialog ccd; - PIREditCommandDialog ecd; +// PIREditCommandDialog ecd; PIRMacro *currentMacro; PIRMacro *userRequestMacro; diff --git a/forms/pirmacroform.ui b/forms/pirmacroform.ui index db47dc5..25ed9bd 100644 --- a/forms/pirmacroform.ui +++ b/forms/pirmacroform.ui @@ -14,48 +14,116 @@ Macro Processor - + + + + Run + + + + + + + + 0 + 0 + + + + No Macro Selected + + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + 2 + + + + 8 + + + + + + + + + + + + + + + :/icons/br_down_icon&48.png:/icons/br_down_icon&48.png + + + + false - Command + New - - - - - + + - Run + + + + + :/icons/br_up_icon&48.png:/icons/br_up_icon&48.png - + - Macro + Select Macro - - - - - 0 - 0 - + + + + false - No Macro Selected + Delete + + + + + + + false + + + Copy - + + + diff --git a/keysets/adb.cpp b/keysets/adb.cpp index d4a70df..65fb8e1 100644 --- a/keysets/adb.cpp +++ b/keysets/adb.cpp @@ -2,6 +2,7 @@ #include "protocols/mceprotocol.h" #include "protocols/necprotocol.h" #include "protocols/nokia32protocol.h" +#include "protocols/aiwaprotocol.h" ADBSTB1::ADBSTB1( unsigned int index) @@ -233,3 +234,65 @@ void ADBSTB4::populateProtocol( addKey("Enter", Enter_Key, 0xDB, 8); addKey("exit", Exit_Key, 0xE0, 8); } + + +ADBSTB5::ADBSTB5( + unsigned int index) + : PIRKeysetMetaData( + "TV Receiver Keyset 5", + ADB_Make, + index) +{ +} + + +void ADBSTB5::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new AiwaProtocol(guiObject, index); + + setPreData(0x0008, 13); + + addKey("0", Zero_Key, 0x00, 8); + addKey("1", One_Key, 0x01, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("4", Four_Key, 0x04, 8); + addKey("5", Five_Key, 0x05, 8); + addKey("6", Six_Key, 0x06, 8); + addKey("7", Seven_Key, 0x07, 8); + addKey("8", Eight_Key, 0x08, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("Menu", Menu_Key, 0x0A, 8); + addKey("Guide", Guide_Key, 0x0B, 8); + addKey("Power", Power_Key, 0x0C, 8); + addKey("Format 16:9", AspectRatio_Key, 0x0D, 8); + addKey("Info/Display", Info_Key, 0x0D, 8); + addKey("Stop", Stop_Key, 0x0D, 8); + addKey("CH+", ChannelUp_Key, 0x0E, 8); + addKey("CH-", ChannelDown_Key, 0xF, 8); + addKey("Volume +", VolumeUp_Key, 0x10, 8); + addKey("Volume -", VolumeDown_Key, 0x11, 8); + addKey("Arrow_Right", Right_Key, 0x12, 8); + addKey("FFWD", FastForward_Key, 0x13, 8); + addKey("EXIT", Exit_Key, 0x14, 8); + addKey("Arrow_Left", Left_Key, 0x15, 8); + addKey("OK/Select", Select_Key, 0x16, 8); + addKey("Subtitle", Captions_Key, 0x18, 8); + addKey("Mute", Mute_Key, 0x1A, 8); + addKey("Input/Source", Input_Key, 0x1B, 8); + addKey("Arrow_Down", Down_Key, 0x1C, 8); + addKey("Arrow_Up", Up_Key, 0x1D, 8); + addKey("Play", Play_Key, 0x1E, 8); + addKey("Audio", Audio_Key, 0x1F, 8); + addKey("Red", Red_Key, 0x20, 8); + addKey("Green", Green_Key, 0x21, 8); + addKey("Yellow", Yellow_Key, 0x22, 8); + addKey("Blue", Blue_Key, 0x23, 8); +} diff --git a/keysets/adb.h b/keysets/adb.h index f04eed0..af56089 100644 --- a/keysets/adb.h +++ b/keysets/adb.h @@ -48,4 +48,15 @@ public: QObject *guiObject); }; + +class ADBSTB5: public PIRKeysetMetaData +{ +public: + ADBSTB5( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + #endif // ADB_H diff --git a/keysets/cisco.cpp b/keysets/cisco.cpp index 3d7e817..0d91519 100644 --- a/keysets/cisco.cpp +++ b/keysets/cisco.cpp @@ -45,7 +45,7 @@ void CiscoSTB1::populateProtocol( addKey("play", Play_Key, 0x91, 8); addKey("1", One_Key, 0x92, 8); addKey("2", Two_Key, 0x93, 8); - addKey("hd", HDMIInput_Key, 0x95, 8); // Might be wrong + addKey("hd", HDDInput_Key, 0x95, 8); addKey("blue", Blue_Key, 0x96, 8); addKey("stop", Stop_Key, 0x97, 8); addKey("radio", TunerInput_Key, 0x98, 8); @@ -124,7 +124,7 @@ void CiscoSTB2::populateProtocol( addPanOldKey("VolumeUp", VolumeUp_Key, 0x1B, 0x20); addPanOldKey("VolumeDown", VolumeDown_Key, 0x1B, 0x21); addPanOldKey("Mute", Mute_Key, 0x1B, 0x22); - addPanOldKey("List", Unmapped_Key, 0x1B, 0x26); + addPanOldKey("List", HDDInput_Key, 0x1B, 0x26); // "myDVR", might be wrong addPanOldKey("Replay", Replay_Key, 0x1B, 0x27); // "SkipBack" addPanOldKey("FastForward", FastForward_Key, 0x1B, 0x28); addPanOldKey("Rewind", Rewind_Key, 0x1B, 0x29); diff --git a/keysets/crownmustang.cpp b/keysets/crownmustang.cpp new file mode 100644 index 0000000..959f6be --- /dev/null +++ b/keysets/crownmustang.cpp @@ -0,0 +1,57 @@ +#include "crownmustang.h" +#include "protocols/necprotocol.h" + +CrownMustangTV1::CrownMustangTV1( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 1", + CrownMustang_Make, + index) +{ +} + + +void CrownMustangTV1::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already defined. + return; + } + + threadableProtocol = new NECProtocol(guiObject, index, true, true); + + setPreData(0x1004, 16); + + addKey("Sleep", Sleep_Key, 0x1E, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x19, 8); + addKey("Menu", Menu_Key, 0x18, 8); + addKey("Info", Info_Key, 0x17, 8); + addKey("Mode", Mode_Key, 0x16, 8); + addKey("Brightness +", BrightnessUp_Key, 0x15, 8); + addKey("Brightness -", BrightnessDown_Key, 0x13, 8); + addKey("TV/Video", Input_Key, 0x12, 8); + addKey("-/--", DoubleDigit_Key, 0x11, 8); + addKey("-/--", Dash_Key, 0x11, 8); + addKey("Power", Power_Key, 0x0F, 8); + addKey("Mute", Mute_Key, 0x0E, 8); + addKey("Volume -", VolumeDown_Key, 0x0D, 8); + addKey("Arrow_Left", Left_Key, 0x0D, 8); + addKey("Volume +", VolumeUp_Key, 0x0C, 8); + addKey("Right_Key", Right_Key, 0x0C, 8); + addKey("CH-", ChannelDown_Key, 0x0B, 8); + addKey("Arrow_Down", Down_Key, 0x0B, 8); + addKey("CH+", ChannelUp_Key, 0x0A, 8); + addKey("Arrow_Up", Up_Key, 0x0A, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("8", Eight_Key, 0x08, 8); + addKey("7", Seven_Key, 0x07, 8); + addKey("6", Six_Key, 0x06, 8); + addKey("5", Five_Key, 0x05, 8); + addKey("4", Four_Key, 0x04, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("1", One_Key, 0x01, 8); + addKey("0", Zero_Key, 0x00, 8); +} diff --git a/keysets/crownmustang.h b/keysets/crownmustang.h new file mode 100644 index 0000000..13cd06d --- /dev/null +++ b/keysets/crownmustang.h @@ -0,0 +1,18 @@ +#ifndef CROWNMUSTANG_H +#define CROWNMUSTANG_H + +#include "pirkeysetmetadata.h" + +class QObject; + +class CrownMustangTV1: public PIRKeysetMetaData +{ +public: + CrownMustangTV1( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +#endif // CROWNMUSTANG_H diff --git a/keysets/haier.cpp b/keysets/haier.cpp index 250342f..0ceec47 100644 --- a/keysets/haier.cpp +++ b/keysets/haier.cpp @@ -35,20 +35,28 @@ void HaierTV1::populateProtocol( addKey("8", Eight_Key, 0x07, 8); addKey("9", Nine_Key, 0x08, 8); addKey("0", Zero_Key, 0x09, 8); - addKey("last (prev ch)", PrevChannel_Key, 0x0E, 8); addKey("menu", Menu_Key, 0x0D, 8); + addKey("last (prev ch)", PrevChannel_Key, 0x0E, 8); addKey("tv/av", Input_Key, 0x0F, 8); addKey("vol up", VolumeUp_Key, 0x10, 8); // "right arrow" addKey("vol up", Right_Key, 0x10, 8); // "right arrow" + addKey("osd control?", Unmapped_Key, 0x11, 8); addKey("power", Power_Key, 0x12, 8); addKey("channel up", ChannelUp_Key, 0x13, 8); // "up arrow" addKey("channel up", Up_Key, 0x13, 8); // "up arrow" addKey("vol down", VolumeDown_Key, 0x14, 8); // "left arrow" addKey("vol down", Left_Key, 0x14, 8); // "left arrow" + addKey("unknown-blanks screen", Unmapped_Key, 0x15, 8); addKey("mute", Mute_Key, 0x16, 8); addKey("channel down", ChannelDown_Key, 0x17, 8); // "down arrow" addKey("channel down", Down_Key, 0x17, 8); // "down arrow" addKey("display", Info_Key, 0x18, 8); - addKey("rating", Unmapped_Key, 0x1B, 8); + addKey("if control", Unmapped_Key, 0x19, 8); + addKey("crt geometry", AspectRatio_Key, 0x1A, 8); + addKey("rating", Unmapped_Key, 0x1B, 8); // "v-chip" + addKey("rgb control", Unmapped_Key, 0x1C, 8); + addKey("picture control", Unmapped_Key, 0x1D, 8); + addKey("factory reset", Unmapped_Key, 0x1E, 8); + addKey("test pattern", Unmapped_Key, 0x1F, 8); } diff --git a/keysets/hantarex.cpp b/keysets/hantarex.cpp new file mode 100644 index 0000000..874a252 --- /dev/null +++ b/keysets/hantarex.cpp @@ -0,0 +1,126 @@ +#include "hantarex.h" +#include "protocols/necprotocol.h" + +HantarexTV1::HantarexTV1( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 1", + Hantarex_Make, + index) +{ +} + + +void HantarexTV1::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new NECProtocol(guiObject, index, false, true); + + setPreData(0x96, 8); + + addKey("Blue", Blue_Key, 0x00, 8); + addKey("Yellow", Yellow_Key, 0x01, 8); + addKey("Green", Green_Key, 0x02, 8); + addKey("Red", Red_Key, 0x03, 8); + addKey("Rewind", Rewind_Key, 0x05, 8); +// addKey("Skip -", Previous_Key, 0x05, 8); + addKey("Play", Play_Key, 0x07, 8); + addKey("Power", Power_Key, 0x08, 8); + addKey("Mute", Mute_Key, 0x09, 8); + addKey("Volume +", VolumeUp_Key, 0x0A, 8); + addKey("Arrow_Right", Right_Key, 0x0A, 8); + addKey("Volume -", VolumeDown_Key, 0x0B, 8); + addKey("Arrow_Left", Left_Key, 0x0B, 8); + addKey("9", Nine_Key, 0x0C, 8); + addKey("0", Zero_Key, 0x0D, 8); + addKey("Menu", Menu_Key, 0x0F, 8); + addKey("EXIT", Exit_Key, 0x10, 8); +// addKey("Pause", Pause_Key, 0x13, 8); + addKey("FFWD", FastForward_Key, 0x13, 8); + addKey("CH+", ChannelUp_Key, 0x14, 8); + addKey("Arrow_Up", Up_Key, 0x14, 8); + addKey("CH-", ChannelDown_Key, 0x15, 8); + addKey("Arrow_Down", Down_Key, 0x15, 8); + addKey("1", One_Key, 0x18, 8); + addKey("2", Two_Key, 0x19, 8); + addKey("3", Three_Key, 0x1A, 8); + addKey("4", Four_Key, 0x1B, 8); + addKey("5", Five_Key, 0x1C, 8); + addKey("6", Six_Key, 0x1D, 8); + addKey("7", Seven_Key, 0x1E, 8); + addKey("8", Eight_Key, 0x1F, 8); + addKey("Input/Source", Input_Key, 0x23, 8); + addKey("OK/Select", Select_Key, 0x25, 8); + addKey("Record", Record_Key, 0x26, 8); + addKey("Info/Display", Info_Key, 0x30, 8); +} + + +HantarexTV2::HantarexTV2( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 2", + Hantarex_Make, + index) +{ +} + + +void HantarexTV2::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated + return; + } + + threadableProtocol = new NECProtocol(guiObject, index, true, true); + + setPreData(0x4020, 16); + + addKey("Power", Power_Key, 0x00, 8); + addKey("1", One_Key, 0x01, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("Input/Source", Input_Key, 0x04, 8); + addKey("4", Four_Key, 0x05, 8); + addKey("5", Five_Key, 0x06, 8); + addKey("6", Six_Key, 0x07, 8); + addKey("Sleep", Sleep_Key, 0x08, 8); + addKey("7", Seven_Key, 0x09, 8); + addKey("8", Eight_Key, 0x0A, 8); + addKey("9", Nine_Key, 0x0B, 8); + addKey("DASH", Dash_Key, 0x0D, 8); + addKey("Ok/Select", Select_Key, 0x0F, 8); + addKey("Menu", Menu_Key, 0x0F, 8); // ? + addKey("CH+", ChannelUp_Key, 0x10, 8); + addKey("Arrow_Up", Up_Key, 0x10, 8); + addKey("Page +", PageUp_Key, 0x10, 8); + addKey("Volume +", VolumeUp_Key, 0x11, 8); + addKey("Arrow_Right", Right_Key, 0x11, 8); + addKey("Volume -", VolumeDown_Key, 0x12, 8); + addKey("Arrow_Left", Left_Key, 0x12, 8); + addKey("CH-", ChannelDown_Key, 0x13, 8); + addKey("Arrow_Down", Down_Key, 0x13, 8); + addKey("Page -", PageDown_Key, 0x13, 8); + addKey("Yellow", Yellow_Key, 0x14, 8); + addKey("CC", Captions_Key, 0x14, 8); + addKey("Blue", Blue_Key, 0x15, 8); + addKey("Mute", Mute_Key, 0x17, 8); + addKey("0", Zero_Key, 0x18, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x1B, 8); + addKey("EXIT", Exit_Key, 0x1B, 8); + addKey("Info/Display", Info_Key, 0x1D, 8); + addKey("Red", Red_Key, 0x1F, 8); + addKey("Format 16:9", AspectRatio_Key, 0x40, 8); + addKey("Guide", Guide_Key, 0x42, 8); +// addKey("Last/Prev Ch", PrevChannel_Key, 0x42, 8); + addKey("Green", Green_Key, 0x44, 8); +} diff --git a/keysets/hantarex.h b/keysets/hantarex.h new file mode 100644 index 0000000..2feeac7 --- /dev/null +++ b/keysets/hantarex.h @@ -0,0 +1,28 @@ +#ifndef HANTAREX_H +#define HANTAREX_H + +#include "pirkeysetmetadata.h" + +class QObject; + +class HantarexTV1: public PIRKeysetMetaData +{ +public: + HantarexTV1( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +class HantarexTV2: public PIRKeysetMetaData +{ +public: + HantarexTV2( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +#endif // HANTAREX_H diff --git a/keysets/keymat.cpp b/keysets/keymat.cpp new file mode 100644 index 0000000..29eb4bd --- /dev/null +++ b/keysets/keymat.cpp @@ -0,0 +1,114 @@ +#include "keymat.h" +#include "protocols/necprotocol.h" + +KeymatTV1::KeymatTV1( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 1", + Keymat_Make, + index) +{ +} + + +void KeymatTV1::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new NECProtocol(guiObject, index, false, true); + + setPreData(0x96, 8); + + addKey("Info/Display", Info_Key, 0x35, 8); + addKey("Rewind", Rewind_Key, 0x32, 8); + addKey("FFWD", FastForward_Key, 0x31, 8); + addKey("Play", Play_Key, 0x1E, 8); + addKey("Input/Source", Input_Key, 0x16, 8); + addKey("Blue", Blue_Key, 0x16, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x15, 8); + addKey("Yellow", Yellow_Key, 0x15, 8); + addKey("Record", Record_Key, 0x14, 8); + addKey("Green", Green_Key, 0x14, 8); + addKey("Red", Red_Key, 0x13, 8); + addKey("CH-", ChannelDown_Key, 0x11, 8); + addKey("Arrow_Down", Down_Key, 0x11, 8); + addKey("Volume +", VolumeUp_Key, 0x0F, 8); + addKey("Arrow_Right", Right_Key, 0x0F, 8); + addKey("Menu", Menu_Key, 0x0E, 8); + addKey("Volume -", VolumeDown_Key, 0x0D, 8); + addKey("Arrow_Left", Left_Key, 0x0D, 8); + addKey("Power", Power_Key, 0x0C, 8); + addKey("CH+", ChannelUp_Key, 0x0B, 8); + addKey("Arrow_Up", Up_Key, 0x0B, 8); + addKey("Mute", Mute_Key, 0x0A, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("8", Eight_Key, 0x08, 8); + addKey("7", Seven_Key, 0x07, 8); + addKey("6", Six_Key, 0x06, 8); + addKey("5", Five_Key, 0x05, 8); + addKey("4", Four_Key, 0x04, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("1", One_Key, 0x01, 8); + addKey("0", Zero_Key, 0x00, 8); +} + + +KeymatTV2::KeymatTV2( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 2", + Keymat_Make, + index) +{ +} + + +void KeymatTV2::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new NECProtocol(guiObject, index, false, true); + + setPreData(0x08, 8); + + addKey("CC", Captions_Key, 0x55, 8); + addKey("Format 16:9", AspectRatio_Key, 0x4C, 8); + addKey("Sleep", Sleep_Key, 0x45, 8); + addKey("CH-", ChannelDown_Key, 0x1F, 8); + addKey("Arrow_Down", Down_Key, 0x1F, 8); + addKey("Volume -", VolumeDown_Key, 0x1E, 8); + addKey("Arrow_Left", Left_Key, 0x1E, 8); + addKey("CH+", ChannelUp_Key, 0x1B, 8); + addKey("Arrow_Up", Up_Key, 0x1B, 8); + addKey("Volume +", VolumeUp_Key, 0x1A, 8); + addKey("Arrow_Right", Right_Key, 0x1A, 8); + addKey("Info/Display", Info_Key, 0x16, 8); + addKey("Input/Source", Input_Key, 0x14, 8); + addKey("Power", Power_Key, 0x12, 8); + addKey("Mute", Mute_Key, 0x10, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x0E, 8); + addKey("Ok/Select", Select_Key, 0x0C, 8); + addKey("Menu", Menu_Key, 0x0C, 8); + addKey("100+", PlusOneHundred_Key, 0x0B, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("8", Eight_Key, 0x08, 8); + addKey("7", Seven_Key, 0x07, 8); + addKey("6", Six_Key, 0x06, 8); + addKey("5", Five_Key, 0x05, 8); + addKey("4", Four_Key, 0x04, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("1", One_Key, 0x01, 8); + addKey("0", Zero_Key, 0x00, 8); +} diff --git a/keysets/keymat.h b/keysets/keymat.h new file mode 100644 index 0000000..372129f --- /dev/null +++ b/keysets/keymat.h @@ -0,0 +1,28 @@ +#ifndef KEYMAT_H +#define KEYMAT_H + +#include "pirkeysetmetadata.h" + +class QObject; + +class KeymatTV1: public PIRKeysetMetaData +{ +public: + KeymatTV1( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +class KeymatTV2: public PIRKeysetMetaData +{ +public: + KeymatTV2( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +#endif // KEYMAT_H diff --git a/keysets/konka.cpp b/keysets/konka.cpp new file mode 100644 index 0000000..3ad1089 --- /dev/null +++ b/keysets/konka.cpp @@ -0,0 +1,113 @@ +#include "konka.h" +#include "protocols/aiwaprotocol.h" + +KonkaTV1::KonkaTV1( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 1", + Konka_Make, + index) +{ +} + + +void KonkaTV1::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new AiwaProtocol(guiObject, index); + + setPreData(0x0119, 13); + + addKey("Reset", Reset_Key, 0x00, 8); + addKey("Power", Power_Key, 0x01, 8); + addKey("Ch+", ChannelUp_Key, 0x02, 8); + addKey("Ch+", Up_Key, 0x02, 8); + addKey("Ch-", ChannelDown_Key, 0x03, 8); + addKey("Ch-", Down_Key, 0x03, 8); + addKey("Vol+", VolumeUp_Key, 0x04, 8); + addKey("Vol+", Right_Key, 0x04, 8); + addKey("Vol-", VolumeDown_Key, 0x05, 8); + addKey("Vol-", Left_Key, 0x05, 8); + addKey("MTS", Unmapped_Key, 0x06, 8); // mts obsolete, do we need it? + addKey("V-Chip", Unmapped_Key, 0x07, 8); + addKey("Mute", Mute_Key, 0x0A, 8); + addKey("Display", Info_Key, 0x0B, 8); + addKey("ChRecall", PrevChannel_Key, 0x0C, 8); + addKey("Sleep", Sleep_Key, 0x0D, 8); + addKey("TV/AV", Input_Key, 0x0E, 8); + + addKey("0", Zero_Key, 0x10, 8); + addKey("1", One_Key, 0x11, 8); + addKey("2", Two_Key, 0x12, 8); + addKey("3", Three_Key, 0x13, 8); + addKey("4", Four_Key, 0x14, 8); + addKey("5", Five_Key, 0x15, 8); + addKey("6", Six_Key, 0x16, 8); + addKey("7", Seven_Key, 0x17, 8); + addKey("8", Eight_Key, 0x18, 8); + addKey("9", Nine_Key, 0x19, 8); + addKey("Menu", Menu_Key, 0x1D, 8); + addKey("Caption", Captions_Key, 0x1E, 8); +} + + +KonkaTV2::KonkaTV2( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 2", + Konka_Make, + index) +{ +} + + +void KonkaTV2::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new AiwaProtocol(guiObject, index); + + setPreData(0x0119, 13); // Same as TV1, but keys completely different! + + addKey("0", Zero_Key, 0x00, 8); + addKey("1", One_Key, 0x01, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("4", Four_Key, 0x04, 8); + addKey("5", Five_Key, 0x05, 8); + addKey("6", Six_Key, 0x06, 8); + addKey("7", Seven_Key, 0x07, 8); + addKey("8", Eight_Key, 0x08, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("-", Dash_Key, 0x0A, 8); + addKey("novideo", Unmapped_Key, 0x0B, 8); + addKey("tv/av", Input_Key, 0x0D, 8); + addKey("back", PrevChannel_Key, 0x0E, 8); + + addKey("menu", Menu_Key, 0x10, 8); + addKey("analog", Unmapped_Key, 0x13, 8); + addKey("game", Unmapped_Key, 0x14, 8); + addKey("mute", Mute_Key, 0x15, 8); + addKey("vstatus", Unmapped_Key, 0x16, 8); + addKey("ch-", ChannelDown_Key, 0x1A, 8); + addKey("ch-", Down_Key, 0x1A, 8); + addKey("ch+", ChannelUp_Key, 0x1B, 8); + addKey("ch+", Up_Key, 0x1B, 8); + addKey("power", Power_Key, 0x1C, 8); + addKey("timing", Unmapped_Key, 0x1D, 8); + addKey("vol-", VolumeDown_Key, 0x1E, 8); + addKey("vol-", Left_Key, 0x1E, 8); + addKey("vol+", VolumeUp_Key, 0x1F, 8); + addKey("vol+", Right_Key, 0x1F, 8); +} diff --git a/keysets/konka.h b/keysets/konka.h new file mode 100644 index 0000000..c2905f8 --- /dev/null +++ b/keysets/konka.h @@ -0,0 +1,28 @@ +#ifndef KONKA_H +#define KONKA_H + +#include "pirkeysetmetadata.h" + +class QObject; + +class KonkaTV1: public PIRKeysetMetaData +{ +public: + KonkaTV1( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +class KonkaTV2: public PIRKeysetMetaData +{ +public: + KonkaTV2( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +#endif // KONKA_H diff --git a/keysets/lg.cpp b/keysets/lg.cpp index 0fd4e6e..31a93bc 100644 --- a/keysets/lg.cpp +++ b/keysets/lg.cpp @@ -28,6 +28,7 @@ void LGTV1::populateProtocol( } threadableProtocol = new NECProtocol(guiObject, index, false, true); + threadableProtocol->setMinimumRepetitions(1); setPreData(0x04, 8); @@ -561,6 +562,7 @@ void LGVCR1::populateProtocol( } threadableProtocol = new NECProtocol(guiObject, index, false, true); + threadableProtocol->setMinimumRepetitions(1); setPreData(0x6E, 8); @@ -686,6 +688,7 @@ void LGAC1::populateProtocol( } threadableProtocol = new NECProtocol(guiObject, index, true, true); + threadableProtocol->setMinimumRepetitions(1); setPreData(0x6681, 16); diff --git a/keysets/sony.cpp b/keysets/sony.cpp index 1940c01..b3471f4 100644 --- a/keysets/sony.cpp +++ b/keysets/sony.cpp @@ -1,5 +1,6 @@ #include "sony.h" #include "protocols/sircprotocol.h" +#include "protocols/aiwaprotocol.h" SonyTV1::SonyTV1( @@ -235,6 +236,64 @@ void SonyTV1c::populateProtocol( } +SonyTV2::SonyTV2( + unsigned int index) + : PIRKeysetMetaData( + "TV Keyset 2", + Sony_Make, + index) +{ +} + + +void SonyTV2::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new AiwaProtocol(guiObject, index); + + setPreData(0x0119, 13); + + addKey("0", Zero_Key, 0x00, 8); + addKey("1", One_Key, 0x01, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("3", Three_Key, 0x03, 8); + addKey("4", Four_Key, 0x04, 8); + addKey("5", Five_Key, 0x05, 8); + addKey("6", Six_Key, 0x06, 8); + addKey("7", Seven_Key, 0x07, 8); + addKey("8", Eight_Key, 0x08, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("sleep", Sleep_Key, 0x0A, 8); + addKey("tv/av", Input_Key, 0x0E, 8); + addKey("back", PrevChannel_Key, 0x0F, 8); + + addKey("display", Info_Key, 0x10, 8); + addKey("cc", Captions_Key, 0x11, 8); + addKey("input 1", Unmapped_Key, 0x12, 8); + addKey("pip on/off", PIP_Key, 0x13, 8); + addKey("pip move", PIPMove_Key, 0x14, 8); + addKey("mute", Mute_Key, 0x15, 8); + addKey("pip swap", PIPSwap_Key, 0x16, 8); + addKey("menu", Menu_Key, 0x17, 8); + addKey("ch-", ChannelDown_Key, 0x1A, 8); + addKey("ch-", Down_Key, 0x1A, 8); + addKey("ch+", ChannelUp_Key, 0x1B, 8); + addKey("ch+", Up_Key, 0x1B, 8); + addKey("power", Power_Key, 0x1C, 8); + addKey("freeze", PIPPause_Key, 0x1D, 8); + addKey("vol-", VolumeDown_Key, 0x1E, 8); + addKey("vol-", Left_Key, 0x1E, 8); + addKey("vol+", VolumeUp_Key, 0x1F, 8); + addKey("vol+", Right_Key, 0x1F, 8); +} + + // These controls don't quite match other SIRC data. (some do, some don't) // This all taken from LIRC "AMPIR" config file. SonyAmp1::SonyAmp1( diff --git a/keysets/sony.h b/keysets/sony.h index c971392..a84172e 100644 --- a/keysets/sony.h +++ b/keysets/sony.h @@ -49,6 +49,17 @@ public: }; +class SonyTV2: public PIRKeysetMetaData +{ +public: + SonyTV2( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + + class SonyAmp1: public PIRKeysetMetaData { public: diff --git a/keysets/triax.cpp b/keysets/triax.cpp index c139384..f9f5f5a 100644 --- a/keysets/triax.cpp +++ b/keysets/triax.cpp @@ -140,16 +140,17 @@ void TriaxSTB2a::populateProtocol( } -/* -TriaxSTB2b::TriaxSTB2b( +TriaxSTB3::TriaxSTB3( unsigned int index) - : TriaxSTB2(index) + : PIRKeysetMetaData( + "Satellite Receiver 3", + Triax_Make, + index) { - setKeysetName("Satellite Receiver 2b (experimental)"); } -void TriaxSTB2b::populateProtocol( +void TriaxSTB3::populateProtocol( QObject *guiObject) { if (threadableProtocol) @@ -158,8 +159,141 @@ void TriaxSTB2b::populateProtocol( return; } - TriaxSTB2::populateProtocol(guiObject); + threadableProtocol = new NECProtocol(guiObject, index, true, true); + + setPreData(0x7F00, 16); + + addKey("Power", Power_Key, 0x00, 8); + addKey("3", Three_Key, 0x01, 8); + addKey("2", Two_Key, 0x02, 8); + addKey("1", One_Key, 0x03, 8); +// addKey("Last/Prev Ch", PrevChannel_Key, 0x04, 8); + addKey("EXIT", Exit_Key, 0x04, 8); + addKey("6", Six_Key, 0x05, 8); + addKey("5", Five_Key, 0x06, 8); + addKey("4", Four_Key, 0x07, 8); + addKey("OK/Select", Select_Key, 0x08, 8); + addKey("9", Nine_Key, 0x09, 8); + addKey("8", Eight_Key, 0x0A, 8); + addKey("7", Seven_Key, 0x0B, 8); + addKey("Arrow_Right", Right_Key, 0x0D, 8); + addKey("0", Zero_Key, 0x0E, 8); + addKey("Red", Red_Key, 0x0F, 8); + addKey("Play", Play_Key, 0x0F, 8); + addKey("Info", Info_Key, 0x10, 8); + addKey("Stop", Stop_Key, 0x10, 8); + addKey("Arrow_Left", Left_Key, 0x11, 8); + addKey("Guide", Guide_Key, 0x12, 8); + addKey("TV/Sat", Input_Key, 0x13, 8); + addKey("Blue", Blue_Key, 0x13, 8); + addKey("Mute", Mute_Key, 0x14, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x15, 8); + addKey("PIP On/Off", PIP_Key, 0x16, 8); + addKey("Yellow", Yellow_Key, 0x16, 8); + addKey("Menu", Menu_Key, 0x19, 8); + addKey("CH+", ChannelUp_Key, 0x1A, 8); + addKey("Arrow_Up", Up_Key, 0x1A, 8); + addKey("CH-", ChannelDown_Key, 0x1B, 8); + addKey("Arrow_Down", Down_Key, 0x1B, 8); + addKey("Subtitle", Captions_Key, 0x42, 8); + addKey("Volume -", VolumeDown_Key, 0x44, 8); + addKey("Volume +", VolumeUp_Key, 0x48, 8); + addKey("Green", Green_Key, 0x49, 8); +} + + +TriaxSTB3a::TriaxSTB3a( + unsigned int index) + : TriaxSTB3(index) +{ + setKeysetName("Satellite Receiver 3a"); +} + + +void TriaxSTB3a::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + TriaxSTB3::populateProtocol(guiObject); + +// addKey("Stop", Stop_Key, 0x08, 8); + addKey("FFWD", FastForward_Key, 0x0D, 8); + addKey("Blue", Blue_Key, 0x10, 8); +// addKey("Rewind", Rewind_Key, 0x11, 8); + addKey("Replay", Replay_Key, 0x13, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x16, 8); + addKey("Pause", Pause_Key, 0x1A, 8); + addKey("Record", Record_Key, 0x43, 8); + addKey("Rewind", Rewind_Key, 0x45, 8); +} + + +TriaxSTB4::TriaxSTB4( + unsigned int index) + : PIRKeysetMetaData( + "Satellite Receiver 4", + Triax_Make, + index) +{ +} + + +void TriaxSTB4::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new NECProtocol(guiObject, index, true, true); + + setPreData(0x7F00, 16); - setPreData(0xFE01, 16); + addKey("Mute", Mute_Key, 0x00, 8); + addKey("Rewind", Rewind_Key, 0x01, 8); + addKey("Red", Red_Key, 0x01, 8); + addKey("CH+", ChannelUp_Key, 0x02, 8); + addKey("Arrow_Up", Up_Key, 0x02, 8); +// addKey("Last/Prev Ch", PrevChannel_Key, 0x03, 8); + addKey("EXIT", Exit_Key, 0x03, 8); + addKey("Input/Source", Input_Key, 0x04, 8); + addKey("Green", Green_Key, 0x04, 8); + addKey("Volume +", VolumeUp_Key, 0x05, 8); + addKey("Arrow_Right", Right_Key, 0x05, 8); + addKey("Skip +", Next_Key, 0x05, 8); + addKey("Ok/Select", Select_Key, 0x06, 8); + addKey("Volume -", VolumeDown_Key, 0x07, 8); + addKey("Arrow_Left", Left_Key, 0x07, 8); + addKey("Skip -", Previous_Key, 0x07, 8); + addKey("Last/Prev Ch", PrevChannel_Key, 0x08, 8); + addKey("Pause", Pause_Key, 0x09, 8); + addKey("Blue", Blue_Key, 0x09, 8); + addKey("CH-", ChannelDown_Key, 0x0A, 8); + addKey("Arrow_Down", Down_Key, 0x0A, 8); + addKey("Yellow", Yellow_Key, 0x0D, 8); + addKey("0", Zero_Key, 0x0E, 8); + addKey("9", Nine_Key, 0x0F, 8); + addKey("8", Eight_Key, 0x10, 8); + addKey("7", Seven_Key, 0x11, 8); + addKey("6", Six_Key, 0x12, 8); + addKey("5", Five_Key, 0x13, 8); + addKey("4", Four_Key, 0x14, 8); + addKey("3", Three_Key, 0x15, 8); + addKey("2", Two_Key, 0x16, 8); + addKey("1", One_Key, 0x17, 8); + addKey("Power", Power_Key, 0x18, 8); + addKey("Play", Play_Key, 0x1A, 8); + addKey("Info/Display", Info_Key, 0x1B, 8); + addKey("Stop", Stop_Key, 0x1B, 8); + addKey("Format 16:9", AspectRatio_Key, 0x1C, 8); + addKey("FAV", Favorites_Key, 0x1C, 8); + addKey("Menu", Menu_Key, 0x1D, 8); + addKey("Guide", Guide_Key, 0x1E, 8); } -*/ diff --git a/keysets/triax.h b/keysets/triax.h index a47383a..34b1ef8 100644 --- a/keysets/triax.h +++ b/keysets/triax.h @@ -35,16 +35,34 @@ public: QObject *guiObject); }; -/* -class TriaxSTB2b: public TriaxSTB2 +class TriaxSTB3: public PIRKeysetMetaData { public: - TriaxSTB2b( + TriaxSTB3( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +class TriaxSTB3a: public TriaxSTB3 +{ +public: + TriaxSTB3a( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +class TriaxSTB4: public PIRKeysetMetaData +{ +public: + TriaxSTB4( unsigned int index); virtual void populateProtocol( QObject *guiObject); }; -*/ #endif // TRIAX_H diff --git a/keysets/wiwa.cpp b/keysets/wiwa.cpp new file mode 100644 index 0000000..834da57 --- /dev/null +++ b/keysets/wiwa.cpp @@ -0,0 +1,69 @@ +#include "wiwa.h" +#include "protocols/paceprotocol.h" + +WiwaSTB1::WiwaSTB1( + unsigned int index) + : PIRKeysetMetaData( + "TV Receiver Keyset 1", + Wiwa_Make, + index) +{ +} + + +void WiwaSTB1::populateProtocol( + QObject *guiObject) +{ + if (threadableProtocol) + { + // Keyset already populated. + return; + } + + threadableProtocol = new PaceProtocol(guiObject, index); + + setPreData(0x0, 3); + + addKey("0", Zero_Key, 0x00, 6); + addKey("1", One_Key, 0x01, 6); + addKey("2", Two_Key, 0x02, 6); + addKey("3", Three_Key, 0x03, 6); + addKey("Skip +", Next_Key, 0x03, 6); // might be bad + addKey("4", Four_Key, 0x04, 6); + addKey("Sleep", Sleep_Key, 0x04, 6); // might be bad + addKey("5", Five_Key, 0x05, 6); + addKey("6", Six_Key, 0x06, 6); + addKey("Rewind", Rewind_Key, 0x06, 6); // might be bad + addKey("7", Seven_Key, 0x07, 6); + addKey("8", Eight_Key, 0x08, 6); + addKey("9", Nine_Key, 0x09, 6); + addKey("100+", PlusOneHundred_Key, 0x0A, 6); + addKey("Format 16:9", AspectRatio_Key, 0x0B, 6); + addKey("FAV", Favorites_Key, 0x0B, 6); + addKey("Pause", Pause_Key, 0x0B, 6); + addKey("Play", Play_Key, 0x0F, 6); + addKey("FFWD", FastForward_Key, 0x0F, 6); + addKey("Yellow", Yellow_Key, 0x0F, 6); + addKey("Audio", Audio_Key, 0x0F, 6); + addKey("Power", Power_Key, 0x10, 6); + addKey("CH+", ChannelUp_Key, 0x11, 6); + addKey("Arrow_Right", Right_Key, 0x11, 6); + addKey("OK/Select", Select_Key, 0x13, 6); + addKey("Record", Record_Key, 0x13, 6); + addKey("Arrow_Down", Down_Key, 0x14, 6); + addKey("EXIT", Exit_Key, 0x15, 6); + addKey("Menu", Menu_Key, 0x15, 6); + addKey("CH-", ChannelDown_Key, 0x16, 6); + addKey("Arrow_Left", Left_Key, 0x16, 6); + addKey("Green", Green_Key, 0x17, 6); + addKey("Volume +", VolumeUp_Key, 0x18, 6); + addKey("Input/Source", Input_Key, 0x19, 6); + addKey("Arrow_Up", Up_Key, 0x1A, 6); + addKey("Guide", Guide_Key, 0x1A, 6); + addKey("Last/Prev Ch", PrevChannel_Key, 0x1A, 6); + addKey("Volume -", VolumeDown_Key, 0x1B, 6); + addKey("Mute", Mute_Key, 0x1E, 6); + addKey("Info/Display", Info_Key, 0x1F, 6); + addKey("Stop", Stop_Key, 0x1F, 6); + addKey("Slow", Slow_Key, 0x1F, 6); +} diff --git a/keysets/wiwa.h b/keysets/wiwa.h new file mode 100644 index 0000000..82da580 --- /dev/null +++ b/keysets/wiwa.h @@ -0,0 +1,18 @@ +#ifndef WIWA_H +#define WIWA_H + +#include "pirkeysetmetadata.h" + +class QObject; + +class WiwaSTB1: public PIRKeysetMetaData +{ +public: + WiwaSTB1( + unsigned int index); + + virtual void populateProtocol( + QObject *guiObject); +}; + +#endif // WIWA_H diff --git a/mainwindow.cpp b/mainwindow.cpp index c0b190c..f57cde7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -140,8 +140,6 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { - delete myKeysets; - if (aboutForm) delete aboutForm; if (documentationForm) delete documentationForm; if (preferencesForm) delete preferencesForm; @@ -151,7 +149,7 @@ MainWindow::~MainWindow() if (myPanels) delete myPanels; if (myMacros) delete myMacros; -// if (myKeysets) delete myKeysets; + if (myKeysets) delete myKeysets; delete ui; } diff --git a/pierogi.pro b/pierogi.pro index fe1b5dc..2552dc0 100644 --- a/pierogi.pro +++ b/pierogi.pro @@ -228,7 +228,12 @@ SOURCES += main.cpp mainwindow.cpp \ dialogs/pirdeletemacrodialog.cpp \ forms/piruserform.cpp \ macros/pirmacromanager.cpp \ - dialogs/pireditcommanddialog.cpp + dialogs/pireditcommanddialog.cpp \ + keysets/crownmustang.cpp \ + keysets/hantarex.cpp \ + keysets/keymat.cpp \ + keysets/konka.cpp \ + keysets/wiwa.cpp HEADERS += mainwindow.h \ pirkeynames.h \ pirmakenames.h \ @@ -431,7 +436,12 @@ HEADERS += mainwindow.h \ dialogs/pirdeletemacrodialog.h \ forms/piruserform.h \ macros/pirmacromanager.h \ - dialogs/pireditcommanddialog.h + dialogs/pireditcommanddialog.h \ + keysets/crownmustang.h \ + keysets/hantarex.h \ + keysets/keymat.h \ + keysets/konka.h \ + keysets/wiwa.h FORMS += mainwindow.ui \ pirdocumentationform.ui \ piraboutform.ui \ diff --git a/pierogi.pro.user b/pierogi.pro.user index 767e2d6..9e84dcc 100644 --- a/pierogi.pro.user +++ b/pierogi.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget @@ -79,7 +79,7 @@ dpkg-buildpackage -sa -S -uc -us /Users/john/QtSDK/Maemo/4.6.2/bin/mad false - /Users/john/Develop/n900/pierogi-1.1.11 + /Users/john/Develop/n900/pierogi-1.1.12 Custom Process Step ProjectExplorer.ProcessStep @@ -213,6 +213,7 @@ /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_6_0_armel.deb /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_0_1_armel.deb /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_6_2_armel.deb + /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_1_1_12_armel.deb /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_1_1_8_armel.deb /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_0_1_armel.deb /Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_1_6_armel.deb @@ -255,6 +256,7 @@ 192.168.0.15 192.168.0.15 192.168.0.15 + 192.168.0.15 localhost 192.168.0.15 192.168.0.15 @@ -303,6 +305,7 @@ + 2012-01-19T22:18:07 @@ -336,6 +339,7 @@ 2012-02-11T18:03:15 2012-01-14T13:11:32 2012-02-13T22:02:56 + 2012-09-16T17:12:09 2012-09-07T17:19:10 2012-01-01T15:35:35 2012-01-25T13:42:55 diff --git a/pirkeysetmanager.cpp b/pirkeysetmanager.cpp index 5730ce2..719cd93 100644 --- a/pirkeysetmanager.cpp +++ b/pirkeysetmanager.cpp @@ -26,6 +26,7 @@ #include "keysets/compro.h" #include "keysets/creative.h" #include "keysets/crown.h" +#include "keysets/crownmustang.h" #include "keysets/daewoo.h" #include "keysets/dell.h" #include "keysets/denon.h" @@ -49,6 +50,7 @@ #include "keysets/goodmans.h" #include "keysets/grundig.h" #include "keysets/haier.h" +#include "keysets/hantarex.h" #include "keysets/harmankardon.h" #include "keysets/hauppauge.h" #include "keysets/hitachi.h" @@ -62,6 +64,8 @@ #include "keysets/kaon.h" #include "keysets/kathrein.h" #include "keysets/kenwood.h" +#include "keysets/keymat.h" +#include "keysets/konka.h" #include "keysets/lexuz.h" #include "keysets/lg.h" #include "keysets/lifetec.h" @@ -120,6 +124,7 @@ #include "keysets/vizio.h" #include "keysets/wd.h" #include "keysets/westinghouse.h" +#include "keysets/wiwa.h" #include "keysets/xcruiser.h" #include "keysets/yamaha.h" #include "keysets/zenith.h" @@ -152,6 +157,7 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new ADBSTB2(++counter)); setupKeyset(new ADBSTB3(++counter)); setupKeyset(new ADBSTB4(++counter)); + setupKeyset(new ADBSTB5(++counter)); setupKeyset(new AdmiralTV1(++counter)); setupKeyset(new AdmiralTV2(++counter)); @@ -221,6 +227,8 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new CrownTV1(++counter)); setupKeyset(new CrownAudio1(++counter)); + setupKeyset(new CrownMustangTV1(++counter)); + setupKeyset(new DaewooTV1(++counter)); setupKeyset(new DaewooTV2(++counter)); setupKeyset(new DaewooTV3(++counter)); @@ -348,6 +356,9 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new HaierTV1(++counter)); + setupKeyset(new HantarexTV1(++counter)); + setupKeyset(new HantarexTV2(++counter)); + setupKeyset(new HarmanKardonAmp1(++counter)); setupKeyset(new HarmanKardonAmp2(++counter)); setupKeyset(new HarmanKardonReceiver2(++counter)); @@ -425,6 +436,12 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new KenwoodDVD1(++counter)); setupKeyset(new KenwoodTV1(++counter)); + setupKeyset(new KeymatTV1(++counter)); + setupKeyset(new KeymatTV2(++counter)); + + setupKeyset(new KonkaTV1(++counter)); + setupKeyset(new KonkaTV2(++counter)); + setupKeyset(new LexuzDVB1(++counter)); setupKeyset(new LGTV1(++counter)); @@ -671,6 +688,7 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new SonyTV1a(++counter)); setupKeyset(new SonyTV1b(++counter)); setupKeyset(new SonyTV1c(++counter)); + setupKeyset(new SonyTV2(++counter)); setupKeyset(new SonyAmp1(++counter)); setupKeyset(new SonyAmp2(++counter)); setupKeyset(new SonyAudio1(++counter)); @@ -758,7 +776,9 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new TriaxSTB1(++counter)); setupKeyset(new TriaxSTB2(++counter)); setupKeyset(new TriaxSTB2a(++counter)); -// setupKeyset(new TriaxSTB2b(++counter)); + setupKeyset(new TriaxSTB3(++counter)); + setupKeyset(new TriaxSTB3a(++counter)); + setupKeyset(new TriaxSTB4(++counter)); setupKeyset(new UnitedDVD1(++counter)); setupKeyset(new UnitedDVBT1(++counter)); @@ -791,6 +811,8 @@ PIRKeysetManager::PIRKeysetManager() setupKeyset(new WestinghouseTV1(++counter)); setupKeyset(new WestinghouseTV2(++counter)); + setupKeyset(new WiwaSTB1(++counter)); + setupKeyset(new XcruiserSat1(++counter)); setupKeyset(new YamahaDVD1(++counter)); @@ -823,12 +845,6 @@ PIRKeysetManager::~PIRKeysetManager() stopRepeatingFlag = true; } - // Tell the thread that we want it to stop: - commandThread.exit(); - - // Wait for the thread to stop: - commandThread.wait(); - // Delete all the keysets: PIRKeysetCollection::iterator i = keysetsInfo.begin(); while (i != keysetsInfo.end()) @@ -836,6 +852,12 @@ PIRKeysetManager::~PIRKeysetManager() if ((*i).second) delete (*i).second; ++i; } + + // Tell the thread that we want it to stop: + commandThread.exit(); + + // Wait for the thread to stop: + commandThread.wait(); } diff --git a/pirkeysetmetadata.cpp b/pirkeysetmetadata.cpp index dd1574f..903425e 100644 --- a/pirkeysetmetadata.cpp +++ b/pirkeysetmetadata.cpp @@ -22,6 +22,14 @@ PIRKeysetMetaData::PIRKeysetMetaData( { } + +PIRKeysetMetaData::~PIRKeysetMetaData() +{ + if (threadableProtocol) delete threadableProtocol; + threadableProtocol = 0; +} + + bool PIRKeysetMetaData::hasKey( PIRKeyName name) const { diff --git a/pirkeysetmetadata.h b/pirkeysetmetadata.h index 401174a..0f9101a 100644 --- a/pirkeysetmetadata.h +++ b/pirkeysetmetadata.h @@ -27,6 +27,8 @@ public: PIRMakeName make, unsigned int index); + ~PIRKeysetMetaData(); + bool hasKey( PIRKeyName name) const; diff --git a/pirmakenames.cpp b/pirmakenames.cpp index 5735025..4d3dcb6 100644 --- a/pirmakenames.cpp +++ b/pirmakenames.cpp @@ -24,6 +24,7 @@ PIRMakeMgr::PIRMakeMgr() makes[Compro_Make] = "Compro"; makes[Creative_Make] = "Creative"; makes[Crown_Make] = "Crown"; + makes[CrownMustang_Make] = "Crown Mustang"; makes[Daewoo_Make] = "Daewoo"; makes[Dell_Make] = "Dell"; makes[Denon_Make] = "Denon"; @@ -47,6 +48,7 @@ PIRMakeMgr::PIRMakeMgr() makes[Goodmans_Make] = "Goodmans"; makes[Grundig_Make] = "Grundig"; makes[Haier_Make] = "Haier"; + makes[Hantarex_Make] = "Hantarex"; makes[HarmanKardon_Make] = "Harman/Kardon"; makes[Hauppauge_Make] = "Hauppauge"; makes[Hitachi_Make] = "Hitachi"; @@ -60,6 +62,8 @@ PIRMakeMgr::PIRMakeMgr() makes[Kaon_Make] = "Kaon"; makes[Kathrein_Make] = "Kathrein"; makes[Kenwood_Make] = "Kenwood"; + makes[Keymat_Make] = "Keymat"; + makes[Konka_Make] = "Konka"; makes[Lexuz_Make] = "Lexuz"; makes[LG_Make] = "LG"; makes[Lifetec_Make] = "Lifetec"; @@ -118,6 +122,7 @@ PIRMakeMgr::PIRMakeMgr() makes[Vizio_Make] = "Vizio"; makes[WD_Make] = "Western Digital"; makes[Westinghouse_Make] = "Westinghouse"; + makes[Wiwa_Make] = "Wiwa"; makes[Xcruiser_Make] = "Xcruiser"; makes[Yamaha_Make] = "Yamaha"; makes[Zenith_Make] = "Zenith"; diff --git a/pirmakenames.h b/pirmakenames.h index ac3136c..c8c5dc6 100644 --- a/pirmakenames.h +++ b/pirmakenames.h @@ -25,6 +25,7 @@ enum PIRMakeName{ Compro_Make, Creative_Make, Crown_Make, + CrownMustang_Make, Daewoo_Make, Dell_Make, Denon_Make, @@ -48,6 +49,7 @@ enum PIRMakeName{ Goodmans_Make, Grundig_Make, Haier_Make, + Hantarex_Make, HarmanKardon_Make, Hauppauge_Make, Hitachi_Make, @@ -61,6 +63,8 @@ enum PIRMakeName{ Kaon_Make, Kathrein_Make, Kenwood_Make, + Keymat_Make, + Konka_Make, Lexuz_Make, LG_Make, Lifetec_Make, @@ -119,6 +123,7 @@ enum PIRMakeName{ Vizio_Make, WD_Make, Westinghouse_Make, + Wiwa_Make, Xcruiser_Make, Yamaha_Make, Zenith_Make diff --git a/protocols/necprotocol.cpp b/protocols/necprotocol.cpp index e2d5961..6efde39 100644 --- a/protocols/necprotocol.cpp +++ b/protocols/necprotocol.cpp @@ -36,6 +36,7 @@ NECProtocol::NECProtocol( isExtendedNEC(extNEC), isShortRepeat(srtRep) { + setMinimumRepetitions(1); } diff --git a/qtc_packaging/debian_fremantle/changelog b/qtc_packaging/debian_fremantle/changelog index c181660..d05eb87 100644 --- a/qtc_packaging/debian_fremantle/changelog +++ b/qtc_packaging/debian_fremantle/changelog @@ -1,3 +1,9 @@ +pierogi (1.1.13) unstable; urgency=low + * Found a new source of (possibly unreliable) keysets! Made a first pass at keysets for Crown Mustang, Hantarex, Keymat, Konka, and Wiwa. Also added more keysets to ADB (I-Can), Sony, and Triax. Hopefully more to come... + * Made small fixes to the macros UI, and improved the cleanup of threads when Pierogi exits. Also made small fixes to a Cisco keyset and to LG timing. + + -- John Pietrzak Sun, 16 Sep 2012 18:41:08 -0400 + pierogi (1.1.12) unstable; urgency=low * Pushing up an initial implementation of Macros. For now, they don't do much, they don't work terribly well, and they are thoroughly undocumented, but at least they exist. :) * Updates to keysets for Creative, Grundig, and RCA, and a bugfix to the RCA protocol. diff --git a/qtc_packaging/debian_fremantle/control b/qtc_packaging/debian_fremantle/control index 4e367c1..bda3181 100644 --- a/qtc_packaging/debian_fremantle/control +++ b/qtc_packaging/debian_fremantle/control @@ -11,8 +11,8 @@ Architecture: armel Depends: ${shlibs:Depends}, ${misc:Depends} Description: Universal Infrared (IR) Remote Control for N900 Pierogi is a Universal Infrared Remote Control app for the Nokia N900. It is independent from the LIRC server, and stores all configuration info internally. -XB-Maemo-Upgrade-Description: Now with Macros! - Finally includes a very limited macro capability. Please don't push it too hard. Also includes updates to Creative, Grundig, and RCA keysets, as well as a bugfix for the RCA protocol. +XB-Maemo-Upgrade-Description: More Keysets! + Found a new source of keyset data (although it might not be reliable). Made a first pass at keysets for Crown Mustang, Hantarex, Keymat, Konka, and Wiwa. Also added new keysets to ADB (I-Can), Sony, and Triax. There are also some minor bug fixes and tweaks to the new macro system. XSBC-Bugtracker: https://garage.maemo.org/tracker/?func=add&group_id=2286&atid=7641 XB-Maemo-Display-Name: Pierogi XB-Maemo-Icon-26: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAEChJREFUaIHtmFmsXudVhp/1TXv/+x/OOZ4TO66dZmBo0jZJoxBQW8ookAq0mIhJQhUXcAGIAhICRClDb4q4YBRDGSoBFS2ikQoUSkpNIEkbnJQ0cVL7xLUd2/GZfKZ/2MP3fYuLE6LUDQEFQi/oe7e/X7/2++71an1rvfAlfAn/vyH/2Q+Hbzp89M47rvm1aw/0XvPs5ea+M5/b+OiJB5/88FX/1Vee4kvjagEC6Dt/+ns++Ya7Xn2ndWX2zkvKLV070Xp72Vy6PG4vLa0/8pcffuytlxcvr3wxSL8Q7qpnBXjzW+64M/QC1hiTUq0xWbHWihjf3TBvwqtene46e377/Z9swztWz59/9ovA+3nYqw9uv/uWH/y27/iat3rv1AcnkARjCSHgQ2FdqNT5Hgf27bpxfsF+/yTms2vPXjkJGL4Ilvo8AXfcfes9P/kTx96/sHtEKKwYURCHMULWjsnmhMlkXSbbG5J1m317Rr073nDknutvPPy2wZ6FA9syOzFbm7X/lwI+z0Jf+dob7jlw3UGsA8ioJlJWZpMpXUzEVGPFUpYW6xSqgeQ80bu/5tpbX/u6L7/1mvvnv+nPPvu3dwFw++2eEye6V1rA8xU4esvRr7/nnm9+z959C7hgVEQEMWxvbtE0nYoYYhxL7DJZjRZlya691zCc2y0qqPcq1+6vDp1f3r7UhbnF2RNPzF5p8rDTdQTQX3rvj11609fedo31EEqPNZa6bnjm7Clyakk5UlW7mN+9gKYZw+EuCBUiUA1203Yt0+01zjz1VJptPWtX1mZ84v6zf/nYE59779LppU++UgLcfwi44caD1zinIKJGDKpIU8/omimYoM4NWdg1J8ElEuhg6MkCvhiSESRNsXkmB665zmyWXncfcLJnz/Dtd9127dtOP33hn/75gUvfe+H0hYuvhIB86NChXbv3zZFF1bsgoLRtw3h7HaMd1hZiTY33Geug7BUSvEUNYKCdXcGZlqpX4Qplbu6oNG3UohDZtXu/XH/TdW8ajj7z4MO7ez/36YdOv/9/WwA33Hr4R3zwrQveOwf1dJvJZJvpeBvjoOh59u4/SGlm9IfzlFUBBkQcMW1Sb62QUkI1I5pw0lF1M7FuSt4TNO/bLUeOvOXab/9O/nh5efNP/uLP/+ETT55a/4Wzj589/j8VYHffvHv41Xfd9jOve/31ryoLb0R2rLO5tUE9ndDrlQyGQ8oS5kYjXGERieQYqSeb1OMVJqufQ0wPX1b0ewOMQSwR5y2+LPHOibGlQVqqasjBa689evjQwg+Ywvhzi5c//hyXl3WPuD3Vnptvvvnwm6wT1dRKypGuS7TNlJynDIZHCMHiQ0CskrqWGDtCWWIlo9aRZhsYU2KrEqO1kCdIEXBZwBbSpRbvS6xLErNRDh9kMBqxf9/gZ1dXZ/c/8fBn/w7IL6cC7pZbD//UzTcfwAqSsgCe6eQyuatxRglFxdxcn6IUvDOogoSC6dYq9fYa0/E5+nuvpywDqut4rVBbEqcrpDglY7DVQeqtc7hynrIsxZrIcDhiNP8V+q6f3//Rum44e/4yT51aO3VlffyRSxfXPnFhaXr8yuLi+Cph9rkqPX/mBtXwDS4MELGoJkUzQkJzLdZYykLRXKtmjzWVqCqqSSfrl6g3zyGFR5p1Uu6Is7GYakERI9urK9pfGGFMQCRjjZHcTDWpx2AwJspoWMnmaq29ysuNN15H09qbjhw58M47bnv1Oy+cX35o5XX7F1evbN136dzGw89IscjiYvMFFej1+vPWW1QziGINYq3HSMA6C0SscWIl03Y1sa2xoS9KDd4SwgDHDIlQhHlyO8UP9mFtKSJCzlHjeF1sb4E4HZPjtthehbM9jIVerxREQLJed2iPrCxfYTxpec1rjtw1HL7+rq7b/r7HP/PYhe3NrSc3Xvfap598fO23zjx14fHnBRR9c8aJ3u6LAksGyVr1K2ZTLzk2zLYv4WW3FsVeNGdJsWO6cVrjbBOLx6Qav+dGMAO0m4iJS2SF/p79KuKxdORmXZmMpTCBLlsVrXCi0uUJvTIznWyrNZ69+4Ys7JojpqBnz5xm45mTjEa7uPPuNx/U3B0M3n+DSP1DbTtjPN7kt379Y+9wVTBzYgPOCkYsYpyEUGCNo4s1WQ1qgqAdmhWNDcaI5BQRalKbIRnEeYwvUR3iwhwxduJDD2OtUlUy21iDXGMkSyg8mUTG4L1Q9voym05w3gAWY5CFXbvwwaDJELspwQecB6FSjJc5W3LnVx/6Tbc9bpK3ZqeHu4A1QgiOohzQNTO6aMg5YyTRzTaxCElB2zXoprTJMSufxQ4ivWqOToV28zLEGSxchw/zpA4wDqHEWQdGMOLxxiBEiuBJeYgSERXEGIrSk2KflHbe712BCw6DINmharTfGxb26Jcd3n/LrUff2BsM1BrBGCPWC84HVDOby4tYEjk1BN9nvD1mtr6E1JcxKM6MKEd7MdqQuzHd+kWsNOKDIbYJX1ZkrOh0E3JL2aski0NzRlONrw6h4lGN5JQQa4mxw7o+IhawDIYVvVGF9yVYxVqDYHnwoSd/zSw9szpeX10mx05SPZXY7gyRRa+iGgwRZ6lnV2imNVkV6wqKahcqGWwPHLRtS1fPaLeexYdK0myb6doSqKXeWpVc17hqH+Vor0g5h+QMucMYg3OKDxbnS5SEdeBDADLCToWc9zjrcSFgTRBjnYjJbF0ZXzQbk+ljy0uXaJuGLjbadTW5m2KkozcYUJRzNLOOWT1jur1CTmNcYUhqURmABHKMWGswRmgmK9pNO7pasdZDzJq7Bgl9CLsVP8C5HmJLxBeIEYwkrAEQBIuIJWsGFJFE2SvxwWMthBDUWof3ha6sbF+wo33zG6Ohe8sNNxzYb51I1oQzJUY6sTbjXA/nCt3aXAXjRHNCxehg/ghuVOGKCqsN4jLV/F4xtsD6nlQLB1SowXvUF0iuxViDQVA8zjmRmOjqTdpp0q5rmEzHIhLI2et00hHbGYNRn/n5CucDxlkRUUmJTtW6D/zBR99hTp04tbqxvvUvKXU55w5rrCRtJKZE1oQNJdXcHlnYf0S2t1apmylt24rxXpwfSujNSWxbMVpKbBNhMMJXFUUlEga7xNgSLyKiCdGEihWxVrouEdOOx1VqMdZI10FKiawiOUUJwchofig2BDFGRXJGsyrglpeXWFpamjiAja3miqasMbY4Z4BAzmCzEEIgGejRZ8v3mc4mqPSYjDep+gPEBEyoEOMwrkDjBGOVLGBcH0ODsSWaZiAexJC6KV09QaQgiSfHCbNZjTEOTYY21kDHaH6eajDCmA5RSAa0U0SsLJ4+dx6eG6efODv+vdiN3103lRpj6BU7cVHKineBqtqNVgv43hz1tGZ74zJrm+tMJhP6VWS0+xCikdw1JALGeUQ8YbAfm1tSOyYTyDgMlqyO7Cu6qKytTalniRgFpGI8UzS3XH/jTRRlj5RaMI7YKQZD1pn8y/0nxn/4Ox/5OkDMsWPH7LmHT14eb20S21piF1EiaIvmDiWDZqwUWO8pqxH90QEwPeoOZo0Qm4aMBRuwxYCMIQM5NeTYktqWFBvUWHJWkvSIuU8bC6azSN3srKxtkxCNjOb7FL0SY/PO3vFcCBhTy3Ra88D9j3545cLKIqDugx/8oAJsbW3n/lxhcnSqWBFRjOyM6G23iTGWspgnm4QyYDqep5nALAqz8QahN8SYRCjm0ay0TaLIkRQzSoGthnSdElOk7oTtrRkx1nT1NooiMkAl0R9WVP0SJJLZWZLAkbWj66KefOK0njx16V1Xj6c0KRy65SsGt2O9FMEgOKwxqEQ0TcmpRUXxrqIq57GhJFQLpAybWy1tSrTdFEMQTA9CxXTa0OVO6mbMxvqEre2JbG6OWb54kenkCk3dIa6PcwN6VZ9Xf9nNzC/spax6iAiaFEGp21ZzhKZN8vM/+9v7lxYvPr9bP58LXbw0/eVTp8ffdfsde+ZSFzE0RHEY/HMBaiZ1E1ocKomi1wOjIHuZTVaZ1pHgStQ0alsnLhhy1yHWqGJlY2OJrD2NMYkaCwTEBHqDOfqDAXPzB9C8BdYi6kj1FFUlK2jOiHj5t0c/Pb46j30+F1p5dmXTD/dW17+qelNVBZw1iChIQnAY4zFkcmbngnEZZwXnHAqkriFGS91MpGkauuiom8ysjlI3ibqJxJgl54wNA4regN6wz559BxmO9hBCSco1AKqZHBNZMzGhbYecO/MM7/+je3/48jNrj75QwBfE62/42q9646/88luOi7ZalIWU5Yi2XcMYSygGGGOxxu+0RmcRIzvku5a6qZluTTV2WWI3I2eLYlXEivUB55xa72Q4t4BxnuD6WNfDWEtOLTEZUqxJqaOLSVOGpo78ye/+6cp9Hz/5dUtnlh6/mu/V6bQ8/I8P/tPSs7dx4MC8NI3T3qCUwC5SnGKtJSdDlojkFkkeVHbGAG8JxuPcPKnrSHlI17VoBmMNRTHHTthn8KFCjMX5gpRaYlRyiojvAx6hIMZNFCObVzb52PFT37jyIuQ/z0IvRBiMbr7+6O5bjAv0ilKM8ZolY10pzlkQ0a6dkVJLzh2KoAJijRzd/000aUVUohahRyhLvA8UvaEYK1ix+GIBsVaMFKgAGFUgJZWui+SkTKednD97lg/9+b1//8jxJ3/1xXi+qIVeiB/9ybf+1du/++5vF2vUGS9F6WlmY3LeIW/FIs6BxOes4Ekpqg9DAYMxjqRGxThxboQxPU2pEWsCObfkHBECTbNFTBlNfZ1NNmVrY5Vffe/v/83qOb57cXFx66U4mhc7PHbsmAX49f7r335leRmiSJdcrusxWROqDqQk5kzXNmisyTGSYmKyMaFtZ2CElDKIRwRy7ohxihWDUCL06bpE09SIVMSIrq+dlaef+hQf+fC9PHTf4rc+R/4lP/KLWujkyZMKCMePa39+7vpd8/611XAksR3Tda0iRkI5T8odOWeUnU6lCr7ogRghJ3LOkBXNUbrYkNsZsaulaxti2zKrt5hOxsxmtXaR/MB9f20+fvzEB//tVPODVy6uXngp4v+Bl1T3Qrz1HW9747FvOXB8194FjHOIZHWuJ854yGMwCRSyqFrnRcQgGBQ0pyhJDTkmUofO2khKEclRzp+7yGceu3DmqafH73vgbz/9nhfw+m+ldC9agRfDZx998hyjw2UzWbvJS+yX/VE0OYiqilgla0ZzVlDJKZNzIkUFFbG2z2R7haaZaoxTbWczGY+35MK5JT5072d/+OwzxY+d+PinPvbf5fKyBAA89ciT9w1vuPPe9eXla/b0u1uKXk8wZa7KAeLnadqZpNhqzkLbNYCVtmu0LPYy3lpCsTKrG3n0xBn+9ZGVj33ykbVffOijj7xv+fz5+uWQhy+8B/5L3HHgVU+/+91/fOx9wI+/5103tPncmwfpqd9YWKjKqizVhVIwGXJmOmlZWd5kbePBlaXN8Idd4/56S8OZBz7w95dgp1k8xKdeLvcv4Uv438C/A7Q6fneUaSRcAAAAAElFTkSuQmCC -- 1.7.9.5