/// <summary> /// Send the buffer to the drawing mode buffer, then get the buffer back raw /// </summary> /// <param name="buffer"></param> /// <returns></returns> private byte[] RoundTripBuffer(byte[] buffer, HypnoLsdController device) { var mode = device.Drawing; if (mode) { device.Drawing = false; // exit to ensure at start of drawing buffer } Thread.Sleep(500); // give some time for above messages to return device.Drawing = true; Thread.Sleep(500); // give some time for above messages to return device.WriteBytes(buffer); Thread.Sleep(500); // give some time for above messages to return device.Drawing = false; Thread.Sleep(1000); // give some time for above messages to return device.MessageReceived += ByteListener; // get the buffer back recordedBytes = new ConcurrentQueue <byte>(); var start = new Stopwatch(); start.Start(); var lastSize = 0; var testLength = Math.Min(buffer.Length, device.RamSize); device.DumpRam((ushort)testLength); // read until timeout while (true) { if (start.ElapsedMilliseconds > 1000) { break; } if (lastSize != recordedBytes.Count) { // new data, reset timeout start.Restart(); lastSize = recordedBytes.Count; } } device.MessageReceived -= ByteListener; Thread.Sleep(500); var answer = recordedBytes.ToArray(); // clean message - remove final "OK\r\n"and initial message up to byte '\n' = 0x0A if (answer.Length > 0) { answer = answer.SkipWhile(b => b != '\n').Skip(1).Take(testLength).ToArray(); } device.Drawing = mode; Thread.Sleep(500); return(answer); }
internal void PutFile(HypnoLsdController device, string filename) { // read records until no more // a record is 128 bytes, // 1st byte is length N (0-126) of data bytes // then N data bytes (pad with 0 after N) // 128th byte is sum of bytes (checksum) // length 0 record with all 0 entries and 255 sum is end // after each record read correctly, returns 2 bytes: next record count mod 256 (0 based) and the checksum byte obtained // if record failed, resend with current record count mode 256 (asking for resend) and bit-inverted checksum byte var data = File.ReadAllBytes(filename); var block = new byte[128]; var pos = 0; // position of data to send device.WriteString("putfile \"" + Path.GetFileName(filename) + "\"\r\n"); Thread.Sleep(10); var len = 0; do { len = data.Length - pos; if (len > 126) { len = 126; } block[0] = (byte)len; var checksum = 0; for (var i = 0; i < len; ++i) { block[i + 1] = data[pos++]; checksum += block[i + 1]; } // 0 fill for (var i = len; i < 126; i++) { block[i + 1] = 0; } block[127] = (byte)checksum; // send 4 bytes at a time, with delays var temp = new byte[4]; for (var i = 0; i < block.Length; i += 4) { for (var j = 0; j < 4; ++j) { temp[j] = block[j + i]; } device.WriteBytes(temp); Thread.Sleep(1); } //device.WriteBytes(block); } while (len != 0); }