void CANController::handleInterrupt() { uint32_t cause = MAP_CANIntStatus(_base, CAN_INT_STS_CAUSE); if (cause == CAN_INT_INTID_STATUS) // status interrupt. error occurred? { uint32_t status = getControlRegister(); // also clears the interrupt } else if ( (cause >= 1) && (cause <= 32) ) // mailbox event { //CANIntClear(_base, cause); //_isrToThreadQueue.sendToBackFromISR(cause-1); uint8_t mobId; if (_freeSwMobs.receiveFromISR(&mobId)) { tCANMsgObject *msgobj = &_swmobs[mobId]; MAP_CANMessageGet(_base, cause, msgobj, 1); if (cause < 16+1) { // RX MOB _usedSwMobs.sendToBackFromISR(mobId); } else{ // TX MOB _freeSwMobs.sendToBackFromISR(mobId); } } else { CANIntClear(_base, cause); } } }
bool CvCaptureCAM_DC1394_v2_CPP::getVidereCalibrationInfo( char* buf, int bufSize ) { int pos; for( pos = 0; pos < bufSize - 4; pos += 4 ) { uint32_t quad = getControlRegister(dcCam, 0xF0800 + pos); if( quad == 0 || quad == 0xffffffff ) break; buf[pos] = (uchar)(quad >> 24); buf[pos+1] = (uchar)(quad >> 16); buf[pos+2] = (uchar)(quad >> 8); buf[pos+3] = (uchar)(quad); } if( pos == 0 ) return false; buf[pos] = '\0'; return true; }
void CANController::execute() { while(1) { uint8_t num; while (_usedSwMobs.receive(&num, 0)) { tCANMsgObject *msgobj = &_swmobs[num]; _lastMessageReceivedTimestamp = getTime(); notifyObservers(msgobj); _freeSwMobs.sendToBack(num); } uint32_t timeToWait = sendCyclicCANMessages(); if (timeToWait>100) timeToWait = 100; _usedSwMobs.peek(&num, timeToWait); /* _isrToThreadQueue.peek(&num, timeToWait); uint32_t status = getControlRegister(); // also clears the interrupt if (status & 0xE0) { // bus off, error warning level or error passive MAP_CANDisable(_base); delay_ms(10); MAP_CANInit(_base); setBitrate(_bitrate); enableInterrupts(CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); for (int i=0; i<32; i++) { CANMessageObject *o = getMessageObject(i); o->id = 0; o->mask = 0; o->dlc = 8; o->setRxIntEnabled(i<10); o->setPartOfFIFO(i<9); o->setUseIdFilter(i<10); o->set(CAN::message_type_rx); } MAP_CANEnable(_base); } */ uint32_t status = getControlRegister(); // also clears the interrupt if (status & 0xA0) { // bus off, error warning level or error passive bool s = _silent; _silent = true; MAP_CANDisable(_base); delay_ms(10); MAP_CANInit(_base); setBitrate(_bitrate); enableInterrupts(CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); for (int i=0; i<16; i++) { tCANMsgObject msgobj; msgobj.ulMsgID = 0; msgobj.ulMsgIDMask = 0; msgobj.ulMsgLen = 8; msgobj.pucMsgData = 0; msgobj.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | ((i<15)?MSG_OBJ_FIFO:0); MAP_CANMessageSet(_base, i+1, &msgobj, MSG_OBJ_TYPE_RX); } MAP_CANEnable(_base); delay_ms(10); _silent = s; } } }