private void ReadData() { dataCollection = new Dictionary <string, List <GsrPpgPacket> >() { ["GSR"] = new List <GsrPpgPacket>(), ["PPG"] = new List <GsrPpgPacket>() }; int data_rx = 0; bool receivingData = false; bool wasPPG = false; int byteCount = 0; int data = 0; var stopwatch = new Stopwatch(); stopwatch.Start(); while (reading) { data_rx = base.ReadByte(); // start bit detected. ready to receive data if (!receivingData && (data_rx & 0x1) == 0x0) { byteCount = 0; receivingData = true; } // receiving data else if (receivingData && (data_rx & 0x1) == 0x1) { switch (byteCount) { case 0: // check if this data is PPG wasPPG = (data_rx & 0x02) != 0; data = (data_rx & 0xfc) >> 2; byteCount += 1; break; case 1: // check if data is continuous. if not, it's an error if (wasPPG != ((data_rx & 0x02) != 0)) { byteCount = 0; receivingData = false; break; } data += (data_rx & 0xfc) << 4; byteCount += 1; break; case 2: // check if data is continuous. if not, it's an error if (wasPPG != ((data_rx & 0x02) != 0)) { byteCount = 0; receivingData = false; break; } data += (data_rx & 0xfc) << 10; var packetReceivedTickCount = stopwatch.ElapsedTicks; DataArrivedEventArgs args = new DataArrivedEventArgs { Timestamp = packetReceivedTickCount, Data = data }; if (wasPPG) { dataCollection["PPG"].Add(new GsrPpgPacket(data, packetReceivedTickCount)); OnPpgDataArrived(args); } else { dataCollection["GSR"].Add(new GsrPpgPacket(data, packetReceivedTickCount)); OnGsrDataArrived(args); } // clean up byteCount = 0; receivingData = false; break; } } // dirty data, ready for receive new data else { byteCount = 0; receivingData = false; } } }
protected virtual void OnPpgDataArrived(DataArrivedEventArgs e) { PpgDataArrived?.Invoke(this, e); }