00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "l1394_fcpnode.h"
00019 #include "l1394_card.h"
00020 #include "l1394_nodefactory.h"
00021
00022 namespace L1394{
00023 using namespace internal;
00024 FcpNode::FcpNode(const u_int32_t node_id, const Card* parent)
00025 : Node(node_id, parent)
00026 {
00027 message->debugStream() << "FcpNode > Create FcpNode " << endl;
00028
00029 readGuid();
00030
00031 setNodeType(_FcpNode);
00032
00033 rom_info = new CsrRom(this);
00034
00035 device_array = new Device*[8];
00036 subunit_count = 0;
00037 for (int i = 0; i < 8; i++)
00038 device_array[i] = NULL;
00039
00040 createSubunitList();
00041
00042 dv_iso_handler = raw1394_new_handle();
00043 if (!dv_iso_handler)
00044 message->errorStream() << "Invalid raw1394handle" << endl;
00045
00046 if (raw1394_set_port(dv_iso_handler, getCardID()) < 0)
00047 {
00048 message->errorStream() << "FcpNode > couldn't set card number for iso handler" << endl;
00049 }
00050
00051 dv_iso = new internal::DvIso(this, dv_iso_handler);
00052 message->debugStream() << "FcpNode < Create FcpNode " << endl;
00053
00054 }
00055
00056 FcpNode::~FcpNode()
00057 {
00058 getEventObject()->call(NODE_DESTROY);
00059 for ( u_int32_t i = 0; i< subunit_count; i++)
00060 delete device_array[i];
00061 delete [] device_array;
00062 delete rom_info;
00063 }
00064
00065 Quadlet FcpNode::send(const Quadlet& q) const
00066 {
00067 Quadlet response = getParentCard()->requestTransaction()->send( q, getNodeID() );
00068
00069 getParentCard()->releaseTransaction();
00070
00071 return response;
00072 }
00073
00074
00075 QArray FcpNode::send(const QArray& q) const
00076 {
00077 QArray response = getParentCard()->requestTransaction()->send( q, getNodeID() );
00078
00079 getParentCard()->releaseTransaction();
00080
00081 return response;
00082 }
00083
00084
00085 const char* FcpNode::decode(const Quadlet& t) const
00086 {
00087 switch(t.getByte(0))
00088 {
00089 case 0x8: return "Not Implemented "; break;
00090 case 0x9: return "Accepted "; break;
00091 case 0xa: return "Rejected "; break;
00092 case 0xb: return "In Transition "; break;
00093 case 0xc: return "Implemented/Stable "; break;
00094 case 0xd: return "Changed "; break;
00095 case 0xf: return "Interim "; break;
00096 default : return "Unknown response "; break;
00097 }
00098 }
00099
00100
00101 QArray FcpNode::getSubunitInfo(int table)
00102 {
00103 QArray tmp_qarray(2);
00104 tmp_qarray.insert(0x01FF3107+0x10*table, 0);
00105 tmp_qarray.insert(0xFFFFFFFF, 1);
00106 cout << tmp_qarray << endl;
00107 return send(tmp_qarray);
00108 }
00109
00110
00111
00112 QArray FcpNode::getUnitInfo() {
00113 QArray tmp_qarray(2);
00114
00115 tmp_qarray.insert(0x01ff30ff,0);
00116 tmp_qarray.insert(0xffffffff,1);
00117
00118 return send(tmp_qarray);
00119 }
00120
00121 void FcpNode::createSubunitList() {
00122 QArray my_block(2);
00123 NodeFactory* node_factory = NodeFactory::getNodeFactory();
00124 int su_value;
00125 for (int i = 0; i < 8; i++) {
00126 my_block = getSubunitInfo(i);
00127 cout << "> Subunit Info of Table " << i << endl;
00128 cout << my_block;
00129 cout << "< Subunit Info of Table " << i << endl << endl;
00130
00131 if ( (my_block.getByte(0) == 0x0c) && (my_block.getByte(3) == 0x07+0x10*i)) {
00132 for(unsigned int j = 0; j< 4; j++) {
00133 su_value = my_block.getByte(4+j);
00134 if (su_value != 0xff) {
00135 device_array[subunit_count] = node_factory->createDevice(this, su_value);
00136 if (device_array != 0) {
00137 addDevice(device_array[subunit_count]);
00138 subunit_count++;
00139 }
00140 }
00141 }
00142 }
00143 }
00144 }
00145
00146 Device* FcpNode::findSubunit(int type) const {
00147 for(int i = 0; i<8; i++) {
00148 if (device_array[i] != NULL)
00149 if(device_array[i]->getDeviceType() == type)
00150 return device_array[i];
00151 }
00152 message->debugStream() << "FcpNode > No such subunit on this Node" << endl;
00153 return NULL;
00154 }
00155
00156
00157 const char* FcpNode::subunit_type[] =
00158 {
00159 "Video Monitor",
00160 "<reserved>",
00161 "<reserved>",
00162 "Disc recorder/player",
00163 "Tape recorder/player",
00164 "Tuner",
00165 "<reserved>",
00166 "Video Camera",
00167 "<reserved>",
00168 "<reserved>",
00169 "<reserved>",
00170 "<reserved>",
00171 "<reserved>",
00172 "<reserved>",
00173 "<reserved>",
00174 "<reserved>",
00175 "<reserved>",
00176 "<reserved>",
00177 "<reserved>",
00178 "<reserved>",
00179 "<reserved>",
00180 "<reserved>",
00181 "<reserved>",
00182 "<reserved>",
00183 "<reserved>",
00184 "<reserved>",
00185 "<reserved>",
00186 "<reserved>",
00187 "Vendor Unique",
00188 "All Subunit Types",
00189 "Subunit Type extended to next byte",
00190 "Unit"
00191 } ;
00192
00193 }