diff --git a/src/main.lua b/src/main.lua index 4701e8e..501b753 100644 --- a/src/main.lua +++ b/src/main.lua @@ -254,16 +254,12 @@ local function main(environment) elseif rq:getRequestMethod() == 'CMDLINE' and rq:get('signin') ~= nil then log:info(MOD_ABBR, "Running in signin mode") - local ds = wifi.getDeviceState() - log:info(MOD_ABBR, " wifi deviceState.mode: "..util.dump(ds.mode)) - if ds.mode == "sta" then - log:info(MOD_ABBR, " attempting signin") - local success,msg = Signin.signin() - if success then - log:info(MOD_ABBR, "Signin successful") - else - log:warning(MOD_ABBR, "Signin failed: "..util.dump(msg)) - end + log:info(MOD_ABBR, " attempting signin") + local success,msg = Signin.signin() + if success then + log:info(MOD_ABBR, "Signin successful") + else + log:warning(MOD_ABBR, "Signin failed: "..util.dump(msg)) end elseif rq:getRequestMethod() ~= 'CMDLINE' or confDefaults.DEBUG_API then -- Note: the commented log statement will print too many data if it's for instance dumping a gcode add request @@ -280,8 +276,7 @@ local function main(environment) if err ~= nil then log:error(MOD_ABBR, err) end response:send() - - response:executePostResponseQueue() + response:executePostResponseQueue() else log:info(MOD_ABBR, "Nothing to do...bye.\n") end diff --git a/src/network/netconfig.lua b/src/network/netconfig.lua index 7863377..f9f7ff8 100644 --- a/src/network/netconfig.lua +++ b/src/network/netconfig.lua @@ -409,6 +409,7 @@ function M.associateSsid(ssid, passphrase, recreate) return true end + --- Disassociate wlan device as client from all SSID's. -- Note: this function might belong in the wlanconfig module but that would introduce -- a circular dependency, easiest solution is to place the function here. diff --git a/src/network/signin.lua b/src/network/signin.lua index 6576d95..4ed7b93 100644 --- a/src/network/signin.lua +++ b/src/network/signin.lua @@ -28,15 +28,21 @@ local SIGNING_IN_STATUS = 2 --- Signin to connect.doodle3d.com server -- function M.signin() - - --log:verbose(MOD_ABBR, "signin:signin"); + log:verbose(MOD_ABBR, "signin:signin"); local code, msg = M.getStatus() --log:verbose(MOD_ABBR, " status: "..utils.dump(code).." "..utils.dump(msg)); -- if we are already signin in, skip if(code == SIGNING_IN_STATUS) then - log:verbose(MOD_ABBR, " skipping signin") + log:verbose(MOD_ABBR, " already signing in, skipping") + return + end + + local ds = wifi.getDeviceState() + log:verbose(MOD_ABBR, " wifi deviceState.mode: "..utils.dump(ds.mode)) + if ds.mode ~= "sta" then + log:verbose(MOD_ABBR, " wifi not in station mode, skipping signin") return end diff --git a/src/rest/api/api_info.lua b/src/rest/api/api_info.lua index 2a57df3..5e07d37 100644 --- a/src/rest/api/api_info.lua +++ b/src/rest/api/api_info.lua @@ -160,7 +160,7 @@ function M.access(request, response) response:setSuccess() response:addData('has_control', hasControl) - return true + return end function M.status(request, response) diff --git a/src/rest/api/api_printer.lua b/src/rest/api/api_printer.lua index 40704ca..faafad8 100644 --- a/src/rest/api/api_printer.lua +++ b/src/rest/api/api_printer.lua @@ -5,6 +5,7 @@ -- @license This software is licensed under the terms of the GNU GPL v2 or later. -- See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. +-- TODO: return errors like in print_POST (error message in a 'msg' key instead of directly in the response) if this does not break API compatibility local lfs = require('lfs') local log = require('util.logger') @@ -28,7 +29,7 @@ end function M.temperature(request, response) local argId = request:get("id") local printer,msg = printerUtils.createPrinterOrFail(argId, response) - if not printer or not printer:hasSocket() then return false end + if not printer or not printer:hasSocket() then return end local temperatures,msg = printer:getTemperatures() @@ -39,18 +40,18 @@ function M.temperature(request, response) response:addData('hotend_target', temperatures.hotend_target) response:addData('bed', temperatures.bed) response:addData('bed_target', temperatures.bed_target) + elseif temperatures == false then + response:addData('status', msg) + response:setFail() else response:setError(msg) - return false; end - - return true; end function M.progress(request, response) local argId = request:get("id") local printer,msg = printerUtils.createPrinterOrFail(argId, response) - if not printer or not printer:hasSocket() then return false end + if not printer or not printer:hasSocket() then return end -- NOTE: despite their names, `currentLine` is still the error indicator and `bufferedLines` the message in such case. local currentLine,bufferedLines,totalLines = printer:getProgress() @@ -61,15 +62,16 @@ function M.progress(request, response) response:addData('current_line', currentLine) response:addData('buffered_lines', bufferedLines) response:addData('total_lines', totalLines) + elseif progress == false then + response:addData('status', bufferedLines) + response:setFail() else response:setError(bufferedLines) - return false end - - return true; end --- NOTE: onlyReturnState is optional and prevents response from being modified, used when calling from within other api call +-- Note: onlyReturnState is optional and prevents response from being modified, used when calling from within other api call +-- Note: unlike regular API-functions, this one returns either true+state or false function M.state(request, response, onlyReturnState) local argId = request:get("id") if not onlyReturnState then response:addData('id', argId) end @@ -98,19 +100,19 @@ function M.state(request, response, onlyReturnState) response:addData('state', rv) end return true, rv - else + else -- Note: do not differentiate between false and nil here, false should never be returned if not onlyReturnState then response:setError(msg) end return false end end - return true + + --this point cannot be reached, no return necessary end -- retrieve a list of 3D printers currently supported function M.listall(request, response) response:setSuccess() response:addData('printers', printerUtils.supportedPrinters()) - return true end @@ -130,13 +132,17 @@ function M.heatup_POST(request, response) local rv,msg = printer:heatup(temperature) response:addData('id', argId) - if rv then response:setSuccess() - else response:setFail(msg) + if rv then + response:setSuccess() + elseif rv == false then + response:addData('status', msg) + response:setFail() + else + response:setError(msg) end end function M.stop_POST(request, response) - log:info(MOD_ABBR, "API:printer/stop") if not accessManager.hasControl(request.remoteAddress) then @@ -147,7 +153,7 @@ function M.stop_POST(request, response) local argId = request:get("id") local argGcode = request:get("gcode") local printer,msg = printerUtils.createPrinterOrFail(argId, response) - if not printer or not printer:hasSocket() then return false end + if not printer or not printer:hasSocket() then return end if(argGcode == nil) then argGcode = "" @@ -155,8 +161,13 @@ function M.stop_POST(request, response) local rv,msg = printer:stopPrint(argGcode) response:addData('id', argId) - if rv then response:setSuccess() - else response:setError(msg) + if rv then + response:setSuccess() + elseif rv == false then + response:addData('status', msg) + response:setFail() + else + response:setError(msg) end end @@ -164,6 +175,8 @@ end --accepts: id(string) (the printer ID to append to) --accepts: first(bool) (chunks will be concatenated but output file will be cleared first if this argument is true) --accepts: start(bool) (only when this argument is true will printing be started) +--accepts: seq_number(int) (sequence number of the chunk, must be given until clear() after given once, and incremented each time) +--accepts: seq_total(int) (total number of gcode chunks to be appended, must be given until clear() after given once, and stay the same) --returns: when the gcode buffer cannot accept the gcode, or the IPC transaction fails, a fail with a (formal, i.e., parseable) status argument will be returned function M.print_POST(request, response) log:info(MOD_ABBR, "API:printer/print") @@ -187,9 +200,12 @@ function M.print_POST(request, response) local argGcode = request:get("gcode") local argIsFirst = utils.toboolean(request:get("first")) local argStart = utils.toboolean(request:get("start")) + local argSeqNumber = request:get("seq_number") or -1 + local argSeqTotal = request:get("seq_total") or -1 + local remoteHost = request:getRemoteHost() local printer,msg = printerUtils.createPrinterOrFail(argId, response) - if not printer or not printer:hasSocket() then return false end + if not printer or not printer:hasSocket() then return end response:addData('id', argId) @@ -203,7 +219,10 @@ function M.print_POST(request, response) response:addData('gcode_clear',true) local rv,msg = printer:clearGcode() - if not rv then + if rv == false then + response:addData('status', msg) + response:setFail("could not clear gcode") + elseif rv == nil then response:setError(msg) return end @@ -211,14 +230,17 @@ function M.print_POST(request, response) local rv,msg - -- TODO: return errors with a separate argument like here in the rest of the code (this is how we designed the API right?) - rv,msg = printer:appendGcode(argGcode) + rv,msg = printer:appendGcode(argGcode, { seq_number = argSeqNumber, seq_total = argSeqTotal, source = remoteHost }) if rv then --NOTE: this does not report the number of lines, but only the block which has just been added response:addData('gcode_append',argGcode:len()) + elseif rv == false then + response:addData('status', msg) + response:setFail("could not add gcode") + return else - response:setError("could not add gcode") response:addData('msg', msg) + response:setError("could not add gcode") return end @@ -228,9 +250,14 @@ function M.print_POST(request, response) if rv then response:setSuccess() response:addData('gcode_print',true) + elseif rv == false then + response:addData('status', msg) + response:setFail("could not send gcode") + return else - response:setError("could not send gcode") response:addData('msg', msg) + response:setError("could not send gcode") + return end else response:setSuccess() diff --git a/src/rest/response.lua b/src/rest/response.lua index e740341..4f71c43 100644 --- a/src/rest/response.lua +++ b/src/rest/response.lua @@ -132,7 +132,7 @@ end --- Call all functions on the post-response queue, see @{M:addPostResponseFunction} for details and a side-note. function M:executePostResponseQueue() - log:verbose(MOD_ABBR, "Response:executePostResponseQueue: " .. utils.dump(self.postResponseQueue)) + if #self.postResponseQueue > 0 then log:verbose(MOD_ABBR, "Response:executePostResponseQueue: " .. utils.dump(self.postResponseQueue)) end for i,fn in ipairs(self.postResponseQueue) do fn() end end