ECode CGeckoNetworkManager::UpdateNetworkType()
{
    NetworkType previousNetworkType = mNetworkType;
    mNetworkType = GetNetworkType();

    if (mNetworkType == previousNetworkType || !mShouldNotify) {
        return NOERROR;
    }

    return GeckoAppShell::SendEventToGecko(new GeckoEvent(GetNetworkSpeed(mNetworkType),
                                              IsNetworkUsuallyMetered(mNetworkType)));
}
const Error *Node::SynchStart( void )
{
   // Ignore this for EtherCAT networks
   if( GetNetworkType() != NET_TYPE_CANOPEN )
      return 0;

   uint32 id;
   const Error *err = GetSynchId( id );
   if( !err )
      err = SetSynchId( id | 0x40000000 );
   if( err ) return err;

   RefObjLocker<CanOpen> co( GetNetworkRef() );
   if( !co ) return &NodeError::NetworkUnavailable;

   co->SetSynchProducer( nodeID );
   return 0;
}
const Error *Node::SynchStop( void )
{
   // Ignore this for EtherCAT networks
   if( GetNetworkType() != NET_TYPE_CANOPEN )
      return 0;

   uint32 id;
   const Error *err = GetSynchId( id );
   if( !err && (id&0x40000000) )
      err = SetSynchId( id & 0x3FFFFFFF );

   RefObjLocker<CanOpen> co( GetNetworkRef() );
   if( !co ) return &NodeError::NetworkUnavailable;

   if( !err && (co->GetSynchProducer() == nodeID) )
      co->SetSynchProducer(0);

   return err;
}
// Uninitialize the PDOs used to get status from the drive. 
const Error *Amp::UninitPDOs( void )
{
   const Error *err = 0;

   // If this is a secondary axis, we shouldn't have to uninit the PDOs
   if( primaryAmpRef )
   {
      return err;
   }

   // Disable all the default PDOs 
   cml.Debug( "Amp %d, Uninitting PDOs\n", GetNodeID() );
   // See if I need to uninit for multiple axes
   int16 numAxes = 1;

   if( GetNetworkType() == NET_TYPE_ETHERCAT )
   {
      err = Upld16( OBJID_AMP_INFO, 25, numAxes );
      if( err ) return err;
   }

   if (statPDO)
   {
      err = statPDO->Uninit( *this, 0, numAxes );
      if( err )
      {
         delete statPDO;
         statPDO = 0;
         return err;
      }
   }
   
   if (pvtStatPDO)
   {
      err = pvtStatPDO->Uninit( *this, 1, numAxes );
      if( err )
      {
         delete pvtStatPDO;
         pvtStatPDO = 0;
         return err;
      }
   }

   if( GetNetworkType() == NET_TYPE_ETHERCAT )
   {
      if (ctrlPDO)
      {
         err = ctrlPDO->Uninit( *this, 0, numAxes );
         if( err )
         {
            delete ctrlPDO;
            ctrlPDO = 0;
            return err;
         }
      }
   }
   else
   {
      if (pvtCtrlPDO)
      {
         err = pvtCtrlPDO->Uninit( *this, 0, numAxes );
         if( err )
         {
            delete pvtCtrlPDO;
            pvtCtrlPDO = 0;
            return err;
         }
      }
   }

   return 0;
}
// Initialize the PDOs used to get status from the drive and send control info to it.
const Error *Amp::InitPDOs( void )
{
   const Error *err = 0;

   // If this is a secondary axis, just attach to the primary axis status PDO
   if( primaryAmpRef )
   {
      RefObjLocker<Amp> pri( primaryAmpRef );
      if( !pri ) return &AmpError::NotInit;
      if( !err ) err = pri->statPDO->ConnectSubAxis( axisNum, this );
      if( !err ) err = pri->pvtStatPDO->ConnectSubAxis( axisNum, this );
      return err;
   }

   // Disable all the default PDOs 
   cml.Debug( "Amp %d, Initting PDOs\n", GetNodeID() );
   for( int i=0; i<8; i++ )
   {
      if( !err ) err = TpdoDisable( i );
      if( !err ) err = RpdoDisable( i );
   }

   // See if I need to init for multiple axes
   int16 numAxes = 1;
   if( GetNetworkType() == NET_TYPE_ETHERCAT )
   {
      err = Upld16( OBJID_AMP_INFO, 25, numAxes );
      if( err ) return err;
   }

   // Release any PDOs that were previously allocated
   FreePDOs();

   statPDO = new TPDO_Status();
   err = statPDO->Init( *this, 0, numAxes );
   if( err )
   {
      delete statPDO;
      statPDO = 0;
      return err;
   }

   pvtStatPDO = new TPDO_PvtStat();
   err = pvtStatPDO->Init( *this, 1, numAxes );
   if( err )
   {
      delete pvtStatPDO;
      pvtStatPDO = 0;
      return err;
   }

   if( GetNetworkType() == NET_TYPE_ETHERCAT )
   {
      ctrlPDO = new RPDO_Ctrl();
      err = ctrlPDO->Init( *this, 0, numAxes );
      if( err )
      {
         delete ctrlPDO;
         ctrlPDO = 0;
         return err;
      }
   }
   else
   {
      pvtCtrlPDO = new RPDO_PvtCtrl();
      err = pvtCtrlPDO->Init( *this, 0, numAxes );
      if( err )
      {
         delete pvtCtrlPDO;
         pvtCtrlPDO = 0;
         return err;
      }
   }

   return 0;
}
ECode CGeckoNetworkManager::Init()
{
    FAIL_RETURN(mNetworkFilter->AddAction(String(IConnectivityManager::CONNECTIVITY_ACTION)));
    mNetworkType = GetNetworkType();
    return NOERROR;
}