1
0
forked from me/IronOS

Merge pull request #745 from Ralim/Testing-Thermo

Improving thermal performance & squashing related bugs & Improve minor CI tweaks
This commit is contained in:
Ben V. Brown
2020-12-30 19:44:22 +11:00
committed by GitHub
25 changed files with 1574 additions and 1444 deletions

View File

@@ -1,103 +0,0 @@
name: CI PR
on: [pull_request]
jobs:
build_TS80:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh
- name: setup
run: ./setup.sh
- name: build TS80
run: cd workspace/TS100 && ./build.sh -m TS80
- name: Archive TS80 artifacts
uses: actions/upload-artifact@v2
with:
name: TS80
path: |
workspace/TS100/Hexfile/TS80_*.hex
workspace/TS100/Hexfile/TS80_*.bin
if-no-files-found: error
build_TS80P:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh
- name: setup
run: ./setup.sh
- name: build TS80P
run: cd workspace/TS100 && ./build.sh -m TS80P
- name: Archive TS80P artifacts
uses: actions/upload-artifact@v2
with:
name: TS80P
path: |
workspace/TS100/Hexfile/TS80P_*.hex
workspace/TS100/Hexfile/TS80P_*.bin
if-no-files-found: error
build_TS100:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh
- name: setup
run: ./setup.sh
- name: build TS100
run: cd workspace/TS100 && ./build.sh -m TS100
- name: Archive TS100 artifacts
uses: actions/upload-artifact@v2
with:
name: TS100
path: |
workspace/TS100/Hexfile/TS100_*.hex
workspace/TS100/Hexfile/TS100_*.bin
if-no-files-found: error
build_Pinecil:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh
- name: setup
run: ./setup.sh
- name: build Pinecil
run: cd workspace/TS100 && ./build.sh -m Pinecil
- name: Archive Pinecil artifacts
uses: actions/upload-artifact@v2
with:
name: Pinecil
path: |
workspace/TS100/Hexfile/Pinecil_*.hex
workspace/TS100/Hexfile/Pinecil_*.bin
if-no-files-found: error

View File

@@ -1,6 +1,6 @@
name: CI PR name: CI Build all
on: [push] on: [push,pull_request]
jobs: jobs:
build_TS80: build_TS80:
@@ -10,7 +10,18 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: chmod - name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh && sudo mkdir -p /build/cache && sudo chmod -R 777 /build
- name: Cached compiler source files
uses: actions/cache@v2
env:
cache-name: cache-compilers
with:
# we deliberately persist a cache folder forwards
path: /build/cache
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: |
${{ runner.os }}-
- name: setup - name: setup
run: ./setup.sh run: ./setup.sh
@@ -33,7 +44,18 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: chmod - name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh && sudo mkdir -p /build/cache && sudo chmod -R 777 /build
- name: Cached compiler source files
uses: actions/cache@v2
env:
cache-name: cache-compilers
with:
# we deliberately persist a cache folder forwards
path: /build/cache
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: |
${{ runner.os }}-
- name: setup - name: setup
run: ./setup.sh run: ./setup.sh
@@ -56,7 +78,18 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: chmod - name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh && sudo mkdir -p /build/cache && sudo chmod -R 777 /build
- name: Cached compiler source files
uses: actions/cache@v2
env:
cache-name: cache-compilers
with:
# we deliberately persist a cache folder forwards
path: /build/cache
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: |
${{ runner.os }}-
- name: setup - name: setup
run: ./setup.sh run: ./setup.sh
@@ -80,7 +113,18 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: chmod - name: chmod
run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh run: chmod +x setup.sh && chmod +x workspace/TS100/build.sh && sudo mkdir -p /build/cache && sudo chmod -R 777 /build
- name: Cached compiler source files
uses: actions/cache@v2
env:
cache-name: cache-compilers
with:
# we deliberately persist a cache folder forwards
path: /build/cache
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: |
${{ runner.os }}-
- name: setup - name: setup
run: ./setup.sh run: ./setup.sh

3
.gitignore vendored
View File

@@ -190,4 +190,5 @@ fabric.properties
.idea/httpRequests .idea/httpRequests
CoreCompileInputs.cache CoreCompileInputs.cache
.vscode/settings.json .vscode/settings.json
workspace/TS100/TS100/

View File

@@ -0,0 +1,76 @@
# Debugging Menu
In this firmware there is extra debugging information hidden under and extra menu.
This is accessed by holding the rear (B) button on the iron while its on the home screen.
This menu is meant to be simple, so it has no fancy GUI animations.
To move through the menu use the front (A) button.
To exit, use the rear (B) button again.
## Menu items
Items are shown in the menu on a single line, so they use short codes
### HW G
This indicates the High Water mark for the stack for the GUI thread. The smaller this number is, the less headroom we have in the stack.
As this is a Highwater mater, you should only trust this once you have walked through all GUI options to "hit" the worst one.
### HW M
This indicates the High Water mark for the stack for the movement detection thread. The smaller this number is, the less headroom we have in the stack.
### HW P
This indicates the High Water mark for the stack for the PID thread. The smaller this number is, the less headroom we have in the stack.
### Time
This just shows how many seconds the unit has been powered for.
### Move
This is the last timestamp of movement. When the iron is moved this should update to match the Time field (one before in the menu).
This can be used for checking performance of the movement dection code.
### RTip
This is the raw tip reading in uV. This can be used when assessing the calibration routines for example.
### CTip
This is the tip temperature in deg C. This can be used with RTip for assessing temperature processing performance.
### CHan
This is the handle temperature in C. This is used for cold junction compensation of the tip temp.
### Vin
The input voltage reading.
### PCB
This is slightly miss-named, but preserving the name for now.
This indicates the PCB "version" number, which comes from the TS100 changing the model of accelerometer without warning.
This indicates the accelerometer that is fitted inside the unit.
- 0 = MMA8652
- 1 = LIS2DH12
- 2 = BMA223
- 99 = None detected (running in fallback without movement detection)
### PWR
This indicates the current power source for the iron.
This may change during power up as the sources are negotiated in turn.
- 0 = DC input (dumb)
- 1 = QC input (We used QC2/3 negotiation for current supply)
- 2 = PD input (We used the PD subsystem to negotiate for the current supply)
### Max
This indicates the max temp in C that the system estimates it can measure the tip reliably to.
This is dependant on a few factors including the handle temperature so it can move around during use.

View File

@@ -1,4 +1,4 @@
# Upgrading your iron # Flashing / Upgrading your iron
## Miniware irons (TS100, TS80, TS80P) ## Miniware irons (TS100, TS80, TS80P)

File diff suppressed because it is too large Load Diff

View File

@@ -54,19 +54,20 @@ def readTranslations(jsonDir):
langCode = fileName[12:-5].upper() langCode = fileName[12:-5].upper()
# ...and the one specified in the JSON file... # ...and the one specified in the JSON file...
try: try:
langCodeFromJson = lang['languageCode'] langCodeFromJson = lang["languageCode"]
except KeyError: except KeyError:
langCodeFromJson = "(missing)" langCodeFromJson = "(missing)"
try: try:
TempUnitF_FromJson = lang['tempUnitFahrenheit'] TempUnitF_FromJson = lang["tempUnitFahrenheit"]
except KeyError: except KeyError:
TempUnitF_FromJson = True # Default to true. TempUnitF_FromJson = True # Default to true.
# ...cause they should be the same! # ...cause they should be the same!
if langCode != langCodeFromJson: if langCode != langCodeFromJson:
raise ValueError("Invalid languageCode " + langCodeFromJson + raise ValueError(
" in file " + fileName) "Invalid languageCode " + langCodeFromJson + " in file " + fileName
)
langDict[langCode] = lang langDict[langCode] = lang
UnitDict[langCode] = TempUnitF_FromJson UnitDict[langCode] = TempUnitF_FromJson
@@ -82,7 +83,9 @@ def writeStart(f):
#ifndef LANG #ifndef LANG
#define LANG_EN #define LANG_EN
#endif #endif
""")) """
)
)
def writeStartUnit(f): def writeStartUnit(f):
@@ -100,86 +103,91 @@ def writeStartUnit(f):
#ifndef _UNIT_H #ifndef _UNIT_H
#define _UNIT_H\n #define _UNIT_H\n
""")) """
)
)
def escapeC(s): def escapeC(s):
return s.replace("\"", "\\\"") return s.replace('"', '\\"')
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', buildVersion)) consants.append(("SymbolVersionNumber", buildVersion))
return consants return consants
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 ") # High Water marker for GUI task
constants.append("HW M ") constants.append("HW M ") # High Water marker for MOV task
constants.append("HW P ") constants.append("HW P ") # High Water marker for PID task
constants.append("Time ") constants.append("Time ") # Uptime (aka timestamp)
constants.append("Move ") constants.append("Move ") # Time of last significant movement
constants.append("RTip ") constants.append("RTip ") # Tip reading in uV
constants.append("CTip ") constants.append("CTip ") # Tip temp in C
constants.append("CHan ") constants.append("CHan ") # Handle temp in C
constants.append("Vin ") constants.append("Vin ") # Input voltage
constants.append("PCB ") # PCB Version AKA IMU version constants.append("PCB ") # PCB Version AKA IMU version
constants.append("PWR ") # Power Negotiation State
constants.append("Max ") # Max deg C limit
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"]
textList.append(obj[eid]['desc']) textList.append(obj[eid]["desc"])
obj = lang['messages'] obj = lang["messages"]
for mod in defs['messages']: for mod in defs["messages"]:
eid = mod['id'] eid = mod["id"]
if eid not in obj: if eid not in obj:
textList.append(mod['default']) textList.append(mod["default"])
else: else:
textList.append(obj[eid]) textList.append(obj[eid])
obj = lang['characters'] obj = lang["characters"]
for mod in defs['characters']: for mod in defs["characters"]:
eid = mod['id'] eid = mod["id"]
textList.append(obj[eid]) textList.append(obj[eid])
obj = lang['menuOptions'] obj = lang["menuOptions"]
for mod in defs['menuOptions']: for mod in defs["menuOptions"]:
eid = mod['id'] eid = mod["id"]
textList.append(obj[eid]['text2'][0]) textList.append(obj[eid]["text2"][0])
textList.append(obj[eid]['text2'][1]) textList.append(obj[eid]["text2"][1])
obj = lang['menuGroups'] obj = lang["menuGroups"]
for mod in defs['menuGroups']: for mod in defs["menuGroups"]:
eid = mod['id'] eid = mod["id"]
textList.append(obj[eid]['text2'][0]) textList.append(obj[eid]["text2"][0])
textList.append(obj[eid]['text2'][1]) textList.append(obj[eid]["text2"][1])
obj = lang['menuGroups'] obj = lang["menuGroups"]
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])
@@ -189,15 +197,15 @@ def getLetterCounts(defs, lang):
symbolCounts = {} symbolCounts = {}
for line in textList: for line in textList:
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])
key=lambda kv: (kv[1], kv[0])) # swap to Big -> little sort order ) # 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
@@ -207,17 +215,17 @@ 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' # Force insert the newline char 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
if len(textList) > (253 - len(forcedFirstSymbols)): if len(textList) > (253 - len(forcedFirstSymbols)):
print('Error, too many used symbols for this version') print("Error, too many used symbols for this version")
exit(1) exit(1)
print('Generating fonts for {} symbols'.format(len(textList))) print("Generating fonts for {} symbols".format(len(textList)))
for sym in textList: for sym in textList:
if sym not in symbolMap: if sym not in symbolMap:
@@ -230,39 +238,38 @@ def getFontMapAndTable(textList):
fontSmallTable = fontTables.getSmallFontMap() fontSmallTable = fontTables.getSmallFontMap()
for sym in forcedFirstSymbols: for sym in forcedFirstSymbols:
if sym not in fontTable: if sym not in fontTable:
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( fontTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym], sym))
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( fontSmallTableStrings.append(
fontLine + "//{} -> {}".format(symbolMap[sym], sym)) fontLine + "//{} -> {}".format(symbolMap[sym], sym)
)
for sym in textList: for sym in textList:
if sym not in fontTable: if sym not in fontTable:
print('Missing Large font element for {}'.format(sym)) print("Missing Large font element for {}".format(sym))
exit(1) exit(1)
if sym not in forcedFirstSymbols: if sym not in forcedFirstSymbols:
fontLine = fontTable[sym] fontLine = fontTable[sym]
fontTableStrings.append( fontTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym], sym))
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( fontSmallTableStrings.append(
fontLine + "//{} -> {}".format(symbolMap[sym], sym)) 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
outputTable = outputTable + line + to_unicode("\n") outputTable = outputTable + line + to_unicode("\n")
outputTable = outputTable + "};" + to_unicode("\n") outputTable = outputTable + "};" + to_unicode("\n")
outputTable = outputTable + "const uint8_t USER_FONT_6x8[] = {" + to_unicode( outputTable = outputTable + "const uint8_t USER_FONT_6x8[] = {" + to_unicode("\n")
"\n")
for line in fontSmallTableStrings: for line in fontSmallTableStrings:
# join font table int one large string # join font table int one large string
outputTable = outputTable + line + to_unicode("\n") outputTable = outputTable + line + to_unicode("\n")
@@ -273,9 +280,9 @@ 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:
outputString = outputString + symbolConversionTable[c] outputString = outputString + symbolConversionTable[c]
return outputString return outputString
@@ -292,60 +299,86 @@ def writeLanguage(languageCode, defs, f):
f.write(to_unicode("\n#ifdef LANG_" + languageCode + "\n")) f.write(to_unicode("\n#ifdef LANG_" + languageCode + "\n"))
f.write(fontTableText) f.write(fontTableText)
try: try:
langName = lang['languageLocalName'] langName = lang["languageLocalName"]
except KeyError: except KeyError:
langName = languageCode langName = languageCode
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"))
maxLen = 25 maxLen = 25
index =0 index = 0
for mod in defs['menuOptions']: for mod in defs["menuOptions"]:
eid = mod['id'] eid = mod["id"]
if 'feature' in mod: if "feature" in mod:
f.write(to_unicode("#ifdef " + mod['feature'] + "\n")) f.write(to_unicode("#ifdef " + mod["feature"] + "\n"))
f.write(to_unicode(" /* ["+"{:02d}".format(index)+"] " + eid.ljust(maxLen)[:maxLen] + " */ "))
f.write( f.write(
to_unicode("\"" + to_unicode(
convStr(symbolConversionTable, (obj[eid]['desc'])) + " /* ["
"\"," + "//{} \n".format(obj[eid]['desc']))) + "{:02d}".format(index)
if 'feature' in mod: + "] "
+ eid.ljust(maxLen)[:maxLen]
+ " */ "
)
)
f.write(
to_unicode(
'"'
+ convStr(symbolConversionTable, (obj[eid]["desc"]))
+ '",'
+ "//{} \n".format(obj[eid]["desc"])
)
)
if "feature" in mod:
f.write(to_unicode("#endif\n")) f.write(to_unicode("#endif\n"))
index=index+1 index = index + 1
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
# ----- Writing Message strings # ----- Writing Message strings
obj = lang['messages'] obj = lang["messages"]
for mod in defs['messages']: for mod in defs["messages"]:
eid = mod['id'] eid = mod["id"]
sourceText = "" sourceText = ""
if 'default' in mod: if "default" in mod:
sourceText = (mod['default']) sourceText = mod["default"]
if eid in obj: if eid in obj:
sourceText = (obj[eid]) sourceText = obj[eid]
translatedText = convStr(symbolConversionTable, sourceText) translatedText = convStr(symbolConversionTable, sourceText)
f.write( f.write(
to_unicode("const char* " + eid + " = \"" + to_unicode(
translatedText + "\";" + "//{} \n".format(sourceText.replace('\n', '_')))) "const char* "
+ eid
+ ' = "'
+ translatedText
+ '";'
+ "//{} \n".format(sourceText.replace("\n", "_"))
)
)
f.write(to_unicode("\n")) f.write(to_unicode("\n"))
# ----- Writing Characters # ----- Writing Characters
obj = lang['characters'] obj = lang["characters"]
for mod in defs['characters']: for mod in defs["characters"]:
eid = mod['id'] eid = mod["id"]
f.write( f.write(
to_unicode("const char* " + eid + " = \"" + to_unicode(
convStr(symbolConversionTable, obj[eid]) + "\";" + "//{} \n".format(obj[eid]))) "const char* "
+ eid
+ ' = "'
+ convStr(symbolConversionTable, obj[eid])
+ '";'
+ "//{} \n".format(obj[eid])
)
)
f.write(to_unicode("\n")) f.write(to_unicode("\n"))
@@ -353,8 +386,15 @@ def writeLanguage(languageCode, defs, f):
constants = getConstants() constants = getConstants()
for x in constants: for x in constants:
f.write( f.write(
to_unicode("const char* " + x[0] + " = \"" + to_unicode(
convStr(symbolConversionTable, x[1]) + "\";" + "//{} \n".format(x[1]))) "const char* "
+ x[0]
+ ' = "'
+ convStr(symbolConversionTable, x[1])
+ '";'
+ "//{} \n".format(x[1])
)
)
f.write(to_unicode("\n")) f.write(to_unicode("\n"))
@@ -362,66 +402,91 @@ def writeLanguage(languageCode, defs, f):
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, f.write(
c) + "\"," + "//{} \n".format(c))) to_unicode(
'\t "' + convStr(symbolConversionTable, c) + '",' + "//{} \n".format(c)
)
)
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
# ----- Writing SettingsDescriptions # ----- Writing SettingsDescriptions
obj = lang['menuOptions'] obj = lang["menuOptions"]
f.write(to_unicode("const char* SettingsShortNames[][2] = {\n")) f.write(to_unicode("const char* SettingsShortNames[][2] = {\n"))
maxLen = 25 maxLen = 25
index = 0 index = 0
for mod in defs['menuOptions']: for mod in defs["menuOptions"]:
eid = mod['id'] eid = mod["id"]
if 'feature' in mod: if "feature" in mod:
f.write(to_unicode("#ifdef " + mod['feature'] + "\n")) f.write(to_unicode("#ifdef " + mod["feature"] + "\n"))
f.write(to_unicode(" /* ["+"{:02d}".format(index)+"] " + eid.ljust(maxLen)[:maxLen] + " */ "))
f.write( f.write(
to_unicode( to_unicode(
"{ \"" + " /* ["
convStr(symbolConversionTable, (obj[eid]['text2'][0])) + + "{:02d}".format(index)
"\", \"" + + "] "
convStr(symbolConversionTable, (obj[eid]['text2'][1])) + + eid.ljust(maxLen)[:maxLen]
"\" }," + "//{} \n".format(obj[eid]['text2']))) + " */ "
)
if 'feature' in mod: )
f.write(
to_unicode(
'{ "'
+ convStr(symbolConversionTable, (obj[eid]["text2"][0]))
+ '", "'
+ convStr(symbolConversionTable, (obj[eid]["text2"][1]))
+ '" },'
+ "//{} \n".format(obj[eid]["text2"])
)
)
if "feature" in mod:
f.write(to_unicode("#endif\n")) f.write(to_unicode("#endif\n"))
index = index + 1 index = index + 1
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
# ----- Writing Menu Groups # ----- Writing Menu Groups
obj = lang['menuGroups'] obj = lang["menuGroups"]
f.write( f.write(to_unicode("const char* SettingsMenuEntries[" + str(len(obj)) + "] = {\n"))
to_unicode("const char* SettingsMenuEntries[" + str(len(obj)) +
"] = {\n"))
maxLen = 25 maxLen = 25
for mod in defs['menuGroups']: for mod in defs["menuGroups"]:
eid = mod['id'] eid = mod["id"]
f.write(to_unicode(" /* " + eid.ljust(maxLen)[:maxLen] + " */ ")) f.write(to_unicode(" /* " + eid.ljust(maxLen)[:maxLen] + " */ "))
f.write( f.write(
to_unicode("\"" + to_unicode(
convStr(symbolConversionTable, (obj[eid]['text2'][0]) + '"'
"\\n" + obj[eid]['text2'][1]) + "\"," + "//{} \n".format(obj[eid]['text2']))) + convStr(
symbolConversionTable,
(obj[eid]["text2"][0]) + "\\n" + obj[eid]["text2"][1],
)
+ '",'
+ "//{} \n".format(obj[eid]["text2"])
)
)
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
# ----- Writing Menu Groups Descriptions # ----- Writing Menu Groups Descriptions
obj = lang['menuGroups'] obj = lang["menuGroups"]
f.write( f.write(
to_unicode("const char* SettingsMenuEntriesDescriptions[" + to_unicode(
str(len(obj)) + "] = {\n")) "const char* SettingsMenuEntriesDescriptions[" + str(len(obj)) + "] = {\n"
)
)
maxLen = 25 maxLen = 25
for mod in defs['menuGroups']: for mod in defs["menuGroups"]:
eid = mod['id'] eid = mod["id"]
f.write(to_unicode(" /* " + eid.ljust(maxLen)[:maxLen] + " */ ")) f.write(to_unicode(" /* " + eid.ljust(maxLen)[:maxLen] + " */ "))
f.write( f.write(
to_unicode("\"" + to_unicode(
convStr(symbolConversionTable, (obj[eid]['desc'])) + '"'
"\"," + "//{} \n".format(obj[eid]['desc']))) + convStr(symbolConversionTable, (obj[eid]["desc"]))
+ '",'
+ "//{} \n".format(obj[eid]["desc"])
)
)
f.write(to_unicode("};\n\n")) f.write(to_unicode("};\n\n"))
@@ -434,36 +499,49 @@ def writeUnit(languageCode, defs, f, UnitCodes):
lang = langDict[languageCode] lang = langDict[languageCode]
unit = UnitDict[UnitCodes] unit = UnitDict[UnitCodes]
try: try:
langName = lang['languageLocalName'] langName = lang["languageLocalName"]
except KeyError: except KeyError:
langName = languageCode langName = languageCode
f.write(to_unicode(" #ifdef LANG_" + languageCode + "\n")) f.write(to_unicode(" #ifdef LANG_" + languageCode + "\n"))
if unit: if unit:
f.write(to_unicode(" #define ENABLED_FAHRENHEIT_SUPPORT" + "\n")) f.write(to_unicode(" #define ENABLED_FAHRENHEIT_SUPPORT" + "\n"))
else: f.write(to_unicode(" //#define ENABLED_FAHRENHEIT_SUPPORT" + "\n")) else:
f.write(to_unicode(" //#define ENABLED_FAHRENHEIT_SUPPORT" + "\n"))
# ----- Block end # ----- Block end
f.write(to_unicode(" #endif /* ---- " + langName + " ---- */\n")) f.write(to_unicode(" #endif /* ---- " + langName + " ---- */\n"))
def readVersion(): def readVersion():
with open(os.path.relpath(jsonDir + with open(
"/../workspace/TS100/version.h"),"r") as version_file: os.path.relpath(jsonDir + "/../workspace/TS100/version.h"), "r"
try: ) as version_file:
try:
for line in version_file: for line in version_file:
if re.findall(r'^.*(?<=(#define)).*(?<=(BUILD_VERSION))', line): if re.findall(r"^.*(?<=(#define)).*(?<=(BUILD_VERSION))", line):
line = re.findall(r'\"(.+?)\"',line) line = re.findall(r"\"(.+?)\"", line)
if line: if line:
version = line[0] version = line[0]
try: version += "."+ subprocess.check_output( try:
["git","rev-parse", "--short=7", "HEAD"]).strip().decode('ascii').upper() version += (
# --short=7: the shorted hash with 7 digits. Increase/decrease if needed! "."
except OSError: version += " git" + subprocess.check_output(
finally: ["git", "rev-parse", "--short=7", "HEAD"]
if version_file: )
version_file.close(); .strip()
.decode("ascii")
.upper()
)
# --short=7: the shorted hash with 7 digits. Increase/decrease if needed!
except OSError:
version += " git"
finally:
if version_file:
version_file.close()
return version return version
def read_opts(): def read_opts():
""" Reading input parameters """Reading input parameters
First parameter = json directory First parameter = json directory
Second parameter = translation directory Second parameter = translation directory
Third paramter = unit directory Third paramter = unit directory
@@ -478,12 +556,12 @@ def read_opts():
else: else:
outDir = os.path.relpath(jsonDir + "/../workspace/TS100/Core/Src") outDir = os.path.relpath(jsonDir + "/../workspace/TS100/Core/Src")
outFileTranslationCPP = os.path.join(outDir, TRANSLATION_CPP) outFileTranslationCPP = os.path.join(outDir, TRANSLATION_CPP)
if len(sys.argv) > 3: if len(sys.argv) > 3:
outFileUnitH = sys.argv[3] outFileUnitH = sys.argv[3]
else: else:
outDir = os.path.relpath(jsonDir + "/../workspace/TS100/Core/Inc") outDir = os.path.relpath(jsonDir + "/../workspace/TS100/Core/Inc")
outFileUnitH = os.path.join(outDir,UNIT_H) outFileUnitH = os.path.join(outDir, UNIT_H)
if len(sys.argv) > 4: if len(sys.argv) > 4:
raise Exception("Too many parameters!") raise Exception("Too many parameters!")
@@ -493,7 +571,7 @@ def read_opts():
def orderOutput(langDict): def orderOutput(langDict):
# These languages go first # These languages go first
mandatoryOrder = ['EN'] mandatoryOrder = ["EN"]
# Then add all others in alphabetical order # Then add all others in alphabetical order
sortedKeys = sorted(langDict.keys()) sortedKeys = sorted(langDict.keys())
@@ -508,17 +586,18 @@ def orderOutput(langDict):
def writeTarget(outFileTranslationCPP, outFileUnitH, defs, langCodes, UnitCodes): def writeTarget(outFileTranslationCPP, outFileUnitH, defs, langCodes, UnitCodes):
# Start writing the file # Start writing the file
with io.open(outFileTranslationCPP, 'w', encoding='utf-8', newline="\n") as f: with io.open(outFileTranslationCPP, "w", encoding="utf-8", newline="\n") as f:
writeStart(f) writeStart(f)
for langCode in langCodes: for langCode in langCodes:
writeLanguage(langCode, defs, f) writeLanguage(langCode, defs, f)
with io.open(outFileUnitH, 'w', encoding='utf-8', newline="\n") as f: with io.open(outFileUnitH, "w", encoding="utf-8", newline="\n") as f:
writeStartUnit(f) writeStartUnit(f)
for langCode, UnitCode in zip(langCodes, UnitCodes): for langCode, UnitCode in zip(langCodes, UnitCodes):
writeUnit(langCode, defs, f, UnitCode) writeUnit(langCode, defs, f, UnitCode)
f.write(to_unicode("\n#endif /* _UNIT_H */\n")) f.write(to_unicode("\n#endif /* _UNIT_H */\n"))
if __name__ == "__main__": if __name__ == "__main__":
try: try:
jsonDir, outFileTranslationCPP, outFileUnitH = read_opts() jsonDir, outFileTranslationCPP, outFileUnitH = read_opts()
@@ -526,8 +605,11 @@ if __name__ == "__main__":
print("usage: make_translation.py {json dir} {cpp dir}") print("usage: make_translation.py {json dir} {cpp dir}")
sys.exit(1) sys.exit(1)
try: buildVersion = readVersion() try:
except: print("error: could not get/extract build version"); sys.exit(1) buildVersion = readVersion()
except:
print("error: could not get/extract build version")
sys.exit(1)
print("Build version: " + buildVersion) print("Build version: " + buildVersion)
print("Making " + outFileTranslationCPP + " from " + jsonDir) print("Making " + outFileTranslationCPP + " from " + jsonDir)

View File

@@ -0,0 +1 @@
2b9eeccc33470f9d3cda26983b9d2dc6 gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2

View File

@@ -0,0 +1 @@
add5b6a9b12987d0e72f55a4d2cd0f3b nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2

View File

@@ -1,16 +0,0 @@
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
SECRETS="$DIR/encrypted/*.encrypted"
KEY="$DIR/../../codeship.aes"
mkdir -p $DIR/unencrypted
for f in $SECRETS
do
out="${f/.encrypted/.secret}"
out="${out/encrypted/unencrypted}"
echo $out
jet decrypt $f $out --key-path $KEY
done
echo "Done"

View File

@@ -1,2 +0,0 @@
codeship:v2
DUgOERb8iPVn95/DKIw9M7sgNjJlIlsaeE4PFV58tmmBu2sD1ooR7Y0L23bimC9a

View File

@@ -1,15 +1,35 @@
#!/bin/bash #!/bin/bash
set -e set -e
# Setup shell file to setup the environment on an ubuntu machine # Setup shell file to setup the environment on an ubuntu machine
sudo apt-get update sudo apt-get update && sudo apt-get install -y make bzip2 git python3 wget
sudo apt-get install -y make bzip2 git python3 wget sudo mkdir -p /build
sudo mkdir /build
cd /build cd /build
sudo wget -qO- https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 | sudo tar -xj #Download source files to cache folder
sudo wget -qO- https://github.com/Ralim/nuclei-compiler/releases/download/2020.08/nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2 | sudo tar -xj # Remember if these are updated, you need to update the md5 file respectively
# Github checks out under $GITHUB_WORKSPACE
MDPATH=${GITHUB_WORKSPACE:-/build/source/}
sudo mkdir -p /build/cache
cd /build/cache/
if md5sum -c $MDPATH/ci/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2.md5; then
echo "Good MD5 ARM"
else
echo "ARM MD5 Mismatch, downloading fresh"
sudo wget -q https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -O gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2
fi
# Add compiler to the path if md5sum -c $MDPATH/ci/nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2.md5; then
echo "Good MD5 RISCV"
else
echo "RISCV MD5 Mismatch, downloading fresh"
sudo wget -q https://github.com/Ralim/nuclei-compiler/releases/download/2020.08/nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2 -O nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2
fi
echo "Extracting compilers"
sudo tar -xj -f gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -C /build/
sudo tar -xj -f nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2 -C /build/
echo "Link into PATH"
sudo ln -s /build/gcc-arm-none-eabi-9-2020-q2-update/bin/* /usr/local/bin sudo ln -s /build/gcc-arm-none-eabi-9-2020-q2-update/bin/* /usr/local/bin
sudo ln -s /build/gcc/bin/* /usr/local/bin sudo ln -s /build/gcc/bin/* /usr/local/bin

View File

@@ -13,8 +13,8 @@ volatile uint16_t PWMSafetyTimer = 0;
volatile uint8_t pendingPWM = 0; volatile uint8_t pendingPWM = 0;
const uint16_t powerPWM = 255; const uint16_t powerPWM = 255;
static const uint8_t holdoffTicks = 13; // delay of 7 ms static const uint8_t holdoffTicks = 14; // delay of 8 ms
static const uint8_t tempMeasureTicks = 17; static const uint8_t tempMeasureTicks = 14;
uint16_t totalPWM; //htim2.Init.Period, the full PWM cycle uint16_t totalPWM; //htim2.Init.Period, the full PWM cycle
@@ -60,37 +60,37 @@ static const uint16_t NTCHandleLookup[] = {
22264, 27, // 22264, 27, //
21933, 28, // 21933, 28, //
21599, 29, // 21599, 29, //
// 21261, 30, // 21261, 30, //
// 20921, 31, // 20921, 31, //
// 20579, 32, // 20579, 32, //
// 20234, 33, // 20234, 33, //
// 19888, 34, // 19888, 34, //
// 19541, 35, // 19541, 35, //
// 19192, 36, // 19192, 36, //
// 18843, 37, // 18843, 37, //
// 18493, 38, // 18493, 38, //
// 18143, 39, // 18143, 39, //
// 17793, 40, // 17793, 40, //
// 17444, 41, // 17444, 41, //
// 17096, 42, // 17096, 42, //
// 16750, 43, // 16750, 43, //
// 16404, 44, // 16404, 44, //
// 16061, 45, // 16061, 45, //
// 15719, 46, // // 15719, 46, //
// 15380, 47, // // 15380, 47, //
// 15044, 48, // // 15044, 48, //
// 14710, 49, // // 14710, 49, //
// 14380, 50, // // 14380, 50, //
// 14053, 51, // // 14053, 51, //
// 13729, 52, // // 13729, 52, //
// 13410, 53, // // 13410, 53, //
// 13094, 54, // // 13094, 54, //
// 12782, 55, // // 12782, 55, //
// 12475, 56, // // 12475, 56, //
// 12172, 57, // // 12172, 57, //
// 11874, 58, // // 11874, 58, //
// 11580, 59, // // 11580, 59, //
// 11292, 60, // // 11292, 60, //
}; };
#endif #endif
@@ -100,13 +100,12 @@ uint16_t getHandleTemperature() {
//NTCG104EF104FT1X from TDK //NTCG104EF104FT1X from TDK
//For now not doing interpolation //For now not doing interpolation
int32_t result = getADC(0); int32_t result = getADC(0);
for (uint32_t i = 0; i < (sizeof(NTCHandleLookup) / (2 * sizeof(uint16_t))); for (uint32_t i = 0; i < (sizeof(NTCHandleLookup) / (2 * sizeof(uint16_t))); i++) {
i++) {
if (result > NTCHandleLookup[(i * 2) + 0]) { if (result > NTCHandleLookup[(i * 2) + 0]) {
return NTCHandleLookup[(i * 2) + 1] * 10; return NTCHandleLookup[(i * 2) + 1] * 10;
} }
} }
return 0; return 45 * 10;
#endif #endif
#ifdef TEMP_TMP36 #ifdef TEMP_TMP36
// We return the current handle temperature in X10 C // We return the current handle temperature in X10 C
@@ -119,9 +118,9 @@ uint16_t getHandleTemperature() {
int32_t result = getADC(0); int32_t result = getADC(0);
result -= 4965; // remove 0.5V offset result -= 4965; // remove 0.5V offset
// 10mV per C // 10mV per C
// 99.29 counts per Deg C above 0C // 99.29 counts per Deg C above 0C. Tends to read a tad over across all of my sample units
result *= 100; result *= 100;
result /= 993; result /= 994;
return result; return result;
#endif #endif
} }
@@ -201,7 +200,7 @@ void setTipPWM(uint8_t pulse) {
static void switchToFastPWM(void) { static void switchToFastPWM(void) {
fastPWM = true; fastPWM = true;
totalPWM = powerPWM + tempMeasureTicks * 2; totalPWM = powerPWM + tempMeasureTicks * 2 + holdoffTicks;
htim2.Instance->ARR = totalPWM; htim2.Instance->ARR = totalPWM;
// ~3.5 Hz rate // ~3.5 Hz rate
htim2.Instance->CCR1 = powerPWM + holdoffTicks * 2; htim2.Instance->CCR1 = powerPWM + holdoffTicks * 2;
@@ -211,7 +210,7 @@ static void switchToFastPWM(void) {
static void switchToSlowPWM(void) { static void switchToSlowPWM(void) {
fastPWM = false; fastPWM = false;
totalPWM = powerPWM + tempMeasureTicks; totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
htim2.Instance->ARR = totalPWM; htim2.Instance->ARR = totalPWM;
// ~1.84 Hz rate // ~1.84 Hz rate
htim2.Instance->CCR1 = powerPWM + holdoffTicks; htim2.Instance->CCR1 = powerPWM + holdoffTicks;
@@ -335,12 +334,10 @@ void unstick_I2C() {
} }
uint8_t getButtonA() { uint8_t getButtonA() {
return HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ? return HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ? 1 : 0;
1 : 0;
} }
uint8_t getButtonB() { uint8_t getButtonB() {
return HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ? return HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ? 1 : 0;
1 : 0;
} }
void BSPInit(void) { void BSPInit(void) {

View File

@@ -16,6 +16,7 @@
#define TMP36_INPUT_Pin GPIO_PIN_7 #define TMP36_INPUT_Pin GPIO_PIN_7
#define TMP36_INPUT_GPIO_Port GPIOA #define TMP36_INPUT_GPIO_Port GPIOA
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_7 #define TMP36_ADC1_CHANNEL ADC_CHANNEL_7
#define TMP36_ADC2_CHANNEL ADC_CHANNEL_7
#define TIP_TEMP_Pin GPIO_PIN_0 #define TIP_TEMP_Pin GPIO_PIN_0
#define TIP_TEMP_GPIO_Port GPIOB #define TIP_TEMP_GPIO_Port GPIOB
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8 #define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8
@@ -48,6 +49,7 @@
#define TMP36_INPUT_Pin GPIO_PIN_4 #define TMP36_INPUT_Pin GPIO_PIN_4
#define TMP36_INPUT_GPIO_Port GPIOA #define TMP36_INPUT_GPIO_Port GPIOA
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4 #define TMP36_ADC1_CHANNEL ADC_CHANNEL_4
#define TMP36_ADC2_CHANNEL ADC_CHANNEL_4
#define TIP_TEMP_Pin GPIO_PIN_3 #define TIP_TEMP_Pin GPIO_PIN_3
#define TIP_TEMP_GPIO_Port GPIOA #define TIP_TEMP_GPIO_Port GPIOA
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3 #define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3
@@ -87,6 +89,7 @@
#define TMP36_INPUT_Pin GPIO_PIN_4 #define TMP36_INPUT_Pin GPIO_PIN_4
#define TMP36_INPUT_GPIO_Port GPIOA #define TMP36_INPUT_GPIO_Port GPIOA
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4 #define TMP36_ADC1_CHANNEL ADC_CHANNEL_4
#define TMP36_ADC2_CHANNEL ADC_CHANNEL_4
#define TIP_TEMP_Pin GPIO_PIN_3 #define TIP_TEMP_Pin GPIO_PIN_3
#define TIP_TEMP_GPIO_Port GPIOA #define TIP_TEMP_GPIO_Port GPIOA
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3 #define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3

View File

@@ -17,8 +17,9 @@ DMA_HandleTypeDef hdma_i2c1_tx;
IWDG_HandleTypeDef hiwdg; IWDG_HandleTypeDef hiwdg;
TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim3;
#define ADC_CHANNELS 2
uint16_t ADCReadings[64]; // room for 32 lots of the pair of readings #define ADC_SAMPLES 16
uint32_t ADCReadings[ADC_SAMPLES * ADC_CHANNELS]; // room for 32 lots of the pair of readings
// Functions // Functions
static void SystemClock_Config(void); static void SystemClock_Config(void);
@@ -30,7 +31,6 @@ static void MX_TIM2_Init(void);
static void MX_DMA_Init(void); static void MX_DMA_Init(void);
static void MX_GPIO_Init(void); static void MX_GPIO_Init(void);
static void MX_ADC2_Init(void); static void MX_ADC2_Init(void);
#define SWD_ENABLE
void Setup_HAL() { void Setup_HAL() {
SystemClock_Config(); SystemClock_Config();
@@ -49,7 +49,7 @@ void Setup_HAL() {
MX_TIM2_Init(); MX_TIM2_Init();
MX_IWDG_Init(); MX_IWDG_Init();
HAL_ADC_Start(&hadc2); HAL_ADC_Start(&hadc2);
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*) ADCReadings, 64); // start DMA of normal readings HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADCReadings, (ADC_SAMPLES * ADC_CHANNELS)); // start DMA of normal readings
HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings
HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings
} }
@@ -57,8 +57,12 @@ void Setup_HAL() {
// channel 0 -> temperature sensor, 1-> VIN // channel 0 -> temperature sensor, 1-> VIN
uint16_t getADC(uint8_t channel) { uint16_t getADC(uint8_t channel) {
uint32_t sum = 0; uint32_t sum = 0;
for (uint8_t i = 0; i < 32; i++) for (uint8_t i = 0; i < ADC_SAMPLES; i++) {
sum += ADCReadings[channel + (i * 2)]; uint16_t adc1Sample = ADCReadings[channel + (i * ADC_CHANNELS)];
uint16_t adc2Sample = ADCReadings[channel + (i * ADC_CHANNELS)] >> 16;
sum += (adc1Sample + adc2Sample);
}
return sum >> 2; return sum >> 2;
} }
@@ -125,7 +129,7 @@ static void MX_ADC1_Init(void) {
hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2; hadc1.Init.NbrOfConversion = ADC_CHANNELS;
HAL_ADC_Init(&hadc1); HAL_ADC_Init(&hadc1);
/**Configure the ADC multi-mode /**Configure the ADC multi-mode
@@ -136,14 +140,14 @@ static void MX_ADC1_Init(void) {
/**Configure Regular Channel /**Configure Regular Channel
*/ */
sConfig.Channel = TMP36_ADC1_CHANNEL; sConfig.Channel = TMP36_ADC1_CHANNEL;
sConfig.Rank = 1; sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/**Configure Regular Channel /**Configure Regular Channel
*/ */
sConfig.Channel = VIN_ADC1_CHANNEL; sConfig.Channel = VIN_ADC1_CHANNEL;
sConfig.Rank = 2; sConfig.Rank = ADC_REGULAR_RANK_2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/**Configure Injected Channel /**Configure Injected Channel
@@ -157,15 +161,15 @@ static void MX_ADC1_Init(void) {
sConfigInjected.InjectedChannel = TIP_TEMP_ADC1_CHANNEL; sConfigInjected.InjectedChannel = TIP_TEMP_ADC1_CHANNEL;
sConfigInjected.InjectedRank = 1; sConfigInjected.InjectedRank = 1;
sConfigInjected.InjectedNbrOfConversion = 4; sConfigInjected.InjectedNbrOfConversion = 4;
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5; sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1; sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1;
sConfigInjected.AutoInjectedConv = DISABLE; sConfigInjected.AutoInjectedConv = DISABLE;
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
sConfigInjected.InjectedOffset = 0; sConfigInjected.InjectedOffset = 0;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5; sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfigInjected.InjectedRank = 2; sConfigInjected.InjectedRank = 2;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedRank = 3; sConfigInjected.InjectedRank = 3;
@@ -191,15 +195,16 @@ static void MX_ADC2_Init(void) {
hadc2.Init.DiscontinuousConvMode = DISABLE; hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.NbrOfConversion = 2; hadc2.Init.NbrOfConversion = ADC_CHANNELS;
HAL_ADC_Init(&hadc2); HAL_ADC_Init(&hadc2);
/**Configure Regular Channel /**Configure Regular Channel
*/ */
sConfig.Channel = TIP_TEMP_ADC2_CHANNEL; sConfig.Channel = TMP36_ADC2_CHANNEL;
sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc2, &sConfig); HAL_ADC_ConfigChannel(&hadc2, &sConfig);
sConfig.Channel = VIN_ADC2_CHANNEL; sConfig.Channel = VIN_ADC2_CHANNEL;
sConfig.Rank = ADC_REGULAR_RANK_2; sConfig.Rank = ADC_REGULAR_RANK_2;
HAL_ADC_ConfigChannel(&hadc2, &sConfig); HAL_ADC_ConfigChannel(&hadc2, &sConfig);
@@ -209,7 +214,7 @@ static void MX_ADC2_Init(void) {
sConfigInjected.InjectedChannel = TIP_TEMP_ADC2_CHANNEL; sConfigInjected.InjectedChannel = TIP_TEMP_ADC2_CHANNEL;
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1; sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
sConfigInjected.InjectedNbrOfConversion = 4; sConfigInjected.InjectedNbrOfConversion = 4;
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5; sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1; sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1;
sConfigInjected.AutoInjectedConv = DISABLE; sConfigInjected.AutoInjectedConv = DISABLE;
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
@@ -279,7 +284,7 @@ static void MX_TIM3_Init(void) {
HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 80; //80% duty cycle, that is AC coupled through the cap sConfigOC.Pulse = 50; //50% duty cycle, that is AC coupled through the cap
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, PWM_Out_CHANNEL); HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, PWM_Out_CHANNEL);
@@ -339,7 +344,7 @@ static void MX_TIM2_Init(void) {
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCMode = TIM_OCMODE_PWM1;
// dummy value, will be reconfigured by BSPInit() // dummy value, will be reconfigured by BSPInit() in the BSP.cpp
sConfigOC.Pulse = 255 + 13 * 2; // 13 -> Delay of 7 ms sConfigOC.Pulse = 255 + 13 * 2; // 13 -> Delay of 7 ms
//255 is the largest time period of the drive signal, and then offset ADC sample to be a bit delayed after this //255 is the largest time period of the drive signal, and then offset ADC sample to be a bit delayed after this
/* /*

View File

@@ -41,10 +41,10 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) {
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH; hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM;
HAL_DMA_Init(&hdma_adc1); HAL_DMA_Init(&hdma_adc1);
__HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1); __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
@@ -62,7 +62,13 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) {
*/ */
GPIO_InitStruct.Pin = TIP_TEMP_Pin; GPIO_InitStruct.Pin = TIP_TEMP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(TIP_TEMP_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = TMP36_INPUT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(TMP36_INPUT_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = VIN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(VIN_GPIO_Port, &GPIO_InitStruct);
/* ADC2 interrupt Init */ /* ADC2 interrupt Init */
HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0); HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);

View File

@@ -39,7 +39,7 @@ bool BMA223::initalize() {
} }
void BMA223::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) { void BMA223::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) {
//The BMA is odd in that its output data width is only 8 bits //The BMA is odd in that its output data width is only 8 bits
//And yet there are MSB and LSB registers _sigh_. //And yet there are MSB and LSB registers _sigh_.
uint8_t sensorData[6] = { 0, 0, 0, 0, 0, 0 }; uint8_t sensorData[6] = { 0, 0, 0, 0, 0, 0 };
@@ -48,9 +48,9 @@ void BMA223::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) {
x = y = z = 0; x = y = z = 0;
return; return;
} }
//Shift 6 to make its range ~= the other accelerometers
x = sensorData[1] << 5; x = sensorData[1] << 6;
y = sensorData[3] << 5; y = sensorData[3] << 6;
z = sensorData[5] << 5; z = sensorData[5] << 6;
} }

View File

@@ -10,7 +10,7 @@
#include "BSP.h" #include "BSP.h"
#include "power.hpp" #include "power.hpp"
#include "../../configuration.h" #include "../../configuration.h"
#include "main.hpp"
/* /*
* The hardware is laid out as a non-inverting op-amp * The hardware is laid out as a non-inverting op-amp
* There is a pullup of 39k(TS100) from the +ve input to 3.9V (1M pulup on TS100) * There is a pullup of 39k(TS100) from the +ve input to 3.9V (1M pulup on TS100)
@@ -39,12 +39,15 @@ uint32_t TipThermoModel::convertTipRawADCTouV(uint16_t rawADC) {
uint32_t valueuV = rawInputmVX10 * 100; // shift into uV uint32_t valueuV = rawInputmVX10 * 100; // shift into uV
//Now to divide this down by the gain //Now to divide this down by the gain
valueuV = (valueuV) / OP_AMP_GAIN_STAGE; valueuV /= OP_AMP_GAIN_STAGE;
//Remove uV tipOffset
if (valueuV >= systemSettings.CalibrationOffset) if (systemSettings.CalibrationOffset) {
valueuV -= systemSettings.CalibrationOffset; //Remove uV tipOffset
else if (valueuV >= systemSettings.CalibrationOffset)
valueuV = 0; valueuV -= systemSettings.CalibrationOffset;
else
valueuV = 0;
}
return valueuV; return valueuV;
} }
@@ -64,22 +67,137 @@ uint32_t TipThermoModel::convertTipRawADCToDegF(uint16_t rawADC) {
// [x1, y1] = point 1 // [x1, y1] = point 1
// [x2, y2] = point 2 // [x2, y2] = point 2
// x = input value // x = input value
// output is x's extrapolated y value // output is x's interpolated y value
int32_t LinearInterpolate(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x) { int32_t LinearInterpolate(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x) {
return y1 + (((((x - x1) * 1000) / (x2 - x1)) * (y2 - y1))) / 1000; return y1 + (((((x - x1) * 1000) / (x2 - x1)) * (y2 - y1))) / 1000;
} }
#ifdef TEMP_uV_LOOKUP_HAKKO
const uint16_t uVtoDegC[] = { //
//
0, 0, //
266, 10, //
522, 20, //
770, 30, //
1010, 40, //
1244, 50, //
1473, 60, //
1697, 70, //
1917, 80, //
2135, 90, //
2351, 100, //
2566, 110, //
2780, 120, //
2994, 130, //
3209, 140, //
3426, 150, //
3644, 160, //
3865, 170, //
4088, 180, //
4314, 190, //
4544, 200, //
4777, 210, //
5014, 220, //
5255, 230, //
5500, 240, //
5750, 250, //
6003, 260, //
6261, 270, //
6523, 280, //
6789, 290, //
7059, 300, //
7332, 310, //
7609, 320, //
7889, 330, //
8171, 340, //
8456, 350, //
8742, 360, //
9030, 370, //
9319, 380, //
9607, 390, //
9896, 400, //
10183, 410, //
10468, 420, //
10750, 430, //
11029, 440, //
11304, 450, //
11573, 460, //
11835, 470, //
12091, 480, //
12337, 490, //
12575, 500, //
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { };
//based on new measurements, tip is quite linear
//
tipuVDelta *= 10;
tipuVDelta /= systemSettings.TipGain;
#if defined( MODEL_TS80)+defined( MODEL_TS80P)>0
tipuVDelta /= OP_AMP_GAIN_STAGE_TS100 / OP_AMP_GAIN_STAGE_TS80;
#endif #endif
return tipuVDelta; #ifdef TEMP_uV_LOOKUP_TS80
const uint16_t uVtoDegC[] = { //
//
530 , 0, //
1282 , 10, //
2034 , 20, //
2786 , 30, //
3538 , 40, //
4290 , 50, //
5043 , 60, //
5795 , 70, //
6547 , 80, //
7299 , 90, //
8051 , 100, //
8803 , 110, //
9555 , 120, //
10308 , 130, //
11060 , 140, //
11812 , 150, //
12564 , 160, //
13316 , 170, //
14068 , 180, //
14820 , 190, //
15573 , 200, //
16325 , 210, //
17077 , 220, //
17829 , 230, //
18581 , 240, //
19333 , 250, //
20085 , 260, //
20838 , 270, //
21590 , 280, //
22342 , 290, //
23094 , 300, //
23846 , 310, //
24598 , 320, //
25350 , 330, //
26103 , 340, //
26855 , 350, //
27607 , 360, //
28359 , 370, //
29111 , 380, //
29863 , 390, //
30615 , 400, //
31368 , 410, //
32120 , 420, //
32872 , 430, //
33624 , 440, //
34376 , 450, //
35128 , 460, //
35880 , 470, //
36632 , 480, //
37385 , 490, //
38137 , 500, //
};
#endif
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) {
if (tipuVDelta) {
int noItems = sizeof(uVtoDegC) / (2 * sizeof(uint16_t));
for (int i = 1; i < (noItems - 1); i++) {
//If current tip temp is less than current lookup, then this current lookup is the higher point to interpolate
if (tipuVDelta < uVtoDegC[i * 2]) {
return LinearInterpolate(uVtoDegC[(i - 1) * 2], uVtoDegC[((i - 1) * 2) + 1], uVtoDegC[i * 2], uVtoDegC[(i * 2) + 1], tipuVDelta);
}
}
return LinearInterpolate(uVtoDegC[(noItems - 2) * 2], uVtoDegC[((noItems - 2) * 2) + 1], uVtoDegC[(noItems - 1) * 2], uVtoDegC[((noItems - 1) * 2) + 1], tipuVDelta);
}
return 0;
} }
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
@@ -89,13 +207,14 @@ uint32_t TipThermoModel::convertuVToDegF(uint32_t tipuVDelta) {
uint32_t TipThermoModel::convertCtoF(uint32_t degC) { uint32_t TipThermoModel::convertCtoF(uint32_t degC) {
//(Y °C × 9/5) + 32 =Y°F //(Y °C × 9/5) + 32 =Y°F
return 32 + ((degC * 9) / 5); return (32 + ((degC * 9) / 5));
} }
uint32_t TipThermoModel::convertFtoC(uint32_t degF) { uint32_t TipThermoModel::convertFtoC(uint32_t degF) {
//(Y°F 32) × 5/9 = Y°C //(Y°F 32) × 5/9 = Y°C
if (degF < 32) if (degF < 32) {
return 0; return 0;
}
return ((degF - 32) * 5) / 9; return ((degF - 32) * 5) / 9;
} }
#endif #endif
@@ -113,10 +232,8 @@ uint32_t TipThermoModel::getTipInC(bool sampleNow) {
} }
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
uint32_t TipThermoModel::getTipInF(bool sampleNow) { uint32_t TipThermoModel::getTipInF(bool sampleNow) {
uint32_t currentTipTempInF = TipThermoModel::convertTipRawADCToDegF( uint32_t currentTipTempInF = getTipInC(sampleNow);
getTipRawTemp(sampleNow)); currentTipTempInF = convertCtoF(currentTipTempInF);
currentTipTempInF += convertCtoF(getHandleTemperature() / 10); //Add handle offset
currentTipTempInF += x10WattHistory.average() / 45; // 25 * 9 / 5, see getTipInC
return currentTipTempInF; return currentTipTempInF;
} }
#endif #endif

View File

@@ -51,7 +51,6 @@ typedef struct {
uint8_t powerLimit; // Maximum power iron allowed to output uint8_t powerLimit; // Maximum power iron allowed to output
uint16_t TipGain; // uV/C * 10, it can be used to convert tip thermocouple voltage to temperateture TipV/TipGain = TipTemp
uint8_t ReverseButtonTempChangeEnabled; // Change the plus and minus button assigment uint8_t ReverseButtonTempChangeEnabled; // Change the plus and minus button assigment
uint16_t TempChangeLongStep; // Change the plus and minus button assigment uint16_t TempChangeLongStep; // Change the plus and minus button assigment

View File

@@ -11,10 +11,7 @@
#include "stdint.h" #include "stdint.h"
extern const uint8_t USER_FONT_12[]; extern const uint8_t USER_FONT_12[];
extern const uint8_t USER_FONT_6x8[]; extern const uint8_t USER_FONT_6x8[];
/*
* When SettingsShortNameType is SHORT_NAME_SINGLE_LINE
* use SettingsShortNames as SettingsShortNames[16][1].. second column undefined
*/
extern const char *SettingsShortNames[29][2]; extern const char *SettingsShortNames[29][2];
extern const char *SettingsDescriptions[29]; extern const char *SettingsDescriptions[29];
extern const char *SettingsMenuEntries[4]; extern const char *SettingsMenuEntries[4];

View File

@@ -1,124 +0,0 @@
#pragma once
/**
* Configuration.h
* Define here your default pre settings for TS80 or TS100
*
*/
//===========================================================================
//============================= Default Settings ============================
//===========================================================================
/**
* Default soldering temp is 320.0 C
* Temperature the iron sleeps at - default 150.0 C
*/
#define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C
#define SLEEP_TEMP 150 // Default sleep temperature
#define BOOST_TEMP 420 // Default boost temp.
#define BOOST_MODE_ENABLED 1 // 0: Disable 1: Enable
/**
* Blink the temperature on the cooling screen when its > 50C
*/
#define COOLING_TEMP_BLINK 0 // 0: Disable 1: Enable
/**
* How many seconds/minutes we wait until going to sleep/shutdown.
* Values -> SLEEP_TIME * 10; i.e. 5*10 = 50 Seconds!
*/
#define SLEEP_TIME 5 // x10 Seconds
#define SHUTDOWN_TIME 10 // Minutes
/**
* Auto start off for safety.
* Pissible values are:
* 0 - none
* 1 - Soldering Temperature
* 2 - Sleep Temperature
* 3 - Sleep Off Temperature
*/
#define AUTO_START_MODE 0 // Default to none
/**
* OLED Orientation
*
*/
#define ORIENTATION_MODE 0 // 0: Right 1:Left 2:Automatic - Default right
#define REVERSE_BUTTON_TEMP_CHANGE 0 // 0:Default 1:Reverse - Reverse the plus and minus button assigment for temperatur change
/**
* Temp change settings
*/
#define TEMP_CHANGE_SHORT_STEP 1 // Default temp change short step +1
#define TEMP_CHANGE_LONG_STEP 10 // Default temp change long step +10
#define TEMP_CHANGE_SHORT_STEP_MAX 50 // Temp change short step MAX value
#define TEMP_CHANGE_LONG_STEP_MAX 100 // Temp change long step MAX value
/* Power pulse for keeping power banks awake*/
#define POWER_PULSE_INCREMENT 1
#define POWER_PULSE_MAX 50 // x10 max watts
#ifdef MODEL_TS100
#define POWER_PULSE_DEFAULT 0
#else
#define POWER_PULSE_DEFAULT 5
#endif
/**
* OLED Orientation Sensitivity on Automatic mode!
* Motion Sensitivity <0=Off 1=Least Sensitive 9=Most Sensitive>
*/
#define SENSITIVITY 7 // Default 7
/**
* Detailed soldering screen
* Detailed idle screen (off for first time users)
*/
#define DETAILED_SOLDERING 0 // 0: Disable 1: Enable - Default 0
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define CUT_OUT_SETTING 0 // default to no cut-off voltage (or 18W for TS80)
#define TEMPERATURE_INF 0 // default to 0
#define DESCRIPTION_SCROLL_SPEED 0 // 0: Slow 1: Fast - default to slow
#define POWER_LIMIT_ENABLE 0 // 0: Disable 1: Enable - Default disabled power limit
#define TIP_GAIN 210 // 21 uV/C * 10, uV per deg C constant of the tip, Tip uV * 10 / coeff = tip temp
#define OP_AMP_Rf_TS100 750 * 1000 // 750 Kilo-ohms -> From schematic, R1
#define OP_AMP_Rin_TS100 2370 // 2.37 Kilo-ohms -> From schematic, R2
#define OP_AMP_GAIN_STAGE_TS100 (1 + (OP_AMP_Rf_TS100 / OP_AMP_Rin_TS100))
#define OP_AMP_Rf_TS80 180 * 1000 // 180 Kilo-ohms -> From schematic, R6
#define OP_AMP_Rin_TS80 2000 // 2.0 Kilo-ohms -> From schematic, R3
#define OP_AMP_GAIN_STAGE_TS80 (1 + (OP_AMP_Rf_TS80 / OP_AMP_Rin_TS80))
#ifdef MODEL_TS100
#define VOLTAGE_DIV 467 // 467 - Default divider from schematic
#define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV
#define PID_POWER_LIMIT 70 // Sets the max pwm power limit
#define POWER_LIMIT 30 // 30 watts default limit
#define MAX_POWER_LIMIT 65 //
#define POWER_LIMIT_STEPS 5 //
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100
#endif
#ifdef MODEL_TS80
#define VOLTAGE_DIV 780 // Default divider from schematic
#define PID_POWER_LIMIT 24 // Sets the max pwm power limit
#define CALIBRATION_OFFSET 900 // the adc offset in uV
#define POWER_LIMIT 24 // 24 watts default power limit
#define MAX_POWER_LIMIT 30 //
#define POWER_LIMIT_STEPS 2
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80
#endif
#ifdef MODEL_Pinecil
#define VOLTAGE_DIV 467 // 467 - Default divider from schematic
#define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV
#define PID_POWER_LIMIT 70 // Sets the max pwm power limit
#define POWER_LIMIT 30 // 30 watts default limit
#define MAX_POWER_LIMIT 65 //
#define POWER_LIMIT_STEPS 5 //
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100
#endif

View File

@@ -77,7 +77,6 @@ void resetSettings() {
systemSettings.TempChangeShortStep = TEMP_CHANGE_SHORT_STEP; // systemSettings.TempChangeShortStep = TEMP_CHANGE_SHORT_STEP; //
systemSettings.TempChangeLongStep = TEMP_CHANGE_LONG_STEP; // systemSettings.TempChangeLongStep = TEMP_CHANGE_LONG_STEP; //
systemSettings.KeepAwakePulse = POWER_PULSE_DEFAULT; systemSettings.KeepAwakePulse = POWER_PULSE_DEFAULT;
systemSettings.TipGain = TIP_GAIN;
systemSettings.hallEffectSensitivity = 1; systemSettings.hallEffectSensitivity = 1;
saveSettings(); // Save defaults saveSettings(); // Save defaults
} }

View File

@@ -59,8 +59,8 @@ static bool settings_setResetSettings(void);
static void settings_displayResetSettings(void); static void settings_displayResetSettings(void);
static bool settings_setCalibrate(void); static bool settings_setCalibrate(void);
static void settings_displayCalibrate(void); static void settings_displayCalibrate(void);
static bool settings_setTipGain(void); //static bool settings_setTipGain(void);
static void settings_displayTipGain(void); //static void settings_displayTipGain(void);
static bool settings_setCalibrateVIN(void); static bool settings_setCalibrateVIN(void);
static void settings_displayCalibrateVIN(void); static void settings_displayCalibrateVIN(void);
static void settings_displayReverseButtonTempChangeEnabled(void); static void settings_displayReverseButtonTempChangeEnabled(void);
@@ -212,7 +212,7 @@ const menuitem advancedMenu[] = {
{ (const char *) SettingsDescriptions[11], settings_setCalibrate, settings_displayCalibrate }, /*Calibrate tip*/ { (const char *) SettingsDescriptions[11], settings_setCalibrate, settings_displayCalibrate }, /*Calibrate tip*/
{ (const char *) SettingsDescriptions[13], settings_setCalibrateVIN, settings_displayCalibrateVIN }, /*Voltage input cal*/ { (const char *) SettingsDescriptions[13], settings_setCalibrateVIN, settings_displayCalibrateVIN }, /*Voltage input cal*/
{ (const char *) SettingsDescriptions[24], settings_setPowerPulse, settings_displayPowerPulse }, /*Power Pulse adjustment */ { (const char *) SettingsDescriptions[24], settings_setPowerPulse, settings_displayPowerPulse }, /*Power Pulse adjustment */
{ (const char *) SettingsDescriptions[25], settings_setTipGain, settings_displayTipGain }, /*TipGain*/ //{ (const char *) SettingsDescriptions[25], settings_setTipGain, settings_displayTipGain }, /*TipGain*/
{ NULL, NULL, NULL } // end of menu marker. DO NOT REMOVE { NULL, NULL, NULL } // end of menu marker. DO NOT REMOVE
}; };
@@ -778,53 +778,53 @@ static bool settings_setCalibrateVIN(void) {
} }
return false; return false;
} }
//
static bool settings_setTipGain(void) { //static bool settings_setTipGain(void) {
OLED::setFont(0); // OLED::setFont(0);
OLED::clearScreen(); // OLED::clearScreen();
//
for (;;) { // for (;;) {
OLED::setCursor(0, 0); // OLED::setCursor(0, 0);
OLED::printNumber(systemSettings.TipGain / 10, 2); // OLED::printNumber(systemSettings.TipGain / 10, 2);
OLED::print(SymbolDot); // OLED::print(SymbolDot);
OLED::printNumber(systemSettings.TipGain % 10, 1); // OLED::printNumber(systemSettings.TipGain % 10, 1);
//
ButtonState buttons = getButtonState(); // ButtonState buttons = getButtonState();
switch (buttons) { // switch (buttons) {
case BUTTON_F_SHORT: // case BUTTON_F_SHORT:
systemSettings.TipGain -= 1; // systemSettings.TipGain -= 1;
break; // break;
//
case BUTTON_B_SHORT: // case BUTTON_B_SHORT:
systemSettings.TipGain += 1; // systemSettings.TipGain += 1;
break; // break;
//
case BUTTON_BOTH: // case BUTTON_BOTH:
case BUTTON_F_LONG: // case BUTTON_F_LONG:
case BUTTON_B_LONG: // case BUTTON_B_LONG:
saveSettings(); // saveSettings();
return false; // return false;
case BUTTON_NONE: // case BUTTON_NONE:
default: // default:
break; // break;
} // }
//
OLED::refresh(); // OLED::refresh();
osDelay(40); // osDelay(40);
//
// Cap to sensible values // // Cap to sensible values
if (systemSettings.TipGain < 150) { // if (systemSettings.TipGain < 150) {
systemSettings.TipGain = 150; // systemSettings.TipGain = 150;
} else if (systemSettings.TipGain > 300) { // } else if (systemSettings.TipGain > 300) {
systemSettings.TipGain = 300; // systemSettings.TipGain = 300;
} // }
} // }
return false; // return false;
} //}
//
static void settings_displayTipGain(void) { //static void settings_displayTipGain(void) {
printShortDescription(25, 5); // printShortDescription(25, 5);
} //}
static bool settings_setReverseButtonTempChangeEnabled(void) { static bool settings_setReverseButtonTempChangeEnabled(void) {
systemSettings.ReverseButtonTempChangeEnabled = !systemSettings.ReverseButtonTempChangeEnabled; systemSettings.ReverseButtonTempChangeEnabled = !systemSettings.ReverseButtonTempChangeEnabled;

View File

@@ -23,6 +23,9 @@ extern "C" {
#include <gui.hpp> #include <gui.hpp>
#include <history.hpp> #include <history.hpp>
#include <power.hpp> #include <power.hpp>
#ifdef POW_PD
#include "policy_engine.h"
#endif
// File local variables // File local variables
extern uint32_t currentTempTargetDegC; extern uint32_t currentTempTargetDegC;
extern TickType_t lastMovementTime; extern TickType_t lastMovementTime;
@@ -66,24 +69,24 @@ void gui_drawTipTemp(bool symbol) {
Temp = TipThermoModel::getTipInC(); Temp = TipThermoModel::getTipInC();
} }
OLED::printNumber(Temp, 3); // Draw the tip temp out finally OLED::printNumber(Temp, 3); // Draw the tip temp out
if (symbol) { if (symbol) {
if (OLED::getFont() == 0) { if (OLED::getFont() == 0) {
// Big font, can draw nice symbols // Big font, can draw nice symbols
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::drawSymbol(0); OLED::drawSymbol(0);
else else
#endif #endif
OLED::drawSymbol(1); OLED::drawSymbol(1);
} else { } else {
// Otherwise fall back to chars // Otherwise fall back to chars
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::print(SymbolDegF); OLED::print(SymbolDegF);
else else
#endif #endif
OLED::print(SymbolDegC); OLED::print(SymbolDegC);
} }
} }
} }
@@ -234,9 +237,9 @@ static void gui_solderingTempAdjust() {
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
if (systemSettings.SolderingTemp > 850) if (systemSettings.SolderingTemp > 850)
systemSettings.SolderingTemp = 850; systemSettings.SolderingTemp = 850;
if (systemSettings.SolderingTemp < 60) if (systemSettings.SolderingTemp < 60)
systemSettings.SolderingTemp = 60; systemSettings.SolderingTemp = 60;
} else } else
#endif #endif
{ {
@@ -263,7 +266,7 @@ static void gui_solderingTempAdjust() {
OLED::printNumber(systemSettings.SolderingTemp, 3); OLED::printNumber(systemSettings.SolderingTemp, 3);
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::drawSymbol(0); OLED::drawSymbol(0);
else else
#endif #endif
{ {
@@ -313,11 +316,7 @@ static int gui_SolderingSleepingMode(bool stayOff) {
#endif #endif
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
currentTempTargetDegC = currentTempTargetDegC = stayOff ? 0 : TipThermoModel::convertFtoC(min(systemSettings.SleepTemp, systemSettings.SolderingTemp));
stayOff
? 0
: TipThermoModel::convertFtoC(min(systemSettings.SleepTemp,
systemSettings.SolderingTemp));
} else } else
#endif #endif
{ {
@@ -327,7 +326,7 @@ static int gui_SolderingSleepingMode(bool stayOff) {
uint16_t tipTemp; uint16_t tipTemp;
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
tipTemp = TipThermoModel::getTipInF(); tipTemp = TipThermoModel::getTipInF();
else else
#endif #endif
{ {
@@ -344,7 +343,7 @@ static int gui_SolderingSleepingMode(bool stayOff) {
OLED::printNumber(tipTemp, 3); OLED::printNumber(tipTemp, 3);
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::print(SymbolDegF); OLED::print(SymbolDegF);
else else
#endif #endif
{ {
@@ -360,7 +359,7 @@ static int gui_SolderingSleepingMode(bool stayOff) {
OLED::printNumber(tipTemp, 3); OLED::printNumber(tipTemp, 3);
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::drawSymbol(0); OLED::drawSymbol(0);
else else
#endif #endif
{ {
@@ -474,7 +473,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
OLED::setCursor(0, 0); OLED::setCursor(0, 0);
OLED::clearScreen(); OLED::clearScreen();
OLED::setFont(0); OLED::setFont(0);
OLED::print (UnlockingKeysString); OLED::print(UnlockingKeysString);
OLED::refresh(); OLED::refresh();
waitForButtonPressOrTimeout(1000); waitForButtonPressOrTimeout(1000);
break; break;
@@ -494,7 +493,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
OLED::setCursor(0, 0); OLED::setCursor(0, 0);
OLED::clearScreen(); OLED::clearScreen();
OLED::setFont(0); OLED::setFont(0);
OLED::print (WarningKeysLockedString); OLED::print(WarningKeysLockedString);
OLED::refresh(); OLED::refresh();
waitForButtonPressOrTimeout(500); waitForButtonPressOrTimeout(500);
break; break;
@@ -535,7 +534,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
OLED::setCursor(0, 0); OLED::setCursor(0, 0);
OLED::clearScreen(); OLED::clearScreen();
OLED::setFont(0); OLED::setFont(0);
OLED::print (LockingKeysString); OLED::print(LockingKeysString);
OLED::refresh(); OLED::refresh();
waitForButtonPressOrTimeout(1000); waitForButtonPressOrTimeout(1000);
} }
@@ -608,8 +607,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
if (boostModeOn) { if (boostModeOn) {
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
currentTempTargetDegC = currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.BoostTemp);
TipThermoModel::convertFtoC(systemSettings.BoostTemp);
else else
#endif #endif
{ {
@@ -618,8 +616,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
} else { } else {
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
currentTempTargetDegC = currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.SolderingTemp);
TipThermoModel::convertFtoC(systemSettings.SolderingTemp);
else else
#endif #endif
{ {
@@ -703,6 +700,35 @@ void showDebugMenu(void) {
// Print PCB ID number // Print PCB ID number
OLED::printNumber(PCBVersion, 2); OLED::printNumber(PCBVersion, 2);
break; break;
case 11:
// Power negotiation status
if (getIsPoweredByDCIN()) {
OLED::printNumber(0, 1);
} else {
//We are not powered via DC, so want to display the appropriate state for PD or QC
bool poweredbyPD = false;
#ifdef POW_PD
if (usb_pd_detect()){
//We are PD capable
if (PolicyEngine::pdHasNegotiated()) {
//We are powered via PD
poweredbyPD=true;
}
}
#endif
if (poweredbyPD) {
OLED::printNumber(2, 1);
} else {
OLED::printNumber(1, 1);
}
}
break;
case 12:
//Max deg C limit
OLED::printNumber(TipThermoModel::getTipMaxInC(), 3);
break;
default: default:
break; break;
} }
@@ -713,7 +739,7 @@ void showDebugMenu(void) {
return; return;
else if (b == BUTTON_F_SHORT) { else if (b == BUTTON_F_SHORT) {
screen++; screen++;
screen = screen % 11; screen = screen % 13;
} }
GUIDelay(); GUIDelay();
} }
@@ -726,6 +752,7 @@ void startGUITask(void const *argument __unused) {
uint8_t tempWarningState = 0; uint8_t tempWarningState = 0;
bool buttonLockout = false; bool buttonLockout = false;
bool tempOnDisplay = false; bool tempOnDisplay = false;
bool tipDisconnectedDisplay = false;
{ {
// Generate the flipped screen into ram for later use // Generate the flipped screen into ram for later use
// flipped is generated by flipping each row // flipped is generated by flipping each row
@@ -822,19 +849,20 @@ void startGUITask(void const *argument __unused) {
// the tip temperature is below 50 degrees C *and* motion sleep // the tip temperature is below 50 degrees C *and* motion sleep
// detection is enabled *and* there has been no activity (movement or // detection is enabled *and* there has been no activity (movement or
// button presses) in a while. // button presses) in a while.
// This is zero cost really as state is only changed on display updates
OLED::setDisplayState(OLED::DisplayState::ON); OLED::setDisplayState(OLED::DisplayState::ON);
if ((tipTemp < 50) && systemSettings.sensitivity && (((xTaskGetTickCount() - lastMovementTime) > if ((tipTemp < 50) && systemSettings.sensitivity && (((xTaskGetTickCount() - lastMovementTime) >
MOVEMENT_INACTIVITY_TIME) && ((xTaskGetTickCount() - lastButtonTime) > BUTTON_INACTIVITY_TIME))) { MOVEMENT_INACTIVITY_TIME) && ((xTaskGetTickCount() - lastButtonTime) > BUTTON_INACTIVITY_TIME))) {
OLED::setDisplayState(OLED::DisplayState::OFF); OLED::setDisplayState(OLED::DisplayState::OFF);
} }
uint16_t tipDisconnectedThres = TipThermoModel::getTipMaxInC() - 5;
// Clear the lcd buffer // Clear the lcd buffer
OLED::clearScreen(); OLED::clearScreen();
OLED::setCursor(0, 0); OLED::setCursor(0, 0);
if (systemSettings.detailedIDLE) { if (systemSettings.detailedIDLE) {
OLED::setFont(1); OLED::setFont(1);
if (tipTemp > 470) { if (tipTemp > tipDisconnectedThres) {
OLED::print(TipDisconnectedString); OLED::print(TipDisconnectedString);
} else { } else {
OLED::print(IdleTipString); OLED::print(IdleTipString);
@@ -863,11 +891,16 @@ void startGUITask(void const *argument __unused) {
OLED::setCursor(84, 0); OLED::setCursor(84, 0);
gui_drawBatteryIcon(); gui_drawBatteryIcon();
} }
tipDisconnectedDisplay = false;
if (tipTemp > 55) if (tipTemp > 55)
tempOnDisplay = true; tempOnDisplay = true;
else if (tipTemp < 45) else if (tipTemp < 45)
tempOnDisplay = false; tempOnDisplay = false;
if (tempOnDisplay) { if (tipTemp > tipDisconnectedThres) {
tempOnDisplay = false;
tipDisconnectedDisplay = true;
}
if (tempOnDisplay || tipDisconnectedDisplay) {
// draw temp over the start soldering button // draw temp over the start soldering button
// Location changes on screen rotation // Location changes on screen rotation
#ifdef OLED_FLIP #ifdef OLED_FLIP
@@ -883,11 +916,15 @@ void startGUITask(void const *argument __unused) {
OLED::fillArea(0, 0, 41, 16, 0); // clear the area OLED::fillArea(0, 0, 41, 16, 0); // clear the area
OLED::setCursor(0, 0); OLED::setCursor(0, 0);
} }
// draw in the temp //If we have a tip connected draw the temp, if not we leave it blank
if (!(systemSettings.coolingTempBlink && (xTaskGetTickCount() % 25 < 16))) if (!tipDisconnectedDisplay) {
gui_drawTipTemp(false); // draw in the temp // draw in the temp
if (!(systemSettings.coolingTempBlink && (xTaskGetTickCount() % 250 < 160)))
gui_drawTipTemp(false); // draw in the temp
}
} }
} }
OLED::refresh(); OLED::refresh();
GUIDelay(); GUIDelay();
} }

View File

@@ -91,7 +91,6 @@
#define TEMPERATURE_INF 0 // default to 0 #define TEMPERATURE_INF 0 // default to 0
#define DESCRIPTION_SCROLL_SPEED 0 // 0: Slow 1: Fast - default to slow #define DESCRIPTION_SCROLL_SPEED 0 // 0: Slow 1: Fast - default to slow
#define TIP_GAIN 210 // 21 uV/C * 10, uV per deg C constant of the tip, Tip uV * 10 / coeff = tip temp
#define OP_AMP_Rf_TS100 750 * 1000 // 750 Kilo-ohms -> From schematic, R1 #define OP_AMP_Rf_TS100 750 * 1000 // 750 Kilo-ohms -> From schematic, R1
#define OP_AMP_Rin_TS100 2370 // 2.37 Kilo-ohms -> From schematic, R2 #define OP_AMP_Rin_TS100 2370 // 2.37 Kilo-ohms -> From schematic, R2
@@ -103,6 +102,7 @@
#define OP_AMP_GAIN_STAGE_TS80 (1 + (OP_AMP_Rf_TS80 / OP_AMP_Rin_TS80)) #define OP_AMP_GAIN_STAGE_TS80 (1 + (OP_AMP_Rf_TS80 / OP_AMP_Rin_TS80))
//Deriving the Voltage div: //Deriving the Voltage div:
// Vin_max = (3.3*(r1+r2))/(r2) // Vin_max = (3.3*(r1+r2))/(r2)
//vdiv = (32768*4)/(vin_max*10) //vdiv = (32768*4)/(vin_max*10)
@@ -115,6 +115,7 @@
#define MAX_POWER_LIMIT 65 // #define MAX_POWER_LIMIT 65 //
#define POWER_LIMIT_STEPS 5 // #define POWER_LIMIT_STEPS 5 //
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100 #define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100
#define TEMP_uV_LOOKUP_HAKKO
#endif #endif
#ifdef MODEL_Pinecil #ifdef MODEL_Pinecil
@@ -125,6 +126,7 @@
#define MAX_POWER_LIMIT 65 // #define MAX_POWER_LIMIT 65 //
#define POWER_LIMIT_STEPS 5 // #define POWER_LIMIT_STEPS 5 //
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100 #define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100
#define TEMP_uV_LOOKUP_HAKKO
#endif #endif
#ifdef MODEL_TS80 #ifdef MODEL_TS80
@@ -135,20 +137,22 @@
#define MAX_POWER_LIMIT 30 // #define MAX_POWER_LIMIT 30 //
#define POWER_LIMIT_STEPS 2 #define POWER_LIMIT_STEPS 2
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80 #define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80
#define TEMP_uV_LOOKUP_TS80
#endif #endif
#ifdef MODEL_TS80P #ifdef MODEL_TS80P
#define VOLTAGE_DIV 650 // Default for TS80P with slightly different resistors #define VOLTAGE_DIV 650 // Default for TS80P with slightly different resistors
#define PID_POWER_LIMIT 35 // Sets the max pwm power limit #define PID_POWER_LIMIT 35 // Sets the max pwm power limit
#define CALIBRATION_OFFSET 900 // the adc offset in uV #define CALIBRATION_OFFSET 1500 // the adc offset in uV
#define POWER_LIMIT 30 // 30 watts default power limit #define POWER_LIMIT 30 // 30 watts default power limit
#define MAX_POWER_LIMIT 35 // #define MAX_POWER_LIMIT 35 //
#define POWER_LIMIT_STEPS 2 #define POWER_LIMIT_STEPS 2
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80 #define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80
#define TEMP_uV_LOOKUP_TS80
#endif #endif
#ifdef MODEL_TS100 #ifdef MODEL_TS100
const int32_t tipMass = 45; // X10 watts to raise 1 deg C in 1 second const int32_t tipMass = 65; // X10 watts to raise 1 deg C in 1 second
const uint8_t tipResistance = 75; //x10 ohms, 7.5 typical for ts100 tips const uint8_t tipResistance = 75; //x10 ohms, 7.5 typical for ts100 tips
#endif #endif