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