static int spear_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { struct spear_adc_info *info = iio_priv(indio_dev); u32 status; switch (mask) { case IIO_CHAN_INFO_RAW: mutex_lock(&indio_dev->mlock); status = CHANNEL_NUM(chan->channel) | AVG_SAMPLE(info->avg_samples) | START_CONVERSION | ADC_ENABLE; if (info->vref_external == 0) status |= VREF_INTERNAL; spear_adc_set_status(info, status); wait_for_completion(&info->completion); /* set by ISR */ *val = info->value; mutex_unlock(&indio_dev->mlock); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: *val = info->vref_external; *val2 = DATA_BITS; return IIO_VAL_FRACTIONAL_LOG2; } return -EINVAL; }
/*运算式配置变更*/ void DevChannelMath::slotChanConfigChanged() { m_sampleCount = 0; m_sample_moving.clear(); m_math_DelayUpper = 0; m_math_DelayDowner = 0; if (p_expAnalysis) { delete p_expAnalysis; p_expAnalysis = NULL; } //表达式初始化 if (m_pConfig->expressConfig.expSwtich) { QByteArray expArray((const char *)m_pConfig->expressConfig.expExpression); if (expArray.isEmpty()) { p_expAnalysis = NULL; } else { p_expAnalysis = new MathExpAnalysis(CHANNEL_NUM(m_chanCoder), expArray); if (p_expAnalysis) { if (!p_expAnalysis->isExpValid()) { delete p_expAnalysis; p_expAnalysis = NULL; } } else { qDebug("Error: Mem alloc Failed[%s]\n", __func__); } } } else { p_expAnalysis = NULL; } }
/* Interpret a control-byte */ void max111x_write(void *opaque, uint32_t value) { struct max111x_s *s = (struct max111x_s *) opaque; int measure, chan; /* Ignore the value if START bit is zero */ if (!(value & CB_START)) return; s->cycle = 0; if (!(value & CB_PD1)) { s->tb1 = 0; return; } s->tb1 = value; if (s->inputs == 8) chan = CHANNEL_NUM(value, 1, 0, 2); else chan = CHANNEL_NUM(value & ~CB_SEL0, 0, 1, 2); if (value & CB_SGL) measure = s->input[chan] - s->com; else measure = s->input[chan] - s->input[chan ^ 1]; if (!(value & CB_UNI)) measure ^= 0x80; s->rb2 = (measure >> 2) & 0x3f; s->rb3 = (measure << 6) & 0xc0; if (s->interrupt) qemu_irq_raise(s->interrupt); }
/* Interpret a control-byte */ static void max111x_write(MAX111xState *s, uint32_t value) { int measure, chan; /* Ignore the value if START bit is zero */ if (!(value & CB_START)) return; s->cycle = 0; if (!(value & CB_PD1)) { s->tb1 = 0; return; } s->tb1 = value; if (s->inputs == 8) chan = CHANNEL_NUM(value, 1, 0, 2); else chan = CHANNEL_NUM(value & ~CB_SEL0, 0, 1, 2); if (value & CB_SGL) measure = s->input[chan] - s->com; else measure = s->input[chan] - s->input[chan ^ 1]; if (!(value & CB_UNI)) measure ^= 0x80; s->rb2 = (measure >> 2) & 0x3f; s->rb3 = (measure << 6) & 0xc0; /* FIXME: When should the IRQ be lowered? */ qemu_irq_raise(s->interrupt); }
DevChannelMath::DevChannelMath(quint32 chanCoder, QObject *parent) : Channel(chanCoder, parent) { MODBUS_REGISTER_MAP *pModbusRegMap; quint16 chanType, uninNum, moduleIndex, number; chanType = CHANNEL_TYPE(m_chanCoder); //通道类型 uninNum = CHANNEL_UNIT(m_chanCoder); //单元号 moduleIndex = CHANNEL_MODULE(m_chanCoder); //卡槽号 number = CHANNEL_NUM(m_chanCoder) - 1; //通道号 Q_ASSERT(chanType==Channel_Type_Math && uninNum==0 && moduleIndex==0 && number<MAIN_UNIT_MATH_CHAN_NUM_PRE); pModbusRegMap = const_cast<MODBUS_REGISTER_MAP*>(static_cast<MODBUS_REGISTER_MAP const *>(DevShareMem.constData())); m_pData = (float *)&pModbusRegMap->inputReg_MainUnit_Math_Data_Float32[number<<1]; m_pStatus = &pModbusRegMap->inputReg_MainUnit_Math_Status_Int16[number]; m_pConfig = &DevConfigPtr->chanMath[number]; p_calculateData = (float *)&g_originDataMap.inputReg_MainUnit_Math_Data_Float32[number<<1]; p_chanStatus = &g_originDataMap.inputReg_MainUnit_Math_Status_Int16[number]; //表达式初始化 if (m_pConfig->expressConfig.expSwtich) { QByteArray expArray((const char *)m_pConfig->expressConfig.expExpression); if (expArray.isEmpty()) { p_expAnalysis = NULL; } else { p_expAnalysis = new MathExpAnalysis(number+1, expArray); if (p_expAnalysis) { if (!p_expAnalysis->isExpValid()) { delete p_expAnalysis; p_expAnalysis = NULL; } } else { qDebug("Error: Mem alloc Failed[%s]\n", __func__); } } } else { p_expAnalysis = NULL; } m_sampleCount = 0; m_math_DelayUpper = 0; m_math_DelayDowner = 0; }