// -------------------------- // Constructor for 4 modules // -------------------------- EncoderSSI_apci1710_board::EncoderSSI_apci1710_board( unsigned int mNr1, unsigned int mNr2, unsigned int mNr3, unsigned int mNr4 ) : PeriodicActivity(RTT::OS::HighestPriority, 1./ORONUM_DEVICE_DRIVERS_APCI1710_SSI_UPDATE ) , nr_of_modules(3), moduleNr1( mNr1 ), moduleNr2( mNr2 ), moduleNr3( mNr3 ), moduleNr4( mNr4 ) { buffer1 = new unsigned int[12]; buffer2 = new unsigned int[12]; readbuffer = buffer1; writebuffer = buffer2; log() << "(EncoderSSI_apci1710) Creating EncoderSSI..." << endlog(Info); dev = apci1710_get_device(); int res = 0; if ( 0 != (res = apci1710_ssi_init( dev, moduleNr1, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_PROFILE, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_POSITION_BITS, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_TURN_BITS, COUNTINGMODE_BINARY, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_FREQ ) ) ) //in Hz (25kHz is ok) log() << "\n(EncoderSSI_apci1710) Error "<< res << " : Module " << moduleNr1 << " is not ready for SSI\n" << endlog(Error); if ( 0 != (res = apci1710_ssi_init( dev, moduleNr2, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_PROFILE, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_POSITION_BITS, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_TURN_BITS, COUNTINGMODE_BINARY, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_FREQ ) ) ) //in Hz (25kHz is ok) log() << "\n(EncoderSSI_apci1710) Error "<< res << " : Module " << moduleNr2 << " is not ready for SSI\n" << endlog(Error); if ( 0 != (res = apci1710_ssi_init( dev, moduleNr3, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_PROFILE, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_POSITION_BITS, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_TURN_BITS, COUNTINGMODE_BINARY, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_FREQ ) ) ) //in Hz (25kHz is ok) log() << "\n(EncoderSSI_apci1710) Error "<< res << " : Module " << moduleNr3 << " is not ready for SSI\n" << endlog(Error); if ( 0 != (res = apci1710_ssi_init( dev, moduleNr4, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_PROFILE, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_POSITION_BITS, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_TURN_BITS, COUNTINGMODE_BINARY, ORONUM_DEVICE_DRIVERS_APCI1710_SSI_FREQ ) ) ) //in Hz (25kHz is ok) log() << "\n(EncoderSSI_apci1710) Error "<< res << " : Module " << moduleNr4 << " is not ready for SSI\n" << endlog(Error); #ifdef OROPKG_CORELIB_TIMING // init one buffer, display some statistics TimeService::ticks t=TimeService::Instance()->getTicks(); readCard( readbuffer ); t = TimeService::Instance()->ticksSince(t); TimeService::nsecs n = TimeService::ticks2nsecs(t); log() << "(EncoderSSI_apci1710) Reading SSI modules takes about " << long(n) << " nanoseconds" << endlog(Info); #endif this->start(); }
void EncoderSSI_apci1710_board::step() { readCard( writebuffer ); switchBuffers(); }
//清空链表中数据,已保存文件和链表中的数据同步 int getCard() { int nCount = 0; //卡信息数 int i = 0; Card* pCard = NULL; IpCardNode node = NULL; IpCardNode cur = NULL; //清除链表中已存在的数据,并初始化 if (cardList != NULL) { releaseCardList(); } initCardList(); //获取卡信息个数 nCount = getCardCount(CARDPATH); //动态分配内存保存卡信息 pCard = (Card*)malloc(sizeof(Card) * nCount); if (pCard == NULL) { return FALSE; } //如果返回FALSE,表示读取卡信息失败 if (FALSE == readCard(pCard, CARDPATH)) { free(pCard); pCard = NULL; return FALSE; } //node->next = NULL; for (i = 0, node = cardList; i < nCount; i++) { if (i == 0) { node->data = pCard[i]; node->next = NULL; } else { //为节点分配内存 cur = (IpCardNode)malloc(sizeof(CardNode)); //如果分配内存失败,则返回 if (cur == NULL) { free(pCard); return FALSE; } //初始化新的空间,全部赋值为零 memset(cur, 0, sizeof(CardNode)); //将卡信息保存到节点中 cur->data = pCard[i]; cur->next = NULL; //将节点添加到链表结尾 node->next = cur; node = cur; } } //free(cur); free(pCard); pCard = NULL; return TRUE; }