Lots of Keysets
authorJohn Pietrzak <john@pietrzak.org>
Sat, 18 Feb 2012 03:00:33 +0000 (22:00 -0500)
committerJohn Pietrzak <john@pietrzak.org>
Sat, 18 Feb 2012 03:00:33 +0000 (22:00 -0500)
This commit includes mostly new keyset data; a first pass at keysets for
DirecTV, Huawei, Onida, Vestel, Virgin Media, and Vizio, as well as a few
new keysets for Bose and Sharp.

31 files changed:
keysets/bose.cpp
keysets/bose.h
keysets/directv.cpp [new file with mode: 0644]
keysets/directv.h [new file with mode: 0644]
keysets/huawei.cpp [new file with mode: 0644]
keysets/huawei.h [new file with mode: 0644]
keysets/onida.cpp [new file with mode: 0644]
keysets/onida.h [new file with mode: 0644]
keysets/philips.cpp
keysets/samsung.cpp
keysets/samsung.h
keysets/sharp.cpp
keysets/sharp.h
keysets/vestel.cpp [new file with mode: 0644]
keysets/vestel.h [new file with mode: 0644]
keysets/virgin.cpp [new file with mode: 0644]
keysets/virgin.h [new file with mode: 0644]
keysets/vizio.cpp [new file with mode: 0644]
keysets/vizio.h [new file with mode: 0644]
pierogi.pro
pierogi.pro.user
pirkeysetmanager.cpp
pirmakenames.cpp
pirmakenames.h
protocols/directvprotocol.cpp [new file with mode: 0644]
protocols/directvprotocol.h [new file with mode: 0644]
protocols/jvcprotocol.cpp
protocols/pirprotocol.cpp
protocols/pirprotocol.h
qtc_packaging/debian_fremantle/changelog
qtc_packaging/debian_fremantle/control

index 6ce7e1e..f5db3cc 100644 (file)
@@ -114,3 +114,56 @@ BoseRadio3::BoseRadio3(
 
   addKey("POWER", Power_Key, 0x4C, 8); // also "enter"?
 }
+
+
+BoseHomeTheater1::BoseHomeTheater1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "Home Theater 1",
+      Bose_Make,
+      index)
+{
+  threadableProtocol = new NECProtocol(guiObject, index, true, false);
+
+  setPreData(0x4BBA, 16);
+
+  addKey("mute", Mute_Key, 0x01, 8);
+  addKey("vol down", VolumeDown_Key, 0x02, 8);
+  addKey("vol up", VolumeUp_Key, 0x03, 8);
+  addKey("AM", Unmapped_Key, 0x05, 8);
+  addKey("Video2", Unmapped_Key, 0x0D, 8);
+  addKey("Video1", Unmapped_Key, 0x0E, 8);
+  addKey("AUX", AuxInput_Key, 0x0F, 8);
+
+  addKey("channel down", ChannelDown_Key, 0x18, 8);
+  addKey("channel up", ChannelUp_Key, 0x19, 8);
+  addKey("stop", Stop_Key, 0x1A, 8);
+  addKey("down arrow", Down_Key, 0x20, 8);
+  addKey("pause", Pause_Key, 0x36, 8);
+
+  addKey("0", Zero_Key, 0x40, 8);
+  addKey("1", One_Key, 0x41, 8);
+  addKey("2", Two_Key, 0x42, 8);
+  addKey("3", Three_Key, 0x43, 8);
+  addKey("4", Four_Key, 0x44, 8);
+  addKey("5", Five_Key, 0x45, 8);
+  addKey("6", Six_Key, 0x46, 8);
+  addKey("7", Seven_Key, 0x47, 8);
+  addKey("8", Eight_Key, 0x48, 8);
+  addKey("9", Nine_Key, 0x49, 8);
+  addKey("power", Power_Key, 0x4C, 8);
+
+  addKey("CD/DVD", DVDInput_Key, 0x53, 8);
+  addKey("play", Play_Key, 0x55, 8);
+  addKey("rewind", Rewind_Key, 0x57, 8);
+  addKey("fast fwd", FastForward_Key, 0x58, 8);
+  addKey("FM", TunerBand_Key, 0x59, 8);
+
+  addKey("right arrow", Right_Key, 0x60, 8);
+  addKey("display/info", Info_Key, 0x80, 8);
+  addKey("menu", Menu_Key, 0x90, 8);
+  addKey("left arrow", Left_Key, 0xA0, 8);
+  addKey("up arrow", Up_Key, 0xC0, 8);
+  addKey("select", Select_Key, 0xE0, 8);
+}
index 5abb13f..345a523 100644 (file)
@@ -29,4 +29,12 @@ public:
     unsigned int index);
 };
 
+class BoseHomeTheater1: public PIRKeysetMetaData
+{
+public:
+  BoseHomeTheater1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
 #endif // BOSE_H
diff --git a/keysets/directv.cpp b/keysets/directv.cpp
new file mode 100644 (file)
index 0000000..355dc52
--- /dev/null
@@ -0,0 +1,86 @@
+#include "directv.h"
+#include "protocols/directvprotocol.h"
+
+
+// Note: volume keys are tricky!
+DirectvReceiver1::DirectvReceiver1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "Sat Keyset 1",
+      Directv_Make,
+      index)
+{
+  threadableProtocol = new DirectvProtocol(guiObject, index, LowFreq, true);
+
+  setPreData(0xC, 4);
+
+  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("Chan+", ChannelUp_Key, 0x0D, 8);
+  addKey("Chan-", ChannelDown_Key, 0x0E, 8);
+  addKey("Previous", PrevChannel_Key, 0xF, 8); // "last"
+
+  addKey("Power", Power_Key, 0x10, 8);
+  addKey("0", Zero_Key, 0x11, 8);
+  addKey("Dash", Dash_Key, 0x12, 8);
+  addKey("Enter", Enter_Key, 0x13, 8);
+
+  addKey("Menu", Menu_Key, 0x20, 8); // "alt menu"
+  addKey("Up", Up_Key, 0x21, 8);
+  addKey("Down", Down_Key, 0x22, 8);
+  addKey("Left", Left_Key, 0x23, 8);
+  addKey("Right", Right_Key, 0x24, 8);
+  addKey("Select", Select_Key, 0x25, 8);
+  addKey("Exit", Exit_Key, 0x26, 8);
+  addKey("Back", Unmapped_Key, 0x27, 8);
+  addKey("Guide", Guide_Key, 0x28, 8);
+  addKey("Active", DiscMenu_Key, 0x29, 8); // "menu"
+  addKey("List", Unmapped_Key, 0x2A, 8);
+  addKey("list-long", Unmapped_Key, 0x2B, 8);
+  addKey("info-long", Unmapped_Key, 0x2C, 8);
+  addKey("guide-long", Unmapped_Key, 0x2D, 8);
+  addKey("Info", Info_Key, 0x2E, 8);
+
+  addKey("Play", Play_Key, 0x30, 8);
+  addKey("Stop", Stop_Key, 0x31, 8);
+  addKey("Pause", Pause_Key, 0x32, 8);
+  addKey("Rewind", Rewind_Key, 0x33, 8);
+  addKey("Forward", FastForward_Key, 0x34, 8);
+  addKey("Record", Record_Key, 0x35, 8);
+  addKey("Replay", Replay_Key, 0x36, 8);
+  addKey("Skip", Advance_Key, 0x37, 8);
+  addKey("skip-forward-long", Unmapped_Key, 0x38, 8);
+  addKey("play-long", Unmapped_Key, 0x3A, 8);
+  addKey("pause-long", Unmapped_Key, 0x3B, 8);
+  addKey("rewind-long", Unmapped_Key, 0x3C, 8);
+  addKey("forward-long", Unmapped_Key, 0x3D, 8);
+  addKey("record-long", Unmapped_Key, 0x3E, 8);
+  addKey("skip-back-long", Unmapped_Key, 0x3F, 8);
+
+  addKey("Red", Red_Key, 0x41, 8);
+  addKey("Yellow", Yellow_Key, 0x42, 8);
+  addKey("Green", Green_Key, 0x43, 8);
+  addKey("Blue", Blue_Key, 0x44, 8);
+  addKey("pip on/off", PIP_Key, 0x47, 8);
+  addKey("pip swap", PIPSwap_Key, 0x48, 8);
+  addKey("red-long", Unmapped_Key, 0x4A, 8);
+  addKey("yellow-long", Unmapped_Key, 0x4B, 8);
+  addKey("green-long", Unmapped_Key, 0x4C, 8);
+  addKey("blue-long", Unmapped_Key, 0x4D, 8);
+
+  addKey("tv/vcr", Input_Key, 0x5B, 8);
+
+  addKey("format", Unmapped_Key, 0x73, 8);
+  addKey("format-long", Unmapped_Key, 0x75, 8);
+
+  addKey("On", PowerOn_Key, 0x80, 8);
+  addKey("Off", PowerOff_Key, 0x81, 8);
+}
diff --git a/keysets/directv.h b/keysets/directv.h
new file mode 100644 (file)
index 0000000..8e2a20d
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef DIRECTV_H
+#define DIRECTV_H
+
+#include "pirkeysetmetadata.h"
+
+class QObject;
+
+class DirectvReceiver1: public PIRKeysetMetaData
+{
+public:
+  DirectvReceiver1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+#endif // DIRECTV_H
diff --git a/keysets/huawei.cpp b/keysets/huawei.cpp
new file mode 100644 (file)
index 0000000..ad433ac
--- /dev/null
@@ -0,0 +1,118 @@
+#include "huawei.h"
+#include "protocols/necprotocol.h"
+#include "protocols/necxprotocol.h"
+
+
+HuaweiSTB1::HuaweiSTB1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "STB Keyset 1",
+      Huawei_Make,
+      index)
+{
+  addControlledDevice(Huawei_Make, "EX2108", Other_Device);
+
+  threadableProtocol = new NECXProtocol(guiObject, index, false);
+
+  setPreData(0x1111, 16);
+
+  addKey("5", Five_Key, 0x80, 8);
+  addKey("0", Zero_Key, 0x87, 8);
+  addKey("Green", Green_Key, 0x89, 8);
+  addKey("7", Seven_Key, 0x8A, 8);
+  addKey("8", Eight_Key, 0x8B, 8);
+  addKey("4", Four_Key, 0x8E, 8);
+
+  addKey("Stop", Stop_Key, 0x90, 8);
+  addKey("1", One_Key, 0x92, 8);
+  addKey("2", Two_Key, 0x93, 8);
+  addKey("Last_ch", PrevChannel_Key, 0x95, 8);
+  addKey("Guide", Guide_Key, 0x98, 8);
+  addKey("Page-", PageDown_Key, 0x99, 8);
+  addKey("left_arrow", Left_Key, 0x99, 8);
+  addKey("Record", Record_Key, 0x9A, 8);
+  addKey("Power", Power_Key, 0x9C, 8);
+  addKey("Menu", Menu_Key, 0x9D, 8);
+
+  addKey("Page+", PageUp_Key, 0xC1, 8);
+  addKey("right_arrow", Right_Key, 0xC1, 8);
+  addKey("Play", Play_Key, 0xC3, 8);
+  addKey("Pause", Pause_Key, 0xC3, 8);
+  addKey("9", Nine_Key, 0xC4, 8);
+  addKey("6", Six_Key, 0xC8, 8);
+  addKey("CH+", ChannelUp_Key, 0xCA, 8);
+  addKey("up_arrow", Up_Key, 0xCA, 8);
+  addKey("3", Three_Key, 0xCC, 8);
+  addKey("Select", Select_Key, 0xCE, 8);
+
+  addKey("CH-", ChannelDown_Key, 0xD2, 8);
+  addKey("down_arrow", Down_Key, 0xD2, 8);
+  addKey("ffwd", FastForward_Key, 0xD6, 8);
+  addKey("Yellow", Yellow_Key, 0xD9, 8);
+  addKey("rewind", Rewind_Key, 0xDA, 8);
+  addKey("Info", Info_Key, 0xDD, 8);
+}
+
+
+HuaweiSTB2::HuaweiSTB2(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "STB Keyset 2",
+      Huawei_Make,
+      index)
+{
+  addControlledDevice(Huawei_Make, "EC2108", Other_Device);
+
+  threadableProtocol = new NECProtocol(guiObject, index, false, true);
+
+  setPreData(0x11, 8);
+
+  addKey("Red", Red_Key, 0x84, 8);
+  addKey("0", Zero_Key, 0x87, 8);
+  addKey("Green", Green_Key, 0x89, 8);
+  addKey("7", Seven_Key, 0x8A, 8);
+  addKey("8", Eight_Key, 0x8B, 8);
+  addKey("4", Four_Key, 0x8E, 8);
+  addKey("5", Five_Key, 0x8F, 8);
+
+  addKey("ChannelPrev", PrevChannel_Key, 0x90, 8);
+  addKey("1", One_Key, 0x92, 8);
+  addKey("2", Two_Key, 0x93, 8);
+  addKey("LiveTV", LiveTV_Key, 0x95, 8);
+  addKey("Blue", Blue_Key, 0x96, 8);
+  addKey("PageDown", PageDown_Key, 0x98, 8);
+  addKey("VolumeDown", VolumeDown_Key, 0x99, 8);
+  addKey("DirectionLeft", Left_Key, 0x99, 8);
+  addKey("Guide", Guide_Key, 0x9A, 8);
+  addKey("Menu", Menu_Key, 0x9B, 8);
+  addKey("PowerToggle", Power_Key, 0x9C, 8);
+  addKey("Mute", Mute_Key, 0x9D, 8);
+  addKey("#", Unmapped_Key, 0x9F, 8);
+
+  addKey("VolumeUp", VolumeUp_Key, 0xC1, 8);
+  addKey("DirectionRight", Right_Key, 0xC1, 8);
+  addKey("Info", Info_Key, 0xC2, 8);
+  addKey("Pause", Pause_Key, 0xC3, 8);
+  addKey("Play", Play_Key, 0xC3, 8);
+  addKey("9", Nine_Key, 0xC4, 8);
+  addKey("Subtitle", Captions_Key, 0xC7, 8);
+  addKey("6", Six_Key, 0xC8, 8);
+  addKey("ChannelUp", ChannelUp_Key, 0xCA, 8);
+  addKey("DirectionUp", Up_Key, 0xCA, 8);
+  addKey("3", Three_Key, 0xCC, 8);
+  addKey("Select/Ok", Select_Key, 0xCE, 8);
+  addKey("PageUp", PageUp_Key, 0xCF, 8);
+
+  addKey("VOD", Unmapped_Key, 0xD1, 8);
+  addKey("ChannelDown", ChannelDown_Key, 0xD2, 8);
+  addKey("DirectionDown", Down_Key, 0xD2, 8);
+  addKey("Audio", Audio_Key, 0xD4, 8);
+  addKey("*", Unmapped_Key, 0xD5, 8);
+  addKey("FastForward", FastForward_Key, 0xD6, 8);
+  addKey("Exit", Exit_Key, 0xD7, 8);
+  addKey("Yellow", Yellow_Key, 0xD9, 8);
+  addKey("Rewind", Rewind_Key, 0xDA, 8);
+  addKey("Interactive", Unmapped_Key, 0xDD, 8);
+}
diff --git a/keysets/huawei.h b/keysets/huawei.h
new file mode 100644 (file)
index 0000000..8c67c6c
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef HUAWEI_H
+#define HUAWEI_H
+
+#include "pirkeysetmetadata.h"
+
+class QObject;
+
+class HuaweiSTB1: public PIRKeysetMetaData
+{
+public:
+  HuaweiSTB1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+class HuaweiSTB2: public PIRKeysetMetaData
+{
+public:
+  HuaweiSTB2(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+#endif // HUAWEI_H
diff --git a/keysets/onida.cpp b/keysets/onida.cpp
new file mode 100644 (file)
index 0000000..7083342
--- /dev/null
@@ -0,0 +1,112 @@
+#include "onida.h"
+#include "protocols/necprotocol.h"
+#include "protocols/jvcprotocol.h"
+
+
+OnidaTV1::OnidaTV1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "TV Keyset 1",
+      Onida_Make,
+      index)
+{
+  threadableProtocol = new JVCProtocol(guiObject, index);
+
+  setPreData(0x03, 8);
+
+  addKey("sleep-timer", Sleep_Key, 0x03, 8);
+  addKey("display", Info_Key, 0x04, 8);
+
+  addKey("tv-video", Input_Key, 0x13, 8);
+  addKey("power", Power_Key, 0x17, 8);
+  addKey("chdn", ChannelDown_Key, 0x18, 8);
+  addKey("chup", ChannelUp_Key, 0x19, 8);
+  addKey("mute", Mute_Key, 0x1C, 8);
+  addKey("volup", VolumeUp_Key, 0x1E, 8);
+  addKey("voldn", VolumeDown_Key, 0x1F, 8);
+
+  addKey("0", Zero_Key, 0x20, 8);
+  addKey("1", One_Key, 0x21, 8);
+  addKey("2", Two_Key, 0x22, 8);
+  addKey("3", Three_Key, 0x23, 8);
+  addKey("4", Four_Key, 0x24, 8);
+  addKey("5", Five_Key, 0x25, 8);
+  addKey("6", Six_Key, 0x26, 8);
+  addKey("7", Seven_Key, 0x27, 8);
+  addKey("8", Eight_Key, 0x28, 8);
+  addKey("9", Nine_Key, 0x29, 8);
+
+  addKey("surround", Surround_Key, 0x42, 8);
+  addKey("picsnd-up", Unmapped_Key, 0x5A, 8);
+  addKey("picsnd-dn", Unmapped_Key, 0x5B, 8);
+  addKey("vsm", Unmapped_Key, 0x79, 8);
+  addKey("menu", Menu_Key, 0x7A, 8);
+  addKey("picture-sound", Unmapped_Key, 0x7B, 8);
+  addKey("ssm", Unmapped_Key, 0x90, 8);
+  addKey("color-system", Unmapped_Key, 0x92, 8);
+  addKey("digits", DoubleDigit_Key, 0x9D, 8);
+}
+
+
+OnidaDVD1::OnidaDVD1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "DVD Keyset 1",
+      Onida_Make,
+      index)
+{
+  threadableProtocol = new NECProtocol(guiObject, index, false, true);
+
+  setPreData(0x00, 8);
+
+  addKey("EJECT", Eject_Key, 0x02, 8);
+  addKey("SUBTITLE", Captions_Key, 0x04, 8);
+  addKey("AUDIO", Audio_Key, 0x05, 8);
+  addKey("ANGLE", Angle_Key, 0x06, 8);
+  addKey("3", Three_Key, 0x08, 8);
+  addKey("2", Two_Key, 0x09, 8);
+  addKey("1", One_Key, 0x0A, 8);
+  addKey("ENTER", Select_Key, 0x0B, 8);
+  addKey("9", Nine_Key, 0x0C, 8);
+  addKey("8", Eight_Key, 0x0D, 8);
+  addKey("7", Seven_Key, 0x0E, 8);
+  addKey("TITLE", DiscTitle_Key, 0x0F, 8);
+
+  addKey("6", Six_Key, 0x10, 8);
+  addKey("5", Five_Key, 0x11, 8);
+  addKey("4", Four_Key, 0x12, 8);
+  addKey("DOWN", Down_Key, 0x13, 8);
+  addKey("RETURN", Exit_Key, 0x14, 8);
+  addKey("CLEAR", Clear_Key, 0x15, 8);
+  addKey("0", Zero_Key, 0x16, 8);
+  addKey("MENU", DiscMenu_Key, 0x17, 8);
+  addKey("SHUFFLE", Random_Key, 0x18, 8);
+  addKey("PROG", Program_Key, 0x19, 8);
+  addKey("GOTO", Unmapped_Key, 0x1A, 8);
+  addKey("PLAY", Play_Key, 0x1B, 8);
+  addKey("RIGHT", Right_Key, 0x1C, 8);
+  addKey("UP", Up_Key, 0x1D, 8);
+  addKey("LEFT", Left_Key, 0x1E, 8);
+  addKey("NEXT", Next_Key, 0x1F, 8);
+
+  addKey("FFWD", FastForward_Key, 0x40, 8);
+  addKey("REPEAT", Repeat_Key, 0x42, 8);
+  addKey("A-B", RepeatAB_Key, 0x43, 8);
+  addKey("PROSCAN", Unmapped_Key, 0x46, 8);
+  addKey("OSD", Info_Key, 0x47, 8);
+  addKey("SETUP", Menu_Key, 0x48, 8);
+  addKey("PAL/NTSC", Unmapped_Key, 0x49, 8);
+  addKey("PREV", Previous_Key, 0x4C, 8);
+  addKey("STOP", Stop_Key, 0x4D, 8);
+  addKey("VOL-", VolumeDown_Key, 0x4E, 8);
+
+  addKey("PAUSE", Pause_Key, 0x50, 8);
+  addKey("RWND", Rewind_Key, 0x54, 8);
+  addKey("VOL+", VolumeUp_Key, 0x55, 8);
+  addKey("ZOOM", Zoom_Key, 0x58, 8);
+  addKey("ONOFF", Power_Key, 0x59, 8);
+  addKey("MUTE", Mute_Key, 0x5C, 8);
+  addKey("FRAME", Unmapped_Key, 0x5D, 8);
+}
diff --git a/keysets/onida.h b/keysets/onida.h
new file mode 100644 (file)
index 0000000..3de7ddb
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef ONIDA_H
+#define ONIDA_H
+
+#include "pirkeysetmetadata.h"
+
+class QObject;
+
+class OnidaTV1: public PIRKeysetMetaData
+{
+public:
+  OnidaTV1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+class OnidaDVD1: public PIRKeysetMetaData
+{
+public:
+  OnidaDVD1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+#endif // ONIDA_H
index 7f359ea..b5bd7df 100644 (file)
@@ -167,6 +167,7 @@ PhilipsTV1d::PhilipsTV1d(
 
   addControlledDevice(Philips_Make, "47PFL7603D", TV_Device);
   addControlledDevice(Philips_Make, "14PT1562/00", TV_Device);
+  addControlledDevice(Philips_Make, "32PW9528/12", TV_Device);
 
   addKey("NOTE_BUTTON", Unmapped_Key, 0x1014, 13); // "Tune"
   addKey("RADIO_BUTTON", Unmapped_Key, 0x00F1, 13);
index 1b9c9a7..9ae5112 100644 (file)
@@ -657,3 +657,60 @@ SamsungAC1::SamsungAC1(
   addKey("SWING", Seven_Key, 0x94, 8);
   addKey("POWER", Power_Key, 0xFC, 8);
 }
+
+
+SamsungDVBT1::SamsungDVBT1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "DVB-T Receiver Keyset 1",
+      Samsung_Make,
+      index)
+{
+  addControlledDevice(Samsung_Make, "SMT-1000T", TV_Device);
+  addControlledDevice(Samsung_Make, "SMT-1100T", TV_Device);
+
+  threadableProtocol = new NECProtocol(guiObject, index, true, true);
+
+  setPreData(0x4040, 16);
+
+  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("power", Power_Key, 0x0A, 8);
+  addKey("up", Up_Key, 0x0B, 8);
+  addKey("mute", Mute_Key, 0x0C, 8);
+  addKey("ok", Select_Key, 0x0D, 8);
+  addKey("down", Down_Key, 0x0E, 8);
+  addKey("tv/stb", Input_Key, 0x0F, 8);
+
+  addKey("left", Left_Key, 0x10, 8);
+  addKey("right", Right_Key, 0x11, 8);
+  addKey("clock", Unmapped_Key, 0x12, 8);
+  addKey("vol+", VolumeUp_Key, 0x15, 8);
+  addKey("red", Red_Key, 0x16, 8);
+  addKey("green", Green_Key, 0x17, 8);
+  addKey("yellow", Yellow_Key, 0x18, 8);
+  addKey("blue", Blue_Key, 0x19, 8);
+  addKey("epg", Guide_Key, 0x1A, 8);
+  addKey("vol-", VolumeDown_Key, 0x1C, 8);
+  addKey("radio", TunerInput_Key, 0x1D, 8);
+  addKey("chan-", ChannelDown_Key, 0x1E, 8);
+  addKey("chan+", ChannelUp_Key, 0x1F, 8);
+
+  addKey("fav", Favorites_Key, 0x27, 8);
+
+  addKey("menu", Menu_Key, 0x40, 8);
+  addKey("exit", Exit_Key, 0x41, 8);
+  addKey("i", Info_Key, 0x42, 8);
+  addKey("rcl", PrevChannel_Key, 0x43, 8);
+  addKey("txt", Teletext_Key, 0x45, 8); // might be wrong
+  addKey("a-z", Unmapped_Key, 0x46, 8);
+}
index 323c061..27d7014 100644 (file)
@@ -173,4 +173,12 @@ public:
     unsigned int index);
 };
 
+class SamsungDVBT1: public PIRKeysetMetaData
+{
+public:
+  SamsungDVBT1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
 #endif // SAMSUNG_H
index 004a1bc..3c75da1 100644 (file)
@@ -1,5 +1,6 @@
 #include "sharp.h"
 #include "protocols/sharpprotocol.h"
+#include "protocols/necprotocol.h"
 
 SharpTV1::SharpTV1(
   QObject *guiObject,
@@ -330,3 +331,28 @@ SharpReceiver1::SharpReceiver1(
   addSharpKey("REPEAT", Repeat_Key, 0x14, 0x36);
   addSharpKey("+10", DoubleDigit_Key, 0x14, 0x38);
 }
+
+
+SharpAC1::SharpAC1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "Air Conditioner 1",
+      Sharp_Make,
+      index)
+{
+  threadableProtocol = new NECProtocol(guiObject, index, false, true);
+
+  setPreData(0xF508, 16);
+
+  addKey("Fan Faster", VolumeUp_Key, 0x01, 8);
+  addKey("Energy Save", Green_Key, 0x02, 8);
+  addKey("Fan Slower", VolumeDown_Key, 0x04, 8);
+  addKey("Timer", Sleep_Key, 0x06, 8);
+  addKey("Fan", Yellow_Key, 0x07, 8);
+  addKey("Cool", Blue_Key, 0x09, 8);
+  addKey("Temp/Timer-", ChannelDown_Key, 0x0D, 8);
+  addKey("Temp/Timer+", ChannelUp_Key, 0x0E, 8);
+  addKey("Auto/Cool", Info_Key, 0x0F, 8);
+  addKey("power", Power_Key, 0x11, 8);
+}
index a63b156..ee124b6 100644 (file)
@@ -70,4 +70,12 @@ public:
     unsigned int index);
 };
 
+class SharpAC1: public PIRKeysetMetaData
+{
+public:
+  SharpAC1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
 #endif // SHARP_H
diff --git a/keysets/vestel.cpp b/keysets/vestel.cpp
new file mode 100644 (file)
index 0000000..f7782f9
--- /dev/null
@@ -0,0 +1,114 @@
+#include "vestel.h"
+#include "protocols/rc5protocol.h"
+
+
+VestelTV1::VestelTV1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "TV Keyset 1",
+      Vestel_Make,
+      index)
+{
+  threadableProtocol = new RC5Protocol(guiObject, index);
+
+  addKey("0", Zero_Key, 0x1000, 13);
+  addKey("1", One_Key, 0x1001, 13);
+  addKey("2", Two_Key, 0x1002, 13);
+  addKey("3", Three_Key, 0x1003, 13);
+  addKey("4", Four_Key, 0x1004, 13);
+  addKey("5", Five_Key, 0x1005, 13);
+  addKey("6", Six_Key, 0x1006, 13);
+  addKey("7", Seven_Key, 0x1007, 13);
+  addKey("8", Eight_Key, 0x1008, 13);
+  addKey("9", Nine_Key, 0x1009, 13);
+  addKey("--", Dash_Key, 0x100A, 13);
+  addKey("OFF", Power_Key, 0x100C, 13);
+  addKey("mute", Mute_Key, 0x100D, 13);
+  addKey("PP", Unmapped_Key, 0x100E, 13);
+
+  addKey("VOL_p", VolumeDown_Key, 0x1010, 13);
+  addKey("VOL+m", VolumeUp_Key, 0x1011, 13);
+  addKey("info", Info_Key, 0x1012, 13);
+  addKey("left", Left_Key, 0x1015, 13);
+  addKey("right", Right_Key, 0x1016, 13);
+
+  addKey("up", Up_Key, 0x1020, 13);
+  addKey("down", Down_Key, 0x1021, 13);
+  addKey("PlP", PrevChannel_Key, 0x1022, 13);
+  addKey("i-ii", Audio_Key, 0x1023, 13);
+  addKey("c", Unmapped_Key, 0x1029, 13);
+  addKey("b", Unmapped_Key, 0x102A, 13);
+  addKey("f", Unmapped_Key, 0x102B, 13);
+  addKey("g", Unmapped_Key, 0x102C, 13);
+  addKey("d", Unmapped_Key, 0x102D, 13);
+  addKey("e", Unmapped_Key, 0x102E, 13);
+  addKey("h", Unmapped_Key, 0x102F, 13);
+
+  addKey("MENU", Menu_Key, 0x1030, 13);
+  addKey("feature", Unmapped_Key, 0x1032, 13);
+  addKey("install", Unmapped_Key, 0x1034, 13);
+  addKey("OK", Select_Key, 0x1035, 13);
+  addKey("picture", PictureMode_Key, 0x1036, 13);
+  addKey("sound", SoundMode_Key, 0x1037, 13);
+  addKey("y", Unmapped_Key, 0x1038, 13);
+  addKey("a", Unmapped_Key, 0x103C, 13);
+  addKey("x", Unmapped_Key, 0x103F, 13);
+}
+
+
+VestelTV2::VestelTV2(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "TV/DVD Keyset 2",
+      Vestel_Make,
+      index)
+{
+  threadableProtocol = new RC5Protocol(guiObject, index);
+
+  addKey("on_off", Power_Key, 0x174D, 13);
+  addKey("program_up", ChannelUp_Key, 0x1761, 13);
+  addKey("program_up", Up_Key, 0x1761, 13);
+  addKey("program_down", ChannelDown_Key, 0x1760, 13);
+  addKey("program_down", Down_Key, 0x1760, 13);
+  addKey("left", Left_Key, 0x1750, 13);
+  addKey("right", Right_Key, 0x1751, 13);
+  addKey("select", Select_Key, 0x1762, 13);
+  addKey("menu", Menu_Key, 0x174E, 13);
+  addKey("1", One_Key, 0x1752, 13);
+  addKey("2", Two_Key, 0x1743, 13);
+  addKey("3", Three_Key, 0x1742, 13);
+  addKey("4", Four_Key, 0x174A, 13);
+  addKey("5", Five_Key, 0x1746, 13);
+  addKey("6", Six_Key, 0x1745, 13);
+  addKey("7", Seven_Key, 0x1740, 13);
+  addKey("8", Eight_Key, 0x1749, 13);
+  addKey("9", Nine_Key, 0x1748, 13);
+  addKey("0", Zero_Key, 0x1747, 13);
+  addKey("--", Dash_Key, 0x1744, 13);
+  addKey("P<P", PrevChannel_Key, 0x176B, 13);
+  addKey("PP", Unmapped_Key, 0x1763, 13);
+  addKey("vol_up", VolumeUp_Key, 0x1010, 13);
+  addKey("vol_down", VolumeDown_Key, 0x1011, 13);
+  addKey("I-II", Audio_Key, 0x1770, 13);
+  addKey("mute", Mute_Key, 0x100D, 13);
+  addKey("INFO", Info_Key, 0x177F, 13);
+  addKey("red", Red_Key, 0x1776, 13);
+  addKey("green", Green_Key, 0x1772, 13);
+  addKey("yellow", Yellow_Key, 0x1778, 13);
+  addKey("blue", Blue_Key, 0x1774, 13);
+  addKey("TV", Input_Key, 0x1741, 13);
+  addKey("AV", AuxInput_Key, 0x1769, 13);
+  addKey("Teletext", Teletext_Key, 0x176A, 13);
+  addKey("Teletext_time", Unmapped_Key, 0x1777, 13);
+  addKey("unwind", Rewind_Key, 0x1756, 13);
+  addKey("wind", FastForward_Key, 0x1755, 13);
+  addKey("back", Previous_Key, 0x176C, 13);
+  addKey("next", Next_Key, 0x176D, 13);
+  addKey("play_pause", Play_Key, 0x176E, 13);
+  addKey("play_pause", Pause_Key, 0x176E, 13);
+  addKey("stop", Stop_Key, 0x176F, 13);
+  addKey("Title", DiscTitle_Key, 0x177C, 13);
+  addKey("Open_close", Eject_Key, 0x174C, 13);
+}
diff --git a/keysets/vestel.h b/keysets/vestel.h
new file mode 100644 (file)
index 0000000..b85c6e6
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef VESTEL_H
+#define VESTEL_H
+
+#include "pirkeysetmetadata.h"
+
+class QObject;
+
+class VestelTV1: public PIRKeysetMetaData
+{
+public:
+  VestelTV1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+class VestelTV2: public PIRKeysetMetaData
+{
+public:
+  VestelTV2(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+#endif // VESTEL_H
diff --git a/keysets/virgin.cpp b/keysets/virgin.cpp
new file mode 100644 (file)
index 0000000..8d5c853
--- /dev/null
@@ -0,0 +1,63 @@
+#include "virgin.h"
+#include "protocols/rc5protocol.h"
+
+
+VirginSTB1::VirginSTB1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "STB Keyset 1",
+      Virgin_Make,
+      index)
+{
+  threadableProtocol = new RC5Protocol(guiObject, index);
+
+  addKey("menu", Menu_Key, 0x028F, 13);
+  addKey("up arrow", Up_Key, 0x0290, 13);
+  addKey("down arrow", Down_Key, 0x0291, 13);
+  addKey("program guide", Guide_Key, 0x0292, 13);
+  addKey("exit", Exit_Key, 0x0293, 13);
+  addKey("left arrow", Left_Key, 0x0295, 13);
+  addKey("right arrow", Right_Key, 0x0296, 13);
+  addKey("select", Select_Key, 0x0297, 13);
+
+  addKey("teletext", Teletext_Key, 0x02AA, 13);
+  addKey("red", Red_Key, 0x02AB, 13);
+  addKey("green", Green_Key, 0x02AC, 13);
+  addKey("yellow", Yellow_Key, 0x02AD, 13);
+  addKey("blue", Blue_Key, 0x02AE, 13);
+
+  addKey("0", Zero_Key, 0x1280, 13);
+  addKey("1", One_Key, 0x1281, 13);
+  addKey("2", Two_Key, 0x1282, 13);
+  addKey("3", Three_Key, 0x1283, 13);
+  addKey("4", Four_Key, 0x1284, 13);
+  addKey("5", Five_Key, 0x1285, 13);
+  addKey("6", Six_Key, 0x1286, 13);
+  addKey("7", Seven_Key, 0x1287, 13);
+  addKey("8", Eight_Key, 0x1288, 13);
+  addKey("9", Nine_Key, 0x1289, 13);
+  addKey("power", Power_Key, 0x128C, 13);
+
+  addKey("pause", Pause_Key, 0x1293, 13);
+  addKey("Enter", Enter_Key, 0x1294, 13);
+  addKey("myshows", Unmapped_Key, 0x1295, 13);
+  addKey("thumbsup", Unmapped_Key, 0x1296, 13);
+  addKey("thumbsdown", Unmapped_Key, 0x1297, 13);
+  addKey("slow", Slow_Key, 0x1298, 13);
+  addKey("clear", Clear_Key, 0x1299, 13);
+  addKey("subtitle", Captions_Key, 0x129A, 13);
+  addKey("last_ch", PrevChannel_Key, 0x129B, 13);
+
+  addKey("channel up", ChannelUp_Key, 0x12A0, 13);
+  addKey("channel down", ChannelDown_Key, 0x12A1, 13);
+  addKey("zoom", Zoom_Key, 0x12A2, 13);
+  addKey("skip-", Previous_Key, 0x12AA, 13);
+  addKey("skip+", Next_Key, 0x12AB, 13);
+  addKey("display", Info_Key, 0x12AF, 13);
+  addKey("play", Play_Key, 0x12B0, 13);
+  addKey("rewind", Rewind_Key, 0x12B2, 13);
+  addKey("fast fwd", FastForward_Key, 0x12B4, 13);
+  addKey("stop", Stop_Key, 0x12B6, 13);
+  addKey("record", Record_Key, 0x12B7, 13);
+}
diff --git a/keysets/virgin.h b/keysets/virgin.h
new file mode 100644 (file)
index 0000000..1fcb82f
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef VIRGIN_H
+#define VIRGIN_H
+
+#include "pirkeysetmetadata.h"
+
+class QObject;
+
+class VirginSTB1: public PIRKeysetMetaData
+{
+public:
+  VirginSTB1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+#endif // VIRGIN_H
diff --git a/keysets/vizio.cpp b/keysets/vizio.cpp
new file mode 100644 (file)
index 0000000..f219a3b
--- /dev/null
@@ -0,0 +1,69 @@
+#include "vizio.h"
+#include "protocols/necprotocol.h"
+
+
+VizioTV1::VizioTV1(
+  QObject *guiObject,
+  unsigned int index)
+  : PIRKeysetMetaData(
+      "TV Keyset 1",
+      Vizio_Make,
+      index)
+{
+  threadableProtocol = new NECProtocol(guiObject, index, false, true);
+
+  setPreData(0x04, 8);
+
+  addKey("CH_UP", ChannelUp_Key, 0x00, 8);
+  addKey("CH_DWN", ChannelDown_Key, 0x01, 8);
+  addKey("VOL_UP", VolumeUp_Key, 0x02, 8);
+  addKey("VOL_DWN", VolumeDown_Key, 0x03, 8);
+  addKey("POWER", Power_Key, 0x08, 8);
+  addKey("MUTE", Mute_Key, 0x09, 8);
+  addKey("mts", Unmapped_Key, 0x0A, 8);
+  addKey("audio", Audio_Key, 0x0B, 8);
+  addKey("sleep", Sleep_Key, 0x0E, 8);
+
+  addKey("ZERO", Zero_Key, 0x10, 8);
+  addKey("ONE", One_Key, 0x11, 8);
+  addKey("TWO", Two_Key, 0x12, 8);
+  addKey("THREE", Three_Key, 0x13, 8);
+  addKey("FOUR", Four_Key, 0x14, 8);
+  addKey("FIVE", Five_Key, 0x15, 8);
+  addKey("SIX", Six_Key, 0x16, 8);
+  addKey("SEVEN", Seven_Key, 0x17, 8);
+  addKey("EIGHT", Eight_Key, 0x18, 8);
+  addKey("NINE", Nine_Key, 0x19, 8);
+  addKey("LAST", PrevChannel_Key, 0x1A, 8);
+  addKey("info", Info_Key, 0x1B, 8);
+  addKey("Guide", Guide_Key, 0x1C, 8);
+
+  addKey("INPUT", Input_Key, 0x2F, 8);
+  addKey("cc", Captions_Key, 0x39, 8);
+  addKey("zoom+", Unmapped_Key, 0x40, 8);
+  addKey("zoom-", Unmapped_Key, 0x41, 8);
+  addKey("MENU", Menu_Key, 0x43, 8);
+  addKey("ok", Select_Key, 0x44, 8);
+  addKey("UP", Up_Key, 0x45, 8);
+  addKey("DOWN", Down_Key, 0x46, 8);
+  addKey("LEFT", Left_Key, 0x47, 8);
+  addKey("RIGHT", Right_Key, 0x48, 8);
+  addKey("exit", Exit_Key, 0x49, 8);
+  addKey("AV", AuxInput_Key, 0x51, 8);
+  addKey("COMP", ComponentInput_Key, 0x5A, 8);
+
+  addKey("pip", PIP_Key, 0x60, 8);
+  addKey("pipsize", PIPSize_Key, 0x61, 8);
+  addKey("pipinput", PIPSource_Key, 0x62, 8);
+  addKey("pipch-", PIPChannelDown_Key, 0x63, 8);
+  addKey("pipch+", PIPChannelUp_Key, 0x64, 8);
+  addKey("freeze", PIPPause_Key, 0x65, 8);
+  addKey("swap", PIPSwap_Key, 0x66, 8);
+  addKey("mode", Mode_Key, 0x67, 8);
+  addKey("wide", AspectRatio_Key, 0x77, 8);
+  addKey("RGB", Unmapped_Key, 0x98, 8);
+  addKey("HDMI", HDMIInput_Key, 0xC6, 8);
+  addKey("TV", Unmapped_Key, 0xD6, 8);
+
+  addKey("DASH", Unmapped_Key, 0xFF, 8); // "enter"
+}
diff --git a/keysets/vizio.h b/keysets/vizio.h
new file mode 100644 (file)
index 0000000..56f6434
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef VIZIO_H
+#define VIZIO_H
+
+#include "pirkeysetmetadata.h"
+
+class QObject;
+
+class VizioTV1: public PIRKeysetMetaData
+{
+public:
+  VizioTV1(
+    QObject *guiObject,
+    unsigned int index);
+};
+
+#endif // VIZIO_H
index e6071bf..0b5d5a8 100644 (file)
@@ -113,7 +113,14 @@ SOURCES += main.cpp mainwindow.cpp \
     keysets/beko.cpp \
     keysets/cambridge.cpp \
     keysets/haier.cpp \
-    keysets/kenwood.cpp
+    keysets/kenwood.cpp \
+    keysets/directv.cpp \
+    protocols/directvprotocol.cpp \
+    keysets/huawei.cpp \
+    keysets/onida.cpp \
+    keysets/vestel.cpp \
+    keysets/virgin.cpp \
+    keysets/vizio.cpp
 HEADERS += mainwindow.h \
     pirkeynames.h \
     pirmakenames.h \
@@ -201,7 +208,14 @@ HEADERS += mainwindow.h \
     keysets/beko.h \
     keysets/cambridge.h \
     keysets/haier.h \
-    keysets/kenwood.h
+    keysets/kenwood.h \
+    keysets/directv.h \
+    protocols/directvprotocol.h \
+    keysets/huawei.h \
+    keysets/onida.h \
+    keysets/vestel.h \
+    keysets/virgin.h \
+    keysets/vizio.h
 FORMS += mainwindow.ui \
     pirdocumentationform.ui \
     piraboutform.ui \
index 8b4ad2f..6dfd63d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by Qt Creator 2.4.1, 2012-02-16T14:15:12. -->
+<!-- Written by Qt Creator 2.4.1, 2012-02-17T21:38:42. -->
 <qtcreator>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -78,8 +78,8 @@
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
       <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">dpkg-buildpackage -sa -S -uc -us</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/Users/john/QtSDK/Maemo/4.6.2/bin/mad</value>
-      <value type="bool" key="ProjectExplorer.ProcessStep.Enabled">false</value>
-      <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">/Users/john/Develop/n900/pierogi-0.6.5</value>
+      <value type="bool" key="ProjectExplorer.ProcessStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">/Users/john/Develop/n900/pierogi-0.6.6</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Process Step</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
        <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_0_1_armel.deb</value>
        <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_6_0_armel.deb</value>
        <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_5_2_armel.deb</value>
+       <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_6_6_armel.deb</value>
        <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_6_2_armel.deb</value>
        <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_6_4_armel.deb</value>
        <value type="QString">/Users/john/Develop/n900/pierogi-build-maemo-Qt_for_Fremantle_PR1_3_Devices__Qt_SDK__Release/pierogi_0_1_0_armel.deb</value>
        <value type="QString">192.168.0.15</value>
        <value type="QString">192.168.0.15</value>
        <value type="QString">192.168.0.15</value>
+       <value type="QString">192.168.0.15</value>
       </valuelist>
       <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedRemotePaths">
        <value type="QString"></value>
        <value type="QString"></value>
        <value type="QString"></value>
        <value type="QString"></value>
+       <value type="QString"></value>
       </valuelist>
       <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedTimes">
        <value type="QDateTime">2012-01-19T22:18:07</value>
        <value type="QDateTime">2012-02-12T23:10:44</value>
        <value type="QDateTime">2012-02-09T18:12:21</value>
        <value type="QDateTime">2012-02-14T21:02:03</value>
-       <value type="QDateTime">2012-02-15T22:43:32</value>
+       <value type="QDateTime">2012-02-16T21:50:07</value>
        <value type="QDateTime">2012-01-17T00:15:23</value>
        <value type="QDateTime">2012-01-30T20:23:06</value>
        <value type="QDateTime">2012-01-17T13:21:05</value>
        <value type="QDateTime">2012-01-01T15:35:35</value>
        <value type="QDateTime">2012-02-11T18:03:15</value>
        <value type="QDateTime">2012-02-08T20:29:28</value>
+       <value type="QDateTime">2012-02-16T22:03:28</value>
        <value type="QDateTime">2012-02-13T22:02:56</value>
        <value type="QDateTime">2012-02-14T21:42:07</value>
        <value type="QDateTime">2012-01-17T00:03:13</value>
index dae628b..57b9894 100644 (file)
@@ -14,6 +14,7 @@
 #include "keysets/daewoo.h"
 #include "keysets/denon.h"
 #include "keysets/digitalstream.h"
+#include "keysets/directv.h"
 #include "keysets/dish.h"
 #include "keysets/ei.h"
 #include "keysets/elgato.h"
@@ -25,6 +26,7 @@
 #include "keysets/hauppauge.h"
 #include "keysets/hitachi.h"
 #include "keysets/homecast.h"
+#include "keysets/huawei.h"
 #include "keysets/jvc.h"
 #include "keysets/kenwood.h"
 #include "keysets/lg.h"
@@ -33,6 +35,7 @@
 #include "keysets/mce.h"
 #include "keysets/mitsubishi.h"
 #include "keysets/nokia.h"
+#include "keysets/onida.h"
 #include "keysets/panasonic.h"
 #include "keysets/philco.h"
 #include "keysets/philips.h"
@@ -51,6 +54,9 @@
 #include "keysets/tivo.h"
 #include "keysets/topfield.h"
 #include "keysets/toshiba.h"
+#include "keysets/vestel.h"
+#include "keysets/virgin.h"
+#include "keysets/vizio.h"
 #include "keysets/wd.h"
 #include "keysets/westinghouse.h"
 #include "keysets/yamaha.h"
@@ -106,6 +112,7 @@ PIRKeysetManager::PIRKeysetManager(
   populateKeyset(new BoseRadio1(guiObject, counter++));
   populateKeyset(new BoseRadio2(guiObject, counter++));
   populateKeyset(new BoseRadio3(guiObject, counter++));
+  populateKeyset(new BoseHomeTheater1(guiObject, counter++));
 
   populateKeyset(new CambridgeCD1(guiObject, counter++));
   populateKeyset(new CambridgeAudio1(guiObject, counter++));
@@ -145,6 +152,8 @@ PIRKeysetManager::PIRKeysetManager(
 
   populateKeyset(new DigitalStreamReceiver(guiObject, counter++));
 
+  populateKeyset(new DirectvReceiver1(guiObject, counter++));
+
   populateKeyset(new DishReceiver1(guiObject, counter++));
   populateKeyset(new DishReceiver1a(guiObject, counter++));
   populateKeyset(new DishReceiver1b(guiObject, counter++));
@@ -214,6 +223,9 @@ PIRKeysetManager::PIRKeysetManager(
   populateKeyset(new HomecastReceiver1(guiObject, counter++));
   populateKeyset(new HomecastReceiver2(guiObject, counter++));
 
+  populateKeyset(new HuaweiSTB1(guiObject, counter++));
+  populateKeyset(new HuaweiSTB2(guiObject, counter++));
+
   populateKeyset(new JVCSat1(guiObject, counter++));
   populateKeyset(new JVCSat2(guiObject, counter++));
   populateKeyset(new JVCVCR1(guiObject, counter++));
@@ -279,6 +291,9 @@ PIRKeysetManager::PIRKeysetManager(
 
   populateKeyset(new NokiaGenericVCR(guiObject, counter++));
 
+  populateKeyset(new OnidaTV1(guiObject, counter++));
+  populateKeyset(new OnidaDVD1(guiObject, counter++));
+
   populateKeyset(new PanasonicCarAudio(guiObject, counter++));
   populateKeyset(new PanasonicSat1(guiObject, counter++));
   populateKeyset(new PanasonicSat1a(guiObject, counter++));
@@ -394,6 +409,7 @@ PIRKeysetManager::PIRKeysetManager(
   populateKeyset(new SamsungDVD1b(guiObject, counter++));
   populateKeyset(new SamsungDVD2(guiObject, counter++));
   populateKeyset(new SamsungAC1(guiObject, counter++));
+  populateKeyset(new SamsungDVBT1(guiObject, counter++));
 
   populateKeyset(new SanyoVCR1(guiObject, counter++));
   populateKeyset(new SanyoDVD1(guiObject, counter++));
@@ -412,6 +428,7 @@ PIRKeysetManager::PIRKeysetManager(
   populateKeyset(new SharpTV1e(guiObject, counter++));
   populateKeyset(new SharpVCR1(guiObject, counter++));
   populateKeyset(new SharpReceiver1(guiObject, counter++));
+  populateKeyset(new SharpAC1(guiObject, counter++));
 
   populateKeyset(new SkyReceiver1(guiObject, counter++));
   populateKeyset(new SkyReceiver1a(guiObject, counter++));
@@ -460,6 +477,13 @@ PIRKeysetManager::PIRKeysetManager(
   populateKeyset(new ToshibaDisc1c(guiObject, counter++));
   populateKeyset(new ToshibaDisc1d(guiObject, counter++));
 
+  populateKeyset(new VestelTV1(guiObject, counter++));
+  populateKeyset(new VestelTV2(guiObject, counter++));
+
+  populateKeyset(new VirginSTB1(guiObject, counter++));
+
+  populateKeyset(new VizioTV1(guiObject, counter++));
+
   populateKeyset(new WDMediaPlayer1(guiObject, counter++));
   populateKeyset(new WDMediaPlayer1a(guiObject, counter++));
 
index 46d097b..e04219c 100644 (file)
@@ -15,6 +15,7 @@ PIRMakeMgr::PIRMakeMgr()
   makes[Daewoo_Make] = "Daewoo";
   makes[Denon_Make] = "Denon";
   makes[DigitalStream_Make] = "Digital Stream";
+  makes[Directv_Make] = "DirecTV";
   makes[Dish_Make] = "Dish";
   makes[Ei_Make] = "Ei";
   makes[Elgato_Make] = "Elgato";
@@ -26,6 +27,7 @@ PIRMakeMgr::PIRMakeMgr()
   makes[Hauppauge_Make] = "Hauppauge";
   makes[Hitachi_Make] = "Hitachi";
   makes[Homecast_Make] = "Homecast";
+  makes[Huawei_Make] = "Huawei";
   makes[JVC_Make] = "JVC";
   makes[Kenwood_Make] = "Kenwood";
   makes[LG_Make] = "LG";
@@ -34,6 +36,7 @@ PIRMakeMgr::PIRMakeMgr()
   makes[Microsoft_Make] = "Microsoft";
   makes[Mitsubishi_Make] = "Mitsubishi";
   makes[Nokia_Make] = "Nokia";
+  makes[Onida_Make] = "Onida";
   makes[Panasonic_Make] = "Panasonic";
   makes[Philco_Make] = "Philco";
   makes[Philips_Make] = "Philips";
@@ -52,6 +55,9 @@ PIRMakeMgr::PIRMakeMgr()
   makes[Tivo_Make] = "TiVo";
   makes[Topfield_Make] = "Topfield";
   makes[Toshiba_Make] = "Toshiba";
+  makes[Vestel_Make] = "Vestel";
+  makes[Virgin_Make] = "Virgin Media";
+  makes[Vizio_Make] = "Vizio";
   makes[WD_Make] = "Western Digital";
   makes[Westinghouse_Make] = "Westinghouse";
   makes[Yamaha_Make] = "Yamaha";
index 084be3c..a7c0ffa 100644 (file)
@@ -16,6 +16,7 @@ enum PIRMakeName{
   Daewoo_Make,
   Denon_Make,
   DigitalStream_Make,
+  Directv_Make,
   Dish_Make,
   Ei_Make,
   Elgato_Make,
@@ -27,6 +28,7 @@ enum PIRMakeName{
   Hauppauge_Make,
   Hitachi_Make,
   Homecast_Make,
+  Huawei_Make,
   JVC_Make,
   Kenwood_Make,
   LG_Make,
@@ -35,6 +37,7 @@ enum PIRMakeName{
   Microsoft_Make,
   Mitsubishi_Make,
   Nokia_Make,
+  Onida_Make,
   Panasonic_Make,
   Philco_Make,
   Philips_Make,
@@ -53,6 +56,9 @@ enum PIRMakeName{
   Tivo_Make,
   Topfield_Make,
   Toshiba_Make,
+  Vestel_Make,
+  Virgin_Make,
+  Vizio_Make,
   WD_Make,
   Westinghouse_Make,
   Yamaha_Make,
diff --git a/protocols/directvprotocol.cpp b/protocols/directvprotocol.cpp
new file mode 100644 (file)
index 0000000..ee66e88
--- /dev/null
@@ -0,0 +1,283 @@
+#include "directvprotocol.h"
+
+#include "pirrx51hardware.h"
+
+#include "pirexception.h"
+#include <string>
+
+// Some global communications stuff:
+#include <QMutex>
+extern bool commandInFlight;
+extern QMutex commandIFMutex;
+
+// Directv is using a protocol that is novel to me: each pulse and space
+// encodes an entire bit in an of themselves.
+// Here are the details I've got:
+// For a 0 bit, a duration of 600 usecs is used.
+// For a 1 bit, the duration is 1200 usecs.
+// The header is a 6000 usec pulse, 1200 usec space.
+// Commands end with a trailing 600 usec pulse.
+// Commands are repeated by re-sending the entire pulse train, except that
+// the header pulse is cut in half to 3000 usec.
+// There are two different sizes of gap between commands: 9000 usec and
+// 30000 usec.
+// There are three different carrier frequencies: 38 kHz, 40 kHz, and 57 kHz.
+
+DirectvProtocol::DirectvProtocol(
+  QObject *guiObject,
+  unsigned int index,
+  DirectvFreq freq,
+  bool longGapFlag)
+  : PIRProtocol(guiObject, index, 9000, false)
+{
+  if (longGapFlag)
+  {
+    setGapSize(30000, false);
+  }
+
+  switch (freq)
+  {
+  case LowFreq:
+    setCarrierFrequency(38000);
+    break;
+
+  case MediumFreq:
+    setCarrierFrequency(40000);
+    break;
+
+  case HighFreq: default:
+    setCarrierFrequency(57000);
+    break;
+  }
+}
+
+
+void DirectvProtocol::startSendingCommand(
+  unsigned int threadableID,
+  PIRKeyName command)
+{
+  // Exceptions here are problematic; I'll try to weed them out by putting the
+  // whole thing in a try/catch block:
+  try
+  {
+    // First, check if we are meant to be the recipient of this command:
+    if (threadableID != id) return;
+
+    clearRepeatFlag();
+
+    KeycodeCollection::const_iterator i = keycodes.find(command);
+
+    // Do we even have this key defined?
+    if (i == keycodes.end())
+    {
+      std::string s = "Tried to send a non-existent command.\n";
+      throw PIRException(s);
+    }
+
+    // construct the device:
+    PIRRX51Hardware rx51device(carrierFrequency, dutyCycle);
+
+    int repeatCount = 0;
+    int commandDuration = 0;
+    while (repeatCount < MAX_REPEAT_COUNT)
+    {
+      // When repeating, we use a short-pulse header.  Otherwise, we use
+      // a long-pulse header.
+      if (repeatCount)
+      {
+        rx51device.addPair(3000, 1200);
+        commandDuration += 4200;
+      }
+      else
+      {
+        rx51device.addPair(6000, 1200);
+        commandDuration += 7200;
+      }
+
+      // Now, generate the rest of the command:
+      commandDuration += generateStandardCommand((*i).second, rx51device);
+
+      // Now, tell the device to send the whole command:
+      rx51device.sendCommandToDevice();
+
+      // sleep until the next repetition of command:
+      sleepUntilRepeat(commandDuration);
+
+      // Check whether we've reached the minimum required number of repetitons:
+      if (repeatCount >= minimumRepetitions)
+      {
+        // Check whether we've been asked to stop:
+        if (checkRepeatFlag())
+        {
+          QMutexLocker cifLocker(&commandIFMutex);
+          commandInFlight = false;
+          return;
+        }
+      }
+
+      ++repeatCount;
+    }
+  }
+  catch (PIRException e)
+  {
+    // inform the gui:
+    emit commandFailed(e.getError().c_str());
+  }
+
+  QMutexLocker cifLocker(&commandIFMutex);
+  commandInFlight = false;
+}
+
+
+int DirectvProtocol::generateStandardCommand(
+  const PIRKeyBits &pkb,
+  PIRRX51Hardware &rx51device)
+{
+  int duration = 0;
+
+  // DirecTV's protocol appears to consist of four bits of address data,
+  // eight bits of command data, and four bits of checksum data.
+  // The checksum is calculated off of the command, as so: Add up:
+  // 7 * the first two bits of the command, plus
+  // 5 * the second two bits of the command, plus
+  // 3 * the third two bits of the command, plus
+  // 1 * the last two bits of the command,
+  // then just take the last four bits of this value.
+
+  // - "preData" will contain the address
+  // - "firstCode" will contain the command
+  duration += pushDTVBits(preData, rx51device);
+  duration += pushDTVBits(pkb.firstCode, rx51device);
+
+  CommandSequence checksumBits;
+  generateChecksum(pkb.firstCode, checksumBits);
+  duration += pushDTVBits(checksumBits, rx51device);
+
+  // Finally add the "trail":
+  rx51device.addSingle(600);
+  duration += 600;
+
+  return duration;
+}
+
+
+int DirectvProtocol::pushDTVBits(
+  const CommandSequence &bits,
+  PIRRX51Hardware &rx51device)
+{
+  int duration = 0;
+  CommandSequence::const_iterator i = bits.begin();
+  while (i != bits.end())
+  {
+    if (*i)
+    {
+      // Send the value for "One":
+      rx51device.addSingle(1200);
+      duration += 1200;
+    }
+    else
+    {
+      // Send the value for "Zero":
+      rx51device.addSingle(600);
+      duration += 600;
+    }
+    ++i;
+  }
+
+  return duration;
+}
+
+
+void DirectvProtocol::generateChecksum(
+  const CommandSequence &bits,
+  CommandSequence &checksumBits)
+{
+  // We'll generate a 4-bit value based on the 8 bits of the command:
+
+  int checksumVal = 0;
+
+  CommandSequence::const_iterator i = bits.begin();
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 14;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 7;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 10;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 5;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 6;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 3;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 2;
+
+  ++i;
+
+  if (i == bits.end()) return;
+
+  if (*i) checksumVal += 1;
+
+  // Push the last four bits into the command sequence:
+  if (checksumVal & 0x8)  
+  {
+    checksumBits.push_back(1);
+  }
+  else
+  {
+    checksumBits.push_back(0);
+  }
+
+  if (checksumVal & 0x4)
+  {
+    checksumBits.push_back(1);
+  }
+  else
+  {
+    checksumBits.push_back(0);
+  }
+
+  if (checksumVal & 0x2)
+  {
+    checksumBits.push_back(1);
+  }
+  else
+  {
+    checksumBits.push_back(0);
+  }
+
+  if (checksumVal & 0x1)
+  {
+    checksumBits.push_back(1);
+  }
+  else
+  {
+    checksumBits.push_back(0);
+  }
+}
diff --git a/protocols/directvprotocol.h b/protocols/directvprotocol.h
new file mode 100644 (file)
index 0000000..e0de258
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef DIRECTVPROTOCOL_H
+#define DIRECTVPROTOCOL_H
+
+#include "pirprotocol.h"
+
+class PIRRX51Hardware;
+
+enum DirectvFreq
+{
+  LowFreq,
+  MediumFreq,
+  HighFreq
+};
+
+class DirectvProtocol: public PIRProtocol
+{
+public:
+  DirectvProtocol(
+    QObject *guiObject,
+    unsigned int index,
+    DirectvFreq freq,
+    bool longGapFlag);
+
+private:
+  void startSendingCommand(
+    unsigned int threadableID,
+    PIRKeyName command);
+
+  int generateStandardCommand(
+    const PIRKeyBits &pkb,
+    PIRRX51Hardware &rx51device);
+
+  int pushDTVBits(
+    const CommandSequence &bits,
+    PIRRX51Hardware &device);
+
+  void generateChecksum(
+    const CommandSequence &bits,
+    CommandSequence &checksumBits);
+};
+
+#endif // DIRECTVPROTOCOL_H
index 4529eae..d903d1a 100644 (file)
@@ -10,7 +10,7 @@ extern bool commandInFlight;
 extern QMutex commandIFMutex;
 
 // The JVC protocol should have the following attributes:
-// A "zero" is encoded with a 526 usec pulse, 52626 usec space.
+// A "zero" is encoded with a 526 usec pulse, 526 usec space.
 // A "one" is encoded with a 526 usec pulse, and 3*526 (1578) usec space.
 // The header is a 8400 usec pulse, 4200 usec space.
 // Commands end with a trailing 526 usec pulse.
index 09044d2..3fd0731 100644 (file)
@@ -447,3 +447,12 @@ void PIRProtocol::sleepUntilRepeat(
     throw PIRException(ss.str());
   }
 }
+
+
+void PIRProtocol::setGapSize(
+  int gapSize,
+  bool iclFlag)
+{
+  gap = gapSize;
+  isConstantLength = iclFlag;
+}
index 59f4898..21a803d 100644 (file)
@@ -154,6 +154,10 @@ protected:
   // the time between the _first_ pulse of one command and the first pulse
   // of the next.
 
+  void setGapSize(
+    int gapSize,
+    bool iclFlag);
+
   bool isConstantLength;
   int gap;
 
index bf94261..dd1519e 100644 (file)
@@ -1,3 +1,16 @@
+pierogi (0.6.7) unstable; urgency=low
+  * First pass at keysets for Huawei, Onida, Vestel, Virgin Media, and Vizio.
+  * Added a Sharp Air Conditioner keyset
+
+ -- John Pietrzak <jpietrzak8@gmail.com>  Fri, 17 Feb 2012 21:38:30 -0500
+
+pierogi (0.6.6) unstable; urgency=low
+  * I've finally cracked the DirecTV protocol; an initial keyset is now available!
+  * Added A/C keysets for LG and Panasonic, a Samsung SMT-1100T keyset, and a Bose 3-2-1 keyset.
+  * Added a donations link to the "About" menu, for those feeling generous. :)  Thank you in advance.
+
+ -- John Pietrzak <jpietrzak8@gmail.com>  Thu, 16 Feb 2012 21:51:59 -0500
+
 pierogi (0.6.5) unstable; urgency=low
   * A few more keyset added: Beko, Cambridge, Haier, and Kenwood.
 
index 13ddf9c..58975a3 100644 (file)
@@ -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: More Keysets
- Keysets have been added for Beko, Cambridge, Haier, and Kenwood.
+XB-Maemo-Upgrade-Description: Another quick Keysets update
+ This update contains a first pass at keysets for Huawei, Onida, Vestel, Virgin Media, and Vizio, as well as an A/C keyset for Sharp.
 XSBC-Bugtracker: https://garage.maemo.org/tracker/?func=add&group_id=2286&atid=7641
 XB-Maemo-Display-Name: Pierogi
 XB-Maemo-Icon-26: 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