예제 #1
0
파일: sayaniKombik.cs 프로젝트: Prizmer/ps
        private bool ParseDumpFile(string fileName, ref MeterInfo mi, ref Params prms, bool deleteAfterParse = false)
        {
            mi = new MeterInfo();
            prms = new Params();
            string strValues = "";

            if (!File.Exists(fileName))
                return false;

            try
            {
                FileStream dumpFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

                bool tmpRes = false;
                if (GetMeterInfo(dumpFileStream, ref mi))
                    if (FillParamsStructure(dumpFileStream, out prms, out strValues))
                        tmpRes = true;

                dumpFileStream.Close();

                if (tmpRes && deleteAfterParse)
                    DeleteDumpFileAndLogs(fileName);

                return tmpRes;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
예제 #2
0
파일: sayaniKombik.cs 프로젝트: Prizmer/ps
        private bool GetMeterInfo(FileStream fs, ref MeterInfo mInfo)
        {
            int meterInfoFirstByte = 0x0123;
            mInfo = new MeterInfo();
            fs.Seek(meterInfoFirstByte, SeekOrigin.Begin);

            try
            {
                int fsPosition = (int)fs.Position;
                byte[] buffer = new byte[fs.Length];

                int bytesRead = fs.Read(buffer, fsPosition, 3);

                byte[] tmpSerialBuffer1 = new byte[1];
                byte[] tmpSerialBuffer2 = new byte[2];
                Array.Copy(buffer, fsPosition + 2, tmpSerialBuffer1, 0, 1);
                Array.Copy(buffer, fsPosition, tmpSerialBuffer2, 0, 2);
                Int16 serial2 = BitConverter.ToInt16(tmpSerialBuffer2, 0);

                mInfo.serialNumber = BitConverter.ToString(tmpSerialBuffer1) + "-" + serial2.ToString();

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
예제 #3
0
파일: sayaniKombik.cs 프로젝트: Prizmer/ps
        public bool ReadCurrentValues(ushort param, ushort tarif, ref float recordValue)
        {
            recordValue = -1;

            //находится ли в каталоге утилита rdslib.exe
            if (!DoLibraryExists())
                return false;

            //попытаемся найти BAT файл
            string curBatchDirectory = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_BATCH;
            string curBatchFilename = curBatchDirectory + "\\" + m_address + ".bat";

            if (!Directory.Exists(curBatchDirectory) || !File.Exists(curBatchFilename))
                return false;

            string curDumpDir = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_DUMPS;
            if (!Directory.Exists(curDumpDir))
                Directory.CreateDirectory(curDumpDir);

            //все готово к генерации дампа
            FileInfo batchFileInfo = new FileInfo(curBatchFilename);
            List<FileInfo> batchFIList = new List<FileInfo>();
            batchFIList.Add(batchFileInfo);

            List<BatchConnection> batchConnList = new List<BatchConnection>();
            if (!CreateBatchConnectionList(batchFIList, ref batchConnList))
                return false;

            if (!ExecuteBatchConnection(batchConnList[0]))
                return false;

            MeterInfo tmpMi = new MeterInfo();
            Params tmpPrms = new Params();

            if (!ParseDumpFile(batchConnList[0].FileNameDump, ref tmpMi, ref tmpPrms, true))
                return false;

            if (!GetParamValueFromParams(tmpPrms, param, tarif, out recordValue))
                return false;

            DeleteDumpFileAndLogs(batchConnList[0].FileNameDump);

            return true;
        }
예제 #4
0
파일: sayaniKombik.cs 프로젝트: Prizmer/ps
        public bool ReadDailyValues(DateTime dt, ushort param, ushort tarif, ref float recordValue)
        {
            recordValue = -1;
            bool DELETE_DUMPS_AFTER_PARSING = false;

            MeterInfo tmpMi = new MeterInfo();
            Params tmpPrms = new Params();

            //находится ли в каталоге утилита rdslib.exe
            if (!DoLibraryExists())
                return false;

            //проверим есть ли дамп и старше ли он чем readDailyTimeoutInDays
            string curDumpDir = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_DUMPS;
            if (!Directory.Exists(curDumpDir))
                Directory.CreateDirectory(curDumpDir);

            string LogTerminationCode = "";
            if (IsReadingBlocked(blockingTimeMinutes, curDumpDir, m_address.ToString(), ref LogTerminationCode))
                return false;

            string latestDumpFileName = "";
            DateTime latestDumpDate = new DateTime();
            FileInfo latestDumpFileInfo = null;

            if (LatestByDateFileInfo(curDumpDir, m_address.ToString(), ref latestDumpFileInfo, "*.dat"))
            {
                latestDumpFileName = latestDumpFileInfo.FullName;
                latestDumpDate = latestDumpFileInfo.LastWriteTime.Date;

                if (File.Exists(latestDumpFileName))
                {
                    DateTime dateCur = DateTime.Now.Date;
                    TimeSpan ts = dateCur - latestDumpDate;

                    //если мы дошли до сюда, то искомого параметра нет в таблице "суточные" (см. mainservice)
                    //чтобы не дергать счетчик, введено ограничение - мы реально запрашиваем дамп со
                    //только раз в readDailyTimeoutInDays суток, поэтому:
                    //
                    //если прошло меньше чем readDailyTimeoutInDays дней
                    if (ts.TotalDays < readDailyTimeoutInDays)
                    {
                        //прочитаем недостающий параметр из уже существующего дампа
                        //чтобы не дергать счетчик
                        if (ParseDumpFile(latestDumpFileName, ref tmpMi, ref tmpPrms, DELETE_DUMPS_AFTER_PARSING))
                            if (GetParamValueFromParams(tmpPrms, param, tarif, out recordValue))
                                return true;
                    }
                }
            }

            //если мы дошли до сюда, то, либо подошло время обновить дамп, либо проблемы с разбором существующего
            //если прошло менее N дней, но искомого параметра еще нет
            DeleteDumpFileAndLogs(latestDumpFileName);

            //ниже нельзя просто вызвать чтение суточных, т.к. суточные удаляют дамп сразу
            //после разбора, поэтому дублируем

            //попытаемся найти BAT файл
            string curBatchDirectory = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_BATCH;
            string curBatchFilename = curBatchDirectory + "\\" + m_address + ".bat";

            if (!Directory.Exists(curBatchDirectory) || !File.Exists(curBatchFilename))
                return false;

            //ВСЕ ГОТОВО К РЕАЛЬНОМУ ЧТЕНИЮ И ГЕНЕРАЦИИ ДАМПА

            FileInfo batchFileInfo = new FileInfo(curBatchFilename);
            List<FileInfo> batchFIList = new List<FileInfo>();
            batchFIList.Add(batchFileInfo);

            List<BatchConnection> batchConnList = new List<BatchConnection>();
            if (!CreateBatchConnectionList(batchFIList, ref batchConnList))
                return false;

            if (!ExecuteBatchConnection(batchConnList[0]))
                return false;

            if (!ParseDumpFile(batchConnList[0].FileNameDump, ref tmpMi, ref tmpPrms, DELETE_DUMPS_AFTER_PARSING))
                return false;

            if (!GetParamValueFromParams(tmpPrms, param, tarif, out recordValue))
                return false;

            return true;
        }
예제 #5
0
파일: sayaniKombik.cs 프로젝트: Prizmer/ps
        public bool IsDatFileAvailable(string fileName)
        {
            FileStream testFs;
            if (File.Exists(fileName))
            {
                try
                {
                    testFs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                    MeterInfo testMi = new MeterInfo();
                    bool res = GetMeterInfo(testFs, ref testMi);
                    testFs.Close();

                    return res;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }