예제 #1
0
        public static byte[] GenerateFakeBytes(int time, ComponentMapping mapping)
        {
            byte[] startNoise = { 0xA, 0xB, 0xC, 0xFF, 0xFF };
            byte[] startCode  = { 0xFD, 0xFF, 0xFF, 0xFF, 0xFF };
            byte[] endCode    = { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF };
            byte[] endNoise   = { 0x0D, 0x0E, 0x0F, 0xFF, 0xFF };

            Random random = new Random();

            byte[] timeValue = BitConverter.GetBytes(time);
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(timeValue);
            }
            byte[] btime = new byte[1 + timeValue.Length];
            btime[0] = 0xC9;
            Array.Copy(timeValue, 0, btime, 1, timeValue.Length);

            byte stateValue = (byte)random.Next(0, 9);

            byte[] bstate = { 0xC8, stateValue };
            byte[] bauto  = { 0xCA, (byte)random.Next(0, 1) };

            List <byte[]> payload = new List <byte[]>
            {
                btime,
                bstate
                //bauto
            };

            foreach (MeasuredComponent c in mapping.MeasuredComponents())
            {
                byte[] sensor = new byte[1 + c.ByteSize];

                byte[] value = new byte[0];

                switch (c)
                {
                case PressureComponent pt:
                    value = BitConverter.GetBytes((short)random.Next(400, 1900));
                    break;

                case TemperatureComponent tc:
                    value = BitConverter.GetBytes((short)random.Next(short.MinValue, short.MaxValue));
                    break;

                case LoadComponent load:
                    value = BitConverter.GetBytes((short)random.Next(0, 2124));
                    break;

                case LevelComponent tank:
                    value = BitConverter.GetBytes((short)random.Next(0, (int)tank.Total + 1));
                    break;

                case ServoComponent servo:
                    ushort randServoVal = (ushort)random.Next(0, ushort.MaxValue);
                    value = BitConverter.GetBytes(randServoVal);
                    break;

                case SimpleComponent simple:
                    ushort randServoTargetVal = (ushort)random.Next(0, ushort.MaxValue);
                    value = BitConverter.GetBytes(randServoTargetVal);
                    break;

                case SolenoidComponent solenoid:
                    value = BitConverter.GetBytes((short)random.Next(0, 2));
                    break;

                case VoltageComponent battery:
                    value = BitConverter.GetBytes((ushort)random.Next(12, 14));
                    break;

                case StackHealthComponent stack:
                    value = new [] { (byte)random.Next(0, 8) };
                    break;
                }

                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(value);
                }

                sensor[0] = c.BoardID;
                Array.Copy(value, 0, sensor, 1, value.Length);
                payload.Add(sensor);
            }

            ushort payloadLength = (ushort)payload.SelectMany((byte[] arg) => arg).ToArray().Length;

            byte[] header = new byte[4];
            header[0] = 0;
            header[1] = 0;
            byte[] payloadLengthBytes = BitConverter.GetBytes(payloadLength);
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(payloadLengthBytes);
            }
            Array.Copy(payloadLengthBytes, 0, header, 2, 2);


            payload.Insert(0, startNoise);
            payload.Insert(1, startCode);
            payload.Insert(2, header);

            payload.Add(endCode);
            payload.Add(endNoise);

            byte[] buffer = payload.SelectMany((byte[] arg) => arg).ToArray();

            return(buffer);
        }