Пример #1
0
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);
		}
	}
}
Пример #2
0
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;
}
Пример #3
0
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;

		}

	}
}