bool set(T v) { if(v==pending) return false; pending = v; ++serial; return true; }
bool commit(unsigned short s) { if(s!=serial) return false; current = pending; return true; }
+ void rollback() { pending = current; ++serial; }
operator T() const { return current; }
};
unsigned address;
unsigned bits;
ControlledVariable<unsigned> state;
+ unsigned uncertain;
unsigned target;
Msp::Time::TimeDelta active_time;
bool pop_info(MfxInfo &);
};
+ class MonitorTask: public Task
+ {
+ private:
+ float voltage;
+ float current;
+ float base_level;
+ float peak_level;
+ Msp::Time::TimeStamp next_poll;
+ unsigned next_type;
+
+ public:
+ MonitorTask();
+
+ virtual bool get_work(PendingCommand &);
+ virtual void process_reply(const char *, unsigned);
+
+ float get_voltage() const { return voltage; }
+ float get_current() const { return current; }
+ void reset_peak();
+ float get_peak() const { return peak_level-base_level; }
+ };
+
class ControlThread: public Msp::Thread
{
private:
S88Task s88;
MfxAnnounceTask mfx_announce;
MfxSearchTask mfx_search;
+ MonitorTask monitor;
ControlThread thread;
static ProtocolInfo protocol_info[2];