Example #1
0
        public unsafe virtual void Write(byte [] data)
        {
            lock (_writingSyncObject)
            {
                if (Extension && Parent != null)
                {
                    byte [] d = new byte[data.Length + 1];
                    Array.Copy(data, 0, d, 1, data.Length);
                    d[0] = (byte)DeviceId;
                    Parent.Write(d);
                }
                else
                {
                    // TODO
                    if (_pipes.Opened && data != null && data.Length > 0 && data.Length < 65)
                    {
                        byte *sendBuf = stackalloc byte[data.Length];
                        for (int i = 0; i < data.Length; i++)
                        {
                            sendBuf[i] = data[i];
                        }
                        byte *receiveBuf = stackalloc byte[64];
                        uint  tmp        = 0;
                        uint *sent       = &tmp;
                        uint  dataLength = (uint)data.Length;

                        #if READ_WRITE_LOG
                        string s = "";
                        for (int i = 0; i < data.Length; i++)
                        {
                            s = s + "0x" + data[i].ToString("X2") + ", ";
                        }
                        _working.Log("\tWysyłam dane (" + data.Length.ToString() + "): " + s);
                        #endif
                        uint r = 0;
                        if ((r = MPUSBAPI._MPUSBWrite(_pipes.PipeOut, (void *)sendBuf, dataLength, sent, 100)) == MPUSBAPI.MPUSB_SUCCESS)
                        {
                            MPUSBAPI._MPUSBRead(_pipes.PipeIn, (void *)receiveBuf, 64, sent, 100);
                            #if READ_WRITE_LOG
                            _working.Log("\tWysłano dane.");
                            #endif
                        }
                        else
                        {
                            _working.Log("\tBłąd wysyłania danych (" + r.ToString() + ").");
                        }
                    }
                    else
                    {
                        _working.Log("\tBrak połączenia lub błędne dane do wysłania.");
                    }
                }
            }
        }
Example #2
0
        public unsafe virtual void ReadingMethod(object argument)
        {
            Debug.WriteLine("Start wątka: " + Thread.CurrentThread.Name);
            IWorking working = (IWorking)((object[])argument)[0];

            InputVariable [] variables = (InputVariable[])((object[])argument)[1];
            if (variables == null || variables.Length == 0)
            {
                return;
            }

            void *myInPipe = null;
            Dictionary <int, List <InputVariable> > inputsForDevice = new Dictionary <int, List <InputVariable> >();

            for (int i = 0; i < variables.Length; i++)
            {
                if (!inputsForDevice.ContainsKey(variables[i].Device.DeviceId))
                {
                    inputsForDevice.Add(variables[i].Device.DeviceId, new List <InputVariable>());
                }
                inputsForDevice[variables[i].Device.DeviceId].Add(variables[i]);
            }
            try
            {
                // otwarcie urządzenia
                string vidpid = string.Format("vid_{0}&pid_{1}", Type.VID, Type.PID);
                myInPipe = MPUSBAPI._MPUSBOpen(Index, vidpid, "\\MCHP_EP2_ASYNC", MPUSBAPI.MP_READ, /* reserved */ 0);
                if (myInPipe == null || (int)myInPipe == -1 /* INVALID_HANDLE_VALUE */)
                {
                    #if READ_WRITE_LOG
                    _working.Log(string.Format("\tPróba łączenia do '{0}', wynik = {1}.", vidpid, (int)myInPipe));
                    #endif
                    throw new Exception("Nie można połączyć się z urządzeniem '" + Id + "'. Upewnij się, że jest ono poprawnie podłączone do komputera.");
                }

                byte *receiveBuf = stackalloc byte[64];
                uint  recLen     = 64;

                // odczytanie wszystkich raportów przez 500ms
                DateTime start = DateTime.Now;
                TimeSpan time  = new TimeSpan(0);
                while (MPUSBAPI._MPUSBReadInt(myInPipe, (void *)receiveBuf, 64, &recLen, 0 /* dwMilliseconds timeout */) == MPUSBAPI.MPUSB_SUCCESS && time.TotalMilliseconds < 500d)
                {
                    time = DateTime.Now - start;
                }

                // odczytanie stanu wszystkich wejść i ustawienie zmiennych
                void *PipeIn  = null;
                void *PipeOut = null;
                try
                {
                    // otwarcie strumienia czytania i pisania synchronicznego
                    PipeIn  = MPUSBAPI._MPUSBOpen(Index, vidpid, "\\MCHP_EP1", MPUSBAPI.MP_READ, /* reserved */ 0);
                    PipeOut = MPUSBAPI._MPUSBOpen(Index, vidpid, "\\MCHP_EP1", MPUSBAPI.MP_WRITE, /* reserved */ 0);
                    if (PipeIn == null || (int)PipeIn == -1 || PipeOut == null || (int)PipeOut == -1)
                    {
                        #if READ_WRITE_LOG
                        _working.Log(string.Format("\tPróba łączenia do '{0}', wynik1 = {1}, wynik2 = {2}.", vidpid, (int)PipeIn, (int)PipeOut));
                        #endif
                        throw new Exception("Nie można połączyć się z urządzeniem '" + Id + "'. Upewnij się, że jest ono poprawnie podłączone do komputera.");
                    }

                    // odczytanie stanu przycisków
                    for (int i = 0; i < variables.Length; i++)
                    {
                        // narazie bez obsługi rozszerzeń, sprawdzanie stanu wejść podpiętych tylko do tego urządzenia
                        if (variables[i].Device == this)
                        {
                            byte *send_buf    = stackalloc byte[64];
                            byte *receive_buf = stackalloc byte[64];
                            send_buf[0] = 0x36;                           //COMMAND TO READ_SPI
                            send_buf[1] = (byte)variables[i].ChipAddress; //CHIP ADDRESS
                            uint  tmp  = 0;
                            uint *sent = &tmp;
                            if (MPUSBAPI._MPUSBWrite(PipeOut, (void *)send_buf, 4, sent, 100) == MPUSBAPI.MPUSB_SUCCESS)
                            {
                                if (MPUSBAPI._MPUSBRead(PipeIn, (void *)receive_buf, 4, sent, 100) == MPUSBAPI.MPUSB_SUCCESS)
                                {
                                    if (*sent == 4)
                                    {
                                        int state = receive_buf[2] * 256 + receive_buf[3];
                                        variables[i].CheckState(state);
                                    }
                                }
                            }
                        }
                    }
                }
                finally
                {
                    MPUSBAPI._MPUSBClose(PipeIn);
                    MPUSBAPI._MPUSBClose(PipeOut);
                    _canWriteToDevice = true;
                }

                working.Log("Otwarto połączenie (do czytania) z urządzeniem: " + Id);

                while (working.Working)
                {
                    // oczekiwanie na raport
                    if (MPUSBAPI._MPUSBReadInt(myInPipe, (void *)receiveBuf, 64, &recLen, 0 /* dwMilliseconds timeout */) == MPUSBAPI.MPUSB_SUCCESS)
                    {
                        #if READ_WRITE_LOG
                        string s = "";
                        for (int i = 0; i < recLen; i++)
                        {
                            s = s + "0x" + receiveBuf[i].ToString("X2") + ", ";
                        }
                        working.Log("\tOdebrano dane (" + recLen.ToString() + "): " + s);
                        #endif
                        // przetworzenie raportu
                        if (recLen == 4)
                        {
                            /* recLen[0] - identyfikator urządzenia
                             * recLen[1] - adres chip
                             * recLen[2] - byte1
                             * recLen[3] - byte2
                             */

                            // FIXME poprawić kiedy dostanę nowy wsad z obsługą rozszerzeń
                            int device = 0;// recLen[0]
                            int chip   = receiveBuf[1];
                            int state  = receiveBuf[2] * 256 + receiveBuf[3];

                            //working.Log(string.Format("Device: {0}, Chip: {1}, Data: {2}", device, chip, Convert.ToString(state, 2)));

                            List <InputVariable> ins = inputsForDevice[device];
                            for (int i = 0; i < ins.Count; i++)
                            {
                                InputVariable di = ins[i];
                                if (di.ChipAddress == chip)
                                {
                                    di.CheckState(state);
                                }
                            }
                        }
                    }

                    Thread.Sleep(2);
                }
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                working.Log("Błąd: " + ex.ToString());
                working.Exception(this, new DeviceException(this, ex));
            }
            finally
            {
                working.Log("Zamykanie połączenia (do czytania) z urządzeniem: " + Id);
                _canWriteToDevice = true;
                // zamknięcie urządzenia
                if (myInPipe != null && ((int)myInPipe != -1 /* INVALID_HANDLE_VALUE */))
                {
                    MPUSBAPI._MPUSBClose(myInPipe);
                    working.Log("Zamknięto połączenie (do czytania) z urządzeniem: " + Id);
                }
            }
        }