00001
00002
00003
00004 #include <qdeepcopy.h>
00005
00006
00007 #include "avcinfo.h"
00008 #include "firewiredevice.h"
00009
00010 QString guid_to_string(uint64_t guid)
00011 {
00012 QString g0 = QString("%1").arg((uint32_t) (guid >> 32), 0, 16);
00013 QString g1 = QString("%1").arg((uint32_t) guid, 0, 16);
00014
00015 while (g0.length() < 8)
00016 g0 = "0" + g0;
00017 while (g1.length() < 8)
00018 g1 = "0" + g1;
00019
00020 return QDeepCopy<QString>(g0.upper() + g1.upper());
00021 }
00022
00023 uint64_t string_to_guid(const QString &guid)
00024 {
00025
00026 QString guid_l = guid.right(8);
00027 QString guid_h = guid.left(guid.length() - 8);
00028 return (((uint64_t)guid_h.toULong(NULL, 16)) << 32 |
00029 ((uint64_t)guid_l.toULong(NULL, 16)));
00030 }
00031
00032 AVCInfo::AVCInfo() :
00033 port(-1), node(-1),
00034 guid(0), specid(0), vendorid(0), modelid(0),
00035 firmware_revision(0), product_name(QString::null)
00036 {
00037 memset(unit_table, 0xff, sizeof(unit_table));
00038 }
00039
00040 AVCInfo::AVCInfo(const AVCInfo &o) :
00041 port(o.port), node(o.node),
00042 guid(o.guid), specid(o.specid),
00043 vendorid(o.vendorid), modelid(o.modelid),
00044 firmware_revision(o.firmware_revision),
00045 product_name(QDeepCopy<QString>(o.product_name))
00046 {
00047 memcpy(unit_table, o.unit_table, sizeof(unit_table));
00048 }
00049
00050 AVCInfo &AVCInfo::operator=(const AVCInfo &o)
00051 {
00052 port = o.port;
00053 node = o.node;
00054 guid = o.guid;
00055 specid = o.specid;
00056 vendorid = o.vendorid;
00057 modelid = o.modelid;
00058 firmware_revision = o.firmware_revision;
00059 product_name = QDeepCopy<QString>(o.product_name);
00060 memcpy(unit_table, o.unit_table, sizeof(unit_table));
00061
00062 return *this;
00063 }
00064
00065 bool AVCInfo::GetSubunitInfo(void)
00066 {
00067 memset(unit_table, 0xff, 32 * sizeof(uint8_t));
00068
00069 for (uint i = 0; i < 8; i++)
00070 {
00071 vector<uint8_t> cmd;
00072 vector<uint8_t> ret;
00073
00074 cmd.push_back(FirewireDevice::kAVCStatusInquiryCommand);
00075 cmd.push_back(FirewireDevice::kAVCSubunitTypeUnit |
00076 FirewireDevice::kAVCSubunitIdIgnore);
00077 cmd.push_back(FirewireDevice::kAVCUnitSubunitInfoOpcode);
00078 cmd.push_back((i<<4) | 0x07);
00079 cmd.push_back(0xFF);
00080 cmd.push_back(0xFF);
00081 cmd.push_back(0xFF);
00082 cmd.push_back(0xFF);
00083
00084 if (!SendAVCCommand(cmd, ret, -1))
00085 return false;
00086
00087 if (ret.size() >= 8)
00088 {
00089 unit_table[(i<<2)+0] = ret[4];
00090 unit_table[(i<<2)+1] = ret[5];
00091 unit_table[(i<<2)+2] = ret[6];
00092 unit_table[(i<<2)+3] = ret[7];
00093 }
00094 }
00095
00096 return true;
00097 }
00098
00099 bool AVCInfo::IsSubunitType(int subunit_type) const
00100 {
00101 for (uint i = 0; i < 32; i++)
00102 {
00103 int subunit = unit_table[i];
00104 if ((subunit != 0xff) &&
00105 (subunit & FirewireDevice::kAVCSubunitTypeUnit) == subunit_type)
00106 {
00107 return true;
00108 }
00109 }
00110
00111 return false;
00112 }
00113
00114 QString AVCInfo::GetSubunitInfoString(void) const
00115 {
00116 QString str = "Subunit Types: ";
00117
00118 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeVideoMonitor))
00119 str += "Video Monitor, ";
00120 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeAudio))
00121 str += "Audio, ";
00122 if (IsSubunitType(FirewireDevice::kAVCSubunitTypePrinter))
00123 str += "Printer, ";
00124 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeDiscRecorder))
00125 str += "Disk Recorder, ";
00126 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeTapeRecorder))
00127 str += "Tape Recorder, ";
00128 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeTuner))
00129 str += "Tuner, ";
00130 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeCA))
00131 str += "CA, ";
00132 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeVideoCamera))
00133 str += "Camera, ";
00134 if (IsSubunitType(FirewireDevice::kAVCSubunitTypePanel))
00135 str += "Panel, ";
00136 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeBulletinBoard))
00137 str += "Bulletin Board, ";
00138 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeCameraStorage))
00139 str += "Camera Storage, ";
00140 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeMusic))
00141 str += "Music, ";
00142 if (IsSubunitType(FirewireDevice::kAVCSubunitTypeVendorUnique))
00143 str += "Vendor Unique, ";
00144
00145 return str;
00146 }