コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }