/// <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]); }
/// <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); }
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(); }
/// <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); }
/// Возвращает маску символа ввиде двумерного массива /// </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); }
/// <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()); }
/// <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); }
/// <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); } } }
/// <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()); }
/// <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()); }
/// <summary> /// Восстанавливает число по байтам, его составляющим; байты начинаются со старшего /// </summary> public static int BytesToInt(byte[] Bytes) { return((int)AppliedMath.BytesToLong(Bytes)); }
/// <summary> /// Проверяет, является ли строка десятичным или шестнадцатеричным числом /// </summary> public static bool IsValidNumber(string Value) { return(AppliedMath.IsValidDecNumber(Value) || AppliedMath.IsValidHexNumber(Value)); }