Ejemplo n.º 1
0
        /// <summary>
        /// Возвращает общий НОД для всех чисел из массива
        /// </summary>
        public static int NOD(int[] a)
        {
            if (a.Length == 1)
            {
                return(a[0]);
            }
            List <int> nods = new List <int>();

            for (int i = 0; i < a.Length - 1; i++)
            {
                for (int j = i + 1; j < a.Length; j++)
                {
                    int n = AppliedMath.NOD(a[i], a[j]);
                    if (n == 1)
                    {
                        return(1);
                    }
                    else
                    if (!nods.Contains(n))
                    {
                        nods.Add(n);
                    }
                }
            }
            nods.Sort(); // т.к. надо вернуть минимальное значение
            return(nods[0]);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Добавляет в конец указанного буфера его CRC и
        /// возвращает новый массив
        /// </summary>
        public static byte[] AddCRC(byte[] buffer)
        {
            byte[] res = new byte[buffer.Length + 2];
            buffer.CopyTo(res, 0);
            int crc = RelkonProtocol.GetCRC(buffer);

            res[res.Length - 1] = AppliedMath.Hi(crc);
            res[res.Length - 2] = AppliedMath.Low(crc);
            return(res);
        }
Ejemplo n.º 3
0
        private void Symbol_Clicked(object sender, EventArgs e)
        {
            this.indicator.Focus();
            ToolStripButton Sender = (ToolStripButton)sender;
            int             code   = 0xFF00 + AppliedMath.HexToDec(Sender.Tag.ToString());

            if (this.SymbolSelected != null)
            {
                this.SymbolSelected(this, new EventArgs <char>((char)code));
            }
            this.Focus();
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Преобразует указанный массив из формата RC51ASCII в бинарный формат
 /// (CRC не удаляется)
 /// </summary>
 public static byte[] ConvertFromRC51ASCII(byte[] buffer)
 {
     byte[] tmp = Utils.GetSubArray(buffer, 1, buffer.Length - 2);
     byte[] res = new byte[tmp.Length / 2];
     for (int i = 0; i < tmp.Length; i += 2)
     {
         byte[] code = { tmp[i], tmp[i + 1] };
         string h    = Encoding.ASCII.GetString(code);
         res[i / 2] = (byte)AppliedMath.HexToDec(h);
     }
     return(res);
 }
Ejemplo n.º 5
0
 /// Возвращает маску символа ввиде двумерного массива
 /// </remarks>
 /// <param name="RowMask">
 /// Маска символа по столбцам (каждый элемент массива определяет
 /// закрашивание столбца
 /// </param>
 /// <returns>
 /// Маска символа: 1-закрашенный пиксель,
 /// 0-пустой
 /// </returns>
 public byte[,] ComputePixelMask(byte[] RowMasks)
 {
     byte[,] res = new byte[this.verticalResolution, this.horizontalResolution];
     for (int i = 0; i < this.horizontalResolution; i++)
     {
         byte[] bits = AppliedMath.DecToBin(RowMasks[i], 8);
         for (int j = 0; j < 8; j++)
         {
             res[j, i] = bits[j];
         }
     }
     return(res);
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Возвращает запрос на запись данных в память определенного типа (без CRC)
        /// </summary>
        public static byte[] CreateWriteMemoryRequest(MemoryType MemoryType, int controllerAddress, int Address, byte[] Data, Type type)
        {
            List <byte> l = new List <byte>();

            l.Add((byte)controllerAddress);
            byte command       = 0;
            int  AddressLength = 0;

            switch (MemoryType)
            {
            case MemoryType.RAM:
                command       = (byte)0x60;
                AddressLength = 1;
                break;

            case MemoryType.Clock:
                command       = (byte)0x61;
                AddressLength = 1;
                break;

            case MemoryType.EEPROM:
                command       = (byte)0x62;
                AddressLength = 2;
                break;

            case MemoryType.FRAM:
                command       = (byte)0x63;
                AddressLength = 2;
                break;

            case MemoryType.XRAM:
                command       = (byte)0x64;
                AddressLength = 2;
                break;

            case MemoryType.Flash:
                command       = (byte)0x65;
                AddressLength = 2;
                break;

            default:
                throw new Exception("Указанный тип памяти " + MemoryType + " не поддерживается в " + type);
            }
            l.Add(command);
            byte[] a = AppliedMath.IntToBytes(Address);
            l.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength));
            l.AddRange(Data);
            return(l.ToArray());
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Возвращает бинарный код числа
        /// </summary>
        /// <param name="DC">
        /// минимальное число разрядов, которые должен содержать код
        /// </param>
        public static byte[] DecToBin(int Value, int DC)
        {
            byte[] res  = new byte[DC];
            byte[] code = AppliedMath.DecToBin(Value);
            if (code.Length >= DC)
            {
                return(code);
            }
            int dx = DC - code.Length;

            for (int i = 0; i < DC; i++)
            {
                if (i < dx)
                {
                    res[i] = 0;
                }
                else
                {
                    res[i] = code[i - dx];
                }
            }
            return(res);
        }
Ejemplo n.º 8
0
 /// <summary>
 /// Вычисляет значения двух- и четырехбайтных переменных заводских установок на основе
 /// значений однобайтных переменных для указанного проекта
 /// </summary>
 private void ComputeMultibyteEmbeddedVarsValues(ControllerProgramSolution solution)
 {
     for (int count = 2; count < 5; count += 2)
     {
         string s = (count == 2) ? "i" : "l";
         for (char c = 'W'; c <= 'Z'; c++)
         {
             for (int i = 0; i < 16; i += count)
             {
                 byte[] bytes = new byte[count];
                 for (int j = 0; j < count; j++)
                 {
                     bytes[j] = (byte)solution.Vars.GetEmbeddedVar(c.ToString() + (i + j)).Value;
                 }
                 if (solution.ProcessorParams.InverseByteOrder)
                 {
                     bytes = Utils.ReflectArray <byte>(bytes);
                 }
                 solution.Vars.GetEmbeddedVar(c.ToString() + i + s).Value = AppliedMath.BytesToLong(bytes);
             }
         }
         for (int i = 0; i < 64; i += count)
         {
             byte[] bytes = new byte[count];
             for (int j = 0; j < count; j++)
             {
                 bytes[j] = (byte)solution.Vars.GetEmbeddedVar("EE" + (i + j)).Value;
             }
             if (solution.ProcessorParams.InverseByteOrder)
             {
                 bytes = Utils.ReflectArray <byte>(bytes);
             }
             solution.Vars.GetEmbeddedVar("EE" + i + s).Value = AppliedMath.BytesToLong(bytes);
         }
     }
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Возвращает запрос на запись данных в память определенного типа (без CRC)
        /// </summary>
        private byte[] CreateWriteMemoryRequest(MemoryType MemoryType, int Address, byte[] Data)
        {
            List <byte> request = new List <byte>();

            request.Add((byte)_controllerAddress);
            byte command       = 0;
            int  AddressLength = 0;

            switch (MemoryType)
            {
            case MemoryType.RAM:
                command       = (byte)0xE0;
                AddressLength = 1;
                break;

            case MemoryType.Clock:
                command       = (byte)0xE1;
                AddressLength = 1;
                break;

            case MemoryType.EEPROM:
                command       = (byte)0xE2;
                AddressLength = 2;
                break;

            case MemoryType.FRAM:
                command       = (byte)0xE3;
                AddressLength = 2;
                break;

            case MemoryType.XRAM:
                command       = (byte)0xE4;
                AddressLength = 2;
                break;

            case MemoryType.Flash:
                command       = (byte)0xE5;
                AddressLength = 4;
                if (Data.Length % 2 != 0)
                {
                    // В Relkon4 во Flash можно записывать только четное число байт
                    Array.Resize <byte>(ref Data, Data.Length + 1);
                    Data[Data.Length - 1] = 0xFF;
                }
                break;

            case MemoryType.SDCard:
                command       = (byte)0xE7;
                AddressLength = 4;
                break;
            }
            // Добавление команды
            request.Add(command);
            // Добавление адреса
            byte[] a = AppliedMath.IntToBytes(Address);
            request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength));
            // Добавление размера буфера
            a = AppliedMath.IntToBytes(Data.Length);
            if (MemoryType == MemoryType.Flash || MemoryType == MemoryType.SDCard)
            {
                AddressLength = 2;
            }
            request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength));
            // Добавление данных
            request.AddRange(Data);
            return(request.ToArray());
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Возвращает запрос на чтение данных с области памяти определенного типа (без CRC)
        /// </summary>
        private byte[] CreateReadMemoryRequest(MemoryType MemoryType, int Address, int Count)
        {
            List <byte> request = new List <byte>();

            request.Add((byte)_controllerAddress);
            byte command       = 0;
            int  AddressLength = 0;

            switch (MemoryType)
            {
            case MemoryType.RAM:
                command       = (byte)0xD0;
                AddressLength = 1;
                break;

            case MemoryType.Clock:
                command       = (byte)0xD1;
                AddressLength = 1;
                break;

            case MemoryType.EEPROM:
                command       = (byte)0xD2;
                AddressLength = 2;
                break;

            case MemoryType.FRAM:
                command       = (byte)0xD3;
                AddressLength = 2;
                break;

            case MemoryType.XRAM:
                command       = (byte)0xD4;
                AddressLength = 2;
                break;

            case MemoryType.Flash:
                command       = (byte)0xD5;
                AddressLength = 4;
                if (Count % 2 != 0)
                {
                    Count++;     // в Relkon4 из Flash можно читать только четное число байт
                }
                break;

            case MemoryType.SDCard:
                command       = (byte)0xD7;
                AddressLength = 4;
                break;
            }
            // Добавление команды
            request.Add(command);
            // Добавление адреса
            byte[] a = AppliedMath.IntToBytes(Address);
            request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength));
            // Добавление числа байт
            a = AppliedMath.IntToBytes(Count);
            if (MemoryType == MemoryType.Flash || MemoryType == MemoryType.SDCard)
            {
                AddressLength = 2;
            }
            request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength));
            return(request.ToArray());
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Восстанавливает число по байтам, его составляющим; байты начинаются со старшего
 /// </summary>
 public static int BytesToInt(byte[] Bytes)
 {
     return((int)AppliedMath.BytesToLong(Bytes));
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Проверяет, является ли строка десятичным или шестнадцатеричным числом
 /// </summary>
 public static bool IsValidNumber(string Value)
 {
     return(AppliedMath.IsValidDecNumber(Value) || AppliedMath.IsValidHexNumber(Value));
 }