Exemplo n.º 1
0
        private bool getArchiveRecord(DateTime dt, ArchiveTypeRegister archType, ref byte[] rawRecordBytes)
        {
            // запишем дату в регистр
            if (!this.setArchiveRequestDate(dt))
            {
                return(false);
            }

            // запросим нужную запись
            ushort register = (ushort)archType;

            byte[] cmd = this.makeCmd(KaratFunctions.Read, register, new byte[0]);

            byte[] incommingData = new byte[1];
            int    resWriteRead  = m_vport.WriteReadData(FindPacketSignature, cmd, ref incommingData, cmd.Length, -1);

            string errDescription = "";

            if (!isAnswerDataOk(incommingData, ref errDescription))
            {
                this.WriteToLog("getArchiveRecord: " + Enum.GetName(typeof(ArchiveTypeRegister), archType) + ": " + errDescription);
                return(false);
            }

            // проверим существует ли запись вообще перед тем как ее сохранять в кэш
            byte[] headerData        = new byte[18];
            byte[] recordDateIdBytes = new byte[5];
            try
            {
                Array.Copy(incommingData, 3, headerData, 0, 18);
                Array.Copy(headerData, 13, recordDateIdBytes, 0, recordDateIdBytes.Length);
            }
            catch (Exception ex)
            {
                WriteToLog("getArchiveRecord, array.copy: " + ex.Message);
                return(false);
            }

            if (recordDateIdBytes[0] == 0xFF && recordDateIdBytes[recordDateIdBytes.Length - 1] == 0xFF)
            {
                // запись идентифицируется датой. Если поля даты 0xFF - запись не существует и не удалось
                // найти хотябы что-то по близости. Мануал стр. 38
                string msg = String.Format("запись идентифицируется датой. Если поля даты 0xFF - запись не существует и не удалось найти хотябы что-то по близости. Байты: {0}", BitConverter.ToString(recordDateIdBytes));
                WriteToLog("getArchiveRecord, array.copy: " + msg);
                return(false);
            }


            // кэшируем полностью вместе с доп-инфой
            this.archiveCash[(short)archType] = incommingData;
            rawRecordBytes = incommingData;

            return(true);
        }
Exemplo n.º 2
0
        private bool ReadArchiveValuesCommon(ArchiveTypeRegister archTypeReg, DateTime dt, ushort param, ushort tarif, ref float recordValue)
        {
            recordValue = -1f;

            if (this.archiveConfigurationCash.Length == 0)
            {
                bool res = this.getArchiveRecordConfiguration(out this.archiveConfigurationCash);
                if (!res)
                {
                    WriteToLog("ReadArchiveValuesCommon: getArchiveRecordConfiguration вернул false");
                    return(res);
                }
            }

            // после получени конфигурации (реального или из кэша), запросим требуемый параметр
            short  idxInCashArr   = (short)archTypeReg;
            string archTypeRegStr = Enum.GetName(typeof(ArchiveTypeRegister), archTypeReg);


            byte[] cashedArr = this.archiveCash[idxInCashArr];



            byte[] rawRecordBytes = new byte[0];
            if (cashedArr.Length == 0)
            {
                if (!this.getArchiveRecord(dt, archTypeReg, ref rawRecordBytes))
                {
                    string msg = String.Format("ReadArchiveValuesCommon: getArchiveRecord вернул false: dt={0}, тип архива={1} , параметр={2}", dt.ToString(), archTypeRegStr, param);
                    WriteToLog(msg);
                    return(false);
                }
            }
            else
            {
                rawRecordBytes = cashedArr;
            }

            // распарсим и выдадим нужное значение

            if (!this.getArchiveRecordParamValue((byte)param, rawRecordBytes, this.archiveConfigurationCash, ref recordValue))
            {
                WriteToLog("ReadArchiveValuesCommon: getArchiveRecordParamValue вернул false");
                return(false);
            }

            return(true);
        }