예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
        }