-- -- gcsd -- -- gcsd the generic command sequencer daemon can be used to serialize -- commands sent over various paralell communication channels to a -- single command output. It can be seen as a multiplexer for any -- kind of communication between a single resource and various clients -- which want to submit commands to it or query information from it. -- gcsd is written in C and Lua. The goal is to provide an easy to -- understand high level API based on Lua which can be used to -- implement the business logic of the so formed multiplexer daemon. -- -- -- Copyright (C) 2009-2010 Markus Grueneis -- Christian Pointner -- -- This file is part of gcsd. -- -- gcsd is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- any later version. -- -- gcsd is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with gcsd. If not, see . -- command_queue = {} command_queue.commands = {} command_queue.current = nil function command_queue:enqueue(command, expected_response, requester, timeout) if(not command) then log.printf(log.INFO, "ignoring empty command") end local new_cmd = {} new_cmd.command = command new_cmd.sent = false new_cmd.requester = requester if(expected_response and module_list.output.class.properties.type == defines.OUT_MODULE) then log.printf(log.WARNING, "output module doesn't support responses, ignoring expected response"); else new_cmd.expected_response = expected_response end if(timeout) then new_cmd.timeout = timer.new(timeout) end table.insert(self.commands, new_cmd) end function command_queue:command_pending() return (self.current == nil and #self.commands > 0) end function command_queue:get_current_command() return self.current end function command_queue:get_expected_response() if(self.current == nil) then return end return self.current.expected_response end function command_queue:get_next_command() if(self.current ~= nil) then return nil end self.current = self.commands[1] return self.current.command end function command_queue:command_sent() if(self.current == nil) then return end self.current.sent = true if(self.current.timeout) then self.current.expiration_time = timer.now() + self.current.timeout end if(self.current.expected_response) then return self.current.expected_response end if(not self.current.expiration_time) then self:command_completed() end end function command_queue:check_timeout() if(self.current == nil or not self.current.sent) then return end if(not self.current.expiration_time) then return end if(timer.cmp(timer.now(), self.current.expiration_time) == 1) then log.printf(log.NOTICE, "command timed out") if(self.current.requester) then self.current.requester:process_timeout() end self:command_completed() end end function command_queue:command_completed(response) if(self.current == nil) then return end if(response and self.current.requester) then self.current.requester:process_response(response) end table.remove(self.commands, 1) self.current = nil end