Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

l1394_fcpnode.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           l1394fcpnode.cpp  -  description
00003                              -------------------
00004     begin                : Tue Oct 24 2000
00005     copyright            : (C) 2000-2004 by Michael Repplinger
00006     email                : repplinger@cs.uni-sb.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
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 }

Generated on Wed Aug 24 00:36:40 2005 for L1394 by doxygen 1.4.2
L1394 library (NMM) grahics.cs.uni-sb.de/~repplix/l1394_home/