1
0
forked from me/IronOS

TS80 Support Stage 1 (#365)

* Estimated pinout into the ioc file

* Fix Atollic paths to be somewhat more portable

* Add make command

* Add rough calls to ADC2 [untested]

* Using dual ADC injected modes

* Start both ADCs

* Move some IRQ's to ram exec

* Stabilize PID a bit more

* Add in ideas for tip type selection

* Update peripheral setup to support TS80

* Add tiptype formula / settings struct

* Add function ids to the settings menu

* Rough tip selection

* Rough out new cal routine for simple tips

* Hardware test is fairly close for first pass

* Add Simple calibration case [UNTESTED]

This adds the calibration option that uses boiling water to the calibration menu.

This is untested, and may need gain adjustments before use.

* [Feat] Add some QC testing code

* Typo fix

* Add double button press handler for different rising times

* Add hook for jump to sleep mode

* QC for 9V Works!

* Rough out QC handler, trim out old menu help text thats useless

* QC 9V working... Static all the things (Low on ROM)!

* Static all I2C to save space

* Move QC negotiation into background task so it doesnt block the UI

* Input V display works, tune ADC

* QC 3 steps working

* Start tip R measurements

* Impliment tip resistance

* Fix up the accel position, link in auto QC stages

* Fix tip title

* Tip type settings, Static OLED

* Revert I2C callbacks

* Misc Cleanup

* Better Gain value, need to investiate offset

* Add model warning

* Add TS80 Boot Logo (#367)

* Add TS80 Boot Logo

* Refined

* Moved down by 1px

* Add in power selection 18/24W

* Clean up accelerometer, fix TS100 builds, Fix voltage div cal
This commit is contained in:
Ben V. Brown
2018-10-11 14:44:56 +11:00
committed by GitHub
parent a609d702f5
commit 7d0af3fc4c
34 changed files with 5857 additions and 4735 deletions

View File

@@ -0,0 +1,258 @@
:020000040800F2
:10F8000055AA0DF07FFFD5AB7DEA7F7E7F7FFF7F1E
:10F81000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFF78
:10F820007F7FBFBFDFBFEFDF0FEFEF0FAFAFAFAF38
:10F83000EFEFAFAFAFAFAFAF0FEF6FEFAFAFAFAFB8
:10F84000AFAF2FAFAFAFAFAFAFAF6FAF6FEFAFAF88
:10F85000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFB8
:10F86000EF6FFF1FFDFFFAFDF7FAF7F7F7F7FAF76B
:10F87000FAFAFAFAFAFAFAFAFAFAFAFAFAFAF0FAF2
:10F88000F7F7EFEFDFEFBFDF80BFBF80AAAAAAAA1A
:10F89000BFBFAAAAAAAAAAAA80BFB0BFADAFAAAA90
:10F8A000ADAFA2AAADAAAAAFADAAB0AFB0BFAFAF7D
:10F8B000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF58
:10F8C000BFB0FFC00000000000000000000000000A
:10F8D0000000000000000000000000000000000028
:10F8E0000000000000000000000000000000000018
:10F8F0000000000000000000000000000000000008
:10F9000000000000000000000000000000000000F7
:10F9100000000000000000000000000000000000E7
:10F9200000000000000000000000000000000000D7
:10F9300000000000000000000000000000000000C7
:10F9400000000000000000000000000000000000B7
:10F9500000000000000000000000000000000000A7
:10F960000000000000000000000000000000000097
:10F970000000000000000000000000000000000087
:10F980000000000000000000000000000000000077
:10F990000000000000000000000000000000000067
:10F9A0000000000000000000000000000000000057
:10F9B0000000000000000000000000000000000047
:10F9C0000000000000000000000000000000000037
:10F9D0000000000000000000000000000000000027
:10F9E0000000000000000000000000000000000017
:10F9F0000000000000000000000000000000000007
:10FA000000000000000000000000000000000000F6
:10FA100000000000000000000000000000000000E6
:10FA200000000000000000000000000000000000D6
:10FA300000000000000000000000000000000000C6
:10FA400000000000000000000000000000000000B6
:10FA500000000000000000000000000000000000A6
:10FA60000000000000000000000000000000000096
:10FA70000000000000000000000000000000000086
:10FA80000000000000000000000000000000000076
:10FA90000000000000000000000000000000000066
:10FAA0000000000000000000000000000000000056
:10FAB0000000000000000000000000000000000046
:10FAC0000000000000000000000000000000000036
:10FAD0000000000000000000000000000000000026
:10FAE0000000000000000000000000000000000016
:10FAF0000000000000000000000000000000000006
:10FB000000000000000000000000000000000000F5
:10FB100000000000000000000000000000000000E5
:10FB200000000000000000000000000000000000D5
:10FB300000000000000000000000000000000000C5
:10FB400000000000000000000000000000000000B5
:10FB500000000000000000000000000000000000A5
:10FB60000000000000000000000000000000000095
:10FB70000000000000000000000000000000000085
:10FB80000000000000000000000000000000000075
:10FB90000000000000000000000000000000000065
:10FBA0000000000000000000000000000000000055
:10FBB0000000000000000000000000000000000045
:10FBC0000000000000000000000000000000000035
:10FBD0000000000000000000000000000000000025
:10FBE0000000000000000000000000000000000015
:10FBF0000000000000000000000000000000000005
:10F8000055AA0DF07FFFD5AB7DEA7F7E7F7FFF7F1E
:10F81000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFF78
:10F820007F7FBFBFDFBFEFDF0FEFEF0FAFAFAFAF38
:10F83000EFEFAFAFAFAFAFAF0FEF6FEFAFAFAFAFB8
:10F84000AFAF2FAFAFAFAFAFAFAF6FAF6FEFAFAF88
:10F85000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFB8
:10F86000EF6FFF1FFDFFFAFDF7FAF7F7F7F7FAF76B
:10F87000FAFAFAFAFAFAFAFAFAFAFAFAFAFAF0FAF2
:10F88000F7F7EFEFDFEFBFDF80BFBF80AAAAAAAA1A
:10F89000BFBFAAAAAAAAAAAA80BFB0BFADAFAAAA90
:10F8A000ADAFA2AAADAAAAAFADAAB0AFB0BFAFAF7D
:10F8B000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF58
:10F8C000BFB0FFC00000000000000000000000000A
:10F8D0000000000000000000000000000000000028
:10F8E0000000000000000000000000000000000018
:10F8F0000000000000000000000000000000000008
:10F9000000000000000000000000000000000000F7
:10F9100000000000000000000000000000000000E7
:10F9200000000000000000000000000000000000D7
:10F9300000000000000000000000000000000000C7
:10F9400000000000000000000000000000000000B7
:10F9500000000000000000000000000000000000A7
:10F960000000000000000000000000000000000097
:10F970000000000000000000000000000000000087
:10F980000000000000000000000000000000000077
:10F990000000000000000000000000000000000067
:10F9A0000000000000000000000000000000000057
:10F9B0000000000000000000000000000000000047
:10F9C0000000000000000000000000000000000037
:10F9D0000000000000000000000000000000000027
:10F9E0000000000000000000000000000000000017
:10F9F0000000000000000000000000000000000007
:10FA000000000000000000000000000000000000F6
:10FA100000000000000000000000000000000000E6
:10FA200000000000000000000000000000000000D6
:10FA300000000000000000000000000000000000C6
:10FA400000000000000000000000000000000000B6
:10FA500000000000000000000000000000000000A6
:10FA60000000000000000000000000000000000096
:10FA70000000000000000000000000000000000086
:10FA80000000000000000000000000000000000076
:10FA90000000000000000000000000000000000066
:10FAA0000000000000000000000000000000000056
:10FAB0000000000000000000000000000000000046
:10FAC0000000000000000000000000000000000036
:10FAD0000000000000000000000000000000000026
:10FAE0000000000000000000000000000000000016
:10FAF0000000000000000000000000000000000006
:10FB000000000000000000000000000000000000F5
:10FB100000000000000000000000000000000000E5
:10FB200000000000000000000000000000000000D5
:10FB300000000000000000000000000000000000C5
:10FB400000000000000000000000000000000000B5
:10FB500000000000000000000000000000000000A5
:10FB60000000000000000000000000000000000095
:10FB70000000000000000000000000000000000085
:10FB80000000000000000000000000000000000075
:10FB90000000000000000000000000000000000065
:10FBA0000000000000000000000000000000000055
:10FBB0000000000000000000000000000000000045
:10FBC0000000000000000000000000000000000035
:10FBD0000000000000000000000000000000000025
:10FBE0000000000000000000000000000000000015
:10FBF0000000000000000000000000000000000005
:10F8000055AA0DF07FFFD5AB7DEA7F7E7F7FFF7F1E
:10F81000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFF78
:10F820007F7FBFBFDFBFEFDF0FEFEF0FAFAFAFAF38
:10F83000EFEFAFAFAFAFAFAF0FEF6FEFAFAFAFAFB8
:10F84000AFAF2FAFAFAFAFAFAFAF6FAF6FEFAFAF88
:10F85000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFB8
:10F86000EF6FFF1FFDFFFAFDF7FAF7F7F7F7FAF76B
:10F87000FAFAFAFAFAFAFAFAFAFAFAFAFAFAF0FAF2
:10F88000F7F7EFEFDFEFBFDF80BFBF80AAAAAAAA1A
:10F89000BFBFAAAAAAAAAAAA80BFB0BFADAFAAAA90
:10F8A000ADAFA2AAADAAAAAFADAAB0AFB0BFAFAF7D
:10F8B000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF58
:10F8C000BFB0FFC00000000000000000000000000A
:10F8D0000000000000000000000000000000000028
:10F8E0000000000000000000000000000000000018
:10F8F0000000000000000000000000000000000008
:10F9000000000000000000000000000000000000F7
:10F9100000000000000000000000000000000000E7
:10F9200000000000000000000000000000000000D7
:10F9300000000000000000000000000000000000C7
:10F9400000000000000000000000000000000000B7
:10F9500000000000000000000000000000000000A7
:10F960000000000000000000000000000000000097
:10F970000000000000000000000000000000000087
:10F980000000000000000000000000000000000077
:10F990000000000000000000000000000000000067
:10F9A0000000000000000000000000000000000057
:10F9B0000000000000000000000000000000000047
:10F9C0000000000000000000000000000000000037
:10F9D0000000000000000000000000000000000027
:10F9E0000000000000000000000000000000000017
:10F9F0000000000000000000000000000000000007
:10FA000000000000000000000000000000000000F6
:10FA100000000000000000000000000000000000E6
:10FA200000000000000000000000000000000000D6
:10FA300000000000000000000000000000000000C6
:10FA400000000000000000000000000000000000B6
:10FA500000000000000000000000000000000000A6
:10FA60000000000000000000000000000000000096
:10FA70000000000000000000000000000000000086
:10FA80000000000000000000000000000000000076
:10FA90000000000000000000000000000000000066
:10FAA0000000000000000000000000000000000056
:10FAB0000000000000000000000000000000000046
:10FAC0000000000000000000000000000000000036
:10FAD0000000000000000000000000000000000026
:10FAE0000000000000000000000000000000000016
:10FAF0000000000000000000000000000000000006
:10FB000000000000000000000000000000000000F5
:10FB100000000000000000000000000000000000E5
:10FB200000000000000000000000000000000000D5
:10FB300000000000000000000000000000000000C5
:10FB400000000000000000000000000000000000B5
:10FB500000000000000000000000000000000000A5
:10FB60000000000000000000000000000000000095
:10FB70000000000000000000000000000000000085
:10FB80000000000000000000000000000000000075
:10FB90000000000000000000000000000000000065
:10FBA0000000000000000000000000000000000055
:10FBB0000000000000000000000000000000000045
:10FBC0000000000000000000000000000000000035
:10FBD0000000000000000000000000000000000025
:10FBE0000000000000000000000000000000000015
:10FBF0000000000000000000000000000000000005
:10F8000055AA0DF07FFFD5AB7DEA7F7E7F7FFF7F1E
:10F81000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFF78
:10F820007F7FBFBFDFBFEFDF0FEFEF0FAFAFAFAF38
:10F83000EFEFAFAFAFAFAFAF0FEF6FEFAFAFAFAFB8
:10F84000AFAF2FAFAFAFAFAFAFAF6FAF6FEFAFAF88
:10F85000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFB8
:10F86000EF6FFF1FFDFFFAFDF7FAF7F7F7F7FAF76B
:10F87000FAFAFAFAFAFAFAFAFAFAFAFAFAFAF0FAF2
:10F88000F7F7EFEFDFEFBFDF80BFBF80AAAAAAAA1A
:10F89000BFBFAAAAAAAAAAAA80BFB0BFADAFAAAA90
:10F8A000ADAFA2AAADAAAAAFADAAB0AFB0BFAFAF7D
:10F8B000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF58
:10F8C000BFB0FFC00000000000000000000000000A
:10F8D0000000000000000000000000000000000028
:10F8E0000000000000000000000000000000000018
:10F8F0000000000000000000000000000000000008
:10F9000000000000000000000000000000000000F7
:10F9100000000000000000000000000000000000E7
:10F9200000000000000000000000000000000000D7
:10F9300000000000000000000000000000000000C7
:10F9400000000000000000000000000000000000B7
:10F9500000000000000000000000000000000000A7
:10F960000000000000000000000000000000000097
:10F970000000000000000000000000000000000087
:10F980000000000000000000000000000000000077
:10F990000000000000000000000000000000000067
:10F9A0000000000000000000000000000000000057
:10F9B0000000000000000000000000000000000047
:10F9C0000000000000000000000000000000000037
:10F9D0000000000000000000000000000000000027
:10F9E0000000000000000000000000000000000017
:10F9F0000000000000000000000000000000000007
:10FA000000000000000000000000000000000000F6
:10FA100000000000000000000000000000000000E6
:10FA200000000000000000000000000000000000D6
:10FA300000000000000000000000000000000000C6
:10FA400000000000000000000000000000000000B6
:10FA500000000000000000000000000000000000A6
:10FA60000000000000000000000000000000000096
:10FA70000000000000000000000000000000000086
:10FA80000000000000000000000000000000000076
:10FA90000000000000000000000000000000000066
:10FAA0000000000000000000000000000000000056
:10FAB0000000000000000000000000000000000046
:10FAC0000000000000000000000000000000000036
:10FAD0000000000000000000000000000000000026
:10FAE0000000000000000000000000000000000016
:10FAF0000000000000000000000000000000000006
:10FB000000000000000000000000000000000000F5
:10FB100000000000000000000000000000000000E5
:10FB200000000000000000000000000000000000D5
:10FB300000000000000000000000000000000000C5
:10FB400000000000000000000000000000000000B5
:10FB500000000000000000000000000000000000A5
:10FB60000000000000000000000000000000000095
:10FB70000000000000000000000000000000000085
:10FB80000000000000000000000000000000000075
:10FB90000000000000000000000000000000000065
:10FBA0000000000000000000000000000000000055
:10FBB0000000000000000000000000000000000045
:10FBC0000000000000000000000000000000000035
:10FBD0000000000000000000000000000000000025
:10FBE0000000000000000000000000000000000015
:10FBF0000000000000000000000000000000000005
:00000001FF

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,515 @@
:020000040800F2
:2000000020310020E52E00088D2E00088F2E0008912E0008932E0008952E00080000000071
:20002000000000000000000000000000972E0008992E0008000000009B2E00089D2E000880
:20004000252F0008292F00082D2F0008312F0008352F0008392F00083D2F0008412F000850
:20006000452F0008492F00084D2F0008512F0008552F0008592F00085D2F0008612F000830
:20008000652F0008692F00086D2F0008712F00089F2E0008792F00087D2F0008812F0008E7
:2000A000852F0008892F00088D2F0008912F0008952F0008992F00089D2F0008A12F0008F0
:2000C000A52F0008A92F0008AD2F0008B12F0008B52F0008B92F0008BD2F0008C12F0008D0
:2000E000C52F0008C92F0008CD2F0008D12F0008D52F0008D92F0008DD2F0008E12F0008B0
:20010000E52F0008E92F0008ED2F0008F12F0008F52F0008F92F0008FD2F0008013000088E
:2001200005300008093000080D3000081130000870B500F08FFEDFF8144804F510553C350F
:200140000146284600F016FC4FF40051204600F0D1FE04F200464FF4B0720FF650213046A2
:2001600000F0F2FE0B222946304600F0EDFE0FF6CC4518222946204600F0E6FE1822294610
:2001800004F5007000F0E0FEDFF8C407C4F81604A0220FF6783104F5C06000F0D5FE5022F2
:2001A0000FF6084104F5006000F0CEFE40220FF64C4104F5206000F0C7FE42F20C20011940
:2001C0000022CA760A774A7602518A600A61CA6070BD70B50C46DFF87467B4F5805F03D1F8
:2001E00000F044F830460EE0B4F5205F04D100F03DF806F5007006E0B4F5804F07D100F0BC
:2002000035F806F58060BDE8704000F08DBEB4F51A4F2AD300F02AF806F5C06000F084FE98
:200220004FF40072314606F508503C3000F08CFE42F2272085196978B9B9DFF81817098856
:20024000825D32B9B4F52A4F00D271B100F0A2F90AE0012A09D111B1B4F51C4F02D2B4F5F1
:200260002C4F02D300F08BFA687070BD4FF400720146704710B50446080004D14FF4007260
:200280000FF228713DE0DFF8C416B0F5805F08BF4FF4007235D0B0F5205F04D14FF4007243
:2002A00001F500712DE0B0F5804F04D14FF4007201F5806125E0B0F5004F05D100F02DF811
:2002C000A0220FF648211CE0B0F5024F05D100F024F850220FF6D42113E06FF402421218EA
:2002E00041F2FF739A4205D200F017F840220FF60C3106E0B0F51A4F08D34FF4007201F589
:20030000C0612046BDE8104000F00EBE4FF400712046BDE8104000F053BE4FF4007120467B
:2003200000F04EBE2DE9F84F4FF02008DFF81C5642F227277C194FF4085908EB050000F20F
:200340000046002030733078E52818BF002800F0E580F07A202840F0E180307A482826D137
:20036000707A452804BFB07A582840F0D08000F0DDF800207855607820B102280DD00428AB
:2003800006D010E05220307244207072592009E0452030725220707204E04E2030724F201D
:2003A00070725420B072F07D401CF075B4E041285AD1707A442804BFB07A52285BD100F096
:2003C000B5F800207855607049F805004FF0020A95F80006302804BF95F8010678281ED151
:2003E0000AEB050090F80006A0F13001C9B20A2922BFA0F14101C9B2062922BFA0F16101D3
:20040000C9B206290BD259F805104FEA011B49F805B000F0DAF9584449F8050003E0607844
:2004200040F0040060700AF1010ABAF10A0FCFDB6078A0B959F80500DFF81C15884202D316
:2004400000F00FFD18B94E2030724F2004E001207855532030724520707254205BE045200E
:2004600030725220707256E0422820D1707A492804BFB07A4E284AD100F058F8785D28B926
:200480004E2030724F207072542004E052203072442070725920B072785D022804BF0020CC
:2004A0007855785D012837D10220785534E053280DD1707A452804BFB07A542827D1785D80
:2004C00060BB5520307253207072452023E0522805D1707A44281AD1B07A59280EE0552886
:2004E00005D1707A532812D1B07A452806E0452806D1707A52280AD1B07A522807D10DE075
:200500004E2801BF707A4F28B07A542806D04520307252207072B0720320607008F1200837
:20052000B8F5007FFFF609AFBDE8F18FB07EF17E00EB01200005000DDFF8181408804FF434
:200540007A7000F041BD70B542F20C25DFF8FC63AC19207F03281BD100F0F5FD0028FBD1B2
:2005600000F03FFD4FF4C87000F02EFD012000F038FD00F0F5FD002020776076A060A8510B
:20058000DFF8D00300210180E07E022808BFE17670BD00002DE9F04742F20424DFF8AC53BD
:2005A00066190020F060306900EB0509F068401942F2242A0AEB050742F2292879780E29D9
:2005C00056D8DFE801F0080C131B1F2C324146595F757B838A0090F800063A2874E000F006
:2005E000CBF80001B0770020306173E096F81E8000F0C2F84044B077B07F5DE000F0BCF87B
:2006000000010AE054F8058000F0B6F8404460516059F17F4118F177000260515AE000F084
:20062000ABF800010AF8050054E01AF8058000F0A3F840440AF8050060591AF8051008182E
:200640006051F07F081837E000F096F80001707740E096F81D8000F08FF840447077F07F41
:20066000717F0818F0777878401C7870B07F002876D17878801C72E000F07EF8000108F8EC
:20068000090027E018F809A000F076F8504408F809003069F17F421918F802205118F1772F
:2006A000401C3061B17F884214D27878401E56E000F060F808EB0010F0770BE000F05AF80A
:2006C0004044F077F07F002846D103E090F800060D2841D17878401C41E090F800060A289C
:2006E0003AD10020F870707F042805D17879B979090401EB00607060707F012837D068BBE8
:2007000060597168081860519349884201D202202EE0002001E03069801C30613069B17F3D
:2007200088421BD26159401800F03BFD31694A1960590818491CB37F994218F8021008BF97
:2007400041F47F4104D04244527801EB022189B200F016FD0428DED0042009E00020787044
:20076000F068401CF060B0F5007FFFF41CAF0020BDE8F08796F81F8090F8000625E0F8B5EA
:200780000024724D05F508564FF408577859F168081800F006FD601990F8001690F8010699
:2007A00001EB002189B27859F268101800F0E8FCF168891CF160042801D00420F2BDA41CEB
:2007C000B4F5007FE2D30020F2BD10B585B0044600A80FF2C411112200F0B6FBA4F16100E1
:2007E000C0B21A2838BF203C002000A9415CE4B2A14204D0401CC0B21028F6D3002005B09B
:2008000010BD2DE9F04142F21824504D6619534F327A2AB940023860480278600120307248
:20082000307A012831D1605978B905F5005839684046FFF71FFD40229821404600F0C6FC1B
:200840004FF4E070605140200CE040229821B868401900F5005000F0B9FC605940386051A8
:20086000B8684030B8604021012000F05AFD3021012000F0E0FC38684030386078684038C9
:2008800078603748816840398160786838B96051B860386033480321017000203072BDE815
:2008A000F0812DE9F04142F21C24284D6259403266192D4F33792BB94002386048027860E3
:2008C00001203071307901282FD1002027490AE05B1903F5005310F801C083F800C0401CEB
:2008E00063595B1C635163599342F1D3DFF88080B8F800003968411839607A68101A7860BE
:20090000C00507D100206051A1F5007105F50050FFF75FFC12488168B8F80020891A816030
:200920004FF44051022000F097FC786800281EBF0C480078042806D100206051012100F0A7
:2009400057FE00203071BDE8F0810000EC010020188DDD40102D002000400008D82C0020D3
:20096000C82C0020942C0020E42C0020342C0020962C00201C2221FA02F303F00F030A2B69
:20098000ACBF3733303300F8013B121F53B2002BF1D50021017070473031323334353637DF
:2009A000383941424344454600000000EB3C904D53444F53352E3000020108000200020052
:2009C00010F80C00010001000000000000000000000029A298E46C4E4F204E414D45202030
:2009E0002020464154313220202033C98ED1BCF07B8ED9B800208EC0FCBD007C384E247DAE
:200A0000248BC199E83C01721C83EB3A66A11C7C26663B07268A57FC750680CA028856025B
:200A200080C31073EB33C98A461098F7661603461C13561E03460E13D18B7611608946FCBA
:200A40008956FEB82000F7E68B5E0B03C348F7F30146FC114EFE61BF0000E8E600723926B9
:200A6000382D741760B10BBEA17DF3A66174324E740983C7203BFB72E6EBDCA0FB7DB47D1B
:200A80008BF0AC9840740C487413B40EBB0700CD10EBEFA0FD7DEBE6A0FC7DEBE1CD16CD4D
:200AA00019268B551A52B001BB0000E83B0072E85B8A5624BE0B7C8BFCC746F03D7DC746D3
:200AC000F4297D8CD9894EF2894EF6C606967DCBEA030000200FB6C8668B46F86603461C43
:200AE000668BD066C1EA10EB5E0FB6C84A4A8A460D32E4F7E20346FC1356FEEB4A52500655
:200B0000536A016A10918B4618969233D2F7F691F7F64287CAF7761A8AF28AE8C0CC020AEB
:200B2000CCB80102807E020E7504B4428BF48A5624CD136161720B40750142035E0B4975ED
:200B400006F8C341BB000060666A00EBB04E544C44522020202020200D0A52656D6F766544
:200B6000206469736B73206F72206F74686572206D656469612EFF0D0A4469736B2065720E
:200B8000726F72FF0D0A507265737320616E79206B657920746F20726573746172740D0ACF
:200BA00000000000000000ACCBD855AA4446552056335F34325F44080000000000000000EF
:200BC00000008A5A794500000000000042200049006E0066006F000F007272006D006100C4
:200BE000740069006F0000006E00000001530079007300740065000F00726D0020005600BE
:200C00006F006C00750000006D00650053595354454D7E3120202016005E63705D455D4533
:200C2000000064705D45020000000000412E005F002E00540072000F007F610073006800B0
:200C40006500730000000000FFFFFFFF7E3120202020202054524122004A8A5A794579459E
:200C600000008A5A7945050000100000E552415348457E3145464D1200478A5A7945794525
:200C800000008A5A7945040000000000412E0054007200610073000F002568006500730031
:200CA0000000FFFFFFFF0000FFFFFFFF5452415348457E312020201200478A5A79457945AD
:200CC00000008A5A7945040000000000412E0066007300650076000F00DA65006E0074001B
:200CE0007300640000000000FFFFFFFF46534556454E7E3120202012004D8A5A794579458C
:200D000000008A5A79450D00000000002E2020202020202020202010005E63705D455D4531
:200D2000000064705D450200000000002E2E20202020202020202010005E63705D455D453A
:200D4000000064705D4500000000000042470075006900640000000F00FFFFFFFFFFFFFF4A
:200D6000FFFFFFFFFFFF0000FFFFFFFF0149006E006400650078000F00FF65007200560049
:200D80006F006C00750000006D006500494E444558457E3120202020007263705D455D45BC
:200DA000000064705D4503004C0000007B00380031004200320031003700330033002D001B
:200DC00036003800440039002D0034003000350039002D0041003500370033002D004500AA
:200DE000410030004400320033003200450039003300320031007D00000000002E20202088
:200E0000202020202020203200478A5A7945794500008A5A79450400000000002E2E2020D7
:200E2000202020202020201000478A5A7945794500008A5A7945000000000000F8FFFFFF84
:200E4000FFFFFF6F0007800009A0000BC000FFFFFFFF0F00234801684268511880684018F9
:200E6000704710B5FFF7F6FF1F490C6800F006F8844201D1012010BD002010BD0A231B4A3C
:200E800001461B48FFE7F0B503F11506C3F14304C3F151050A330EE0C0EB40105F1003EB86
:200EA00097774FEAA70CA3EB8C07FF0021FA07F7FFB238185B1C1BB2B342EDDB0DE0C0EB65
:200EC0004010631004EB93739B10A4EB8301C90022FA01F1C9B20818641C24B2AC42EEDB1D
:200EE000F0BD0000E8F7FF1FFC3F0008011020D502DEC0DE002200F0BDBB10B450F8041BCC
:200F000081B102681218001D50F8043BDC0744BFA9F10104E31852F8044B43F8044B091F9C
:200F2000F9D1EBE710BC704762B38B0708D0521E11F8013B00F8013B00F024808B07F6D13D
:200F4000830740F0208000BF103A07D330B4B1E83810103AA0E83810F9D230BC530724BF81
:200F6000B1E80810A0E8081044BF51F8043B40F8043BD20724BF31F8022B20F8022B44BFC4
:200F80000B7803707047083A07D3B1E80810083A40F8043B40F804CBF7D25307E4E750F8E1
:200FA000041B61B150F8042BD30744BFA9F101039A18002342F8043B091FFAD1EFE7704740
:200FC000002200F071BB000000214FF6FF7302E04D4A1360491C40F2DC5242439142F7D328
:200FE00070474A494FF400620A614FF480520A61002808680AD120F4404040F440500860E4
:20100000086820F4402040F4403009E020F4804040F430400860086820F4802040F43020D7
:201020000860704780F308887047704738B500F06BFB102000F0E0FB354C207820B10220D6
:2010400000F0D4FB082502E000F0D0FB002531484168314A11434160016841F08071016064
:20106000012000F06AFB012000F06AFB392000F094FB0028FAD0207800B1022000F063FB01
:2010800000F068FBA842FBD10121142000F06AFB012140F20C6000F06EFB01214FF400001E
:2010A00000F072FB207820B10120BDE8324000F056BB31BD80B501464FF0006000F047FCF5
:2010C0004FF4A06000F012FC14208DF8000002208DF8010000208DF8020001208DF803001E
:2010E00000A800F008FC01BD0C484FF6FF71C1600B4A02600B4A42600B48C1600B49016095
:201100004FF08831416070470C10014004080140E8010020001002400A846800000801403B
:201120008888880884B4BB8B000C0140884883440948012101600021016041604FF4E05142
:20114000064A118005E0044801210160002141600321016000207047405C0040142D00209F
:201160000448C0610221017203490162034A426208680047A02C0020D800002030010020E0
:2011800038B504460D46104800F0A0FB05281CBF342000F07AFB29462046BDE8344000F043
:2011A0005BBB10B50446A0050CD1074800F08EFB05281CBF342000F068FB2046BDE81040B6
:2011C00000F02EBB10BD0000A086010010B5490001F1804101F5C041521C521009E010F8C9
:2011E000013B10F8014B43EA042321F8023B891C521EF4D110BD490001F1804101F5C0411B
:20120000521C521004E051F8043B20F8023B521EF9D170474FF6F8710840DFF89011086076
:20122000704710B5DFF8882152F8203048F68F142340194324E010B5DFF8742152F82030A9
:2012400048F6BF742340CC0648BF83F01003890648BF83F020030FE010B5DFF8542152F8E5
:2012600020304BF68F742340CC0448BF83F48053890448BF83F4005343F4004141F08001CE
:2012800042F8201010BDDFF8281151F820204BF68F731A4082F4405242F4004209E0DFF8A1
:2012A000101151F8202048F68F631A4042F40042FFE742F0800241F820207047DFF8F010E1
:2012C00051F8202052040AD551F8202048F68F731A4042F4404242F0800241F82020704791
:2012E000334951F8202052060AD551F8202048F68F731A4042F4004242F0C00241F82020AA
:20130000704738E0294A126892B202EBC000294A37E03BE02549096889B201EBC000254947
:201320003AE0224A126892B202EBC000224A2AE01E4A126892B202EBC000204A02EB4000DC
:201340003F2909D34A091F23194208BF521E1204910941F4004105E04A08C90748BF521C80
:2013600012049109016070471049096889B201EBC000124914E00D4A126892B202EBC000E3
:201380000F4A4908490042F8101070470749096889B201EBC0000A4951F8100080B270470C
:2013A00051F810008005800D70470000505C0040005C004008600040046000400C6000408B
:2013C000006000400106090C41EA10207047000080B5964890F82010022909D018D3042958
:2013E00002D00ED3052913D1002180F820100CE0C17B28290CD1816A406ABDE8044000F09B
:20140000FEBA0121002000F0F3F84FF440512BE101BD38B5854CE57B0220FFF7A5FF60849B
:201420000246D8218248FFF7E6FE94F8200010B1012803D00AE0BDE8314013E02A2D06D13D
:20144000A16A606ABDE8344000F003BB022000F0F9F82421052000F0CDFA00210220BDE8E4
:201460003440C5E010B5714C628C1AB170492046FFF76AFD6F4861684160A1688160608CA5
:201480001F2806D0022000F0DDF8002020601A218DE0E27B282A18BF2A2A0FD1607CA17C4D
:2014A000090441EA0060E17C40EA0120217D08436062A07DE17D41EA0020A06220685E494A
:2014C000884270D15D480068617B884204D3A07B401EC0B2102804D3022000F0B3F824217B
:2014E00065E0606AA16A002A49D0032A2BD0082A18BF0A2A53D0122A29D0152A4FD01A2A30
:201500002DD01B2A27D01D2A49D01E2A23D0232A2DD0252A2FD0282A35D02A2A37D02F2A54
:2015200039D0552A3BD05A2A1DD0882A18BF8A2A35D08F2A18BF9E2A31D0A82A1CBFAA2A8B
:20154000AF2A2CD02FE0BDE8104000F04BBABDE8104000F011BABDE8104000F04FBABDE87A
:20156000104000F037BABDE8104000F037BABDE8104000F010BABDE8104000F01BBABDE856
:20158000104000F0A5BABDE8104000F038BABDE8104000F05EBABDE8104000F083BABDE811
:2015A000104000F09ABA022000F04CF82021052000F020FA00210120BDE8104018E010B5DD
:2015C0000C4622469821FFF701FE21460120FFF7A8FE30210120FFF72EFE1448032180F8F3
:2015E000201014488168091B81600021017310BD10B50C460F4B1249196018730D22982157
:201600001846FFF7E3FD0D210120FFF78AFE0748052180F8201044B1042180F82010302199
:201620000120BDE81040FFF706BE10BD742C0020342C0020C82C002055534243002D00203F
:201640005553425380B518B1022807D00AD301BD10210120BDE80440FFF7EDBD1021012086
:20166000FFF7E9FD4FF480510220BDE80440FFF7F3BD000000B500BF130096469446103943
:2016800028BFA0E80C50FAD85FEA417C28BF0CC048BF40F8042BC90728BF20F8022B48BF83
:2016A00000F8012B00BD0000401810F0030308D0C91A1FD3DB0748BF00F8012D28BF20F830
:2016C000022D130030B414461546103928BF20E93C00FAD8490728BF20E90C0048BF40F85D
:2016E000042D890028BF20F8022D48BF00F8012D30BC7047C91818BF00F8012DCB0728BF9B
:2017000000F8012D704700002E48016841F00101016041682C4A1140416001682B4A114039
:201720000160016821F480210160416821F4FE0141604FF41F0181607047254908607047E2
:2017400025490860704723490A68920850EA8200086070471F48006800F00C0070471F49BF
:20176000086070471E4A0029116814BF084321EA0000106070471B4A0029116814BF0843CB
:2017800021EA000010607047174A0029116814BF084321EA00001060704700214209094B04
:2017A000012A08BF1A6803D0022A0CBF1A6A5A6A012300F01F0003FA00F0024218BF012146
:2017C00008467047001002400000FFF8FFFFF6FE000042420410024060004242D8004242AF
:2017E00014100240181002401C100240DFF8C4100A6802F0380206E0DFF8B8100A6822F059
:2018000010020A600A68104308607047FFE7DFF8A800DFF8A8100160DFF8A4100160704770
:2018200038B5054600F015F804280DD1DFF89440206840F002002060656000F006F8216848
:2018400041F6FD721140216032BD206840F0400020604FF4302039E070B504460D4600F04B
:2018600011F804280CD1174E306840F001003060258000F007F8316841F6FE7211403160E2
:2018800070BD08804FF4005020E00F490860704704200D490A68D20701D5012070470A68A4
:2018A000520701D5022070470968C90648BF03207047000000200240042002402301674567
:2018C000AB89EFCD102002400C20024010B5FFE70446FFF7DDFF03E02CB1FFF7D9FF641E61
:2018E0000128F9D004B9052010BD00001B4908431B490860704770B503781A460121C478B7
:20190000ECB1174B1B6803F4E063C3F5E0631B0A4478C3F10405AC4085780F2626FA03F33E
:201920002B4023431B010F4C1355007842110E4B00F01F0001FA00F043F8220070BD5011EE
:201940000A4A03F01F03994042F8201070BD084A1140084307490860704700000000FA0552
:201960000CED00E000E400E000E100E080E100E080FFFF1F08ED00E07449087CC00702D577
:201980007348052105E00FF2E410C97C252928BF2421FFF714BE6F48002181800221817117
:2019A0000021C1714172022181720021C1720C21FFF705BE6848002101800F218170FF213E
:2019C000C17000218180022181710021C1710821FFF7F5BD04216148FFF7F1BD0821604838
:2019E000FFF7EDBD5948C17C132928BF12215D48FFF7E5BD5B4A90701173704769E070B588
:201A000004460D46584E3078C0B92A462146282000F076F8C8B14D48007B000603D502205C
:201A2000307029460CE00220FFF70CFE00F00EF801210120BDE87040FFF7DABD022804D16F
:201A40002046BDE87040FEF7DCBE70BD24210520D0E710B5444C2278EAB90A4601462A207B
:201A600000F04EF8E8B13948007B000608D4012020704FF440510220BDE81040FFF7ECBB80
:201A80000020FFF7DFFDFFF7E1FF00210120BDE81040FFF7ADBD012A04BFBDE81040FEF70F
:201AA00000BF10BD80B52948816829B9007C400702D40121002006E00220FFF7C3FDFFF79A
:201AC000C5FF00210120FFE7BDE80440FFF790BD00BF01210020FFF78BBD80B51B4881682E
:201AE00009B9002004E0007B00064CBF00200220FFF7A8FD2021FFF7AAFF00210120E3E7CB
:201B000080B55118B1F5805F09D92A2804BF0220FFF798FD0020FFF795FD21210BE00B49D5
:201B20008968B1EB422F0ED02A280CBF02200020FFF788FD2421FFF78AFF00210120FFF7F3
:201B400057FD002002BD012002BD0000742C0020EC2C0020BC010020F42C0020E401002058
:201B6000D8010020A8010020942C002000800202200000005669727475616C204446552019
:201B80004469736B20202020202020202020202010B5DFF8884700B92BE000F096F8006825
:201BA000804720680A3010BD80B5DFF870070068C178DFF86C2752788A420CD38278002AA8
:201BC00004BF8288002A06D1817200F07EF840688047002002BD022002BD10B5DFF83C4790
:201BE00000B906E000F071F88068804720680C3010BD206801210182002010BD10B5DFF8F7
:201C00001C472068C1784079DFF8182712689269904721688A7A92B1002804BF0879002821
:201C20000DD1887858B900F050F8C068804720684179C1722068C1780173002010BD0220D5
:201C400010BD1CB5DFF8D416096810B90220088239E0DFF8D44600202080087800227F2331
:201C6000184215D1487A81064CBF42F0020102F0FD0121702178400654BF01F0FE0041F008
:201C80000100207000F021F800698047204616BD00F07F03012BF9D000F07F00022812D15E
:201CA000487900F00F0142F0010200F088FA05D500F030001028E5D12270E3E700F44050F4
:201CC000B0F5805FF7E7002016BDDFF8600600687047F8B5DFF844060068017811F07F0123
:201CE00004D1417A01F0DF0141724FE0022901BF41880029017900294AD1417921F08005B6
:201D0000DFF82C460A0654F825204CBF02F0300202F44052DFF808361B789D4238D2002A67
:201D20001CBF807A002833D0080654F825000BD500F03000102825D12846FFF7D1FA302176
:201D40002846FFF778FA1DE000F44050B0F5805F18D148F280064BF68F7745B900F0BDFA13
:201D60002068384080F44050304320600AE02846FFF7A4FA54F82500384080F44050304320
:201D800044F82500FFF7A1FF406980470020F2BD0220F2BD38B5DFF884050268537923F0A6
:201DA0008000DFF88C151C0651F820404CBF04F0300404F44054DFF868552D78A84206D2A6
:201DC000558825B9002C1CBF927A002A01D1022032BD48F280021B0651F8203005D548F69A
:201DE000BF74234083F0100304E04BF68F74234083F480531A4341F82020FFF766FF8069D8
:201E00008047002032BD80B5DFF810050068417A41F020014172FFF758FFC0698047002046
:201E200002BDDFF8F8241268538A20B98888C01A108200207047086818187047F8B5DFF892
:201E4000DC54286800F110042688A168080018BF002E14D0A088864288BF0646304688474D
:201E600007462088801B20806088301860800020FFF750FA324601463846FFF7BCF9DFF803
:201E8000B464208850B1DFF8B0044FF44051018000210020FFF745FA3020308028682188F2
:201EA000A288914228BF032101D211B105210172F1BD06210172DFF88404006880B2DFF8D4
:201EC0008014002241F8102030203080F1BD2DE9F843DFF84844206800F110063188DFF862
:201EE0005454002904BF007A042816D1DFF85404017801290DD1DFF84414096889B2DFF85F
:201F00004024002342F8113030212980042703702CE007271020288028E0B6F8048088450E
:201F200005D30427414588BF4146884600E002274046B168884781460020FFF7EAF94246BD
:201F400001464846FFF742F941460020FFF7E9F93088A0EB08003080708840447080302045
:201F60002880DFF8D4034FF44051018020680772BDE8F18338B5DFF8A44320684578017833
:201F80007F22114238D1092D02D1FFF70DFE47E0052D1BD1C17880294FD28178002901BF10
:201FA00081880029807A002847D10620DFF88C13096889B2DFF88823002342F81130DFF876
:201FC000741330220A802168087231BD032D08D1C178012904BF8088002823D1FFF713FF52
:201FE0001EE0012D04BFC17801291BD18188C9B9407A80060DD415E001F07F00012804D194
:020000040800F2
:202000000B2D0FD1FFF7FAFD0AE002280AD1012D02D1FFF75EFE03E0032D03D1FFF7BAFEE4
:202020000028C2D02846BF49096849698847032808BF0920C7D00028B7D00820C3E738B55E
:20204000B64D28684178B74C062913D101787F2211422AD18078012802D12068C16968E0C8
:20206000022802D12068016A63E003281DD12068416A5EE000293DD14188002904BFC1886E
:20208000022912D1017981B901787F22114204BF8288002A2CD001F07F02012A10D100F0B0
:2020A00089F810B92868807A10BB28684078216809698847032845D128680921017231BD13
:2020C00001F07F010229F0D1407900F00F0100F0700200F074F84CBF00F0300000F440507D
:2020E0008F4B1B789942E0D2002ADED10028DCD095491EE0082905D100787F210842D4D14F
:20210000924916E00A2902BF017801F07F010129CBD1817A0029C8D04188002901BF017962
:202120000029C1880129C0D100F044F80028BCD187490800B9D028680022428281610020B8
:202140008847002029680A8A4FF6FF739A4208BF092004D0022818BF002A02D10820087274
:2021600031BD087800061ED5C88800902368009C944202D2009808820FE082420DD293F808
:202180002C00704C824238BF002005D392FBF0F500FB152008B90120207093F82C008882CF
:2021A000BDE8314093E60320087263484FF44051018031BD002140792268926910475C4BA8
:2021C000000653F82100704738B55C48006880B2604931F81000400000F1804000F5C040E3
:2021E0004E4C21680A7A092A14D010F8012B0A70216810F8012B4A70851C35F8040BFFF729
:20220000E1F8216848802888FFF7DCF821688880A888C8802068012101722068C08810B95B
:20222000FFF7A8FE01E0FFF70AFFBDE831403EE010B53A4C2068017A022918BF042904D19C
:20224000FFF745FE2068007A14E0062911D14178052902BF01787F22114206D1C07800F02A
:2022600042F8FFF732FD006A80472E48006880688047082017E010B5284C2068007A0228BD
:2022800018BF04280ED0032818BF052804D1FFF7D5FD2068007A06E0072803D121480068D5
:2022A000C0688047082021680872BDE8104080B500F013F819480068017A082906D11E492C
:2022C0004FF480520A801B4910220A80007A092801D1012002BD002002BD1F4890F82C10D8
:2022E0000020FFF725B870B50D4909780022104B48F68F760BE0D4B253F824503540254322
:2023000045F4004545F0800543F82450521C8A42F1D340F080001149086070BDBC2C002031
:20232000E0010020C02C0020082D0020C42C0020005C00400E2D00200C2D0020505C0040EF
:2023400004600040172D0020431C0008911B0008DB1B000808600040D80000204C5C0040D4
:2023600070470000F8B58478303CE4B20A2C38BF2246C478303CE4B20A2C38BF234600781A
:202380003038C0B20A2838BF01460024534818250FF2A016271805FB014C1CF806C087F85B
:2023A00060C005FB024C1CF806C087F890C005FB034C1CF806C087F8A8C0641C182CE9DB6E
:2023C00000240C2201460C206043C0B200F004F8641C082CF5DBF1BD70B504460D461646E7
:2023E000002100F04BF8761C2946F0B200F035F805460121204600F041F82946F0B2BDE817
:2024000070402AE03749086037483C2202700968C9B2334800F09AB910B58CB000A80FF277
:20242000DC013022FEF790FD2E2200F03CF82F4C4FF48071204600F006FA0220FEF7C4FD9A
:202440004FF48071204600F0FCF90220FEF7BCFD2E20FFF7D7FF0CB010BD10B50C4620490A
:2024600040220A70012203E014F8013B5354521C8242F9DBFFF7C6FF204610BD30B583B07F
:2024800000AA0FF2A80330CB30C28DF80500012904BFB1208DF80100082200F004F80820ED
:2024A000FFF7B0FF37BD00A90D48FEF73DBD10B500212020FFF7E2FF094C00F019F88020A3
:2024C000FFF7A0FF01212020FFF7D8FF00F010F88020BDE8104095E700000000000000200F
:2024E00034260020FC2C0020162D002000080140402020707F21601CFEF762BD80AE80D5CB
:20250000805280A8800F80C880D38000804080A1808D801480DA8002808180E080D980F18E
:2025200080DB803080A480A680AF000080B080218020807F00E010080810E00000000000B7
:20254000000F102020100F0000000000001010F800000000000000000020203F2020000026
:2025600000000000007008080888700000000000003028242221300000000000003008882C
:2025800088483000000000000018202020110E00000000000000C02010F8000000000000BC
:2025A00000070424243F24000000000000F8088888080800000000000019212020110E00AC
:2025C0000000000000E010888818000000000000000F112020110E0000000000003808081C
:2025E000C8380800000000000000003F000000000000000000708808088870000000000094
:20260000001C222121221C000000000000E010080810E000000000000000312222110F0077
:20262000000000000000000000000000000000000030300000000000000000007047424AF7
:20264000012903D10146104600F0FBB819B90146104600F0F8B8704780B501210820FFF701
:202660008AF8C020ADF8000014208DF8030003208DF8020000A9344800F07EF800F00EF86C
:2026800000F055F800F056F800F057F8002100F04FF800F052F800F001F801BD00214020C6
:2026A000CDE780B5FFF7FAFF002100F041F800F044F800F03FF800F040F800F038F800F06D
:2026C0003CF8FFF7EBFF0520BDE80240B6E738B50446082508E000F02BF800F02EF800F0D8
:2026E00029F800F02AF864002846451EC0B230B1FFF7D4FF20064CBF01210021EBE7FFF71A
:20270000CDFF00F014F8FF2400F017F800F017F848B900F00FF800F010F8FFF7BFFF00F03C
:202720000CF8012032BD641EEED1002032BD0121802084E70121402081E705207EE78021F3
:20274000014800F077B80000000C014070B504460D461646FFF780FF7000C0B201E014F862
:20276000010BFFF7B4FF2846451EC0B20028F6D1BDE8704095E700002DE9F0410022CC78F4
:2027800004F00F03E40644BF8C7823430C8801250F26E7B217B3D0F800C005FA02F7BE4606
:2027A0000EEA0408F04514D14FEA820E06FA0EF82CEA080C03FA0EFE4EEA0C0C91F803E03D
:2027C000BEF1280F08BF476103D0BEF1480F08BF0761521C082AE0D3C0F800C0B4F5807F29
:2027E00026D3D0F804C0002202F1080705FA07F7BE460EEA0408F04515D14FEA820E06FA47
:202800000EF82CEA080C03FA0EFE4EEA0C0C91F803E0BEF1280F08BF476191F803E0BEF153
:20282000480F08BF0761521C082ADDD3C0F804C0BDE8F08100228068084218BF012210468C
:2028400070470161704741617047000080B500F0F8F88B48006800218172FEF769FC8948C0
:20286000002141604FF40441874A1180016087480021016001BD10B58548002181728048CE
:2028800000688449C97941720020FEF7C3FC4FF400710020FEF7C5FC20210020FEF7CBFC93
:2028A00018210020FEF72EFD7B4C00F042F858210020FEF726FD0020FEF7F1FC0020FEF7E6
:2028C000E2FC00210120FEF7ACFC98210120FEF718FD20210120FEF7AEFC00210120FEF71F
:2028E000BBFC00210220FEF79CFCD8210220FEF709FD94F82C100220FEF71AFD4FF4405171
:202900000220FEF7A9FC00210220FEF794FC00F010F80020FEF7B7FC0020FFF7E4FC5B48DA
:20292000012101605D485E4901605E480021017010BD94F82C100020FEF7FABC50480068CF
:20294000807A00B9704780B55048052101600120FEF7C6FC0220FEF7B1FC524800210170F1
:2029600001BD4E4800684E4988421CBF0220FEF769BE704745480421016070477047704732
:2029800080B53F4909680A7802F07F02212A08BFFE280BD14888002801BF88880028C888C0
:2029A000012803D10FF28900020001D1022002BD88610020488200F03BF8002002BD80B5D1
:2029C0002F4909680A7802F07F02212A08BFFF2815D14888002804BF888800280FD1C888D7
:2029E00068B90120FEF77CFC0220FEF767FC2B482B4901602B4800210170002002BD022060
:202A000002BD00290CBF0028022070472649FFF708BA2649FFF705BA19490968C978062974
:202A200001DB00207047224A02EBC101FFF7F9B928B91348006801210182002070471D489B
:202A400070471D4801684268806801B9704710B51A4B99700C0A1C710C0C9C71090E197251
:202A60009A72110A1973110C9973110E19749874010A1975010C9975000E187610BD0000A5
:202A8000BC2C0020405C0040142D0020042D0020A02C0020E42C0008D8000020742C0020E4
:202AA00055534243942C0020C8010020D001002008010020002D0020E8F7FF1F5401002047
:202AC0002DE9F84F0020ADF8000040F68F7848F60F7B48F28006444F444CDFF81491DFF899
:202AE00014A14BF6BF7525E054F82010ADF80010BDF8001009040BD554F8201008EA010154
:202B000044F820103C4901EB800050F8040C8047BDF8000000060DD599F8000054F820108F
:202B20000BEA010144F82010344901EB800050F8040C8047606CAAF80000000452D5BAF8DF
:202B4000000010F00F0089F80000CDD120683880388800F030007880388800F44050388033
:202B60002068284080F4005080F0200030432060BAF80000C006206805D40BEA00002060D0
:202B8000FFF756FB16E0ADF80000BDF80000000506D5206808EA00002060FFF715FB09E0D5
:202BA000BDF800000004C5D5206808EA00002060FFF761FB206828403988C90448BF80F47D
:202BC00080503988890448BF80F400507988C90648BF80F010007988890648BF80F020008E
:202BE00030432060BDE8F18F0C2D0020005C0040182D0020122D00208C01002070010020C6
:202C00002E48016841F00101016041682C4A1140416001682B4A11400160016821F4802181
:202C20000160416821F4FE0141604FF41F0181600021026842F4803202600268491C920358
:202C400002D4B1F5A06FF8D10168890330D51E490A6842F010020A600A68920892000A6097
:202C60000A6842F002020A604168416041684160416841F480614160416821F47C11416062
:202C8000416841F4E8114160016841F08071016001688901FCD541688908890041604168FF
:202CA00041F002014160416801F00C010829FAD106484FF000610160704700000010024044
:202CC0000000FFF8FFFFF6FE0020024008ED00E0120100020000004083042057000201027C
:202CE0000301000009022000010100C0320904000002080650040705810240000007050263
:202D000002400000040309042603530054004D006900630072006F0065006C0065006300FA
:202D2000740072006F006E0069006300730000002603530054004D003300320020004D00A2
:202D40006100730073002000530074006F007200610067006500000010035300540020005D
:202D60004D00610073007300FEF760F9FEF7BCF91A48006880070ED5FEF773F8184801686A
:202D8000184A1140B1F1005F04D144680068FEF749F9A047FEE70A20FEF716F90020FEF750
:202DA00020F9C820FEF710F90120FEF71AF90020FEF780F9FEF7D4F9FDF7BAF9FFF72CFBD7
:202DC000FFF775FB0FF22000FFF7CCFAFEF71EFDFDF7A8FAFDF7B7FBF8E70000080C014030
:202DE000004000080000FF2F332E34350000000070B50D4C0D4D286820800D4E20883188CF
:202E00000840400505D50B48406880474FF6FF302860208831880840000444BFBDE8704088
:202E2000FFF74EBE70BD0000122D0020445C0040142D0020D8000020FEF7CABAFEF7E9BABA
:202E400010B5074979441831064C7C44163404E0081D0A68511888470146A142F8D110BD88
:202E6000080000002800000037E1FFFF302B0000EC0100200000000083E0FFFFEC01000056
:202E80009401000000000020000000007047FEE7FEE7FEE7FEE77047704770477047FFF760
:202EA000A7BF000000F009F8002801D0FFF7C8FF0020FFF759FF00F002F80120704700F0E5
:202EC00001B800000746384600F002F8FBE70000C046C046024A11001820ABBEFBE700BFF7
:202EE000260002000148804701480047012C0008F52E0008C046C046C046C046FFF7D2FFCB
:202F0000FFF7C4BFFFF7C3BFFFF7C2BFFFF7C1BFFFF7C0BFFFF7BFBFFFF7BEBFFFF7BDBF05
:202F2000FFF7BCBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF3B
:202F4000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD9
:202F6000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF793BFFFF7FEBFFFF7FEBF24
:202F8000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF99
:202FA000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF79
:202FC000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF59
:202FE000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF39
:20300000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF04FC040404040C0810E000001D
:20302000407F404040406020180F000004FC8484848484E40C100000407F40000000000394
:203040000000000004FC04000000000004FC0400001F204040404040201F000000000000AA
:20306000606000000000000000000000606000000000000000780404040404887800000044
:20308000006050484442414070000000000000000000000000000000006060000000000001
:2030A0000000000000E018080404040818E00000000F302040404020300F0000000000087E
:2030C00008FC00000000000000000040407F4040400000000000000000000000000000002D
:2030E0000000000000000000000000004D280008772800087D2900087F290008812900089C
:20310000BF290008032A00080D2A0008132A0008192A00080000000040000000042D000842
:2031200004000000082D000826000000302D000826000000540100201A000000582D000881
:2031400010000000612300083D2900086123000861230008612300086329000861230008A1
:2031600061230008752900081A03530054004D003300320031003000000000000000000046
:2031800000000000392E000861230008612300086123000861230008612300086123000878
:2031A000612300083D2E0008612300086123000861230008612300086123000870000000E4
:2031C0000000000A000000000000000000000000000000080000000002000000D02C0008D7
:2031E00012000000E42C000820000000000600000000000003010000030000000100000077
:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC
:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC
:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C
:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C
:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C
:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C
:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC
:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB
:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB
:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B
:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B
:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B
:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B
:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA
:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A
:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A
:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A
:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A
:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA
:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9
:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89
:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69
:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49
:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29
:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09
:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9
:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8
:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8
:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88
:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68
:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48
:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28
:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08
:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8
:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7
:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67
:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47
:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27
:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07
:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86
:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66
:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46
:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26
:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6
:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5
:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5
:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85
:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65
:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45
:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25
:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05
:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5
:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4
:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4
:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84
:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64
:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24
:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04
:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4
:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3
:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3
:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83
:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63
:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43
:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23
:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03
:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3
:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2
:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2
:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82
:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42
:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02
:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2
:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1
:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1
:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81
:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61
:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41
:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21
:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01
:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1
:00000001FF

View File

@@ -0,0 +1,348 @@
#MicroXplorer Configuration settings - do not modify
ADC1.Channel-31\#ChannelRegularConversion=ADC_CHANNEL_4
ADC1.Channel-32\#ChannelInjectedConversion=ADC_CHANNEL_2
ADC1.Channel-33\#ChannelInjectedConversion=ADC_CHANNEL_2
ADC1.Channel-34\#ChannelInjectedConversion=ADC_CHANNEL_2
ADC1.Channel-35\#ChannelInjectedConversion=ADC_CHANNEL_2
ADC1.ContinuousConvMode=DISABLE
ADC1.DataAlign=ADC_DATAALIGN_RIGHT
ADC1.DiscontinuousConvMode=DISABLE
ADC1.EnableAnalogWatchDog=false
ADC1.EnableRegularConversion=ENABLE
ADC1.ExternalTrigConv=ADC_SOFTWARE_START
ADC1.ExternalTrigInjecConv=ADC_INJECTED_SOFTWARE_START
ADC1.IPParameters=Rank-31\#ChannelRegularConversion,Channel-31\#ChannelRegularConversion,SamplingTime-31\#ChannelRegularConversion,NbrOfConversionFlag,master,Rank-32\#ChannelInjectedConversion,Channel-32\#ChannelInjectedConversion,SamplingTime-32\#ChannelInjectedConversion,InjectedOffset-32\#ChannelInjectedConversion,Rank-33\#ChannelInjectedConversion,Channel-33\#ChannelInjectedConversion,SamplingTime-33\#ChannelInjectedConversion,InjectedOffset-33\#ChannelInjectedConversion,Rank-34\#ChannelInjectedConversion,Channel-34\#ChannelInjectedConversion,SamplingTime-34\#ChannelInjectedConversion,InjectedOffset-34\#ChannelInjectedConversion,Rank-35\#ChannelInjectedConversion,Channel-35\#ChannelInjectedConversion,SamplingTime-35\#ChannelInjectedConversion,InjectedOffset-35\#ChannelInjectedConversion,InjNumberOfConversion,DataAlign,ScanConvMode,ContinuousConvMode,DiscontinuousConvMode,EnableRegularConversion,NbrOfConversion,ExternalTrigConv,ExternalTrigInjecConv,InjectedConvMode,EnableAnalogWatchDog
ADC1.InjNumberOfConversion=4
ADC1.InjectedConvMode=None
ADC1.InjectedOffset-32\#ChannelInjectedConversion=0
ADC1.InjectedOffset-33\#ChannelInjectedConversion=0
ADC1.InjectedOffset-34\#ChannelInjectedConversion=0
ADC1.InjectedOffset-35\#ChannelInjectedConversion=0
ADC1.NbrOfConversion=1
ADC1.NbrOfConversionFlag=1
ADC1.Rank-31\#ChannelRegularConversion=1
ADC1.Rank-32\#ChannelInjectedConversion=1
ADC1.Rank-33\#ChannelInjectedConversion=2
ADC1.Rank-34\#ChannelInjectedConversion=3
ADC1.Rank-35\#ChannelInjectedConversion=4
ADC1.SamplingTime-31\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5
ADC1.SamplingTime-32\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC1.SamplingTime-33\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC1.SamplingTime-34\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC1.SamplingTime-35\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC1.ScanConvMode=ADC_SCAN_ENABLE
ADC1.master=1
ADC2.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_3
ADC2.Channel-1\#ChannelInjectedConversion=ADC_CHANNEL_3
ADC2.Channel-2\#ChannelInjectedConversion=ADC_CHANNEL_3
ADC2.Channel-3\#ChannelInjectedConversion=ADC_CHANNEL_3
ADC2.Channel-4\#ChannelInjectedConversion=ADC_CHANNEL_3
ADC2.ContinuousConvMode=DISABLE
ADC2.DataAlign=ADC_DATAALIGN_RIGHT
ADC2.DiscontinuousConvMode=DISABLE
ADC2.EnableAnalogWatchDog=false
ADC2.EnableRegularConversion=ENABLE
ADC2.ExternalTrigConv=ADC_SOFTWARE_START
ADC2.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,Rank-1\#ChannelInjectedConversion,Channel-1\#ChannelInjectedConversion,SamplingTime-1\#ChannelInjectedConversion,InjectedOffset-1\#ChannelInjectedConversion,Rank-2\#ChannelInjectedConversion,Channel-2\#ChannelInjectedConversion,SamplingTime-2\#ChannelInjectedConversion,InjectedOffset-2\#ChannelInjectedConversion,Rank-3\#ChannelInjectedConversion,Channel-3\#ChannelInjectedConversion,SamplingTime-3\#ChannelInjectedConversion,InjectedOffset-3\#ChannelInjectedConversion,Rank-4\#ChannelInjectedConversion,Channel-4\#ChannelInjectedConversion,SamplingTime-4\#ChannelInjectedConversion,InjectedOffset-4\#ChannelInjectedConversion,InjNumberOfConversion,DataAlign,ScanConvMode,ContinuousConvMode,DiscontinuousConvMode,EnableRegularConversion,NbrOfConversion,ExternalTrigConv,EnableAnalogWatchDog
ADC2.InjNumberOfConversion=0
ADC2.InjectedOffset-1\#ChannelInjectedConversion=0
ADC2.InjectedOffset-2\#ChannelInjectedConversion=0
ADC2.InjectedOffset-3\#ChannelInjectedConversion=0
ADC2.InjectedOffset-4\#ChannelInjectedConversion=0
ADC2.NbrOfConversion=1
ADC2.NbrOfConversionFlag=1
ADC2.Rank-0\#ChannelRegularConversion=1
ADC2.Rank-1\#ChannelInjectedConversion=1
ADC2.Rank-2\#ChannelInjectedConversion=2
ADC2.Rank-3\#ChannelInjectedConversion=3
ADC2.Rank-4\#ChannelInjectedConversion=4
ADC2.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5
ADC2.SamplingTime-1\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC2.SamplingTime-2\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC2.SamplingTime-3\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC2.SamplingTime-4\#ChannelInjectedConversion=ADC_SAMPLETIME_1CYCLE_5
ADC2.ScanConvMode=ADC_SCAN_DISABLE
Dma.I2C1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.I2C1_RX.0.Instance=DMA1_Channel7
Dma.I2C1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C1_RX.0.MemInc=DMA_MINC_ENABLE
Dma.I2C1_RX.0.Mode=DMA_NORMAL
Dma.I2C1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C1_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.I2C1_RX.0.Priority=DMA_PRIORITY_MEDIUM
Dma.I2C1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C1_TX.1.Direction=DMA_MEMORY_TO_PERIPH
Dma.I2C1_TX.1.Instance=DMA1_Channel6
Dma.I2C1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C1_TX.1.MemInc=DMA_MINC_ENABLE
Dma.I2C1_TX.1.Mode=DMA_NORMAL
Dma.I2C1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C1_TX.1.PeriphInc=DMA_PINC_DISABLE
Dma.I2C1_TX.1.Priority=DMA_PRIORITY_MEDIUM
Dma.I2C1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=I2C1_RX
Dma.Request1=I2C1_TX
Dma.RequestsNb=2
FREERTOS.FootprintOK=true
FREERTOS.INCLUDE_vTaskDelete=0
FREERTOS.IPParameters=Tasks01,configTICK_RATE_HZ,configMAX_PRIORITIES,configMINIMAL_STACK_SIZE,configTOTAL_HEAP_SIZE,INCLUDE_vTaskDelete,FootprintOK
FREERTOS.Tasks01=GUITask,0,512,StartGUITask,Default,NULL,Dynamic,NULL,NULL;PIDTask,0,256,StartPIDTask,Default,NULL,Dynamic,NULL,NULL;ROTTask,-2,256,StartRotationTask,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configMAX_PRIORITIES=4
FREERTOS.configMINIMAL_STACK_SIZE=256
FREERTOS.configTICK_RATE_HZ=100
FREERTOS.configTOTAL_HEAP_SIZE=10240
File.Version=6
I2C1.DutyCycle=I2C_DUTYCYCLE_2
I2C1.I2C_Mode=I2C_Fast
I2C1.IPParameters=I2C_Mode,DutyCycle
IWDG.IPParameters=Prescaler
IWDG.Prescaler=IWDG_PRESCALER_256
KeepUserPlacement=false
Mcu.Family=STM32F1
Mcu.IP0=ADC1
Mcu.IP1=ADC2
Mcu.IP10=TIM3
Mcu.IP2=DMA
Mcu.IP3=FREERTOS
Mcu.IP4=I2C1
Mcu.IP5=IWDG
Mcu.IP6=NVIC
Mcu.IP7=RCC
Mcu.IP8=SYS
Mcu.IP9=TIM2
Mcu.IPNb=11
Mcu.Name=STM32F103T(8-B)Ux
Mcu.Package=VFQFPN36
Mcu.Pin0=PA0-WKUP
Mcu.Pin1=PA2
Mcu.Pin10=PA11
Mcu.Pin11=PA12
Mcu.Pin12=PA13
Mcu.Pin13=PA14
Mcu.Pin14=PA15
Mcu.Pin15=PB3
Mcu.Pin16=PB4
Mcu.Pin17=PB5
Mcu.Pin18=PB6
Mcu.Pin19=PB7
Mcu.Pin2=PA3
Mcu.Pin20=VP_FREERTOS_VS_ENABLE
Mcu.Pin21=VP_IWDG_VS_IWDG
Mcu.Pin22=VP_SYS_VS_ND
Mcu.Pin23=VP_SYS_VS_tim1
Mcu.Pin24=VP_TIM2_VS_ClockSourceINT
Mcu.Pin25=VP_TIM2_VS_no_output1
Mcu.Pin26=VP_TIM2_VS_no_output3
Mcu.Pin27=VP_TIM3_VS_ClockSourceINT
Mcu.Pin28=VP_TIM3_VS_no_output4
Mcu.Pin3=PA4
Mcu.Pin4=PA6
Mcu.Pin5=PB0
Mcu.Pin6=PB1
Mcu.Pin7=PA8
Mcu.Pin8=PA9
Mcu.Pin9=PA10
Mcu.PinsNb=29
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103T8Ux
MxCube.Version=4.26.0
MxDb.Version=DB.4.0.260
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.DMA1_Channel6_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.DMA1_Channel7_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.I2C1_ER_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.I2C1_EV_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:true
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:true
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true\:true
NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.TimeBase=TIM1_UP_IRQn
NVIC.TimeBaseIP=TIM1
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
PA0-WKUP.GPIOParameters=GPIO_Label
PA0-WKUP.GPIO_Label=RM
PA0-WKUP.Locked=true
PA0-WKUP.Signal=GPIO_Output
PA10.GPIOParameters=GPIO_Label
PA10.GPIO_Label=QC_DM_11K
PA10.Locked=true
PA10.Signal=GPIO_Output
PA11.GPIOParameters=GPIO_Label
PA11.GPIO_Label=USB_DM
PA11.Locked=true
PA11.Signal=GPIO_Analog
PA12.GPIOParameters=GPIO_Label
PA12.GPIO_Label=USB_DP
PA12.Locked=true
PA12.Signal=GPIO_Analog
PA13.GPIOParameters=GPIO_Label
PA13.GPIO_Label=QC_DP_SENSE
PA13.Locked=true
PA13.Signal=GPIO_Input
PA14.GPIOParameters=GPIO_Label
PA14.GPIO_Label=QC_DM_SENSE
PA14.Locked=true
PA14.Signal=GPIO_Input
PA15.GPIOParameters=GPIO_Label
PA15.GPIO_Label=OLED_RESET
PA15.Locked=true
PA15.Signal=GPIO_Output
PA2.GPIOParameters=GPIO_Label
PA2.GPIO_Label=ADC_VIN
PA2.Locked=true
PA2.Signal=ADCx_IN2
PA3.GPIOParameters=GPIO_Label
PA3.GPIO_Label=ADC_TIP
PA3.Locked=true
PA3.Signal=ADCx_IN3
PA4.GPIOParameters=GPIO_Label
PA4.GPIO_Label=ADC_TMP36
PA4.Locked=true
PA4.Signal=ADCx_IN4
PA6.GPIOParameters=GPIO_Label
PA6.GPIO_Label=PWM Out
PA6.Locked=true
PA6.Signal=S_TIM3_CH1
PA8.GPIOParameters=GPIO_Label
PA8.GPIO_Label=QC_DM_3K
PA8.Locked=true
PA8.Signal=GPIO_Output
PA9.GPIOParameters=GPIO_Label
PA9.GPIO_Label=MODEL_SEL
PA9.Locked=true
PA9.Signal=GPIO_Input
PB0.GPIOParameters=GPIO_Label
PB0.GPIO_Label=KEY_A
PB0.Locked=true
PB0.Signal=GPIO_Input
PB1.GPIOParameters=GPIO_Label
PB1.GPIO_Label=KEY_B
PB1.Locked=true
PB1.Signal=GPIO_Input
PB3.GPIOParameters=GPIO_Label
PB3.GPIO_Label=QC_DP_3K
PB3.Locked=true
PB3.Signal=GPIO_Output
PB4.GPIOParameters=GPIO_Label
PB4.GPIO_Label=IMU_INT2
PB4.Locked=true
PB4.Signal=GPXTI4
PB5.GPIOParameters=GPIO_Label
PB5.GPIO_Label=IMU_INT1
PB5.Locked=true
PB5.Signal=GPXTI5
PB6.GPIOParameters=GPIO_Label
PB6.GPIO_Label=SCL
PB6.Mode=I2C
PB6.Signal=I2C1_SCL
PB7.GPIOParameters=GPIO_Label
PB7.GPIO_Label=SDA
PB7.Mode=I2C
PB7.Signal=I2C1_SDA
PCC.Checker=false
PCC.Line=STM32F103
PCC.MCU=STM32F103T(8-B)Ux
PCC.PartNumber=STM32F103T8Ux
PCC.Seq0=0
PCC.Series=STM32F1
PCC.Temperature=25
PCC.Vdd=3.3
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerOptimize=3
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false
ProjectManager.CustomerFirmwarePackage=
ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32F103T8Ux
ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.1
ProjectManager.FreePins=true
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Src
ProjectManager.PreviousToolchain=SW4STM32
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=TS80.ioc
ProjectManager.ProjectName=TS80
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=SW4STM32
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-MX_I2C1_Init-I2C1-false-HAL-true,4-SystemClock_Config-RCC-false-HAL-true,5-MX_TIM3_Init-TIM3-false-HAL-true,6-MX_IWDG_Init-IWDG-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true,8-MX_ADC1_Init-ADC1-false-HAL-true,9-MX_ADC2_Init-ADC2-false-HAL-true
RCC.ADCFreqValue=8000000
RCC.ADCPresc=RCC_ADCPCLK2_DIV8
RCC.AHBFreq_Value=64000000
RCC.APB1CLKDivider=RCC_HCLK_DIV16
RCC.APB1Freq_Value=4000000
RCC.APB1TimFreq_Value=8000000
RCC.APB2Freq_Value=64000000
RCC.APB2TimFreq_Value=64000000
RCC.FCLKCortexFreq_Value=64000000
RCC.FamilyName=M
RCC.HCLKFreq_Value=64000000
RCC.IPParameters=ADCFreqValue,ADCPresc,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,USBPrescaler
RCC.MCOFreq_Value=64000000
RCC.PLLCLKFreq_Value=64000000
RCC.PLLMCOFreq_Value=32000000
RCC.PLLMUL=RCC_PLL_MUL16
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSI_DIV2
RCC.SYSCLKFreq_VALUE=64000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.TimSysFreq_Value=64000000
RCC.USBFreq_Value=42666666.666666664
RCC.USBPrescaler=RCC_USBCLKSOURCE_PLL_DIV1_5
SH.ADCx_IN2.0=ADC1_IN2,IN2
SH.ADCx_IN2.ConfNb=1
SH.ADCx_IN3.0=ADC1_IN3,IN3
SH.ADCx_IN3.1=ADC2_IN3,IN3
SH.ADCx_IN3.ConfNb=2
SH.ADCx_IN4.0=ADC1_IN4,IN4
SH.ADCx_IN4.ConfNb=1
SH.GPXTI4.0=GPIO_EXTI4
SH.GPXTI4.ConfNb=1
SH.GPXTI5.0=GPIO_EXTI5
SH.GPXTI5.ConfNb=1
SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1
SH.S_TIM3_CH1.ConfNb=1
TIM2.Channel-PWM\ Generation1\ No\ Output=TIM_CHANNEL_1
TIM2.Channel-PWM\ Generation3\ No\ Output=TIM_CHANNEL_3
TIM2.IPParameters=Channel-PWM Generation1 No Output,Channel-PWM Generation3 No Output
TIM3.Channel-Output\ Compare4\ No\ Output=TIM_CHANNEL_4
TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM3.ClockDivision=TIM_CLOCKDIVISION_DIV4
TIM3.IPParameters=Channel-PWM Generation1 CH1,OCFastMode_PWM-PWM Generation1 CH1,ClockDivision,Prescaler,Period,Channel-Output Compare4 No Output,OCMode_4,Pulse-Output Compare4 No Output
TIM3.OCFastMode_PWM-PWM\ Generation1\ CH1=TIM_OCFAST_ENABLE
TIM3.OCMode_4=TIM_OCMODE_ACTIVE
TIM3.Period=65535
TIM3.Prescaler=2000
TIM3.Pulse-Output\ Compare4\ No\ Output=65000
VP_FREERTOS_VS_ENABLE.Mode=Enabled
VP_FREERTOS_VS_ENABLE.Signal=FREERTOS_VS_ENABLE
VP_IWDG_VS_IWDG.Mode=IWDG_Activate
VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
VP_SYS_VS_ND.Mode=No_Debug
VP_SYS_VS_ND.Signal=SYS_VS_ND
VP_SYS_VS_tim1.Mode=TIM1
VP_SYS_VS_tim1.Signal=SYS_VS_tim1
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM2_VS_no_output1.Mode=PWM Generation1 No Output
VP_TIM2_VS_no_output1.Signal=TIM2_VS_no_output1
VP_TIM2_VS_no_output3.Mode=PWM Generation3 No Output
VP_TIM2_VS_no_output3.Signal=TIM2_VS_no_output3
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
VP_TIM3_VS_no_output4.Mode=Output Compare4 No Output
VP_TIM3_VS_no_output4.Signal=TIM3_VS_no_output4
board=TS100

0
Translation Editor/make_translation.py Executable file → Normal file
View File

View File

@@ -220,5 +220,13 @@
], ],
"desc": "Advanced calibration using thermocouple on the tip" "desc": "Advanced calibration using thermocouple on the tip"
} }
"PowerInput": {
"text": "PWRW",
"text2": [
"Power",
"Wattage"
],
"desc": "Power Wattage of the power adapter used"
},
} }
} }

View File

@@ -222,6 +222,11 @@ var def =
"id": "AdvancedCalibrationMode", "id": "AdvancedCalibrationMode",
"maxLen": 8, "maxLen": 8,
"maxLen2": 16 "maxLen2": 16
},
{
"id": "PowerInput",
"maxLen": 8,
"maxLen2": 16
} }
] ]
} }

View File

@@ -250,7 +250,18 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
*/ */
/* IO operation functions *****************************************************/ /* IO operation functions *****************************************************/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); inline void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
if(PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
}
}
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

View File

@@ -479,21 +479,8 @@ GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
* @arg GPIO_BIT_SET: to set the port pin * @arg GPIO_BIT_SET: to set the port pin
* @retval None * @retval None
*/ */
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) //void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if(PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
}
}
/** /**
* @brief Toggles the specified GPIO pin * @brief Toggles the specified GPIO pin

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,8 @@
OUTPUT_EXE=TS100_$(lang) ifndef model
model:=TS100
endif
OUTPUT_EXE=$(model)_$(lang)
ifndef lang ifndef lang
lang:= EN lang:= EN
endif endif
@@ -36,7 +39,7 @@ OPTIM=-Os -flto -finline-small-functions -findirect-inlining -fdiagnostics-color
# global defines --------------------------------------------------------------- # global defines ---------------------------------------------------------------
GLOBAL_DEFINES += -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D LANG_$(lang) -D LANG GLOBAL_DEFINES += -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D LANG_$(lang) -D LANG -D MODEL_$(model)
# Enable debug code generation # Enable debug code generation
DEBUG=-g DEBUG=-g

View File

@@ -13,27 +13,28 @@
class FRToSI2C { class FRToSI2C {
public: public:
FRToSI2C(I2C_HandleTypeDef *i2chandle) : i2c(i2chandle), static void init(I2C_HandleTypeDef *i2chandle) {i2c=i2chandle;
I2CSemaphore(nullptr) { I2CSemaphore=nullptr;}
}
void FRToSInit() { static void FRToSInit() {
I2CSemaphore = xSemaphoreCreateBinary(); I2CSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(I2CSemaphore); xSemaphoreGive(I2CSemaphore);
} }
void CpltCallback(); //Normal Tx Callback static void CpltCallback(); //Normal Tx Callback
void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, static void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize,
uint8_t *pData, uint16_t Size); uint8_t *pData, uint16_t Size);
void Mem_Write(uint16_t DevAddress, uint16_t MemAddress, static void Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t *pData, uint16_t Size); uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size); static void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
static void I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data);
static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg);
private: private:
I2C_HandleTypeDef *i2c; static I2C_HandleTypeDef *i2c;
SemaphoreHandle_t I2CSemaphore; static SemaphoreHandle_t I2CSemaphore;
}; };
#endif /* FRTOSI2C_HPP_ */ #endif /* FRTOSI2C_HPP_ */

View File

@@ -102,12 +102,12 @@
#define configMAX_PRIORITIES ( 4 ) #define configMAX_PRIORITIES ( 4 )
#define configMINIMAL_STACK_SIZE ((uint16_t)256) #define configMINIMAL_STACK_SIZE ((uint16_t)256)
#define configTOTAL_HEAP_SIZE ((size_t)10240) /*Currently use about 9000*/ #define configTOTAL_HEAP_SIZE ((size_t)10240) /*Currently use about 9000*/
#define configMAX_TASK_NAME_LEN ( 48 ) #define configMAX_TASK_NAME_LEN ( 24 )
#define configUSE_16_BIT_TICKS 0 #define configUSE_16_BIT_TICKS 0
#define configUSE_MUTEXES 1 #define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8 #define configQUEUE_REGISTRY_SIZE 8
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configCHECK_FOR_STACK_OVERFLOW 2 #define configCHECK_FOR_STACK_OVERFLOW 0 /*Bump this to 2 during development and bug hunting*/
/* Co-routine definitions. */ /* Co-routine definitions. */
@@ -117,10 +117,10 @@
/* Set the following definitions to 1 to include the API function, or zero /* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */ to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_uxTaskPriorityGet 0
#define INCLUDE_vTaskDelete 0 #define INCLUDE_vTaskDelete 0
#define INCLUDE_vTaskCleanUpResources 0 #define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskSuspend 0
#define INCLUDE_vTaskDelayUntil 0 #define INCLUDE_vTaskDelayUntil 0
#define INCLUDE_vTaskDelay 1 #define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_xTaskGetSchedulerState 1

View File

@@ -14,15 +14,29 @@
class LIS2DH12 { class LIS2DH12 {
public: public:
LIS2DH12(FRToSI2C* i2cHandle) : i2c(i2cHandle) {} static void initalize();
void initalize(); //1 = rh, 2,=lh, 8=flat
Orientation getOrientation() { return static_cast<Orientation>((I2C_RegisterRead(LIS_INT2_SRC) >> 2) - 1); } static Orientation getOrientation() {
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z); #ifdef MODEL_TS80
uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,
LIS_INT2_SRC) >> 2);
if (val == 8)
val = 3;
else if (val==1)
val=0;
else if(val==2)
val=1;
else
val=3;
return static_cast<Orientation>(val);
#endif
#ifdef MODEL_TS100
return static_cast<Orientation>((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1);
#endif
}
static void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
private: private:
void I2C_RegisterWrite(uint8_t reg, uint8_t data);
uint8_t I2C_RegisterRead(uint8_t reg);
FRToSI2C* i2c;
}; };
#endif /* LIS2DH12_HPP_ */ #endif /* LIS2DH12_HPP_ */

View File

@@ -16,17 +16,12 @@ class MMA8652FC {
public: public:
MMA8652FC(FRToSI2C* i2cHandle) : i2c(i2cHandle) {}
void initalize(); // Initalize the system static void initalize(); // Initalize the system
Orientation getOrientation();// Reads the I2C register and returns the orientation (true == left) static Orientation getOrientation();// Reads the I2C register and returns the orientation (true == left)
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z); static void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
private: private:
void I2C_RegisterWrite(uint8_t reg, uint8_t data);
uint8_t I2C_RegisterRead(uint8_t reg);
FRToSI2C* i2c;
}; };
#endif /* MMA8652FC_HPP_ */ #endif /* MMA8652FC_HPP_ */

View File

@@ -26,79 +26,83 @@ extern "C" {
#define OLED_WIDTH 96 #define OLED_WIDTH 96
#define FRAMEBUFFER_START 17 #define FRAMEBUFFER_START 17
class OLED { class OLED {
public: public:
OLED(FRToSI2C* i2cHandle); // Initialize Driver and store I2C pointer static void initialize(); // Startup the I2C coms (brings screen out of reset etc)
void initialize(); // Startup the I2C coms (brings screen out of reset etc)
// Draw the buffer out to the LCD using the DMA Channel // Draw the buffer out to the LCD using the DMA Channel
void refresh() { static void refresh() {
i2c->Transmit( DEVICEADDR_OLED, screenBuffer, FRAMEBUFFER_START + (OLED_WIDTH * 2)); FRToSI2C::Transmit( DEVICEADDR_OLED, screenBuffer,
FRAMEBUFFER_START + (OLED_WIDTH * 2));
//DMA tx time is ~ 20mS Ensure after calling this you delay for at least 25ms //DMA tx time is ~ 20mS Ensure after calling this you delay for at least 25ms
//or we need to goto double buffering //or we need to goto double buffering
} }
void drawChar(char c, char preCursorCommand = '\0'); // Draw a character to a specific location static void drawChar(char c, char preCursorCommand = '\0'); // Draw a character to a specific location
// Turn the screen on or not // Turn the screen on or not
void displayOnOff(bool on) { static void displayOnOff(bool on) {
displayOnOffState = on; displayOnOffState = on;
screenBuffer[1] = on ? 0xAF : 0xAE; screenBuffer[1] = on ? 0xAF : 0xAE;
} }
void setRotation(bool leftHanded); // Set the rotation for the screen static void setRotation(bool leftHanded); // Set the rotation for the screen
// Get the current rotation of the LCD // Get the current rotation of the LCD
bool getRotation() const { static bool getRotation() {
return inLeftHandedMode; return inLeftHandedMode;
} }
void print(const char* string); // Draw a string to the current location, with current font static int16_t getCursorX() {
return cursor_x;
}
static void print(const char* string);// Draw a string to the current location, with current font
// Set the cursor location by pixels // Set the cursor location by pixels
void setCursor(int16_t x, int16_t y) { static void setCursor(int16_t x, int16_t y) {
cursor_x = x; cursor_x = x;
cursor_y = y; cursor_y = y;
} }
//Set cursor location by chars in current font //Set cursor location by chars in current font
void setCharCursor(int16_t x, int16_t y) { static void setCharCursor(int16_t x, int16_t y) {
cursor_x = x * fontWidth; cursor_x = x * fontWidth;
cursor_y = y * fontHeight; cursor_y = y * fontHeight;
} }
void setFont(uint8_t fontNumber); // (Future) Set the font that is being used static void setFont(uint8_t fontNumber); // (Future) Set the font that is being used
void drawImage(const uint8_t* buffer, uint8_t x, uint8_t width) { static void drawImage(const uint8_t* buffer, uint8_t x, uint8_t width) {
drawArea(x, 0, width, 16, buffer); drawArea(x, 0, width, 16, buffer);
} }
// Draws an image to the buffer, at x offset from top to bottom (fixed height renders) // Draws an image to the buffer, at x offset from top to bottom (fixed height renders)
void printNumber(uint16_t number, uint8_t places); static void printNumber(uint16_t number, uint8_t places);
// Draws a number at the current cursor location // Draws a number at the current cursor location
// Clears the buffer // Clears the buffer
void clearScreen() { static void clearScreen() {
memset(&screenBuffer[FRAMEBUFFER_START], 0, OLED_WIDTH * 2); memset(&screenBuffer[FRAMEBUFFER_START], 0, OLED_WIDTH * 2);
} }
// Draws the battery level symbol // Draws the battery level symbol
void drawBattery(uint8_t state) { static void drawBattery(uint8_t state) {
drawSymbol(3 + (state > 10 ? 10 : state)); drawSymbol(3 + (state > 10 ? 10 : state));
} }
// Draws a checkbox // Draws a checkbox
void drawCheckbox(bool state) { static void drawCheckbox(bool state) {
drawSymbol((state) ? 16 : 17); drawSymbol((state) ? 16 : 17);
} }
void drawSymbol(uint8_t symbolID);//Used for drawing symbols of a predictable width static void drawSymbol(uint8_t symbolID);//Used for drawing symbols of a predictable width
void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height, const uint8_t* ptr); //Draw an area, but y must be aligned on 0/8 offset static void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
void fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height, const uint8_t value); //Fill an area, but y must be aligned on 0/8 offset const uint8_t* ptr); //Draw an area, but y must be aligned on 0/8 offset
void drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,bool clear); static void fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
void drawHeatSymbol(uint8_t state); const uint8_t value); //Fill an area, but y must be aligned on 0/8 offset
static void drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,
bool clear);
static void drawHeatSymbol(uint8_t state);
private: private:
//Draw a buffer to the screen buffer //Draw a buffer to the screen buffer
FRToSI2C* i2c; //i2c Pointer static const uint8_t* currentFont;// Pointer to the current font used for rendering to the buffer
const uint8_t* currentFont; // Pointer to the current font used for rendering to the buffer static uint8_t* firstStripPtr; // Pointers to the strips to allow for buffer having extra content
uint8_t* firstStripPtr; // Pointers to the strips to allow for buffer having extra content static uint8_t* secondStripPtr; //Pointers to the strips
uint8_t* secondStripPtr; //Pointers to the strips static bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM)
bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM) static bool displayOnOffState; // If the display is on or not
bool displayOnOffState; // If the display is on or not static uint8_t fontWidth, fontHeight;
uint8_t fontWidth, fontHeight; static int16_t cursor_x, cursor_y;
int16_t cursor_x, cursor_y; static uint8_t displayOffset;
uint8_t displayOffset; static uint8_t screenBuffer[16 + (OLED_WIDTH * 2) + 10]; // The data buffer
uint8_t screenBuffer[16 + (OLED_WIDTH * 2) + 10]; // The data buffer
}; };
#endif /* OLED_HPP_ */ #endif /* OLED_HPP_ */

View File

@@ -11,36 +11,45 @@
#define SETTINGS_H_ #define SETTINGS_H_
#include <stdint.h> #include <stdint.h>
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#define SETTINGSVERSION 0x15 /*Change this if you change the struct below to prevent people getting out of sync*/ #define SETTINGSVERSION \
0x16 /*Change this if you change the struct below to prevent people getting \
out of sync*/
/* /*
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks * This struct must be a multiple of 2 bytes as it is saved / restored from
* flash in uint16_t chunks
*/ */
typedef struct { typedef struct {
uint16_t SolderingTemp; // current set point for the iron uint16_t SolderingTemp; // current set point for the iron
uint16_t SleepTemp; // temp to drop to in sleep uint16_t SleepTemp; // temp to drop to in sleep
uint8_t SleepTime; // minutes timeout to sleep uint8_t SleepTime; // minutes timeout to sleep
uint8_t cutoutSetting; // The voltage we cut out at for under voltage uint8_t cutoutSetting; // The voltage we cut out at for under voltage OR Power level for TS80
uint8_t OrientationMode :2; // If true we want to invert the display for lefties uint8_t OrientationMode :2; // If true we want to invert the display for lefties
uint8_t sensitivity :4; // Sensitivity of accelerometer (5 bits) uint8_t sensitivity :4; // Sensitivity of accelerometer (5 bits)
uint8_t autoStartMode :2; //Should the unit automatically jump straight into soldering mode when power is applied uint8_t autoStartMode :2; // Should the unit automatically jump straight
// into soldering mode when power is applied
uint8_t ShutdownTime; // Time until unit shuts down if left alone uint8_t ShutdownTime; // Time until unit shuts down if left alone
uint8_t boostModeEnabled :1; //Boost mode swaps BUT_A in soldering mode to temporary soldering temp over-ride uint8_t boostModeEnabled :1; // Boost mode swaps BUT_A in soldering mode to
uint8_t coolingTempBlink :1; //Should the temperature blink on the cool down screen until its <50C // temporary soldering temp over-ride
uint8_t coolingTempBlink :1; // Should the temperature blink on the cool
// down screen until its <50C
uint8_t detailedIDLE :1; // Detailed idle screen uint8_t detailedIDLE :1; // Detailed idle screen
uint8_t detailedSoldering :1; // Detailed soldering screens uint8_t detailedSoldering :1; // Detailed soldering screens
uint8_t temperatureInF; // Should the temp be in F or C (true is F) uint8_t temperatureInF; // Should the temp be in F or C (true is F)
uint8_t descriptionScrollSpeed :1; // Description scroll speed uint8_t descriptionScrollSpeed :1; // Description scroll speed
uint16_t voltageDiv; // Voltage divisor factor uint16_t voltageDiv; // Voltage divisor factor
uint16_t BoostTemp; // Boost mode set point for the iron uint16_t BoostTemp; // Boost mode set point for the iron
int16_t CalibrationOffset; //This stores the temperature offset for this tip in the iron. int16_t CalibrationOffset; // This stores the temperature offset for this tip
// in the iron.
uint8_t PID_P; // PID P Term uint8_t PID_P; // PID P Term
uint8_t PID_I; // PID I Term uint8_t PID_I; // PID I Term
uint8_t PID_D; // PID D Term uint8_t PID_D; // PID D Term
uint8_t version; // Used to track if a reset is needed on firmware upgrade uint8_t version; // Used to track if a reset is needed on firmware upgrade
uint8_t customTipGain; // Tip gain value if custom tuned, or 0 if using a tipType param uint8_t customTipGain; // Tip gain value if custom tuned, or 0 if using a
// tipType param
uint8_t tipType; uint8_t tipType;
uint32_t padding; //This is here for in case we are not an even divisor so that nothing gets cut off uint32_t padding; // This is here for in case we are not an even divisor so
// that nothing gets cut off
} systemSettingsType; } systemSettingsType;
extern volatile systemSettingsType systemSettings; extern volatile systemSettingsType systemSettings;

View File

@@ -9,7 +9,8 @@
#define TRANSLATION_H_ #define TRANSLATION_H_
enum ShortNameType { enum ShortNameType {
SHORT_NAME_SINGLE_LINE = 1, SHORT_NAME_DOUBLE_LINE = 2, SHORT_NAME_SINGLE_LINE = 1,
SHORT_NAME_DOUBLE_LINE = 2,
}; };
/* /*
@@ -17,10 +18,9 @@ enum ShortNameType {
* use SettingsShortNames as SettingsShortNames[16][1].. second column undefined * use SettingsShortNames as SettingsShortNames[16][1].. second column undefined
*/ */
extern const enum ShortNameType SettingsShortNameType; extern const enum ShortNameType SettingsShortNameType;
extern const char* SettingsShortNames[][2]; extern const char* SettingsShortNames[21][2];
extern const char* SettingsDescriptions[]; extern const char* SettingsDescriptions[21];
extern const char* SettingsMenuEntries[4]; extern const char* SettingsMenuEntries[4];
extern const char* SettingsMenuEntriesDescriptions[4];
extern const char* SettingsCalibrationDone; extern const char* SettingsCalibrationDone;
extern const char* SettingsCalibrationWarning; extern const char* SettingsCalibrationWarning;

View File

@@ -7,18 +7,93 @@
#ifndef HARDWARE_H_ #ifndef HARDWARE_H_
#define HARDWARE_H_ #define HARDWARE_H_
#include "stm32f1xx_hal.h"
#include "Setup.h" #include "Setup.h"
#include "stm32f1xx_hal.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
enum Orientation { enum Orientation {
ORIENTATION_LEFT_HAND = 0, ORIENTATION_RIGHT_HAND = 1, ORIENTATION_FLAT = 3 ORIENTATION_LEFT_HAND = 0,
ORIENTATION_RIGHT_HAND = 1,
ORIENTATION_FLAT = 3
}; };
#ifndef MODEL_TS100
#ifndef MODEL_TS80
#error "Please Define the model you are building for! MODEL=TS100 or MODEL=TS80"
#endif
#endif
#ifdef MODEL_TS100
#define KEY_B_Pin GPIO_PIN_6
#define KEY_B_GPIO_Port GPIOA
#define TMP36_INPUT_Pin GPIO_PIN_7
#define TMP36_INPUT_GPIO_Port GPIOA
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_7
#define TIP_TEMP_Pin GPIO_PIN_0
#define TIP_TEMP_GPIO_Port GPIOB
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8
#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_8
#define VIN_Pin GPIO_PIN_1
#define VIN_GPIO_Port GPIOB
#define VIN_ADC1_CHANNEL ADC_CHANNEL_9
#define VIN_ADC2_CHANNEL ADC_CHANNEL_9
#define OLED_RESET_Pin GPIO_PIN_8
#define OLED_RESET_GPIO_Port GPIOA
#define KEY_A_Pin GPIO_PIN_9
#define KEY_A_GPIO_Port GPIOA
#define INT_Orientation_Pin GPIO_PIN_3
#define INT_Orientation_GPIO_Port GPIOB
#define PWM_Out_Pin GPIO_PIN_4
#define PWM_Out_GPIO_Port GPIOB
#define PWM_Out_CHANNEL TIM_CHANNEL_1
#define PWM_Out_CCR
#define INT_Movement_Pin GPIO_PIN_5
#define INT_Movement_GPIO_Port GPIOB
#define SCL_Pin GPIO_PIN_6
#define SCL_GPIO_Port GPIOB
#define SDA_Pin GPIO_PIN_7
#define SDA_GPIO_Port GPIOB
#else
// TS80 pin map
#define KEY_B_Pin GPIO_PIN_0
#define KEY_B_GPIO_Port GPIOB
#define TMP36_INPUT_Pin GPIO_PIN_4
#define TMP36_INPUT_GPIO_Port GPIOA
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4
#define TIP_TEMP_Pin GPIO_PIN_3
#define TIP_TEMP_GPIO_Port GPIOA
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3
#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_3
#define VIN_Pin GPIO_PIN_2
#define VIN_GPIO_Port GPIOA
#define VIN_ADC1_CHANNEL ADC_CHANNEL_2
#define VIN_ADC2_CHANNEL ADC_CHANNEL_2
#define OLED_RESET_Pin GPIO_PIN_15
#define OLED_RESET_GPIO_Port GPIOA
#define KEY_A_Pin GPIO_PIN_1
#define KEY_A_GPIO_Port GPIOB
#define INT_Orientation_Pin GPIO_PIN_4
#define INT_Orientation_GPIO_Port GPIOB
#define PWM_Out_Pin GPIO_PIN_6
#define PWM_Out_GPIO_Port GPIOA
#define PWM_Out_CHANNEL TIM_CHANNEL_1
#define INT_Movement_Pin GPIO_PIN_5
#define INT_Movement_GPIO_Port GPIOB
#define SCL_Pin GPIO_PIN_6
#define SCL_GPIO_Port GPIOB
#define SDA_Pin GPIO_PIN_7
#define SDA_GPIO_Port GPIOB
#endif
/* /*
* Keep in a uint8_t range for the ID's * Keep in a uint8_t range for the ID's
*/ */
#ifdef MODEL_TS100
enum TipType { enum TipType {
TS_B2 = 0, TS_B2 = 0,
TS_D24 = 1, TS_D24 = 1,
@@ -29,28 +104,15 @@ enum TipType {
Tip_Hakko = 5, Tip_Hakko = 5,
Tip_Custom = 5, Tip_Custom = 5,
}; };
#define KEY_B_Pin GPIO_PIN_6 #endif
#define KEY_B_GPIO_Port GPIOA #ifdef MODEL_TS80
#define TMP36_INPUT_Pin GPIO_PIN_7 enum TipType {
#define TMP36_INPUT_GPIO_Port GPIOA TS_B02 = 0,
#define TIP_TEMP_Pin GPIO_PIN_0 TS_D25 = 1,
#define TIP_TEMP_GPIO_Port GPIOB Tip_MiniWare = 2,
#define VIN_Pin GPIO_PIN_1 Tip_Custom = 2,
#define VIN_GPIO_Port GPIOB };
#define OLED_RESET_Pin GPIO_PIN_8 #endif
#define OLED_RESET_GPIO_Port GPIOA
#define KEY_A_Pin GPIO_PIN_9
#define KEY_A_GPIO_Port GPIOA
#define INT_Orientation_Pin GPIO_PIN_3
#define INT_Orientation_GPIO_Port GPIOB
#define PWM_Out_Pin GPIO_PIN_4
#define PWM_Out_GPIO_Port GPIOB
#define INT_Movement_Pin GPIO_PIN_5
#define INT_Movement_GPIO_Port GPIOB
#define SCL_Pin GPIO_PIN_6
#define SCL_GPIO_Port GPIOB
#define SDA_Pin GPIO_PIN_7
#define SDA_GPIO_Port GPIOB
uint16_t getHandleTemperature(); uint16_t getHandleTemperature();
uint16_t getTipRawTemp(uint8_t instant); uint16_t getTipRawTemp(uint8_t instant);
@@ -62,9 +124,17 @@ uint16_t ctoTipMeasurement(uint16_t temp);
uint16_t tipMeasurementToC(uint16_t raw); uint16_t tipMeasurementToC(uint16_t raw);
uint16_t ftoTipMeasurement(uint16_t temp); uint16_t ftoTipMeasurement(uint16_t temp);
uint16_t tipMeasurementToF(uint16_t raw); uint16_t tipMeasurementToF(uint16_t raw);
void seekQC(int16_t Vx10);
void setCalibrationOffset(int16_t offSet); void setCalibrationOffset(int16_t offSet);
void setTipType(enum TipType tipType, uint8_t manualCalGain); void setTipType(enum TipType tipType, uint8_t manualCalGain);
uint32_t calculateTipR(uint8_t useFilter);
int16_t calculateMaxVoltage(uint8_t useFilter, uint8_t useHP);
void startQC(); // Tries to negotiate QC for highest voltage, must be run after
// RToS
// This will try for 12V, failing that 9V, failing that 5V
// If input is over 12V returns -1
// If the input is [5-12] Will return the value.
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -2,12 +2,10 @@
#define __MAIN_H #define __MAIN_H
#include <MMA8652FC.hpp> #include <MMA8652FC.hpp>
#include "Setup.h"
#include "OLED.hpp" #include "OLED.hpp"
extern uint16_t currentlyActiveTemperatureTarget; #include "Setup.h"
extern OLED lcd;
extern MMA8652FC accel;
extern uint8_t PCBVersion; extern uint8_t PCBVersion;
extern uint16_t currentlyActiveTemperatureTarget;
enum ButtonState { enum ButtonState {
BUTTON_NONE = 0, /* No buttons pressed / < filter time*/ BUTTON_NONE = 0, /* No buttons pressed / < filter time*/
BUTTON_F_SHORT = 1, /* User has pressed the front button*/ BUTTON_F_SHORT = 1, /* User has pressed the front button*/

View File

@@ -7,9 +7,11 @@
#include "FRToSI2C.hpp" #include "FRToSI2C.hpp"
void __attribute__ ((long_call, section (".data.ramfuncs"))) FRToSI2C::CpltCallback() { I2C_HandleTypeDef* FRToSI2C::i2c;
SemaphoreHandle_t FRToSI2C::I2CSemaphore;
void FRToSI2C::CpltCallback() {
BaseType_t xHigherPriorityTaskWoken = pdFALSE; BaseType_t xHigherPriorityTaskWoken = pdFALSE;
i2c->State = HAL_I2C_STATE_READY;//Force state reset i2c->State = HAL_I2C_STATE_READY; // Force state reset (even if tx error)
if (I2CSemaphore) { if (I2CSemaphore) {
xSemaphoreGiveFromISR(I2CSemaphore, &xHigherPriorityTaskWoken); xSemaphoreGiveFromISR(I2CSemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
@@ -18,8 +20,7 @@ void __attribute__ ((long_call, section (".data.ramfuncs"))) FRToSI2C::CpltCallb
void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { uint16_t MemAddSize, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED if (I2CSemaphore == NULL) {
|| I2CSemaphore == NULL) {
// no RToS, run blocking code // no RToS, run blocking code
HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
5000); 5000);
@@ -28,23 +29,28 @@ void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
// Get the mutex so we can use the I2C port // Get the mutex so we can use the I2C port
// Wait up to 1 second for the mutex // Wait up to 1 second for the mutex
if (xSemaphoreTake(I2CSemaphore, (TickType_t)5000) == pdTRUE) { if (xSemaphoreTake(I2CSemaphore, (TickType_t)5000) == pdTRUE) {
if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
Size, 5000) != HAL_OK) { 5000) != HAL_OK) {
NVIC_SystemReset(); NVIC_SystemReset();
} }
xSemaphoreGive(I2CSemaphore); xSemaphoreGive(I2CSemaphore);
} else { } else {
NVIC_SystemReset(); NVIC_SystemReset();
} }
}
}
void FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) {
Mem_Write(address, reg, I2C_MEMADD_SIZE_8BIT, &data, 1);
} }
uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) {
uint8_t tx_data[1];
Mem_Read(add, reg, I2C_MEMADD_SIZE_8BIT, tx_data, 1);
return tx_data[0];
} }
void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { uint16_t MemAddSize, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED if (I2CSemaphore == NULL) {
|| I2CSemaphore == NULL) {
// no RToS, run blocking code // no RToS, run blocking code
HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
5000); 5000);
@@ -53,8 +59,8 @@ void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
// Get the mutex so we can use the I2C port // Get the mutex so we can use the I2C port
// Wait up to 1 second for the mutex // Wait up to 1 second for the mutex
if (xSemaphoreTake(I2CSemaphore, (TickType_t)5000) == pdTRUE) { if (xSemaphoreTake(I2CSemaphore, (TickType_t)5000) == pdTRUE) {
if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData,
pData, Size, 5000) != HAL_OK) { Size, 5000) != HAL_OK) {
NVIC_SystemReset(); NVIC_SystemReset();
} }
xSemaphoreGive(I2CSemaphore); xSemaphoreGive(I2CSemaphore);
@@ -66,8 +72,7 @@ void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
} }
void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) { void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED if (I2CSemaphore == NULL) {
|| I2CSemaphore == NULL) {
// no RToS, run blocking code // no RToS, run blocking code
HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000);
} else { } else {
@@ -75,8 +80,7 @@ void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
// Get the mutex so we can use the I2C port // Get the mutex so we can use the I2C port
// Wait up to 1 second for the mutex // Wait up to 1 second for the mutex
if (xSemaphoreTake(I2CSemaphore, (TickType_t)5000) == pdTRUE) { if (xSemaphoreTake(I2CSemaphore, (TickType_t)5000) == pdTRUE) {
if (HAL_I2C_Master_Transmit_DMA(i2c, DevAddress, pData, Size) if (HAL_I2C_Master_Transmit_DMA(i2c, DevAddress, pData, Size) != HAL_OK) {
!= HAL_OK) {
NVIC_SystemReset(); NVIC_SystemReset();
} }
// xSemaphoreGive(I2CSemaphore); // xSemaphoreGive(I2CSemaphore);
@@ -84,5 +88,4 @@ void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
NVIC_SystemReset(); NVIC_SystemReset();
} }
} }
} }

View File

@@ -8,6 +8,7 @@
#include <LIS2DH12.hpp> #include <LIS2DH12.hpp>
#include "cmsis_os.h" #include "cmsis_os.h"
typedef struct { typedef struct {
const uint8_t reg; const uint8_t reg;
const uint8_t value; const uint8_t value;
@@ -31,13 +32,13 @@ static const LIS_REG i2c_registers[] = {
void LIS2DH12::initalize() { void LIS2DH12::initalize() {
for (size_t index = 0; index < (sizeof(i2c_registers) / sizeof(i2c_registers[0])); index++) { for (size_t index = 0; index < (sizeof(i2c_registers) / sizeof(i2c_registers[0])); index++) {
I2C_RegisterWrite(i2c_registers[index].reg, i2c_registers[index].value); FRToSI2C::I2C_RegisterWrite(LIS2DH_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].value);
} }
} }
void LIS2DH12::getAxisReadings(int16_t* x, int16_t* y, int16_t* z) { void LIS2DH12::getAxisReadings(int16_t* x, int16_t* y, int16_t* z) {
uint8_t tempArr[6]; uint8_t tempArr[6];
i2c->Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT,
(uint8_t*) tempArr, 6); (uint8_t*) tempArr, 6);
(*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0])); (*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0]));
@@ -45,13 +46,4 @@ void LIS2DH12::getAxisReadings(int16_t* x, int16_t* y, int16_t* z) {
(*z) = ((uint16_t) (tempArr[5] << 8 | tempArr[4])); (*z) = ((uint16_t) (tempArr[5] << 8 | tempArr[4]));
} }
void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
i2c->Mem_Write(LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1);
}
uint8_t LIS2DH12::I2C_RegisterRead(uint8_t reg) {
uint8_t tx_data[1];
i2c->Mem_Read( LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data, 1);
return tx_data[0];
}

View File

@@ -13,8 +13,7 @@ typedef struct {
const uint8_t val; const uint8_t val;
} MMA_REG; } MMA_REG;
static const MMA_REG i2c_registers[] = { static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode
{CTRL_REG2, 0}, //Normal mode
{ CTRL_REG2, 0x40 }, // Reset all registers to POR values { CTRL_REG2, 0x40 }, // Reset all registers to POR values
{ FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled { FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled
{ PL_CFG_REG, 0x40 }, //Enable the orientation detection { PL_CFG_REG, 0x40 }, //Enable the orientation detection
@@ -29,35 +28,28 @@ static const MMA_REG i2c_registers[] = {
{ CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode { CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode
}; };
void MMA8652FC::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
i2c->Mem_Write( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1);
}
uint8_t MMA8652FC::I2C_RegisterRead(uint8_t reg) {
uint8_t tx_data[1];
i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data,
1);
return tx_data[0];
}
void MMA8652FC::initalize() { void MMA8652FC::initalize() {
size_t index = 0; size_t index = 0;
//send all the init commands to the unit //send all the init commands to the unit
I2C_RegisterWrite(i2c_registers[index].reg, i2c_registers[index].val); index++; FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val);
I2C_RegisterWrite(i2c_registers[index].reg, i2c_registers[index].val); index++; index++;
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val);
index++;
HAL_Delay(2); // ~1ms delay HAL_Delay(2); // ~1ms delay
while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) { while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) {
I2C_RegisterWrite(i2c_registers[index].reg, i2c_registers[index].val); index++; FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val);
index++;
} }
} }
Orientation MMA8652FC::getOrientation() { Orientation MMA8652FC::getOrientation() {
//First read the PL_STATUS register //First read the PL_STATUS register
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG); uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS,PL_STATUS_REG);
if ((plStatus & 0b10000000) == 0b10000000) { if ((plStatus & 0b10000000) == 0b10000000) {
plStatus >>= 1; //We don't need the up/down bit plStatus >>= 1; //We don't need the up/down bit
plStatus &= 0x03; //mask to the two lower bits plStatus &= 0x03; //mask to the two lower bits
@@ -72,7 +64,8 @@ Orientation MMA8652FC::getOrientation() {
} }
void MMA8652FC::getAxisReadings(int16_t *x, int16_t *y, int16_t *z) { void MMA8652FC::getAxisReadings(int16_t *x, int16_t *y, int16_t *z) {
uint8_t tempArr[6]; uint8_t tempArr[6];
i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6); FRToSI2C::Mem_Read( MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, I2C_MEMADD_SIZE_8BIT,
(uint8_t*) tempArr, 6);
(*x) = tempArr[0] << 8 | tempArr[1]; (*x) = tempArr[0] << 8 | tempArr[1];
(*y) = tempArr[2] << 8 | tempArr[3]; (*y) = tempArr[2] << 8 | tempArr[3];

View File

@@ -5,15 +5,30 @@
* Author: Ben V. Brown * Author: Ben V. Brown
*/ */
#include <OLED.hpp>
#include <string.h> #include <string.h>
#include <OLED.hpp>
#include "Translation.h" #include "Translation.h"
#include "cmsis_os.h" #include "cmsis_os.h"
const uint8_t* OLED::currentFont; // Pointer to the current font used for
// rendering to the buffer
uint8_t* OLED::firstStripPtr; // Pointers to the strips to allow for buffer
// having extra content
uint8_t* OLED::secondStripPtr; // Pointers to the strips
bool OLED::inLeftHandedMode; // Whether the screen is in left or not (used for
// offsets in GRAM)
bool OLED::displayOnOffState; // If the display is on or not
uint8_t OLED::fontWidth, OLED::fontHeight;
int16_t OLED::cursor_x, OLED::cursor_y;
uint8_t OLED::displayOffset;
uint8_t OLED::screenBuffer[16 + (OLED_WIDTH * 2) + 10]; // The data buffer
/*Setup params for the OLED screen*/ /*Setup params for the OLED screen*/
/*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/ /*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
/*All commands are prefixed with 0x80*/ /*All commands are prefixed with 0x80*/
/*Data packets are prefixed with 0x40*/ /*Data packets are prefixed with 0x40*/
uint8_t OLED_Setup_Array[] = { /**/ uint8_t OLED_Setup_Array[] = {
/**/
0x80, 0xAE, /*Display off*/ 0x80, 0xAE, /*Display off*/
0x80, 0xD5, /*Set display clock divide ratio / osc freq*/ 0x80, 0xD5, /*Set display clock divide ratio / osc freq*/
0x80, 0x52, /*Divide ratios*/ 0x80, 0x52, /*Divide ratios*/
@@ -42,11 +57,11 @@ uint8_t OLED_Setup_Array[] = { /**/
}; };
// Setup based on the SSD1307 and modified for the SSD1306 // Setup based on the SSD1307 and modified for the SSD1306
const uint8_t REFRESH_COMMANDS[17] = { 0x80, 0xAF, 0x80, 0x21, 0x80, 0x20, 0x80, const uint8_t REFRESH_COMMANDS[17] = {0x80, 0xAF, 0x80, 0x21, 0x80, 0x20,
0x7F, 0x80, 0xC0, 0x80, 0x22, 0x80, 0x00, 0x80, 0x01, 0x40 }; 0x80, 0x7F, 0x80, 0xC0, 0x80, 0x22,
0x80, 0x00, 0x80, 0x01, 0x40};
OLED::OLED(FRToSI2C* i2cHandle) { void OLED::initialize() {
i2c = i2cHandle;
cursor_x = cursor_y = 0; cursor_x = cursor_y = 0;
currentFont = FONT_12; currentFont = FONT_12;
fontWidth = 12; fontWidth = 12;
@@ -56,16 +71,13 @@ OLED::OLED(FRToSI2C* i2cHandle) {
fontHeight = 16; fontHeight = 16;
displayOffset = 0; displayOffset = 0;
displayOnOffState = true; displayOnOffState = true;
}
void OLED::initialize() {
memcpy(&screenBuffer[0], &REFRESH_COMMANDS[0], sizeof(REFRESH_COMMANDS)); memcpy(&screenBuffer[0], &REFRESH_COMMANDS[0], sizeof(REFRESH_COMMANDS));
HAL_Delay(50); HAL_Delay(50);
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
HAL_Delay(50); HAL_Delay(50);
// Send the setup settings // Send the setup settings
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, FRToSI2C::Transmit(DEVICEADDR_OLED, (uint8_t*)OLED_Setup_Array,
sizeof(OLED_Setup_Array)); sizeof(OLED_Setup_Array));
displayOnOff(true); displayOnOff(true);
} }
@@ -94,14 +106,14 @@ void OLED::drawChar(char c, char PrecursorCommand) {
c -= 0x80; c -= 0x80;
switch (PrecursorCommand) { switch (PrecursorCommand) {
case 0xC2: case 0xC2:
index = (96 - 32) + (c); index = (96 - 32) + (c);
break; //-32 compensate for chars excluded from font C2 section break; //-32 compensate for chars excluded from font C2 section
case 0xC3: case 0xC3:
index = (128) + (c); index = (128) + (c);
break; break;
#if defined(LANG_RU) || defined(LANG_UK) || defined(LANG_SR) || defined(LANG_BG) || defined(LANG_MK) #if defined(LANG_RU) || defined(LANG_UK) || defined(LANG_SR) || \
defined(LANG_BG) || defined(LANG_MK)
case 0xD0: case 0xD0:
index = (192) + (c); index = (192) + (c);
break; break;
@@ -122,8 +134,8 @@ void OLED::drawChar(char c, char PrecursorCommand) {
} }
} }
uint8_t* charPointer; uint8_t* charPointer;
charPointer = ((uint8_t*) currentFont) charPointer =
+ ((fontWidth * (fontHeight / 8)) * index); ((uint8_t*)currentFont) + ((fontWidth * (fontHeight / 8)) * index);
drawArea(cursor_x, cursor_y, fontWidth, fontHeight, charPointer); drawArea(cursor_x, cursor_y, fontWidth, fontHeight, charPointer);
@@ -143,12 +155,17 @@ void OLED::setRotation(bool leftHanded) {
OLED_Setup_Array[11] = 0xC0; OLED_Setup_Array[11] = 0xC0;
OLED_Setup_Array[19] = 0xA0; OLED_Setup_Array[19] = 0xA0;
} }
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, FRToSI2C::Transmit(DEVICEADDR_OLED, (uint8_t*)OLED_Setup_Array,
sizeof(OLED_Setup_Array)); sizeof(OLED_Setup_Array));
inLeftHandedMode = leftHanded; inLeftHandedMode = leftHanded;
screenBuffer[5] = inLeftHandedMode ? 0 : 32; //display is shifted by 32 in left handed mode as driver ram is 128 wide screenBuffer[5] =
screenBuffer[7] = inLeftHandedMode ? 95 : 0x7F; //End address of the ram segment we are writing to (96 wide) inLeftHandedMode ? 0 : 32; // display is shifted by 32 in left handed
// mode as driver ram is 128 wide
screenBuffer[7] =
inLeftHandedMode
? 95
: 0x7F; // End address of the ram segment we are writing to (96 wide)
screenBuffer[9] = inLeftHandedMode ? 0xC8 : 0xC0; screenBuffer[9] = inLeftHandedMode ? 0xC8 : 0xC0;
} }
@@ -217,7 +234,8 @@ void OLED::printNumber(uint16_t number, uint8_t places) {
void OLED::drawSymbol(uint8_t symbolID) { void OLED::drawSymbol(uint8_t symbolID) {
// draw a symbol to the current cursor location // draw a symbol to the current cursor location
setFont(2); setFont(2);
drawChar(' ' + symbolID); // space offset is in all fonts, so we pad it here and remove it later drawChar(' ' + symbolID); // space offset is in all fonts, so we pad it here
// and remove it later
setFont(0); setFont(0);
} }
@@ -225,10 +243,8 @@ void OLED::drawSymbol(uint8_t symbolID) {
void OLED::drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height, void OLED::drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
const uint8_t* ptr) { const uint8_t* ptr) {
// Splat this from x->x+wide in two strides // Splat this from x->x+wide in two strides
if (x <= -wide) if (x <= -wide) return; // cutoffleft
return; //cutoffleft if (x > 96) return; // cutoff right
if (x > 96)
return; //cutoff right
uint8_t visibleStart = 0; uint8_t visibleStart = 0;
uint8_t visibleEnd = wide; uint8_t visibleEnd = wide;
@@ -257,10 +273,8 @@ void OLED::drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
void OLED::fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height, void OLED::fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
const uint8_t value) { const uint8_t value) {
// Splat this from x->x+wide in two strides // Splat this from x->x+wide in two strides
if (x <= -wide) if (x <= -wide) return; // cutoffleft
return; //cutoffleft if (x > 96) return; // cutoff right
if (x > 96)
return; //cutoff right
uint8_t visibleStart = 0; uint8_t visibleStart = 0;
uint8_t visibleEnd = wide; uint8_t visibleEnd = wide;
@@ -325,7 +339,8 @@ void OLED::drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,
void OLED::drawHeatSymbol(uint8_t state) { void OLED::drawHeatSymbol(uint8_t state) {
// Draw symbol 14 // Draw symbol 14
//Then draw over it botom 5 pixels always stay. 8 pixels above that are the levels // Then draw over it, the bottom 5 pixels always stay. 8 pixels above that are
// the levels masks the symbol nicely
state /= 12; // 0-> 8 range state /= 12; // 0-> 8 range
// Then we want to draw down (16-(5+state) // Then we want to draw down (16-(5+state)
uint8_t cursor_x_temp = cursor_x; uint8_t cursor_x_temp = cursor_x;

View File

@@ -4,12 +4,15 @@
* Created on: 29 Sep 2016 * Created on: 29 Sep 2016
* Author: Ralim * Author: Ralim
* *
* This file holds the users settings and saves / restores them to the devices flash * This file holds the users settings and saves / restores them to the
* devices flash
*/ */
#include "Settings.h" #include "Settings.h"
#include "Setup.h" #include "Setup.h"
#define FLASH_ADDR (0x8000000|0xFC00)/*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/ #define FLASH_ADDR \
(0x8000000 | \
0xFC00) /*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/
#include "string.h" #include "string.h"
volatile systemSettingsType systemSettings; volatile systemSettingsType systemSettings;
@@ -22,8 +25,8 @@ void saveSettings() {
pEraseInit.PageAddress = FLASH_ADDR; pEraseInit.PageAddress = FLASH_ADDR;
uint32_t failingAddress = 0; uint32_t failingAddress = 0;
HAL_IWDG_Refresh(&hiwdg); HAL_IWDG_Refresh(&hiwdg);
__HAL_FLASH_CLEAR_FLAG( __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR |
FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY); FLASH_FLAG_BSY);
HAL_FLASH_Unlock(); HAL_FLASH_Unlock();
HAL_Delay(10); HAL_Delay(10);
HAL_IWDG_Refresh(&hiwdg); HAL_IWDG_Refresh(&hiwdg);
@@ -40,7 +43,6 @@ void saveSettings() {
data[i]); data[i]);
} }
HAL_FLASH_Lock(); HAL_FLASH_Lock();
} }
void restoreSettings() { void restoreSettings() {
@@ -56,7 +58,6 @@ void restoreSettings() {
// probably not setup // probably not setup
resetSettings(); resetSettings();
} }
} }
// Lookup function for cutoff setting -> X10 voltage // Lookup function for cutoff setting -> X10 voltage
/* /*
@@ -74,29 +75,47 @@ uint8_t lookupVoltageLevel(uint8_t level) {
} }
void resetSettings() { void resetSettings() {
memset((void *)&systemSettings, 0, sizeof(systemSettingsType)); memset((void *)&systemSettings, 0, sizeof(systemSettingsType));
systemSettings.SleepTemp = 150; //Temperature the iron sleeps at - default 150.0 C systemSettings.SleepTemp =
systemSettings.SleepTime = 6; //How many seconds/minutes we wait until going to sleep - default 1 min 150; // Temperature the iron sleeps at - default 150.0 C
systemSettings.SleepTime = 6; // How many seconds/minutes we wait until going
// to sleep - default 1 min
systemSettings.SolderingTemp = 320; // Default soldering temp is 320.0 C systemSettings.SolderingTemp = 320; // Default soldering temp is 320.0 C
systemSettings.cutoutSetting = 0; //default to no cut-off voltage systemSettings.cutoutSetting = 0; // default to no cut-off voltage (or 18W for TS80)
systemSettings.version = SETTINGSVERSION;//Store the version number to allow for easier upgrades systemSettings.version =
SETTINGSVERSION; // Store the version number to allow for easier upgrades
systemSettings.detailedSoldering = 0; // Detailed soldering screen systemSettings.detailedSoldering = 0; // Detailed soldering screen
systemSettings.detailedIDLE = 0;// Detailed idle screen (off for first time users) systemSettings.detailedIDLE =
0; // Detailed idle screen (off for first time users)
systemSettings.OrientationMode = 2; // Default to automatic systemSettings.OrientationMode = 2; // Default to automatic
systemSettings.sensitivity = 7; // Default high sensitivity systemSettings.sensitivity = 7; // Default high sensitivity
#ifdef MODEL_TS80
systemSettings.voltageDiv = 780; // Default divider from schematic
#else
systemSettings.voltageDiv = 467; // Default divider from schematic systemSettings.voltageDiv = 467; // Default divider from schematic
systemSettings.ShutdownTime = 10;//How many minutes until the unit turns itself off #endif
systemSettings.boostModeEnabled = 1;//Default to safe, with no boost mode systemSettings.ShutdownTime =
10; // How many minutes until the unit turns itself off
systemSettings.boostModeEnabled =
1; // Default to having boost mode on as most people prefer itF
systemSettings.BoostTemp = 420; // default to 400C systemSettings.BoostTemp = 420; // default to 400C
systemSettings.autoStartMode = 0; // Auto start off for safety systemSettings.autoStartMode = 0; // Auto start off for safety
systemSettings.coolingTempBlink = 0;//Blink the temperature on the cooling screen when its > 50C systemSettings.coolingTempBlink =
0; // Blink the temperature on the cooling screen when its > 50C
systemSettings.temperatureInF = 0; // default to 0 systemSettings.temperatureInF = 0; // default to 0
systemSettings.descriptionScrollSpeed = 0; // default to slow systemSettings.descriptionScrollSpeed = 0; // default to slow
systemSettings.PID_P = 42; systemSettings.PID_P = 42; // PID tuning constants
systemSettings.PID_I = 50; systemSettings.PID_I = 50;
systemSettings.PID_D = 15; systemSettings.PID_D = 15;
systemSettings.CalibrationOffset = 2780; // the adc offset systemSettings.CalibrationOffset = 2780; // the adc offset
systemSettings.customTipGain = 0; // The tip type is either default or a custom gain systemSettings.customTipGain =
systemSettings.tipType = TS_B2; 0; // The tip type is either default or a custom gain
saveSettings(); #ifdef MODEL_TS100
} systemSettings.tipType = TS_B2; // Default to the B2 Tip
#endif
#ifdef MODEL_TS80
systemSettings.tipType = TS_B02; // Default to the B2 Tip
#endif
saveSettings(); // Save defaults
}

View File

@@ -32,6 +32,7 @@ static void MX_ADC2_Init(void);
void Setup_HAL() { void Setup_HAL() {
SystemClock_Config(); SystemClock_Config();
__HAL_AFIO_REMAP_SWJ_DISABLE();
MX_GPIO_Init(); MX_GPIO_Init();
MX_DMA_Init(); MX_DMA_Init();
MX_I2C1_Init(); MX_I2C1_Init();
@@ -41,33 +42,30 @@ 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, (uint32_t*)ADCReadings,
64); // 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
} }
// 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 < 32; i++) sum += ADCReadings[channel + (i * 2)];
sum += ADCReadings[channel + (i * 2)];
return sum >> 2; return sum >> 2;
} }
/** System Clock Configuration /** System Clock Configuration
*/ */
void SystemClock_Config(void) { void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit; RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks /**Initializes the CPU, AHB and APB busses clocks
*/ */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI RCC_OscInitStruct.OscillatorType =
| RCC_OSCILLATORTYPE_LSI; RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON;
@@ -78,17 +76,20 @@ void SystemClock_Config(void) {
/**Initializes the CPU, AHB and APB busses clocks /**Initializes the CPU, AHB and APB busses clocks
*/ */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV16; //TIM 2,3,4,5,6,7,12,13,14 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV16; // TIM
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //64 mhz to some peripherals and adc // 2,3,4,5,6,7,12,13,14
RCC_ClkInitStruct.APB2CLKDivider =
RCC_HCLK_DIV1; // 64 mhz to some peripherals and adc
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; //6 or 8 are the only non overclocked options PeriphClkInit.AdcClockSelection =
RCC_ADCPCLK2_DIV6; // 6 or 8 are the only non overclocked options
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
/**Configure the Systick interrupt time /**Configure the Systick interrupt time
@@ -127,14 +128,14 @@ static void MX_ADC1_Init(void) {
/**Configure Regular Channel /**Configure Regular Channel
*/ */
sConfig.Channel = ADC_CHANNEL_7; sConfig.Channel = TMP36_ADC1_CHANNEL;
sConfig.Rank = 1; sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/**Configure Regular Channel /**Configure Regular Channel
*/ */
sConfig.Channel = ADC_CHANNEL_9; sConfig.Channel = VIN_ADC1_CHANNEL;
sConfig.Rank = 2; sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_ConfigChannel(&hadc1, &sConfig);
@@ -142,12 +143,11 @@ static void MX_ADC1_Init(void) {
*/ */
// F in = 10.66 MHz // F in = 10.66 MHz
/* /*
* Injected time is 1 delay clock + (12 adc cycles*4)+4*sampletime =~217 clocks = 0.2ms * Injected time is 1 delay clock + (12 adc cycles*4)+4*sampletime =~217
* Charge time is 0.016 uS ideally * clocks = 0.2ms Charge time is 0.016 uS ideally So Sampling time must be >=
* So Sampling time must be >= 0.016uS * 0.016uS 1/10.66MHz is 0.09uS, so 1 CLK is *should* be enough
* 1/10.66MHz is 0.09uS, so 1 CLK is *should* be enough
* */ * */
sConfigInjected.InjectedChannel = ADC_CHANNEL_8; 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_7CYCLES_5;
@@ -165,7 +165,8 @@ static void MX_ADC1_Init(void) {
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedRank = 4; sConfigInjected.InjectedRank = 4;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
SET_BIT(hadc1.Instance->CR1, ( ADC_CR1_JEOCIE )); //Enable end of injected conv irq SET_BIT(hadc1.Instance->CR1,
(ADC_CR1_JEOCIE)); // Enable end of injected conv irq
// Run ADC internal calibration // Run ADC internal calibration
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
; ;
@@ -173,7 +174,6 @@ static void MX_ADC1_Init(void) {
/* ADC2 init function */ /* ADC2 init function */
static void MX_ADC2_Init(void) { static void MX_ADC2_Init(void) {
ADC_ChannelConfTypeDef sConfig; ADC_ChannelConfTypeDef sConfig;
ADC_InjectionConfTypeDef sConfigInjected; ADC_InjectionConfTypeDef sConfigInjected;
@@ -190,18 +190,18 @@ static void MX_ADC2_Init(void) {
/**Configure Regular Channel /**Configure Regular Channel
*/ */
sConfig.Channel = ADC_CHANNEL_8; sConfig.Channel = TIP_TEMP_ADC2_CHANNEL;
sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc2, &sConfig); HAL_ADC_ConfigChannel(&hadc2, &sConfig);
sConfig.Channel = ADC_CHANNEL_8; sConfig.Channel = VIN_ADC2_CHANNEL;
sConfig.Rank = ADC_REGULAR_RANK_2; sConfig.Rank = ADC_REGULAR_RANK_2;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc2, &sConfig); HAL_ADC_ConfigChannel(&hadc2, &sConfig);
/**Configure Injected Channel /**Configure Injected Channel
*/ */
sConfigInjected.InjectedChannel = ADC_CHANNEL_8; 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_7CYCLES_5;
@@ -222,13 +222,12 @@ static void MX_ADC2_Init(void) {
// Run ADC internal calibration // Run ADC internal calibration
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK) while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK)
; ;
} }
/* I2C1 init function */ /* I2C1 init function */
static void MX_I2C1_Init(void) { static void MX_I2C1_Init(void) {
hi2c1.Instance = I2C1; hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // OLED doesnt handle >100k when its asleep (off). hi2c1.Init.ClockSpeed =
100000; // OLED doesnt handle >100k when its asleep (off).
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
@@ -237,22 +236,18 @@ static void MX_I2C1_Init(void) {
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1); HAL_I2C_Init(&hi2c1);
} }
/* IWDG init function */ /* IWDG init function */
static void MX_IWDG_Init(void) { static void MX_IWDG_Init(void) {
hiwdg.Instance = IWDG; hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_256; hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
hiwdg.Init.Reload = 100; hiwdg.Init.Reload = 100;
HAL_IWDG_Init(&hiwdg); HAL_IWDG_Init(&hiwdg);
} }
/* TIM3 init function */ /* TIM3 init function */
static void MX_TIM3_Init(void) { static void MX_TIM3_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig; TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig; TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC; TIM_OC_InitTypeDef sConfigOC;
@@ -280,22 +275,24 @@ static void MX_TIM3_Init(void) {
sConfigOC.Pulse = 50; sConfigOC.Pulse = 50;
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, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, PWM_Out_CHANNEL);
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitTypeDef GPIO_InitStruct;
/**TIM3 GPIO Configuration /**TIM3 GPIO Configuration
PB4 ------> TIM3_CH1 PWM_Out_Pin ------> TIM3_CH1
*/ */
GPIO_InitStruct.Pin = PWM_Out_Pin; GPIO_InitStruct.Pin = PWM_Out_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(PWM_Out_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(PWM_Out_GPIO_Port, &GPIO_InitStruct);
#ifdef MODEL_TS100
__HAL_AFIO_REMAP_TIM3_PARTIAL() // Remap TIM3_CH1 to be on pB4
; __HAL_AFIO_REMAP_TIM3_PARTIAL();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); #else
// No re-map required
#endif
HAL_TIM_PWM_Start(&htim3, PWM_Out_CHANNEL);
} }
/* TIM3 init function */ /* TIM3 init function */
static void MX_TIM2_Init(void) { static void MX_TIM2_Init(void) {
@@ -307,9 +304,11 @@ static void MX_TIM2_Init(void) {
TIM_MasterConfigTypeDef sMasterConfig; TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC; TIM_OC_InitTypeDef sConfigOC;
//Timer 2 is fairly slow as its being used to run the PWM and trigger the ADC in the PWM off time. // Timer 2 is fairly slow as its being used to run the PWM and trigger the ADC
// in the PWM off time.
htim2.Instance = TIM2; htim2.Instance = TIM2;
htim2.Init.Prescaler = 2000; // pwm out is 10k, we want to run our PWM at around 100hz htim2.Init.Prescaler =
2000; // pwm out is 10k, we want to run our PWM at around 100hz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 122; htim2.Init.Period = 122;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4; // 4mhz before divide htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4; // 4mhz before divide
@@ -347,7 +346,6 @@ static void MX_TIM2_Init(void) {
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_4); HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_4);
HAL_NVIC_EnableIRQ(TIM2_IRQn); HAL_NVIC_EnableIRQ(TIM2_IRQn);
} }
/** /**
@@ -355,8 +353,7 @@ static void MX_TIM2_Init(void) {
*/ */
static void MX_DMA_Init(void) { static void MX_DMA_Init(void) {
/* DMA controller clock enable */ /* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE();
;
/* DMA interrupt init */ /* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */ /* DMA1_Channel1_IRQn interrupt configuration */
@@ -368,7 +365,6 @@ static void MX_DMA_Init(void) {
/* DMA1_Channel7_IRQn interrupt configuration */ /* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 15, 0); HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn); HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
} }
/** Configure pins as /** Configure pins as
@@ -382,16 +378,12 @@ static void MX_DMA_Init(void) {
PB1 ------> ADCx_IN9 PB1 ------> ADCx_IN9
*/ */
static void MX_GPIO_Init(void) { static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */ /* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE();
; __HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE();
;
__HAL_RCC_GPIOB_CLK_ENABLE()
;
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_RESET);
@@ -400,16 +392,30 @@ static void MX_GPIO_Init(void) {
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure peripheral I/O remapping */
__HAL_AFIO_REMAP_PD01_ENABLE();
//^ remap XTAL so that pins can be analog (all input buffers off).
// reduces power consumption
/*Configure GPIO pins : PA0 PA1 PA2 PA3 /*
PA4 PA5 PA10 PA15 */ * Configure All pins as analog by default
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 */
| GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
| GPIO_PIN_15; GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 |
GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |
#ifdef MODEL_TS100
GPIO_PIN_3 |
#endif
GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 |
GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |
GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//Set PA 11 and PA 12 to GND to stop usb detection, 13/14 re-rused for debug #ifdef MODEL_TS100
/* Pull USB lines low to disable, pull down debug too*/
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13; GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
@@ -418,17 +424,17 @@ static void MX_GPIO_Init(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET);
#else
/* TS80 */
/* Leave USB lines open circuit*/
#endif
/*Configure GPIO pins : KEY_B_Pin KEY_A_Pin */ /*Configure GPIO pins : KEY_B_Pin KEY_A_Pin */
GPIO_InitStruct.Pin = KEY_B_Pin | KEY_A_Pin; GPIO_InitStruct.Pin = KEY_B_Pin | KEY_A_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(KEY_B_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TIP_TEMP_Pin VIN_Pin PB2 */
GPIO_InitStruct.Pin = TIP_TEMP_Pin | VIN_Pin | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : OLED_RESET_Pin */ /*Configure GPIO pin : OLED_RESET_Pin */
GPIO_InitStruct.Pin = OLED_RESET_Pin; GPIO_InitStruct.Pin = OLED_RESET_Pin;
@@ -437,16 +443,8 @@ static void MX_GPIO_Init(void) {
HAL_GPIO_Init(OLED_RESET_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(OLED_RESET_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_RESET);
/* Configure GPIO pins : INT_Orientation_Pin INT_Movement_Pin */ // Pull down LCD reset
/* Not used anymore*/ HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = INT_Orientation_Pin | INT_Movement_Pin; HAL_Delay(10);
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure peripheral I/O remapping */
__HAL_AFIO_REMAP_PD01_ENABLE();
//^ remap XTAL so that pins can be analog (all input buffers off).
// reduces power consumption
} }

View File

@@ -1,4 +1,5 @@
// WARNING: THIS FILE WAS AUTO GENERATED BY make_translation.py. PLEASE DO NOT EDIT. // WARNING: THIS FILE WAS AUTO GENERATED BY make_translation.py. PLEASE DO NOT
// EDIT.
#include "Translation.h" #include "Translation.h"
#ifndef LANG #ifndef LANG
@@ -29,6 +30,7 @@ const char* SettingsDescriptions[] = {
/* TipModel */ "Tip Model selection", /* TipModel */ "Tip Model selection",
/* SimpleCalibrationMode */ "Simple Calibration using Hot water", /* SimpleCalibrationMode */ "Simple Calibration using Hot water",
/* AdvancedCalibrationMode */ "Advanced calibration using thermocouple on the tip", /* AdvancedCalibrationMode */ "Advanced calibration using thermocouple on the tip",
/* Power Input */ "The power rating of the power adapter",
}; };
const char* SettingsCalibrationDone = "Calibration done!"; const char* SettingsCalibrationDone = "Calibration done!";
@@ -87,13 +89,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Advanced\nOptions", /* AdvancedMenu */ "Advanced\nOptions",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Soldering settings",
/* PowerSavingMenu */ "Power saving settings",
/* UIMenu */ "User interface settings",
/* AdvancedMenu */ "Advanced options",
};
#endif #endif
#ifdef LANG_BG #ifdef LANG_BG
@@ -269,13 +264,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Pokročilé\nvolby", /* AdvancedMenu */ "Pokročilé\nvolby",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Nastavení pájení (boost, auto start...)",
/* PowerSavingMenu */ "Nastavení režimu spánku, automatického vypnutí...",
/* UIMenu */ "Nastavení uživatelského rozhraní.",
/* AdvancedMenu */ "Pokročilé volby (detailní obrazovky, kalibrace, tovární nastavení...)",
};
#endif #endif
#ifdef LANG_DE #ifdef LANG_DE
@@ -542,13 +530,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Opciones\nAvanzadas", /* AdvancedMenu */ "Opciones\nAvanzadas",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Opciones de Soldadura",
/* PowerSavingMenu */ "Opciones de ahorro energético",
/* UIMenu */ "Opciones de interfaz de usuario",
/* AdvancedMenu */ "Opciones avanzadas",
};
#endif #endif
#ifdef LANG_FI #ifdef LANG_FI
@@ -633,13 +614,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Lisä-\nasetukset", /* AdvancedMenu */ "Lisä-\nasetukset",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Juotosasetukset",
/* PowerSavingMenu */ "Virransäästöasetukset",
/* UIMenu */ "Käyttöliittymän asetukset",
/* AdvancedMenu */ "Lisäasetukset",
};
#endif #endif
#ifdef LANG_FR #ifdef LANG_FR
@@ -724,13 +698,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Options\nAdvanced", /* AdvancedMenu */ "Options\nAdvanced",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Paramètres de soudage",
/* PowerSavingMenu */ "Paramètres d'économie d'énergie",
/* UIMenu */ "Paramètres de l'interface utilisateur",
/* AdvancedMenu */ "Options avancées",
};
#endif #endif
#ifdef LANG_HR #ifdef LANG_HR
@@ -815,13 +782,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Napredne\nopcije", /* AdvancedMenu */ "Napredne\nopcije",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Postavke pri lemljenju",
/* PowerSavingMenu */ "Postavke spavanja i štednje energije",
/* UIMenu */ "Postavke korisničkog sučelja",
/* AdvancedMenu */ "Upravljanje naprednim opcijama",
};
#endif #endif
#ifdef LANG_HU #ifdef LANG_HU
@@ -906,13 +866,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Speciális\nbeállítások", /* AdvancedMenu */ "Speciális\nbeállítások",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Forrasztási beállítások",
/* PowerSavingMenu */ "Energiatakarékossági beállítások",
/* UIMenu */ "Felhasználói felület beállításai",
/* AdvancedMenu */ "Speciális beállítások",
};
#endif #endif
#ifdef LANG_IT #ifdef LANG_IT
@@ -1088,13 +1041,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Išplėstin.\nnustatymai", /* AdvancedMenu */ "Išplėstin.\nnustatymai",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Litavimo nustatymai",
/* PowerSavingMenu */ "Energijos vartojimo nustatymai",
/* UIMenu */ "Naudotojo sąsajos nustatymai",
/* AdvancedMenu */ "Išplėstiniai nustatymai",
};
#endif #endif
#ifdef LANG_NL #ifdef LANG_NL
@@ -1179,13 +1125,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "geavanceerde\nInstellingen", /* AdvancedMenu */ "geavanceerde\nInstellingen",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Soldeerinstellingen",
/* PowerSavingMenu */ "Batterijbesparingsinstellingen",
/* UIMenu */ "Gebruikersinterface Instellingen",
/* AdvancedMenu */ "geavanceerde Instellingen",
};
#endif #endif
#ifdef LANG_NO #ifdef LANG_NO
@@ -1270,13 +1209,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Avanserte\nvalg", /* AdvancedMenu */ "Avanserte\nvalg",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Loddeinnstillinger",
/* PowerSavingMenu */ "Dvaleinnstillinger",
/* UIMenu */ "Brukergrensesnitt-innstillinger",
/* AdvancedMenu */ "Avanserte valg",
};
#endif #endif
#ifdef LANG_PL #ifdef LANG_PL
@@ -1361,13 +1293,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Advanced\nOptions", /* AdvancedMenu */ "Advanced\nOptions",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Soldering settings",
/* PowerSavingMenu */ "Power Saving Settings",
/* UIMenu */ "User Interface settings",
/* AdvancedMenu */ "Advanced options",
};
#endif #endif
#ifdef LANG_PT #ifdef LANG_PT
@@ -1452,13 +1377,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Menu\nAvançado", /* AdvancedMenu */ "Menu\nAvançado",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Configurações de soldagem",
/* PowerSavingMenu */ "Configurações de economia de energia",
/* UIMenu */ "Configurações da interface do usuário",
/* AdvancedMenu */ "Opções avançadas",
};
#endif #endif
#ifdef LANG_RU #ifdef LANG_RU
@@ -1543,13 +1461,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Дополнител.\nпараметры", /* AdvancedMenu */ "Дополнител.\nпараметры",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Параметры пайки",
/* PowerSavingMenu */ "Параметры экономии энергии",
/* UIMenu */ "Параметры пользовательского интерфейса",
/* AdvancedMenu */ "Дополнительные параметры",
};
#endif #endif
#ifdef LANG_SK #ifdef LANG_SK
@@ -1634,13 +1545,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Advanced\nOptions", /* AdvancedMenu */ "Advanced\nOptions",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Soldering settings",
/* PowerSavingMenu */ "Power Saving Settings",
/* UIMenu */ "User Interface settings",
/* AdvancedMenu */ "Advanced options",
};
#endif #endif
#ifdef LANG_SR #ifdef LANG_SR
@@ -1725,13 +1629,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Napredne\nopcije", /* AdvancedMenu */ "Napredne\nopcije",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Postavke pri lemljenju",
/* PowerSavingMenu */ "Postavke spavanja i štednje energije",
/* UIMenu */ "Postavke korisničkih opcija",
/* AdvancedMenu */ "Upravljanje naprednim opcijama",
};
#endif #endif
#ifdef LANG_SV #ifdef LANG_SV
@@ -1816,13 +1713,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Avancerade\nalternativ", /* AdvancedMenu */ "Avancerade\nalternativ",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Lödningsinställningar",
/* PowerSavingMenu */ "Viloläges-inställningar",
/* UIMenu */ "Användargränssnitts-inställningar",
/* AdvancedMenu */ "Avancerade alternativ",
};
#endif #endif
#ifdef LANG_TR #ifdef LANG_TR
@@ -1907,13 +1797,6 @@ const char* SettingsMenuEntries[4] = {
/* AdvancedMenu */ "Advanced\nOptions", /* AdvancedMenu */ "Advanced\nOptions",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Soldering settings",
/* PowerSavingMenu */ "Power Saving Settings",
/* UIMenu */ "User Interface settings",
/* AdvancedMenu */ "Advanced options",
};
#endif #endif
#ifdef LANG_UA #ifdef LANG_UA
@@ -1997,12 +1880,4 @@ const char* SettingsMenuEntries[4] = {
/* UIMenu */ "Інтерфейс\n", /* UIMenu */ "Інтерфейс\n",
/* AdvancedMenu */ "Інші\n", /* AdvancedMenu */ "Інші\n",
}; };
const char* SettingsMenuEntriesDescriptions[4] = {
/* SolderingMenu */ "Налаштування для режиму пайки. Діють при включеному жалі.",
/* PowerSavingMenu */ "Налаштування при бездіяльності. Корисно що б не обпектися і з часом не спалити житло.",
/* UIMenu */ "Користувальницький інтерфейс.",
/* AdvancedMenu */ "Розширені налаштування. Додаткові зручності.",
};
#endif #endif

View File

@@ -6,15 +6,21 @@
*/ */
#include "gui.hpp" #include "gui.hpp"
#include "main.hpp"
#include "cmsis_os.h"
#include "Translation.h" #include "Translation.h"
#include "cmsis_os.h"
#include "main.hpp"
#include "string.h" #include "string.h"
extern uint32_t lastButtonTime; extern uint32_t lastButtonTime;
void gui_Menu(const menuitem* menu); void gui_Menu(const menuitem* menu);
#ifdef MODEL_TS100
static void settings_setInputVRange(void); static void settings_setInputVRange(void);
static void settings_displayInputVRange(void); static void settings_displayInputVRange(void);
#else
static void settings_setInputPRange(void);
static void settings_displayInputPRange(void);
#endif
static void settings_setSleepTemp(void); static void settings_setSleepTemp(void);
static void settings_displaySleepTemp(void); static void settings_displaySleepTemp(void);
static void settings_setSleepTime(void); static void settings_setSleepTime(void);
@@ -106,16 +112,27 @@ const menuitem rootSettingsMenu[] {
* Advanced Menu * Advanced Menu
* Exit * Exit
*/ */
{ (const char*) SettingsDescriptions[0], { settings_setInputVRange }, { #ifdef MODEL_TS100
settings_displayInputVRange } }, /*Voltage input*/ {(const char*)SettingsDescriptions[0],
{ (const char*) SettingsMenuEntriesDescriptions[0], { {settings_setInputVRange},
settings_enterSolderingMenu }, { settings_displaySolderingMenu } }, /*Soldering*/ {settings_displayInputVRange}}, /*Voltage input*/
{ (const char*) SettingsMenuEntriesDescriptions[1], { settings_enterPowerMenu }, #else
{(const char*)SettingsDescriptions[20],
{settings_setInputPRange},
{settings_displayInputPRange}}, /*Voltage input*/
#endif
{(const char*)NULL,
{settings_enterSolderingMenu},
{settings_displaySolderingMenu}}, /*Soldering*/
{(const char*)NULL,
{settings_enterPowerMenu},
{settings_displayPowerMenu}}, /*Sleep Options Menu*/ {settings_displayPowerMenu}}, /*Sleep Options Menu*/
{ (const char*) SettingsMenuEntriesDescriptions[2], { settings_enterUIMenu }, { {(const char*)NULL,
settings_displayUIMenu } }, /*UI Menu*/ {settings_enterUIMenu},
{ (const char*) SettingsMenuEntriesDescriptions[3], {settings_displayUIMenu}}, /*UI Menu*/
{ settings_enterAdvancedMenu }, { settings_displayAdvancedMenu } }, /*Advanced Menu*/ {(const char*)NULL,
{settings_enterAdvancedMenu},
{settings_displayAdvancedMenu}}, /*Advanced Menu*/
{NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE {NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE
}; };
@@ -125,12 +142,15 @@ const menuitem solderingMenu[] = {
* Boost Mode Temp * Boost Mode Temp
* Auto Start * Auto Start
*/ */
{ (const char*) SettingsDescriptions[8], { settings_setBoostModeEnabled }, { {(const char*)SettingsDescriptions[8],
settings_displayBoostModeEnabled } }, /*Enable Boost*/ {settings_setBoostModeEnabled},
{ (const char*) SettingsDescriptions[9], { settings_setBoostTemp }, { {settings_displayBoostModeEnabled}}, /*Enable Boost*/
settings_displayBoostTemp } }, /*Boost Temp*/ {(const char*)SettingsDescriptions[9],
{ (const char*) SettingsDescriptions[10], { settings_setAutomaticStartMode }, { {settings_setBoostTemp},
settings_displayAutomaticStartMode } }, /*Auto start*/ {settings_displayBoostTemp}}, /*Boost Temp*/
{(const char*)SettingsDescriptions[10],
{settings_setAutomaticStartMode},
{settings_displayAutomaticStartMode}}, /*Auto start*/
{NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE {NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE
}; };
const menuitem UIMenu[] = { const menuitem UIMenu[] = {
@@ -141,14 +161,18 @@ const menuitem UIMenu[] = {
* Display orientation * Display orientation
* Cooldown blink * Cooldown blink
*/ */
{ (const char*) SettingsDescriptions[5], { settings_setTempF }, { {(const char*)SettingsDescriptions[5],
settings_displayTempF } }, /* Temperature units*/ {settings_setTempF},
{ (const char*) SettingsDescriptions[7], { settings_setDisplayRotation }, { {settings_displayTempF}}, /* Temperature units*/
settings_displayDisplayRotation } }, /*Display Rotation*/ {(const char*)SettingsDescriptions[7],
{ (const char*) SettingsDescriptions[11], { settings_setCoolingBlinkEnabled }, { {settings_setDisplayRotation},
settings_displayCoolingBlinkEnabled } }, /*Cooling blink warning*/ {settings_displayDisplayRotation}}, /*Display Rotation*/
{ (const char*) SettingsDescriptions[16], { settings_setScrollSpeed }, { {(const char*)SettingsDescriptions[11],
settings_displayScrollSpeed } }, /*Scroll Speed for descriptions*/ {settings_setCoolingBlinkEnabled},
{settings_displayCoolingBlinkEnabled}}, /*Cooling blink warning*/
{(const char*)SettingsDescriptions[16],
{settings_setScrollSpeed},
{settings_displayScrollSpeed}}, /*Scroll Speed for descriptions*/
{NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE {NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE
}; };
const menuitem PowerMenu[] = { const menuitem PowerMenu[] = {
@@ -158,14 +182,18 @@ const menuitem PowerMenu[] = {
* Shutdown Time * Shutdown Time
* Motion Sensitivity * Motion Sensitivity
*/ */
{ (const char*) SettingsDescriptions[1], { settings_setSleepTemp }, { {(const char*)SettingsDescriptions[1],
settings_displaySleepTemp } }, /*Sleep Temp*/ {settings_setSleepTemp},
{ (const char*) SettingsDescriptions[2], { settings_setSleepTime }, { {settings_displaySleepTemp}}, /*Sleep Temp*/
settings_displaySleepTime } }, /*Sleep Time*/ {(const char*)SettingsDescriptions[2],
{ (const char*) SettingsDescriptions[3], { settings_setShutdownTime }, { {settings_setSleepTime},
settings_displayShutdownTime } }, /*Shutdown Time*/ {settings_displaySleepTime}}, /*Sleep Time*/
{ (const char*) SettingsDescriptions[4], { settings_setSensitivity }, { {(const char*)SettingsDescriptions[3],
settings_displaySensitivity } }, /* Motion Sensitivity*/ {settings_setShutdownTime},
{settings_displayShutdownTime}}, /*Shutdown Time*/
{(const char*)SettingsDescriptions[4],
{settings_setSensitivity},
{settings_displaySensitivity}}, /* Motion Sensitivity*/
{NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE {NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE
}; };
const menuitem advancedMenu[] = { const menuitem advancedMenu[] = {
@@ -178,50 +206,49 @@ const menuitem advancedMenu[] = {
* Calibrate Input V * Calibrate Input V
* Reset Settings * Reset Settings
*/ */
{ (const char*) SettingsDescriptions[6], { settings_setAdvancedIDLEScreens }, { {(const char*)SettingsDescriptions[6],
settings_displayAdvancedIDLEScreens } }, /* Advanced idle screen*/ {settings_setAdvancedIDLEScreens},
{settings_displayAdvancedIDLEScreens}}, /* Advanced idle screen*/
{(const char*)SettingsDescriptions[15], {(const char*)SettingsDescriptions[15],
{ settings_setAdvancedSolderingScreens }, { {settings_setAdvancedSolderingScreens},
settings_displayAdvancedSolderingScreens } }, /* Advanced soldering screen*/ {settings_displayAdvancedSolderingScreens}}, /* Advanced soldering screen*/
{ (const char*) SettingsDescriptions[13], { settings_setResetSettings }, { {(const char*)SettingsDescriptions[13],
settings_displayResetSettings } }, /*Resets settings*/ {settings_setResetSettings},
{ (const char*) SettingsDescriptions[17], { settings_setTipModel }, { {settings_displayResetSettings}}, /*Resets settings*/
settings_displayTipModel } }, /*Select tip Model */ {(const char*)SettingsDescriptions[17],
{ (const char*) SettingsDescriptions[12], { settings_setCalibrate }, { {settings_setTipModel},
settings_displayCalibrate } }, /*Calibrate tip*/ {settings_displayTipModel}}, /*Select tip Model */
{ (const char*) SettingsDescriptions[14], { settings_setCalibrateVIN }, { {(const char*)SettingsDescriptions[12],
settings_displayCalibrateVIN } }, /*Voltage input cal*/ {settings_setCalibrate},
#ifdef PIDSETTINGS {settings_displayCalibrate}}, /*Calibrate tip*/
{(const char*)SettingsDescriptions[14],
{ (const char*) SettingsDescriptions[17], {settings_setPIDP}, { {settings_setCalibrateVIN},
settings_displayPIDP}}, /*Voltage input cal*/ {settings_displayCalibrateVIN}}, /*Voltage input cal*/
{ (const char*) SettingsDescriptions[18], {settings_setPIDI}, {
settings_displayPIDI}}, /*Voltage input cal*/
{ (const char*) SettingsDescriptions[19], {settings_setPIDD}, {
settings_displayPIDD}}, /*Voltage input cal*/
#endif
{NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE {NULL, {NULL}, {NULL}} // end of menu marker. DO NOT REMOVE
}; };
const menuitem calibrationMenu[] { { (const char*) SettingsDescriptions[6], { const menuitem calibrationMenu[]{
calibration_enterSimpleCal }, { calibration_displaySimpleCal } }, {(const char*)SettingsDescriptions[6],
{calibration_enterSimpleCal},
{calibration_displaySimpleCal}},
/* Simple Cal*/ /* Simple Cal*/
{ (const char*) SettingsDescriptions[6], { calibration_enterAdvancedCal }, { {(const char*)SettingsDescriptions[6],
calibration_displayAdvancedCal } }, /* Advanced Cal */ {calibration_enterAdvancedCal},
{calibration_displayAdvancedCal}}, /* Advanced Cal */
{NULL, {NULL}, {NULL}}}; {NULL, {NULL}, {NULL}}};
static void printShortDescriptionSingleLine(uint32_t shortDescIndex) { static void printShortDescriptionSingleLine(uint32_t shortDescIndex) {
lcd.setFont(0); OLED::setFont(0);
lcd.setCharCursor(0, 0); OLED::setCharCursor(0, 0);
lcd.print(SettingsShortNames[shortDescIndex][0]); OLED::print(SettingsShortNames[shortDescIndex][0]);
} }
static void printShortDescriptionDoubleLine(uint32_t shortDescIndex) { static void printShortDescriptionDoubleLine(uint32_t shortDescIndex) {
lcd.setFont(1); OLED::setFont(1);
lcd.setCharCursor(0, 0); OLED::setCharCursor(0, 0);
lcd.print(SettingsShortNames[shortDescIndex][0]); OLED::print(SettingsShortNames[shortDescIndex][0]);
lcd.setCharCursor(0, 1); OLED::setCharCursor(0, 1);
lcd.print(SettingsShortNames[shortDescIndex][1]); OLED::print(SettingsShortNames[shortDescIndex][1]);
} }
/** /**
@@ -241,31 +268,31 @@ static void printShortDescription(uint32_t shortDescIndex,
} }
// prepare cursor for value // prepare cursor for value
lcd.setFont(0); OLED::setFont(0);
lcd.setCharCursor(cursorCharPosition, 0); OLED::setCharCursor(cursorCharPosition, 0);
} }
static int userConfirmation(const char* message) { static int userConfirmation(const char* message) {
uint16_t messageWidth = FONT_12_WIDTH * (strlen(message) + 7); uint16_t messageWidth = FONT_12_WIDTH * (strlen(message) + 7);
uint32_t messageStart = xTaskGetTickCount(); uint32_t messageStart = xTaskGetTickCount();
lcd.setFont(0); OLED::setFont(0);
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
int16_t lastOffset = -1; int16_t lastOffset = -1;
bool lcdRefresh = true; bool lcdRefresh = true;
for (;;) { for (;;) {
int16_t messageOffset =
int16_t messageOffset = ((xTaskGetTickCount() - messageStart) ((xTaskGetTickCount() - messageStart) /
/ (systemSettings.descriptionScrollSpeed == 1 ? 1 : 2)); (systemSettings.descriptionScrollSpeed == 1 ? 1 : 2));
messageOffset %= messageWidth; // Roll around at the end messageOffset %= messageWidth; // Roll around at the end
if (lastOffset != messageOffset) { if (lastOffset != messageOffset) {
lcd.clearScreen(); OLED::clearScreen();
//^ Rolling offset based on time //^ Rolling offset based on time
lcd.setCursor((OLED_WIDTH - messageOffset), 0); OLED::setCursor((OLED_WIDTH - messageOffset), 0);
lcd.print(message); OLED::print(message);
lastOffset = messageOffset; lastOffset = messageOffset;
lcdRefresh = true; lcdRefresh = true;
} }
@@ -287,14 +314,14 @@ static int userConfirmation(const char* message) {
} }
if (lcdRefresh) { if (lcdRefresh) {
lcd.refresh(); OLED::refresh();
osDelay(40); osDelay(40);
lcdRefresh = false; lcdRefresh = false;
} }
} }
return 0; return 0;
} }
#ifdef MODEL_TS100
static void settings_setInputVRange(void) { static void settings_setInputVRange(void) {
systemSettings.cutoutSetting = (systemSettings.cutoutSetting + 1) % 5; systemSettings.cutoutSetting = (systemSettings.cutoutSetting + 1) % 5;
} }
@@ -303,29 +330,49 @@ static void settings_displayInputVRange(void) {
printShortDescription(0, 6); printShortDescription(0, 6);
if (systemSettings.cutoutSetting) { if (systemSettings.cutoutSetting) {
lcd.drawChar('0' + 2 + systemSettings.cutoutSetting); OLED::drawChar('0' + 2 + systemSettings.cutoutSetting);
lcd.drawChar('S'); OLED::drawChar('S');
} else { } else {
lcd.print("DC"); OLED::print("DC");
} }
} }
#else
static void settings_setInputPRange(void) {
systemSettings.cutoutSetting = (systemSettings.cutoutSetting + 1) % 2;
}
static void settings_displayInputPRange(void) {
printShortDescription(0, 5);
//0 = 18W, 1=24W
switch(systemSettings.cutoutSetting)
{
case 0:
OLED::print("18W");
break;
case 1:
OLED::print("24W");
break;
default:
break;
}
}
#endif
static void settings_setSleepTemp(void) { static void settings_setSleepTemp(void) {
// If in C, 10 deg, if in F 20 deg // If in C, 10 deg, if in F 20 deg
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
systemSettings.SleepTemp += 20; systemSettings.SleepTemp += 20;
if (systemSettings.SleepTemp > 580) if (systemSettings.SleepTemp > 580) systemSettings.SleepTemp = 120;
systemSettings.SleepTemp = 120;
} else { } else {
systemSettings.SleepTemp += 10; systemSettings.SleepTemp += 10;
if (systemSettings.SleepTemp > 300) if (systemSettings.SleepTemp > 300) systemSettings.SleepTemp = 50;
systemSettings.SleepTemp = 50;
} }
} }
static void settings_displaySleepTemp(void) { static void settings_displaySleepTemp(void) {
printShortDescription(1, 5); printShortDescription(1, 5);
lcd.printNumber(systemSettings.SleepTemp, 3); OLED::printNumber(systemSettings.SleepTemp, 3);
} }
static void settings_setSleepTime(void) { static void settings_setSleepTime(void) {
@@ -341,13 +388,13 @@ static void settings_setSleepTime(void) {
static void settings_displaySleepTime(void) { static void settings_displaySleepTime(void) {
printShortDescription(2, 5); printShortDescription(2, 5);
if (systemSettings.SleepTime == 0) { if (systemSettings.SleepTime == 0) {
lcd.print(OffString); OLED::print(OffString);
} else if (systemSettings.SleepTime < 6) { } else if (systemSettings.SleepTime < 6) {
lcd.printNumber(systemSettings.SleepTime * 10, 2); OLED::printNumber(systemSettings.SleepTime * 10, 2);
lcd.drawChar('S'); OLED::drawChar('S');
} else { } else {
lcd.printNumber(systemSettings.SleepTime - 5, 2); OLED::printNumber(systemSettings.SleepTime - 5, 2);
lcd.drawChar('M'); OLED::drawChar('M');
} }
} }
@@ -363,10 +410,10 @@ static void settings_setShutdownTime(void) {
static void settings_displayShutdownTime(void) { static void settings_displayShutdownTime(void) {
printShortDescription(3, 5); printShortDescription(3, 5);
if (systemSettings.ShutdownTime == 0) { if (systemSettings.ShutdownTime == 0) {
lcd.print(OffString); OLED::print(OffString);
} else { } else {
lcd.printNumber(systemSettings.ShutdownTime, 2); OLED::printNumber(systemSettings.ShutdownTime, 2);
lcd.drawChar('M'); OLED::drawChar('M');
} }
} }
@@ -383,10 +430,9 @@ static void settings_setTempF(void) {
// Change sleep, boost and soldering temps to the C equiv // Change sleep, boost and soldering temps to the C equiv
// F->C == C = ((F-32)*5)/9 // F->C == C = ((F-32)*5)/9
systemSettings.BoostTemp = ((systemSettings.BoostTemp - 32) * 5) / 9; systemSettings.BoostTemp = ((systemSettings.BoostTemp - 32) * 5) / 9;
systemSettings.SolderingTemp = ((systemSettings.SolderingTemp - 32) * 5) systemSettings.SolderingTemp =
/ 9; ((systemSettings.SolderingTemp - 32) * 5) / 9;
systemSettings.SleepTemp = ((systemSettings.SleepTemp - 32) * 5) / 9; systemSettings.SleepTemp = ((systemSettings.SleepTemp - 32) * 5) / 9;
} }
// Rescale both to be multiples of 10 // Rescale both to be multiples of 10
systemSettings.BoostTemp = systemSettings.BoostTemp / 10; systemSettings.BoostTemp = systemSettings.BoostTemp / 10;
@@ -395,13 +441,12 @@ static void settings_setTempF(void) {
systemSettings.SolderingTemp *= 10; systemSettings.SolderingTemp *= 10;
systemSettings.SleepTemp = systemSettings.SleepTemp / 10; systemSettings.SleepTemp = systemSettings.SleepTemp / 10;
systemSettings.SleepTemp *= 10; systemSettings.SleepTemp *= 10;
} }
static void settings_displayTempF(void) { static void settings_displayTempF(void) {
printShortDescription(5, 7); printShortDescription(5, 7);
lcd.drawChar((systemSettings.temperatureInF) ? 'F' : 'C'); OLED::drawChar((systemSettings.temperatureInF) ? 'F' : 'C');
} }
static void settings_setSensitivity(void) { static void settings_setSensitivity(void) {
@@ -411,7 +456,7 @@ static void settings_setSensitivity(void) {
static void settings_displaySensitivity(void) { static void settings_displaySensitivity(void) {
printShortDescription(4, 7); printShortDescription(4, 7);
lcd.printNumber(systemSettings.sensitivity, 1); OLED::printNumber(systemSettings.sensitivity, 1);
} }
static void settings_setAdvancedSolderingScreens(void) { static void settings_setAdvancedSolderingScreens(void) {
@@ -421,7 +466,7 @@ static void settings_setAdvancedSolderingScreens(void) {
static void settings_displayAdvancedSolderingScreens(void) { static void settings_displayAdvancedSolderingScreens(void) {
printShortDescription(15, 7); printShortDescription(15, 7);
lcd.drawCheckbox(systemSettings.detailedSoldering); OLED::drawCheckbox(systemSettings.detailedSoldering);
} }
static void settings_setAdvancedIDLEScreens(void) { static void settings_setAdvancedIDLEScreens(void) {
@@ -431,10 +476,9 @@ static void settings_setAdvancedIDLEScreens(void) {
static void settings_displayAdvancedIDLEScreens(void) { static void settings_displayAdvancedIDLEScreens(void) {
printShortDescription(6, 7); printShortDescription(6, 7);
lcd.drawCheckbox(systemSettings.detailedIDLE); OLED::drawCheckbox(systemSettings.detailedIDLE);
} }
static void settings_setScrollSpeed(void) { static void settings_setScrollSpeed(void) {
if (systemSettings.descriptionScrollSpeed == 0) if (systemSettings.descriptionScrollSpeed == 0)
systemSettings.descriptionScrollSpeed = 1; systemSettings.descriptionScrollSpeed = 1;
else else
@@ -442,9 +486,8 @@ static void settings_setScrollSpeed(void) {
} }
static void settings_displayScrollSpeed(void) { static void settings_displayScrollSpeed(void) {
printShortDescription(16, 7); printShortDescription(16, 7);
lcd.drawChar( OLED::drawChar((systemSettings.descriptionScrollSpeed) ? SettingFastChar
(systemSettings.descriptionScrollSpeed) ? : SettingSlowChar);
SettingFastChar : SettingSlowChar);
} }
static void settings_setDisplayRotation(void) { static void settings_setDisplayRotation(void) {
@@ -452,10 +495,10 @@ static void settings_setDisplayRotation(void) {
systemSettings.OrientationMode = systemSettings.OrientationMode % 3; systemSettings.OrientationMode = systemSettings.OrientationMode % 3;
switch (systemSettings.OrientationMode) { switch (systemSettings.OrientationMode) {
case 0: case 0:
lcd.setRotation(false); OLED::setRotation(false);
break; break;
case 1: case 1:
lcd.setRotation(true); OLED::setRotation(true);
break; break;
case 2: case 2:
// do nothing on auto // do nothing on auto
@@ -470,16 +513,16 @@ static void settings_displayDisplayRotation(void) {
switch (systemSettings.OrientationMode) { switch (systemSettings.OrientationMode) {
case 0: case 0:
lcd.drawChar(SettingRightChar); OLED::drawChar(SettingRightChar);
break; break;
case 1: case 1:
lcd.drawChar(SettingLeftChar); OLED::drawChar(SettingLeftChar);
break; break;
case 2: case 2:
lcd.drawChar(SettingAutoChar); OLED::drawChar(SettingAutoChar);
break; break;
default: default:
lcd.drawChar(SettingRightChar); OLED::drawChar(SettingRightChar);
break; break;
} }
} }
@@ -491,11 +534,10 @@ static void settings_setBoostModeEnabled(void) {
static void settings_displayBoostModeEnabled(void) { static void settings_displayBoostModeEnabled(void) {
printShortDescription(8, 7); printShortDescription(8, 7);
lcd.drawCheckbox(systemSettings.boostModeEnabled); OLED::drawCheckbox(systemSettings.boostModeEnabled);
} }
static void settings_setBoostTemp(void) { static void settings_setBoostTemp(void) {
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
systemSettings.BoostTemp += 20; // Go up 20F at a time systemSettings.BoostTemp += 20; // Go up 20F at a time
if (systemSettings.BoostTemp > 850) { if (systemSettings.BoostTemp > 850) {
@@ -511,7 +553,7 @@ static void settings_setBoostTemp(void) {
static void settings_displayBoostTemp(void) { static void settings_displayBoostTemp(void) {
printShortDescription(9, 5); printShortDescription(9, 5);
lcd.printNumber(systemSettings.BoostTemp, 3); OLED::printNumber(systemSettings.BoostTemp, 3);
} }
static void settings_setAutomaticStartMode(void) { static void settings_setAutomaticStartMode(void) {
@@ -521,7 +563,7 @@ static void settings_setAutomaticStartMode(void) {
static void settings_displayAutomaticStartMode(void) { static void settings_displayAutomaticStartMode(void) {
printShortDescription(10, 7); printShortDescription(10, 7);
lcd.drawCheckbox(systemSettings.autoStartMode); OLED::drawCheckbox(systemSettings.autoStartMode);
} }
static void settings_setCoolingBlinkEnabled(void) { static void settings_setCoolingBlinkEnabled(void) {
@@ -531,19 +573,19 @@ static void settings_setCoolingBlinkEnabled(void) {
static void settings_displayCoolingBlinkEnabled(void) { static void settings_displayCoolingBlinkEnabled(void) {
printShortDescription(11, 7); printShortDescription(11, 7);
lcd.drawCheckbox(systemSettings.coolingTempBlink); OLED::drawCheckbox(systemSettings.coolingTempBlink);
} }
static void settings_setResetSettings(void) { static void settings_setResetSettings(void) {
if (userConfirmation(SettingsResetWarning)) { if (userConfirmation(SettingsResetWarning)) {
resetSettings(); resetSettings();
lcd.setFont(0); OLED::setFont(0);
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
lcd.print("RESET OK"); OLED::print("RESET OK");
lcd.refresh(); OLED::refresh();
waitForButtonPressOrTimeout(200); waitForButtonPressOrTimeout(200); // 2 second timeout
} }
} }
@@ -554,58 +596,82 @@ static void settings_displayResetSettings(void) {
static void settings_setTipModel(void) { static void settings_setTipModel(void) {
systemSettings.tipType++; systemSettings.tipType++;
systemSettings.tipType %= (Tip_Custom + 1); // Wrap after custom systemSettings.tipType %= (Tip_Custom + 1); // Wrap after custom
} }
static void settings_displayTipModel(void) { static void settings_displayTipModel(void) {
printShortDescription(17, 4); printShortDescription(17, 4);
// Print in small text the tip model // Print in small text the tip model
lcd.setFont(1); OLED::setFont(1);
// set the cursor // set the cursor
// Print the mfg // Print the mfg
lcd.setCursor(40, 0); OLED::setCursor(40, 0);
if (systemSettings.tipType < Tip_MiniWare) { if (systemSettings.tipType < Tip_MiniWare) {
lcd.print("TS100"); #ifdef MODEL_TS100
} else if (systemSettings.tipType < Tip_Hakko) { OLED::print("TS100");
lcd.print("HAKKO"); #else
} else if (systemSettings.tipType == Tip_Custom) { OLED::print("TS80");
lcd.print("User"); #endif
} }
lcd.setCursor(40, 8); #ifdef MODEL_TS100
else if (systemSettings.tipType < Tip_Hakko) {
OLED::print("HAKKO");
}
#endif
else if (systemSettings.tipType == Tip_Custom) {
OLED::print("User");
}
OLED::setCursor(40, 8);
#ifdef MODEL_TS100
switch ((enum TipType)systemSettings.tipType) { switch ((enum TipType)systemSettings.tipType) {
case TS_B2: case TS_B2:
lcd.print(" B2 "); OLED::print(" B2 ");
break; break;
case TS_D24: case TS_D24:
lcd.print(" D24 "); OLED::print(" D24 ");
break; break;
case TS_BC2: case TS_BC2:
lcd.print(" BC2 "); OLED::print(" BC2 ");
break; break;
case TS_C1: case TS_C1:
lcd.print(" C1 "); OLED::print(" C1 ");
break; break;
case HAKKO_BC2: case HAKKO_BC2:
lcd.print(" BC2 "); OLED::print(" BC2 ");
break; break;
case Tip_Custom: case Tip_Custom:
lcd.print("Tuned"); OLED::print("Tuned");
break; break;
default: default:
lcd.print("????"); OLED::print("????");
break; break;
} }
#endif
#ifdef MODEL_TS80
// only 2 tips atm
switch ((enum TipType)systemSettings.tipType) {
case TS_B02:
OLED::print(" B02 ");
break;
case TS_D25:
OLED::print(" D25 ");
break;
case Tip_Custom:
OLED::print("Tuned");
break;
default:
OLED::print("????");
break;
} }
static void calibration_displaySimpleCal(void) { #endif
printShortDescription(18, 5);
} }
static void calibration_displaySimpleCal(void) { printShortDescription(18, 5); }
static void dotDelay() { static void dotDelay() {
for (uint8_t i = 0; i < 20; i++) { for (uint8_t i = 0; i < 20; i++) {
getTipRawTemp(1); //cycle through the filter a fair bit to ensure we're stable. getTipRawTemp(
lcd.clearScreen(); 1); // cycle through the filter a fair bit to ensure we're stable.
lcd.setCursor(0, 0); OLED::clearScreen();
for (uint8_t x = 0; x < i / 4; x++) OLED::setCursor(0, 0);
lcd.print("."); for (uint8_t x = 0; x < i / 4; x++) OLED::print(".");
lcd.refresh(); OLED::refresh();
osDelay(50); osDelay(50);
} }
} }
@@ -613,18 +679,20 @@ static void setTipOffset() {
setCalibrationOffset(0); // turn off the current offset setCalibrationOffset(0); // turn off the current offset
dotDelay(); dotDelay();
//If the thermocouple at the end of the tip, and the handle are at equalibrium, then the output should be zero, as there is no temperature differential. // If the thermocouple at the end of the tip, and the handle are at
// equalibrium, then the output should be zero, as there is no temperature
// differential.
int32_t offset = 0; int32_t offset = 0;
for (uint8_t i = 0; i < 15; i++) { for (uint8_t i = 0; i < 15; i++) {
offset += getTipRawTemp(1); //cycle through the filter a fair bit to ensure we're stable. offset += getTipRawTemp(
1); // cycle through the filter a fair bit to ensure we're stable.
lcd.clearScreen(); OLED::clearScreen();
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
for (uint8_t x = 0; x < i / 4; x++) for (uint8_t x = 0; x < i / 4; x++) OLED::print(".");
lcd.print("."); OLED::refresh();
lcd.refresh();
osDelay(200); osDelay(200);
} }
systemSettings.CalibrationOffset = offset / 15; systemSettings.CalibrationOffset = offset / 15;
@@ -637,16 +705,18 @@ static void calibration_enterSimpleCal(void) {
// User has confirmed their handle is at ambient // User has confirmed their handle is at ambient
// So take the offset measurement // So take the offset measurement
setTipOffset(); setTipOffset();
//Next we want the user to put the tip into 100C water so we can calculate their tip's gain // Next we want the user to put the tip into 100C water so we can calculate
//Gain is the m term from rise/run plot of raw readings vs (tip-handle) // their tip's gain Gain is the m term from rise/run plot of raw readings vs
//Thus we want to calculate ([TipRawHot-TipRawCold])/(ActualHot-HandleHot)-(ActualCold-HandleCold) // (tip-handle) Thus we want to calculate
//Thus we first need to store -> TiprawCold,HandleCold,ActualCold==HandleCold -> RawTipCold // ([TipRawHot-TipRawCold])/(ActualHot-HandleHot)-(ActualCold-HandleCold)
// Thus we first need to store ->
// TiprawCold,HandleCold,ActualCold==HandleCold -> RawTipCold
uint32_t RawTipCold = getTipRawTemp(0) * 10; uint32_t RawTipCold = getTipRawTemp(0) * 10;
lcd.clearScreen(); OLED::clearScreen();
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
lcd.setFont(1); OLED::setFont(1);
lcd.print("Please Insert Tip\nInto Boiling Water"); OLED::print("Please Insert Tip\nInto Boiling Water");
lcd.refresh(); OLED::refresh();
osDelay(200); osDelay(200);
waitForButtonPress(); waitForButtonPress();
dotDelay(); // cycle the filter a bit dotDelay(); // cycle the filter a bit
@@ -658,22 +728,22 @@ static void calibration_enterSimpleCal(void) {
uint32_t gain = (RawTipHot - RawTipCold) / (100 - HandleTempHot); uint32_t gain = (RawTipHot - RawTipCold) / (100 - HandleTempHot);
// Show this to the user // Show this to the user
lcd.clearScreen(); OLED::clearScreen();
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
lcd.print("Your G: "); OLED::print("Your G: ");
lcd.printNumber(gain, 6); OLED::printNumber(gain, 6);
lcd.print("\n~= 120-140"); OLED::print("\n~= 120-140");
lcd.refresh(); OLED::refresh();
osDelay(2000); osDelay(2000);
waitForButtonPress(); waitForButtonPress();
lcd.clearScreen(); OLED::clearScreen();
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
lcd.print("H: "); OLED::print("H: ");
lcd.printNumber(RawTipHot, 8); OLED::printNumber(RawTipHot, 8);
lcd.setCursor(0, 8); OLED::setCursor(0, 8);
lcd.print("C: "); OLED::print("C: ");
lcd.printNumber(RawTipCold, 8); OLED::printNumber(RawTipCold, 8);
lcd.refresh(); OLED::refresh();
osDelay(2000); osDelay(2000);
waitForButtonPress(); waitForButtonPress();
} }
@@ -721,22 +791,22 @@ static void calibration_enterAdvancedCal(void) {
systemSettings.customTipGain = 200; systemSettings.customTipGain = 200;
else if (systemSettings.customTipGain <= 100) else if (systemSettings.customTipGain <= 100)
systemSettings.customTipGain = 100; systemSettings.customTipGain = 100;
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
lcd.clearScreen(); OLED::clearScreen();
lcd.setFont(0); OLED::setFont(0);
if (lcd.getRotation()) if (OLED::getRotation())
lcd.drawChar('-'); OLED::drawChar('-');
else else
lcd.drawChar('+'); OLED::drawChar('+');
lcd.drawChar(' '); OLED::drawChar(' ');
lcd.printNumber(systemSettings.customTipGain, 4); OLED::printNumber(systemSettings.customTipGain, 4);
lcd.drawChar(' '); OLED::drawChar(' ');
if (lcd.getRotation()) if (OLED::getRotation())
lcd.drawChar('+'); OLED::drawChar('+');
else else
lcd.drawChar('-'); OLED::drawChar('-');
lcd.refresh(); OLED::refresh();
GUIDelay(); GUIDelay();
} }
// Wait for the user to confirm the exit message that the calibration is done // Wait for the user to confirm the exit message that the calibration is done
@@ -754,32 +824,30 @@ static void settings_setCalibrate(void) {
} }
// Else // Else
// Ask user if handle is at the tip temperature // Ask user if handle is at the tip temperature
// Any error between handle and the tip will be a direct offset in the control loop // Any error between handle and the tip will be a direct offset in the control
// loop
else if (userConfirmation(SettingsCalibrationWarning)) { else if (userConfirmation(SettingsCalibrationWarning)) {
// User confirmed // User confirmed
// So we now perform the actual calculation // So we now perform the actual calculation
setTipOffset(); setTipOffset();
} }
} }
static void settings_displayCalibrate(void) { static void settings_displayCalibrate(void) { printShortDescription(12, 5); }
printShortDescription(12, 5);
}
static void settings_setCalibrateVIN(void) { static void settings_setCalibrateVIN(void) {
// Jump to the voltage calibration subscreen // Jump to the voltage calibration subscreen
lcd.setFont(0); OLED::setFont(0);
lcd.clearScreen(); OLED::clearScreen();
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
for (;;) { for (;;) {
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, 2); OLED::printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, 2);
lcd.print("."); OLED::print(".");
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10, 1); OLED::printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10, 1);
lcd.print("V"); OLED::print("V");
ButtonState buttons = getButtonState(); ButtonState buttons = getButtonState();
switch (buttons) { switch (buttons) {
@@ -802,7 +870,7 @@ static void settings_setCalibrateVIN(void) {
break; break;
} }
lcd.refresh(); OLED::refresh();
osDelay(40); osDelay(40);
// Cap to sensible values // Cap to sensible values
@@ -816,42 +884,24 @@ static void settings_setCalibrateVIN(void) {
static void displayMenu(size_t index) { static void displayMenu(size_t index) {
// Call into the menu // Call into the menu
lcd.setFont(1); OLED::setFont(1);
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
// Draw title // Draw title
lcd.print(SettingsMenuEntries[index]); OLED::print(SettingsMenuEntries[index]);
// Draw symbol // Draw symbol
// 16 pixel wide image // 16 pixel wide image
lcd.drawArea(96 - 16, 0, 16, 16, (&SettingsMenuIcons[(16 * 2) * index])); OLED::drawArea(96 - 16, 0, 16, 16, (&SettingsMenuIcons[(16 * 2) * index]));
} }
static void settings_displayCalibrateVIN(void) { static void settings_displayCalibrateVIN(void) { printShortDescription(14, 5); }
printShortDescription(14, 5); static void settings_displaySolderingMenu(void) { displayMenu(0); }
} static void settings_enterSolderingMenu(void) { gui_Menu(solderingMenu); }
static void settings_displaySolderingMenu(void) { static void settings_displayPowerMenu(void) { displayMenu(1); }
displayMenu(0); static void settings_enterPowerMenu(void) { gui_Menu(PowerMenu); }
} static void settings_displayUIMenu(void) { displayMenu(2); }
static void settings_enterSolderingMenu(void) { static void settings_enterUIMenu(void) { gui_Menu(UIMenu); }
gui_Menu(solderingMenu); static void settings_displayAdvancedMenu(void) { displayMenu(3); }
} static void settings_enterAdvancedMenu(void) { gui_Menu(advancedMenu); }
static void settings_displayPowerMenu(void) {
displayMenu(1);
}
static void settings_enterPowerMenu(void) {
gui_Menu(PowerMenu);
}
static void settings_displayUIMenu(void) {
displayMenu(2);
}
static void settings_enterUIMenu(void) {
gui_Menu(UIMenu);
}
static void settings_displayAdvancedMenu(void) {
displayMenu(3);
}
static void settings_enterAdvancedMenu(void) {
gui_Menu(advancedMenu);
}
void gui_Menu(const menuitem* menu) { void gui_Menu(const menuitem* menu) {
// Draw the settings menu and provide iteration support etc // Draw the settings menu and provide iteration support etc
@@ -865,38 +915,36 @@ void gui_Menu(const menuitem* menu) {
ButtonState lastButtonState = BUTTON_NONE; ButtonState lastButtonState = BUTTON_NONE;
while ((menu[currentScreen].draw.func != NULL) && earlyExit == false) { while ((menu[currentScreen].draw.func != NULL) && earlyExit == false) {
lcd.setFont(0); OLED::setFont(0);
lcd.setCursor(0, 0); OLED::setCursor(0, 0);
// If the user has hesitated for >=3 seconds, show the long text // If the user has hesitated for >=3 seconds, show the long text
// Otherwise "draw" the option // Otherwise "draw" the option
if (xTaskGetTickCount() - lastButtonTime < 300) { if ((xTaskGetTickCount() - lastButtonTime < 300) ||
lcd.clearScreen(); menu[currentScreen].description == NULL) {
OLED::clearScreen();
menu[currentScreen].draw.func(); menu[currentScreen].draw.func();
lastOffset = -1; lastOffset = -1;
lcdRefresh = true; lcdRefresh = true;
} else { } else {
// Draw description // Draw description
if (descriptionStart == 0) if (descriptionStart == 0) descriptionStart = xTaskGetTickCount();
descriptionStart = xTaskGetTickCount();
// lower the value - higher the speed // lower the value - higher the speed
int16_t descriptionWidth = FONT_12_WIDTH int16_t descriptionWidth =
* (strlen(menu[currentScreen].description) + 7); FONT_12_WIDTH * (strlen(menu[currentScreen].description) + 7);
int16_t descriptionOffset = int16_t descriptionOffset =
((xTaskGetTickCount() - descriptionStart) ((xTaskGetTickCount() - descriptionStart) /
/ (systemSettings.descriptionScrollSpeed == 1 ? (systemSettings.descriptionScrollSpeed == 1 ? 1 : 2));
1 : 2));
descriptionOffset %= descriptionWidth; // Roll around at the end descriptionOffset %= descriptionWidth; // Roll around at the end
if (lastOffset != descriptionOffset) { if (lastOffset != descriptionOffset) {
lcd.clearScreen(); OLED::clearScreen();
//^ Rolling offset based on time //^ Rolling offset based on time
lcd.setCursor((OLED_WIDTH - descriptionOffset), 0); OLED::setCursor((OLED_WIDTH - descriptionOffset), 0);
lcd.print(menu[currentScreen].description); OLED::print(menu[currentScreen].description);
lastOffset = descriptionOffset; lastOffset = descriptionOffset;
lcdRefresh = true; lcdRefresh = true;
} }
} }
ButtonState buttons = getButtonState(); ButtonState buttons = getButtonState();
@@ -928,8 +976,8 @@ void gui_Menu(const menuitem* menu) {
descriptionStart = 0; descriptionStart = 0;
break; break;
case BUTTON_F_LONG: case BUTTON_F_LONG:
if (xTaskGetTickCount() - autoRepeatTimer if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration >
+ autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) { PRESS_ACCEL_INTERVAL_MAX) {
menu[currentScreen].incrementHandler.func(); menu[currentScreen].incrementHandler.func();
autoRepeatTimer = xTaskGetTickCount(); autoRepeatTimer = xTaskGetTickCount();
descriptionStart = 0; descriptionStart = 0;
@@ -938,8 +986,8 @@ void gui_Menu(const menuitem* menu) {
} }
break; break;
case BUTTON_B_LONG: case BUTTON_B_LONG:
if (xTaskGetTickCount() - autoRepeatTimer if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration >
+ autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) { PRESS_ACCEL_INTERVAL_MAX) {
currentScreen++; currentScreen++;
autoRepeatTimer = xTaskGetTickCount(); autoRepeatTimer = xTaskGetTickCount();
descriptionStart = 0; descriptionStart = 0;
@@ -952,19 +1000,18 @@ void gui_Menu(const menuitem* menu) {
break; break;
} }
if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) <
< PRESS_ACCEL_INTERVAL_MIN) { PRESS_ACCEL_INTERVAL_MIN) {
autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX autoRepeatAcceleration =
- PRESS_ACCEL_INTERVAL_MIN; PRESS_ACCEL_INTERVAL_MAX - PRESS_ACCEL_INTERVAL_MIN;
} }
if (lcdRefresh) { if (lcdRefresh) {
lcd.refresh(); // update the LCD OLED::refresh(); // update the LCD
osDelay(40); osDelay(40);
lcdRefresh = false; lcdRefresh = false;
} }
} }
} }
void enterSettingsMenu() { void enterSettingsMenu() {

View File

@@ -7,6 +7,8 @@
// These are all the functions for interacting with the hardware // These are all the functions for interacting with the hardware
#include "hardware.h" #include "hardware.h"
#include "FreeRTos.h"
#include "stm32f1xx_hal.h"
volatile uint16_t PWMSafetyTimer = 0; volatile uint16_t PWMSafetyTimer = 0;
volatile int16_t CalibrationTempOffset = 0; volatile int16_t CalibrationTempOffset = 0;
uint16_t tipGainCalValue = 0; uint16_t tipGainCalValue = 0;
@@ -22,22 +24,21 @@ void setCalibrationOffset(int16_t offSet) {
} }
uint16_t getHandleTemperature() { uint16_t getHandleTemperature() {
// We return the current handle temperature in X10 C // We return the current handle temperature in X10 C
// TMP36 in handle, 0.5V offset and then 10mV per deg C (0.75V @ 25C for example) // TMP36 in handle, 0.5V offset and then 10mV per deg C (0.75V @ 25C for
// STM32 = 4096 count @ 3.3V input -> But // example) STM32 = 4096 count @ 3.3V input -> But We oversample by 32/(2^2) =
// We oversample by 32/(2^2) = 8 times oversampling // 8 times oversampling Therefore 32768 is the 3.3V input, so 0.1007080078125
// Therefore 32768 is the 3.3V input, so 0.201416015625 mV per count // mV per count So we need to subtract an offset of 0.5V to center on 0C
// So we need to subtract an offset of 0.5V to center on 0C (2482*2 counts) // (4964.8 counts)
// //
uint16_t result = getADC(0); int32_t result = getADC(0);
if (result < 4964) result -= 4965; // remove 0.5V offset
return 0; // 10mV per C
result -= 4964; //remove 0.5V offset // 99.29 counts per Deg C above 0C
result /= 10; //convert to X10 C result *= 10;
result /= 993;
return result; return result;
} }
uint16_t tipMeasurementToC(uint16_t raw) { uint16_t tipMeasurementToC(uint16_t raw) {
//((Raw Tip-RawOffset) * calibrationgain) / 1000 = tip delta in CX10 //((Raw Tip-RawOffset) * calibrationgain) / 1000 = tip delta in CX10
// tip delta in CX10 + handleTemp in CX10 = tip absolute temp in CX10 // tip delta in CX10 + handleTemp in CX10 = tip absolute temp in CX10
// Div answer by 10 to get final result // Div answer by 10 to get final result
@@ -47,7 +48,6 @@ uint16_t tipMeasurementToC(uint16_t raw) {
tipDelta += getHandleTemperature(); tipDelta += getHandleTemperature();
return tipDelta / 10; return tipDelta / 10;
} }
uint16_t ctoTipMeasurement(uint16_t temp) { uint16_t ctoTipMeasurement(uint16_t temp) {
//[ (temp-handle/10) * 10000 ]/calibrationgain = tip raw delta //[ (temp-handle/10) * 10000 ]/calibrationgain = tip raw delta
@@ -61,35 +61,32 @@ uint16_t ctoTipMeasurement(uint16_t temp) {
uint16_t tipMeasurementToF(uint16_t raw) { uint16_t tipMeasurementToF(uint16_t raw) {
// Convert result from C to F // Convert result from C to F
return (tipMeasurementToC(raw) * 9) / 5 + 32; return (tipMeasurementToC(raw) * 9) / 5 + 32;
} }
uint16_t ftoTipMeasurement(uint16_t temp) { uint16_t ftoTipMeasurement(uint16_t temp) {
// Convert the temp back to C from F // Convert the temp back to C from F
return ctoTipMeasurement(((temp - 32) * 5) / 9); return ctoTipMeasurement(((temp - 32) * 5) / 9);
} }
uint16_t __attribute__ ((long_call, section (".data.ramfuncs"))) getTipInstantTemperature() { uint16_t getTipInstantTemperature() {
uint16_t sum; uint16_t sum;
sum = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_1); sum = hadc1.Instance->JDR1;
sum += HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_2); sum += hadc1.Instance->JDR2;
sum += HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_3); sum += hadc1.Instance->JDR3;
sum += HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_4); sum += hadc1.Instance->JDR4;
sum += HAL_ADCEx_InjectedGetValue(&hadc2, ADC_INJECTED_RANK_1); sum += hadc2.Instance->JDR1;
sum += HAL_ADCEx_InjectedGetValue(&hadc2, ADC_INJECTED_RANK_2); sum += hadc2.Instance->JDR2;
sum += HAL_ADCEx_InjectedGetValue(&hadc2, ADC_INJECTED_RANK_3); sum += hadc2.Instance->JDR3;
sum += HAL_ADCEx_InjectedGetValue(&hadc2, ADC_INJECTED_RANK_4); sum += hadc2.Instance->JDR4;
return sum; // 8x over sample return sum; // 8x over sample
} }
/* /*
* Loopup table for the tip calibration values for * Loopup table for the tip calibration values for
* the gain of the tip's * the gain of the tip's
* This can be found by line of best fit of TipRaw on X, and TipTemp-handle on Y. * This can be found by line of best fit of TipRaw on X, and TipTemp-handle on
* Then take the m term * 10000 * Y. Then take the m term * 10000
* */ * */
uint16_t lookupTipDefaultCalValue(enum TipType tipID) { uint16_t lookupTipDefaultCalValue(enum TipType tipID) {
#ifdef MODEL_TS100
switch (tipID) { switch (tipID) {
case TS_D24: case TS_D24:
return 141; return 141;
@@ -106,10 +103,22 @@ uint16_t lookupTipDefaultCalValue(enum TipType tipID) {
return 132; // make this the average of all return 132; // make this the average of all
break; break;
} }
#else
switch (tipID) {
case TS_D25:
return 154;
break;
case TS_B02:
return 154;
break;
default:
return 154; // make this the average of all
break;
}
#endif
} }
uint16_t __attribute__ ((long_call, section (".data.ramfuncs"))) getTipRawTemp( uint16_t getTipRawTemp(uint8_t instant) {
uint8_t instant) {
static int64_t filterFP = 0; static int64_t filterFP = 0;
static uint16_t lastSample = 0; static uint16_t lastSample = 0;
const uint8_t filterBeta = 7; // higher values smooth out more, but reduce responsiveness const uint8_t filterBeta = 7; // higher values smooth out more, but reduce responsiveness
@@ -157,27 +166,277 @@ uint16_t getInputVoltageX10(uint16_t divisor) {
preFillneeded = 1; preFillneeded = 1;
return sum * 4 / divisor; return sum * 4 / divisor;
} }
#ifdef MODEL_TS80
uint8_t QCMode = 0;
void seekQC(int16_t Vx10) {
if (QCMode <= 1)
return; // NOT connected to a QC Charger
if (Vx10 < 50)
return;
// Seek the QC to the Voltage given if this adapter supports continuous mode
// try and step towards the wanted value
// 1. Measure current voltage
int16_t vStart = getInputVoltageX10(195);
int difference = Vx10 - vStart;
// 2. calculate ideal steps (0.2V changes)
int steps = difference / 2;
if (QCMode == 3) {
while (steps < 0) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
vTaskDelay(3);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
vTaskDelay(3);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_IWDG_Refresh(&hiwdg);
vTaskDelay(3);
steps++;
}
while (steps > 0) {
// step once up
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
vTaskDelay(3);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
vTaskDelay(3);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_IWDG_Refresh(&hiwdg);
vTaskDelay(3);
steps--;
}
}
// Re-measure
/* Disabled due to nothing to test and code space of around 1k*/
#ifdef QC2_ROUND_DOWN
steps = vStart - getInputVoltageX10(195);
if (steps < 0) steps = -steps;
if (steps > (difference / 2)) {
// No continuous mode, so QC2
QCMode = 2;
// Goto nearest
if (Vx10 > 10.5) {
// request 12V
// D- = 0.6V, D+ = 0.6V
// Clamp PB3
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);// pull down D+
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
} else {
// request 9V
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
}
}
#endif
}
// Must be called after FreeRToS Starts
void startQC() {
// Pre check that the input could be >5V already, and if so, dont both
// negotiating as someone is feeding in hv
uint16_t vin = getInputVoltageX10(205);
if (vin > 150)
return;// Over voltage
if (vin > 100) {
QCMode = 1; // ALready at ~12V
return;
}
GPIO_InitTypeDef GPIO_InitStruct;
// Tries to negotiate QC for 9V
// This is a multiple step process.
// 1. Set around 0.6V on D+ for 1.25 Seconds or so
// 2. After this It should un-short D+->D- and instead add a 20k pulldown on
// D-
// 3. Now set D+ to 3.3V and D- to 0.6V to request 9V
// OR both at 0.6V for 12V request (if the adapter can do it).
// If 12V is implimented then should fallback to 9V after validation
// Step 1. We want to pull D+ to 0.6V
// Pull PB3 donwn to ground
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);// pull low to put 0.6V on D+
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);// pull low to put 0.6V on D+
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Delay 1.25 seconds
uint8_t enteredQC = 0;
for (uint16_t i = 0; i < 130 && enteredQC == 0; i++) {
// HAL_Delay(10);
vTaskDelay(1);
HAL_IWDG_Refresh(&hiwdg);
}
// Check if D- is low to spot a QC charger
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET)
enteredQC = 1;
if (enteredQC) {
// We have a QC capable charger
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_8;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_IWDG_Refresh(&hiwdg);
// Wait for frontend ADC to stabilise
QCMode = 4;
for (uint8_t i = 0; i < 10; i++) {
if (getInputVoltageX10(195) > 80) {
// yay we have at least QC2.0 or QC3.0
QCMode = 3;// We have at least QC2, pray for 3
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
return;
}
vTaskDelay(10); // 100mS
}
QCMode = 0;
// No QC / not working to us
} else {
// no QC
}
}
// Get tip resistance in milliohms
uint32_t calculateTipR(uint8_t useFilter) {
// We inject a small current into the front end of the iron,
// By measuring the Vdrop over the tip we can calculate the resistance
// Turn PA0 into an output and drive high to inject (3.3V-0.6)/(6K8+Rtip)
// current PA0->Diode -> 6K8 -> Tip -> GND So the op-amp will amplify the
// small signal across the tip and convert this into an easily read voltage
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);// Set low first
setTipPWM(0);
vTaskDelay(1);
uint32_t offReading = getTipInstantTemperature();
for (uint8_t i = 0; i < 24; i++) {
if (useFilter == 0) {
vTaskDelay(1); // delay to allow it too stabilize
offReading += getTipInstantTemperature();
} else {
offReading += getTipRawTemp(0);
}
}
// Turn on
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);// Set low first
vTaskDelay(1);// delay to allow it too stabilize
uint32_t onReading = getTipInstantTemperature();
for (uint8_t i = 0; i < 24; i++) {
if (useFilter == 0) {
vTaskDelay(1); // delay to allow it too stabilize
onReading += getTipInstantTemperature();
} else {
onReading += getTipRawTemp(0);
}
}
uint32_t difference = onReading - offReading;
// V = IR, therefore I = V/R
// We can divide this reading by a known "gain" to get the resulting
// resistance This was determined emperically This tip is 4.688444162 ohms,
// 4688 milliohms (Measured using 4 terminal measurement) 25x oversampling
// reads this as around 47490 Almost perfectly 10x the milliohms value This
// will drift massively with tip temp However we really only need 10x ohms
return (difference / 10) + 1;// ceil
}
static unsigned int sqrt32(unsigned long n) {
unsigned int c = 0x8000;
unsigned int g = 0x8000;
for (;;) {
if (g * g > n)
g ^= c;
c >>= 1;
if (c == 0)
return g;
g |= c;
}
}
int16_t calculateMaxVoltage(uint8_t useFilter, uint8_t useHP) {
// This measures the tip resistance, then it calculates the appropriate
// voltage To stay under ~18W. Mosfet is "9A", so no issues there
// QC3.0 supports up to 18W, which is 2A @9V and 1.5A @12V
uint32_t milliOhms = calculateTipR(useFilter);
// Check no tip
if (milliOhms > 10000)
return -1;
//
// V = sqrt(18W*R)
// Convert this to sqrt(18W)*sqrt(milli ohms)*sqrt(1/1000)
uint32_t Vx = sqrt32(milliOhms);
if (useHP)
Vx *= 1549;//sqrt(24)*sqrt(1/1000)
else
Vx *= 1342;// sqrt(18) * sqrt(1/1000)
// Round to nearest 200mV,
// So divide by 100 to start, to get in Vxx
Vx /= 100;
if (Vx % 10 >= 5)
Vx += 10;
Vx /= 10;
// Round to nearest increment of 2
if (Vx % 2 == 1)
Vx++;
return Vx;
}
#endif
volatile uint32_t pendingPWM = 0; volatile uint32_t pendingPWM = 0;
uint8_t getTipPWM() { uint8_t getTipPWM() {
return pendingPWM; return pendingPWM;
} }
void __attribute__ ((long_call, section (".data.ramfuncs"))) setTipPWM(uint8_t pulse) { void setTipPWM(uint8_t pulse) {
PWMSafetyTimer = 2; //This is decremented in the handler for PWM so that the tip pwm is disabled if the PID task is not scheduled often enough. PWMSafetyTimer = 2; // This is decremented in the handler for PWM so that the tip pwm is
// disabled if the PID task is not scheduled often enough.
if (pulse > 100) if (pulse > 100)
pulse = 100; pulse = 100;
pendingPWM = pulse; pendingPWM = pulse;
} }
//These are called by the HAL after the corresponding events from the system timers. // These are called by the HAL after the corresponding events from the system
// timers.
void __attribute__ ((long_call, section (".data.ramfuncs"))) HAL_TIM_PeriodElapsedCallback( void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
TIM_HandleTypeDef *htim) {
// Period has elapsed // Period has elapsed
if (htim->Instance == TIM2) { if (htim->Instance == TIM2) {
// we want to turn on the output again // we want to turn on the output again
PWMSafetyTimer--; //We decrement this safety value so that lockups in the scheduler will not cause the PWM to become locked in an active driving state. PWMSafetyTimer--; // We decrement this safety value so that lockups in the
//While we could assume this could never happen, its a small price for increased safety // scheduler will not cause the PWM to become locked in an
// active driving state.
// While we could assume this could never happen, its a small price for
// increased safety
htim2.Instance->CCR4 = pendingPWM; htim2.Instance->CCR4 = pendingPWM;
if (htim2.Instance->CCR4 && PWMSafetyTimer) { if (htim2.Instance->CCR4 && PWMSafetyTimer) {
htim3.Instance->CCR1 = 50; htim3.Instance->CCR1 = 50;
@@ -192,15 +451,12 @@ void __attribute__ ((long_call, section (".data.ramfuncs"))) HAL_TIM_PeriodElaps
} }
} }
void __attribute__ ((long_call, section (".data.ramfuncs"))) HAL_TIM_PWM_PulseFinishedCallback( void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) { if (htim->Instance == TIM2) {
// This was a when the PWM for the output has timed out // This was a when the PWM for the output has timed out
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4) {
HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
htim3.Instance->CCR1 = 0; htim3.Instance->CCR1 = 0;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -41,18 +41,6 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
if (hadc->Instance == ADC1) { if (hadc->Instance == ADC1) {
__HAL_RCC_ADC1_CLK_ENABLE() __HAL_RCC_ADC1_CLK_ENABLE()
; ;
/**ADC1 GPIO Configuration
PA7 ------> ADC1_IN7
PB0 ------> ADC1_IN8
PB1 ------> ADC1_IN9
*/
GPIO_InitStruct.Pin = TMP36_INPUT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(TMP36_INPUT_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = TIP_TEMP_Pin | VIN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* ADC1 DMA Init */ /* ADC1 DMA Init */
/* ADC1 Init */ /* ADC1 Init */
@@ -100,7 +88,7 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin; GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Peripheral clock enable */ /* Peripheral clock enable */

View File

@@ -45,25 +45,12 @@ void _exit (int status)
int _read (int file, char *ptr, int len) int _read (int file, char *ptr, int len)
{ {
int DataIdx; return 0;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
*ptr++ = __io_getchar();
}
return len;
} }
int _write(int file, char *ptr, int len) int _write(int file, char *ptr, int len)
{ {
int DataIdx; return 0;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
} }
caddr_t _sbrk(int incr) caddr_t _sbrk(int incr)

View File

@@ -165,11 +165,6 @@
<type>1</type> <type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/TS100/inc/stm32f1xx_it.h</locationURI> <locationURI>PARENT-1-PROJECT_LOC/TS100/inc/stm32f1xx_it.h</locationURI>
</link> </link>
<link>
<name>inc/uRender.hpp</name>
<type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/TS100/inc/uRender.hpp</locationURI>
</link>
<link> <link>
<name>src/FRToSI2C.cpp</name> <name>src/FRToSI2C.cpp</name>
<type>1</type> <type>1</type>
@@ -250,11 +245,6 @@
<type>1</type> <type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/TS100/src/system_stm32f1xx.c</locationURI> <locationURI>PARENT-1-PROJECT_LOC/TS100/src/system_stm32f1xx.c</locationURI>
</link> </link>
<link>
<name>src/uRender.cpp</name>
<type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/TS100/src/uRender.cpp</locationURI>
</link>
<link> <link>
<name>startup/startup_stm32.s</name> <name>startup/startup_stm32.s</name>
<type>1</type> <type>1</type>

View File

@@ -4,7 +4,7 @@
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> <extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.atollic.truestudio.mbs.GCCSpecsDetectorAtollicArm" console="false" env-hash="296187985853974766" id="com.atollic.truestudio.mbs.provider" keep-relative-paths="false" name="Atollic ARM Tools Language Settings" parameter="${COMMAND} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="com.atollic.truestudio.mbs.GCCSpecsDetectorAtollicArm" console="false" env-hash="100391687907069452" id="com.atollic.truestudio.mbs.provider" keep-relative-paths="false" name="Atollic ARM Tools Language Settings" parameter="${COMMAND} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>