public async Task <IActionResult> Create(Removal removal)
        {
            try
            {
                removal.EmployeeId = (await GetCurrentUserAsync()).Id;

                var rtn = await removalService.AddAsync(removal);

                if (!rtn.StartsWith("Error"))
                {
                    return(RedirectToAction(nameof(Index), new { msg = "Removal recorded successfully" }));
                }
                else
                {
                    ViewBag.Warehouses     = (await WarehouseService.ListAllAsync()).Select(m => new SelectListItem(m.Name, m.Id.ToString()));
                    ViewBag.InventoryItems = (await inventoryItemService.ListAllAsync()).Select(m => new SelectListItem(m.Name, m.Id.ToString()));

                    ModelState.AddModelError(string.Empty, rtn);
                    return(View(removal));
                }
            }
            catch
            {
                ViewBag.Warehouses     = (await WarehouseService.ListAllAsync()).Select(m => new SelectListItem(m.Name, m.Id.ToString()));
                ViewBag.InventoryItems = (await inventoryItemService.ListAllAsync()).Select(m => new SelectListItem(m.Name, m.Id.ToString()));
                return(View(removal));
            }
        }
示例#2
0
        public bool DisconnectDongle(bool remove = false)
        {
            bool result = false;

            byte[] disconnectReport = new byte[65];
            disconnectReport[0] = 0xe2;
            disconnectReport[1] = 0x02;
            Array.Clear(disconnectReport, 2, 63);

            lock (outputReport)
            {
                result = hDevice.WriteFeatureReport(disconnectReport);
            }

            if (result && remove)
            {
                isDisconnecting = true;
                StopOutputUpdate();

                uiContext.Send(new SendOrPostCallback(delegate(object state4)
                {
                    Removal?.Invoke(this, EventArgs.Empty);
                }), null);

                //System.Threading.Tasks.Task.Factory.StartNew(() => { Removal?.Invoke(this, EventArgs.Empty); });
                //Removal?.Invoke(this, EventArgs.Empty);
            }
            else if (result && !remove)
            {
                isRemoved = true;
            }

            return(result);
        }
示例#3
0
        public void TestRemovalIsValid()
        {
            var someCase = new FederalDiversityJurisdiction(new StateCourt("Missouri"))
            {
                GetDomicileLocation = lp =>
                {
                    if (lp is IPlaintiff)
                    {
                        return(new VocaBase("Ohio"));
                    }
                    if (lp is IDefendant)
                    {
                        return(new VocaBase("Missouri"));
                    }
                    return(null);
                },
                GetInjuryClaimDollars = lp => 75000.01M
            };

            var testSubject = new Removal(someCase)
            {
                IsRequestRemoval = lp => lp is IDefendant
            };
            var testResult = testSubject.IsValid(new ExamplePlaintiff(), new ExampleDefendant());

            Assert.IsFalse(testResult);
            Console.WriteLine(testSubject.ToString());
        }
示例#4
0
 public override void BeingRemoved()
 {
     if (Removal != null)
     {
         Removal.Invoke(this, new EventArgs());
     }
     base.BeingRemoved();
 }
示例#5
0
        public void RemoveCharacterFromString_Success()
        {
            var sentence  = "Hello World";
            var character = 'l';

            var remove   = new Removal();
            var expected = "Heo Word";

            Assert.AreEqual(expected, remove.RemoveCharacterFromString(character, sentence));
        }
示例#6
0
 public void TestRemovePartB()
 {
     using (var fs = File.Open("./template.docx", FileMode.OpenOrCreate, FileAccess.ReadWrite))
         using (var mould = new Mould(fs))
         {
             var removal = new Removal();
             removal.Add("PartBStart", "PartBEnd");
             mould.RemoveSection(removal);
             mould.Save();
         }
 }
示例#7
0
 // Game start - used to display the initial mode when the game runs and initialize grid
 private void Awake()
 {
     y        += 1;
     placement = GetComponent <Placement>();
     removal   = GetComponent <Removal>();
     selection = GetComponent <Selection>();
     movement  = GetComponent <Movement>();
     CreateGrid();
     CreatePlatform();
     UpdateMode();
 }
示例#8
0
        public void TestReplaceAndRemovePartB()
        {
            using (var fs = File.Open("./template.docx", FileMode.OpenOrCreate, FileAccess.ReadWrite))
                using (var mould = new Mould(fs))
                {
                    var removal = new Removal();
                    removal.Add("PartBStart", "PartBEnd");
                    mould.RemoveSection(removal);

                    var replacement = new Replacement();
                    replacement.Add("Field1", "Field1BlaBlaBla111");
                    replacement.Add("Field2", "Field2BlaBlaBla222");
                    replacement.Add("Field3", "Field3BlaBlaBla333");
                    mould.ReplaceField(replacement);
                    mould.Save();
                }
        }
示例#9
0
        public ActionResult Edit(int idSo)
        {
            Context.SalesOrder dbso = RepoSalesOrder.FindByPK(idSo);

            Removal model = new Removal(dbso);

            if (dbso.SalesOrderOncallId.HasValue)
            {
                return(View("FormOncall", model));
            }
            else if (dbso.SalesOrderPickupId.HasValue)
            {
                return(View("FormPickup", model));
            }
            else if (dbso.SalesOrderProsesKonsolidasiId.HasValue)
            {
                return(View("FormKonsolidasi", model));
            }

            return(View("Form", model));
        }
示例#10
0
        public async Task Process(RemoveBookInput input)
        {
            Book book = await bookReadOnlyRepository.Get(input.BookId);

            if (book == null)
            {
                throw new BookNotFoundException($"The book {input.BookId} does not exist.");
            }

            Basket basket = (input.BasketId != null)? await basketReadOnlyRepository.Get(input.BasketId):new Basket();

            Removal removal = new Removal(book.Id);

            basket.RemoveBook(removal);

            await basketWriteOnlyRepository.Update(basket);

            OrderOutput      orderResponse = outputConverter.Map <OrderOutput>(removal);
            RemoveBookOutput output        = new RemoveBookOutput(orderResponse, basket.GetTotalPrice().Value);

            outputBoundary.Populate(output);
        }
示例#11
0
 public void save(Removal dbitem)
 {
     dbitem.ModifiedDate = DateTime.Now;
     if (dbitem.Id == 0) //create
     {
         context.Removal.Add(dbitem);
         var auditrail = new Auditrail {
             Actionnya = "Add", EventDate = DateTime.Now, Modulenya = "Removal", QueryDetail = "Add ", RemoteAddress = AppHelper.GetIPAddress(), IdUser = 1
         };
         context.Auditrail.Add(auditrail);
     }
     else //edit
     {
         context.Removal.Attach(dbitem);
         var auditrail = new Auditrail {
             Actionnya = "Edit", EventDate = DateTime.Now, Modulenya = "Removal", QueryDetail = "Edit ", RemoteAddress = AppHelper.GetIPAddress(), IdUser = 1
         };
         context.Auditrail.Add(auditrail);
         var entry = context.Entry(dbitem);
         entry.State = EntityState.Modified;
     }
     context.SaveChanges();
 }
示例#12
0
        public async Task <string> AddAsync(Removal item)
        {
            var warehouseItem = await _dbContext.WarehouseInventoryItems
                                .FirstOrDefaultAsync(m => m.InventoryItemId == item.InventoryItemId && m.WarehouseId == item.WarehouseId);

            if (warehouseItem != null)
            {
                if (warehouseItem.ItemCount >= item.NumberOfItemRemoved)
                {
                    warehouseItem.ItemCount  -= item.NumberOfItemRemoved;
                    warehouseItem.LastUpdated = DateTime.Now;
                }
                else
                {
                    return($"Error: Not enough items in stock. Total in stock - {warehouseItem.ItemCount}");
                }
            }
            else
            {
                warehouseItem = new WarehouseInventoryItem()
                {
                    InventoryItemId = item.InventoryItemId,
                    ItemCount       = 0,
                    WarehouseId     = item.WarehouseId,
                    LastUpdated     = DateTime.Now
                };

                return($"Error: Not enough items in stock. Total in stock - {warehouseItem.ItemCount}");
            }

            await _dbContext.Removals.AddAsync(item);

            await _dbContext.SaveChangesAsync();

            return("Removal recorded successfully.");
        }
示例#13
0
        private void performDs4Input()
        {
            firstActive = DateTime.UtcNow;
            System.Timers.Timer readTimeout = new System.Timers.Timer(); // Await 30 seconds for the initial packet, then 3 seconds thereafter.
            readTimeout.Elapsed += delegate { HidDevice.CancelIO(); };
            List <long> Latency = new List <long>();
            long        oldtime = 0;
            Stopwatch   sw      = new Stopwatch();

            sw.Start();
            while (true)
            {
                string currerror = string.Empty;
                Latency.Add(sw.ElapsedMilliseconds - oldtime);
                oldtime = sw.ElapsedMilliseconds;

                if (Latency.Count > 100)
                {
                    Latency.RemoveAt(0);
                }

                this.Latency = Latency.Average();

                if (this.Latency > 10 && !warn && sw.ElapsedMilliseconds > 4000)
                {
                    warn = true;
                    //System.Diagnostics.Trace.WriteLine(System.DateTime.UtcNow.ToString("o") + "> " + "Controller " + /*this.DeviceNum*/ + 1 + " (" + this.MacAddress + ") is experiencing latency issues. Currently at " + Math.Round(this.Latency, 2).ToString() + "ms of recomended maximum 10ms");
                }
                else if (this.Latency <= 10 && warn)
                {
                    warn = false;
                }

                if (readTimeout.Interval != 3000.0)
                {
                    if (readTimeout.Interval != 30000.0)
                    {
                        readTimeout.Interval = 30000.0;
                    }
                    else
                    {
                        readTimeout.Interval = 3000.0;
                    }
                }
                readTimeout.Enabled = true;
                if (conType != ConnectionType.USB)
                {
                    HidDevice.ReadStatus res = hDevice.ReadFile(btInputReport);
                    readTimeout.Enabled = false;
                    if (res == HidDevice.ReadStatus.Success)
                    {
                        Array.Copy(btInputReport, 2, inputReport, 0, inputReport.Length);
                    }
                    else
                    {
                        Console.WriteLine(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + "> disconnect due to read failure: " + Marshal.GetLastWin32Error());
                        sendOutputReport(true); // Kick Windows into noticing the disconnection.
                        StopOutputUpdate();
                        IsDisconnecting = true;
                        Removal?.Invoke(this, EventArgs.Empty);
                        return;
                    }
                }
                else
                {
                    HidDevice.ReadStatus res = hDevice.ReadFile(inputReport);
                    readTimeout.Enabled = false;
                    if (res != HidDevice.ReadStatus.Success)
                    {
                        Console.WriteLine(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + "> disconnect due to read failure: " + Marshal.GetLastWin32Error());
                        StopOutputUpdate();
                        IsDisconnecting = true;
                        Removal?.Invoke(this, EventArgs.Empty);
                        return;
                    }
                }
                if (ConnectionType == ConnectionType.BT && btInputReport[0] != 0x11)
                {
                    //Received incorrect report, skip it
                    continue;
                }
                DateTime utcNow = System.DateTime.UtcNow; // timestamp with UTC in case system time zone changes
                resetHapticState();
                cState.ReportTimeStamp = utcNow;
                cState.LX = inputReport[1];
                cState.LY = inputReport[2];
                cState.RX = inputReport[3];
                cState.RY = inputReport[4];
                cState.L2 = inputReport[8];
                cState.R2 = inputReport[9];

                cState.Triangle  = ((byte)inputReport[5] & (1 << 7)) != 0;
                cState.Circle    = ((byte)inputReport[5] & (1 << 6)) != 0;
                cState.Cross     = ((byte)inputReport[5] & (1 << 5)) != 0;
                cState.Square    = ((byte)inputReport[5] & (1 << 4)) != 0;
                cState.DpadUp    = ((byte)inputReport[5] & (1 << 3)) != 0;
                cState.DpadDown  = ((byte)inputReport[5] & (1 << 2)) != 0;
                cState.DpadLeft  = ((byte)inputReport[5] & (1 << 1)) != 0;
                cState.DpadRight = ((byte)inputReport[5] & (1 << 0)) != 0;

                //Convert dpad into individual On/Off bits instead of a clock representation
                byte dpad_state = 0;

                dpad_state = (byte)(
                    ((cState.DpadRight ? 1 : 0) << 0) |
                    ((cState.DpadLeft ? 1 : 0) << 1) |
                    ((cState.DpadDown ? 1 : 0) << 2) |
                    ((cState.DpadUp ? 1 : 0) << 3));

                switch (dpad_state)
                {
                case 0: cState.DpadUp = true; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = false; break;

                case 1: cState.DpadUp = true; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = true; break;

                case 2: cState.DpadUp = false; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = true; break;

                case 3: cState.DpadUp = false; cState.DpadDown = true; cState.DpadLeft = false; cState.DpadRight = true; break;

                case 4: cState.DpadUp = false; cState.DpadDown = true; cState.DpadLeft = false; cState.DpadRight = false; break;

                case 5: cState.DpadUp = false; cState.DpadDown = true; cState.DpadLeft = true; cState.DpadRight = false; break;

                case 6: cState.DpadUp = false; cState.DpadDown = false; cState.DpadLeft = true; cState.DpadRight = false; break;

                case 7: cState.DpadUp = true; cState.DpadDown = false; cState.DpadLeft = true; cState.DpadRight = false; break;

                case 8: cState.DpadUp = false; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = false; break;
                }

                cState.R3      = ((byte)inputReport[6] & (1 << 7)) != 0;
                cState.L3      = ((byte)inputReport[6] & (1 << 6)) != 0;
                cState.Options = ((byte)inputReport[6] & (1 << 5)) != 0;
                cState.Share   = ((byte)inputReport[6] & (1 << 4)) != 0;
                cState.R1      = ((byte)inputReport[6] & (1 << 1)) != 0;
                cState.L1      = ((byte)inputReport[6] & (1 << 0)) != 0;

                cState.PS           = ((byte)inputReport[7] & (1 << 0)) != 0;
                cState.TouchButton  = (inputReport[7] & (1 << 2 - 1)) != 0;
                cState.FrameCounter = (byte)(inputReport[7] >> 2);

                // Store Gyro and Accel values
                Array.Copy(inputReport, 14, accel, 0, 6);
                Array.Copy(inputReport, 20, gyro, 0, 6);
                sixAxis.handleSixaxis(gyro, accel, cState);

                try
                {
                    charging       = (inputReport[30] & 0x10) != 0;
                    battery        = (inputReport[30] & 0x0f) * 10;
                    cState.Battery = (byte)battery;
                    if (inputReport[30] != priorInputReport30)
                    {
                        priorInputReport30 = inputReport[30];
                        Console.WriteLine(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + "> power subsystem octet: 0x" + inputReport[30].ToString("x02"));
                    }
                }
                catch { currerror = "Index out of bounds: battery"; }
                // XXX DS4State mapping needs fixup, turn touches into an array[4] of structs.  And include the touchpad details there instead.
                try
                {
                    for (int touches = inputReport[-1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET - 1], touchOffset = 0; touches > 0; touches--, touchOffset += 9)
                    {
                        cState.TouchPacketCounter = inputReport[-1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset];
                        cState.Touch1             = (inputReport[0 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] >> 7) != 0 ? false : true; // >= 1 touch detected
                        cState.Touch1Identifier   = (byte)(inputReport[0 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0x7f);
                        cState.Touch2             = (inputReport[4 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] >> 7) != 0 ? false : true; // 2 touches detected
                        cState.Touch2Identifier   = (byte)(inputReport[4 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0x7f);
                        cState.TouchLeft          = (inputReport[1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] + ((inputReport[2 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0xF) * 255) >= 1920 * 2 / 5) ? false : true;
                        cState.TouchRight         = (inputReport[1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] + ((inputReport[2 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0xF) * 255) < 1920 * 2 / 5) ? false : true;
                        // Even when idling there is still a touch packet indicating no touch 1 or 2
                        touchpad.handleTouchpad(inputReport, cState, touchOffset);
                    }
                }
                catch { currerror = "Index out of bounds: touchpad"; }

                /* Debug output of incoming HID data:
                 * if (cState.L2 == 0xff && cState.R2 == 0xff)
                 * {
                 *  Console.Write(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + ">");
                 *  for (int i = 0; i < inputReport.Length; i++)
                 *      Console.Write(" " + inputReport[i].ToString("x2"));
                 *  Console.WriteLine();
                 * } */
                if (!isDS4Idle())
                {
                    lastActive = utcNow;
                }
                if (conType == ConnectionType.BT)
                {
                    bool shouldDisconnect = false;
                    if (IdleTimeout > 0)
                    {
                        if (isDS4Idle())
                        {
                            DateTime timeout = lastActive + TimeSpan.FromSeconds(IdleTimeout);
                            if (!Charging)
                            {
                                shouldDisconnect = utcNow >= timeout;
                            }
                        }
                    }
                    if (shouldDisconnect && DisconnectBT())
                    {
                        return; // all done
                    }
                }
                // XXX fix initialization ordering so the null checks all go away
                if (Report != null)
                {
                    Report(this, EventArgs.Empty);
                }
                sendOutputReport(false);
                if (!string.IsNullOrEmpty(error))
                {
                    error = string.Empty;
                }
                if (!string.IsNullOrEmpty(currerror))
                {
                    error = currerror;
                }
                cState.CopyTo(pState);

                Thread.Sleep(WHILE_LOOP_TIMEOUT);
            }
        }
示例#14
0
        public ActionResult Edit(Removal model)
        {
            Context.SalesOrder     dbso         = RepoSalesOrder.FindByPK(model.IdSo.Value);
            SalesOrderLoadUnload[] resultUnload = new SalesOrderLoadUnload[0];
            if (model.StrUnload != null && model.StrUnload != "")
            {
                resultUnload     = JsonConvert.DeserializeObject <SalesOrderLoadUnload[]>(model.StrUnload);
                model.ListUnload = resultUnload.ToList();
            }

            if (ModelState.IsValid)
            {
                //rubah data so na
                if (dbso.SalesOrderOncallId.HasValue)
                {
                    dbso.SalesOrderOncall.IdDaftarHargaItem  = model.IdRute;
                    dbso.SalesOrderOncall.StrDaftarHargaItem = model.StrRute;
                    dbso.SalesOrderOncall.SalesOrderOnCallUnLoadingAdd.Clear();
                    foreach (var item in resultUnload)
                    {
                        dbso.SalesOrderOncall.SalesOrderOnCallUnLoadingAdd.Add(new Context.SalesOrderOnCallUnLoadingAdd()
                        {
                            CustomerId = dbso.SalesOrderOncall.CustomerId,
                            CustomerUnloadingAddressId = item.Id,
                            urutan   = item.urutan,
                            IsSelect = item.IsSelect
                        });
                    }
                }
                else if (dbso.SalesOrderPickupId.HasValue)
                {
                    dbso.SalesOrderPickup.RuteId = model.IdRute;
                    dbso.SalesOrderPickup.SalesOrderPickupUnLoadingAdd.Clear();
                    RepoAuditrail.saveDelAllSalesOrderPickupUnLoadingAddQuery(dbso.SalesOrderPickup, UserPrincipal.id);
                    foreach (var item in resultUnload)
                    {
                        dbso.SalesOrderOncall.SalesOrderOnCallUnLoadingAdd.Add(new Context.SalesOrderOnCallUnLoadingAdd()
                        {
                            CustomerId = dbso.SalesOrderOncall.CustomerId,
                            CustomerUnloadingAddressId = item.Id,
                            urutan   = item.urutan,
                            IsSelect = item.IsSelect
                        });
                    }
                }
                else if (dbso.SalesOrderProsesKonsolidasiId.HasValue)
                {
                    dbso.SalesOrderProsesKonsolidasi.IdDaftarHargaItem  = model.IdRute;
                    dbso.SalesOrderProsesKonsolidasi.StrDaftarHargaItem = model.StrRute;
                }

                dbso.AdminUangJalan.Removal.Add(new Context.Removal()
                {
                    StatusTagihan     = model.StatusTagihan,
                    TanggalRemoval    = model.TanggalRemoval,
                    JamRemoval        = model.JamRemoval,
                    KeteranganRemoval = model.Keterangan,
                    IdDriver1         = dbso.AdminUangJalan.IdDriver1,
                    IdDriver2         = dbso.AdminUangJalan.IdDriver2,
                    IdSO = dbso.Id
                });
                RepoSalesOrder.save(dbso);
                RepoAuditrail.saveUpdSalesOrderProsesKonsolidasiQuery(dbso.SalesOrderProsesKonsolidasi, UserPrincipal.id);
                return(RedirectToAction("Index", "ListOrder"));
            }

            if (dbso.SalesOrderOncallId.HasValue)
            {
                model.ModelOncall = new SalesOrderOncall(dbso);
                return(View("FormOncall", model));
            }
            else if (dbso.SalesOrderPickupId.HasValue)
            {
                model.ModelPickup = new SalesOrderPickup(dbso);
                return(View("FormPickup", model));
            }
            else if (dbso.SalesOrderProsesKonsolidasiId.HasValue)
            {
                model.ModelKonsolidasi = new SalesOrderProsesKonsolidasi(dbso);
                return(View("FormKonsolidasi", model));
            }

            return(View(""));
        }
        private void RemovalSamplesProxy(SpecLabEntities _entities,
                                         DatabaseCommand <RemovalSampleParam, bool> paramCommand)
        {
            var checkExists = (from removal in _entities.Removals
                               where removal.RemovalId == paramCommand.CallingInfo.RemovalId
                               select removal.RemovalId);

            if (checkExists.Any())
            {
                throw new BusinessException(ErrorCode.RemovalIdExists);
            }

            var removalDbItem = new Removal()
            {
                CreateDate    = DateTime.Now,
                UpdateDate    = DateTime.Now,
                RemovalDate   = paramCommand.CallingInfo.RemovalDate,
                RemovalId     = paramCommand.CallingInfo.RemovalId,
                RemovalUserId = paramCommand.CallingInfo.RemovalUserId,
                RemovalReason = paramCommand.CallingInfo.RemovalReason,
                SampleNumber  = paramCommand.CallingInfo.TubeRemovalIds.Count
            };

            foreach (var tubeId in paramCommand.CallingInfo.TubeRemovalIds)
            {
                var tubeDbItem = (from tube in _entities.TubeSamples
                                  where tube.TubeId == tubeId
                                  select tube).FirstOrDefault();

                if (tubeDbItem == null)
                {
                    throw new BusinessException(ErrorCode.TubeIdNotExists);
                }

                removalDbItem.RemovalDetails.Add(new RemovalDetail()
                {
                    RemovalId    = paramCommand.CallingInfo.RemovalId,
                    TubeId       = tubeId,
                    Status       = tubeDbItem.Status,
                    TubeType     = tubeDbItem.TubeType,
                    StorageId    = tubeDbItem.StorageId,
                    LocationNum  = tubeDbItem.LocationNum,
                    Volume       = tubeDbItem.Volume,
                    NumberExport = tubeDbItem.NumberExport,
                    CreateDate   = DateTime.Now,
                    UpdateDate   = DateTime.Now
                });

                tubeDbItem.Status = (int)TubeSampleStatus.Remove;
                tubeDbItem.SampleHistories.Add(new SampleHistory()
                {
                    HistoryDate  = DateTime.Now,
                    Action       = (int)HistoryAction.Remove,
                    UserId       = paramCommand.CallingInfo.RemovalUserId,
                    Status       = tubeDbItem.Status,
                    TubeType     = tubeDbItem.TubeType,
                    Volume       = tubeDbItem.Volume,
                    StorageId    = tubeDbItem.StorageId,
                    LocationNum  = tubeDbItem.LocationNum,
                    TubeId       = tubeDbItem.TubeId,
                    Description  = "",
                    NumberExport = tubeDbItem.NumberExport,
                });
            }

            _entities.Removals.Add(removalDbItem);
            _entities.SaveChanges();
        }
示例#16
0
 public async Task UpdateAsync(Removal item)
 {
     _dbContext.Entry(item).State = EntityState.Modified;
     await _dbContext.SaveChangesAsync();
 }
示例#17
0
 public async Task DeleteAsync(Removal item)
 {
     _dbContext.Removals.Remove(item);
     await _dbContext.SaveChangesAsync();
 }
示例#18
0
        private void performDs4Input()
        {
            firstActive = DateTime.UtcNow;
            NativeMethods.HidD_SetNumInputBuffers(hDevice.safeReadHandle.DangerousGetHandle(), 2);
            //List<long> latencyList = new List<long>(51); // Set capacity at max + 1 to avoid any list resizing
            Queue <long> latencyQueue     = new Queue <long>(51); // Set capacity at max + 1 to avoid any resizing
            int          tempLatencyCount = 0;
            long         oldtime          = 0;
            string       currerror        = string.Empty;
            long         curtime          = 0;
            Stopwatch    sw = new Stopwatch();

            sw.Start();
            timeoutEvent = false;

            int maxBatteryValue = 0;
            int tempBattery     = 0;

            while (!exitInputThread)
            {
                oldCharging          = charging;
                currerror            = string.Empty;
                curtime              = sw.ElapsedMilliseconds;
                this.lastTimeElapsed = curtime - oldtime;
                //latencyList.Add(this.lastTimeElapsed);
                latencyQueue.Enqueue(this.lastTimeElapsed);
                tempLatencyCount++;
                oldtime = curtime;

                if (tempLatencyCount > 50)
                {
                    //latencyList.RemoveAt(0);
                    latencyQueue.Dequeue();
                    tempLatencyCount--;
                }

                //Latency = latencyList.Average();
                //latencyList.Average();
                Latency = latencyQueue.Average();

                if (conType == ConnectionType.BT)
                {
                    //HidDevice.ReadStatus res = hDevice.ReadFile(btInputReport);
                    //HidDevice.ReadStatus res = hDevice.ReadAsyncWithFileStream(btInputReport, READ_STREAM_TIMEOUT);
                    HidDevice.ReadStatus res = hDevice.ReadWithFileStream(btInputReport);
                    timeoutEvent = false;
                    //HidDevice.ReadStatus res = hDevice.ReadFileOverlapped(btInputReport, READ_STREAM_TIMEOUT);
                    if (res == HidDevice.ReadStatus.Success)
                    {
                        Array.Copy(btInputReport, 2, inputReport, 0, inputReport.Length);
                    }
                    else
                    {
                        if (res == HidDevice.ReadStatus.WaitTimedOut)
                        {
                            Log.LogToGui(Mac.ToString() + " disconnected due to timeout", true);
                        }
                        else
                        {
                            int winError = Marshal.GetLastWin32Error();
                            Console.WriteLine(Mac.ToString() + " " + System.DateTime.UtcNow.ToString("o") + "> disconnect due to read failure: " + winError);
                            //Log.LogToGui(Mac.ToString() + " disconnected due to read failure: " + winError, true);
                        }

                        sendOutputReport(true); // Kick Windows into noticing the disconnection.
                        StopOutputUpdate();
                        isDisconnecting = true;
                        uiContext.Send(new SendOrPostCallback(delegate(object state4)
                        {
                            Removal?.Invoke(this, EventArgs.Empty);
                        }), null);

                        //System.Threading.Tasks.Task.Factory.StartNew(() => { Removal?.Invoke(this, EventArgs.Empty); });
                        //Removal?.Invoke(this, EventArgs.Empty);

                        timeoutExecuted = true;
                        return;
                    }
                }
                else
                {
                    //HidDevice.ReadStatus res = hDevice.ReadFile(inputReport);
                    //Array.Clear(inputReport, 0, inputReport.Length);
                    //HidDevice.ReadStatus res = hDevice.ReadAsyncWithFileStream(inputReport, READ_STREAM_TIMEOUT);
                    HidDevice.ReadStatus res = hDevice.ReadWithFileStream(inputReport);
                    //HidDevice.ReadStatus res = hDevice.ReadFileOverlapped(inputReport, READ_STREAM_TIMEOUT);
                    if (res != HidDevice.ReadStatus.Success)
                    {
                        if (res == HidDevice.ReadStatus.WaitTimedOut)
                        {
                            Log.LogToGui(Mac.ToString() + " disconnected due to timeout", true);
                        }
                        else
                        {
                            int winError = Marshal.GetLastWin32Error();
                            Console.WriteLine(Mac.ToString() + " " + System.DateTime.UtcNow.ToString("o") + "> disconnect due to read failure: " + winError);
                            //Log.LogToGui(Mac.ToString() + " disconnected due to read failure: " + winError, true);
                        }

                        StopOutputUpdate();
                        isDisconnecting = true;
                        uiContext.Send(new SendOrPostCallback(delegate(object state4)
                        {
                            Removal?.Invoke(this, EventArgs.Empty);
                        }), null);

                        //System.Threading.Tasks.Task.Factory.StartNew(() => { Removal?.Invoke(this, EventArgs.Empty); });
                        //Removal?.Invoke(this, EventArgs.Empty);

                        timeoutExecuted = true;
                        return;
                    }
                    else
                    {
                        //Array.Copy(inputReport2, 0, inputReport, 0, inputReport.Length);
                    }
                }

                if (conType == ConnectionType.BT && btInputReport[0] != 0x11)
                {
                    //Received incorrect report, skip it
                    continue;
                }

                DateTime utcNow = DateTime.UtcNow; // timestamp with UTC in case system time zone changes
                resetHapticState();
                cState.ReportTimeStamp = utcNow;
                cState.LX = inputReport[1];
                cState.LY = inputReport[2];
                cState.RX = inputReport[3];
                cState.RY = inputReport[4];
                cState.L2 = inputReport[8];
                cState.R2 = inputReport[9];

                cState.Triangle = (inputReport[5] & (1 << 7)) != 0;
                cState.Circle   = (inputReport[5] & (1 << 6)) != 0;
                cState.Cross    = (inputReport[5] & (1 << 5)) != 0;
                cState.Square   = (inputReport[5] & (1 << 4)) != 0;

                // First 4 bits denote dpad state. Clock representation
                // with 8 meaning centered and 0 meaning DpadUp.
                byte dpad_state = (byte)(inputReport[5] & 0x0F);

                switch (dpad_state)
                {
                case 0: cState.DpadUp = true; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = false; break;

                case 1: cState.DpadUp = true; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = true; break;

                case 2: cState.DpadUp = false; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = true; break;

                case 3: cState.DpadUp = false; cState.DpadDown = true; cState.DpadLeft = false; cState.DpadRight = true; break;

                case 4: cState.DpadUp = false; cState.DpadDown = true; cState.DpadLeft = false; cState.DpadRight = false; break;

                case 5: cState.DpadUp = false; cState.DpadDown = true; cState.DpadLeft = true; cState.DpadRight = false; break;

                case 6: cState.DpadUp = false; cState.DpadDown = false; cState.DpadLeft = true; cState.DpadRight = false; break;

                case 7: cState.DpadUp = true; cState.DpadDown = false; cState.DpadLeft = true; cState.DpadRight = false; break;

                case 8:
                default: cState.DpadUp = false; cState.DpadDown = false; cState.DpadLeft = false; cState.DpadRight = false; break;
                }

                cState.R3      = (inputReport[6] & (1 << 7)) != 0;
                cState.L3      = (inputReport[6] & (1 << 6)) != 0;
                cState.Options = (inputReport[6] & (1 << 5)) != 0;
                cState.Share   = (inputReport[6] & (1 << 4)) != 0;
                cState.R1      = (inputReport[6] & (1 << 1)) != 0;
                cState.L1      = (inputReport[6] & (1 << 0)) != 0;

                cState.PS           = (inputReport[7] & (1 << 0)) != 0;
                cState.TouchButton  = (inputReport[7] & (1 << 2 - 1)) != 0;
                cState.FrameCounter = (byte)(inputReport[7] >> 2);

                // Store Gyro and Accel values
                Array.Copy(inputReport, 14, accel, 0, 6);
                Array.Copy(inputReport, 20, gyro, 0, 6);
                sixAxis.handleSixaxis(gyro, accel, cState);

                try
                {
                    charging        = (inputReport[30] & 0x10) != 0;
                    maxBatteryValue = charging ? BATTERY_MAX_USB : BATTERY_MAX;
                    tempBattery     = (inputReport[30] & 0x0f) * 100 / maxBatteryValue;
                    battery         = Math.Min((byte)tempBattery, (byte)100);
                    cState.Battery  = (byte)battery;
                    //System.Diagnostics.Debug.WriteLine("CURRENT BATTERY: " + (inputReport[30] & 0x0f) + " | " + tempBattery + " | " + battery);
                    if (inputReport[30] != priorInputReport30)
                    {
                        priorInputReport30 = inputReport[30];
                        //Console.WriteLine(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + "> power subsystem octet: 0x" + inputReport[30].ToString("x02"));
                    }
                }
                catch { currerror = "Index out of bounds: battery"; }

                // XXX DS4State mapping needs fixup, turn touches into an array[4] of structs.  And include the touchpad details there instead.
                try
                {
                    // Only care if one touch packet is detected. Other touch packets
                    // don't seem to contain relevant data. ds4drv does not use them either.
                    for (int touches = Math.Max((int)(inputReport[-1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET - 1]), 1), touchOffset = 0; touches > 0; touches--, touchOffset += 9)
                    //for (int touches = inputReport[-1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET - 1], touchOffset = 0; touches > 0; touches--, touchOffset += 9)
                    {
                        cState.TouchPacketCounter = inputReport[-1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset];
                        cState.Touch1             = (inputReport[0 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] >> 7) != 0 ? false : true; // >= 1 touch detected
                        cState.Touch1Identifier   = (byte)(inputReport[0 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0x7f);
                        cState.Touch2             = (inputReport[4 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] >> 7) != 0 ? false : true; // 2 touches detected
                        cState.Touch2Identifier   = (byte)(inputReport[4 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0x7f);
                        cState.TouchLeft          = (inputReport[1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] + ((inputReport[2 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0xF) * 255) >= 1920 * 2 / 5) ? false : true;
                        cState.TouchRight         = (inputReport[1 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] + ((inputReport[2 + DS4Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0xF) * 255) < 1920 * 2 / 5) ? false : true;
                        // Even when idling there is still a touch packet indicating no touch 1 or 2
                        touchpad.handleTouchpad(inputReport, cState, touchOffset);
                    }
                }
                catch { currerror = "Index out of bounds: touchpad"; }

                /* Debug output of incoming HID data:
                 * if (cState.L2 == 0xff && cState.R2 == 0xff)
                 * {
                 *  Console.Write(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + ">");
                 *  for (int i = 0; i < inputReport.Length; i++)
                 *      Console.Write(" " + inputReport[i].ToString("x2"));
                 *  Console.WriteLine();
                 * } */

                if (conType == ConnectionType.SONYWA)
                {
                    bool controllerSynced = inputReport[31] == 0;
                    if (controllerSynced != synced)
                    {
                        synced = controllerSynced;
                        SyncChange?.Invoke(this, EventArgs.Empty);
                    }
                }

                bool ds4Idle = cState.FrameCounter == pState.FrameCounter;
                if (!ds4Idle)
                {
                    isRemoved = false;
                }

                if (conType == ConnectionType.USB)
                {
                    lastActive = utcNow;
                }
                else
                {
                    bool shouldDisconnect = false;
                    int  idleTime         = idleTimeout;
                    if (!isRemoved && idleTime > 0)
                    {
                        bool idleInput = isDS4Idle();
                        if (idleInput)
                        {
                            DateTime timeout = lastActive + TimeSpan.FromSeconds(idleTime);
                            if (!charging)
                            {
                                shouldDisconnect = utcNow >= timeout;
                            }
                        }
                        else
                        {
                            lastActive = utcNow;
                        }
                    }
                    else
                    {
                        lastActive = utcNow;
                    }

                    if (shouldDisconnect)
                    {
                        Log.LogToGui(Mac.ToString() + " disconnecting due to idle disconnect", false);

                        if (conType == ConnectionType.BT)
                        {
                            if (DisconnectBT(true))
                            {
                                timeoutExecuted = true;
                                return; // all done
                            }
                        }
                        else if (conType == ConnectionType.SONYWA)
                        {
                            DisconnectDongle();
                        }
                    }
                }

                if (oldCharging != charging && conType == ConnectionType.BT)
                {
                    if (Global.getQuickCharge() && charging)
                    {
                        DisconnectBT(true);
                        timeoutExecuted = true;
                        return;
                    }
                }

                if (Report != null)
                {
                    Report(this, EventArgs.Empty);
                }

                bool syncWriteReport = true;
                if (conType == ConnectionType.BT)
                {
                    syncWriteReport = false;
                }
                sendOutputReport(syncWriteReport);

                if (!string.IsNullOrEmpty(currerror))
                {
                    error = currerror;
                }
                else if (!string.IsNullOrEmpty(error))
                {
                    error = string.Empty;
                }

                cState.CopyTo(pState);

                lock (eventQueueLock)
                {
                    Action tempAct = null;
                    for (int actInd = 0, actLen = eventQueue.Count; actInd < actLen; actInd++)
                    //foreach (Action tempAct in eventQueue)
                    {
                        tempAct = eventQueue.Dequeue();
                        tempAct.Invoke();
                    }

                    //eventQueue.Clear();
                }
            }

            timeoutExecuted = true;
        }
示例#19
0
 public void runRemoval()
 {
     Removal?.Invoke(this, EventArgs.Empty);
 }
示例#20
0
        private void PerformDs4Input()
        {
            FirstActive = DateTime.UtcNow;

            var readTimeout = new System.Timers.Timer(); // Await 30 seconds for the initial packet, then 3 seconds thereafter.

            readTimeout.Elapsed += (sender, args) => HidDevice.CancelIO();

            var  latencies = new List <long>();
            long oldtime   = 0;

            var sw = Stopwatch.StartNew();

            while (true)
            {
                var currentError = string.Empty;

                latencies.Add(sw.ElapsedMilliseconds - oldtime);
                oldtime = sw.ElapsedMilliseconds;

                if (latencies.Count > 100)
                {
                    latencies.RemoveAt(0);
                }

                Latency = latencies.Average();

                if (Latency > 10 && !warn && sw.ElapsedMilliseconds > 4000)
                {
                    warn = true;
                }
                else if (Latency <= 10 && warn)
                {
                    warn = false;
                }

                if (readTimeout.Interval != 3000.0)
                {
                    if (readTimeout.Interval != 30000.0)
                    {
                        readTimeout.Interval = 30000.0;
                    }
                    else
                    {
                        readTimeout.Interval = 3000.0;
                    }
                }
                readTimeout.Enabled = true;
                if (ConnectionType != ConnectionType.USB)
                {
                    var res = HidDevice.ReadFile(_btInputReport);
                    readTimeout.Enabled = false;
                    if (res == HidDevice.ReadStatus.Success)
                    {
                        Array.Copy(_btInputReport, 2, _inputReport, 0, _inputReport.Length);
                    }
                    else
                    {
                        Console.WriteLine(MacAddress + " " + DateTime.UtcNow.ToString("o") + "> disconnect due to read failure: " +
                                          Marshal.GetLastWin32Error());
                        SendOutputReport(true); // Kick Windows into noticing the disconnection.
                        StopOutputUpdate();
                        IsDisconnecting = true;
                        Removal?.Invoke(this, EventArgs.Empty);
                        return;
                    }
                }
                else
                {
                    var res = HidDevice.ReadFile(_inputReport);
                    readTimeout.Enabled = false;
                    if (res != HidDevice.ReadStatus.Success)
                    {
                        Console.WriteLine(MacAddress + " " + DateTime.UtcNow.ToString("o") + "> disconnect due to read failure: " +
                                          Marshal.GetLastWin32Error());
                        StopOutputUpdate();
                        IsDisconnecting = true;
                        Removal?.Invoke(this, EventArgs.Empty);
                        return;
                    }
                }
                if (ConnectionType == ConnectionType.BT && _btInputReport[0] != 0x11)
                {
                    //Received incorrect report, skip it
                    continue;
                }
                var utcNow = DateTime.UtcNow; // timestamp with UTC in case system time zone changes
                resetHapticState();
                _cState.ReportTimeStamp = utcNow;
                _cState.LX = _inputReport[1];
                _cState.LY = _inputReport[2];
                _cState.RX = _inputReport[3];
                _cState.RY = _inputReport[4];
                _cState.L2 = _inputReport[8];
                _cState.R2 = _inputReport[9];

                _cState.Triangle  = (_inputReport[5] & (1 << 7)) != 0;
                _cState.Circle    = (_inputReport[5] & (1 << 6)) != 0;
                _cState.Cross     = (_inputReport[5] & (1 << 5)) != 0;
                _cState.Square    = (_inputReport[5] & (1 << 4)) != 0;
                _cState.DpadUp    = (_inputReport[5] & (1 << 3)) != 0;
                _cState.DpadDown  = (_inputReport[5] & (1 << 2)) != 0;
                _cState.DpadLeft  = (_inputReport[5] & (1 << 1)) != 0;
                _cState.DpadRight = (_inputReport[5] & (1 << 0)) != 0;

                //Convert dpad into individual On/Off bits instead of a clock representation
                var dpadState = (byte)(
                    ((_cState.DpadRight ? 1 : 0) << 0) |
                    ((_cState.DpadLeft ? 1 : 0) << 1) |
                    ((_cState.DpadDown ? 1 : 0) << 2) |
                    ((_cState.DpadUp ? 1 : 0) << 3));

                switch (dpadState)
                {
                case 0:
                    _cState.DpadUp    = true;
                    _cState.DpadDown  = false;
                    _cState.DpadLeft  = false;
                    _cState.DpadRight = false;
                    break;

                case 1:
                    _cState.DpadUp    = true;
                    _cState.DpadDown  = false;
                    _cState.DpadLeft  = false;
                    _cState.DpadRight = true;
                    break;

                case 2:
                    _cState.DpadUp    = false;
                    _cState.DpadDown  = false;
                    _cState.DpadLeft  = false;
                    _cState.DpadRight = true;
                    break;

                case 3:
                    _cState.DpadUp    = false;
                    _cState.DpadDown  = true;
                    _cState.DpadLeft  = false;
                    _cState.DpadRight = true;
                    break;

                case 4:
                    _cState.DpadUp    = false;
                    _cState.DpadDown  = true;
                    _cState.DpadLeft  = false;
                    _cState.DpadRight = false;
                    break;

                case 5:
                    _cState.DpadUp    = false;
                    _cState.DpadDown  = true;
                    _cState.DpadLeft  = true;
                    _cState.DpadRight = false;
                    break;

                case 6:
                    _cState.DpadUp    = false;
                    _cState.DpadDown  = false;
                    _cState.DpadLeft  = true;
                    _cState.DpadRight = false;
                    break;

                case 7:
                    _cState.DpadUp    = true;
                    _cState.DpadDown  = false;
                    _cState.DpadLeft  = true;
                    _cState.DpadRight = false;
                    break;

                case 8:
                    _cState.DpadUp    = false;
                    _cState.DpadDown  = false;
                    _cState.DpadLeft  = false;
                    _cState.DpadRight = false;
                    break;
                }

                _cState.R3      = (_inputReport[6] & (1 << 7)) != 0;
                _cState.L3      = (_inputReport[6] & (1 << 6)) != 0;
                _cState.Options = (_inputReport[6] & (1 << 5)) != 0;
                _cState.Share   = (_inputReport[6] & (1 << 4)) != 0;
                _cState.R1      = (_inputReport[6] & (1 << 1)) != 0;
                _cState.L1      = (_inputReport[6] & (1 << 0)) != 0;

                _cState.PS           = (_inputReport[7] & (1 << 0)) != 0;
                _cState.TouchButton  = (_inputReport[7] & (1 << 2 - 1)) != 0;
                _cState.FrameCounter = (byte)(_inputReport[7] >> 2);

                // Store Gyro and Accel values
                Array.Copy(_inputReport, 14, _accel, 0, 6);
                Array.Copy(_inputReport, 20, _gyro, 0, 6);
                SixAxis.handleSixaxis(_gyro, _accel, _cState);

                try
                {
                    Charging        = (_inputReport[30] & 0x10) != 0;
                    Battery         = (_inputReport[30] & 0x0f) * 10;
                    _cState.Battery = (byte)Battery;
                    if (_inputReport[30] != priorInputReport30)
                    {
                        priorInputReport30 = _inputReport[30];
                        Console.WriteLine(MacAddress + " " + DateTime.UtcNow.ToString("o") + "> power subsystem octet: 0x" +
                                          _inputReport[30].ToString("x02"));
                    }
                }
                catch
                {
                    currentError = "Index out of bounds: battery";
                }
                // XXX DS4State mapping needs fixup, turn touches into an array[4] of structs.  And include the touchpad details there instead.
                try
                {
                    for (int touches = _inputReport[-1 + Touchpad.TOUCHPAD_DATA_OFFSET - 1], touchOffset = 0; touches > 0; touches--, touchOffset += 9)
                    {
                        _cState.TouchPacketCounter = _inputReport[-1 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset];
                        _cState.Touch1             = _inputReport[0 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] >> 7 == 0; // >= 1 touch detected
                        _cState.Touch1Identifier   = (byte)(_inputReport[0 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0x7f);
                        _cState.Touch2             = _inputReport[4 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] >> 7 == 0; // 2 touches detected
                        _cState.Touch2Identifier   = (byte)(_inputReport[4 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0x7f);
                        _cState.TouchLeft          = _inputReport[1 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] +
                                                     (_inputReport[2 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0xF) * 255 < 1920 * 2 / 5;
                        _cState.TouchRight = _inputReport[1 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] +
                                             (_inputReport[2 + Touchpad.TOUCHPAD_DATA_OFFSET + touchOffset] & 0xF) * 255 >= 1920 * 2 / 5;
                        // Even when idling there is still a touch packet indicating no touch 1 or 2
                        Touchpad.handleTouchpad(_inputReport, _cState, touchOffset);
                    }
                }
                catch
                {
                    currentError = "Index out of bounds: touchpad";
                }

                /* Debug output of incoming HID data:
                 * if (cState.L2 == 0xff && cState.R2 == 0xff)
                 * {
                 *  Console.Write(MacAddress.ToString() + " " + System.DateTime.UtcNow.ToString("o") + ">");
                 *  for (int i = 0; i < inputReport.Length; i++)
                 *      Console.Write(" " + inputReport[i].ToString("x2"));
                 *  Console.WriteLine();
                 * } */
                if (!IsIdle())
                {
                    LastActive = utcNow;
                }
                if (ConnectionType == ConnectionType.BT)
                {
                    var shouldDisconnect = false;
                    if (IdleTimeout > 0)
                    {
                        if (IsIdle())
                        {
                            var timeout = LastActive + TimeSpan.FromSeconds(IdleTimeout);
                            if (!Charging)
                            {
                                shouldDisconnect = utcNow >= timeout;
                            }
                        }
                    }
                    if (shouldDisconnect && DisconnectBT())
                    {
                        return; // all done
                    }
                }

                // XXX fix initialization ordering so the null checks all go away
                Report?.Invoke(this, EventArgs.Empty);

                SendOutputReport(false);
                if (!string.IsNullOrEmpty(error))
                {
                    error = string.Empty;
                }
                if (!string.IsNullOrEmpty(currentError))
                {
                    error = currentError;
                }
                _cState.CopyTo(_pState);
            }
        }
示例#21
0
        public bool DisconnectBT(bool callRemoval = false)
        {
            if (Mac != null)
            {
                Console.WriteLine("Trying to disconnect BT device " + Mac);
                IntPtr btHandle = IntPtr.Zero;
                int    IOCTL_BTH_DISCONNECT_DEVICE = 0x41000c;

                byte[]   btAddr = new byte[8];
                string[] sbytes = Mac.Split(':');
                for (int i = 0; i < 6; i++)
                {
                    // parse hex byte in reverse order
                    btAddr[5 - i] = Convert.ToByte(sbytes[i], 16);
                }

                long lbtAddr = BitConverter.ToInt64(btAddr, 0);

                bool success = false;
                // Wait for output report to be written
                lock (outputReport)
                {
                    NativeMethods.BLUETOOTH_FIND_RADIO_PARAMS p = new NativeMethods.BLUETOOTH_FIND_RADIO_PARAMS();
                    p.dwSize = Marshal.SizeOf(typeof(NativeMethods.BLUETOOTH_FIND_RADIO_PARAMS));
                    IntPtr searchHandle  = NativeMethods.BluetoothFindFirstRadio(ref p, ref btHandle);
                    int    bytesReturned = 0;

                    while (!success && btHandle != IntPtr.Zero)
                    {
                        success = NativeMethods.DeviceIoControl(btHandle, IOCTL_BTH_DISCONNECT_DEVICE, ref lbtAddr, 8, IntPtr.Zero, 0, ref bytesReturned, IntPtr.Zero);
                        NativeMethods.CloseHandle(btHandle);
                        if (!success)
                        {
                            if (!NativeMethods.BluetoothFindNextRadio(searchHandle, ref btHandle))
                            {
                                btHandle = IntPtr.Zero;
                            }
                        }
                    }

                    NativeMethods.BluetoothFindRadioClose(searchHandle);
                    Console.WriteLine("Disconnect successful: " + success);
                }

                success = true; // XXX return value indicates failure, but it still works?
                if (success)
                {
                    IsDisconnecting = true;
                    StopOutputUpdate();

                    if (callRemoval)
                    {
                        uiContext.Send(new SendOrPostCallback(delegate(object state)
                        {
                            Removal?.Invoke(this, EventArgs.Empty);
                        }), null);

                        //System.Threading.Tasks.Task.Factory.StartNew(() => { Removal?.Invoke(this, EventArgs.Empty); });
                    }
                }

                return(success);
            }

            return(false);
        }
示例#22
0
        // END

        // BEGIN - Botkiller
        private static bool bkill()
        {
            Removal.ScanThread();
            return(true);
        }