Cleanup generator code to handle \n in messages

This commit is contained in:
Ben V. Brown
2019-12-28 11:59:43 +11:00
parent 2d5482ecd2
commit 97f0dcae36

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
#coding=utf-8 # coding=utf-8
from __future__ import print_function from __future__ import print_function
import json import json
import os import os
@@ -81,60 +81,64 @@ def escapeC(s):
def getConstants(): def getConstants():
# Extra constants that are used in the firmware that are shared across all languages # Extra constants that are used in the firmware that are shared across all languages
consants =[] consants = []
consants.append(('SymbolPlus','+')) consants.append(('SymbolPlus', '+'))
consants.append(('SymbolMinus','-')) consants.append(('SymbolMinus', '-'))
consants.append(('SymbolSpace',' ')) consants.append(('SymbolSpace', ' '))
consants.append(('SymbolDot','.')) consants.append(('SymbolDot', '.'))
consants.append(('SymbolDegC','C')) consants.append(('SymbolDegC', 'C'))
consants.append(('SymbolDegF','F')) consants.append(('SymbolDegF', 'F'))
consants.append(('SymbolMinutes','M')) consants.append(('SymbolMinutes', 'M'))
consants.append(('SymbolSeconds','S')) consants.append(('SymbolSeconds', 'S'))
consants.append(('SymbolWatts','W')) consants.append(('SymbolWatts', 'W'))
consants.append(('SymbolVolts','V')) consants.append(('SymbolVolts', 'V'))
consants.append(('SymbolDC','DC')) consants.append(('SymbolDC', 'DC'))
consants.append(('SymbolCellCount','S')) consants.append(('SymbolCellCount', 'S'))
consants.append(('SymbolVersionNumber','V2.06')) consants.append(('SymbolVersionNumber', 'V2.06'))
return consants return consants
def getTipModelEnumTS80():
def getTipModelEnumTS80():
constants = [] constants = []
constants.append("B02") constants.append("B02")
constants.append("D25") constants.append("D25")
constants.append("TS80") # end of miniware constants.append("TS80") # end of miniware
constants.append("User") # User constants.append("User") # User
return constants return constants
def getTipModelEnumTS100():
def getTipModelEnumTS100():
constants = [] constants = []
constants.append("B02") constants.append("B02")
constants.append("D24") constants.append("D24")
constants.append("BC2") constants.append("BC2")
constants.append(" C1") constants.append(" C1")
constants.append("TS100")# end of miniware constants.append("TS100") # end of miniware
constants.append("BC2") constants.append("BC2")
constants.append("Hakko")# end of hakko constants.append("Hakko") # end of hakko
constants.append("User") constants.append("User")
return constants return constants
def getDebugMenu():
def getDebugMenu():
constants = [] constants = []
constants.append(datetime.today().strftime('%d-%m-%y')) constants.append(datetime.today().strftime('%d-%m-%y'))
constants.append("HW G ") constants.append("HW G ")
constants.append("HW M ") constants.append("HW M ")
constants.append("HW P ") constants.append("HW P ")
constants.append("Time ") constants.append("Time ")
constants.append("Move ") constants.append("Move ")
constants.append("RTip ") constants.append("RTip ")
constants.append("CTip ") constants.append("CTip ")
constants.append("CHan ") constants.append("CHan ")
constants.append("Vin ") constants.append("Vin ")
constants.append("PCB ") # PCB Version AKA IMU version constants.append("PCB ") # PCB Version AKA IMU version
return constants return constants
def getLetterCounts(defs, lang): def getLetterCounts(defs, lang):
textList = [] textList = []
#iterate over all strings # iterate over all strings
obj = lang['menuOptions'] obj = lang['menuOptions']
for mod in defs['menuOptions']: for mod in defs['menuOptions']:
eid = mod['id'] eid = mod['id']
@@ -173,13 +177,13 @@ def getLetterCounts(defs, lang):
for mod in defs['menuGroups']: for mod in defs['menuGroups']:
eid = mod['id'] eid = mod['id']
textList.append(obj[eid]['desc']) textList.append(obj[eid]['desc'])
constants = getConstants() constants = getConstants()
for x in constants: for x in constants:
textList.append(x[1]) textList.append(x[1])
textList.extend(getTipModelEnumTS100()) textList.extend(getTipModelEnumTS100())
textList.extend(getTipModelEnumTS80()) textList.extend(getTipModelEnumTS80())
textList.extend(getDebugMenu()) textList.extend(getDebugMenu())
# collapse all strings down into the composite letters and store totals for these # collapse all strings down into the composite letters and store totals for these
symbolCounts = {} symbolCounts = {}
@@ -187,26 +191,25 @@ def getLetterCounts(defs, lang):
line = line.replace('\n', '').replace('\r', '') line = line.replace('\n', '').replace('\r', '')
line = line.replace('\\n', '').replace('\\r', '') line = line.replace('\\n', '').replace('\\r', '')
if len(line): if len(line):
#print(line) # print(line)
for letter in line: for letter in line:
symbolCounts[letter] = symbolCounts.get(letter, 0) + 1 symbolCounts[letter] = symbolCounts.get(letter, 0) + 1
symbolCounts = sorted( symbolCounts = sorted(
symbolCounts.items(), symbolCounts.items(),
key=lambda kv: (kv[1],kv[0])) # swap to Big -> little sort order key=lambda kv: (kv[1], kv[0])) # swap to Big -> little sort order
symbolCounts = list(map(lambda x: x[0], symbolCounts)) symbolCounts = list(map(lambda x: x[0], symbolCounts))
symbolCounts.reverse() symbolCounts.reverse()
return symbolCounts return symbolCounts
def getFontMapAndTable(textList): def getFontMapAndTable(textList):
# the text list is sorted # the text list is sorted
# allocate out these in their order as number codes # allocate out these in their order as number codes
symbolMap = {} symbolMap = {}
symbolMap['\n'] = '\\x01' symbolMap['\n'] = '\\x01' # Force insert the newline char
index = 2 # start at 2, as 0= null terminator,1 = new line index = 2 # start at 2, as 0= null terminator,1 = new line
forcedFirstSymbols = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] forcedFirstSymbols = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
#enforce numbers are first # enforce numbers are first
for sym in forcedFirstSymbols: for sym in forcedFirstSymbols:
symbolMap[sym] = "\\x%0.2X" % index symbolMap[sym] = "\\x%0.2X" % index
index = index + 1 index = index + 1
@@ -229,12 +232,14 @@ def getFontMapAndTable(textList):
print('Missing Large font element for {}'.format(sym)) print('Missing Large font element for {}'.format(sym))
exit(1) exit(1)
fontLine = fontTable[sym] fontLine = fontTable[sym]
fontTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym],sym)) fontTableStrings.append(
fontLine + "//{} -> {}".format(symbolMap[sym], sym))
if sym not in fontSmallTable: if sym not in fontSmallTable:
print('Missing Small font element for {}'.format(sym)) print('Missing Small font element for {}'.format(sym))
exit(1) exit(1)
fontLine = fontSmallTable[sym] fontLine = fontSmallTable[sym]
fontSmallTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym],sym)) fontSmallTableStrings.append(
fontLine + "//{} -> {}".format(symbolMap[sym], sym))
for sym in textList: for sym in textList:
if sym not in fontTable: if sym not in fontTable:
@@ -242,12 +247,14 @@ def getFontMapAndTable(textList):
exit(1) exit(1)
if sym not in forcedFirstSymbols: if sym not in forcedFirstSymbols:
fontLine = fontTable[sym] fontLine = fontTable[sym]
fontTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym],sym)) fontTableStrings.append(
fontLine + "//{} -> {}".format(symbolMap[sym], sym))
if sym not in fontSmallTable: if sym not in fontSmallTable:
print('Missing Small font element for {}'.format(sym)) print('Missing Small font element for {}'.format(sym))
exit(1) exit(1)
fontLine = fontSmallTable[sym] fontLine = fontSmallTable[sym]
fontSmallTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym],sym)) fontSmallTableStrings.append(
fontLine + "//{} -> {}".format(symbolMap[sym], sym))
outputTable = "const uint8_t USER_FONT_12[] = {" + to_unicode("\n") outputTable = "const uint8_t USER_FONT_12[] = {" + to_unicode("\n")
for line in fontTableStrings: for line in fontTableStrings:
# join font table int one large string # join font table int one large string
@@ -265,7 +272,7 @@ def getFontMapAndTable(textList):
def convStr(symbolConversionTable, text): def convStr(symbolConversionTable, text):
# convert all of the symbols from the string into escapes for their content # convert all of the symbols from the string into escapes for their content
outputString = "" outputString = ""
for c in text.replace('\\r', '').replace('\\n','\n'): for c in text.replace('\\r', '').replace('\\n', '\n'):
if c not in symbolConversionTable: if c not in symbolConversionTable:
print('Missing font definition for {}'.format(c)) print('Missing font definition for {}'.format(c))
else: else:
@@ -276,7 +283,7 @@ def convStr(symbolConversionTable, text):
def writeLanguage(languageCode, defs, f): def writeLanguage(languageCode, defs, f):
print("Generating block for " + languageCode) print("Generating block for " + languageCode)
lang = langDict[languageCode] lang = langDict[languageCode]
#Iterate over all of the text to build up the symbols & counts # Iterate over all of the text to build up the symbols & counts
textList = getLetterCounts(defs, lang) textList = getLetterCounts(defs, lang)
# From the letter counts, need to make a symbol translator & write out the font # From the letter counts, need to make a symbol translator & write out the font
(fontTableText, symbolConversionTable) = getFontMapAndTable(textList) (fontTableText, symbolConversionTable) = getFontMapAndTable(textList)
@@ -290,7 +297,6 @@ def writeLanguage(languageCode, defs, f):
f.write(to_unicode("// ---- " + langName + " ----\n\n")) f.write(to_unicode("// ---- " + langName + " ----\n\n"))
# ----- Writing SettingsDescriptions # ----- Writing SettingsDescriptions
obj = lang['menuOptions'] obj = lang['menuOptions']
f.write(to_unicode("const char* SettingsDescriptions[] = {\n")) f.write(to_unicode("const char* SettingsDescriptions[] = {\n"))
@@ -316,14 +322,15 @@ def writeLanguage(languageCode, defs, f):
for mod in defs['messages']: for mod in defs['messages']:
eid = mod['id'] eid = mod['id']
if eid not in obj: sourceText = ""
f.write( if 'default' in mod:
sourceText = (mod['default'])
if eid in obj:
sourceText = (obj[eid])
translatedText = convStr(symbolConversionTable, sourceText)
f.write(
to_unicode("const char* " + eid + " = \"" + to_unicode("const char* " + eid + " = \"" +
convStr(symbolConversionTable, (mod['default'])) + "\";"+ "//{} \n".format(mod['default']))) translatedText + "\";" + "//{} \n".format(sourceText.replace('\n', '_'))))
else:
f.write(
to_unicode("const char* " + eid + " = \"" +
convStr(symbolConversionTable, (obj[eid])) + "\";"+ "//{} \n".format(obj[eid])))
f.write(to_unicode("\n")) f.write(to_unicode("\n"))
@@ -335,7 +342,7 @@ def writeLanguage(languageCode, defs, f):
eid = mod['id'] eid = mod['id']
f.write( f.write(
to_unicode("const char* " + eid + " = \"" + to_unicode("const char* " + eid + " = \"" +
convStr(symbolConversionTable, obj[eid]) + "\";"+ "//{} \n".format(obj[eid]))) convStr(symbolConversionTable, obj[eid]) + "\";" + "//{} \n".format(obj[eid])))
f.write(to_unicode("\n")) f.write(to_unicode("\n"))
@@ -344,7 +351,7 @@ def writeLanguage(languageCode, defs, f):
for x in constants: for x in constants:
f.write( f.write(
to_unicode("const char* " + x[0] + " = \"" + to_unicode("const char* " + x[0] + " = \"" +
convStr(symbolConversionTable, x[1]) + "\";"+ "//{} \n".format(x[1]))) convStr(symbolConversionTable, x[1]) + "\";" + "//{} \n".format(x[1])))
f.write(to_unicode("\n")) f.write(to_unicode("\n"))
# Write out tip model strings # Write out tip model strings
@@ -352,19 +359,22 @@ def writeLanguage(languageCode, defs, f):
f.write(to_unicode("const char* TipModelStrings[] = {\n")) f.write(to_unicode("const char* TipModelStrings[] = {\n"))
f.write(to_unicode("#ifdef MODEL_TS100\n")) f.write(to_unicode("#ifdef MODEL_TS100\n"))
for c in getTipModelEnumTS100(): for c in getTipModelEnumTS100():
f.write(to_unicode("\t \"" + convStr(symbolConversionTable, c) + "\","+ "//{} \n".format(c))) f.write(to_unicode("\t \"" + convStr(symbolConversionTable,
c) + "\"," + "//{} \n".format(c)))
f.write(to_unicode("#else\n")) f.write(to_unicode("#else\n"))
for c in getTipModelEnumTS80(): for c in getTipModelEnumTS80():
f.write(to_unicode("\t \"" + convStr(symbolConversionTable, c) + "\","+ "//{} \n".format(c))) f.write(to_unicode("\t \"" + convStr(symbolConversionTable,
c) + "\"," + "//{} \n".format(c)))
f.write(to_unicode("#endif\n")) f.write(to_unicode("#endif\n"))
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
# Debug Menu # Debug Menu
f.write(to_unicode("const char* DebugMenu[] = {\n")) f.write(to_unicode("const char* DebugMenu[] = {\n"))
for c in getDebugMenu(): for c in getDebugMenu():
f.write(to_unicode("\t \"" + convStr(symbolConversionTable, c) + "\","+ "//{} \n".format(c))) f.write(to_unicode("\t \"" + convStr(symbolConversionTable,
c) + "\"," + "//{} \n".format(c)))
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
# ----- Menu Options # ----- Menu Options
@@ -392,12 +402,12 @@ def writeLanguage(languageCode, defs, f):
convStr(symbolConversionTable, (obj[eid]['text2'][0])) + convStr(symbolConversionTable, (obj[eid]['text2'][0])) +
"\", \"" + "\", \"" +
convStr(symbolConversionTable, (obj[eid]['text2'][1])) + convStr(symbolConversionTable, (obj[eid]['text2'][1])) +
"\" },"+ "//{} \n".format(obj[eid]['text2']))) "\" }," + "//{} \n".format(obj[eid]['text2'])))
else: else:
f.write( f.write(
to_unicode("{ \"" + to_unicode("{ \"" +
convStr(symbolConversionTable, (obj[eid]['text'])) + convStr(symbolConversionTable, (obj[eid]['text'])) +
"\" },"+ "//{} \n".format(obj[eid]['text']))) "\" }," + "//{} \n".format(obj[eid]['text'])))
if 'feature' in mod: if 'feature' in mod:
f.write(to_unicode("#endif\n")) f.write(to_unicode("#endif\n"))
@@ -416,7 +426,7 @@ def writeLanguage(languageCode, defs, f):
f.write( f.write(
to_unicode("\"" + to_unicode("\"" +
convStr(symbolConversionTable, (obj[eid]['text2'][0]) + convStr(symbolConversionTable, (obj[eid]['text2'][0]) +
"\\n" + obj[eid]['text2'][1]) + "\","+ "//{} \n".format(obj[eid]['text2']))) "\\n" + obj[eid]['text2'][1]) + "\"," + "//{} \n".format(obj[eid]['text2'])))
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
@@ -433,7 +443,7 @@ def writeLanguage(languageCode, defs, f):
f.write( f.write(
to_unicode("\"" + to_unicode("\"" +
convStr(symbolConversionTable, (obj[eid]['desc'])) + convStr(symbolConversionTable, (obj[eid]['desc'])) +
"\","+ "//{} \n".format(obj[eid]['desc']))) "\"," + "//{} \n".format(obj[eid]['desc'])))
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))