int main() { short exit=0; double error; std::cout<<"Starting"<<std::endl; if ((error=testKalmanFilter())<0.1) { std::cout<<"Test Kalman filter SUCCEEDED: estimationError = "<<error<<std::endl; } else { exit=exit | BOOST_BINARY( 1 ); std::cout<<"Test Kalman filter FAILED: estimationError = "<<error<<std::endl; } if ((error=testKalmanFilterZeroInput())<0.1) { std::cout<<"Test Kalman filter (zero input) SUCCEEDED: estimationError = "<<error<<std::endl; } else { exit=exit | BOOST_BINARY( 10 ); std::cout<<"Test Kalman filter (zero input) FAILED: estimationError = "<<error<<std::endl; } if ((error=testExtendedKalmanFilter())<0.1) { std::cout<<"Test extended Kalman filter SUCCEEDED: estimationError = "<<error<<std::endl; } else { exit=exit | BOOST_BINARY( 100 ); std::cout<<"Test extended Kalman filter FAILED: estimationError = "<<error<<std::endl; } if ((error=testExtendedKalmanFilterLTV())<0.1) { std::cout<<"Test extended Kalman filter (LTV) SUCCEEDED: estimationError = "<<error<<std::endl; } else { exit=exit | BOOST_BINARY( 1000 ); std::cout<<"Test extended Kalman filter (LTV) FAILED: estimationError = "<<error<<std::endl; } if ((error=testExtendedKalmanFilterZeroInput())<0.1) { std::cout<<"Test extended Kalman filter (zero input) SUCCEEDED: estimationError = "<<error<<std::endl; } else { exit=exit | BOOST_BINARY( 10000 ); std::cout<<"Test extended Kalman filter (zero input) FAILED: estimationError = "<<error<<std::endl<<std::endl; } std::cout<<"Test exit code "<< std::bitset< 16 >(exit) <<std::endl; return exit; }
NodeFeatures_shmlink::NodeFeatures_shmlink(const NodeInfo& info): NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); addCalCoeffChannelGroup(5, NodeEepromMap::CH_ACTION_SLOPE_5, NodeEepromMap::CH_ACTION_ID_5); addCalCoeffChannelGroup(6, NodeEepromMap::CH_ACTION_SLOPE_6, NodeEepromMap::CH_ACTION_ID_6); addCalCoeffChannelGroup(7, NodeEepromMap::CH_ACTION_SLOPE_7, NodeEepromMap::CH_ACTION_ID_7); addCalCoeffChannelGroup(8, NodeEepromMap::CH_ACTION_SLOPE_8, NodeEepromMap::CH_ACTION_ID_8); static const ChannelMask DIFFERENTIAL_CHS(BOOST_BINARY(00000111)); //ch1-ch3 static const ChannelMask DIFF_CH1(BOOST_BINARY(00000001)); //ch1 static const ChannelMask DIFF_CH2(BOOST_BINARY(00000010)); //ch2 static const ChannelMask DIFF_CH3(BOOST_BINARY(00000100)); //ch3 m_channelGroups.emplace_back(DIFFERENTIAL_CHS, "Differential Channels", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareGain, NodeEepromMap::HW_GAIN_1}} ); m_channelGroups.emplace_back(DIFF_CH1, "Differential Channel 1", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_shuntCal, NodeEepromMap::CH_ACTION_SLOPE_1}} ); m_channelGroups.emplace_back(DIFF_CH2, "Differential Channel 2", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_2}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_2}, {WirelessTypes::chSetting_shuntCal, NodeEepromMap::CH_ACTION_SLOPE_2}} ); m_channelGroups.emplace_back(DIFF_CH3, "Differential Channel 3", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_3}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_3}, {WirelessTypes::chSetting_shuntCal, NodeEepromMap::CH_ACTION_SLOPE_3}} ); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(5, WirelessChannel::channel_5, WirelessTypes::chType_acceleration); //accel x m_channels.emplace_back(6, WirelessChannel::channel_6, WirelessTypes::chType_acceleration); //accel y m_channels.emplace_back(7, WirelessChannel::channel_7, WirelessTypes::chType_acceleration); //accel z m_channels.emplace_back(8, WirelessChannel::channel_8, WirelessTypes::chType_temperature); //temp }
void UnsupportRsvdFields_r11b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); SharedWritePtr writeCmd = CreateCmd(); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "none.set", true); LOG_NRM("Set all cmd's rsvd bits"); uint32_t work = writeCmd->GetDword(0); work |= 0x00007c00; // Set DW0_b14:10 bits writeCmd->SetDword(work, 0); writeCmd->SetDword(0xffffffff, 2); writeCmd->SetDword(0xffffffff, 3); work = writeCmd->GetDword(12); work |= 0x03ff0000; // Set DW12_b25:16 bits writeCmd->SetDword(work, 12); work = writeCmd->GetDword(13); work |= 0xffffff00; // Set DW13_b31:8 bits writeCmd->SetDword(work, 13); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "all.set", true); LOG_NRM("Set DSM field reserved coded values"); uint32_t cdw13 = writeCmd->GetDword(13) & ~0xf; for (uint32_t accFreq = BOOST_BINARY(111); accFreq <= BOOST_BINARY(1111); ++accFreq) { work = cdw13 | accFreq; writeCmd->SetDword(work, 13); /* Controller may ignore context attributes */ IO::SendAndReapCmdIgnore(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "rsvd.val.set", true); } }
NodeFeatures_envlinkMini::NodeFeatures_envlinkMini(const NodeInfo& info) : NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); addCalCoeffChannelGroup(7, NodeEepromMap::CH_ACTION_SLOPE_7, NodeEepromMap::CH_ACTION_ID_7); addCalCoeffChannelGroup(8, NodeEepromMap::CH_ACTION_SLOPE_8, NodeEepromMap::CH_ACTION_ID_8); static const ChannelMask THERMOCPL_CHS(BOOST_BINARY(00000111)); //ch1 - ch3 m_channelGroups.emplace_back(THERMOCPL_CHS, "Thermocouple Channels", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_1}, {WirelessTypes::chSetting_filterSettlingTime, NodeEepromMap::FILTER_1}, {WirelessTypes::chSetting_thermocoupleType, NodeEepromMap::THERMOCPL_TYPE}} ); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_diffTemperature); //temp m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_diffTemperature); //temp m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_diffTemperature); //temp m_channels.emplace_back(7, WirelessChannel::channel_7, WirelessTypes::chType_temperature); //internal temp m_channels.emplace_back(8, WirelessChannel::channel_8, WirelessTypes::chType_rh); //% RH }
NodeFeatures_bladeImpactLink::NodeFeatures_bladeImpactLink(const NodeInfo& info): NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); //addCalCoeffChannelGroup(4, NodeEepromMap::CH_ACTION_SLOPE_4, NodeEepromMap::CH_ACTION_ID_4); static const ChannelMask CH1(BOOST_BINARY(00000001)); //ch1 static const ChannelMask CH2(BOOST_BINARY(00000010)); //ch2 static const ChannelMask CH3(BOOST_BINARY(00000100)); //ch3 m_channelGroups.emplace_back(CH1, "Accel Channel 1", ChannelGroup::SettingsMap{{WirelessTypes::chSetting_lowPassFilter, NodeEepromMap::LOW_PASS_FILTER_1}}); m_channelGroups.emplace_back(CH2, "Accel Channel 2", ChannelGroup::SettingsMap{{WirelessTypes::chSetting_lowPassFilter, NodeEepromMap::LOW_PASS_FILTER_2}}); m_channelGroups.emplace_back(CH3, "Accel Channel 3", ChannelGroup::SettingsMap{{WirelessTypes::chSetting_lowPassFilter, NodeEepromMap::LOW_PASS_FILTER_3}}); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_acceleration); //accel x m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_acceleration); //accel y m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_acceleration); //accel z //m_channels.emplace_back(4, WirelessChannel::channel_4, WirelessTypes::chType_temperature); //internal temp }
NodeFeatures_iepeLink::NodeFeatures_iepeLink(const NodeInfo& info): NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(4, NodeEepromMap::CH_ACTION_SLOPE_4, NodeEepromMap::CH_ACTION_ID_4); static const ChannelMask CH1(BOOST_BINARY(00000001)); //ch1 m_channelGroups.emplace_back(CH1, "Accel Channel 1", ChannelGroup::SettingsMap{{WirelessTypes::chSetting_antiAliasingFilter, NodeEepromMap::ANTI_ALIASING_FILTER_1}}); //Channels // Note: Channel 4 is unique in that it doesn't follow the sample rate of the node. // Instead, it is sent once every burst, with a provided sample rate of once every 24 hours. m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_acceleration); //accel m_channels.emplace_back(4, WirelessChannel::channel_4, WirelessTypes::chType_temperature); //temp }
NodeFeatures_sglinkMicro::NodeFeatures_sglinkMicro(const NodeInfo& info): NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); static const ChannelMask DIFFERENTIAL_CHS(BOOST_BINARY(00000001)); //ch1 m_channelGroups.emplace_back(DIFFERENTIAL_CHS, "Differential Channels", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_1}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_legacyShuntCal, NodeEepromMap::CH_ACTION_SLOPE_1}} ); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_temperature); //temperature }
NodeFeatures_tclink1ch::NodeFeatures_tclink1ch(const NodeInfo& info) : NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(7, NodeEepromMap::CH_ACTION_SLOPE_7, NodeEepromMap::CH_ACTION_ID_7); addCalCoeffChannelGroup(8, NodeEepromMap::CH_ACTION_SLOPE_8, NodeEepromMap::CH_ACTION_ID_8); static const ChannelMask THERMOCPL_CHS(BOOST_BINARY(00000001)); //ch1 m_channelGroups.emplace_back(THERMOCPL_CHS, "Thermocouple Channels", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareGain, NodeEepromMap::HW_GAIN_1}, {WirelessTypes::chSetting_filterSettlingTime, NodeEepromMap::FILTER_1}, {WirelessTypes::chSetting_thermocoupleType, NodeEepromMap::THERMOCPL_TYPE} } ); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_diffTemperature); //temp (thermocouple) m_channels.emplace_back(7, WirelessChannel::channel_7, WirelessTypes::chType_temperature); //cjc temp m_channels.emplace_back(8, WirelessChannel::channel_8, WirelessTypes::chType_rh); //% RH }
NodeFeatures_sglinkoemHermetic::NodeFeatures_sglinkoemHermetic(const NodeInfo& info): NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); addCalCoeffChannelGroup(4, NodeEepromMap::CH_ACTION_SLOPE_4, NodeEepromMap::CH_ACTION_ID_4); static const ChannelMask DIFFERENTIAL_CHS(BOOST_BINARY(00000001)); //ch1 m_channelGroups.emplace_back(DIFFERENTIAL_CHS, "Differential Channels", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareGain, NodeEepromMap::HW_GAIN_1}} ); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_battery); //battery m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_temperature); //temp m_channels.emplace_back(4, WirelessChannel::channel_4, WirelessTypes::chType_voltage); //voltage }
NodeFeatures_rtdlink::NodeFeatures_rtdlink(const NodeInfo& info) : NodeFeatures(info) { addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(7, NodeEepromMap::CH_ACTION_SLOPE_7, NodeEepromMap::CH_ACTION_ID_7); addCalCoeffChannelGroup(8, NodeEepromMap::CH_ACTION_SLOPE_8, NodeEepromMap::CH_ACTION_ID_8); static const ChannelMask THERMOCPL_CHS(BOOST_BINARY(00000011)); //ch1 - ch2 m_channelGroups.emplace_back(THERMOCPL_CHS, "Thermocouple Channels", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_hardwareGain, NodeEepromMap::HW_GAIN_1}, {WirelessTypes::chSetting_filterSettlingTime, NodeEepromMap::FILTER_1}} ); //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_diffTemperature); //4-wire m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_diffTemperature); //2-wire m_channels.emplace_back(7, WirelessChannel::channel_7, WirelessTypes::chType_temperature); //internal temp m_channels.emplace_back(8, WirelessChannel::channel_8, WirelessTypes::chType_rh); //% RH }
//-***************************************************************************** void WritePropertyInfo( hid_t iGroup, const std::string &iName, AbcA::PropertyType iPropertyType, const AbcA::DataType &iDataType, bool isScalarLike, uint32_t iTimeSamplingIndex, uint32_t iNumSamples, uint32_t iFirstChangedIndex, uint32_t iLastChangedIndex ) { uint32_t info[5] = {0, 0, 0, 0, 0}; uint32_t numFields = 1; static const uint32_t ptypeMask = ( uint32_t )BOOST_BINARY ( 0000 0000 0000 0000 0000 0000 0000 0011 ); static const uint32_t podMask = ( uint32_t )BOOST_BINARY ( 0000 0000 0000 0000 0000 0000 0011 1100 ); static const uint32_t hasTsidxMask = ( uint32_t )BOOST_BINARY ( 0000 0000 0000 0000 0000 0000 0100 0000 ); static const uint32_t noRepeatsMask = ( uint32_t )BOOST_BINARY ( 0000 0000 0000 0000 0000 0000 1000 0000 ); static const uint32_t extentMask = ( uint32_t )BOOST_BINARY( 0000 0000 0000 0000 1111 1111 0000 0000 ); // for compounds we just write out 0 if ( iPropertyType != AbcA::kCompoundProperty ) { // Slam the property type in there. info[0] |= ptypeMask & ( uint32_t )iPropertyType; // arrays may be scalar like, scalars are already scalar like info[0] |= ( uint32_t ) isScalarLike; uint32_t pod = ( uint32_t )iDataType.getPod(); info[0] |= podMask & ( pod << 2 ); if (iTimeSamplingIndex != 0) { info[0] |= hasTsidxMask; } if (iFirstChangedIndex == 1 && iLastChangedIndex == iNumSamples - 1) { info[0] |= noRepeatsMask; } uint32_t extent = ( uint32_t )iDataType.getExtent(); info[0] |= extentMask & ( extent << 8 ); ABCA_ASSERT( iFirstChangedIndex <= iNumSamples && iLastChangedIndex <= iNumSamples && iFirstChangedIndex <= iLastChangedIndex, "Illegal Sampling!" << std::endl << "Num Samples: " << iNumSamples << std::endl << "First Changed Index: " << iFirstChangedIndex << std::endl << "Last Changed Index: " << iLastChangedIndex << std::endl ); // Write the num samples. Only bother writing if // the num samples is greater than 1. Existence of name.smp0 // is used by the reader to determine if 0 or 1 sample. if ( iNumSamples > 1 ) { info[1] = iNumSamples; numFields ++; if ( iFirstChangedIndex > 1 || ( iLastChangedIndex != 0 && iLastChangedIndex != iNumSamples - 1 ) ) { info[2] = iFirstChangedIndex; info[3] = iLastChangedIndex; numFields += 2; } } // finally set time sampling index on the end if necessary if (iTimeSamplingIndex != 0) { info[numFields] = iTimeSamplingIndex; numFields ++; } } WriteSmallArray( iGroup, iName + ".info", H5T_STD_U32LE, H5T_NATIVE_UINT32, numFields, ( const void * ) info ); }
NodeFeatures_vlink200::NodeFeatures_vlink200(const NodeInfo& info): NodeFeatures(info) { //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(4, WirelessChannel::channel_4, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(5, WirelessChannel::channel_5, WirelessTypes::chType_singleEnded); //single ended m_channels.emplace_back(6, WirelessChannel::channel_6, WirelessTypes::chType_singleEnded); //single ended m_channels.emplace_back(7, WirelessChannel::channel_7, WirelessTypes::chType_singleEnded); //single ended m_channels.emplace_back(8, WirelessChannel::channel_8, WirelessTypes::chType_singleEnded); //single ended //Channel Groups static const ChannelMask DIFFERENTIAL_CH1(BOOST_BINARY(00000001)); //ch1 static const ChannelMask DIFFERENTIAL_CH2(BOOST_BINARY(00000010)); //ch2 static const ChannelMask DIFFERENTIAL_CH3(BOOST_BINARY(00000100)); //ch3 static const ChannelMask DIFFERENTIAL_CH4(BOOST_BINARY(00001000)); //ch4 static const ChannelMask SINGLEENDED_CH5(BOOST_BINARY(00010000)); //ch5 static const ChannelMask SINGLEENDED_CH6(BOOST_BINARY(00100000)); //ch6 static const ChannelMask SINGLEENDED_CH7(BOOST_BINARY(01000000)); //ch7 static const ChannelMask SINGLEENDED_CH8(BOOST_BINARY(10000000)); //ch8 m_channelGroups.emplace_back(DIFFERENTIAL_CH1, "Differential Channel 1", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_1}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_autoShuntCal, NodeEepromMap::CH_ACTION_SLOPE_1}, {WirelessTypes::chSetting_antiAliasingFilter, NodeEepromMap::ANTI_ALIASING_FILTER_1}} ); m_channelGroups.emplace_back(DIFFERENTIAL_CH2, "Differential Channel 2", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_2}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_2}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_2}, {WirelessTypes::chSetting_autoShuntCal, NodeEepromMap::CH_ACTION_SLOPE_2}, {WirelessTypes::chSetting_antiAliasingFilter, NodeEepromMap::ANTI_ALIASING_FILTER_2}} ); m_channelGroups.emplace_back(DIFFERENTIAL_CH3, "Differential Channel 3", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_3}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_3}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_3}, {WirelessTypes::chSetting_autoShuntCal, NodeEepromMap::CH_ACTION_SLOPE_3}, {WirelessTypes::chSetting_antiAliasingFilter, NodeEepromMap::ANTI_ALIASING_FILTER_3}} ); m_channelGroups.emplace_back(DIFFERENTIAL_CH4, "Differential Channel 4", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_4}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_4}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_4}, {WirelessTypes::chSetting_autoShuntCal, NodeEepromMap::CH_ACTION_SLOPE_4}, {WirelessTypes::chSetting_antiAliasingFilter, NodeEepromMap::ANTI_ALIASING_FILTER_4}} ); m_channelGroups.emplace_back(SINGLEENDED_CH5, "Single Ended Channel 5", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_5}} ); m_channelGroups.emplace_back(SINGLEENDED_CH6, "Single Ended Channel 6", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_6}} ); m_channelGroups.emplace_back(SINGLEENDED_CH7, "Single Ended Channel 7", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_7}} ); m_channelGroups.emplace_back(SINGLEENDED_CH8, "Single Ended Channel 8", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_8}} ); addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); addCalCoeffChannelGroup(4, NodeEepromMap::CH_ACTION_SLOPE_4, NodeEepromMap::CH_ACTION_ID_4); addCalCoeffChannelGroup(5, NodeEepromMap::CH_ACTION_SLOPE_5, NodeEepromMap::CH_ACTION_ID_5); addCalCoeffChannelGroup(6, NodeEepromMap::CH_ACTION_SLOPE_6, NodeEepromMap::CH_ACTION_ID_6); addCalCoeffChannelGroup(7, NodeEepromMap::CH_ACTION_SLOPE_7, NodeEepromMap::CH_ACTION_ID_7); addCalCoeffChannelGroup(8, NodeEepromMap::CH_ACTION_SLOPE_8, NodeEepromMap::CH_ACTION_ID_8); }
#include "named_bits.h" // ------------------------------------------------------------- // SPECIFIC CODE HERE (adapts generic code to specific needs) // // Bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 enum FBB { //--------------------|-----| | | |-----|-------- FOO= BOOST_BINARY( 0 0 0 0 0 0 0 0 0 1 0 0 ), BAR= BOOST_BINARY( 0 0 0 0 1 1 1 1 0 0 0 0 ), BAZ= BOOST_BINARY( 0 0 1 0 0 0 0 0 0 0 0 0 ), }; // BAZ-bit-^ |BAR-bits| ^-FOO-bit // ------------------------------------------------------------- // TYPICAL CLIENT SIDE CODE (making use of adapted generic code) // void xxx() { extern unsigned short ov; named_bits<FBB>::uval<BAR>(&ov, 3u); } int yyy() { extern unsigned short ov; return named_bits<FBB>::uval<BAR, unsigned short>(&ov); }
NodeFeatures_vlink::NodeFeatures_vlink(const NodeInfo& info): NodeFeatures(info) { //Channels m_channels.emplace_back(1, WirelessChannel::channel_1, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(2, WirelessChannel::channel_2, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(3, WirelessChannel::channel_3, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(4, WirelessChannel::channel_4, WirelessTypes::chType_fullDifferential); //full diff m_channels.emplace_back(5, WirelessChannel::channel_5, WirelessTypes::chType_voltage); //voltage m_channels.emplace_back(6, WirelessChannel::channel_6, WirelessTypes::chType_voltage); //voltage m_channels.emplace_back(7, WirelessChannel::channel_7, WirelessTypes::chType_voltage); //voltage m_channels.emplace_back(8, WirelessChannel::channel_8, WirelessTypes::chType_temperature); //temp //Channel Groups static const ChannelMask DIFFERENTIAL_CH1(BOOST_BINARY(00000001)); //ch1 static const ChannelMask DIFFERENTIAL_CH2(BOOST_BINARY(00000010)); //ch2 static const ChannelMask DIFFERENTIAL_CH3(BOOST_BINARY(00000100)); //ch3 static const ChannelMask DIFFERENTIAL_CH4(BOOST_BINARY(00001000)); //ch4 m_channelGroups.emplace_back(DIFFERENTIAL_CH1, "Differential Channel 1", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_1}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_1}, {WirelessTypes::chSetting_legacyShuntCal, NodeEepromMap::CH_ACTION_SLOPE_1}} ); m_channelGroups.emplace_back(DIFFERENTIAL_CH2, "Differential Channel 2", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_2}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_2}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_2}, {WirelessTypes::chSetting_legacyShuntCal, NodeEepromMap::CH_ACTION_SLOPE_2}} ); m_channelGroups.emplace_back(DIFFERENTIAL_CH3, "Differential Channel 3", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_3}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_3}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_3}, {WirelessTypes::chSetting_legacyShuntCal, NodeEepromMap::CH_ACTION_SLOPE_3}} ); m_channelGroups.emplace_back(DIFFERENTIAL_CH4, "Differential Channel 4", ChannelGroup::SettingsMap{ {WirelessTypes::chSetting_inputRange, NodeEepromMap::HW_GAIN_4}, {WirelessTypes::chSetting_hardwareOffset, NodeEepromMap::HW_OFFSET_4}, {WirelessTypes::chSetting_autoBalance, NodeEepromMap::HW_OFFSET_4}, {WirelessTypes::chSetting_legacyShuntCal, NodeEepromMap::CH_ACTION_SLOPE_4}} ); addCalCoeffChannelGroup(1, NodeEepromMap::CH_ACTION_SLOPE_1, NodeEepromMap::CH_ACTION_ID_1); addCalCoeffChannelGroup(2, NodeEepromMap::CH_ACTION_SLOPE_2, NodeEepromMap::CH_ACTION_ID_2); addCalCoeffChannelGroup(3, NodeEepromMap::CH_ACTION_SLOPE_3, NodeEepromMap::CH_ACTION_ID_3); addCalCoeffChannelGroup(4, NodeEepromMap::CH_ACTION_SLOPE_4, NodeEepromMap::CH_ACTION_ID_4); addCalCoeffChannelGroup(5, NodeEepromMap::CH_ACTION_SLOPE_5, NodeEepromMap::CH_ACTION_ID_5); addCalCoeffChannelGroup(6, NodeEepromMap::CH_ACTION_SLOPE_6, NodeEepromMap::CH_ACTION_ID_6); addCalCoeffChannelGroup(7, NodeEepromMap::CH_ACTION_SLOPE_7, NodeEepromMap::CH_ACTION_ID_7); addCalCoeffChannelGroup(8, NodeEepromMap::CH_ACTION_SLOPE_8, NodeEepromMap::CH_ACTION_ID_8); }
TEST(readBitsTest, orBits) { // NOTE!: In the binary diagrams below, the rightmost bit of each byte // is the LSB. size_t bitSize, bitOffset; char src[2]; char dest[4]; // SUBTEST: src size < 1 byte // // src = 101 // bit offset = 9 // dest = 10101010 10101010 10101010 10101010 // expected result = 10101010 11111010 10101010 10101010 bitSize = 3; bitOffset = 9; memset(src, 0x00, 2); src[0] = BOOST_BINARY(10100000); memset(dest, BOOST_BINARY(10101010), 4); std::istringstream in1(std::string(src, (bitSize + 7)/8)); readBits(in1, dest, bitSize, bitOffset, BITWISE_OR); EXPECT_EQ((char)BOOST_BINARY(10101010), dest[0]); EXPECT_EQ((char)BOOST_BINARY(11111010), dest[1]); EXPECT_EQ((char)BOOST_BINARY(10101010), dest[2]); EXPECT_EQ((char)BOOST_BINARY(10101010), dest[3]); // SUBTEST: byte-aligned with partial last byte // // src = 01010101 010 // bit offset = 8 // dest = 10101010 10101010 10101010 10101010 // expected result = 10101010 11111111 11101010 10101010 bitSize = 11; bitOffset = 8; memset(src, 0x00, 2); src[0] = BOOST_BINARY(01010101); src[1] = BOOST_BINARY(01000000); memset(dest, BOOST_BINARY(10101010), 4); std::istringstream in2(std::string(src, (bitSize + 7)/8)); readBits(in2, dest, bitSize, bitOffset, BITWISE_OR); EXPECT_EQ((char)BOOST_BINARY(10101010), dest[0]); EXPECT_EQ((char)BOOST_BINARY(11111111), dest[1]); EXPECT_EQ((char)BOOST_BINARY(11101010), dest[2]); EXPECT_EQ((char)BOOST_BINARY(10101010), dest[3]); // SUBTEST: not byte-aligned, src size > 1 byte // // src = 01010101 0101010 // bit offset = 4 // dest = 10101010 10101010 10101010 10101010 // expected result = 10101111 11111111 11101010 10101010 bitSize = 15; bitOffset = 4; memset(src, 0x00, 2); src[0] = BOOST_BINARY(01010101); src[1] = BOOST_BINARY(01010100); memset(dest, BOOST_BINARY(10101010), 4); std::istringstream in3(std::string(src, (bitSize + 7)/8)); readBits(in3, dest, bitSize, bitOffset, BITWISE_OR); EXPECT_EQ((char)BOOST_BINARY(10101111), dest[0]); EXPECT_EQ((char)BOOST_BINARY(11111111), dest[1]); EXPECT_EQ((char)BOOST_BINARY(11101010), dest[2]); EXPECT_EQ((char)BOOST_BINARY(10101010), dest[3]); }