Changeset 197

Show
Ignore:
Timestamp:
05/16/06 10:29:09 (17 years ago)
Author:
pieterpalmers
Message:

- implemented first steps of MOTU device discovery

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libfreebob-motu/libfreebob/freebob.h

    r185 r197  
    2828#define FREEBOB_BOUNCE_SERVER_VENDORNAME  "FreeBoB Server" 
    2929#define FREEBOB_BOUNCE_SERVER_MODELNAME   "freebob-server" 
     30 
     31#define FREEBOB_BOUNCE_SERVER_GETXMLDESCRIPTION_CMD 
     32#define AVC1394_SUBUNIT_TYPE_FREEBOB_BOUNCE_SERVER      0x0D 
    3033 
    3134enum freebob_direction { 
  • branches/libfreebob-motu/src/bounce/bounce_avdevice.cpp

    r185 r197  
    3030#include <string> 
    3131#include <stdint.h> 
     32#include <iostream> 
     33#include <netinet/in.h> 
    3234 
    3335namespace Bounce { 
     
    5355BounceDevice::~BounceDevice() 
    5456{ 
    55  
     57        delete m_configRom; 
    5658} 
    5759 
     
    6567BounceDevice::discover() 
    6668{ 
    67     std::string vendor = std::string(FREEBOB_BOUNCE_SERVER_VENDORNAME); 
    68     std::string model = std::string(FREEBOB_BOUNCE_SERVER_MODELNAME); 
     69        unsigned int resp_len=0; 
     70        quadlet_t request[6]; 
     71        quadlet_t *resp; 
    6972 
    70     if (m_configRom->getVendorName().compare(0,vendor.length(),vendor,0,vendor.length())==0) { 
    71         if(m_configRom->getModelName().compare(0,model.length(),model,0,model.length())==0) { 
    72             return true; 
    73         } 
    74     } 
    75     return false; 
     73        std::string vendor=std::string(FREEBOB_BOUNCE_SERVER_VENDORNAME); 
     74        std::string model=std::string(FREEBOB_BOUNCE_SERVER_MODELNAME); 
     75         
     76        if (!(m_configRom->getVendorName().compare(0,vendor.length(),vendor,0,vendor.length())==0) 
     77            || !(m_configRom->getModelName().compare(0,model.length(),model,0,model.length())==0)) { 
     78                return false; 
     79        } 
     80 
     81// AVC1394_COMMAND_INPUT_PLUG_SIGNAL_FORMAT 
     82        request[0] = htonl( AVC1394_CTYPE_STATUS | (AVC1394_SUBUNIT_TYPE_FREEBOB_BOUNCE_SERVER << 19) | (0 << 16) 
     83                        | AVC1394_COMMAND_INPUT_PLUG_SIGNAL_FORMAT | 0x00); 
     84 
     85        request[1] =  0xFFFFFFFF; 
     86        resp = m_1394Service->transactionBlock( m_nodeId, 
     87                                                       request, 
     88                                                       2, 
     89                                                               &resp_len ); 
     90//      hexDump((unsigned char *)request,6*4); 
     91        if(resp) { 
     92                char *buffer=(char *)&resp[1]; 
     93                xmlDescription=buffer; 
     94//              hexDump((unsigned char *)resp,6*4); 
     95        } 
     96 
     97        return true; 
    7698} 
    7799 
     
    86108{ 
    87109    printf( "\nI am the bouncedevice, the bouncedevice I am...\n" ); 
    88     printf( "Vendor :  %s\n", m_configRom->getVendorName().c_str()); 
    89     printf( "Model  :  %s\n", m_configRom->getModelName().c_str()); 
    90     printf( "GUID   :  0x%016llX\n", m_configRom->getGuid()); 
     110    printf( "Vendor            :  %s\n", m_configRom->getVendorName().c_str()); 
     111    printf( "Model             :  %s\n", m_configRom->getModelName().c_str()); 
     112    printf( "Node              :  %d\n", m_nodeId); 
     113    printf( "GUID              :  0x%016llX\n", m_configRom->getGuid()); 
     114    printf( "ACV test response :  %s\n", xmlDescription.c_str()); 
    91115    printf( "\n" ); 
    92116} 
     
    95119BounceDevice::addXmlDescription( xmlNodePtr deviceNode ) 
    96120{ 
     121 
     122        xmlDocPtr doc; 
     123        xmlNodePtr cur; 
     124        xmlNodePtr copy; 
     125 
     126        doc = xmlParseFile("freebob_bouncedevice.xml"); 
     127         
     128        if (doc == NULL ) { 
     129                debugError( "freebob_bouncedevice.xml not parsed successfully. \n"); 
     130                return false; 
     131        } 
     132         
     133        cur = xmlDocGetRootElement(doc); 
     134         
     135        if (cur == NULL) { 
     136                debugError( "empty document\n"); 
     137                xmlFreeDoc(doc); 
     138                return false; 
     139        } 
     140         
     141        if (xmlStrcmp(cur->name, (const xmlChar *) "FreeBobBounceDevice")) { 
     142                debugError( "document of the wrong type, root node != FreeBobBounceDevice\n"); 
     143                xmlFreeDoc(doc); 
     144                return false; 
     145        } 
     146         
     147        cur = cur->xmlChildrenNode; 
     148        while (cur != NULL) { 
     149                char *result; 
     150                 
     151                copy=xmlCopyNode(cur,1); 
     152                 
     153//              debugOutput(DEBUG_LEVEL_NORMAL,"copying %s\n",cur->name); 
     154                 
     155                 
     156                if (!copy || !xmlAddChild(deviceNode, copy)) { 
     157                        debugError( "could not add child node\n"); 
     158                        cur = cur->next; 
     159                        continue; 
     160                } 
     161                 
     162                // add the node id 
     163//              if (xmlStrcmp(copy->name, (const xmlChar *) "ConnectionSet")) { 
     164//                      asprintf( &result, "%d",  m_nodeId); 
     165//                      if ( !xmlNewChild( copy,  0, 
     166//                            BAD_CAST "Node",  BAD_CAST result ) ) { 
     167//                                    debugError( "Couldn't create 'Node' node\n" ); 
     168//                                    return false; 
     169//                                    free(result); 
     170//                      } 
     171//                      free(result); 
     172//              } 
     173                 
     174                cur = cur->next; 
     175        } 
     176         
     177        xmlFreeDoc(doc); 
     178 
    97179    return true; 
    98180} 
  • branches/libfreebob-motu/src/bounce/bounce_avdevice.h

    r185 r197  
    2929#include "libfreebobavc/avc_extended_cmd_generic.h" 
    3030#include "libfreebob/xmlparser.h" 
     31#include "libfreebob/freebob_bounce.h" 
    3132 
    3233class ConfigRom; 
     
    5455    int              m_verboseLevel; 
    5556 
     57private: 
     58        std::string xmlDescription; 
     59 
     60 
    5661    DECLARE_DEBUG_MODULE; 
    5762}; 
  • branches/libfreebob-motu/src/configrom.cpp

    r185 r197  
    354354    return m_vendorName; 
    355355} 
     356 
     357const unsigned int 
     358ConfigRom::getModelId() const 
     359{ 
     360    return m_modelId; 
     361} 
     362 
     363const unsigned int 
     364ConfigRom::getVendorId() const 
     365{ 
     366    return m_vendorId; 
     367} 
  • branches/libfreebob-motu/src/configrom.h

    r185 r197  
    4444    const std::string getModelName() const; 
    4545    const std::string getVendorName() const; 
    46  
     46    const unsigned int getModelId() const; 
     47    const unsigned int getVendorId() const; 
    4748 
    4849 protected: 
  • branches/libfreebob-motu/src/devicemanager.cpp

    r188 r197  
    3030#include "bebob_light/bebob_light_avdevice.h" 
    3131#include "bounce/bounce_avdevice.h" 
     32#include "motu/motu_avdevice.h" 
    3233 
    3334#include <iostream> 
     
    4041    : m_1394Service( 0 ) 
    4142{ 
    42     m_probeList.push_back( probeBeBoB ); 
    43     m_probeList.push_back( probeBounce ); 
     43    m_probeList.push_back( probeMotu ); 
     44//     m_probeList.push_back( probeBeBoB ); 
     45     m_probeList.push_back( probeBounce ); 
    4446} 
    4547 
     
    137139    IAvDevice* avDevice = new BeBoB_Light::AvDevice( service, id, level ); 
    138140    if ( !avDevice ) { 
    139         return 0
     141        return NULL
    140142    } 
    141143 
    142144    if ( !avDevice->discover() ) { 
    143145        delete avDevice; 
    144         return 0
     146        return NULL
    145147    } 
    146148    return avDevice; 
     
    152154    IAvDevice* avDevice = new Bounce::BounceDevice( service, id, level ); 
    153155    if ( !avDevice ) { 
    154         return 0
     156        return NULL
    155157    } 
    156158 
    157159    if ( !avDevice->discover() ) { 
    158160        delete avDevice; 
    159         return 0; 
     161        return NULL; 
     162    } 
     163    return avDevice; 
     164
     165 
     166IAvDevice* 
     167DeviceManager::probeMotu(Ieee1394Service& service, int id, int level) 
     168
     169    IAvDevice* avDevice = new Motu::MotuDevice( service, id, level ); 
     170    if ( !avDevice ) { 
     171        return NULL; 
     172    } 
     173 
     174    if ( !avDevice->discover() ) { 
     175        delete avDevice; 
     176        return NULL; 
    160177    } 
    161178    return avDevice; 
  • branches/libfreebob-motu/src/devicemanager.h

    r185 r197  
    5959    static IAvDevice* probeBeBoB(Ieee1394Service& service, int id, int level); 
    6060    static IAvDevice* probeBounce(Ieee1394Service& service, int id, int level); 
     61    static IAvDevice* probeMotu(Ieee1394Service& service, int id, int level); 
    6162 
    6263protected: 
  • branches/libfreebob-motu/src/freebob.cpp

    r186 r197  
    1 /* freebob.h 
     1/* freebob.cpp 
    22 * Copyright (C) 2005 Pieter Palmers, Daniel Wagner 
    33 * 
  • branches/libfreebob-motu/src/Makefile.am

    r188 r197  
    5252        bebob_light/bebob_light_avplug.cpp              \ 
    5353        bounce/bounce_avdevice.h                        \ 
    54         bounce/bounce_avdevice.cpp 
     54        bounce/bounce_avdevice.cpp                      \ 
     55        motu/motu_avdevice.h                            \ 
     56        motu/motu_avdevice.cpp 
    5557 
    5658libfreebob_la_LDFLAGS = -version-info $(LT_VERSION) -lpthread $(LIBSIGC_LIBS) \ 
  • branches/libfreebob-motu/tests/freebob-server.c

    r185 r197  
    3737#include <libavc1394/rom1394.h> 
    3838 
     39#include "../libfreebob/freebob.h" 
     40#include "../libfreebob/freebob_bounce.h" 
     41 
    3942const char not_compatible[] = "\n" 
    4043        "This libraw1394 does not work with your version of Linux. You need a different\n" 
     
    4750 
    4851 
    49 unsigned char g_signal_mode = 0x05; // SD 525-60, TODO: get from media 
    50 unsigned char g_transport_mode = AVC1394_VCR_CMD_WIND; 
    51 unsigned char g_transport_state = AVC1394_VCR_OPERAND_WIND_STOP; 
    52  
    5352static int g_done = 0; 
    5453 
     
    6463        switch ( cr->opcode ) 
    6564        { 
    66         case AVC1394_VCR_CMD_PLAY: 
    67                 switch ( cr->operand[0] ) 
    68                 { 
    69                 case AVC1394_VCR_OPERAND_PLAY_FORWARD: 
    70                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    71                         g_transport_state = AVC1394_VCR_OPERAND_PLAY_FORWARD; 
    72                         cr->status = AVC1394_RESP_ACCEPTED; 
    73                         printf("PLAY FORWARD\n"); 
    74                         break; 
     65        default: 
     66                fprintf( stderr, "subunit control command 0x%02x non supported\n", cr->opcode ); 
     67                return 0; 
     68        } 
     69        return 1; 
     70
     71 
     72int subunit_status( avc1394_cmd_rsp *cr ) 
     73
     74 
     75        fprintf( stderr, "subunit STATUS\n"); 
     76        char *buffer; 
     77        switch ( cr->opcode ) 
     78        { 
     79        case (AVC1394_CMD_INPUT_PLUG_SIGNAL_FORMAT): 
     80 
     81                cr->status = AVC1394_RESP_STABLE; 
     82                buffer=(char*)&cr->operand[1]; 
     83                fprintf( stderr, "subunit AVC1394_COMMAND_INPUT_PLUG_SIGNAL_FORMAT\n"); 
    7584                 
    76                 case AVC1394_VCR_OPERAND_PLAY_FASTEST_FORWARD: 
    77                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    78                         g_transport_state = AVC1394_VCR_OPERAND_PLAY_FASTEST_FORWARD; 
    79                         cr->status = AVC1394_RESP_ACCEPTED; 
    80                         printf("PLAY FASTEST FORWARD\n"); 
    81                         break; 
    82                  
    83                 case AVC1394_VCR_OPERAND_PLAY_REVERSE_PAUSE: 
    84                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    85                         g_transport_state = cr->operand[0]; 
    86                         cr->status = AVC1394_RESP_ACCEPTED; 
    87                         printf("PAUSE PLAY\n"); 
    88                         break; 
    89                  
    90                 case AVC1394_VCR_OPERAND_PLAY_REVERSE: 
    91                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    92                         g_transport_state = AVC1394_VCR_OPERAND_PLAY_REVERSE; 
    93                         cr->status = AVC1394_RESP_ACCEPTED; 
    94                         printf("PLAY REVERSE\n"); 
    95                         break; 
    96  
    97                 case AVC1394_VCR_OPERAND_PLAY_FASTEST_REVERSE: 
    98                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    99                         g_transport_state = AVC1394_VCR_OPERAND_PLAY_FASTEST_REVERSE; 
    100                         cr->status = AVC1394_RESP_ACCEPTED; 
    101                         printf("PLAY FASTEST REVERSE\n"); 
    102                         break; 
    103                  
    104                 case AVC1394_VCR_OPERAND_PLAY_NEXT_FRAME: 
    105                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    106                         g_transport_state = cr->operand[0]; 
    107                         cr->status = AVC1394_RESP_ACCEPTED; 
    108                         printf("PLAY NEXT FRAME\n"); 
    109                         break; 
    110                  
    111                 case AVC1394_VCR_OPERAND_PLAY_PREVIOUS_FRAME: 
    112                         g_transport_mode = AVC1394_GET_OPCODE( AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY ); 
    113                         g_transport_state = cr->operand[0]; 
    114                         cr->status = AVC1394_RESP_ACCEPTED; 
    115                         printf("PLAY PREVIOUS FRAME\n"); 
    116                         break; 
    117                  
    118                 default: 
    119                         fprintf( stderr, "play mode 0x%02x non supported\n", cr->operand[0] ); 
    120                         return 0; 
    121                 } 
     85                strncpy(buffer,"TEST123",sizeof(byte_t)*9); 
    12286                break; 
    123  
    124         default: 
    125                 fprintf( stderr, "subunit control command 0x%02x non supported\n", cr->opcode ); 
    126                 return 0; 
    127         } 
    128         return 1; 
    129 } 
    130  
    131  
    132 int subunit_status( avc1394_cmd_rsp *cr ) 
    133 { 
    134         switch ( cr->opcode ) 
    135         { 
    136         case AVC1394_VCR_CMD_OUTPUT_SIGNAL_MODE: 
    137                 cr->status = AVC1394_RESP_STABLE; 
    138                 cr->operand[0] = g_signal_mode; 
    139                 break; 
    14087        default: 
    14188                fprintf( stderr, "subunit status command 0x%02x not supported\n", cr->opcode ); 
     
    15097        switch ( cr->opcode ) 
    15198        { 
    152         case AVC1394_VCR_CMD_PLAY: 
    153         case AVC1394_VCR_CMD_RECORD: 
    154         case AVC1394_VCR_CMD_WIND: 
    155         case AVC1394_VCR_CMD_OUTPUT_SIGNAL_MODE: 
    156         case AVC1394_VCR_CMD_INPUT_SIGNAL_MODE: 
    157         case AVC1394_VCR_CMD_TRANSPORT_STATE: 
    158         case AVC1394_VCR_CMD_TIME_CODE: 
    159         case AVC1394_VCR_CMD_MEDIUM_INFO: 
    160                 cr->status = AVC1394_RESP_IMPLEMENTED; 
    161                 return 1; 
    16299        default: 
    163100                fprintf( stderr, "subunit inquiry command 0x%02x not supported\n", cr->opcode ); 
     
    183120int unit_status( avc1394_cmd_rsp *cr ) 
    184121{ 
    185         cr->operand[1] = 0xff
    186         cr->operand[2] = 0xff
    187         cr->operand[3] = 0xff
    188         cr->operand[4] = 0xff
     122        cr->operand[1] = 0x00
     123        cr->operand[2] = 0x00
     124        cr->operand[3] = 0x00
     125        cr->operand[4] = 0x00
    189126        switch ( cr->opcode ) 
    190127        { 
     
    192129                cr->status = AVC1394_RESP_STABLE; 
    193130                cr->operand[0] = AVC1394_OPERAND_UNIT_INFO_EXTENSION_CODE; 
    194                 cr->operand[1] = AVC1394_SUBUNIT_TYPE_TAPE_RECORDER >> 19; 
     131                cr->operand[1] = AVC1394_SUBUNIT_TYPE_FREEBOB_BOUNCE_SERVER >> 19; 
    195132                break; 
    196133        case AVC1394_CMD_SUBUNIT_INFO: 
     
    201138                        cr->status = AVC1394_RESP_STABLE; 
    202139                        cr->operand[0] = (page << 4) | AVC1394_OPERAND_UNIT_INFO_EXTENSION_CODE; 
    203                         cr->operand[1] = AVC1394_SUBUNIT_TYPE_TAPE_RECORDER >> 19 << 3; 
     140                        cr->operand[1] = AVC1394_SUBUNIT_TYPE_FREEBOB_BOUNCE_SERVER >> 19 << 3; 
    204141                } 
    205142 
     
    239176        switch ( cr->subunit_type ) 
    240177        { 
    241         case AVC1394_SUBUNIT_TAPE_RECORDER: 
     178        case AVC1394_SUBUNIT_TYPE_FREEBOB_BOUNCE_SERVER: 
    242179                if ( cr->subunit_id != 0 ) 
    243180                { 
     
    353290        /* change the vendor description for kicks */ 
    354291        i = strlen(dir.textual_leafs[0]); 
    355         strncpy(dir.textual_leafs[0], "FreeBob Server                            ", i); 
     292        strncpy(dir.textual_leafs[0], FREEBOB_BOUNCE_SERVER_VENDORNAME "                                          ", i); 
    356293        retval = rom1394_set_directory(rom, &dir); 
    357294        printf("rom1394_set_directory returned %d, romsize %d:",retval,rom_size); 
     
    369306        dir.unit_spec_id    = 0x0000a02d; 
    370307        dir.unit_sw_version = 0x00010001; 
    371         leaf = "freebob-server"
     308        leaf = FREEBOB_BOUNCE_SERVER_MODELNAME
    372309        dir.nr_textual_leafs = 1; 
    373310        dir.textual_leafs = &leaf; 
  • branches/libfreebob-motu/tests/test-freebob.c

    r185 r197  
    2222 
    2323#include "libfreebob/freebob.h" 
     24#include "libfreebob/freebob_bounce.h" 
    2425 
    2526#include <argp.h>