void TracFacilities_c::processMsg( const CanPkg_c& arc_data ) { CanPkgExt_c pkg( arc_data, getMultitonInst() ); if( !pkg.isValid() || (pkg.getMonitorItemForSA() == NULL) ) return; IsoName_c const& rcc_tempISOName = pkg.getISONameForSA(); switch (pkg.isoPgn() & 0x3FF00LU) { case TRACTOR_FACILITIES_PGN: if ( checkParseReceived (rcc_tempISOName) ) { // sender is allowed to send for (uint8_t ui8_counter = 0;ui8_counter<sizeof(arrui8_facilitiesBitData)/sizeof(uint8_t);++ui8_counter) arrui8_facilitiesBitData[ui8_counter] = pkg.getUint8Data(ui8_counter); setSelectedDataSourceISOName (rcc_tempISOName); setUpdateTime( pkg.time() ); } else { // there is a sender conflict IsoAgLib::getILibErrInstance().registerNonFatal( IsoAgLib::iLibErr_c::TracMultipleSender, getMultitonInst() ); } break; } }
void TracPTO_c::processMsg( const CanPkg_c& arc_data ) { CanPkgExt_c pkg( arc_data, getMultitonInst() ); if( !pkg.isValid() || (pkg.getMonitorItemForSA() == NULL) ) return; IsoName_c const& rcc_tempISOName = pkg.getISONameForSA(); if (((pkg.isoPgn() /*& 0x3FFFF*/) == FRONT_PTO_STATE_PGN) || ((pkg.isoPgn() /*& 0x3FFFF*/) == REAR_PTO_STATE_PGN)) { const ecutime_t ci32_now = pkg.time(); // only take values, if i am not the regular sender // and if actual sender isn't in conflict to previous sender if ( checkParseReceived( rcc_tempISOName ) ) { // sender is allowed to send PtoData_t* pt_ptoData = NULL; if (pkg.isoPgn() == FRONT_PTO_STATE_PGN) { // front PTO pt_ptoData = &mt_ptoFront; } else { // rear PTO pt_ptoData = &mt_ptoRear; } pt_ptoData->i32_lastPto = ci32_now; pt_ptoData->ui16_pto8DigitPerRpm = pkg.getUint16Data(0); pt_ptoData->ui16_ptoSetPoint8DigitPerRpm = pkg.getUint16Data(2); pt_ptoData->t_ptoEngaged = IsoAgLib::IsoActiveFlag_t( ( pkg.getUint8Data(4) >> 6) & 3 ); pt_ptoData->t_pto1000 = IsoAgLib::IsoActiveFlag_t( ( pkg.getUint8Data(4) >> 4) & 3 ); pt_ptoData->t_ptoEconomy = IsoAgLib::IsoActiveFlag_t( ( pkg.getUint8Data(4) >> 2) & 3 ); pt_ptoData->t_ptoEngagementReqStatus = IsoAgLib::IsoReqFlag_t( pkg.getUint8Data(4) & 3 ); pt_ptoData->t_ptoModeReqStatus = IsoAgLib::IsoReqFlag_t( (pkg.getUint8Data(5) >> 6) & 3 ); pt_ptoData->t_ptoEconomyModeReqStatus = IsoAgLib::IsoReqFlag_t( (pkg.getUint8Data(5) >> 4) & 3 ); pt_ptoData->t_ptoShaftSpeedLimitStatus = IsoAgLib::IsoLimitFlag_t( (pkg.getUint8Data(5) >> 1) & 0x7 ); // set last time setSelectedDataSourceISOName (rcc_tempISOName); // update time pt_ptoData->i32_lastPto = pkg.time(); // must be set because this is needed in basecommon_c setUpdateTime( pt_ptoData->i32_lastPto ); //msg from Tractor received do tell Scheduler_c next call not until 3000ms mt_task.setNextTriggerTime( pkg.time() + CONFIG_TIMEOUT_TRACTOR_DATA ); } else { // there is a sender conflict IsoAgLib::getILibErrInstance().registerNonFatal( IsoAgLib::iLibErr_c::TracMultipleSender, getMultitonInst() ); } }
TracLight_c::SendMessage_e TracLight_c::sendLightingCommand() { const ecutime_t ci32_now = System_c::getTime(); CanPkgExt_c pkg; // tractor mode if ( ( ci32_now - marr_timeStamp[m_index] ) <= 1000 ) { // WE ARE NOT ALLOWED TO SEND - EVEN IF REQUESTED return MessageNotSent; } else if ( (!mb_changeNeedBeSend) && ( (ci32_now - marr_timeStamp[(m_index+9)%10]) < 900 ) ) // (m_index+9)%10 -> youngest entry in array marr_timeStamp[]; { // to send requested (i.e. no change occured) or not yet time to repeat last command return MessageNotSent; } mb_changeNeedBeSend = false; // now it's evident, that we have to send a command pkg.setIsoPgn(LIGHTING_COMMAND_PGN); setSelectedDataSourceISOName( getIdentItem()->isoName() ); pkg.setIsoPri(3); uint16_t ui16_temp = 0; ui16_temp = (mt_cmd.implOEMOpt2 << 0) + (mt_cmd.implOEMOpt1 << 2) + (mt_cmd.implRightForwardWork << 4) + (mt_cmd.implLeftForwardWork << 6) + (mt_cmd.dataMsgReq << 8) + (mt_cmd.implRightFacingWork << 10) + (mt_cmd.implLeftFacingWork << 12) + (mt_cmd.implRearWork << 14); pkg.setUint16Data(6, ui16_temp); //overwrite the eldest time event with latest time event marr_timeStamp[m_index] = ci32_now; //set m_index to the eldest time event m_index = (m_index + 1) % 10; return helpSendMessage( pkg ); }
/** send facilities data @see TracFacilities_c::processMsgRequestPGN @see CanIo_c::operator<< */ void TracFacilities_c::sendFacilities( ) {// there is no need to check for address claim because this is already done in the processMsgRequestPGN; // this function is only be called on request!! isoaglib_assert( getIdentItem() ); IsoBus_c& c_can = getIsoBusInstance4Comm(); CanPkgExt_c pkg; pkg.setMonitorItemForSA( getIdentItem()->getIsoItem() ); setSelectedDataSourceISOName( getIdentItem()->isoName() ); pkg.setIsoPri(3); pkg.setLen(8); pkg.setIsoPgn(TRACTOR_FACILITIES_PGN); for (uint8_t ui8_counter = 0;ui8_counter<sizeof(arrui8_facilitiesBitData)/sizeof(uint8_t);++ui8_counter) pkg.setUint8Data(ui8_counter,arrui8_facilitiesBitData[ui8_counter]); // CanIo_c::operator<< retreives the information with the help of CanPkg_c::getData // then it sends the data c_can << pkg; }
void TracLight_c::processMsg( const CanPkg_c& arc_data ) { CanPkgExt_c pkg( arc_data, getMultitonInst() ); if( !pkg.isValid() || (pkg.getMonitorItemForSA() == NULL) ) return; IsoName_c const& rcc_tempISOName = pkg.getISONameForSA(); lightBitData_t* pt_data = NULL; switch (pkg.isoPgn() /*& 0x3FFFF*/) // don't need to &, we're interested in the whole PGN! { case LIGHTING_DATA_PGN: // lighting state information is sent by more than one sender -> store ALL messages with SA as key in STL_NAMESPACE::map pt_data = &(mmap_data[pkg.isoSa()]); if (pt_data != NULL) pt_data->dataMsgReq = IsoAgLib::IsoDontCare; //reserved field in lighting data break; case LIGHTING_COMMAND_PGN: // CMD is EXCLUSIVELY SENT BY ONE TRACTOR ECU!!! --> CHECK if ( checkParseReceived (rcc_tempISOName) ) { // sender is allowed to send pt_data = &mt_cmd; mt_cmd.dataMsgReq = IsoAgLib::IsoDataReq_t( pkg.getUint8Data(7) & 3 ); if (mt_cmd.dataMsgReq == IsoAgLib::IsoDataRequested) mb_cmdWait4Response = true; // set last time - use the array of send time stamps which is needed in tractor mode // in implement mode, the first item can be used to trace received tractor commands marr_timeStamp[0] = pkg.time(); setSelectedDataSourceISOName (rcc_tempISOName); setUpdateTime( pkg.time() ); } else { // there is a sender conflict IsoAgLib::getILibErrInstance().registerNonFatal( IsoAgLib::iLibErr_c::TracMultipleSender, getMultitonInst() ); } break; } if ( pt_data == NULL ) { // preconditions for parsing of this message are NOT fullfilled --> exit function with false return; } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // from here on, we can safely process the message as all preconditions are fullfilled // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ uint16_t ui16_temp = pkg.getUint16Data( 0 ); pt_data->daytimeRunning = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 0) & 3 ) ; pt_data->alternateHead = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 2) & 3 ) ; pt_data->lowBeamHead = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 4) & 3 ) ; pt_data->highBeamHead = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 6) & 3 ) ; pt_data->frontFog = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 8) & 3 ) ; pt_data->beacon = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 10) & 3 ) ; pt_data->rightTurn = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 12) & 3 ) ; pt_data->leftTurn = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 14) & 3 ) ; ui16_temp = pkg.getUint16Data( 2 ); pt_data->backUpLightAlarmHorn = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 0) & 3 ) ; pt_data->centerStop = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 2) & 3 ) ; pt_data->rightStop = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 4) & 3 ) ; pt_data->leftStop = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 6) & 3 ) ; pt_data->implClearance = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 8) & 3 ) ; pt_data->tracClearance = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 10) & 3 ) ; pt_data->implMarker = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 12) & 3 ) ; pt_data->tracMarker = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 14) & 3 ) ; ui16_temp = pkg.getUint16Data( 4 ); pt_data->rearFog = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 0) & 3 ) ; pt_data->undersideWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 2) & 3 ) ; pt_data->rearLowWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 4) & 3 ) ; pt_data->rearHighWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 6) & 3 ) ; pt_data->sideLowWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 8) & 3 ) ; pt_data->sideHighWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 10) & 3 ) ; pt_data->frontLowWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 12) & 3 ) ; pt_data->frontHighWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 14) & 3 ) ; ui16_temp = pkg.getUint16Data( 6 ); pt_data->implOEMOpt2 = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 0) & 3 ) ; pt_data->implOEMOpt1 = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 2) & 3 ) ; pt_data->implRightForwardWork =IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 4) & 3 ) ; pt_data->implLeftForwardWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 6) & 3 ) ; // pt_data->dataMsgReq is treated separately pt_data->implRightFacingWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 10) & 3 ) ; pt_data->implLeftFacingWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 12) & 3 ) ; pt_data->implRearWork = IsoAgLib::IsoActiveFlag_t( (ui16_temp >> 14) & 3 ) ; if ( mb_cmdWait4Response ) sendMessage(); }
void TracAux_c::processMsg( const CanPkg_c& arc_data ) { CanPkgExt_c pkg( arc_data, getMultitonInst() ); if( !pkg.isValid() || (pkg.getMonitorItemForSA() == NULL) ) return; IsoName_c const& rcc_tempISOName = pkg.getISONameForSA(); unsigned int valveNumber = 15; const int32_t ci32_now = pkg.time(); switch (pkg.isoPgn() /*& 0x3FFFF*/) // don't need to &, as this is the complete PGN anyway... { case AUX_VALVE_0_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_1_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_2_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_3_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_4_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_5_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_6_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_7_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_8_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_9_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_10_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_11_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_12_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_13_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_14_ESTIMATED_FLOW: valveNumber--; case AUX_VALVE_15_ESTIMATED_FLOW: if ( checkParseReceived( rcc_tempISOName ) ) { // sender is allowed to send marr_valve[valveNumber].ui8_extendPortEstFlow = pkg.getUint8Data(0); marr_valve[valveNumber].ui8_retractPortEstFlow = pkg.getUint8Data(1); marr_valve[valveNumber].ui8_estFailSaveMode = ( (pkg.getUint8Data(2) >> 6) & 3 ); marr_valve[valveNumber].ui8_estValveState = ( pkg.getUint8Data(2) & 0xF ); marr_valve[valveNumber].ui8_estValveLimitStatus = ( pkg.getUint8Data(3) >> 5); setSelectedDataSourceISOName (rcc_tempISOName); setUpdateTime( ci32_now ); } else { // there is a sender conflict IsoAgLib::getILibErrInstance().registerNonFatal( IsoAgLib::iLibErr_c::TracMultipleSender, getMultitonInst() ); } break; case AUX_VALVE_0_MEASURED_FLOW: valveNumber--; case AUX_VALVE_1_MEASURED_FLOW: valveNumber--; case AUX_VALVE_2_MEASURED_FLOW: valveNumber--; case AUX_VALVE_3_MEASURED_FLOW: valveNumber--; case AUX_VALVE_4_MEASURED_FLOW: valveNumber--; case AUX_VALVE_5_MEASURED_FLOW: valveNumber--; case AUX_VALVE_6_MEASURED_FLOW: valveNumber--; case AUX_VALVE_7_MEASURED_FLOW: valveNumber--; case AUX_VALVE_8_MEASURED_FLOW: valveNumber--; case AUX_VALVE_9_MEASURED_FLOW: valveNumber--; case AUX_VALVE_10_MEASURED_FLOW: valveNumber--; case AUX_VALVE_11_MEASURED_FLOW: valveNumber--; case AUX_VALVE_12_MEASURED_FLOW: valveNumber--; case AUX_VALVE_13_MEASURED_FLOW: valveNumber--; case AUX_VALVE_14_MEASURED_FLOW: valveNumber--; case AUX_VALVE_15_MEASURED_FLOW: if ( checkParseReceived( rcc_tempISOName ) ) { // sender is allowed to send marr_valve[valveNumber].ui8_extendPortMeasuredFlow = pkg.getUint8Data(0); marr_valve[valveNumber].ui8_retractPortMeasuredFlow = pkg.getUint8Data(1); marr_valve[valveNumber].ui16_extendPortPressure = ( static_cast<uint16_t>(pkg.getUint8Data(2)) + ( static_cast<uint16_t>(pkg.getUint8Data(3)) << 8 ) ); marr_valve[valveNumber].ui16_retractPortPressure = ( static_cast<uint16_t>(pkg.getUint8Data(4)) + ( static_cast<uint16_t>(pkg.getUint8Data(5)) << 8 ) ); marr_valve[valveNumber].ui8_returnPortPressure = pkg.getUint8Data(6); marr_valve[valveNumber].ui8_measuredValveLimitStatus = ( pkg.getUint8Data(7) >> 5 ); setSelectedDataSourceISOName (rcc_tempISOName); setUpdateTime( ci32_now ); } else { // there is a sender conflict