예제 #1
0
        public unsafe virtual void Close()
        {
            if (!Extension)
            {
                Debug.WriteLine("Zamykanie połączenia (do zapisu) z urządzeniem: " + Id);

                // wyłączenie wyjść cyfrowych (zgaszenie diód)
                SetDigitalOutputsOff();

                // wyczyszczenie wyświetlaczy
                Clear7LEDDisplays();

                // TODO
                _pipes.Opened = false;
                bool close = false;
                if (_pipes.PipeIn != null && (int)_pipes.PipeIn != -1)
                {
                    close = true;
                    MPUSBAPI._MPUSBClose(_pipes.PipeIn);
                    _pipes.PipeIn = null;
                }
                if (_pipes.PipeOut != null && (int)_pipes.PipeOut != -1)
                {
                    close = true;
                    MPUSBAPI._MPUSBClose(_pipes.PipeOut);
                    _pipes.PipeOut = null;
                }
                if (close)
                {
                    _working.Log("Zamknięto połączenie (do zapisu) z urządzeniem: " + Id);
                }
            }
        }
예제 #2
0
        public unsafe virtual void Open(IWorking working, bool isReadingThread)
        {
            _pipes.Opened = false;
            _working      = working;
            if (!Extension)
            {
                if (!isReadingThread)
                {
                    _canWriteToDevice = true;
                }
                else
                {
                    while (!_canWriteToDevice && _working.Working)
                    {
                        Thread.Sleep(10);
                    }
                }

                // otwarcie strumieni
                try
                {
                    string vidpid = string.Format("vid_{0}&pid_{1}", Type.VID, Type.PID);
                    _pipes.PipeIn  = MPUSBAPI._MPUSBOpen(Index, vidpid, "\\MCHP_EP1", MPUSBAPI.MP_READ, /* reserved */ 0);
                    _pipes.PipeOut = MPUSBAPI._MPUSBOpen(Index, vidpid, "\\MCHP_EP1", MPUSBAPI.MP_WRITE, /* reserved */ 0);
                    if (_pipes.PipeIn == null || (int)_pipes.PipeIn == -1 || _pipes.PipeOut == null || (int)_pipes.PipeOut == -1)
                    {
                        #if READ_WRITE_LOG
                        _working.Log(string.Format("\tPróba łączenia do '{0}', wynik1 = {1}, wynik2 = {2}.", vidpid, (int)_pipes.PipeIn, (int)_pipes.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.");
                    }
                    _working.Log("Otwarcie połączenia (do zapisu) z urządzeniem: " + Id);
                    _pipes.Opened = true;

                    // wyłączenie wyjść cyfrowych (zgaszenie diód)
                    SetDigitalOutputsOff();

                    // wyczyszczenie wyświetlaczy
                    Clear7LEDDisplays();
                }
                catch (Exception ex)
                {
                    MPUSBAPI._MPUSBClose(_pipes.PipeIn);
                    MPUSBAPI._MPUSBClose(_pipes.PipeOut);
                    working.Log("Błąd: " + ex.ToString());
                    working.Exception(this, new DeviceException(this, ex));
                }
            }
        }
예제 #3
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);
                }
            }
        }