/// <summary> /// Получает список крейтов и их состояний (процедурой LTR_GetListOfIPCrates) /// </summary> /// <param name="tLTR">Управляющая структура TLTR</param> public unsafe void GetCratesStatus(_LTRNative.TLTR tLTR) { //максимальное число крейтов const uint max_entires = 16; //IP-адрес сети (192.168.1.0) uint ip_net = 0xC0A80100; //маска подсети (255.255.255.0) uint ip_mask = 0xFFFFFF00; //количество найденных крейтов, соответствующих сетевым настройкам uint entires_found; //количество записей в массиве infoArray (возвращаемое процедурой) uint entires_returned; //выделение памяти int structSize = Marshal.SizeOf(typeof(_LTRNative.TIPCRATE_ENTRY)); IntPtr info_array = Marshal.AllocHGlobal(structSize * (int)max_entires); Marshal.StructureToPtr(new _LTRNative.TIPCRATE_ENTRY(), info_array, true); //запрашиваем список крейтов _LTRNative.LTR_GetListOfIPCrates(ref tLTR, max_entires, ip_net, ip_mask, out entires_found, out entires_returned, info_array); //подготавливаем контейнер для хранения списка крейтов _LTRNative.TIPCRATE_ENTRY[] cratesArray = new _LTRNative.TIPCRATE_ENTRY[entires_returned]; cratesStatesList = new TIPCRATE_ENTRY_EXTEND[entires_returned]; //заполняем массив - считываем поочередно структуры из памяти со сдвигом structSize //firstMemoryAddress - это количество байт после адреса info_array для последовательного чтения содержимого памяти int firstMemoryAddress = 0; for (int i = 0; i < entires_found; i++) { cratesArray[i] = (_LTRNative.TIPCRATE_ENTRY)Marshal.PtrToStructure(info_array + firstMemoryAddress, typeof(_LTRNative.TIPCRATE_ENTRY)); //передвигаемся в памяти на struct_size байт firstMemoryAddress += structSize; } //освобождаем память Marshal.FreeHGlobal(info_array); //переносим полученный массив в новый for (int i = 0; i < entires_returned; i++) cratesStatesList[i] = new TIPCRATE_ENTRY_EXTEND(cratesArray[i]); }
public TIPCRATE_ENTRY_EXTEND(_LTRNative.TIPCRATE_ENTRY baseStruct) { ip_addr = LTRInfo.UnpackIPAddress(baseStruct.ip_addr); foreach (char symb in baseStruct.serial_number) if (symb != '\0') this.serial_number += symb; this.status = (LTRInfo.CrateIPStatus)baseStruct.status; }
/// <summary> /// Процедура проверки статуса операции с крейтом (модулем) /// </summary> /// <param name="errorCode">код ошибки</param> /// <param name="message">сообщение об ошибке</param> public static void CheckOperationStatus(_LTRNative.LTRERROR errorCode, string message) { if (errorCode != _LTRNative.LTRERROR.OK) //не получилось выполнить операцию с крейтом, вызываем исключение throw new Exception(String.Format("{0}: {1}", message, errorCode.ToString())); }