PendingCommand cmd;
cmd.command[0] = READ_POWER_STATE;
cmd.length = 1;
- push_command(cmd);
+ command_queue.push(cmd);
cmd.command[0] = MFX_SET_STATION_ID;
cmd.command[1] = 'R';
cmd.command[3] = 'C';
cmd.command[4] = '2';
cmd.length = 5;
- push_command(cmd);
+ command_queue.push(cmd);
}
ArduControl::~ArduControl()
cmd.tag.serial = power.serial;
cmd.command[0] = (p ? POWER_ON : POWER_OFF);
cmd.length = 1;
- push_command(cmd);
+ command_queue.push(cmd);
}
}
if(loco.speed.set(speed))
{
PendingCommand cmd(loco, Locomotive::SPEED);
- push_command(cmd);
+ command_queue.push(cmd);
refresh.add_loco(loco);
}
if(loco.reverse.set(rev))
{
PendingCommand cmd(loco, Locomotive::REVERSE);
- push_command(cmd);
+ command_queue.push(cmd);
refresh.add_loco(loco);
}
if(func>0 || loco.proto!=MM)
{
PendingCommand cmd(loco, Locomotive::FUNCTIONS, func);
- push_command(cmd);
+ command_queue.push(cmd);
}
refresh.add_loco(loco);
void ArduControl::tick()
{
- while(Tag tag = pop_completed_tag())
+ Tag tag;
+ while(completed_commands.pop(tag))
{
if(tag.type==Tag::GENERAL)
{
for(i=0; (lowest_bit>>i)>1; ++i) ;
acc.state.set(acc.state^lowest_bit);
PendingCommand cmd(acc, Accessory::ACTIVATE, i);
- push_command(cmd);
+ command_queue.push(cmd);
}
else
accessory_queue.pop_front();
{
off_timeout = Time::TimeStamp();
PendingCommand cmd(*active_accessory, Accessory::DEACTIVATE);
- push_command(cmd);
+ command_queue.push(cmd);
}
}
}
{
}
-void ArduControl::push_command(const PendingCommand &cmd)
-{
- MutexLock lock(mutex);
- command_queue.push_back(cmd);
-}
-
-bool ArduControl::pop_command(PendingCommand &cmd)
-{
- MutexLock lock(mutex);
- if(command_queue.empty())
- return false;
- cmd = command_queue.front();
- command_queue.pop_front();
- return true;
-}
-
-void ArduControl::push_completed_tag(const Tag &tag)
-{
- MutexLock lock(mutex);
- completed_commands.push_back(tag);
-}
-
-ArduControl::Tag ArduControl::pop_completed_tag()
-{
- MutexLock lock(mutex);
- if(completed_commands.empty())
- return Tag();
- Tag tag = completed_commands.front();
- completed_commands.pop_front();
- return tag;
-}
-
ArduControl::Tag::Tag():
type(NONE),
}
+template<typename T>
+void ArduControl::Queue<T>::push(const T &item)
+{
+ MutexLock lock(mutex);
+ items.push_back(item);
+}
+
+template<typename T>
+bool ArduControl::Queue<T>::pop(T &item)
+{
+ MutexLock lock(mutex);
+ if(items.empty())
+ return false;
+
+ item = items.front();
+ items.pop_front();
+ return true;
+}
+
+
ArduControl::RefreshTask::RefreshTask():
next(cycle.end()),
round(0),
tag.command = Sensor::STATE;
tag.serial = i->second.state.serial;
tag.id = i->first;
- control.push_completed_tag(tag);
+ control.completed_commands.push(tag);
}
if(count>octets_remaining)
info.address = next_address;
info.name = format("%08X", bits);
info.id = bits;
- push_info(info);
+ queue.push(info);
cmd.command[0] = MFX_ASSIGN_ADDRESS;
cmd.command[1] = next_address>>8;
}
}
-void ArduControl::MfxSearchTask::push_info(const MfxInfo &info)
-{
- MutexLock lock(mutex);
- queue.push_back(info);
-}
-
bool ArduControl::MfxSearchTask::pop_info(MfxInfo &info)
{
- MutexLock lock(mutex);
- if(queue.empty())
- return false;
- info = queue.back();
- queue.pop_back();
- return true;
+ return queue.pop(info);
}
for(unsigned i=0; (success && i<cmd.repeat_count); ++i)
success = (do_command(cmd)==COMMAND_OK);
if(success && cmd.tag)
- control.push_completed_tag(cmd.tag);
+ control.completed_commands.push(cmd.tag);
}
else
Time::sleep(10*Time::msec);
bool ArduControl::ControlThread::get_work(PendingCommand &cmd)
{
- if(control.pop_command(cmd))
+ if(control.command_queue.pop(cmd))
return true;
for(vector<Task *>::iterator i=tasks.begin(); i!=tasks.end(); ++i)
tag.type = Tag::GENERAL;
tag.command = POWER;
tag.serial = control.power.serial;
- control.push_completed_tag(tag);
+ control.completed_commands.push(tag);
}
else
{
PendingCommand(Accessory &, Accessory::Command, unsigned = 0);
};
+ template<typename T>
+ class Queue
+ {
+ private:
+ std::list<T> items;
+ Msp::Mutex mutex;
+
+ public:
+ void push(const T &);
+ bool pop(T &);
+ };
+
class Task
{
protected:
unsigned size;
unsigned bits;
unsigned misses;
- std::list<MfxInfo> queue;
- Msp::Mutex mutex;
+ Queue<MfxInfo> queue;
public:
MfxSearchTask(ArduControl &);
virtual bool get_work(PendingCommand &);
virtual void process_reply(const char *, unsigned);
- private:
- void push_info(const MfxInfo &);
- public:
bool pop_info(MfxInfo &);
};
AccessoryPtrList accessory_queue;
Accessory *active_accessory;
Msp::Time::TimeStamp off_timeout;
- std::list<PendingCommand> command_queue;
- std::list<Tag> completed_commands;
SensorMap sensors;
Msp::Mutex mutex;
+ Queue<PendingCommand> command_queue;
+ Queue<Tag> completed_commands;
RefreshTask refresh;
S88Task s88;
MfxAnnounceTask mfx_announce;
virtual void tick();
virtual void flush();
-
-private:
- void push_command(const PendingCommand &);
- bool pop_command(PendingCommand &);
- void push_completed_tag(const Tag &);
- Tag pop_completed_tag();
};
} // namespace R2C2