def newP400m_1v34(source, freq, num): ''' (str, int, int) -> str Корректирует файл прошивки версии 1v34 для Р400м для указанной частоты и номера аппарата. ''' def calcCrc1(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. ''' if (num == 1): crc = 64 elif (num == 2): crc = -64 return crc + 32 * freq def calcCrc2(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. ''' if (num == 1): crc = -16 elif (num == 2): crc = 16 return crc + 8 * freq def calcFreq(freq): ''' (int) -> int Вычисление значения для частоты. ''' return 32 * freq if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) # два байта по адресу '1C49' зависят только от частоты fr = my_func.intToStrHex(calcFreq(freq), 4, "le").decode('hex') adr = my_func.strHexToInt('1C49') source = source[:adr] + fr + source[adr + len(fr):] # два байта по адресу '5892' зависят от частоты и номера аппарата crc1 = my_func.intToStrHex(calcCrc1(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('5892') source = source[:adr] + crc1 + source[adr + len(crc1):] # два байта по адресу '5894' зависят от частоты и номера аппарата crc2 = my_func.intToStrHex(calcCrc2(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('5894') source = source[:adr] + crc2 + source[adr + len(crc2):] return source
def newRZSK_1v30(source, freq, num): """ (str, int, int) -> str Корректирует файл прошивки версии 1v30 для РЗСК для указанной частоты и номера аппарата. """ def calcCrc1(freq, num): """ (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. """ if num == 1: crc = -39 elif num == 2: crc = 38 return crc + 32 * freq def calcCrc2(freq, num): """ (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. """ if num == 1: crc = 9 elif num == 2: crc = -10 return crc + 8 * freq def calcFreq(freq): """ (int) -> int Вычисление значения для частоты. """ return 16 * freq if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) fr = my_func.intToStrHex(calcFreq(freq), 4, "le").decode("hex") adr = my_func.strHexToInt("4DE6") source = source[:adr] + fr + source[adr + len(fr) :] crc1 = my_func.intToStrHex(calcCrc1(freq, num), 4, "le").decode("hex") adr = my_func.strHexToInt("7C1E") source = source[:adr] + crc1 + source[adr + len(crc1) :] crc2 = my_func.intToStrHex(calcCrc2(freq, num), 4, "le").decode("hex") adr = my_func.strHexToInt("7C22") source = source[:adr] + crc2 + source[adr + len(crc2) :] return source
def newRZSK_1v30(source, freq, num): ''' (str, int, int) -> str Корректирует файл прошивки версии 1v30 для РЗСК для указанной частоты и номера аппарата. ''' def calcCrc1(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. ''' if (num == 1): crc = -39 elif (num == 2): crc = 38 return crc + 32 * freq def calcCrc2(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. ''' if (num == 1): crc = 9 elif (num == 2): crc = -10 return crc + 8 * freq def calcFreq(freq): ''' (int) -> int Вычисление значения для частоты. ''' return 16 * freq if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) fr = my_func.intToStrHex(calcFreq(freq), 4, "le").decode('hex') adr = my_func.strHexToInt('4DE6') source = source[:adr] + fr + source[adr + len(fr):] crc1 = my_func.intToStrHex(calcCrc1(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('7C1E') source = source[:adr] + crc1 + source[adr + len(crc1):] crc2 = my_func.intToStrHex(calcCrc2(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('7C22') source = source[:adr] + crc2 + source[adr + len(crc2):] return source
def newP400_1v34c(source, freq, num): ''' (str, int, int) -> str Корректирует файл прошивки версии 1v34c для Р400 для указанной частоты. Номер аппарата не используется. ''' # def calcFreq(freq): ''' (int) -> int Вычисление КС для заданной частоты. ''' return 32 * freq def calcCrc1(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты. ''' return 32 * freq def calcCrc2(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. ''' return 8 * freq if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) # два байта по адресу '1CDC' зависят от частоты fr = my_func.intToStrHex(calcFreq(freq), 4, "le").decode('hex') adr = my_func.strHexToInt('1CDC') source = source[:adr] + fr + source[adr + len(fr):] # два байта по адресу '5845' зависят от частоты crc1 = my_func.intToStrHex(calcCrc1(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('5845') source = source[:adr] + crc1 + source[adr + len(crc1):] # два байта по адресу '5847' зависят от частоты crc2 = my_func.intToStrHex(calcCrc2(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('5847') source = source[:adr] + crc2 + source[adr + len(crc2):] return source
def testStrHexToInt(self): """ (self) -> None �������� ���������� ������ ������� strHexToInt. """ self.assertEqual(my_func.strHexToInt("CC0"), 3264) self.assertEqual(my_func.strHexToInt("CC0", "be"), 3264) self.assertEqual(my_func.strHexToInt("12"), 18) self.assertEqual(my_func.strHexToInt("0CC0", "le"), 49164) self.assertRaises(ValueError, my_func.strHexToInt, "CC0", "d") self.assertRaises(TypeError, my_func.strHexToInt, 12) self.assertRaises(ValueError, my_func.strHexToInt, ":1")
def newData(self, data): ''' (self, list) -> bool Открытие файла данных нового образца. ''' print data r = my_func.strHexToInt(data[1]) print r uOut = [] for i in range(self.adjTable.rowCount()): val = ''.join(data[2 + i * 4: 2 + i * 4 + 4]) uOut.append(my_func.strHexToFloat(val, 'le')) print uOut uOut = [] uOutADC = [] iOut = [] iOutADC = [] rOutADC = [] offset = 2 for i in range(self.adjTable.rowCount()): val = ''.join(data[offset: offset + 4]) offset += 4 uOut.append(round(my_func.strHexToFloat(val, 'le'), 1)) val = ''.join(data[offset: offset + 4]) offset += 4 uOutADC.append(round(my_func.strHexToFloat(val, 'le'), 1)) val = ''.join(data[offset: offset + 2]) offset += 2 iOut.append(my_func.strHexToInt(val, 'le')) val = ''.join(data[offset: offset + 2]) offset += 2 iOutADC.append(my_func.strHexToInt(val, 'le')) val = ''.join(data[offset: offset + 4]) offset += 4 rOutADC.append(round(my_func.strHexToFloat(val, 'le'), 1)) # заполнение таблицы полученными данными self.adjTable.clearTable() for i in range(len(uOut)): data = [uOut[i], uOutADC[i], iOut[i], iOutADC[i], r] self.adjTable.addRowData(data)
def openFile(self): ''' (self) -> None Открытие файла данных с последующим заполнением таблицы. Если напряжение измеренное прибором = 0, то строка игнорируется. В старых файлах первым байтом идет сопротивление = 75Ом. В новых структура изменена и первым байтом идет 1. ''' filename = QtGui.QFileDialog.getOpenFileName(self, u"Открыть", filter="Data Files (*.dat)") if not filename: return # считывание сожержимого файла f = open(filename, 'rb') data_bin = f.read() f.close() data = [] for char in data_bin: data.append(my_func.charToStrHex(char)) del data_bin # сопротивление try: r = my_func.strHexToInt(data[0]) except: return # старыше прошивки - версия 1, новые 2 # в новых прошивках первым байтом идет 0 if r == 0: self.newData(data) else: self.oldData(data)
def newP400_1v36(source, freq, num): ''' (str) -> sr Корректирует файл прошивки версии 1v36 для Р400 для указанной частоты и номера аппарата. ''' # def calcFreq(freq): ''' (int) -> int Вычисление КС для заданной частоты. ''' return 16 * freq def calcCrc1(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты. ''' if (num == 1): crc = 64 elif (num == 2): crc = -64 return crc + 32 * freq def calcCrc2(freq, num): ''' (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. ''' if (num == 1): crc = -16 elif (num == 2): crc = 16 return crc + 8 * freq if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) # два байта зависят от частоты fr = my_func.intToStrHex(calcFreq(freq), 4, "le").decode('hex') adr = my_func.strHexToInt('1BEB') source = source[:adr] + fr + source[adr + len(fr):] # два байта зависят от частоты и номера аппарата crc1 = my_func.intToStrHex(calcCrc1(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('57EC') source = source[:adr] + crc1 + source[adr + len(crc1):] # два байта зависят от частоты и номера аппарата crc2 = my_func.intToStrHex(calcCrc2(freq, num), 4, "le").decode('hex') adr = my_func.strHexToInt('57EE') source = source[:adr] + crc2 + source[adr + len(crc2):] return source
def newP400_1v30(source, freq, num): ''' (str, int, int) -> str Корректирует файл прошивки версии 1v30 для Р400 для указанной частоты и номера аппарата. ''' # строка '57D0' вычисляется относительно частоты и номера аппарата # xx (crc1) (crc2) xx xx xx (crc1, crc2 - двухбайтные) # строка '1BD0' зависит от частоты # (fr) xx xx xx xx xx xx # def calcCrc1(freq, num): val = freq * 32 if num == 1: val += 64 elif num == 2: val -= 64 else: print u"calcCrc1" print u"Значения кроме 1 и 2 не принимаются:", num, type(num) raise ValueError val = my_func.intToStrHex(val) while len(val) < 4: val = '0' + val val = val[2:] + val[:2] return val # def calcCrc2(freq, num): val = freq * 8 if num == 1: val -= 16 elif num == 2: val += 16 else: print u"calcCrc2" print u"Значения кроме 1 и 2 не принимаются:", num, type(num) raise ValueError val = my_func.intToStrHex(val) while len(val) < 4: val = '0' + val val = val[2:] + val[:2] return val # def calcFreq(val): val = "%02x0" % val if len(val) < 4: val = '0' + val val = val[2:] + val[:2] return val.upper() if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) # строка '1BD0' зависит от частоты fr = calcFreq(freq).decode('hex') adr = my_func.strHexToInt('1BD0') source = source[:adr] + fr + source[adr + len(fr):] # строка '57D0' вычисляется относительно частоты и номера аппарата # xx (crc1) (crc2) xx xx xx (crc1, crc2 - двухбайтные) crc1 = calcCrc1(freq, num).decode('hex') crc2 = calcCrc2(freq, num).decode('hex') adr = my_func.strHexToInt('57D0') + 1 source = source[:adr] + crc1 + crc2 + source[adr + len(crc1) + len(crc2):] return source
def newP400m_1v34(source, freq, num): """ (str, int, int) -> str Корректирует файл прошивки версии 1v34 для Р400м для указанной частоты и номера аппарата. """ def calcCrc1(freq, num): """ (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. """ if num == 1: crc = 64 elif num == 2: crc = -64 return crc + 32 * freq def calcCrc2(freq, num): """ (int, int) -> int Вычисление КС для заданной частоты и номера аппарата. """ if num == 1: crc = -16 elif num == 2: crc = 16 return crc + 8 * freq def calcFreq(freq): """ (int) -> int Вычисление значения для частоты. """ return 32 * freq if not isinstance(source, str): raise TypeError(u"Ошибочный тип данных 'str'", unicode(type(source))) if not isinstance(freq, int): raise TypeError(u"Ошибочный тип данных 'freq'", unicode(type(freq))) if not isinstance(num, int): raise TypeError(u"Ошибочный тип данных 'num'", unicode(type(num))) # два байта по адресу '1C49' зависят только от частоты fr = my_func.intToStrHex(calcFreq(freq), 4, "le").decode("hex") adr = my_func.strHexToInt("1C49") source = source[:adr] + fr + source[adr + len(fr) :] # два байта по адресу '5892' зависят от частоты и номера аппарата crc1 = my_func.intToStrHex(calcCrc1(freq, num), 4, "le").decode("hex") adr = my_func.strHexToInt("5892") source = source[:adr] + crc1 + source[adr + len(crc1) :] # два байта по адресу '5894' зависят от частоты и номера аппарата crc2 = my_func.intToStrHex(calcCrc2(freq, num), 4, "le").decode("hex") adr = my_func.strHexToInt("5894") source = source[:adr] + crc2 + source[adr + len(crc2) :] return source
def oldData(self, data): ''' (self, list) -> bool Открытие файла данных старого образца. ''' # сопротивление r = my_func.strHexToInt(data[0]) # кол-во измерений для считывания numValues = self.adjTable.rowCount() # напряжения измеренные прибором uOut = [] try: for i in range(numValues): u = my_func.strHexToInt(data[i + 1]) if u == 0: break uOut.append(float(u)) # print u"Volatages =", uOut except: return # ток измеренный прибором iOut = [] for u in uOut: iOut.append(int(round(u * 1000 / r))) # print u"Currents =", iOut # напряжение измеренное МкУМ uOutADC = [] try: for i in range(numValues): tmp = data[41 + i * 4: 41 + i * 4 + 4] tmp = ''.join(tmp) tmp = round(my_func.strHexToFloat(tmp, 'le'), 1) uOutADC.append(tmp) except: return # print u"ADC vlotages =", uOutADC # ток имзеренный МкУМ iOutADC = [] try: for i in range(numValues): tmp = data[201 + i * 2: 201 + i * 2 + 2] tmp = ''.join(tmp) tmp = my_func.strHexToInt(tmp, 'le') iOutADC.append(tmp) except: return # print u'ADC currents =', iOutADC # сопротивление измеренное МкУМ rOutADC = [] for i in range(numValues): if iOutADC[i] != 0: tmp = round((1000 * uOutADC[i]) / iOutADC[i], 1) else: tmp = 1 rOutADC.append(tmp) # print u"ADC resistances =", rOutADC # заполнение таблицы полученными данными self.adjTable.clearTable() for i in range(len(uOut)): data = [uOut[i], uOutADC[i], iOut[i], iOutADC[i], r] self.adjTable.addRowData(data)