00001
00007 #ifndef _FIREWIRE_DEVICE_H_
00008 #define _FIREWIRE_DEVICE_H_
00009
00010
00011 #include <vector>
00012 using namespace std;
00013
00014
00015 #include <qstring.h>
00016 #include <qmutex.h>
00017
00018
00019 #include "streamlisteners.h"
00020 #include "avcinfo.h"
00021
00022 class TSPacket;
00023
00024 class FirewireDevice
00025 {
00026 public:
00027
00028
00029 typedef enum
00030 {
00031 kAVCPowerOn,
00032 kAVCPowerOff,
00033 kAVCPowerUnknown,
00034 kAVCPowerQueryFailed,
00035 } PowerState;
00036
00037
00038 typedef enum
00039 {
00040 kAVCControlCommand = 0x00,
00041 kAVCStatusInquiryCommand = 0x01,
00042 kAVCSpecificInquiryCommand = 0x02,
00043 kAVCNotifyCommand = 0x03,
00044 kAVCGeneralInquiryCommand = 0x04,
00045
00046 kAVCNotImplementedStatus = 0x08,
00047 kAVCAcceptedStatus = 0x09,
00048 kAVCRejectedStatus = 0x0a,
00049 kAVCInTransitionStatus = 0x0b,
00050 kAVCImplementedStatus = 0x0c,
00051 kAVCChangedStatus = 0x0d,
00052
00053 kAVCInterimStatus = 0x0f,
00054 kAVCResponseImplemented = 0x0c,
00055 } IEEE1394Command;
00056
00057
00058 typedef enum
00059 {
00060 kAVCSubunitId0 = 0x00,
00061 kAVCSubunitId1 = 0x01,
00062 kAVCSubunitId2 = 0x02,
00063 kAVCSubunitId3 = 0x03,
00064 kAVCSubunitId4 = 0x04,
00065 kAVCSubunitIdExtended = 0x05,
00066 kAVCSubunitIdIgnore = 0x07,
00067
00068 kAVCSubunitTypeVideoMonitor = (0x00 << 3),
00069 kAVCSubunitTypeAudio = (0x01 << 3),
00070 kAVCSubunitTypePrinter = (0x02 << 3),
00071 kAVCSubunitTypeDiscRecorder = (0x03 << 3),
00072 kAVCSubunitTypeTapeRecorder = (0x04 << 3),
00073 kAVCSubunitTypeTuner = (0x05 << 3),
00074 kAVCSubunitTypeCA = (0x06 << 3),
00075 kAVCSubunitTypeVideoCamera = (0x07 << 3),
00076 kAVCSubunitTypePanel = (0x09 << 3),
00077 kAVCSubunitTypeBulletinBoard = (0x0a << 3),
00078 kAVCSubunitTypeCameraStorage = (0x0b << 3),
00079 kAVCSubunitTypeMusic = (0x0c << 3),
00080 kAVCSubunitTypeVendorUnique = (0x1c << 3),
00081 kAVCSubunitTypeExtended = (0x1e << 3),
00082 kAVCSubunitTypeUnit = (0x1f << 3),
00083 } IEEE1394UnitAddress;
00084
00085
00086 typedef enum
00087 {
00088
00089 kAVCUnitPlugInfoOpcode = 0x02,
00090 kAVCUnitDigitalOutputOpcode = 0x10,
00091 kAVCUnitDigitalInputOpcode = 0x11,
00092 kAVCUnitChannelUsageOpcode = 0x12,
00093 kAVCUnitOutputPlugSignalFormatOpcode = 0x18,
00094 kAVCUnitInputPlugSignalFormatOpcode = 0x19,
00095 kAVCUnitConnectAVOpcode = 0x20,
00096 kAVCUnitDisconnectAVOpcode = 0x21,
00097 kAVCUnitConnectionsOpcode = 0x22,
00098 kAVCUnitConnectOpcode = 0x24,
00099 kAVCUnitDisconnectOpcode = 0x25,
00100 kAVCUnitUnitInfoOpcode = 0x30,
00101 kAVCUnitSubunitInfoOpcode = 0x31,
00102 kAVCUnitSignalSourceOpcode = 0x1a,
00103 kAVCUnitPowerOpcode = 0xb2,
00104
00105
00106 kAVCCommonOpenDescriptorOpcode = 0x08,
00107 kAVCCommonReadDescriptorOpcode = 0x09,
00108 kAVCCommonWriteDescriptorOpcode = 0x0A,
00109 kAVCCommonSearchDescriptorOpcode = 0x0B,
00110 kAVCCommonObjectNumberSelectOpcode = 0x0D,
00111 kAVCCommonPowerOpcode = 0xB2,
00112 kAVCCommonReserveOpcode = 0x01,
00113 kAVCCommonPlugInfoOpcode = 0x02,
00114 kAVCCommonVendorDependentOpcode = 0x00,
00115
00116
00117 kAVCPanelPassThrough = 0x7c,
00118 } IEEE1394Opcode;
00119
00120
00121 typedef enum
00122 {
00123 kAVCPowerStateOn = 0x70,
00124 kAVCPowerStateOff = 0x60,
00125 kAVCPowerStateQuery = 0x7f,
00126 } IEEE1394UnitPowerParam0;
00127
00128 typedef enum
00129 {
00130 kAVCPanelKeySelect = 0x00,
00131 kAVCPanelKeyUp = 0x01,
00132 kAVCPanelKeyDown = 0x02,
00133 kAVCPanelKeyLeft = 0x03,
00134 kAVCPanelKeyRight = 0x04,
00135 kAVCPanelKeyRightUp = 0x05,
00136 kAVCPanelKeyRightDown = 0x06,
00137 kAVCPanelKeyLeftUp = 0x07,
00138 kAVCPanelKeyLeftDown = 0x08,
00139 kAVCPanelKeyRootMenu = 0x09,
00140 kAVCPanelKeySetupMenu = 0x0A,
00141 kAVCPanelKeyContentsMenu = 0x0B,
00142 kAVCPanelKeyFavoriteMenu = 0x0C,
00143 kAVCPanelKeyExit = 0x0D,
00144
00145 kAVCPanelKey0 = 0x20,
00146 kAVCPanelKey1 = 0x21,
00147 kAVCPanelKey2 = 0x22,
00148 kAVCPanelKey3 = 0x23,
00149 kAVCPanelKey4 = 0x24,
00150 kAVCPanelKey5 = 0x25,
00151 kAVCPanelKey6 = 0x26,
00152 kAVCPanelKey7 = 0x27,
00153 kAVCPanelKey8 = 0x28,
00154 kAVCPanelKey9 = 0x29,
00155 kAVCPanelKeyDot = 0x2A,
00156 kAVCPanelKeyEnter = 0x2B,
00157 kAVCPanelKeyClear = 0x2C,
00158
00159 kAVCPanelKeyChannelUp = 0x30,
00160 kAVCPanelKeyChannelDown = 0x31,
00161 kAVCPanelKeyPreviousChannel = 0x32,
00162 kAVCPanelKeySoundSelect = 0x33,
00163 kAVCPanelKeyInputSelect = 0x34,
00164 kAVCPanelKeyDisplayInfo = 0x35,
00165 kAVCPanelKeyHelp = 0x36,
00166 kAVCPanelKeyPageUp = 0x37,
00167 kAVCPanelKeyPageDown = 0x38,
00168
00169 kAVCPanelKeyPower = 0x40,
00170 kAVCPanelKeyVolumeUp = 0x41,
00171 kAVCPanelKeyVolumeDown = 0x42,
00172 kAVCPanelKeyMute = 0x43,
00173 kAVCPanelKeyPlay = 0x44,
00174 kAVCPanelKeyStop = 0x45,
00175 kAVCPanelKeyPause = 0x46,
00176 kAVCPanelKeyRecord = 0x47,
00177 kAVCPanelKeyRewind = 0x48,
00178 kAVCPanelKeyFastForward = 0x49,
00179 kAVCPanelKeyEject = 0x4a,
00180 kAVCPanelKeyForward = 0x4b,
00181 kAVCPanelKeyBackward = 0x4c,
00182
00183 kAVCPanelKeyAngle = 0x50,
00184 kAVCPanelKeySubPicture = 0x51,
00185
00186 kAVCPanelKeyTuneFunction = 0x67,
00187
00188 kAVCPanelKeyPress = 0x00,
00189 kAVCPanelKeyRelease = 0x80,
00190
00191 } IEEE1394PanelPassThroughParam0;
00192
00193 virtual ~FirewireDevice() { }
00194
00195
00196 virtual bool OpenPort(void) = 0;
00197 virtual bool ClosePort(void) = 0;
00198 virtual bool ResetBus(void) { return false; }
00199
00200 virtual void AddListener(TSDataListener*);
00201 virtual void RemoveListener(TSDataListener*);
00202
00203
00204 virtual bool SetPowerState(bool on);
00205 virtual bool SetChannel(const QString &panel_model,
00206 uint alt_method, uint channel);
00207
00208
00209 virtual bool IsPortOpen(void) const = 0;
00210 bool IsSTBBufferCleared(void) const { return m_buffer_cleared; }
00211
00212
00213 virtual PowerState GetPowerState(void);
00214
00215
00216 static bool IsSTBSupported(const QString &model);
00217 static QString GetModelName(uint vendorid, uint modelid);
00218 static vector<AVCInfo> GetSTBList(void);
00219
00220 protected:
00221 FirewireDevice(uint64_t guid, uint subunitid, uint speed);
00222
00223 virtual bool SendAVCCommand(const vector<uint8_t> &cmd,
00224 vector<uint8_t> &result,
00225 int retry_cnt) = 0;
00226 bool GetSubunitInfo(uint8_t table[32]);
00227
00228 void SetLastChannel(uint channel);
00229 void ProcessPATPacket(const TSPacket&);
00230 virtual void BroadcastToListeners(
00231 const unsigned char *data, uint dataSize);
00232
00233 uint64_t m_guid;
00234 uint m_subunitid;
00235 uint m_speed;
00236 uint m_last_channel;
00237 uint m_last_crc;
00238 bool m_buffer_cleared;
00239
00240 uint m_open_port_cnt;
00241 vector<TSDataListener*> m_listeners;
00242 mutable QMutex m_lock;
00243
00245 static QMap<uint64_t,QString> s_id_to_model;
00246 static QMutex s_static_lock;
00247 };
00248
00249 #endif // _FIREWIRE_DEVICE_H_