internal async Task <YDevice> funcGetDevice(string className, string func)
        {
            string resolved;

            try {
                resolved = _yHash.imm_resolveSerial(className, func);
            } catch (YAPI_Exception ex) {
                if (ex.errorType == YAPI.DEVICE_NOT_FOUND && _hubs.Count == 0)
                {
                    throw new YAPI_Exception(ex.errorType, "Impossible to contact any device because no hub has been registered");
                }
                else
                {
                    await _updateDeviceList_internal(true, false);

                    resolved = _yHash.imm_resolveSerial(className, func);
                }
            }
            YDevice dev = _yHash.imm_getDevice(resolved);

            if (dev == null)
            {
                // try to force a device list update to check if the device arrived
                // in between
                await _updateDeviceList_internal(true, false);

                dev = _yHash.imm_getDevice(resolved);
                if (dev == null)
                {
                    throw new YAPI_Exception(YAPI.DEVICE_NOT_FOUND, "Device [" + resolved + "] not online");
                }
            }
            return(dev);
        }
        internal override async Task <byte[]> devRequestSync(YDevice device, string req_first_line, byte[] req_head_and_body, RequestProgress progress, object context)
        {
            String serial = device.imm_getSerialNumber();

            byte[] req = imm_prepareRequest(req_first_line, req_head_and_body);
            return(await _ywatcher.DevRequestSync(serial, req, progress, context));
        }
        internal override async Task devRequestAsync(YDevice device, string req_first_line, byte[] req_head_and_body, RequestAsyncResult asyncResult, object asyncContext)
        {
            String serial = device.imm_getSerialNumber();

            byte[] req = imm_prepareRequest(req_first_line, req_head_and_body);
            await _ywatcher.DevRequestAsync(serial, req, asyncResult, asyncContext);

            //Debug.WriteLine("async req to " + serial + " " + req_first_line);
        }
Esempio n. 4
0
        internal override async Task <byte[]> devRequestSync(YDevice device, string req_first_line, byte[] req_head_and_body, uint mstimeout, YGenericHub.RequestProgress progress, object context)
        {
            if (mstimeout == 0)
            {
                // simulate a wait indefinitely
                mstimeout = 86400000; //24h
            }

            WSRequest wsRequest = await sendRequest(req_first_line, req_head_and_body, DEVICE_TCP_CHANNEL, false, progress, context);

            byte[] full_result = await wsRequest.getResponseBytes();

            return(imm_verifyHTTPheader(full_result));
        }
        private async Task _processMore(int start)
        {
            if (start == 0)
            {
                return;
            }
            imm_reportprogress(0, "Firmware update started");
            YFirmwareFile firmware;

            try {
                //1% -> 5%
                if (_firmwarepath.StartsWith("www.yoctopuce.com") || _firmwarepath.StartsWith("http://www.yoctopuce.com"))
                {
                    this.imm_reportprogress(1, "Downloading firmware");
                    byte[] bytes = await YFirmwareUpdate._downloadfile(_firmwarepath);

                    firmware = YFirmwareFile.imm_Parse(_firmwarepath, bytes);
                }
                else
                {
                    imm_reportprogress(1, "Loading firmware");
                    firmware = YFirmwareUpdate._loadFirmwareFile(_firmwarepath);
                }

                //5% -> 10%
                imm_reportprogress(5, "check if module is already in bootloader");
                YGenericHub hub    = null;
                YModule     module = YModule.FindModuleInContext(_yctx, _serial + ".module");
                if (await module.isOnline())
                {
                    YDevice yDevice = await module.getYDevice();

                    hub = yDevice.Hub;
                }
                else
                {
                    // test if already in bootloader
                    foreach (YGenericHub h in _yctx._hubs)
                    {
                        List <string> bootloaders = await h.getBootloaders();

                        if (bootloaders.Contains(_serial))
                        {
                            hub = h;
                            break;
                        }
                    }
                }
                if (hub == null)
                {
                    imm_reportprogress(-1, "Device " + _serial + " is not detected");
                    return;
                }

                await hub.firmwareUpdate(_serial, firmware, _settings, imm_firmware_progress);

                //80%-> 98%
                imm_reportprogress(80, "wait to the device restart");
                ulong timeout = YAPI.GetTickCount() + 60000;
                await module.clearCache();

                while (!await module.isOnline() && timeout > YAPI.GetTickCount())
                {
                    await Task.Delay(5000);

                    try {
                        await _yctx.UpdateDeviceList();
                    } catch (YAPI_Exception) {
                    }
                }
                if (await module.isOnline())
                {
                    if (_settings != null)
                    {
                        await module.set_allSettingsAndFiles(_settings);

                        await module.saveToFlash();
                    }
                    imm_reportprogress(100, "Success");
                }
                else
                {
                    imm_reportprogress(-1, "Device did not reboot correctly");
                }
            } catch (YAPI_Exception e) {
                imm_reportprogress(e.errorType, e.Message);
                Debug.WriteLine(e.ToString());
                Debug.Write(e.StackTrace);
            }
        }
Esempio n. 6
0
        protected internal virtual void handleNetNotification(string notification_line)
        {
            string ev = notification_line.Trim();

            if (ev == "")
            {
                //empty (\n) ping notification drop it.
                return;
            }

            if (ev.Length >= 3 && ev[0] >= NOTIFY_NETPKT_CONFCHGYDX && ev[0] <= NOTIFY_NETPKT_TIMEAVGYDX)
            {
                // function value ydx (tiny notification)
                _hub._isNotifWorking = true;
                _notifRetryCount     = 0;
                if (_notifyPos >= 0)
                {
                    _notifyPos += ev.Length + 1;
                }

                int devydx = ev[1] - 65; // from 'A'
                int funydx = ev[2] - 48; // from '0'

                if ((funydx & 64) != 0)
                {
                    // high bit of devydx is on second character
                    funydx -= 64;
                    devydx += 128;
                }

                string value = ev.Substring(3);
                if (_hub._serialByYdx.ContainsKey(devydx))
                {
                    string  serial = _hub._serialByYdx[devydx];
                    string  funcid;
                    YDevice ydev = _hub._yctx._yHash.imm_getDevice(serial);
                    if (ydev != null)
                    {
                        switch (ev[0])
                        {
                        case NOTIFY_NETPKT_FUNCVALYDX:
                            funcid = ydev.imm_getYPEntry(funydx).FuncId;
                            if (!funcid.Equals(""))
                            {
                                // function value ydx (tiny notification)
                                _hub.imm_handleValueNotification(serial, funcid, value);
                            }

                            break;

                        case NOTIFY_NETPKT_DEVLOGYDX:
                            Task dummyTask = ydev.triggerLogPull();
                            break;

                        case NOTIFY_NETPKT_CONFCHGYDX:
                            _hub.imm_handleConfigChangeNotification(serial);
                            break;

                        case NOTIFY_NETPKT_TIMEVALYDX:
                        case NOTIFY_NETPKT_TIMEAVGYDX:
                        case NOTIFY_NETPKT_TIMEV2YDX:
                            if (funydx == 0xf)
                            {
                                int    not_len = value.Length / 2;
                                byte[] data    = new byte[not_len];
                                for (int i = 0; i < not_len; i++)
                                {
                                    string part = value.Substring(i * 2, 2);
                                    data[i] = Convert.ToByte(part, 16);
                                }
                                ydev.imm_setLastTimeRef(data);
                            }
                            else
                            {
                                funcid = ydev.imm_getYPEntry(funydx).FuncId;
                                if (!funcid.Equals(""))
                                {
                                    // timed value report
                                    List <int> report = new List <int>(1 + value.Length / 2);
                                    report.Add((ev[0] == NOTIFY_NETPKT_TIMEVALYDX ? 0 : (ev[0] == NOTIFY_NETPKT_TIMEAVGYDX ? 1 : 2)));
                                    for (int pos = 0; pos < value.Length; pos += 2)
                                    {
                                        int intval = Convert.ToInt32(value.Substring(pos, 2), 16);
                                        report.Add(intval);
                                    }
                                    _hub.imm_handleTimedNotification(serial, funcid, ydev.imm_getLastTimeRef(), ydev.imm_getLastDuration(), report);
                                }
                            }

                            break;

                        case NOTIFY_NETPKT_FUNCV2YDX:
                            funcid = ydev.imm_getYPEntry(funydx).FuncId;
                            if (!funcid.Equals(""))
                            {
                                byte[] rawval = decodeNetFuncValV2(YAPI.DefaultEncoding.GetBytes(value));
                                if (rawval != null)
                                {
                                    string decodedval = YGenericHub.imm_decodePubVal(rawval[0], rawval, 1, 6);
                                    // function value ydx (tiny notification)
                                    _hub.imm_handleValueNotification(serial, funcid, decodedval);
                                }
                            }

                            break;

                        case NOTIFY_NETPKT_FLUSHV2YDX:
                            // To be implemented later
                            break;
                        }
                    }
                }
            }
            else if (ev.Length >= 5 && ev.StartsWith("YN01", StringComparison.Ordinal))
            {
                _hub._isNotifWorking = true;
                _notifRetryCount     = 0;
                if (_notifyPos >= 0)
                {
                    _notifyPos += ev.Length + 1;
                }

                char notype = ev[4];
                if (notype == NOTIFY_NETPKT_NOT_SYNC)
                {
                    _notifyPos = Convert.ToInt32(ev.Substring(5));
                }
                else
                {
                    string[] parts;
                    switch (notype)
                    {
                    case NOTIFY_NETPKT_NAME:     // device name change, or arrival
                        parts = ev.Substring(5).Split(',');
                        _hub.imm_handleBeaconNotification(parts[0], Convert.ToInt32(parts[2]));
                        _hub._devListExpires = 0;
                        break;

                    case NOTIFY_NETPKT_CHILD:       // device plug/unplug
                    case NOTIFY_NETPKT_FUNCNAME:    // function name change
                    case NOTIFY_NETPKT_FUNCNAMEYDX: // function name change (ydx)
                        _hub._devListExpires = 0;
                        break;

                    case NOTIFY_NETPKT_FUNCVAL:     // function value (long notification)
                        parts = ev.Substring(5).Split(',');
                        _hub.imm_handleValueNotification(parts[0], parts[1], parts[2]);
                        break;
                    }
                }
            }
            else
            {
                // oops, bad notification ? be safe until a good one comes
                _hub._isNotifWorking = false;
                _notifyPos           = -1;
            }
        }