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); } } }
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)); } } }
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); } } }