private Status ExecuteApiVersion() { /* attempt requesting an update */ string response; Status retval = _WebServerScripts.HttpGet(_hostName, "", 0, ActionType.GetVersion, out response, String.Empty, 1000); /* attempt parsing */ VersionReturn general = null; if (retval == Status.Ok) { try { general = Newtonsoft.Json.JsonConvert.DeserializeObject <VersionReturn>(response); if (general != null) { /* decoded okay */ _serverVersion = general.Version; _serverSearchDirectory = general.SearchDirectory; } else { retval = Status.CouldNotParseJson; } } catch (Exception) { retval = Status.CouldNotParseJson; } } return(retval); }
/// <summary> /// Service _action and update _action.Error. /// </summary> private Status PerformAction(out bool setStateToConnecting) { setStateToConnecting = false; /* get info on this device */ byte devID = _action.deviceID; var model = _action.model; /* lookup device descriptor */ DeviceDescrip ddRef; bool foundOk = _descriptors.Get(model, devID, out ddRef); /* track the error status */ Status retval = Status.Ok; /* temp for catching JSON responses */ string response = string.Empty; string fileName = string.Empty; switch (_action.type) { case ActionType.Blink: /* make sure device was found in our collection */ if (retval == Status.Ok) { retval = (foundOk) ? Status.Ok : Status.DeviceNotFound; } /* perform http exchange */ if (retval == Status.Ok) { retval = _WebServerScripts.HttpGet(_hostName, ddRef.model, ddRef.deviceID, ActionType.Blink, out response); } /* parse resp */ if (retval == Status.Ok) { BlinkReturn jsonDeser = JsonConvert.DeserializeObject <BlinkReturn>(response); retval = (Status)jsonDeser.GeneralReturn.Error; } break; case ActionType.SelfTest: /* make sure device was found in our collection */ if (retval == Status.Ok) { retval = (foundOk) ? Status.Ok : Status.DeviceNotFound; } /* perform http exchange */ if (retval == Status.Ok) { retval = _WebServerScripts.HttpGet(_hostName, ddRef.model, ddRef.deviceID, ActionType.SelfTest, out response, "", 5000); } /* parse resp */ if (retval == Status.Ok) { SelfTestReturn jsonDeser = JsonConvert.DeserializeObject <SelfTestReturn>(response); retval = (Status)jsonDeser.GeneralReturn.Error; if (retval == Status.Ok) { _action.selfTestResults = jsonDeser.SelfTest; } else { _action.selfTestResults = "Self-Test Failed"; } } break; case ActionType.SetDeviceName: /* get params for this action */ String newName = _action.stringParam; /* make sure device was found in our collection */ if (retval == Status.Ok) { retval = (foundOk) ? Status.Ok : Status.DeviceNotFound; } /* perform http exchange */ if (retval == Status.Ok) { retval = _WebServerScripts.HttpGet(_hostName, ddRef.model, ddRef.deviceID, ActionType.SetDeviceName, out response, "&newname=" + newName, 2000); } /* parse resp */ if (retval == Status.Ok) { NameReturn jsonDeser = JsonConvert.DeserializeObject <NameReturn>(response); retval = (Status)jsonDeser.GeneralReturn.Error; } break; case ActionType.SetID: /* get params for this action */ byte newId = (byte)_action.newID; /* make sure device was found in our collection */ if (retval == Status.Ok) { retval = (foundOk) ? Status.Ok : Status.DeviceNotFound; } /* perform http exchange */ if (retval == Status.Ok) { retval = _WebServerScripts.HttpGet(_hostName, ddRef.model, ddRef.deviceID, ActionType.SetID, out response, "&newid=" + newId.ToString(), 2000); } /* parse resp */ if (retval == Status.Ok) { IDReturn jsonDeser = JsonConvert.DeserializeObject <IDReturn>(response); retval = (Status)jsonDeser.GeneralReturn.Error; } /* if ID change was successful, update our local device list */ if (retval == Status.Ok) { _descriptors.ChangeID(ddRef, newId); } if (retval == Status.Ok) { /* Update device cache with new deviceID, this is important when resolving/creating device ID conflicts */ UpdateConfigs(ddRef); } break; case ActionType.SetConfig: /* Specify the filename so it's somewhat unique */ fileName = (ddRef.model + ": " + ddRef.deviceID + ".json").ToLower(); //ToLower Everything to make it parsable in URL /* get params for this action */ string serializedData = _action.stringParam; /* Get content payload from action */ byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(serializedData); /* If we're using GET we need to send the file up */ if (EnableSftpTransfer) { _rioUpdater = new RioUpdater(_hostName); _rioUpdater.SendFileContents(dataBytes, _serverSearchDirectory + fileName); System.Threading.Thread.Sleep(250); //Wait a bit to make sure file got onto the RIO } /* make sure device was found in our collection */ if (retval == Status.Ok) { retval = (foundOk) ? Status.Ok : Status.DeviceNotFound; } /* perform http exchange */ if (retval == Status.Ok) { /* Decide if we're posting or getting from the _usingPost flag */ if (EnableSftpTransfer) { retval = _WebServerScripts.HttpGet(_hostName, ddRef.model, ddRef.deviceID, ActionType.SetConfig, out response, "&file=" + fileName, 5000); } else { retval = _WebServerScripts.HttpPost(_hostName, ddRef.model, ddRef.deviceID, ActionType.SetConfig, dataBytes, out response, 5000); } } /* parse resp */ if (retval == Status.Ok) { SetConfigReturn jsonDeser = JsonConvert.DeserializeObject <SetConfigReturn>(response); retval = (Status)jsonDeser.GeneralReturn.Error; } if (retval == Status.Ok) { /* Backend should immediately update device config cache */ retval = UpdateConfigs(ddRef); } break; case ActionType.FieldUpgradeDevice: /* Specify file name as generic so it gets overwritten every time */ fileName = "firmwarefile.crf"; /* If we're using POST, we don't need to send the file up */ if (EnableSftpTransfer) { /* Create a RioFile to be sent to the server */ RioFile file = new RioFile(_action.filePath, _serverSearchDirectory + fileName); /* First put the files onto the RIO */ _rioUpdater = new RioUpdater(_hostName); _rioUpdater.SendFile(file); } /* make a new web exchange that allows for overlapped operation */ _asyncWebExchange = new AsyncWebExchange(); /* make sure device was found in our collection */ if (retval == Status.Ok) { retval = (foundOk) ? Status.Ok : Status.DeviceNotFound; } if (retval == Status.Ok) { retval = ExecuteFieldUpgrade(ddRef, _asyncWebExchange, fileName, EnableSftpTransfer); } /* free resouces */ _asyncWebExchange.Dispose(); break; case ActionType.InstallDiagServerToRobotController: _rioUpdater = new RioUpdater(_hostName); _rioUpdater.StartUpdate(); retval = Status.Ok; setStateToConnecting = true; break; case ActionType.UninstallDiagServerToRobotController: _rioUpdater = new RioUpdater(_hostName); _rioUpdater.StartRevert(); retval = Status.Ok; setStateToConnecting = true; break; case ActionType.StartServer: _rioUpdater = new RioUpdater(_hostName); retval = _rioUpdater.StartServer(); setStateToConnecting = true; break; case ActionType.StopServer: _rioUpdater = new RioUpdater(_hostName); retval = _rioUpdater.StopServer(); setStateToConnecting = true; break; /* Unit Testing Cases */ case ActionType.GetVersion: //Used for Unit Testing VersionReturn responseClass = null; if (retval == Status.Ok) { retval = _WebServerScripts.HttpGet(_hostName, "", 0, ActionType.GetVersion, out response); } if (retval == Status.Ok) { responseClass = JsonConvert.DeserializeObject <VersionReturn>(response); retval = responseClass.Version.Equals(_action.stringParam) ? Status.Ok : Status.VersionDoesNotMatch; } break; case ActionType.GetNumOfDevices: GetDevicesReturn numDeviceReturn = null; if (retval == Status.Ok) { retval = _WebServerScripts.HttpGet(_hostName, "", 0, ActionType.GetDeviceList, out response); } if (retval == Status.Ok) { numDeviceReturn = JsonConvert.DeserializeObject <GetDevicesReturn>(response); retval = numDeviceReturn.DeviceArray.Length >= _action.param ? Status.Ok : Status.NotEnoughDevices; } break; case ActionType.RebootRio: _rioUpdater = new RioUpdater(_hostName); retval = _rioUpdater.RebootRio(); setStateToConnecting = true; break; case ActionType.CheckProcess: _rioUpdater = new RioUpdater(_hostName); retval = _rioUpdater.CheckProcessStarted(); break; default: retval = Status.UnsupportedAction; break; } /* callback to GUI */ _action.Error = retval; _action.callback(_action, retval); /* free it */ _action = null; /* pass error to caller */ return(retval); }