def webPipeCallback(request): if 'cmd' not in request: raise StateError('handleFifoRequests: cmd field not in request: {}'.format(request)) cmd = request['cmd'] route = request.get('route') response = StructDict({'status': 200}) if route == 'dataserver': try: response = RtAttenWeb.webServer.sendDataMsgFromThread(request, timeout=10) if response is None: raise StateError('handleFifoRequests: Response None from sendDataMessage') if 'status' not in response: raise StateError('handleFifoRequests: status field missing from response: {}'.format(response)) if response['status'] not in (200, 408): if 'error' not in response: raise StateError('handleFifoRequests: error field missing from response: {}'.format(response)) RtAttenWeb.webServer.setUserError(response['error']) logging.error('handleFifo status {}: {}'.format(response['status'], response['error'])) except Exception as err: errStr = 'SendDataMessage Exception type {}: error {}:'.format(type(err), str(err)) response = {'status': 400, 'error': errStr} RtAttenWeb.webServer.setUserError(errStr) logging.error('handleFifo Excpetion: {}'.format(errStr)) raise err else: if cmd == 'webCommonDir': response.filename = CommonOutputDir elif cmd == 'classificationResult': try: predict = request['value'] runId = request.get('runId') # predict has {'catsep': val, 'vol': val} catsep = predict.get('catsep') vol = predict.get('vol') # Test for NaN by comparing value to itself, if not equal then it is NaN if catsep is not None and catsep == catsep: image_b64Str = RtAttenWeb.createFeedbackImage(vol, catsep) cmd = {'cmd': 'subjectDisplay', 'data': image_b64Str} RtAttenWeb.webServer.sendSubjMsgFromThread(json.dumps(cmd)) # also update clinician window # change classification value range to 0 to 1 instead of -1 to 1 # classVal = (catsep + 1) / 2 cmd = {'cmd': 'classificationResult', 'classVal': catsep, 'vol': vol, 'runId': runId} RtAttenWeb.webServer.sendUserMsgFromThread(json.dumps(cmd)) except Exception as err: errStr = 'SendClassification Exception type {}: error {}:'.format(type(err), str(err)) response = {'status': 400, 'error': errStr} RtAttenWeb.webServer.setUserError(errStr) logging.error('handleFifo Excpetion: {}'.format(errStr)) raise err elif cmd == 'subjectDisplay': # forward to subject window color = request.get('bgcolor') if color is not None: image_b64Str = RtAttenWeb.createSolidColorImage(color) cmd = {'cmd': 'subjectDisplay', 'data': image_b64Str} RtAttenWeb.webServer.sendSubjMsgFromThread(json.dumps(cmd)) else: RtAttenWeb.webServer.sendSubjMsgFromThread(request) return response
def clientWebpipeCmd(webpipes, cmd): '''Send a web request using named pipes to the web server for handling. This allows a separate client process to make requests of the web server process. It writes the request on fd_out and recieves the reply on fd_in. ''' webpipes.fd_out.write(json.dumps(cmd) + os.linesep) msg = webpipes.fd_in.readline() if len(msg) == 0: # fifo closed raise StateError('WebPipe closed') response = json.loads(msg) retVals = StructDict() decodedData = None if 'status' not in response: raise StateError( 'clientWebpipeCmd: status not in response: {}'.format(response)) retVals.statusCode = response['status'] if retVals.statusCode == 200: # success if 'filename' in response: retVals.filename = response['filename'] if 'data' in response: decodedData = b64decode(response['data']) if retVals.filename is None: raise StateError('clientWebpipeCmd: filename field is None') retVals.data = formatFileData(retVals.filename, decodedData) elif retVals.statusCode not in (200, 408): raise RequestError('WebRequest error: status {}: {}'.format( retVals.statusCode, response['error'])) return retVals
def retrieveFile(self, filename): print("Retrieving data for {}... ".format(filename), end='') fileInfo = StructDict() fileInfo.subjectNum = self.id_fields.subjectNum fileInfo.subjectDay = self.id_fields.subjectDay fileInfo.filename = filename stime = time.time() replyId = self.rtatten.RetrieveData.remote(fileInfo) reply = ray.get(replyId) assert reply.success is True print("took {:.2f} secs".format(time.time() - stime)) clientFile = os.path.join(self.dirs.dataDir, filename) writeFile(clientFile, reply.data) serverFile = os.path.join(self.dirs.serverDataDir, filename) if not os.path.exists(serverFile): try: os.symlink(clientFile, serverFile) except OSError: print("Unable to link file %s", serverFile)
def retrieveFile(self, filename): fileInfo = StructDict() fileInfo.subjectNum = self.id_fields.subjectNum fileInfo.subjectDay = self.id_fields.subjectDay fileInfo.filename = filename if self.cfg.session.useSessionTimestamp is True: fileInfo.findNewestPattern = re.sub(r'T\d{6}', 'T*', filename) print("Retrieving newest file for {}... ".format( fileInfo.findNewestPattern), end='') else: print("Retrieving file {}... ".format(filename), end='') stime = time.time() reply = self.sendCmdExpectSuccess(MsgEvent.RetrieveData, fileInfo) retFilename = reply.fields.filename print("took {:.2f} secs".format(time.time() - stime)) clientFile = os.path.join(self.dirs.dataDir, retFilename) writeFile(clientFile, reply.data) serverFile = os.path.join(self.dirs.serverDataDir, retFilename) if not os.path.exists(serverFile): try: os.symlink(clientFile, serverFile) except OSError: logging.error("Unable to link file %s", serverFile)