private ZeoDataType ReadA4Message(ZeoMessage zeoMessage) { byte checkSum = this.ReadByte(); this.ReadNBytes(2); int length = this.buffer[0] | this.buffer[1] << 8; this.ReadNBytes(2); int lengthN = this.buffer[0] | this.buffer[1] << 8; if ((short)length != (short)(~lengthN)) { // TODO: log error return(ZeoDataType.Error); } byte unixT = this.ReadByte(); this.ReadNBytes(2); float subsecondT = (this.buffer[0] | this.buffer[1] << 8) / 65535.0f; byte sequence = this.ReadByte(); ZeoDataType dataType = (ZeoDataType)this.ReadByte(); this.ReadNBytes(length - 1); switch (dataType) { case ZeoDataType.FrequencyBins: short[] shorts = new short[7]; Buffer.BlockCopy(this.buffer, 0, shorts, 0, 14); float[] floats = new float[7]; for (int k = 0; k < 7; k++) { floats[k] = (shorts[k] / 32767.0f) * 100.0f; } zeoMessage.FrequencyBins = floats; break; case ZeoDataType.Waveform: shorts = new short[128]; Buffer.BlockCopy(this.buffer, 0, shorts, 0, 256); floats = new float[128]; for (int k = 0; k < 128; k++) { floats[k] = (shorts[k] / 32767.0f) * 315.0f; } zeoMessage.Waveform = floats; zeoMessage.Second = unixT + subsecondT; // 128 16-bit samples per ~1.005 sec break; case ZeoDataType.ZeoTimestamp: zeoMessage.ZeoTimestamp = this.GetInt32(); break; case ZeoDataType.Event: zeoMessage.Event = (ZeoEvent)this.GetInt32(); break; case ZeoDataType.Version: break; case ZeoDataType.SQI: zeoMessage.SQI = this.GetInt32(); break; case ZeoDataType.BadSignal: zeoMessage.BadSignal = this.GetInt32() == 0 ? false : true; break; case ZeoDataType.Impedance: zeoMessage.Impedance = this.GetImpedance(); break; case ZeoDataType.SleepStage: zeoMessage.SleepStage = (ZeoSleepStage)this.GetInt32(); break; case ZeoDataType.SliceEnd: break; default: return(ZeoDataType.Error); } return(dataType); }
private ZeoMessage ReadMessage() { ZeoMessage zeoMessage = new ZeoMessage(); // A4 are standard Zeo messages bool isA4 = false; // Z9 are additional messages from ZeoScope bool isZ9 = false; byte header = 0; for (int j = 0; j < 20; j++) { int i; for (i = 0; i < 500; i++) { if (header == 'A') { header = this.ReadByte(); if (header == '4') { isA4 = true; break; } else { continue; } } else if (header == 'Z') { header = this.ReadByte(); if (header == '9') { isZ9 = true; break; } else { continue; } } header = this.ReadByte(); } if (i != 1) { // TODO: log error } if (isA4 == true) { ZeoDataType dataType = this.ReadA4Message(zeoMessage); if (dataType == ZeoDataType.SliceEnd) { return(zeoMessage); } else if (dataType == ZeoDataType.Error) { return(null); } } else if (isZ9 == true) { this.ReadZ9Message(); return(null); } } return(null); }