pyren/pyren3/scen_lect_ssppx91.py

421 lines
13 KiB
Python
Executable File

#!/usr/bin/env python3
'''
Scenarium usage example
Name of this script should be exactly the same as in scenaruim URL but with '.py' extension
URL - scm:scen_ecri_calinj1#scen_ecri_calinj1_xxxxx.xml
'run' procedure will be executed by pyren script
'''
import os
import sys
import re
import time
import string
import mod_globals
import mod_utils
import mod_ecu
import mod_db_manager
from mod_utils import KBHit
from mod_utils import pyren_encode
from mod_utils import clearScreen
from mod_utils import ASCIITOHEX
from mod_utils import StringToIntToHex
from mod_utils import Choice
from collections import OrderedDict
import xml.dom.minidom
def run( elm, ecu, command, data ):
'''
MAIN function of scenarium
Parameters:
elm - refernce to adapter class
ecu - reference to ecu class
command - refernce to the command this scenarium belongs to
data - name of xml file with parameters from scenarium URL
'''
clearScreen()
header = '['+command.codeMR+'] '+command.label
ScmSet = {}
ScmParam = OrderedDict()
def get_message( msg, encode = True ):
if msg in list(ScmParam.keys()):
value = ScmParam[msg]
else:
value = msg
if value.isdigit() and value in list(mod_globals.language_dict.keys()):
if encode:
value = pyren_encode(mod_globals.language_dict[value])
else:
value = mod_globals.language_dict[value]
return value
def get_message_by_id( id, encode = True ):
if id.isdigit() and id in list(mod_globals.language_dict.keys()):
if encode:
value = pyren_encode(mod_globals.language_dict[id])
else:
value = mod_globals.language_dict[id]
return value
#
# Data file parsing
#
DOMTree = xml.dom.minidom.parse(mod_db_manager.get_file_from_clip(data))
ScmRoom = DOMTree.documentElement
ScmParams = ScmRoom.getElementsByTagName("ScmParam")
for Param in ScmParams:
name = pyren_encode( Param.getAttribute("name") )
value = pyren_encode( Param.getAttribute("value") )
ScmParam[name] = value
ScmSets = ScmRoom.getElementsByTagName("ScmSet")
for Set in ScmSets:
if len(Set.attributes) != 1:
setname = pyren_encode(mod_globals.language_dict[Set.getAttribute("name")])
ScmParams = Set.getElementsByTagName("ScmParam")
for Param in ScmParams:
name = pyren_encode( Param.getAttribute("name") )
value = pyren_encode( Param.getAttribute("value") )
ScmSet[setname]= value
ScmParam[name] = value
kb = KBHit()
confirm = get_message_by_id('19800')
confirmCodes = get_message_by_id('17571')
resultMessage = get_message('TxtResult')
title = get_message('TextTitre', False)
stateLabel = get_message_by_id('804')
finishedInfo = get_message_by_id('15902')
messageInfo = get_message('MessageScr1', False)
readCodeMessage = get_message_by_id('17884')
codeInfo = get_message('TxtInformation')
codeRed = codeInfo.split('-')[1].strip()
codeOrange = codeInfo.split('-')[2].strip()
codeGreen = codeInfo.split('-')[3].strip()
oneValveText = get_message_by_id('14964', False)
fourValveText = get_message_by_id('14966', False)
NR10 = get_message('Nack10')
NR11 = get_message('NackServiceNotSupported')
NR12 = get_message('NackSubFunctionNotSupported')
NR21 = get_message('NackBusyRepeatRequest')
NR22 = get_message('NackConditionsNotCorrect')
NR23 = get_message('Nack23')
NR33 = get_message('NackSecurityAccessDenied')
NR35 = get_message('NackInvalidKey')
NR78 = get_message('NackResponsePending')
NR80 = get_message('Nack80')
NRFF = get_message('NackUnknown')
negrsp = {
'10' : NR10,
'11' : NR11,
'12' : NR12,
'21' : NR21,
'22' : NR22,
'23' : NR23,
'33' : NR33,
'35' : NR35,
'78' : NR78,
'80' : NR80,
'FF' : NRFF
}
searchInProgress = []
searchInProgress.append(get_message('Label_AVG_En_Cours'))
searchInProgress.append(get_message('Label_AVD_En_Cours'))
searchInProgress.append(get_message('Label_ARD_En_Cours'))
searchInProgress.append(get_message('Label_ARG_En_Cours'))
searchFinished = []
searchFinished.append(get_message('Label_AVG_Terminee'))
searchFinished.append(get_message('Label_AVD_Terminee'))
searchFinished.append(get_message('Label_ARD_Terminee'))
searchFinished.append(get_message('Label_ARG_Terminee'))
summerFLCode = ecu.get_id(ScmParam['ID_AVG_ETE'], 1)
summerFRCode = ecu.get_id(ScmParam['ID_AVD_ETE'], 1)
summerRRCode = ecu.get_id(ScmParam['ID_ARD_ETE'], 1)
summerRLCode = ecu.get_id(ScmParam['ID_ARG_ETE'], 1)
winterFLCode = ecu.get_id(ScmParam['ID_AVG_HIVER'], 1)
winterFRCode = ecu.get_id(ScmParam['ID_AVD_HIVER'], 1)
winterRRCode = ecu.get_id(ScmParam['ID_ARD_HIVER'], 1)
winterRLCode = ecu.get_id(ScmParam['ID_ARG_HIVER'], 1)
summerTyreCodes = [summerFLCode,summerFRCode,summerRRCode,summerRLCode]
winterTyreCodes = [winterFLCode,winterFRCode,winterRRCode,winterRLCode]
tyreCodes = []
tyreCodes.extend(summerTyreCodes)
tyreCodes.extend(winterTyreCodes)
tyresLabels = []
tyresLabels.append(get_message('Label_CodeAVG', False))
tyresLabels.append(get_message('Label_CodeAVD', False))
tyresLabels.append(get_message('Label_CodeARD', False))
tyresLabels.append(get_message('Label_CodeARG', False))
value1, datastr1 = ecu.get_st(ScmParam['State_ET469'])
tariningCmdResp = ecu.Services[ecu.get_ref_cmd(ScmParam['CmndRoutineTraining']).serviceID[0]].simpleRsp
currentTyreSet = ''
lastCodeStatus = ''
notUpdatedText = []
notUpdatedText.append(title)
notUpdatedText.append('*'*80)
notUpdatedText.append(messageInfo)
notUpdatedText.append('*'*80)
notUpdatedText.append(datastr1)
notUpdatedText.append('*'*80)
tyreCodesTable = []
if get_message('Text_ET469_ETE', False) in datastr1:
summerTyresSet = True
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[0], summerTyreCodes[0]))
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[1], summerTyreCodes[1]))
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[2], summerTyreCodes[2]))
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[3], summerTyreCodes[3]))
currentTyreSet = summerTyreCodes
else:
summerTyresSet = False
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[0], winterTyreCodes[0]))
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[1], winterTyreCodes[1]))
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[2], winterTyreCodes[2]))
tyreCodesTable.append("%-50s %-20s"%(tyresLabels[3], winterTyreCodes[3]))
currentTyreSet = winterTyreCodes
notUpdatedText = notUpdatedText + tyreCodesTable
notUpdatedText.append('*'*80)
buttons = OrderedDict()
buttons[1] = get_message_by_id('14964', False)
buttons[2] = get_message_by_id('14966', False)
buttons[3] = title
buttons["exit"] = '<exit>'
def sendTrainingCmd():
resp = ecu.run_cmd(ScmParam['CmndRoutineTraining'])
clearScreen()
if tariningCmdResp not in resp and not mod_globals.opt_demo:
nrCode = resp[resp.find('NR') - 3: resp.find('NR')]
print()
if 'NR' in resp:
print(negrsp[resp[resp.find('NR') - 3: resp.find('NR')]])
print('')
else:
print(negrsp['FF'])
print()
input('Press any key to exit')
return False
else:
return True
def writeCodes(codes):
ch = input(confirmCodes + ' <YES/NO>: ')
while (ch.upper()!='YES') and (ch.upper()!='NO'):
ch = input(confirmCodes + ' <YES/NO>: ')
if ch.upper()!='YES':
print()
return
print()
print('*'*80)
rsp = ecu.run_cmd('VP003', codes)
print('*'*80)
print()
def generateScreen(title, codes):
screen = ''
screenPartOne = []
screenPartOne.append(title)
screenPartOne.append('*'*80)
screenPartOne.append(datastr1)
screenPartOne.append('*'*80)
integratedLines = []
for num in range(len(tyreCodesTable)):
try:
integratedLines.append(tyreCodesTable[num] + codes[num])
except:
integratedLines.append(tyreCodesTable[num])
integratedScreen = screenPartOne + integratedLines
for lines in integratedScreen:
screen = screen + pyren_encode(lines) + '\n'
return screen
def writeOneValve():
selectedValve = ''
selectedValveKey = ''
screen = generateScreen(oneValveText, [])
valveLabelsDict = OrderedDict()
for lb in range(4):
valveLabelsDict[lb] = tyresLabels[lb]
valveLabelsDict["exit"] = '<exit>'
clearScreen()
print(screen)
print()
choice = Choice(list(valveLabelsDict.values()), get_message_by_id('14127').replace('.',':'))
clearScreen()
print(screen)
print()
for key, value in valveLabelsDict.items():
if choice[0] =='<exit>': return
if value == choice[0]:
selectedValve = valveLabelsDict[key]
selectedValveKey = key
userCode = input(pyren_encode(selectedValve) + ': ').upper()
while not len(userCode) == 6 or not all(c in string.hexdigits for c in userCode):
if not len(userCode) == 6:
print('Valve code should be 6 characters long.')
else:
print('Illegal characters in the valve code')
userCode = input(pyren_encode(selectedValve) + ': ').upper()
paramToSend = ''
if summerTyresSet:
for code in range(len(summerTyreCodes)):
if code == selectedValveKey:
paramToSend += userCode
else:
paramToSend += summerTyreCodes[code]
else:
for code in range(len(winterTyreCodes)):
if code == selectedValveKey:
paramToSend += userCode
else:
paramToSend += winterTyreCodes[code]
clearScreen()
print(screen)
print()
print(pyren_encode(tyreCodesTable[selectedValveKey]), userCode)
print()
writeCodes(paramToSend)
def writeFourValves():
userCodes = []
screen = generateScreen(fourValveText, [])
clearScreen()
print(screen)
ch = input(confirm + ' <YES/NO>: ')
while (ch.upper()!='YES') and (ch.upper()!='NO'):
ch = input(confirm + ' <YES/NO>: ')
if ch.upper()!='YES':
print()
return
clearScreen()
print(screen)
for num in range(len(tyresLabels)):
userCode = input(tyresLabels[num] + ': ').upper()
while not len(userCode) == 6 or not all(c in string.hexdigits for c in userCode):
if not len(userCode) == 6:
print('Valve code should be 6 characters long.')
else:
print('Illegal characters in the valve code')
userCode = input(tyresLabels[num] + ': ').upper()
userCodes.append(userCode)
clearScreen()
screen = generateScreen(fourValveText, userCodes)
print(screen)
paramToSend = ''
for code in userCodes:
paramToSend += code
writeCodes(paramToSend)
def valvesTraining():
readCodes = OrderedDict()
if not sendTrainingCmd():
return
tb = time.time()
while(1):
readCode = ecu.get_id(ScmParam['ID_Code_Valves'], 1)
value2, datastr2 = ecu.get_st(ScmParam['State_ET002'])
oldScreen = ''
for lines in notUpdatedText:
oldScreen = oldScreen + pyren_encode(lines) + '\n'
clearScreen()
print(oldScreen)
try:
print(stateLabel + ': ' + searchInProgress[len(readCodes)])
except:
input('More than 4 tyres codes, aborting.')
return
print()
print('*'*80)
if pyren_encode(value2) == pyren_encode(mod_globals.language_dict[ScmParam['StateNO']]) and len(readCodes) < 4:
print("%-50s %-20s"%(readCodeMessage, pyren_encode(readCode)))
print()
print("No codes read")
elif pyren_encode(value2) == pyren_encode(mod_globals.language_dict[ScmParam['StateYES']]) and len(readCodes) < 4:
print("%-50s %-20s"%(readCodeMessage, pyren_encode(readCode)))
print()
if readCode != '000000' and readCode not in list(readCodes.keys()):
if not readCode in tyreCodes:
lastCodeStatus = codeRed
elif readCode == currentTyreSet[len(readCodes)]:
lastCodeStatus = codeGreen
else:
lastCodeStatus = codeOrange
readCodes[readCode] = readCode
print(lastCodeStatus)
print()
for code in range(len(readCodes)):
print("%-60s %-8s"%(searchFinished[code], pyren_encode(readCodes[list(readCodes.keys())[code]])))
print('*'*80)
print()
print('Press any key to exit')
print()
time.sleep(int(ScmParam['Tempo2']) / 1000)
tc = time.time()
if (tc - tb) > int(ScmParam['Tempo1']) / 1000:
tb = time.time()
if not sendTrainingCmd():
return
if len(readCodes) == 4:
break
if kb.kbhit():
return
print(finishedInfo)
print()
paramToSend = ''
for code in list(readCodes.keys()):
paramToSend += code
if "ERROR" in paramToSend:
input("Data downloading went wrong. Aborting.")
return
writeCodes(paramToSend)
print(get_message_by_id('19830'))
print()
choice = Choice(list(buttons.values()), "Choose :")
for key, value in buttons.items():
if choice[0] =='<exit>': return
if value == choice[0]:
if key == 1:
writeOneValve()
elif key == 2:
writeFourValves()
elif key == 3:
valvesTraining()
input('Press any key to exit')
return