def compileAndUpload(self, code, config, fileContents, isSEAL): global lastUploadCode global lastUploadConfig global lastUploadFile global maybeIsInSubprocess if not os.path.exists("build"): os.mkdir("build") # do this synchronously subprocessLock.acquire() global isListening ht.closeAllSerial() isListening = False maybeIsInSubprocess = True try: if fileContents: lastUploadFile = form["file"].filename filename = os.path.join("build", "tmp-file.ihex") with open(filename, "w") as outFile: outFile.write(fileContents) outFile.close() retcode = 0 for m in motes.getMotes(): if not m.tryToOpenSerial(False): continue r = m.tryToUpload(self, filename) if r != 0: retcode = r elif code: lastUploadCode = code filename = "main." + ("sl" if isSEAL else "c") with open(os.path.join("build", filename), "w") as outFile: outFile.write(code) outFile.close() with open(os.path.join("build", "config"), "w") as outFile: if config is None: config = "" outFile.write(config) outFile.close() with open(os.path.join("build", "Makefile"), "w") as outFile: if isSEAL: outFile.write("SEAL_SOURCES = main.sl\n") else: outFile.write("SOURCES = main.c\n") outFile.write("APPMOD = App\n") outFile.write("PROJDIR = $(CURDIR)\n") outFile.write("ifndef MOSROOT\n") mansosPath = configuration.c.getCfgValue("mansosDirectory") if not os.path.isabs(mansosPath): # one level up - because we are in build directory mansosPath = os.path.join(mansosPath, "..") outFile.write(" MOSROOT = " + mansosPath + "\n") outFile.write("endif\n") outFile.write("include ${MOSROOT}/mos/make/Makefile\n") outFile.close() retcode = 0 for m in motes.getMotes(): if not m.tryToOpenSerial(False): continue r = m.tryToCompileAndUpload(self, filename) if r != 0: retcode = r finally: maybeIsInSubprocess = False global isListening sensor_data.moteData.reset() ht.openAllSerial() isListening = True subprocessLock.release() return retcode
def compileAndUpload(self, code, config, fileName, fileContents, codeType): # global lastUploadCode # global lastUploadConfig # global lastUploadFile global maybeIsInSubprocess global isListening if not os.path.exists("build"): os.mkdir("build") # do this synchronously subprocessLock.acquire() ht.closeAllSerial() isListening = False maybeIsInSubprocess = True try: if fileContents: lastUploadFile = fileName filename = os.path.join("build", "tmp-file.ihex") with open(filename, "w") as outFile: outFile.write(fileContents) outFile.close() retcode = 0 for m in motes.getMotes(): if not m.tryToOpenSerial(False): continue r = m.tryToUpload(self, filename) if r != 0: retcode = r elif code: lastUploadCode = code if config == None: config = "" if codeType == "c": emitCodeMansOS(code, config) elif codeType == "plain_c": emitCodePlainC(code, config) elif codeType == "nesc": (componentName, appName) = detectTinyOSAppName(code, config) emitCodeTinyOS(code, config, componentName, appName) elif codeType == "contiki_c": emitCodeContiki(code) elif codeType == "seal": emitCodeSEAL(code, config) else: print("compileAndUpload: unknow code type: " + codeType) return 1 retcode = 0 for m in motes.getMotes(): if m.isLocal(): if not m.tryToOpenSerial(False): continue r = m.tryToCompileAndUpload(self, codeType) if r != 0: retcode = r finally: maybeIsInSubprocess = False sensor_data.moteData.reset() ht.openAllSerial() isListening = True subprocessLock.release() return retcode
def serveListen(self, qs): self.setSession(qs) self.send_response(200) self.sendDefaultHeaders() self.end_headers() motesText = self.serveMotes("listen", "Listen", qs, None) errorMsg = None global isListening if "action" in qs and self.getLevel() > 1: if qs["action"][0] == "Start": if not motes.anySelected(): errorMsg = "\n<h4 class='err'>Error: No motes selected!</h4>\n" if isListening: errorMsg = "\n<h4 class='err'>Already listening!</h4>\n" else: sensor_data.moteData.reset() ht.openAllSerial() isListening = True # Open DB connection data_utils.openDBConnection() else: ht.closeAllSerial() isListening = False # Close DB connection data_utils.closeDBConnection() txt = "" for line in sensor_data.moteData.listenTxt: txt += line + "<br/>" action = "Stop" if isListening else "Start" dataFilename = configuration.c.getCfgValue("saveToFilename") saveProcessedData = configuration.c.getCfgValueAsBool("saveProcessedData") if self.getLevel() > 1: if "dataFile" in qs: dataFilename = qs["dataFile"][0] if len(dataFilename) and dataFilename.find(".") == -1: dataFilename += ".csv" if "dataType" in qs: saveProcessedData = not qs["dataType"][0] == "raw" saveMultipleFiles = qs["dataType"][0] == "mprocessed" configuration.c.setCfgValue("saveToFilename", dataFilename) configuration.c.setCfgValue("saveProcessedData", bool(saveProcessedData)) configuration.c.save() rawdataChecked = not saveProcessedData mprocessedChecked = saveProcessedData div_height = "0" if "div_height" in qs: div_height = qs["div_height"][0] self.serveAnyPage("listen", qs, True, {"MOTES_TXT" : motesText, "LISTEN_TXT" : txt, "MOTE_ACTION": action, "DATA_FILENAME" : dataFilename, "RAWDATA_CHECKED" : 'checked="checked"' if rawdataChecked else "", "MPROCDATA_CHECKED" : 'checked="checked"' if mprocessedChecked else "", "DIV_HEIGHT" : div_height}, errorMsg = errorMsg)
def serveListen(self, qs): self.setSession(qs) self.send_response(200) self.sendDefaultHeaders() self.end_headers() motesText = self.serveMotes("listen", "Listen", qs, None, True) errorStyle = "none" errorMsg = "" global isListening if "action" in qs and self.getLevel() > 1: if qs["action"][0] == "Start": if not motes.anySelected(): errorMsg = "\n<h4 class='err'>Error: No motes selected!</h4>\n" errorStyle = "block" elif isListening: errorMsg = "\n<h4 class='err'>Already listening!</h4>\n" errorStyle = "block" else: sensor_data.moteData.reset() ht.openAllSerial() isListening = True # Open DB connection data_utils.openDBConnection() else: ht.closeAllSerial() isListening = False # Close DB connection data_utils.closeDBConnection() txt = "" for line in sensor_data.moteData.listenTxt: txt += line + "<br/>" if errorMsg == "": action = "Stop" if isListening else "Start" else: action = "Start" dataFilename = configuration.c.getCfgValue("saveToFilename") saveProcessedData = configuration.c.getCfgValueAsBool("saveProcessedData") if self.getLevel() > 1: if "dataFile" in qs: dataFilename = qs["dataFile"][0] if len(dataFilename) and dataFilename.find(".") == -1: dataFilename += ".csv" if "dataType" in qs: saveProcessedData = not qs["dataType"][0] == "raw" saveMultipleFiles = qs["dataType"][0] == "mprocessed" configuration.c.setCfgValue("saveToFilename", dataFilename) configuration.c.setCfgValue("saveProcessedData", bool(saveProcessedData)) configuration.c.save() rawdataChecked = not saveProcessedData mprocessedChecked = saveProcessedData self.serveAnyPage("listen", qs, True, {"MOTES_TXT" : motesText, "LISTEN_TXT" : txt, "MOTE_ACTION": action, "DATA_FILENAME" : dataFilename, "RAWDATA_CHECKED" : 'checked="checked"' if rawdataChecked else "", "MPROCDATA_CHECKED" : 'checked="checked"' if mprocessedChecked else "", "ERROR_MSG" : errorMsg, "ERROR_STATUS" : errorStyle})
def serveListenSingle(self, qs): if not self.getLevel() > 1: self.setSession(qs) self.send_response(200) self.sendDefaultHeaders() self.end_headers() self.writeChunk("accessDenied") elif "single" in qs: # listen to a single mote and return motePortName = utils.urlUnescape(qs["single"][0]) print("motePortName = " + motePortName) mote = motes.getMote(motePortName) if mote is None: self.setSession(qs) self.send_response(200) self.sendDefaultHeaders() self.end_headers() try: urllib2.urlopen(motePortName.split('@')[1]) except URLError: self.writeChunk("hostUnreachable") return self.writeChunk("noMotesSelected") return if "max_data" in qs: max_data = qs["max_data"][0] else: max_data = "100" # do not set session info self.send_response(200) self.sendDefaultHeaders() # auto refresh self.send_header('Refresh', '1') self.end_headers() if mote.isLocal(): # Prepare serial port for the first time if "startListen" in qs and qs["startListen"][0] == '1': ht.closeAllSerial() mote.openSerial() ht.openMoteSerial(mote) # Listen for data output = "" for line in sensor_data.moteData.listenTxt: output += line + "\n" self.writeChunk("buffer:" + output) else: # Example URL: "http://*****:*****@') if os.name == "posix" and not os.path.isabs(portname): fullPortName = "/dev/" + portname else: fullPortName = portname if host.find("://") == -1: host = "http://" + host url = host + "/read?max_data=" + max_data + "&port=" + fullPortName + "&clean=1" try: req = urllib2.urlopen(url) output = req.read() self.writeChunk(output) except Exception as e: self.writeChunk("hostUnreachable")