Example #1
0
    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
Example #2
0
    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
Example #3
0
    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)
Example #4
0
    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
Example #5
0
    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})
Example #6
0
    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")