Compare commits

..

28 Commits

Author SHA1 Message Date
Ben V. Brown
4718efe79b 2.04 bugfixes
Should help with UI lockups
2018-05-07 21:24:29 +10:00
Ben V. Brown
771f0a1b9e Cleanup LCD on/off commands into buffer 2018-05-06 20:06:16 +10:00
Ben V. Brown
1fef2fb53a Move OLED LCD update to be DMA'ed
Start Cleaning up I2C HAL
2018-05-06 18:56:38 +10:00
Ben V. Brown
bf1fa74d72 Update debug info
Change pin configs
Clean up some code
2018-05-06 18:01:34 +10:00
freetushkan
1ae8b2f216 Additional changes in russian localization (#284)
Changes in russian localization (typos, improvements, machine translation replacements). I'd like to maintain this in the future.
2018-05-05 14:55:15 +10:00
Jan Krupička
98ed6be197 factory reset as last item (again) (#282) 2018-05-05 14:54:48 +10:00
freetushkan
19240f2ae5 Some changes in russian localisation (#276) 2018-04-30 08:58:14 +10:00
Ben V. Brown
dd2fdbcb8e Fix button lockout
Fixes #278
2018-04-28 11:46:07 +10:00
Ben V. Brown
42db57da25 Update power indicator
Fixes and closes #211
Final 2.04 release coming up :)
2018-04-27 15:25:58 +10:00
Ben V. Brown
b6351f9696 Add showing the tip temp on idle (#226)
This shows the tip temp on the simple home screen if the temp is > 50C.

This removes the tip temp warning for all users, as now everyone can see the tip temp.

#187
2018-04-27 14:46:59 +10:00
Leonid
bf7f1f5062 typo (#272) 2018-04-20 12:44:07 +10:00
Ben V. Brown
6500eb5eed FI Updates
#267
2018-04-14 18:05:13 +10:00
Ben V. Brown
311d5182eb Cleanup formatting 2018-04-14 17:58:28 +10:00
Ben V. Brown
88ea45d8c8 Fix OLED leftover task calls 2018-04-14 17:05:26 +10:00
Ben V. Brown
576575d7ba More FRToS I2C cleanup 2018-04-14 16:33:16 +10:00
Ben V. Brown
7c1937b412 Adding FreeRToS constructs to I2C driver 2018-04-14 15:05:46 +10:00
Ben V. Brown
f599624b6f I2C into nicer wrapper for FreeRToS 2018-04-14 13:37:42 +10:00
Ben V. Brown
cc09157106 Fix UK -> UA for Ukrainian
#261
2018-04-13 17:27:22 +10:00
Ben V. Brown
586267f586 PID retune, ADC Blocks PID properly 2018-04-13 16:19:05 +10:00
Ben V. Brown
f2f20111b6 Force settings reset for 2.04
Also updates FI to #267 but wont be built in releases until string lengths fit.
2018-04-13 10:11:50 +10:00
Ben V. Brown
58061e3c26 Drop SE, add FI 2018-04-13 09:51:03 +10:00
Ben V. Brown
f04cca8677 Create LICENSE 2018-04-11 11:46:40 +10:00
Ben V. Brown
79477685bd Update Settings reset to always zero,
Update GUI for temp setting to round to 10 increments.
2018-04-11 09:58:35 +10:00
Denis Goncharov
a062317e7a Minor corrections of Russian localization (#262)
* Minor corrections of Russian localization

* Russian Translition - Automatic start mode

Changed the description and the header of the "Automatic start mode" mode, since now it is turned on by the checkbox and not by the T/S/F.  
TODO: For other languages, the inaccuracy of this description has remained.

* Russian Translition

Slight fix.

* Ukrainian localization

Added Ukrainian localization. Translation is implemented by natural native speakers.

* LANG_UA -> LANG_UK
2018-04-09 08:00:49 +10:00
Denis Goncharov
2928e4d39c add UK (#265) 2018-04-09 08:00:32 +10:00
Ben V. Brown
c9cfe965ef Add more F support, protect I2C on accel2 orientation 2018-04-06 13:13:37 +10:00
federck
080ca31890 Update Translation.cpp (#260)
* Update Translation.cpp

Fixes russian double line string + italian readjustments

* Fix for sizings + uniformed indent
2018-03-31 21:01:19 +11:00
Ben V. Brown
e94bcfc2b8 Update translation
Closes #255
2018-03-31 16:39:23 +11:00
33 changed files with 1902 additions and 903 deletions

View File

@@ -34,36 +34,36 @@ ADC1.SamplingTime-4\#ChannelInjectedConversion=ADC_SAMPLETIME_239CYCLES_5
ADC1.SamplingTime-5\#ChannelInjectedConversion=ADC_SAMPLETIME_71CYCLES_5 ADC1.SamplingTime-5\#ChannelInjectedConversion=ADC_SAMPLETIME_71CYCLES_5
ADC1.ScanConvMode=ADC_SCAN_ENABLE ADC1.ScanConvMode=ADC_SCAN_ENABLE
ADC1.master=1 ADC1.master=1
Dma.ADC1.2.Direction=DMA_PERIPH_TO_MEMORY Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.2.Instance=DMA1_Channel1 Dma.ADC1.0.Instance=DMA1_Channel1
Dma.ADC1.2.MemDataAlignment=DMA_MDATAALIGN_HALFWORD Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC1.2.MemInc=DMA_MINC_ENABLE Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
Dma.ADC1.2.Mode=DMA_CIRCULAR Dma.ADC1.0.Mode=DMA_CIRCULAR
Dma.ADC1.2.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC1.2.PeriphInc=DMA_PINC_DISABLE Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
Dma.ADC1.2.Priority=DMA_PRIORITY_VERY_HIGH Dma.ADC1.0.Priority=DMA_PRIORITY_VERY_HIGH
Dma.ADC1.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C1_RX.0.Direction=DMA_PERIPH_TO_MEMORY Dma.I2C1_RX.1.Direction=DMA_PERIPH_TO_MEMORY
Dma.I2C1_RX.0.Instance=DMA1_Channel7 Dma.I2C1_RX.1.Instance=DMA1_Channel7
Dma.I2C1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE Dma.I2C1_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C1_RX.0.MemInc=DMA_MINC_ENABLE Dma.I2C1_RX.1.MemInc=DMA_MINC_ENABLE
Dma.I2C1_RX.0.Mode=DMA_NORMAL Dma.I2C1_RX.1.Mode=DMA_NORMAL
Dma.I2C1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.I2C1_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C1_RX.0.PeriphInc=DMA_PINC_DISABLE Dma.I2C1_RX.1.PeriphInc=DMA_PINC_DISABLE
Dma.I2C1_RX.0.Priority=DMA_PRIORITY_LOW Dma.I2C1_RX.1.Priority=DMA_PRIORITY_MEDIUM
Dma.I2C1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.I2C1_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C1_TX.1.Direction=DMA_MEMORY_TO_PERIPH Dma.I2C1_TX.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.I2C1_TX.1.Instance=DMA1_Channel6 Dma.I2C1_TX.2.Instance=DMA1_Channel6
Dma.I2C1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE Dma.I2C1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C1_TX.1.MemInc=DMA_MINC_ENABLE Dma.I2C1_TX.2.MemInc=DMA_MINC_ENABLE
Dma.I2C1_TX.1.Mode=DMA_NORMAL Dma.I2C1_TX.2.Mode=DMA_NORMAL
Dma.I2C1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.I2C1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C1_TX.1.PeriphInc=DMA_PINC_DISABLE Dma.I2C1_TX.2.PeriphInc=DMA_PINC_DISABLE
Dma.I2C1_TX.1.Priority=DMA_PRIORITY_LOW Dma.I2C1_TX.2.Priority=DMA_PRIORITY_MEDIUM
Dma.I2C1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.I2C1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=I2C1_RX Dma.Request0=ADC1
Dma.Request1=I2C1_TX Dma.Request1=I2C1_RX
Dma.Request2=ADC1 Dma.Request2=I2C1_TX
Dma.RequestsNb=3 Dma.RequestsNb=3
FREERTOS.FootprintOK=true FREERTOS.FootprintOK=true
FREERTOS.INCLUDE_vTaskDelete=0 FREERTOS.INCLUDE_vTaskDelete=0
@@ -74,8 +74,9 @@ FREERTOS.configMINIMAL_STACK_SIZE=256
FREERTOS.configTICK_RATE_HZ=100 FREERTOS.configTICK_RATE_HZ=100
FREERTOS.configTOTAL_HEAP_SIZE=10240 FREERTOS.configTOTAL_HEAP_SIZE=10240
File.Version=6 File.Version=6
I2C1.DutyCycle=I2C_DUTYCYCLE_2
I2C1.I2C_Mode=I2C_Fast I2C1.I2C_Mode=I2C_Fast
I2C1.IPParameters=I2C_Mode I2C1.IPParameters=I2C_Mode,DutyCycle
IWDG.IPParameters=Prescaler IWDG.IPParameters=Prescaler
IWDG.Prescaler=IWDG_PRESCALER_256 IWDG.Prescaler=IWDG_PRESCALER_256
KeepUserPlacement=false KeepUserPlacement=false
@@ -88,8 +89,9 @@ Mcu.IP4=IWDG
Mcu.IP5=NVIC Mcu.IP5=NVIC
Mcu.IP6=RCC Mcu.IP6=RCC
Mcu.IP7=SYS Mcu.IP7=SYS
Mcu.IP8=TIM3 Mcu.IP8=TIM2
Mcu.IPNb=9 Mcu.IP9=TIM3
Mcu.IPNb=10
Mcu.Name=STM32F103T(8-B)Ux Mcu.Name=STM32F103T(8-B)Ux
Mcu.Package=VFQFPN36 Mcu.Package=VFQFPN36
Mcu.Pin0=PA6 Mcu.Pin0=PA6
@@ -100,9 +102,12 @@ Mcu.Pin12=PB7
Mcu.Pin13=VP_FREERTOS_VS_ENABLE Mcu.Pin13=VP_FREERTOS_VS_ENABLE
Mcu.Pin14=VP_IWDG_VS_IWDG Mcu.Pin14=VP_IWDG_VS_IWDG
Mcu.Pin15=VP_SYS_VS_tim1 Mcu.Pin15=VP_SYS_VS_tim1
Mcu.Pin16=VP_TIM3_VS_ClockSourceINT Mcu.Pin16=VP_TIM2_VS_ClockSourceINT
Mcu.Pin17=VP_TIM3_VS_no_output4 Mcu.Pin17=VP_TIM2_VS_no_output1
Mcu.Pin18=VP_TIM2_VS_no_output3
Mcu.Pin19=VP_TIM3_VS_ClockSourceINT
Mcu.Pin2=PB0 Mcu.Pin2=PB0
Mcu.Pin20=VP_TIM3_VS_no_output4
Mcu.Pin3=PB1 Mcu.Pin3=PB1
Mcu.Pin4=PA8 Mcu.Pin4=PA8
Mcu.Pin5=PA9 Mcu.Pin5=PA9
@@ -110,28 +115,31 @@ Mcu.Pin6=PA13
Mcu.Pin7=PA14 Mcu.Pin7=PA14
Mcu.Pin8=PB3 Mcu.Pin8=PB3
Mcu.Pin9=PB4 Mcu.Pin9=PB4
Mcu.PinsNb=18 Mcu.PinsNb=21
Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32F103T8Ux Mcu.UserName=STM32F103T8Ux
MxCube.Version=4.22.0 MxCube.Version=4.25.0
MxDb.Version=DB.4.0.220 MxDb.Version=DB.4.0.250
NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.DMA1_Channel6_IRQn=true\:5\:0\:false\:false\:true\:true NVIC.DMA1_Channel6_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.DMA1_Channel7_IRQn=true\:5\:0\:false\:false\:true\:true NVIC.DMA1_Channel7_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.I2C1_ER_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.I2C1_EV_IRQn=true\:5\:0\:false\:false\:true\:true\:true
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\: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.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:true
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true\:true
NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:true
NVIC.TimeBase=TIM1_UP_IRQn NVIC.TimeBase=TIM1_UP_IRQn
NVIC.TimeBaseIP=TIM1 NVIC.TimeBaseIP=TIM1
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
PA13.Locked=true PA13.Locked=true
PA13.Mode=Serial_Wire PA13.Mode=Serial_Wire
PA13.Signal=SYS_JTMS-SWDIO PA13.Signal=SYS_JTMS-SWDIO
@@ -193,29 +201,30 @@ PCC.Vdd=3.3
PinOutPanel.RotationAngle=0 PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false ProjectManager.BackupPrevious=false
ProjectManager.CompilerOptimize=2 ProjectManager.CompilerOptimize=3
ProjectManager.ComputerToolchain=false ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false ProjectManager.CoupleFile=false
ProjectManager.CustomerFirmwarePackage=C\:/Users/Ben V. Brown/STM32Cube/Repository/STM32Cube_FW_F1_V1.6.0 ProjectManager.CustomerFirmwarePackage=C\:/Users/Ralim/STM32Cube/Repository/STM32Cube_FW_F1_V1.6.1
ProjectManager.DefaultFWLocation=true ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32F103T8Ux ProjectManager.DeviceId=STM32F103T8Ux
ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.0 ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.1
ProjectManager.FreePins=true ProjectManager.FreePins=true
ProjectManager.HalAssertFull=false ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200 ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1 ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Src
ProjectManager.PreviousToolchain=SW4STM32 ProjectManager.PreviousToolchain=SW4STM32
ProjectManager.ProjectBuild=false ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=TS100.ioc ProjectManager.ProjectFileName=TS100.ioc
ProjectManager.ProjectName=TS100 ProjectManager.ProjectName=TS100
ProjectManager.StackSize=0x400 ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=SW4STM32 ProjectManager.TargetToolchain=SW4STM32
ProjectManager.ToolChainLocation=C\:\\Users\\Ralim\\Repo\\ts100\\TS100 ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL,2-MX_DMA_Init-DMA-false-HAL,3-MX_I2C1_Init-I2C1-false-HAL,4-MX_ADC1_Init-ADC1-false-HAL,5-SystemClock_Config-RCC-false-HAL,6-MX_TIM3_Init-TIM3-false-HAL,7-MX_IWDG_Init-IWDG-false-HAL 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-MX_ADC1_Init-ADC1-false-HAL-true,5-SystemClock_Config-RCC-false-HAL-true,6-MX_TIM3_Init-TIM3-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_TIM2_Init-TIM2-false-HAL-true
RCC.ADCFreqValue=8000000 RCC.ADCFreqValue=8000000
RCC.ADCPresc=RCC_ADCPCLK2_DIV8 RCC.ADCPresc=RCC_ADCPCLK2_DIV8
RCC.AHBFreq_Value=64000000 RCC.AHBFreq_Value=64000000
@@ -252,6 +261,9 @@ SH.GPXTI5.0=GPIO_EXTI5
SH.GPXTI5.ConfNb=1 SH.GPXTI5.ConfNb=1
SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1 SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1
SH.S_TIM3_CH1.ConfNb=1 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-Output\ Compare4\ No\ Output=TIM_CHANNEL_4
TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM3.ClockDivision=TIM_CLOCKDIVISION_DIV4 TIM3.ClockDivision=TIM_CLOCKDIVISION_DIV4
@@ -267,6 +279,12 @@ VP_IWDG_VS_IWDG.Mode=IWDG_Activate
VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
VP_SYS_VS_tim1.Mode=TIM1 VP_SYS_VS_tim1.Mode=TIM1
VP_SYS_VS_tim1.Signal=SYS_VS_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.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
VP_TIM3_VS_no_output4.Mode=Output Compare4 No Output VP_TIM3_VS_no_output4.Mode=Output Compare4 No Output

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

View File

@@ -1,7 +1,7 @@
# TS100 # TS100
This is a complete rewrite of the open source software for the ts100 soldering iron. This is a complete rewrite of the open source software for the ts100 soldering iron.
The version two fork of this code has no shared code with the original firmware from Miniware (E-design) group. The version two fork of this code has no shared code with the original firmware from Miniware (E-design) group.
This project is concidered feature complete for use as a soldering iron, *so please suggest any feature improvements you would like!* This project is considered feature complete for use as a soldering iron, *so please suggest any feature improvements you would like!*
A short(ish) video that goes through every single menu option in the firmware is available [over here](https://www.youtube.com/watch?v=WlnpboYfxNk). A short(ish) video that goes through every single menu option in the firmware is available [over here](https://www.youtube.com/watch?v=WlnpboYfxNk).
This video was created on an earlier 1.x version of the firmware, so alot has changed and a new video will be coming soon for the 2.x fork. This video was created on an earlier 1.x version of the firmware, so alot has changed and a new video will be coming soon for the 2.x fork.

Binary file not shown.

View File

@@ -110,120 +110,6 @@
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration> </cconfiguration>
<cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.release.723264573">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.723264573" moduleId="org.eclipse.cdt.core.settings" name="Release">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.723264573" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size -B &quot;${BuildArtifactFileName}&quot; ;arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot;">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.723264573." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.1456567544" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.67332574" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32F103T8Ux" valueType="string"/>
<option id="fr.ac6.managedbuild.option.gnu.cross.board.1570943989" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="ts100" valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.793444160" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
<builder buildPath="${workspace_loc:/TS100}/Release" id="fr.ac6.managedbuild.builder.gnu.cross.548236022" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1363306495" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
<option id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1100266163" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.more" valueType="enumerated"/>
<option id="gnu.c.compiler.option.debugging.level.2139237845" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
<option id="gnu.c.compiler.option.include.paths.1770182855" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/inc&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/CMSIS/core&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/CMSIS/device&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/HAL_Driver/Inc/Legacy&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/HAL_Driver/Inc&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3&quot;"/>
</option>
<option id="gnu.c.compiler.option.preprocessor.def.symbols.1423042308" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="STM32F103T8Ux"/>
<listOptionValue builtIn="false" value="STM32F1"/>
<listOptionValue builtIn="false" value="STM32"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32F103xB"/>
<listOptionValue builtIn="false" value="USE_RTOS_SYSTICK"/>
</option>
<option id="gnu.c.compiler.option.dialect.std.356859384" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
<option id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.fdata.1580070223" name="Place the data in their own section (-fdata-sections)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.fdata" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="gnu.c.compiler.option.misc.pic.1841660469" name="Position Independent Code (-fPIC)" superClass="gnu.c.compiler.option.misc.pic" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.747173367" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.1210653460" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1414722294" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
<option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1489744363" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.more" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.debugging.level.641509376" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.include.paths.105977434" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/inc&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/CMSIS/core&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/CMSIS/device&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/HAL_Driver/Inc/Legacy&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/HAL_Driver/Inc&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3&quot;"/>
</option>
<option id="gnu.cpp.compiler.option.preprocessor.def.158062035" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="STM32F103T8Ux"/>
<listOptionValue builtIn="false" value="STM32F1"/>
<listOptionValue builtIn="false" value="STM32"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32F103xB"/>
<listOptionValue builtIn="false" value="USE_RTOS_SYSTICK"/>
</option>
<option id="gnu.cpp.compiler.option.dialect.std.2101054556" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
<option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.fdata.1877154487" name="Place the data in their own section (-fdata-sections)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.fdata" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.688034595" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.6473827" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1409185098" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.162825548" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
<option id="gnu.cpp.link.option.strip.459660118" name="Omit all symbol information (-s)" superClass="gnu.cpp.link.option.strip" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.gcsections.664103720" name="Discard unused sections (-Wl,--gc-sections)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1735005640" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.907512577" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1906472572" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
<option id="gnu.both.asm.option.include.paths.1277819409" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/inc&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/CMSIS/core&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/CMSIS/device&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/HAL_Driver/Inc/Legacy&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/HAL_Driver/Inc&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1588000933" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1118741214" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.exe.release.63862661" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.exe.release">
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.983697759" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1721181053" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
</tool>
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="Src/stm32f1xx_hal_timebase_tim_template.c|Src/stm32f1xx_hal_timebase_rtc_wakeup_template.c|Src/stm32f1xx_hal_timebase_rtc_alarm_template.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="HAL_Driver"/>
<entry excluding="Third_Party/FreeRTOS/Source/portable/MemMang/heap_1.c|Third_Party/FreeRTOS/Source/portable/MemMang/heap_2.c|Third_Party/FreeRTOS/Source/portable/MemMang/heap_3.c|Third_Party/FreeRTOS/Source/portable/MemMang/heap_5.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="startup"/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="TS100.fr.ac6.managedbuild.target.gnu.cross.exe.1768512215" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/> <project id="TS100.fr.ac6.managedbuild.target.gnu.cross.exe.1768512215" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>

View File

@@ -6,19 +6,7 @@
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<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 copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="3703734836139458" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="-283880394950776525" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -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.g++"/>
</provider>
</extension>
</configuration>
<configuration id="fr.ac6.managedbuild.config.gnu.cross.exe.release.723264573" name="Release">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="3703734836139458" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -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>

View File

@@ -0,0 +1,66 @@
{
"configurations": [
{
"name": "Mac",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceFolder}"
],
"defines": ["STM32F103T8Ux","STM32F1","STM32","USE_HAL_DRIVER","STM32F103xB","USE_RTOS_SYSTICK"],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceFolder}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
]
},
{
"name": "STM32",
"includePath": [
"${workspaceFolder}",
"/usr/include/c++/5",
"/usr/include/x86_64-linux-gnu/c++/5",
"/usr/include/c++/5/backward",
"/usr/lib/llvm-5.0/lib/clang/5.0.0/include",
"/usr/local/include",
"/usr/include/x86_64-linux-gnu",
"/usr/include",
"${workspaceFolder}/inc",
"${workspaceFolder}/HAL_Driver/Inc",
"${workspaceFolder}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS",
"${workspaceFolder}/CMSIS/device",
"${workspaceFolder}/Middlewares/Third_Party/FreeRTOS/Source/include",
"${workspaceFolder}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"${workspaceFolder}",
"/usr/include/c++/5",
"/usr/include/x86_64-linux-gnu/c++/5",
"/usr/include/c++/5/backward",
"/usr/lib/llvm-5.0/lib/clang/5.0.0/include",
"/usr/local/include",
"/usr/include/x86_64-linux-gnu",
"/usr/include"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"compilerPath": "/usr/bin/clang++-5.0",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 3
}

View File

@@ -3467,48 +3467,7 @@ void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
} }
} }
} }
/* Slave mode selected */
else
{
/* ADDR set --------------------------------------------------------------*/
if(((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
{
I2C_Slave_ADDR(hi2c);
}
/* STOPF set --------------------------------------------------------------*/
else if(((sr1itflags & I2C_FLAG_STOPF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
{
I2C_Slave_STOPF(hi2c);
}
/* I2C in mode Transmitter -----------------------------------------------*/
else if((sr2itflags & I2C_FLAG_TRA) != RESET)
{
/* TXE set and BTF reset -----------------------------------------------*/
if(((sr1itflags & I2C_FLAG_TXE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
{
I2C_SlaveTransmit_TXE(hi2c);
}
/* BTF set -------------------------------------------------------------*/
else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
{
I2C_SlaveTransmit_BTF(hi2c);
}
}
/* I2C in mode Receiver --------------------------------------------------*/
else
{
/* RXNE set and BTF reset ----------------------------------------------*/
if(((sr1itflags & I2C_FLAG_RXNE) != RESET) && ((itsources & I2C_IT_BUF) != RESET) && ((sr1itflags & I2C_FLAG_BTF) == RESET))
{
I2C_SlaveReceive_RXNE(hi2c);
}
/* BTF set -------------------------------------------------------------*/
else if(((sr1itflags & I2C_FLAG_BTF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
{
I2C_SlaveReceive_BTF(hi2c);
}
}
}
} }
/** /**

View File

@@ -4280,7 +4280,7 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel)
*/ */
/** /**
* @brief Period elapsed callback in non blocking mode * @brief Period elapsed callback in non blocking mode
* @param htim : TIM handle * @param htim : TIM handle
* @retval None * @retval None
*/ */

View File

@@ -7,6 +7,7 @@ endif
# Discover the source files to build # Discover the source files to build
SOURCE := $(shell find . -type f -name '*.c') SOURCE := $(shell find . -type f -name '*.c')
SOURCE_CPP := $(shell find . -type f -name '*.cpp') SOURCE_CPP := $(shell find . -type f -name '*.cpp')
SOURCES := $(shell find . -type f -name '*.c*')
S_SRCS := $(shell find . -type f -name '*.s') S_SRCS := $(shell find . -type f -name '*.s')
APP_INC_DIR = ./inc APP_INC_DIR = ./inc
@@ -31,7 +32,7 @@ HEXFILE_DIR=Hexfile
OUTPUT_DIR=Objects OUTPUT_DIR=Objects
# code optimisation ------------------------------------------------------------ # code optimisation ------------------------------------------------------------
OPTIM=-O2 -finline-small-functions -findirect-inlining -fdiagnostics-color OPTIM=-Os -finline-small-functions -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections
# global defines --------------------------------------------------------------- # global defines ---------------------------------------------------------------
@@ -130,7 +131,11 @@ CXXFLAGS=$(CPUFLAGS) \
-fno-rtti \ -fno-rtti \
-fno-exceptions \ -fno-exceptions \
-fno-non-call-exceptions \ -fno-non-call-exceptions \
-fno-use-cxa-atexit \ -fno-use-cxa-atexit \
-fno-strict-aliasing \
-fno-rtti \
-fno-exceptions \
-fno-threadsafe-statics \
-T$(LDSCRIPT) -T$(LDSCRIPT)
@@ -173,7 +178,7 @@ OUT_OBJS_S=$(addprefix $(OUTPUT_DIR)/,$(OBJS_S))
OUT_HEXFILE=$(addprefix $(HEXFILE_DIR)/,$(OUTPUT_EXE)) OUT_HEXFILE=$(addprefix $(HEXFILE_DIR)/,$(OUTPUT_EXE))
all: $(OUT_HEXFILE).hex all: $(OUT_HEXFILE).hex
# #
# The rule to create the target directory # The rule to create the target directory
# #

27
workspace/TS100/TS100.cfg Normal file
View File

@@ -0,0 +1,27 @@
# This is an ts100 board with a single STM32F103T8Ux chip
#
# Generated by System Workbench for STM32
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)
source [find interface/stlink.cfg]
set WORKAREASIZE 0x5000
transport select "hla_swd"
set CHIPNAME STM32F103T8Ux
# Enable debug when in low power modes
set ENABLE_LOW_POWER 1
# Stop Watchdog counters when halt
set STOP_WATCHDOG 1
# STlink Debug clock frequency
set CLOCK_FREQ 950
# use software system reset
reset_config none
set CONNECT_UNDER_RESET 0
source [find target/stm32f1x.cfg]

View File

@@ -19,7 +19,7 @@ make -j16 lang=PL
rm -rf Objects/src rm -rf Objects/src
make -j16 lang=RU make -j16 lang=RU
rm -rf Objects/src rm -rf Objects/src
make -j16 lang=SE make -j16 lang=FI
rm -rf Objects/src rm -rf Objects/src
make -j16 lang=TR make -j16 lang=TR
rm -rf Objects/src rm -rf Objects/src
@@ -32,4 +32,6 @@ rm -rf Objects/src
make -j16 lang=BR make -j16 lang=BR
rm -rf Objects/src rm -rf Objects/src
make -j16 lang=LT make -j16 lang=LT
rm -rf Objects/src rm -rf Objects/src
make -j16 lang=UA
rm -rf Objects/src

View File

@@ -0,0 +1,31 @@
/*
* FRToSI2C.hpp
*
* Created on: 14Apr.,2018
* Author: Ralim
*/
#ifndef FRTOSI2C_HPP_
#define FRTOSI2C_HPP_
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"
class FRToSI2C {
public:
FRToSI2C(I2C_HandleTypeDef* i2chandle);
void FRToSInit();
void CpltCallback(); //Normal Tx Callback
void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize,
uint8_t *pData, uint16_t Size);
void Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
private:
I2C_HandleTypeDef* i2c;
SemaphoreHandle_t I2CSemaphore;
};
#endif /* FRTOSI2C_HPP_ */

View File

@@ -490,7 +490,6 @@ const uint8_t ExtraFontChars[] = {
0x00,0xF0,0x08,0xEE,0xE2,0xFA,0xFA,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 10*/ 0x00,0xF0,0x08,0xEE,0xE2,0xFA,0xFA,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 10*/
0x00,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x00,0x00,0x38,0x3A,0x39,0x38,0x3A,0x39,0x38,0x3A,0x39,0x10,0x10, // heating 0x00,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x00,0x00,0x38,0x3A,0x39,0x38,0x3A,0x39,0x38,0x3A,0x39,0x10,0x10, // heating
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x10,0x10, // cooling
0x00,0x60,0xE0,0xFE,0xE0,0xE0,0xE0,0xE0,0xFE,0xE0,0x60,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00, // AC 0x00,0x60,0xE0,0xFE,0xE0,0xE0,0xE0,0xE0,0xFE,0xE0,0x60,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00, // AC
0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x82,0x62,0x1A,0x02,0xFC,0x3F,0x40,0x42,0x46,0x4C,0x58,0x46,0x41,0x40,0x40,0x40,0x3F, // ☑ (check box on, menu true) 0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x82,0x62,0x1A,0x02,0xFC,0x3F,0x40,0x42,0x46,0x4C,0x58,0x46,0x41,0x40,0x40,0x40,0x3F, // ☑ (check box on, menu true)

View File

@@ -101,12 +101,14 @@
#define configTICK_RATE_HZ ((TickType_t)100) #define configTICK_RATE_HZ ((TickType_t)100)
#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) #define configTOTAL_HEAP_SIZE ((size_t)10240) /*Currently use about 9000*/
#define configMAX_TASK_NAME_LEN ( 16 ) #define configMAX_TASK_NAME_LEN ( 48 )
#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
/* Co-routine definitions. */ /* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0 #define configUSE_CO_ROUTINES 0
@@ -122,6 +124,7 @@ to exclude the API function. */
#define INCLUDE_vTaskDelayUntil 0 #define INCLUDE_vTaskDelayUntil 0
#define INCLUDE_vTaskDelay 1 #define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
/* Cortex-M specific definitions. */ /* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS #ifdef __NVIC_PRIO_BITS

View File

@@ -8,10 +8,11 @@
#ifndef LIS2DH12_HPP_ #ifndef LIS2DH12_HPP_
#define LIS2DH12_HPP_ #define LIS2DH12_HPP_
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#include "FRToSI2C.hpp"
#include "LIS2DH12_defines.hpp" #include "LIS2DH12_defines.hpp"
class LIS2DH12 { class LIS2DH12 {
public: public:
LIS2DH12(I2C_HandleTypeDef* i2cHandle); LIS2DH12(FRToSI2C* i2cHandle);
void initalize(); void initalize();
uint8_t getOrientation(); uint8_t getOrientation();
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z); void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
@@ -21,7 +22,7 @@ private:
void I2C_RegisterWrite(uint8_t reg, uint8_t data); void I2C_RegisterWrite(uint8_t reg, uint8_t data);
uint8_t I2C_RegisterRead(uint8_t reg); uint8_t I2C_RegisterRead(uint8_t reg);
I2C_HandleTypeDef* i2c; FRToSI2C* i2c;
}; };
#endif /* LIS2DH12_HPP_ */ #endif /* LIS2DH12_HPP_ */

View File

@@ -9,11 +9,12 @@
#define MMA8652FC_HPP_ #define MMA8652FC_HPP_
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#include "MMA8652FC_defines.h" #include "MMA8652FC_defines.h"
#include "FRToSI2C.hpp"
class MMA8652FC { class MMA8652FC {
public: public:
MMA8652FC(I2C_HandleTypeDef* i2cHandle); MMA8652FC(FRToSI2C* i2cHandle);
void initalize(); // Initalize the system void initalize(); // Initalize the system
uint8_t getOrientation();// Reads the I2C register and returns the orientation (true == left) uint8_t getOrientation();// Reads the I2C register and returns the orientation (true == left)
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z); void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
@@ -23,7 +24,7 @@ private:
void I2C_RegisterWrite(uint8_t reg, uint8_t data); void I2C_RegisterWrite(uint8_t reg, uint8_t data);
uint8_t I2C_RegisterRead(uint8_t reg); uint8_t I2C_RegisterRead(uint8_t reg);
I2C_HandleTypeDef* i2c; FRToSI2C* i2c;
}; };

View File

@@ -12,6 +12,7 @@
#include <hardware.h> #include <hardware.h>
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#include <stdbool.h> #include <stdbool.h>
#include "FRToSI2C.hpp"
#include "Font.h" #include "Font.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -25,17 +26,17 @@ extern "C" {
class OLED { class OLED {
public: public:
OLED(I2C_HandleTypeDef* i2cHandle); // Initialize Driver and store I2C pointer OLED(FRToSI2C* i2cHandle); // Initialize Driver and store I2C pointer
void initialize(); // Startup the I2C coms (brings screen out of reset etc) void initialize(); // Startup the I2C coms (brings screen out of reset etc)
void refresh(); // Draw the buffer out to the LCD using the DMA Channel void refresh(); // Draw the buffer out to the LCD using the DMA Channel
void drawChar(char c, char preCursorCommand = '\0');// Draw a character to a specific location void drawChar(char c, char preCursorCommand = '\0'); // Draw a character to a specific location
void displayOnOff(bool on); // Turn the screen on or not void displayOnOff(bool on); // Turn the screen on or not
void setRotation(bool leftHanded); // Set the rotation for the screen void setRotation(bool leftHanded); // Set the rotation for the screen
bool getRotation(); // Get the current rotation of the LCD bool getRotation(); // Get the current rotation of the LCD
void print(const char* string); // Draw a string to the current location, with current font void print(const char* string); // Draw a string to the current location, with current font
void setCursor(int16_t x, int16_t y); // Set the cursor location by pixels void setCursor(int16_t x, int16_t y); // Set the cursor location by pixels
void setCharCursor(int16_t x, int16_t y); //Set cursor location by chars in current font void setCharCursor(int16_t x, int16_t y); //Set cursor location by chars in current font
void setFont(uint8_t fontNumber);// (Future) Set the font that is being used 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); void drawImage(const uint8_t* buffer, uint8_t x, uint8_t width);
// 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); void printNumber(uint16_t number, uint8_t places);
@@ -46,13 +47,17 @@ public:
void drawSymbol(uint8_t symbolID);//Used for drawing symbols of a predictable width 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, void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
const uint8_t* ptr); const uint8_t* ptr);
void fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
const uint8_t value);
void drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,bool clear);
void drawHeatSymbol(uint8_t state);
private: private:
//Draw a buffer to the screen buffer //Draw a buffer to the screen buffer
I2C_HandleTypeDef* i2c; //i2c Pointer FRToSI2C* i2c; //i2c Pointer
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
uint8_t screenBuffer[12 + 96 + 96 + 10]; // The data buffer uint8_t screenBuffer[16 + 96 + 96 + 10]; // The data buffer
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
uint8_t* secondStripPtr; //Pointers to the strips uint8_t* secondStripPtr; //Pointers to the strips
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)

View File

@@ -11,31 +11,34 @@
#define SETTINGS_H_ #define SETTINGS_H_
#include <stdint.h> #include <stdint.h>
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#define SETTINGSVERSION 0x12 /*Change this if you change the struct below to prevent people getting out of sync*/ #define SETTINGSVERSION 0x14 /*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
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 temporary soldering temp over-ride
uint8_t coolingTempBlink :1; //Should the temperature blink on the cool down screen until its <50C 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 version; //Used to track if a reset is needed on firmware upgrade uint8_t PID_P; //PID P Term
uint32_t padding; //This is here for in case we are not an even divisor so that nothing gets cut off uint8_t PID_I; //PID I Term
uint8_t PID_D; //PID D Term
uint8_t version; //Used to track if a reset is needed on firmware upgrade
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

@@ -17,9 +17,10 @@ extern "C" {
extern ADC_HandleTypeDef hadc1; extern ADC_HandleTypeDef hadc1;
extern DMA_HandleTypeDef hdma_adc1; extern DMA_HandleTypeDef hdma_adc1;
extern DMA_HandleTypeDef hdma_i2c1_rx;
extern DMA_HandleTypeDef hdma_i2c1_tx;
extern I2C_HandleTypeDef hi2c1; extern I2C_HandleTypeDef hi2c1;
extern IWDG_HandleTypeDef hiwdg; extern IWDG_HandleTypeDef hiwdg;
extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim2;

View File

@@ -25,5 +25,20 @@ enum ButtonState {
ButtonState getButtonState(); ButtonState getButtonState();
void waitForButtonPressOrTimeout(uint32_t timeout); void waitForButtonPressOrTimeout(uint32_t timeout);
#ifdef __cplusplus
extern "C" {
#endif
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );
#ifdef __cplusplus
}
#endif
#endif /* __MAIN_H */ #endif /* __MAIN_H */

View File

@@ -0,0 +1,102 @@
/*
* FRToSI2C.cpp
*
* Created on: 14Apr.,2018
* Author: Ralim
*/
#include "FRToSI2C.hpp"
FRToSI2C::FRToSI2C(I2C_HandleTypeDef* i2chandle) {
i2c = i2chandle;
I2CSemaphore = NULL;
}
void FRToSI2C::CpltCallback() {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
i2c->State = HAL_I2C_STATE_READY;//Force state reset
if (I2CSemaphore) {
xSemaphoreGiveFromISR(I2CSemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED
|| I2CSemaphore == NULL) {
//no RToS, run blocking code
HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
5000);
} else {
//RToS is active, run threading
//Get the mutex so we can use the I2C port
//Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 5000 ) == pdTRUE) {
if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData,
Size, 5000) != HAL_OK) {
NVIC_SystemReset();
}
xSemaphoreGive(I2CSemaphore);
} else {
NVIC_SystemReset();
}
}
}
void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED
|| I2CSemaphore == NULL) {
//no RToS, run blocking code
HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
5000);
} else {
//RToS is active, run threading
//Get the mutex so we can use the I2C port
//Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 5000 ) == pdTRUE) {
if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize,
pData, Size, 5000) != HAL_OK) {
NVIC_SystemReset();
}
xSemaphoreGive(I2CSemaphore);
} else {
NVIC_SystemReset();
}
}
}
void FRToSI2C::FRToSInit() {
I2CSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(I2CSemaphore);
}
void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED
|| I2CSemaphore == NULL) {
//no RToS, run blocking code
HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000);
} else {
//RToS is active, run threading
//Get the mutex so we can use the I2C port
//Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 5000 ) == pdTRUE) {
if (HAL_I2C_Master_Transmit_DMA(i2c, DevAddress, pData, Size)
!= HAL_OK) {
NVIC_SystemReset();
}
//xSemaphoreGive(I2CSemaphore);
} else {
NVIC_SystemReset();
}
}
}

View File

@@ -7,7 +7,7 @@
#include <LIS2DH12.hpp> #include <LIS2DH12.hpp>
#include "cmsis_os.h" #include "cmsis_os.h"
LIS2DH12::LIS2DH12(I2C_HandleTypeDef* i2cHandle) { LIS2DH12::LIS2DH12(FRToSI2C* i2cHandle) {
i2c = i2cHandle; i2c = i2cHandle;
} }
@@ -44,12 +44,9 @@ uint8_t LIS2DH12::getOrientation() {
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];
taskENTER_CRITICAL(); i2c->Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT,
while (HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, 0xA8, (uint8_t*) tempArr, 6);
I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6, 5000) != HAL_OK) {
HAL_Delay(5);
}
taskEXIT_CRITICAL();
(*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0])); (*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0]));
(*y) = ((uint16_t) (tempArr[3] << 8 | tempArr[2])); (*y) = ((uint16_t) (tempArr[3] << 8 | tempArr[2]));
(*z) = ((uint16_t) (tempArr[5] << 8 | tempArr[4])); (*z) = ((uint16_t) (tempArr[5] << 8 | tempArr[4]));
@@ -59,15 +56,12 @@ void LIS2DH12::setSensitivity(uint8_t threshold, uint8_t filterTime) {
} }
void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) { void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
i2c->Mem_Write(LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1);
HAL_I2C_Mem_Write(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data,
1, 500);
} }
uint8_t LIS2DH12::I2C_RegisterRead(uint8_t reg) { uint8_t LIS2DH12::I2C_RegisterRead(uint8_t reg) {
uint8_t tx_data[1]; uint8_t tx_data[1];
HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, i2c->Mem_Read( LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data, 1);
tx_data, 1, 500);
return tx_data[0]; return tx_data[0];
} }

View File

@@ -8,20 +8,18 @@
#include <MMA8652FC.hpp> #include <MMA8652FC.hpp>
#include "cmsis_os.h" #include "cmsis_os.h"
MMA8652FC::MMA8652FC(I2C_HandleTypeDef* i2cHandle) { MMA8652FC::MMA8652FC(FRToSI2C* i2cHandle) {
i2c = i2cHandle; i2c = i2cHandle;
} }
void MMA8652FC::I2C_RegisterWrite(uint8_t reg, uint8_t data) { void MMA8652FC::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
i2c->Mem_Write( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1);
HAL_I2C_Mem_Write(i2c, MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
&data, 1, 500);
} }
uint8_t MMA8652FC::I2C_RegisterRead(uint8_t reg) { uint8_t MMA8652FC::I2C_RegisterRead(uint8_t reg) {
uint8_t tx_data[1]; uint8_t tx_data[1];
HAL_I2C_Mem_Read(i2c, MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data,
tx_data, 1, 500); 1);
return tx_data[0]; return tx_data[0];
} }
@@ -36,51 +34,42 @@ void MMA8652FC::initalize() {
I2C_RegisterWrite(PL_COUNT_REG, 200); //200 count debounce I2C_RegisterWrite(PL_COUNT_REG, 200); //200 count debounce
I2C_RegisterWrite(PL_BF_ZCOMP_REG, 0b01000111); //Set the threshold to 42 degrees I2C_RegisterWrite(PL_BF_ZCOMP_REG, 0b01000111); //Set the threshold to 42 degrees
I2C_RegisterWrite(P_L_THS_REG, 0b10011100); //Up the trip angles I2C_RegisterWrite(P_L_THS_REG, 0b10011100); //Up the trip angles
I2C_RegisterWrite( CTRL_REG4, 0x01 | (1 << 4)); // Enable dataready interrupt & orientation interrupt I2C_RegisterWrite( CTRL_REG4, 0); // Disable IRQ's
I2C_RegisterWrite( CTRL_REG5, 0x01); // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2 I2C_RegisterWrite( CTRL_REG5, 0x01); // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2
I2C_RegisterWrite( CTRL_REG2, 0x12); //Set maximum resolution oversampling I2C_RegisterWrite( CTRL_REG2, 0x12); //Set maximum resolution oversampling
I2C_RegisterWrite( XYZ_DATA_CFG_REG, (1 << 4)); //select high pass filtered data I2C_RegisterWrite( XYZ_DATA_CFG_REG, (1 << 4)); //select high pass filtered data
I2C_RegisterWrite( HP_FILTER_CUTOFF_REG, 0x03); //select high pass filtered data I2C_RegisterWrite( HP_FILTER_CUTOFF_REG, 0x03); //select high pass filtered data
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=12 Hz, Active mode I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=12 Hz, Active mode
HAL_Delay(2); // ~1ms delay
} }
void MMA8652FC::setSensitivity(uint8_t threshold, uint8_t filterTime) { void MMA8652FC::setSensitivity(uint8_t threshold, uint8_t filterTime) {
uint8_t sens = 9 * 2 + 17; uint8_t sens = 9 * 2 + 17;
sens -= 2 * threshold; sens -= 2 * threshold;
taskENTER_CRITICAL();
I2C_RegisterWrite( CTRL_REG1, 0); // sleep mode I2C_RegisterWrite( CTRL_REG1, 0); // sleep mode
I2C_RegisterWrite(FF_MT_THS_REG, (sens & 0x7F));// Set accumulation threshold I2C_RegisterWrite(FF_MT_THS_REG, (sens & 0x7F));// Set accumulation threshold
I2C_RegisterWrite(FF_MT_COUNT_REG, filterTime); // Set debounce threshold I2C_RegisterWrite(FF_MT_COUNT_REG, filterTime); // Set debounce threshold
I2C_RegisterWrite( CTRL_REG1, 0x31); // ODR=12 Hz, Active mode I2C_RegisterWrite( CTRL_REG1, 0x31); // ODR=12 Hz, Active mode
taskEXIT_CRITICAL();
} }
uint8_t MMA8652FC::getOrientation() { uint8_t MMA8652FC::getOrientation() {
//First read the PL_STATUS register //First read the PL_STATUS register
taskENTER_CRITICAL();
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG); uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG);
taskEXIT_CRITICAL();
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
//0 == left handed //0 == left handed
//1 == right handed //1 == right handed
return plStatus==0?2:1; return plStatus == 0 ? 2 : 1;
} else } else
return 0; return 0;
} }
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];
taskENTER_CRITICAL(); i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6);
while (HAL_I2C_Mem_Read(i2c, MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,
I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6, 0xFFFF) != HAL_OK) {
HAL_Delay(5);
}
taskEXIT_CRITICAL();
(*x) = tempArr[0] << 8 | tempArr[1]; (*x) = tempArr[0] << 8 | tempArr[1];
(*y) = tempArr[2] << 8 | tempArr[3]; (*y) = tempArr[2] << 8 | tempArr[3];
(*z) = tempArr[4] << 8 | tempArr[5]; (*z) = tempArr[4] << 8 | tempArr[5];

View File

@@ -43,14 +43,14 @@ 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
OLED::OLED(I2C_HandleTypeDef* i2cHandle) { OLED::OLED(FRToSI2C* i2cHandle) {
i2c = i2cHandle; i2c = i2cHandle;
cursor_x = cursor_y = 0; cursor_x = cursor_y = 0;
currentFont = FONT_12; currentFont = FONT_12;
fontWidth = 12; fontWidth = 12;
inLeftHandedMode = false; inLeftHandedMode = false;
firstStripPtr = &screenBuffer[13]; firstStripPtr = &screenBuffer[16 + 1];
secondStripPtr = &screenBuffer[13 + 96]; secondStripPtr = &screenBuffer[16 + 1 + 96];
fontHeight = 16; fontHeight = 16;
fontWidth = 12; fontWidth = 12;
displayOffset = 0; displayOffset = 0;
@@ -61,37 +61,33 @@ OLED::OLED(I2C_HandleTypeDef* i2cHandle) {
void OLED::initialize() { void OLED::initialize() {
HAL_Delay(5); HAL_Delay(5);
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(5); HAL_Delay(10);
//Send the setup settings //Send the setup settings
HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, configLength);
configLength, 0xFFFF); displayOnOff(true);
//displayOnOff(true);
} }
//Write out the buffer to the OLEd & call any rendering objects //Write out the buffer to the OLEd & call any rendering objects
void OLED::refresh() { void OLED::refresh() {
screenBuffer[0] = 0x80; screenBuffer[0] = 0x80;
screenBuffer[1] = 0x21; screenBuffer[1] = displayOnOffState ? 0xAF : 0xAE;
screenBuffer[2] = 0x80; screenBuffer[2] = 0x80;
screenBuffer[3] = inLeftHandedMode ? 0 : 32; //display is shifted by 32 in left handed mode as driver ram is 128 wide screenBuffer[3] = 0x21;
screenBuffer[4] = 0x80; screenBuffer[4] = 0x80;
screenBuffer[5] = inLeftHandedMode ? 95 : 0x7F; //End address of the ram segment we are writing to (96 wide) screenBuffer[5] = inLeftHandedMode ? 0 : 32; //display is shifted by 32 in left handed mode as driver ram is 128 wide
screenBuffer[6] = 0x80;
screenBuffer[7] = inLeftHandedMode ? 95 : 0x7F; //End address of the ram segment we are writing to (96 wide)
screenBuffer[8] = 0x80; /*Set COM Scan direction*/
screenBuffer[9] = inLeftHandedMode ? 0xC8 : 0xC0;
screenBuffer[10] = 0x80; //Set pages to rollover after 2
screenBuffer[11] = 0x22;
screenBuffer[12] = 0x80;
screenBuffer[13] = 0x00; //start page 0
screenBuffer[14] = 0x80;
screenBuffer[15] = 0x01;
screenBuffer[16] = 0x40; //start of data marker
screenBuffer[6] = 0x80; //Set pages to rollover after 2 i2c->Transmit( DEVICEADDR_OLED, screenBuffer, 16 + (96 * 2) + 1);
screenBuffer[7] = 0x22;
screenBuffer[8] = 0x80;
screenBuffer[9] = 0x00; //start page 0
screenBuffer[10] = 0x80;
screenBuffer[11] = 0x01;
screenBuffer[12] = 0x40; //start of data marker
taskENTER_CRITICAL();
//Because I2C is shared, we cant task switch in the middle of the xfer
HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, screenBuffer, 12 + 96 * 2 + 1,
500);
taskEXIT_CRITICAL();
} }
@@ -101,10 +97,9 @@ void OLED::refresh() {
* Precursor is the command char that is used to select the table. * Precursor is the command char that is used to select the table.
*/ */
void OLED::drawChar(char c, char PrecursorCommand) { void OLED::drawChar(char c, char PrecursorCommand) {
if( c=='\n' && cursor_y==0) if (c == '\n' && cursor_y == 0) {
{ cursor_x = 0;
cursor_x=0; cursor_y = 8;
cursor_y=8;
} }
if (c < ' ') { if (c < ' ') {
return; return;
@@ -128,10 +123,10 @@ void OLED::drawChar(char c, char PrecursorCommand) {
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;
case 0xD1: case 0xD1:
index = (256) + (c); index = (256) + (c);
break; break;
#else #else
@@ -157,19 +152,7 @@ void OLED::drawChar(char c, char PrecursorCommand) {
} }
void OLED::displayOnOff(bool on) { void OLED::displayOnOff(bool on) {
displayOnOffState = on;
if (on != displayOnOffState) {
uint8_t data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF }; //on
if (!on) {
data[3] = 0x10;
data[5] = 0xAE;
}
taskENTER_CRITICAL();
HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, data, 6, 0xFFFF);
taskEXIT_CRITICAL();
displayOnOffState = on;
}
} }
void OLED::setRotation(bool leftHanded) { void OLED::setRotation(bool leftHanded) {
@@ -182,11 +165,8 @@ 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;
} }
taskENTER_CRITICAL(); i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array,
configLength);
HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED,
(uint8_t*) OLED_Setup_Array, 50, 0xFFFF);
taskEXIT_CRITICAL();
inLeftHandedMode = leftHanded; inLeftHandedMode = leftHanded;
} }
} }
@@ -278,7 +258,7 @@ void OLED::drawBattery(uint8_t state) {
drawSymbol(3 + state); drawSymbol(3 + state);
} }
void OLED::drawCheckbox(bool state) { void OLED::drawCheckbox(bool state) {
drawSymbol((state) ? 17 : 18); drawSymbol((state) ? 16 : 17);
} }
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
@@ -300,11 +280,11 @@ void OLED::drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
uint8_t visibleEnd = wide; uint8_t visibleEnd = wide;
// trimming to draw partials // trimming to draw partials
if(x < 0) { if (x < 0) {
visibleStart -= x; //subtract negative value == add absolute value visibleStart -= x; //subtract negative value == add absolute value
} }
if(x + wide > 96) { if (x + wide > 96) {
visibleEnd = 96 - x; visibleEnd = 96 - x;
} }
if (y == 0) { if (y == 0) {
@@ -320,3 +300,81 @@ 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,
const uint8_t value) {
// Splat this from x->x+wide in two strides
if (x <= -wide)
return; //cutoffleft
if (x > 96)
return; //cutoff right
uint8_t visibleStart = 0;
uint8_t visibleEnd = wide;
// trimming to draw partials
if (x < 0) {
visibleStart -= x; //subtract negative value == add absolute value
}
if (x + wide > 96) {
visibleEnd = 96 - x;
}
if (y == 0) {
//Splat first line of data
for (uint8_t xx = visibleStart; xx < visibleEnd; xx++) {
firstStripPtr[xx + x] = value;
}
}
if (y == 8 || height == 16) {
// Splat the second line
for (uint8_t xx = visibleStart; xx < visibleEnd; xx++) {
secondStripPtr[x + xx] = value;
}
}
}
void OLED::drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,
bool clear) {
//Draw this in 3 sections
//This is basically a N wide version of vertical line
//Step 1 : Draw in the top few pixels that are not /8 aligned
//LSB is at the top of the screen
uint8_t mask = 0xFF;
if (y0) {
mask = mask << (y0 % 8);
for (uint8_t col = x0; col < x1; col++)
if (clear)
firstStripPtr[(y0 / 8) * 96 + col] &= ~mask;
else
firstStripPtr[(y0 / 8) * 96 + col] |= mask;
}
//Next loop down the line the total number of solids
if (y0 / 8 != y1 / 8)
for (uint8_t col = x0; col < x1; col++)
for (uint8_t r = (y0 / 8); r < (y1 / 8); r++) {
//This gives us the row index r
if (clear)
firstStripPtr[(r * 96) + col] = 0;
else
firstStripPtr[(r * 96) + col] = 0xFF;
}
//Finally draw the tail
mask = ~(mask << (y1 % 8));
for (uint8_t col = x0; col < x1; col++)
if (clear)
firstStripPtr[(y1 / 8) * 96 + col] &= ~mask;
else
firstStripPtr[(y1 / 8) * 96 + col] |= mask;
}
void OLED::drawHeatSymbol(uint8_t state) {
//Draw symbol 14
//Then draw over it botom 5 pixels always stay. 8 pixels above that are the levels
state /= 12; // 0-> 8 range
//Then we want to draw down (16-(5+state)
uint8_t cursor_x_temp = cursor_x;
drawSymbol(14);
drawFilledRect(cursor_x_temp, 0, cursor_x_temp + 12, 2 + (8 - state), true);
}

View File

@@ -71,7 +71,7 @@ uint8_t lookupVoltageLevel(uint8_t level) {
return (level * 33) + (33 * 2); return (level * 33) + (33 * 2);
} }
void resetSettings() { void resetSettings() {
memset((void*)&systemSettings,0,sizeof(systemSettingsType));
systemSettings.SleepTemp = 150; //Temperature the iron sleeps at - default 150.0 C systemSettings.SleepTemp = 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.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
@@ -90,6 +90,10 @@ void resetSettings() {
systemSettings.CalibrationOffset = 10; //This appears to be quite close for both of my tips, in both of my handles systemSettings.CalibrationOffset = 10; //This appears to be quite close for both of my tips, in both of my handles
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_I =50;
systemSettings.PID_D =15;
saveSettings(); saveSettings();
} }

View File

@@ -9,6 +9,8 @@ ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1; DMA_HandleTypeDef hdma_adc1;
I2C_HandleTypeDef hi2c1; I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_rx;
DMA_HandleTypeDef hdma_i2c1_tx;
IWDG_HandleTypeDef hiwdg; IWDG_HandleTypeDef hiwdg;
TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim2;
@@ -36,7 +38,7 @@ void Setup_HAL() {
MX_TIM2_Init(); MX_TIM2_Init();
MX_IWDG_Init(); MX_IWDG_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) ADCReadings, 64); HAL_ADC_Start_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
} }
@@ -75,7 +77,7 @@ void SystemClock_Config(void) {
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 2,3,4,5,6,7,12,13,14
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //64 mhz to soem peripherals and adc 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);
@@ -129,31 +131,39 @@ 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 clocks = 0.2ms
* * Charge time is 0.016 uS ideally
* So Sampling time must be >= 0.016uS
* 1/10.66MHz is 0.09uS, so 1 CLK is *should* be enough
* */ * */
sConfigInjected.InjectedChannel = ADC_CHANNEL_8; sConfigInjected.InjectedChannel = ADC_CHANNEL_8;
sConfigInjected.InjectedRank = 1; sConfigInjected.InjectedRank = 1;
sConfigInjected.InjectedNbrOfConversion = 4; sConfigInjected.InjectedNbrOfConversion = 4;
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_13CYCLES_5; sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5;
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1; sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1;
sConfigInjected.AutoInjectedConv = DISABLE; sConfigInjected.AutoInjectedConv = DISABLE;
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
sConfigInjected.InjectedOffset = 0; sConfigInjected.InjectedOffset = 0;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfigInjected.InjectedRank = 2; sConfigInjected.InjectedRank = 2;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedRank = 3; sConfigInjected.InjectedRank = 3;
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
while (HAL_ADCEx_Calibration_Start(&hadc1) != 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 = 300000; //200Khz 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;
@@ -252,11 +262,11 @@ static void MX_TIM2_Init(void) {
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 117; sConfigOC.Pulse = 118;
/* /*
* It takes 4 milliseconds for output to be stable after PWM turns off. * It takes 4 milliseconds for output to be stable after PWM turns off.
* Assume ADC samples in 0.5ms * Assume ADC samples in 0.5ms
* We need to set this to 100% + 4.5ms * We need to set this to 100% + 5.5ms
* */ * */
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
@@ -285,13 +295,13 @@ static void MX_DMA_Init(void) {
/* DMA interrupt init */ /* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */ /* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 5, 0); HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* DMA1_Channel6_IRQn interrupt configuration */ /* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 5, 0); HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn); HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
/* DMA1_Channel7_IRQn interrupt configuration */ /* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 5, 0); HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn); HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
} }
@@ -333,13 +343,16 @@ static void MX_GPIO_Init(void) {
| GPIO_PIN_15; | 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);
//Set PA 11 and PA 12 to GND to stop usb detection, 14 re-rused for debug
//Set PA 11 and PA 12 to GND to stop usb detection, 13/14 re-rused for debug
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;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
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_14, GPIO_PIN_RESET);
/*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;
@@ -358,10 +371,11 @@ static void MX_GPIO_Init(void) {
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(OLED_RESET_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(OLED_RESET_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : INT_Orientation_Pin INT_Movement_Pin */ /* Configure GPIO pins : INT_Orientation_Pin INT_Movement_Pin */
/* Not used anymore*/
GPIO_InitStruct.Pin = INT_Orientation_Pin | INT_Movement_Pin; GPIO_InitStruct.Pin = INT_Orientation_Pin | INT_Movement_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_PULLUP; //Technically the IMU is P-P but safer to pullup (very tiny current cost) GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure peripheral I/O remapping */ /*Configure peripheral I/O remapping */

View File

@@ -75,6 +75,15 @@ const char* SettingsDescriptions[17] = {
/* Calibrate input voltage */ "VIN Calibration. Buttons adjust, long press to exit", /* Calibrate input voltage */ "VIN Calibration. Buttons adjust, long press to exit",
/* Advanced soldering screen enabled */ "Display detailed information while soldering", /* Advanced soldering screen enabled */ "Display detailed information while soldering",
/* Description Scroll Speed */ "Speed this text scrolls past at", /* Description Scroll Speed */ "Speed this text scrolls past at",
#ifdef PIDSETTINGS
"PID P term. Inverse values! This acts as a divisor. So Larger numbers == typically smaller in other systems",
"PID I term. Inverse values! This acts as a divisor. So Larger numbers == typically smaller in other systems",
"PID D term. Inverse values! This acts as a divisor. So Larger numbers == typically smaller in other systems",
#endif
}; };
const char* SettingsCalibrationWarning = "Please ensure the tip is at room temperature before continuing!"; const char* SettingsCalibrationWarning = "Please ensure the tip is at room temperature before continuing!";
@@ -93,7 +102,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -107,7 +116,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Power", "source"}, /* (<= 11) Power source (DC or batt) */ {"Power", "source"},
/* (<= 9) Sleep temperature */ {"Sleep", "temp"}, /* (<= 9) Sleep temperature */ {"Sleep", "temp"},
/* (<= 9) Sleep timeout */ {"Sleep", "timeout"}, /* (<= 9) Sleep timeout */ {"Sleep", "timeout"},
/* (<= 11) Shutdown timeout */ {"Shutdown", "timeout"}, /* (<= 10) Shutdown timeout */ {"Shutdown", "timeout"},
/* (<= 13) Motion sensitivity level */ {"Motion", "sensitivity"}, /* (<= 13) Motion sensitivity level */ {"Motion", "sensitivity"},
/* (<= 13) Temperature in F and C */ {"Temperature", "units"}, /* (<= 13) Temperature in F and C */ {"Temperature", "units"},
/* (<= 13) Advanced idle display mode enabled */ {"Detailed", "idle screen"}, /* (<= 13) Advanced idle display mode enabled */ {"Detailed", "idle screen"},
@@ -121,6 +130,13 @@ const char* SettingsShortNames[17][2] = {
/* (<= 16) Calibrate input voltage */ {"Calibrate", "input voltage?"}, /* (<= 16) Calibrate input voltage */ {"Calibrate", "input voltage?"},
/* (<= 13) Advanced soldering screen enabled */ {"Detailed", "solder screen"}, /* (<= 13) Advanced soldering screen enabled */ {"Detailed", "solder screen"},
/* (<= 11) Display Help Text Scroll Speed */ {"Description","Scroll Speed"}, /* (<= 11) Display Help Text Scroll Speed */ {"Description","Scroll Speed"},
#ifdef PIDSETTINGS
{"PID","P"},
{"PID","I"},
{"PID","D"},
#endif
}; };
// SettingsMenuEntries lengths <= 13 per line (\n starts second line) // SettingsMenuEntries lengths <= 13 per line (\n starts second line)
@@ -177,7 +193,7 @@ const char* IdleTipString = "Връх:"; // IdleTipString+
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "ВРЪХ ЛОША ВРЪЗКА"; // <=16 chars const char* TipDisconnectedString = "ВРЪХ ЛОША ВРЪЗКА"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Захранване: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Захранване: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -191,7 +207,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Източник", "захранване"}, /* (<= 11) Power source (DC or batt) */ {"Източник", "захранване"},
/* (<= 9) Sleep temperature */ {"Темп.", "сън"}, /* (<= 9) Sleep temperature */ {"Темп.", "сън"},
/* (<= 9) Sleep timeout */ {"Време", "сън"}, /* (<= 9) Sleep timeout */ {"Време", "сън"},
/* (<= 11) Shutdown timeout */ {"Време", "изкл."}, /* (<= 10) Shutdown timeout */ {"Време", "изкл."},
/* (<= 13) Motion sensitivity level */ {"Усещане", "за движение"}, /* (<= 13) Motion sensitivity level */ {"Усещане", "за движение"},
/* (<= 13) Temperature in F and C */ {"Единици за", "температура"}, /* (<= 13) Temperature in F and C */ {"Единици за", "температура"},
/* (<= 13) Advanced idle display mode enabled */ {"Детайлен", "екран в покой"}, /* (<= 13) Advanced idle display mode enabled */ {"Детайлен", "екран в покой"},
@@ -225,42 +241,42 @@ const char* SettingsMenuEntriesDescriptions[4] = {
const char* SettingsDescriptions[17] = { const char* SettingsDescriptions[17] = {
// These are all the help text for all the settings. // These are all the help text for all the settings.
// No requirements on spacing or length. // No requirements on spacing or length.
/* Power source (DC or batt) */ "Источник питания. Установка напряжения отключения. <DC 10V> <S 3.3 V на батарею>", /* Power source (DC or batt) */ "Установка минимального напряжения. <DC - 10V, 3S - 9.9V, 4S - 13.2V, 5S - 16.5V, 6S - 19.8V>",
/* Sleep temperature */ "Температура режима ожидания <С>", /* Sleep temperature */ "Температура режима ожидания <C°/F°>.",
/* Sleep timeout */ "Время до перехода в режим ожидания <Минуты>", /* Sleep timeout */ "Время до перехода в режим ожидания <Доступно отключение>.",
/* Shutdown timeout */ "Время до отключения <Минуты>", /* Shutdown timeout */ "Время до отключения <Доступно отключение>.",
/* Motion sensitivity level */ "Акселерометр <0. Выкл. 1. мин. чувствительный 9. макс. чувствительный>", /* Motion sensitivity level */ "Акселерометр <0 - Выкл., 1 - Мин. чувствительность, 9 - Макс. чувствительность>.",
/* Temperature in F and C */ "В чем измерять температуру", /* Temperature in F and C */ "Единица измерения температуры. < C - Цельсий, F - Фаренгейт >",
/* Advanced idle display mode enabled */ "Показывать детальную информацию маленьким шрифтом на домашнем экране", /* Advanced idle display mode enabled */ "Показывать детальную в режиме настроек <Вместо картинки>.",
/* Display rotation mode */ "Ориентация дисплея <A. Автоматический, Л. Левая рука, П. Правая рука>", /* Display rotation mode */ "Ориентация дисплея. <A - Автоповорот, L - Левша, R - Правша>",
/* Boost enabled */ "Турбо-режим при удержании кнопки А при пайке ", /* Boost enabled */ "Турбо-режим при удержании кнопки А в режиме пайки.",
/* Boost temperature */ "Температура в турбо-режиме", /* Boost temperature */ "Температура в Турбо-режиме.",
/* Automatic start mode */ "Автоматический запуск паяльника при включении питания. T=Нагрев, S=Режим ожидания,F=Выкл.", /* Automatic start mode */ "Автоматический переход в режим пайки при включении питания.",
/* Cooldown blink */ "Показывать температуру на экране охлаждения, пока жало остается горячим.", /* Cooldown blink */ "Показывать изменение температуры в процессе охлаждения, мигая экраном.",
/* Temperature calibration enter menu */ "Калибровка термодатчика.", /* Temperature calibration enter menu */ "Калибровка температурного датчика.",
/* Settings reset command */ "Сброс всех настроек.", /* Settings reset command */ "Сброс всех настроек к исходным значения.",
/* Calibrate input voltage */ "Калибровка напряжения входа. Настройка кнопками, нажать и удержать чтобы завершить.", /* Calibrate input voltage */ "Калибровка напряжения входа. Настройка кнопками, нажать и удержать чтобы завершить.",
/* Advanced soldering screen enabled */ "Показывать детальную информацию при пайке.", /* Advanced soldering screen enabled */ "Показывать детальную информацию при пайке.",
/* Description Scroll Speed */ "Speed this text scrolls past at", /* Description Scroll Speed */ "Скорость прокрутки текста.",
}; };
const char* SettingsCalibrationWarning = "Убедитесь, что жало остыло до комнатной температуры, прежде чем продолжать!"; const char* SettingsCalibrationWarning = "Убедитесь, что жало остыло до комнатной температуры, прежде чем продолжать!";
const char* SettingsResetWarning = "Are you sure to reset settings to default values?"; const char* SettingsResetWarning = "Вы действительно хотите сбросить настройки до значений по умолчанию?";
const char* UVLOWarningString = "БАТ РАЗР"; // <=8 chars const char* UVLOWarningString = "АККУМ--"; // <=8 chars
const char* UndervoltageString = "Undervoltage"; // <=16 chars const char* UndervoltageString = "Под питанием"; // <=16 chars
const char* InputVoltageString = "Input V: "; // <=11 chars, preferably end with a space const char* InputVoltageString = "Питание(B):"; // <=11 chars, preferably end with a space
const char* WarningTipTempString = "Tip Temp: "; // <=12 chars, preferably end with a space const char* WarningTipTempString = "Жало t°: "; // <=12 chars, preferably end with a space
const char* BadTipString = "BAD TIP"; // <=8 chars const char* BadTipString = "Жало--"; // <=8 chars
const char* SleepingSimpleString = "Хррр"; // Must be <= 4 chars const char* SleepingSimpleString = "Сон "; // Must be <= 4 chars
const char* SleepingAdvancedString = "Ожидание..."; // <=16 chars const char* SleepingAdvancedString = "Ожидание..."; // <=16 chars
const char* WarningSimpleString = " АЙ!"; // Must be <= 4 chars const char* WarningSimpleString = " АЙ!"; // Must be <= 4 chars
const char* WarningAdvancedString = "ОСТОРОЖНО! ГОРЯЧО"; // <=16 chars const char* WarningAdvancedString = "ВНИМАНИЕ ГОРЯЧО!"; // <=16 chars
cconst char* SleepingTipAdvancedString = "Tip:"; // <=6 chars const char* SleepingTipAdvancedString = "Жало:"; // <=6 chars
const char* IdleTipString = "Tip:"; // IdleTipString+IdleSetString <= 10 const char* IdleTipString = "Жало:"; // IdleTipString+IdleSetString <= 10
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " ->"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "Жало отключено!"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Питание: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
/* /*
* #TODO change support for multibyte constants here * #TODO change support for multibyte constants here
@@ -272,40 +288,40 @@ const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
const char SettingAutoChar = 'A'; const char SettingAutoChar = 'A';
const char SettingFastChar = 'F'; const char SettingFastChar = '+';
const char SettingSlowChar = 'S'; const char SettingSlowChar = '-';
const enum ShortNameType SettingsShortNameType = SHORT_NAME_SINGLE_LINE; const enum ShortNameType SettingsShortNameType = SHORT_NAME_DOUBLE_LINE;
const char* SettingsShortNames[17][2] = { const char* SettingsShortNames[17][2] = {
/* (<= 5) Power source (DC or batt) */ {"ИстП "}, /* (<= 11) Power source (DC or batt) */ {"Источник","питания"}, //8,7
/* (<= 4) Sleep temperature */ {"Тожд"}, /* (<= 9) Sleep temperature */ {"Темпер.","сна"}, //7,3
/* (<= 4) Sleep timeout */ {"Вожд "}, /* (<= 9) Sleep timeout */ {"Таймаут","сна"}, //7,3
/* (<= 5) Shutdown timeout */ {"Тоткл "}, /* (<= 10) Shutdown timeout */ {"Время до","отключения"}, //8,10
/* (<= 6) Motion sensitivity level */ {"ЧувсДв "}, /* (<= 13) Motion sensitivity level */ {"Чувст. сенсо-","ра движения"}, //13,11
/* (<= 6) Temperature in F and C */ {"ЕдТемп "}, /* (<= 13) Temperature in F and C */ {"Формат темпе-","ратуры(C°/F°)"}, //13,13
/* (<= 6) Advanced idle display mode enabled */ {"ИнфОжд "}, /* (<= 13) Advanced idle display mode enabled */ {"Подробный ре-","жим ожидания"}, //13,12
/* (<= 6) Display rotation mode */ {"ПовЭкр "}, /* (<= 13) Display rotation mode */ {"Автоповорот","экрана"}, //11,6
/* (<= 6) Boost enabled */ {"Турбо "}, /* (<= 13) Boost enabled */ {"Режим","Турбо"}, //5,5
/* (<= 4) Boost temperature */ {"Ттур "}, /* (<= 9) Boost temperature */ {"Темпер.","Турбо"}, //7,5
/* (<= 6) Automatic start mode */ {"Астарт"}, /* (<= 13) Automatic start mode */ {"Горячий","старт"}, //9,9
/* (<= 6) Cooldown blink */ {"Охлажд "}, /* (<= 13) Cooldown blink */ {"Показ t° при","остывании"}, //7,3
/* (<= 8) Temperature calibration enter menu */ {"КалибрТ"}, /* (<= 16) Temperature calibration enter menu */ {"Калибровка","температуры"}, //10,11
/* (<= 8) Settings reset command */ {"СБРОС?"}, /* (<= 16) Settings reset command */ {"Сбросить все","настройки?"}, //12,10
/* (<= 8) Calibrate input voltage */ {"КалибрU?"}, /* (<= 16) Calibrate input voltage */ {"Калибровка","напряжения"}, //10,10
/* (<= 6) Advanced soldering screen enabled */ {"ИнфПай "}, /* (<= 13) Advanced soldering screen enabled */ {"Подробный ре-","жим пайки"}, //13,9
/* (<= 6) Message Scroll Speed */ {"DESCSP"}, /* (<= 11) Message Scroll Speed */ {"Скорость","текста"}, //8,6
}; };
const char* SettingsMenuEntries[4] = { const char* SettingsMenuEntries[4] = {
/*Soldering Menu*/"Soldering\nSettings", /*Soldering Menu*/"Пайка",
/* Power Saving Menu*/"Sleep\nModes", /* Power Saving Menu*/"Сон",
/* UI Menu*/"User\nInterface", /* UI Menu*/"Интерфейс",
/* Advanced Menu*/"Advanced\nOptions", }; /* Advanced Menu*/"Другие", };
const char* SettingsMenuEntriesDescriptions[4] ={ const char* SettingsMenuEntriesDescriptions[4] ={
"Soldering settings", "Настройки для режима пайки. Действуют при включенном жале.",
"Power Saving Settings", "Настройки при бездействии. Полезно чтобы не обжечься и случайно не сжечь жилище.",
"User Interface settings", "Пользовательский интерфейс.",
"Advanced options" "Расширенные настройки. Дополнительные удобства."
}; };
#endif #endif
@@ -348,7 +364,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSe
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'D'; // D is "Derecha" = Right const char SettingRightChar = 'D'; // D is "Derecha" = Right
const char SettingLeftChar = 'I'; // I is "Izquierda" = Left const char SettingLeftChar = 'I'; // I is "Izquierda" = Left
@@ -390,84 +406,90 @@ const char* SettingsMenuEntriesDescriptions[4] ={
}; };
#endif #endif
#ifdef LANG_SE #ifdef LANG_FI
const char* SettingsDescriptions[17] = { const char* SettingsDescriptions[17] = {
// These are all the help text for all the settings. // These are all the help text for all the settings.
// No requirements on spacing or length. // No requirements on spacing or length.
/* Power source (DC or batt) */ "Источник питания. Установка напряжения отключения. <DC 10V> <S 3.3 V на батарею>", /* Power source (DC or batt) */ "Käytettävä virtalähde. Asettaa katkaisujänniteen. <DC 10V, 3S=9.9V, 4S=13.2V, 5S=16.5V, 6S=19.8V>",
/* Sleep temperature */ "Температура Сна <С>", /* Sleep temperature */ "Lepotilan lämpötila. <C>", //"Lepolämpötila <C>",
/* Sleep timeout */ "Переход в режим Сна <Минуты>", /* Sleep timeout */ "Lepotilan viive. <minuuttia/sekuntia>",//"Lepoviive <minuuttia/sekuntia>",
/* Shutdown timeout */ "Переходит в режим ожидания <Минуты>", /* Shutdown timeout */ "Automaattisen sammutuksen aikaviive. <minuuttia>",
/* Motion sensitivity level */ "Акселерометр <0. Выкл. 1. мин. чувствительный 9. макс. чувствительный>", /* Motion sensitivity level */ "Liikkeentunnistuksen herkkyys. <0=pois, 1=epäherkin, 9=herkin>", //"Liikeherkkyys <0=pois, 1=epäherkin, 9=herkin>",
/* Temperature in F and C */ "В чем измерять температуру", /* Temperature in F and C */ "Lämpötilan yksikkö. <C=celsius, F=fahrenheit>",
/* Advanced idle display mode enabled */ "Display detailed information in a smaller font on the idle screen.", /* Advanced idle display mode enabled */ "Näyttää yksityiskohtaisemmat tiedot lepotilassa.", //"Näyttää tarkemmat tiedot leponäytössä",
/* Display rotation mode */ "Ориентация Дисплея <A. Автоматический L. Левая Рука R. Правая Рука>", /* Display rotation mode */ "Näytön kierto. <A=automaattinen O=oikeakätinen V=vasenkätinen>", //"Näytön suunta <A=automaattinen O=oikeakätinen V=vasenkätinen>",
/* Boost enabled */ "Активация кнопки A для Турбо режима до 450С при пайке ", /* Boost enabled */ "Etupainikeella siirrytään juotettaessa tehostustilaan.",
/* Boost temperature */ "Установка температуры для Турбо режима", /* Boost temperature */ "Tehostustilan lämpötila.", //"Tehostuksen lämpötila kun käytetään tehostustilaa",
/* Automatic start mode */ "Автоматический запуск паяльника при включении питания. T=Нагрев, S= Режим Сна,F=Выкл.", /* Automatic start mode */ "Käynnistää virrat kytkettäessä juotostilan automaattisesti. T=juotostila, S=Lepotila, F=Ei käytössä", //"Lämmitys käynnistyy automaattisesti kun virrat kytketään. T=juottamiseen, S=lepotilaan, F=ei käytössä",
/* Cooldown blink */ "Мигает температура на экране охлаждения, пока жало остается горячим.", /* Cooldown blink */ "Vilkuttaa jäähtyessä juotoskärjen lämpötilaa sen ollessa vielä vaarallisen kuuma.",//"Vilkutetaan näytössä lämpötilaa kun juotoskärki jäähtyy, mutta on yhä kuuma",
/* Temperature calibration enter menu */ "Calibrate tip offset.", /* Temperature calibration enter menu */ "Kalibroi kärjen lämpötilaeron.", //"Kalibroidaan juotoskärjen lämpötilaero",
/* Settings reset command */ "Reset all settings", /* Settings reset command */ "Palauta kaikki asetukset oletusarvoihin.", //"Palautetaan kaikki asetukset alkuperäisiksi",
/* Calibrate input voltage */ "VIN Calibration. Buttons adjust, long press to exit", /* Calibrate input voltage */ "Tulojännitten kalibrointi (VIN). Painikkeilla säädetään ja pitkään painamalla poistutaan.",
/* Advanced soldering screen enabled */ "Display detailed information while soldering", /* Advanced soldering screen enabled */ "Näyttää yksityiskohtaisemmat tiedot juotostilassa.", //"Näytetään tarkemmat tiedot juottamisen aikana",
/* Description Scroll Speed */ "Speed this text scrolls past at", /* Description Scroll Speed */ "Näiden selitetekstien vieritysnopeus." ,//"Tekstin vieritysnopeus näytöllä",
}; };
const char* SettingsCalibrationWarning = "Please ensure the tip is at room temperature before continuing!"; const char* SettingsCalibrationWarning = "Varmista että kärki on huoneenlämpöinen ennen jatkamista!"; //"Älä jatka ennen kuin kärki on jäähtynyt!";
const char* SettingsResetWarning = "Are you sure to reset settings to default values?"; const char* SettingsResetWarning = "Haluatko varmasti palauttaa oletusarvot?"; //"Haluatko palauttaa oletusarvot?";
const char* UVLOWarningString = "DC LOW"; // <=8 chars const char* UVLOWarningString = "DC LOW"; // <=8 chars
const char* UndervoltageString = "Undervoltage"; // <=16 chars const char* UndervoltageString = "Alijännite"; // <=16 chars
const char* InputVoltageString = "Input V: "; // <=11 chars, preferably end with a space const char* InputVoltageString = "Jännite: "; // <=11 chars, preferably end with a space
const char* WarningTipTempString = "Tip Temp: "; // <=12 chars, preferably end with a space const char* WarningTipTempString = "Lämpötila: "; // <=12 chars, preferably end with a space
const char* BadTipString = "BAD TIP"; // <=8 chars const char* BadTipString = "VIKATILA"; // <=8 chars
const char* SleepingSimpleString = "Zzzz"; // Must be <= 4 chars const char* SleepingSimpleString = "Zzz"; // Must be <= 4 chars
const char* SleepingAdvancedString = "Sleeping..."; // <=16 chars const char* SleepingAdvancedString = "Lepotila..."; // <=16 chars
const char* WarningSimpleString = "HOT!"; // Must be <= 4 chars const char* WarningSimpleString = "HOT"; // Must be <= 4 chars
const char* WarningAdvancedString = "WARNING! TIP HOT!"; // <=16 chars const char* WarningAdvancedString = " ! KÄRKI KUUMA !"; //"KUUMA KÄRKI"; // <=16 chars
const char* SleepingTipAdvancedString = "Tip:"; // <=6 chars const char* SleepingTipAdvancedString = "Kärki:"; // <=6 chars
const char* IdleTipString = "Tip:"; // IdleTipString+IdleSetString <= 10 const char* IdleTipString = "Kärki:"; // IdleTipString+IdleSetString <= 10
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Asetus:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "KÄRKI ON IRTI"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Teho: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="OFF"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'O';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'V';
const char SettingAutoChar = 'A'; const char SettingAutoChar = 'A';
const char SettingFastChar = 'F'; const char SettingFastChar = 'N'; //'F';
const char SettingSlowChar = 'S'; const char SettingSlowChar = 'H'; //'S';
const enum ShortNameType SettingsShortNameType = SHORT_NAME_SINGLE_LINE; const enum ShortNameType SettingsShortNameType = SHORT_NAME_DOUBLE_LINE;
const char* SettingsShortNames[17][2] = { const char* SettingsShortNames[17][2] = {
/* (<= 5) Power source (DC or batt) */ {"PWRSC"}, /* (<= 11) Power source (DC or batt) */ {"Virtalähde", "DC"},
/* (<= 4) Sleep temperature */ {"STMP"}, /* (<= 9) Sleep temperature */ {"Lepotilan", "lämpötila"},
/* (<= 4) Sleep timeout */ {"STME"}, /* (<= 9) Sleep timeout */ {"Lepotilan", "viive"},
/* (<= 5) Shutdown timeout */ {"SHTME"}, /* (<= 10) Shutdown timeout */ {"Sammutus", "viive"},
/* (<= 6) Motion sensitivity level */ {"MSENSE"}, /* (<= 13) Motion sensitivity level */ {"Liikkeen", "herkkyys"},
/* (<= 6) Temperature in F and C */ {"TMPUNT"}, /* (<= 13) Temperature in F and C */ {"Lämpötilan", "yksikkö"},
/* (<= 6) Advanced idle display mode enabled */ {"ADVIDL"}, /* (<= 13) Advanced idle display mode enabled */ {"Tiedot", "lepotilassa"},
/* (<= 6) Display rotation mode */ {"DSPROT"}, /* (<= 13) Display rotation mode */ {"Näytön", "kierto"},
/* (<= 6) Boost enabled */ {"BOOST"}, /* (<= 13) Boost enabled */ {"Tehostus", "käytössä"},
/* (<= 4) Boost temperature */ {"BTMP"}, /* (<= 9) Boost temperature */ {"Tehostus-", "lämpötila"},
/* (<= 6) Automatic start mode */ {"ASTART"}, /* (<= 13) Automatic start mode */ {"Autom.", "käynnistys"},
/* (<= 6) Cooldown blink */ {"CLBLNK"},
/* (<= 8) Temperature calibration enter menu */ {"TMP CAL?"}, /* (<= 13) Cooldown blink */ {"Jäähdytyksen", "vilkutus"},
/* (<= 8) Settings reset command */ {"RESET?"}, /* (<= 16) Temperature calibration enter menu */ {"Kalibroi", "lämpötila?"},
/* (<= 8) Calibrate input voltage */ {"CAL VIN?"}, /* (<= 16) Settings reset command */ {"Palauta", "tehdasasetukset?"},
/* (<= 6) Advanced soldering screen enabled */ {"ADVSLD"}, /* (<= 16) Calibrate input voltage */ {"Kalibroi", "tulojännite?"},
/* (<= 6) Message Scroll Speed */ {"DESCSP"}, /* (<= 13) Advanced soldering screen enabled */ {"Tarkempi", "juotosnäyttö"},
/* (<= 11) Display Help Text Scroll Speed */ {"Tietojen","näyttönopeus"},
}; };
// SettingsMenuEntries lengths <= 13 per line (\n starts second line)
const char* SettingsMenuEntries[4] = { const char* SettingsMenuEntries[4] = {
/*Soldering Menu*/"Soldering\nSettings", /* Soldering Menu */ "Juotos-\nasetukset" ,//"Juotos\nasetukset",
/* Power Saving Menu*/"Sleep\nModes", /* Power Saving Menu */ "Lepotilan\nasetukset", // "Lepo\ntila",
/* UI Menu*/"User\nInterface", /* UI Menu */ "Käyttö-\nliittymä", //"Käyttö\nliittymä",
/* Advanced Menu*/"Advanced\nOptions", }; /* Advanced Menu */ "Lisä-\nasetukset", // "Lisä\nasetukset",
const char* SettingsMenuEntriesDescriptions[4] ={ };
"Soldering settings",
"Power Saving Settings", const char* SettingsMenuEntriesDescriptions[4] = {
"User Interface settings", "Juotosasetukset",
"Advanced options" "Virransäästöasetukset",
"Käyttöliittymän asetukset",
"Lisäasetukset"
}; };
#endif #endif
@@ -476,15 +498,15 @@ const char* SettingsDescriptions[17] = {
// These are all the help text for all the settings. // These are all the help text for all the settings.
// No requirements on spacing or length. // No requirements on spacing or length.
/* Power source (DC or batt) */"Scegli la sorgente di alimentazione; se a batteria, limita lo scaricamento al valore di soglia <DC: 10V; S: 3.3V per cella>", /* Power source (DC or batt) */"Scegli la sorgente di alimentazione; se a batteria, limita lo scaricamento al valore di soglia <DC: 10V; S: 3.3V per cella>",
/* Sleep temperature */"Imposta la temperatura da mantenere in modalità standby <°C>", /* Sleep temperature */"Imposta la temperatura da mantenere in modalità Standby <°C/°F>",
/* Sleep timeout */"Imposta il timer per entrare in modalità standby <minuti/secondi>", /* Sleep timeout */"Imposta il timer per entrare in modalità Standby <minuti/secondi>",
/* Shutdown timeout */"Imposta il timer per lo spegnimento <minuti>", /* Shutdown timeout */"Imposta il timer per lo spegnimento <minuti>",
/* Motion sensitivity level */"Imposta la sensibilità al movimento per uscire dalla modalità standby <0: nessuna; 1: minima; 9: massima>", /* Motion sensitivity level */"Imposta la sensibilità al movimento per uscire dalla modalità Standby <0: nessuna; 1: minima; 9: massima>",
/* Temperature in F and C */"Scegli l'unità di misura per la temperatura <C: grado Celsius; F: grado Farenheit>", /* Temperature in F and C */"Scegli l'unità di misura per la temperatura <C: grado Celsius; F: grado Farenheit>",
/* Advanced idle display mode enabled */"Mostra informazioni dettagliate con un carattere più piccolo all'interno della schermata principale", /* Advanced idle display mode enabled */"Mostra informazioni dettagliate con un carattere più piccolo all'interno della schermata principale",
/* Display rotation mode */"Imposta l'orientamento del display <A: automatico; S: mano sinistra; D: mano destra>", /* Display rotation mode */"Imposta l'orientamento del display <A: automatico; S: mano sinistra; D: mano destra>",
/* Boost enabled */"Il tasto superiore attiva la funzione \"turbo\" durante la modalità Saldatura", /* Boost enabled */"Il tasto superiore attiva la funzione «Turbo» durante la modalità Saldatura",
/* Boost temperature */"Imposta la temperatura della funzione \"turbo\"", /* Boost temperature */"Imposta la temperatura della funzione «Turbo»",
/* Automatic start mode */"Attiva automaticamente il saldatore quando viene alimentato <A: saldatura; S: standby; D: disattiva>", /* Automatic start mode */"Attiva automaticamente il saldatore quando viene alimentato <A: saldatura; S: standby; D: disattiva>",
/* Cooldown blink */"Mostra la temperatura durante il raffreddamento se la punta è ancora calda", /* Cooldown blink */"Mostra la temperatura durante il raffreddamento se la punta è ancora calda",
/* Temperature calibration enter menu */"Calibra le rilevazioni di temperatura", /* Temperature calibration enter menu */"Calibra le rilevazioni di temperatura",
@@ -500,7 +522,7 @@ const char* SettingsResetWarning = "Ripristinare le impostazioni iniziali?";
const char* UVLOWarningString = "DC BASSA"; // <=8 chars const char* UVLOWarningString = "DC BASSA"; // <=8 chars
const char* UndervoltageString = "DC INSUFFICIENTE"; // <=16 chars const char* UndervoltageString = "DC INSUFFICIENTE"; // <=16 chars
const char* InputVoltageString = "V ingresso:"; // <=11 chars, preferably end with a space const char* InputVoltageString = "V ingresso:"; // <=11 chars, preferably end with a space
const char* WarningTipTempString = "Temp punta:"; // <=12 chars, preferably end with a space const char* WarningTipTempString = "Punta:"; // <=12 chars, preferably end with a space
const char* BadTipString = "PUNTA NO"; // <=8 chars const char* BadTipString = "PUNTA NO"; // <=8 chars
const char* SleepingSimpleString = "ZZZ "; // Must be <= 4 chars const char* SleepingSimpleString = "ZZZ "; // Must be <= 4 chars
const char* SleepingAdvancedString = "Standby"; // <=16 chars const char* SleepingAdvancedString = "Standby"; // <=16 chars
@@ -511,7 +533,7 @@ const char* IdleTipString = "Punta:"; // IdleTipString+IdleSetS
const char* IdleSetString = "/"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = "/"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "PUNTA ASSENTE"; // <=16 chars const char* TipDisconnectedString = "PUNTA ASSENTE"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Potenza:"; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Potenza:"; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="OFF"; // 3 chars max
const char SettingRightChar = 'D'; const char SettingRightChar = 'D';
const char SettingLeftChar = 'S'; const char SettingLeftChar = 'S';
@@ -525,13 +547,13 @@ const enum ShortNameType SettingsShortNameType = SHORT_NAME_DOUBLE_LINE;
/* (<= 11) Power source (DC or batt) */ {"Sorgente", "alimentaz"}, /* (<= 11) Power source (DC or batt) */ {"Sorgente", "alimentaz"},
/* (<= 9) Sleep temperature */ {"Temp", "standby"}, /* (<= 9) Sleep temperature */ {"Temp", "standby"},
/* (<= 9) Sleep timeout */ {"Timer", "standby"}, /* (<= 9) Sleep timeout */ {"Timer", "standby"},
/* (<= 11) Shutdown timeout */ {"Timer", "spegnimento"}, /* (<= 10) Shutdown timeout */ {"Timer di", "arresto"},
/* (<= 13) Motion sensitivity level */ {"Sensibilità", "al movimento"}, /* (<= 13) Motion sensitivity level */ {"Sensibilità", "al movimento"},
/* (<= 13) Temperature in F and C */ {"Unità di", "temperatura"}, /* (<= 13) Temperature in F and C */ {"Unità di", "temperatura"},
/* (<= 13) Advanced idle display mode enabled */ {"Mostra", "dettagli"}, /* (<= 13) Advanced idle display mode enabled */ {"Mostra", "dettagli"},
/* (<= 13) Display rotation mode */ {"Orientamento", "display"}, /* (<= 13) Display rotation mode */ {"Orientamento", "display"},
/* (<= 13) Boost enabled */ {"Funzione", "\"turbo\""}, /* (<= 13) Boost enabled */ {"Funzione", "«Turbo»"},
/* (<= 9) Boost temperature */ {"Temp", "\"turbo\""}, /* (<= 9) Boost temperature */ {"Temp", "«Turbo»"},
/* (<= 13) Automatic start mode */ {"Avvio", "automatico"}, /* (<= 13) Automatic start mode */ {"Avvio", "automatico"},
/* (<= 13) Cooldown blink */ {"Avviso", "punta calda"}, /* (<= 13) Cooldown blink */ {"Avviso", "punta calda"},
/* (<= 16) Temperature calibration enter menu */ {"Calibrazione", "temperatura"}, /* (<= 16) Temperature calibration enter menu */ {"Calibrazione", "temperatura"},
@@ -593,7 +615,7 @@ const char* IdleTipString = "PANNE:"; // IdleTipString+IdleS
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "PANNE DEBRANCH"; // <=16 chars const char* TipDisconnectedString = "PANNE DEBRANCH"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Puissance: "; // <= 12 chars const char* SolderingAdvancedPowerPrompt = "Puissance: "; // <= 12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'D'; const char SettingRightChar = 'D';
const char SettingLeftChar = 'G'; const char SettingLeftChar = 'G';
@@ -607,7 +629,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Source", "d'alim"}, /* (<= 11) Power source (DC or batt) */ {"Source", "d'alim"},
/* (<= 9) Sleep temperature */ {"Temp.", "veille"}, /* (<= 9) Sleep temperature */ {"Temp.", "veille"},
/* (<= 9) Sleep timeout */ {"Délai", "veille"}, /* (<= 9) Sleep timeout */ {"Délai", "veille"},
/* (<= 11) Shutdown timeout */ {"Délai", "extinction"}, /* (<= 10) Shutdown timeout */ {"Délai", "extinction"},
/* (<= 13) Motion sensitivity level */ {"Sensibilité", "au mouvement"}, /* (<= 13) Motion sensitivity level */ {"Sensibilité", "au mouvement"},
/* (<= 13) Temperature in F and C */ {"Unité de", "température"}, /* (<= 13) Temperature in F and C */ {"Unité de", "température"},
/* (<= 13) Advanced idle display mode enabled */ {"Ecran veille", "détaillé"}, /* (<= 13) Advanced idle display mode enabled */ {"Ecran veille", "détaillé"},
@@ -675,7 +697,7 @@ const char* IdleTipString = "Ist:"; // IdleTipString+IdleSe
const char* IdleSetString = " Soll:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Soll:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "Spitze fehlt"; // <=16 chars const char* TipDisconnectedString = "Spitze fehlt"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Leistung: "; // <= 12 chars const char* SolderingAdvancedPowerPrompt = "Leistung: "; // <= 12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -689,7 +711,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Spannungs-", "quelle"}, /* (<= 11) Power source (DC or batt) */ {"Spannungs-", "quelle"},
/* (<= 9) Sleep temperature */ {"Ruhetemp-", "eratur"}, /* (<= 9) Sleep temperature */ {"Ruhetemp-", "eratur"},
/* (<= 9) Sleep timeout */ {"Ruhever-", "zögerung"}, /* (<= 9) Sleep timeout */ {"Ruhever-", "zögerung"},
/* (<= 11) Shutdown timeout */ {"Abschalt-", "zeit"}, /* (<= 10) Shutdown timeout */ {"Abschalt-", "zeit"},
/* (<= 13) Motion sensitivity level */ {"Bewegungs-", "empfindlichk."}, /* (<= 13) Motion sensitivity level */ {"Bewegungs-", "empfindlichk."},
/* (<= 13) Temperature in F and C */ {"Temperatur-", "einheit"}, /* (<= 13) Temperature in F and C */ {"Temperatur-", "einheit"},
/* (<= 13) Advanced idle display mode enabled */ {"Detaillierte", "Ruheansicht"}, /* (<= 13) Advanced idle display mode enabled */ {"Detaillierte", "Ruheansicht"},
@@ -756,7 +778,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSe
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -837,7 +859,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -918,7 +940,7 @@ const char* IdleTipString = "Vrh: "; // IdleTipString+IdleSet
const char* IdleSetString = " / "; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " / "; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "VRH NIJE SPOJEN!"; // <=16 chars const char* TipDisconnectedString = "VRH NIJE SPOJEN!"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Snaga: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Snaga: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'D'; const char SettingRightChar = 'D';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -932,7 +954,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Izvor", "napajanja"}, /* (<= 11) Power source (DC or batt) */ {"Izvor", "napajanja"},
/* (<= 9) Sleep temperature */ {"Temp", "spavanja"}, /* (<= 9) Sleep temperature */ {"Temp", "spavanja"},
/* (<= 9) Sleep timeout */ {"Vrijeme", "spavanja"}, /* (<= 9) Sleep timeout */ {"Vrijeme", "spavanja"},
/* (<= 11) Shutdown timeout */ {"Vrijeme", "gašenja"}, /* (<= 10) Shutdown timeout */ {"Vrijeme", "gašenja"},
/* (<= 13) Motion sensitivity level */ {"Osjetljivost", "pokreta"}, /* (<= 13) Motion sensitivity level */ {"Osjetljivost", "pokreta"},
/* (<= 13) Temperature in F and C */ {"Jedinica", "temperature"}, /* (<= 13) Temperature in F and C */ {"Jedinica", "temperature"},
/* (<= 13) Advanced idle display mode enabled */ {"Detalji", "pri čekanju"}, /* (<= 13) Advanced idle display mode enabled */ {"Detalji", "pri čekanju"},
@@ -997,7 +1019,7 @@ const char* IdleTipString = "Hrot:"; // IdleTipString+IdleSet
const char* IdleSetString = " Cíl:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Cíl:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "HROT NEPŘIPOJEN"; // <=16 chars const char* TipDisconnectedString = "HROT NEPŘIPOJEN"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Ohřev: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Ohřev: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'P'; const char SettingRightChar = 'P';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -1011,7 +1033,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Zdroj", "napájení"}, /* (<= 11) Power source (DC or batt) */ {"Zdroj", "napájení"},
/* (<= 9) Sleep temperature */ {"Teplota v", "r. spánku"}, /* (<= 9) Sleep temperature */ {"Teplota v", "r. spánku"},
/* (<= 9) Sleep timeout */ {"Čas do", "r. spánku"}, /* (<= 9) Sleep timeout */ {"Čas do", "r. spánku"},
/* (<= 11) Shutdown timeout */ {"Čas do", "vypnutí"}, /* (<= 10) Shutdown timeout */ {"Čas do", "vypnutí"},
/* (<= 13) Motion sensitivity level */ {"Citlivost", "det. pohybu"}, /* (<= 13) Motion sensitivity level */ {"Citlivost", "det. pohybu"},
/* (<= 13) Temperature in F and C */ {"Jednotky", "teploty"}, /* (<= 13) Temperature in F and C */ {"Jednotky", "teploty"},
/* (<= 13) Advanced idle display mode enabled */ {"Podrobnosti", "na vých. obr."}, /* (<= 13) Advanced idle display mode enabled */ {"Podrobnosti", "na vých. obr."},
@@ -1082,7 +1104,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'R'; const char SettingRightChar = 'R';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -1163,7 +1185,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'H'; const char SettingRightChar = 'H';
const char SettingLeftChar = 'V'; const char SettingLeftChar = 'V';
@@ -1244,7 +1266,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'P'; const char SettingRightChar = 'P';
const char SettingLeftChar = 'L'; const char SettingLeftChar = 'L';
@@ -1325,7 +1347,7 @@ const char* IdleTipString = "Ponta:"; // IdleTipString+IdleSetSt
const char* IdleSetString = " Aj:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Aj:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "SEM PONTA"; // <=16 chars const char* TipDisconnectedString = "SEM PONTA"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'D'; const char SettingRightChar = 'D';
const char SettingLeftChar = 'C'; const char SettingLeftChar = 'C';
@@ -1406,7 +1428,7 @@ const char* IdleTipString = "Ant:"; // IdleTipString+Idle
const char* IdleSetString = " Nust:"; // preferably start with a space; IdleTipString+IdleSetString <= 10 const char* IdleSetString = " Nust:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "ANTGAL ATJUNGTAS"; // <=16 chars const char* TipDisconnectedString = "ANTGAL ATJUNGTAS"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Maitinimas: "; // <=12 chars const char* SolderingAdvancedPowerPrompt = "Maitinimas: "; // <=12 chars
const char* OffString ="Off";// 3 chars max const char* OffString ="Off"; // 3 chars max
const char SettingRightChar = 'D'; const char SettingRightChar = 'D';
const char SettingLeftChar = 'K'; const char SettingLeftChar = 'K';
@@ -1420,7 +1442,7 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Maitinimo", "šaltinis"}, /* (<= 11) Power source (DC or batt) */ {"Maitinimo", "šaltinis"},
/* (<= 9) Sleep temperature */ {"Miego", "temperat."}, /* (<= 9) Sleep temperature */ {"Miego", "temperat."},
/* (<= 9) Sleep timeout */ {"Miego", "laikas"}, /* (<= 9) Sleep timeout */ {"Miego", "laikas"},
/* (<= 11) Shutdown timeout */ {"Išjungimo", "laikas"}, /* (<= 10) Shutdown timeout */ {"Išjungimo", "laikas"},
/* (<= 13) Motion sensitivity level */ {"Jautrumas", "judesiui"}, /* (<= 13) Motion sensitivity level */ {"Jautrumas", "judesiui"},
/* (<= 13) Temperature in F and C */ {"Temperatūros", "vienetai"}, /* (<= 13) Temperature in F and C */ {"Temperatūros", "vienetai"},
/* (<= 13) Advanced idle display mode enabled */ {"Detalus lauki-", "mo ekranas"}, /* (<= 13) Advanced idle display mode enabled */ {"Detalus lauki-", "mo ekranas"},
@@ -1448,3 +1470,87 @@ const char* SettingsMenuEntriesDescriptions[4] ={
"Išplėstiniai nustatymai" "Išplėstiniai nustatymai"
}; };
#endif #endif
#ifdef LANG_UA
const char* SettingsDescriptions[17] = {
// These are all the help text for all the settings.
// No requirements on spacing or length.
/* Power source (DC or batt) */ "Установка напруги відключення. <DC - 10V, 3S - 9.9V, 4S - 13.2V, 5S - 16.5V, 6S - 19.8V>",
/* Sleep temperature */ "Температура режиму очікування <C°/F°>",
/* Sleep timeout */ "Час до переходу в режим очікування <Доступно отключение>",
/* Shutdown timeout */ "Час до відключення <Доступно відключення>",
/* Motion sensitivity level */ "Акселерометр <0 - Викл. 1 хв. чутливості 9 - макс. чутливості>",
/* Temperature in F and C */ "Одиниця виміру температури <C - Цельсій, F - Фаренгейт>",
/* Advanced idle display mode enabled */ "Показувати детальну в режимі налаштувань <Замість картинки>",
/* Display rotation mode */ "Орієнтація дисплея <A - Автоповорот, L - Лівша, R - Правша>",
/* Boost enabled */ "Турбо-режим при утриманні кнопки А при пайці",
/* Boost temperature */ "Температура в Турбо-режимі",
/* Automatic start mode */ "Автоматичний перехід в режим пайки при включенні живлення.",
/* Cooldown blink */ "Показувати температуру на екрані охолодження, поки жало залишається гарячим, при цьому екран моргає",
/* Temperature calibration enter menu */ "Калібрування температурного датчика.",
/* Settings reset command */ "Скидання всіх параметрів до вихідних значень.",
/* Calibrate input voltage */ "Калібрування напруги входу. Налаштувати кнопками, натиснути і утримати щоб завершити.",
/* Advanced soldering screen enabled */ "Показувати детальну інформацію при пайці.",
/* Description Scroll Speed */ "Швидкість прокрутки тексту",
};
const char* SettingsCalibrationWarning = "Переконайтеся, що жало охололо до кімнатної температури, перш ніж продовжувати!";
const char* SettingsResetWarning = "Ви дійсно хочете скинути налаштування до значень за замовчуванням?";
const char* UVLOWarningString = "АККУМ--"; // <=8 chars
const char* UndervoltageString = "Під живленням"; // <=16 chars
const char* InputVoltageString = "Жив.(B):"; // <=11 chars, preferably end with a space
const char* WarningTipTempString = "Жало t°: "; // <=12 chars, preferably end with a space
const char* BadTipString = "Жало--"; // <=8 chars
const char* SleepingSimpleString = "Сон "; // Must be <= 4 chars
const char* SleepingAdvancedString = "Очікування..."; // <=16 chars
const char* WarningSimpleString = " АЙ!"; // Must be <= 4 chars
const char* WarningAdvancedString = "УВАГА ГАРЯЧЕ!"; // <=16 chars
const char* SleepingTipAdvancedString = "Жало:"; // <=6 chars
const char* IdleTipString = "Жало:"; // IdleTipString+IdleSetString <= 10
const char* IdleSetString = " ->"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "Жало вимкнено!"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Живлення: ";// <=12 chars
const char* OffString ="Вим"; // 3 chars max
const char SettingRightChar = 'R';
const char SettingLeftChar = 'L';
const char SettingAutoChar = 'A';
const char SettingFastChar = '+';
const char SettingSlowChar = '-';
const enum ShortNameType SettingsShortNameType = SHORT_NAME_DOUBLE_LINE;
const char* SettingsShortNames[17][2] = {
/* (<= 11) Power source (DC or batt) */ {"Джерело","живлення"}, //7,8
/* (<= 9) Sleep temperature */ {"Темпер.","сну"}, //7,3
/* (<= 9) Sleep timeout */ {"Таймаут","сну"}, //7,3
/* (<= 10) Shutdown timeout */ {"Часу до","вимкнення"}, //7,9
/* (<= 13) Motion sensitivity level */ {"Чутл. сенсо-","ру руху"}, //12,7
/* (<= 13) Temperature in F and C */ {"Формат темпе-","ратури(C°/F°)"}, //13,13
/* (<= 13) Advanced idle display mode enabled */ {"Детальний ре-","жим очікуван."}, //13,13
/* (<= 13) Display rotation mode */ {"Автоповорот","екрану"}, //11,6
/* (<= 13) Boost enabled */ {"Режим","Турбо"}, //5,5
/* (<= 9) Boost temperature */ {"Темпер.","Турбо"}, //7,5
/* (<= 13) Automatic start mode */ {"Гарячий","старт"}, //7,5
/* (<= 13) Cooldown blink */ {"Показ t° при","охолодж."}, //12,8
/* (<= 16) Temperature calibration enter menu */ {"Калібровка","температури"}, //10,11
/* (<= 16) Settings reset command */ {"Скинути всі","налаштування?"}, //11,13
/* (<= 16) Calibrate input voltage */ {"Калібровка","напруга"}, //10,7
/* (<= 13) Advanced soldering screen enabled */ {"Детальний ре-","жим пайки"}, //13,9
/* (<= 11) Message Scroll Speed */ {"Швидкість","тексту"}, //9,6
};
const char* SettingsMenuEntries[4] = {
/*Soldering Menu*/"Пайка",
/* Power Saving Menu*/"Сон",
/* UI Menu*/"Інтерфейс",
/* Advanced Menu*/"Інші",
};
const char* SettingsMenuEntriesDescriptions[4] ={
"Налаштування для режиму пайки. Діють при включеному жалі.",
"Налаштування при бездіяльності. Корисно що б не обпектися і з часом не спалити житло.",
"Користувальницький інтерфейс.",
"Розширені налаштування. Додаткові зручності."
};
#endif

View File

@@ -31,7 +31,15 @@ static void settings_setAdvancedIDLEScreens(void);
static void settings_displayAdvancedIDLEScreens(void); static void settings_displayAdvancedIDLEScreens(void);
static void settings_setScrollSpeed(void); static void settings_setScrollSpeed(void);
static void settings_displayScrollSpeed(void); static void settings_displayScrollSpeed(void);
#ifdef PIDSETTINGS
static void settings_setPIDP(void);
static void settings_displayPIDP(void);
static void settings_setPIDI(void);
static void settings_displayPIDI(void);
static void settings_setPIDD(void);
static void settings_displayPIDD(void);
#endif
static void settings_setDisplayRotation(void); static void settings_setDisplayRotation(void);
static void settings_displayDisplayRotation(void); static void settings_displayDisplayRotation(void);
static void settings_setBoostModeEnabled(void); static void settings_setBoostModeEnabled(void);
@@ -181,6 +189,15 @@ const menuitem advancedMenu[] = {
settings_displayCalibrate } }, /*Calibrate tip*/ settings_displayCalibrate } }, /*Calibrate tip*/
{ (const char*) SettingsDescriptions[14], { settings_setCalibrateVIN }, { { (const char*) SettingsDescriptions[14], { settings_setCalibrateVIN }, {
settings_displayCalibrateVIN } }, /*Voltage input cal*/ settings_displayCalibrateVIN } }, /*Voltage input cal*/
#ifdef PIDSETTINGS
{ (const char*) SettingsDescriptions[17], { settings_setPIDP }, {
settings_displayPIDP } }, /*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
}; };
@@ -285,9 +302,16 @@ static void settings_displayInputVRange(void) {
} }
static void settings_setSleepTemp(void) { static void settings_setSleepTemp(void) {
systemSettings.SleepTemp += 10; //If in C, 10 deg, if in F 20 deg
if (systemSettings.SleepTemp > 300) if (systemSettings.temperatureInF) {
systemSettings.SleepTemp = 50; systemSettings.SleepTemp += 20;
if (systemSettings.SleepTemp > 580)
systemSettings.SleepTemp = 120;
} else {
systemSettings.SleepTemp += 10;
if (systemSettings.SleepTemp > 300)
systemSettings.SleepTemp = 50;
}
} }
static void settings_displaySleepTemp(void) { static void settings_displaySleepTemp(void) {
@@ -339,6 +363,30 @@ static void settings_displayShutdownTime(void) {
static void settings_setTempF(void) { static void settings_setTempF(void) {
systemSettings.temperatureInF = !systemSettings.temperatureInF; systemSettings.temperatureInF = !systemSettings.temperatureInF;
if (systemSettings.temperatureInF) {
//Change sleep, boost and soldering temps to the F equiv
//C to F == F= ( (C*9) +160)/5
systemSettings.BoostTemp = ((systemSettings.BoostTemp * 9) + 160) / 5;
systemSettings.SolderingTemp =
((systemSettings.SolderingTemp * 9) + 160) / 5;
systemSettings.SleepTemp = ((systemSettings.SleepTemp * 9) + 160) / 5;
} else {
//Change sleep, boost and soldering temps to the C equiv
// F->C == C = ((F-32)*5)/9
systemSettings.BoostTemp = ((systemSettings.BoostTemp - 32) * 5) / 9;
systemSettings.SolderingTemp = ((systemSettings.SolderingTemp - 32) * 5)
/ 9;
systemSettings.SleepTemp = ((systemSettings.SleepTemp - 32) * 5) / 9;
}
// Rescale both to be multiples of 10
systemSettings.BoostTemp = systemSettings.BoostTemp / 10;
systemSettings.BoostTemp *= 10;
systemSettings.SolderingTemp = systemSettings.SolderingTemp / 10;
systemSettings.SolderingTemp *= 10;
systemSettings.SleepTemp = systemSettings.SleepTemp / 10;
systemSettings.SleepTemp *= 10;
} }
static void settings_displayTempF(void) { static void settings_displayTempF(void) {
@@ -438,12 +486,14 @@ static void settings_displayBoostModeEnabled(void) {
} }
static void settings_setBoostTemp(void) { static void settings_setBoostTemp(void) {
systemSettings.BoostTemp += 10; // Go up 10 at a time
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
systemSettings.BoostTemp += 20; // Go up 20F at a time
if (systemSettings.BoostTemp > 850) { if (systemSettings.BoostTemp > 850) {
systemSettings.BoostTemp = 480; // loop back at 250 systemSettings.BoostTemp = 480; // loop back at 250
} }
} else { } else {
systemSettings.BoostTemp += 10; // Go up 10C at a time
if (systemSettings.BoostTemp > 450) { if (systemSettings.BoostTemp > 450) {
systemSettings.BoostTemp = 250; // loop back at 250 systemSettings.BoostTemp = 250; // loop back at 250
} }
@@ -455,6 +505,33 @@ static void settings_displayBoostTemp(void) {
lcd.printNumber(systemSettings.BoostTemp, 3); lcd.printNumber(systemSettings.BoostTemp, 3);
} }
#ifdef PIDSETTINGS
static void settings_setPIDP(void) {
systemSettings.PID_P++;
systemSettings.PID_P %= 100;
}
static void settings_displayPIDP(void) {
printShortDescription(17, 6);
lcd.printNumber(systemSettings.PID_P, 2);
}
static void settings_setPIDI(void) {
systemSettings.PID_I++;
systemSettings.PID_I %= 100;
}
static void settings_displayPIDI(void) {
printShortDescription(18, 6);
lcd.printNumber(systemSettings.PID_I, 2);
}
static void settings_setPIDD(void) {
systemSettings.PID_D++;
systemSettings.PID_D %= 100;
}
static void settings_displayPIDD(void) {
printShortDescription(19, 6);
lcd.printNumber(systemSettings.PID_D, 2);
}
#endif
static void settings_setAutomaticStartMode(void) { static void settings_setAutomaticStartMode(void) {
systemSettings.autoStartMode++; systemSettings.autoStartMode++;
systemSettings.autoStartMode %= 2; systemSettings.autoStartMode %= 2;
@@ -462,7 +539,6 @@ 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); lcd.drawCheckbox(systemSettings.autoStartMode);
} }

View File

@@ -60,35 +60,17 @@ uint16_t getTipInstantTemperature() {
} }
uint16_t getTipRawTemp(uint8_t instant) { uint16_t getTipRawTemp(uint8_t instant) {
#define filterDepth1 1 static int64_t filterFP = 0;
/*Pre filter used before PID*/ const uint8_t filterBeta = 5; //higher values smooth out more, but reduce responsiveness
#define filterDepth2 32
/*Post filter used for UI display*/
static uint16_t filterLayer1[filterDepth1];
static uint16_t filterLayer2[filterDepth2];
static uint8_t index = 0;
static uint8_t indexFilter = 0;
if (instant) { if (instant) {
uint16_t itemp = getTipInstantTemperature(); uint16_t itemp = getTipInstantTemperature();
filterLayer1[index] = itemp; filterFP = (filterFP << filterBeta) - filterFP;
index = (index + 1) % filterDepth1; filterFP += (itemp << 9);
uint32_t total = 0; filterFP = filterFP >> filterBeta;
for (uint8_t i = 0; i < filterDepth1; i++) return itemp;
total += filterLayer1[i];
return total / filterDepth1;
} else { } else {
uint32_t total = 0; return filterFP >> 9;
for (uint8_t i = 0; i < filterDepth1; i++)
total += filterLayer1[i];
filterLayer2[indexFilter] = total / filterDepth1;
indexFilter = (indexFilter + 1) % filterDepth2;
total = 0;
for (uint8_t i = 0; i < filterDepth2; i++)
total += filterLayer2[i];
return total / filterDepth2;
} }
} }
uint16_t getInputVoltageX10(uint8_t divisor) { uint16_t getInputVoltageX10(uint8_t divisor) {
@@ -120,15 +102,10 @@ uint8_t getTipPWM() {
return htim2.Instance->CCR4; return htim2.Instance->CCR4;
} }
void setTipPWM(uint8_t pulse) { void setTipPWM(uint8_t pulse) {
PWMSafetyTimer = 640; //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;
if (pulse) { htim2.Instance->CCR4 = pulse;
htim2.Instance->CCR4 = pulse;
} else {
htim2.Instance->CCR4 = 0;
}
} }
//Thse are called by the HAL after the corresponding events from the system timers. //Thse are called by the HAL after the corresponding events from the system timers.
@@ -138,7 +115,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
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 scheduler will not cause the PWM to become locked in an active driving state.
//While we could assume this could never happened, its a small price for increased safety //While we could assume this could never happen, its a small price for increased safety
if (htim2.Instance->CCR4 && PWMSafetyTimer) { if (htim2.Instance->CCR4 && PWMSafetyTimer) {
htim3.Instance->CCR1 = 50; htim3.Instance->CCR1 = 50;
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
@@ -159,12 +136,9 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
htim3.Instance->CCR1 = 0; htim3.Instance->CCR1 = 0;
} /*else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { } /*else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
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);
}*/ }*/
} }
} }
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) {
}

View File

@@ -10,12 +10,14 @@
#include "string.h" #include "string.h"
#include "LIS2DH12.hpp" #include "LIS2DH12.hpp"
#include <gui.hpp> #include <gui.hpp>
#include "FRToSI2C.hpp"
#define ACCELDEBUG 0 #define ACCELDEBUG 0
// C++ objects // C++ objects
OLED lcd(&hi2c1); FRToSI2C i2cDev(&hi2c1);
MMA8652FC accel(&hi2c1); OLED lcd(&i2cDev);
LIS2DH12 accel2(&hi2c1); MMA8652FC accel(&i2cDev);
LIS2DH12 accel2(&i2cDev);
uint8_t PCBVersion = 0; uint8_t PCBVersion = 0;
// File local variables // File local variables
uint16_t currentlyActiveTemperatureTarget = 0; uint16_t currentlyActiveTemperatureTarget = 0;
@@ -25,15 +27,13 @@ uint32_t lastButtonTime = 0;
// FreeRTOS variables // FreeRTOS variables
osThreadId GUITaskHandle; osThreadId GUITaskHandle;
osThreadId PIDTaskHandle; osThreadId PIDTaskHandle;
osThreadId ROTTaskHandle;
osThreadId MOVTaskHandle; osThreadId MOVTaskHandle;
SemaphoreHandle_t rotationChangedSemaphore = NULL;
SemaphoreHandle_t accelDataAvailableSemaphore = NULL; static TaskHandle_t pidTaskNotification = NULL;
void startGUITask(void const *argument); void startGUITask(void const *argument);
void startPIDTask(void const *argument); void startPIDTask(void const *argument);
void startMOVTask(void const *argument); void startMOVTask(void const *argument);
void startRotationTask(void const *argument);
// End FreeRTOS // End FreeRTOS
// Main sets up the hardware then hands over to the FreeRTOS kernel // Main sets up the hardware then hands over to the FreeRTOS kernel
@@ -42,6 +42,7 @@ int main(void) {
*/ */
HAL_Init(); HAL_Init();
Setup_HAL(); // Setup all the HAL objects Setup_HAL(); // Setup all the HAL objects
HAL_IWDG_Refresh(&hiwdg);
setTipPWM(0); setTipPWM(0);
lcd.initialize(); // start up the LCD lcd.initialize(); // start up the LCD
lcd.setFont(0); // default to bigger font lcd.setFont(0); // default to bigger font
@@ -60,8 +61,9 @@ int main(void) {
accel2.initalize(); //startup the accelerometer accel2.initalize(); //startup the accelerometer
} else { } else {
PCBVersion = 3; PCBVersion = 3;
systemSettings.SleepTime=0; systemSettings.SleepTime = 0;
systemSettings.ShutdownTime=0;//No accel -> disable sleep systemSettings.ShutdownTime = 0; //No accel -> disable sleep
systemSettings.sensitivity = 0;
} }
HAL_IWDG_Refresh(&hiwdg); HAL_IWDG_Refresh(&hiwdg);
restoreSettings(); // load the settings from flash restoreSettings(); // load the settings from flash
@@ -70,25 +72,18 @@ int main(void) {
/* Create the thread(s) */ /* Create the thread(s) */
/* definition and creation of GUITask */ /* definition and creation of GUITask */
osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 512); osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 768); //3k
GUITaskHandle = osThreadCreate(osThread(GUITask), NULL); GUITaskHandle = osThreadCreate(osThread(GUITask), NULL);
/* definition and creation of PIDTask */ /* definition and creation of PIDTask */
osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 256); osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 512); //2k
PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL); PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL);
if (PCBVersion != 3) {
/* definition and creation of MOVTask */
osThreadDef(MOVTask, startMOVTask, osPriorityNormal, 0, 512); //2k
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
}
/* definition and creation of ROTTask */
osThreadDef(ROTTask, startRotationTask, osPriorityLow, 0, 256);
ROTTaskHandle = osThreadCreate(osThread(ROTTask), NULL);
/* definition and creation of MOVTask */
osThreadDef(MOVTask, startMOVTask, osPriorityNormal, 0, 256);
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
/* Create the objects*/
rotationChangedSemaphore =
xSemaphoreCreateBinary(); // Used to unlock rotation thread
accelDataAvailableSemaphore =
xSemaphoreCreateBinary(); // Used to unlock the movement thread
/* Start scheduler */ /* Start scheduler */
osKernelStart(); osKernelStart();
@@ -96,10 +91,15 @@ int main(void) {
while (1) { while (1) {
} }
} }
void GUIDelay() { void printVoltage() {
osDelay(50); // 20Hz lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, 2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10, 1);
} }
void gui_drawTipTemp() { void GUIDelay() {
osDelay(66); // 15Hz
}
void gui_drawTipTemp(bool symbol) {
// Draw tip temp handling unit conversion & tolerance near setpoint // Draw tip temp handling unit conversion & tolerance near setpoint
uint16_t Temp = getTipRawTemp(0); uint16_t Temp = getTipRawTemp(0);
@@ -112,6 +112,12 @@ void gui_drawTipTemp() {
// Temp = systemSettings.SolderingTemp; // Temp = systemSettings.SolderingTemp;
lcd.printNumber(Temp, 3); // Draw the tip temp out finally lcd.printNumber(Temp, 3); // Draw the tip temp out finally
if (symbol) {
if (systemSettings.temperatureInF)
lcd.print("F");
else
lcd.print("C");
}
} }
ButtonState getButtonState() { ButtonState getButtonState() {
/* /*
@@ -221,11 +227,7 @@ static bool checkVoltageForExit() {
lcd.print(UndervoltageString); lcd.print(UndervoltageString);
lcd.setCursor(0, 8); lcd.setCursor(0, 8);
lcd.print(InputVoltageString); lcd.print(InputVoltageString);
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, printVoltage();
2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
1);
lcd.print("V"); lcd.print("V");
} else { } else {
@@ -256,7 +258,7 @@ static void gui_drawBatteryIcon() {
cellV = 9; cellV = 9;
lcd.drawBattery(cellV + 1); lcd.drawBattery(cellV + 1);
} else } else
lcd.drawSymbol(16); // Draw the DC Logo lcd.drawSymbol(15); // Draw the DC Logo
} }
static void gui_solderingTempAdjust() { static void gui_solderingTempAdjust() {
uint32_t lastChange = xTaskGetTickCount(); uint32_t lastChange = xTaskGetTickCount();
@@ -332,56 +334,6 @@ static void gui_solderingTempAdjust() {
} }
} }
static int gui_showTipTempWarning() {
for (;;) {
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
lcd.clearScreen();
lcd.setCursor(0, 0);
if (systemSettings.detailedSoldering) {
lcd.setFont(1);
lcd.print(WarningAdvancedString);
lcd.setCursor(0, 8);
lcd.print(WarningTipTempString);
if (systemSettings.temperatureInF) {
lcd.printNumber(tipMeasurementToF(getTipRawTemp(0)), 3);
lcd.print("F");
} else {
lcd.printNumber(tipMeasurementToC(getTipRawTemp(0)), 3);
lcd.print("C");
}
} else {
lcd.setFont(0);
lcd.drawArea(0, 0, 24, 16, WarningBlock24);
lcd.setCursor(24, 0);
// lcd.print(WarningSimpleString);
lcd.print(" ");
if (systemSettings.temperatureInF) {
lcd.printNumber(tipMeasurementToF(getTipRawTemp(0)), 3);
lcd.drawSymbol(0);
} else {
lcd.printNumber(tipMeasurementToC(getTipRawTemp(0)), 3);
lcd.drawSymbol(1);
}
}
if (systemSettings.coolingTempBlink && tipTemp > 70) {
if (xTaskGetTickCount() % 50 < 25)
lcd.clearScreen();
}
lcd.refresh();
ButtonState buttons = getButtonState();
if (buttons == BUTTON_F_SHORT)
return 1;
else if (buttons == BUTTON_B_SHORT || buttons == BUTTON_BOTH)
return 0;
if (tipTemp < 50)
return 0; //Exit the warning screen
GUIDelay();
}
return 0;
}
static uint16_t min(uint16_t a, uint16_t b) { static uint16_t min(uint16_t a, uint16_t b) {
if (a > b) if (a > b)
return b; return b;
@@ -401,14 +353,15 @@ static int gui_SolderingSleepingMode() {
if (checkVoltageForExit()) if (checkVoltageForExit())
return 1; // return non-zero on error return 1; // return non-zero on error
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF) {
currentlyActiveTemperatureTarget = ftoTipMeasurement( currentlyActiveTemperatureTarget = ftoTipMeasurement(
min(systemSettings.SleepTemp, min(systemSettings.SleepTemp,
systemSettings.SolderingTemp)); systemSettings.SolderingTemp));
else } else {
currentlyActiveTemperatureTarget = ctoTipMeasurement( currentlyActiveTemperatureTarget = ctoTipMeasurement(
min(systemSettings.SleepTemp, min(systemSettings.SleepTemp,
systemSettings.SolderingTemp)); systemSettings.SolderingTemp));
}
// draw the lcd // draw the lcd
uint16_t tipTemp; uint16_t tipTemp;
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
@@ -430,11 +383,7 @@ static int gui_SolderingSleepingMode() {
lcd.print("C"); lcd.print("C");
lcd.print(" "); lcd.print(" ");
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, printVoltage();
2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
1);
lcd.drawChar('V'); lcd.drawChar('V');
} else { } else {
lcd.setFont(0); lcd.setFont(0);
@@ -530,24 +479,9 @@ static void gui_solderingMode() {
lcd.setCursor(0, 8); lcd.setCursor(0, 8);
lcd.print(SleepingTipAdvancedString); lcd.print(SleepingTipAdvancedString);
uint16_t Temp = getTipRawTemp(0); gui_drawTipTemp(true);
if (systemSettings.temperatureInF)
Temp = tipMeasurementToF(Temp);
else
Temp = tipMeasurementToC(Temp);
lcd.printNumber(Temp, 3);
if (systemSettings.temperatureInF)
lcd.print("F");
else
lcd.print("C");
lcd.print(" "); lcd.print(" ");
lcd.printNumber( printVoltage();
getInputVoltageX10(systemSettings.voltageDiv) / 10, 2);
lcd.drawChar('.');
lcd.printNumber(
getInputVoltageX10(systemSettings.voltageDiv) % 10, 1);
lcd.drawChar('V'); lcd.drawChar('V');
} else { } else {
// We switch the layout direction depending on the orientation of the lcd. // We switch the layout direction depending on the orientation of the lcd.
@@ -556,13 +490,7 @@ static void gui_solderingMode() {
gui_drawBatteryIcon(); gui_drawBatteryIcon();
lcd.drawChar(' '); // Space out gap between battery <-> temp lcd.drawChar(' '); // Space out gap between battery <-> temp
if (systemSettings.temperatureInF) { gui_drawTipTemp(true); // Draw current tip temp
gui_drawTipTemp(); // Draw current tip temp
lcd.drawSymbol(0); // deg F
} else {
gui_drawTipTemp(); // Draw current tip temp
lcd.drawSymbol(1); // deg C
}
// We draw boost arrow if boosting, or else gap temp <-> heat indicator // We draw boost arrow if boosting, or else gap temp <-> heat indicator
if (boostModeOn) if (boostModeOn)
@@ -571,31 +499,16 @@ static void gui_solderingMode() {
lcd.drawChar(' '); lcd.drawChar(' ');
// Draw heating/cooling symbols // Draw heating/cooling symbols
// If tip PWM > 10% then we are 'heating' lcd.drawHeatSymbol(getTipPWM());
if (getTipPWM() > 10)
lcd.drawSymbol(14);
else
lcd.drawSymbol(15);
} else { } else {
// Draw heating/cooling symbols // Draw heating/cooling symbols
// If tip PWM > 10% then we are 'heating' lcd.drawHeatSymbol(getTipPWM());
if (getTipPWM() > 10)
lcd.drawSymbol(14);
else
lcd.drawSymbol(15);
// We draw boost arrow if boosting, or else gap temp <-> heat indicator // We draw boost arrow if boosting, or else gap temp <-> heat indicator
if (boostModeOn) if (boostModeOn)
lcd.drawSymbol(2); lcd.drawSymbol(2);
else else
lcd.drawChar(' '); lcd.drawChar(' ');
gui_drawTipTemp(true); // Draw current tip temp
if (systemSettings.temperatureInF) {
gui_drawTipTemp(); // Draw current tip temp
lcd.drawSymbol(0); // deg F
} else {
gui_drawTipTemp(); // Draw current tip temp
lcd.drawSymbol(1); // deg C
}
lcd.drawChar(' '); // Space out gap between battery <-> temp lcd.drawChar(' '); // Space out gap between battery <-> temp
@@ -623,14 +536,16 @@ static void gui_solderingMode() {
// Undervoltage test // Undervoltage test
if (checkVoltageForExit()) { if (checkVoltageForExit()) {
lastButtonTime = xTaskGetTickCount();
return; return;
} }
lcd.refresh(); lcd.refresh();
if (systemSettings.sensitivity) if (systemSettings.sensitivity && systemSettings.SleepTime)
if (xTaskGetTickCount() - lastMovementTime > sleepThres if (xTaskGetTickCount() - lastMovementTime > sleepThres
&& xTaskGetTickCount() - lastButtonTime > sleepThres) { && xTaskGetTickCount() - lastButtonTime > sleepThres) {
if (gui_SolderingSleepingMode()) { if (gui_SolderingSleepingMode()) {
lastButtonTime = xTaskGetTickCount();
return; // If the function returns non-0 then exit return; // If the function returns non-0 then exit
} }
} }
@@ -638,33 +553,65 @@ static void gui_solderingMode() {
} }
} }
void showVersion(void) {
uint8_t screen = 0;
ButtonState b;
for (;;) {
lcd.clearScreen(); // Ensure the buffer starts clean
lcd.setCursor(0, 0); // Position the cursor at the 0,0 (top left)
lcd.setFont(1); // small font
lcd.print((char *) "V2.05 PCB"); // Print version number
lcd.printNumber(PCBVersion, 1); //Print PCB ID number
lcd.setCursor(0, 8); // second line
switch (screen) {
case 0:
lcd.print(__DATE__); // print the compile date
break;
case 1:
lcd.print("Heap: ");
lcd.printNumber(xPortGetFreeHeapSize(), 5);
break;
case 2:
lcd.print("HWMG: ");
lcd.printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5);
break;
case 3:
lcd.print("HWMP: ");
lcd.printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5);
break;
case 4:
lcd.print("HWMM: ");
lcd.printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5);
break;
case 5:
lcd.print("Time: ");
lcd.printNumber(xTaskGetTickCount() / 100, 5);
break;
case 6:
lcd.print("Move: ");
lcd.printNumber(lastMovementTime / 100, 5);
break;
}
lcd.refresh();
b = getButtonState();
if (b == BUTTON_B_SHORT)
return;
else if (b == BUTTON_F_SHORT) {
screen++;
screen = screen % 7;
}
}
}
/* StartGUITask function */ /* StartGUITask function */
void startGUITask(void const *argument) { void startGUITask(void const *argument) {
/* i2cDev.FRToSInit();
* Main program states:
*
* * Soldering (gui_solderingMode)
* -> Main loop where we draw temp, and animations
* --> User presses buttons and they goto the temperature adjust screen
* ---> Display the current setpoint temperature
* ---> Use buttons to change forward and back on temperature
* ---> Both buttons or timeout for exiting
* --> Long hold front button to enter boost mode
* ---> Just temporarily sets the system into the alternate temperature for
* PID control
* --> Long hold back button to exit
* --> Double button to exit
* * Settings Menu (gui_settingsMenu)
* -> Show setting name
* --> If no button press for > 3 Seconds, scroll description
* -> If user presses back button, adjust the setting
* -> Currently the same as 1.x (future to make more depth based)
*/
uint8_t animationStep = 0;
uint8_t tempWarningState = 0; uint8_t tempWarningState = 0;
bool buttonLockout = false; bool buttonLockout = false;
HAL_IWDG_Refresh(&hiwdg);
switch (systemSettings.OrientationMode) { switch (systemSettings.OrientationMode) {
case 0: case 0:
lcd.setRotation(false); lcd.setRotation(false);
@@ -688,8 +635,6 @@ void startGUITask(void const *argument) {
ticks = xTaskGetTickCount(); //make timeout now so we will exit ticks = xTaskGetTickCount(); //make timeout now so we will exit
GUIDelay(); GUIDelay();
} }
HAL_IWDG_Refresh(&hiwdg);
if (systemSettings.autoStartMode) { if (systemSettings.autoStartMode) {
// jump directly to the autostart mode // jump directly to the autostart mode
if (systemSettings.autoStartMode == 1) if (systemSettings.autoStartMode == 1)
@@ -707,12 +652,14 @@ void startGUITask(void const *argument) {
for (;;) { for (;;) {
ButtonState buttons = getButtonState(); ButtonState buttons = getButtonState();
if (tempWarningState == 2) if (tempWarningState == 2)
buttons = BUTTON_F_SHORT; buttons = BUTTON_F_SHORT;
if (buttons != BUTTON_NONE && buttonLockout) if (buttons != BUTTON_NONE && buttonLockout)
buttons = BUTTON_NONE; buttons = BUTTON_NONE;
else else
buttonLockout = false; buttonLockout = false;
switch (buttons) { switch (buttons) {
case BUTTON_NONE: case BUTTON_NONE:
// Do nothing // Do nothing
@@ -724,18 +671,7 @@ void startGUITask(void const *argument) {
case BUTTON_B_LONG: case BUTTON_B_LONG:
// Show the version information // Show the version information
{ showVersion();
lcd.clearScreen(); // Ensure the buffer starts clean
lcd.setCursor(0, 0); // Position the cursor at the 0,0 (top left)
lcd.setFont(1); // small font
lcd.print((char *) "V2.03 PCB"); // Print version number
lcd.printNumber(PCBVersion, 1);
lcd.setCursor(0, 8); // second line
lcd.print(__DATE__); // print the compile date
lcd.refresh();
waitForButtonPress();
lcd.setFont(0); // reset font
}
break; break;
case BUTTON_F_LONG: case BUTTON_F_LONG:
gui_solderingTempAdjust(); gui_solderingTempAdjust();
@@ -745,7 +681,7 @@ void startGUITask(void const *argument) {
lcd.setFont(0); lcd.setFont(0);
lcd.displayOnOff(true); // turn lcd on lcd.displayOnOff(true); // turn lcd on
gui_solderingMode(); // enter soldering mode gui_solderingMode(); // enter soldering mode
tempWarningState = 0; // make sure warning can show buttonLockout = true;
break; break;
case BUTTON_B_SHORT: case BUTTON_B_SHORT:
lcd.setFont(0); lcd.setFont(0);
@@ -758,10 +694,15 @@ void startGUITask(void const *argument) {
default: default:
break; break;
} }
currentlyActiveTemperatureTarget = 0; // ensure tip is off currentlyActiveTemperatureTarget = 0; // ensure tip is off
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(1)); //This forces a faster update rate on the filtering
if (tipTemp < 50) { if (tipTemp < 50) {
if (systemSettings.sensitivity) { if (systemSettings.sensitivity) {
if ((xTaskGetTickCount() - lastMovementTime) > 6000 if ((xTaskGetTickCount() - lastMovementTime) > 6000
&& (xTaskGetTickCount() - lastButtonTime) > 6000) { && (xTaskGetTickCount() - lastButtonTime) > 6000) {
lcd.displayOnOff(false); // turn lcd off when no movement lcd.displayOnOff(false); // turn lcd off when no movement
@@ -774,17 +715,7 @@ void startGUITask(void const *argument) {
if (tipTemp > 600) if (tipTemp > 600)
tipTemp = 0; tipTemp = 0;
if (tipTemp > 50) {
if (tempWarningState == 0) {
currentlyActiveTemperatureTarget = 0; // ensure tip is off
lcd.displayOnOff(true); // force LCD on
if (gui_showTipTempWarning() == 1) {
tempWarningState = 2; // we can re-enter the warning
} else
tempWarningState = 1;
}
} else
tempWarningState = 0;
// Clear the lcd buffer // Clear the lcd buffer
lcd.clearScreen(); lcd.clearScreen();
lcd.setCursor(0, 0); lcd.setCursor(0, 0);
@@ -803,11 +734,7 @@ void startGUITask(void const *argument) {
} }
lcd.setCursor(0, 8); lcd.setCursor(0, 8);
lcd.print(InputVoltageString); lcd.print(InputVoltageString);
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, printVoltage();
2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
1);
lcd.print("V"); lcd.print("V");
} else { } else {
@@ -817,14 +744,29 @@ void startGUITask(void const *argument) {
lcd.setCursor(0, 0); lcd.setCursor(0, 0);
gui_drawBatteryIcon(); gui_drawBatteryIcon();
} else { } else {
lcd.drawArea(0, 0, 84, 16, idleScreenBGF); // Needs to be flipped lcd.drawArea(0, 0, 84, 16, idleScreenBGF); // Needs to be flipped so button ends up on right side of screen
lcd.setCursor(84, 0); lcd.setCursor(84, 0);
gui_drawBatteryIcon(); gui_drawBatteryIcon();
} }
if (tipTemp > 50) {
//draw temp over the start soldering button
//Location changes on screen rotation
if (lcd.getRotation()) {
// in right handed mode we want to draw over the first part
lcd.fillArea(55, 0, 41, 16, 0); //clear the area for the temp
lcd.setCursor(56, 0);
} else {
lcd.fillArea(0, 0, 41, 16, 0); //clear the area
lcd.setCursor(0, 0);
}
//draw in the temp
lcd.setFont(0); //big font
gui_drawTipTemp(false); // draw in the temp
}
} }
lcd.refresh(); lcd.refresh();
animationStep++;
GUIDelay(); GUIDelay();
} }
} }
@@ -841,67 +783,90 @@ void startPIDTask(void const *argument) {
* struct * struct
* *
*/ */
setTipPWM(0); // disable the output driver if the output is set to be off
osDelay(500);
int32_t integralCount = 0; int32_t integralCount = 0;
int32_t derivativeLastValue = 0; int32_t derivativeLastValue = 0;
int32_t kp, ki, kd;
kp = 40; // REMEBER ^^^^ These constants are backwards
ki = 60; // They act as dividers, so to 'increase' a P term, you make the number
kd = 30; // smaller.
// REMEBER ^^^^ These constants are backwards
// They act as dividers, so to 'increase' a P term, you make the number const int32_t itermMax = 100;
// smaller. pidTaskNotification = xTaskGetCurrentTaskHandle();
const int32_t itermMax = 60;
for (;;) { for (;;) {
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading if (ulTaskNotifyTake( pdTRUE, 50)) {
if (currentlyActiveTemperatureTarget) { //Wait a max of 50ms
// Compute the PID loop in here //This is a call to block this thread until the ADC does its samples
// Because our values here are quite large for all measurements (0-16k ~= uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
// 33 counts per C) if (currentlyActiveTemperatureTarget) {
// P I & D are divisors, so inverse logic applies (beware) // Compute the PID loop in here
// Because our values here are quite large for all measurements (0-16k ~=
// 33 counts per C)
// P I & D are divisors, so inverse logic applies (beware)
int32_t rawTempError = currentlyActiveTemperatureTarget - rawTemp; // Cap the max set point to 450C
int32_t ierror = (rawTempError / ki); if (currentlyActiveTemperatureTarget > ctoTipMeasurement(450)) {
integralCount += ierror; currentlyActiveTemperatureTarget = ctoTipMeasurement(450);
if (integralCount > (itermMax / 2)) }
integralCount = itermMax / 2; // prevent too much lead
else if (integralCount < -itermMax)
integralCount = itermMax;
int32_t dInput = (rawTemp - derivativeLastValue); int32_t rawTempError = currentlyActiveTemperatureTarget
- rawTemp;
int32_t ierror = (rawTempError / ((int32_t)systemSettings.PID_I));
integralCount += ierror;
if (integralCount > (itermMax / 2))
integralCount = itermMax / 2; // prevent too much lead
else if (integralCount < -itermMax)
integralCount = itermMax;
/*Compute PID Output*/ int32_t dInput = (rawTemp - derivativeLastValue);
int32_t output = (rawTempError / kp);
if (ki)
output += integralCount;
if (kd)
output -= (dInput / kd);
if (output > 100) { /*Compute PID Output*/
output = 100; // saturate int32_t output = (rawTempError / ((int32_t)systemSettings.PID_P));
} else if (output < 0) { if (((int32_t)systemSettings.PID_I))
output = 0; output += integralCount;
if (((int32_t)systemSettings.PID_D))
output -= (dInput / ((int32_t)systemSettings.PID_D));
if (output > 100) {
output = 100; // saturate
} else if (output < 0) {
output = 0;
}
/*if (currentlyActiveTemperatureTarget < rawTemp) {
output = 0;
}*/
setTipPWM(output);
derivativeLastValue = rawTemp; // store for next loop
} else {
setTipPWM(0); // disable the output driver if the output is set to be off
integralCount = 0;
derivativeLastValue = 0;
} }
if (currentlyActiveTemperatureTarget < rawTemp) { HAL_IWDG_Refresh(&hiwdg);
output = 0;
}
setTipPWM(output);
derivativeLastValue = rawTemp; // store for next loop
} else {
setTipPWM(0); // disable the output driver if the output is set to be off
integralCount = 0;
derivativeLastValue = 0;
} }
HAL_IWDG_Refresh(&hiwdg);
osDelay(10); // 100 Hz temp loop
} }
} }
#define MOVFilter 8 #define MOVFilter 8
void startMOVTask(void const *argument) { void startMOVTask(void const *argument) {
osDelay(4000); // wait for accel to stabilize osDelay(250); // wait for accelerometer to stabilize
switch (systemSettings.OrientationMode) {
case 0:
lcd.setRotation(false);
break;
case 1:
lcd.setRotation(true);
break;
case 2:
lcd.setRotation(false);
break;
default:
break;
}
lastMovementTime = 0;
int16_t datax[MOVFilter]; int16_t datax[MOVFilter];
int16_t datay[MOVFilter]; int16_t datay[MOVFilter];
int16_t dataz[MOVFilter]; int16_t dataz[MOVFilter];
@@ -916,24 +881,29 @@ void startMOVTask(void const *argument) {
#if ACCELDEBUG #if ACCELDEBUG
uint32_t max = 0; uint32_t max = 0;
#endif #endif
uint8_t rotation = 0;
if (PCBVersion == 3) {
for (;;)
osDelay(5000);
}
for (;;) { for (;;) {
int32_t threshold = 1200 + (9 * 200); int32_t threshold = 1500 + (9 * 200);
threshold -= systemSettings.sensitivity * 200; // 200 is the step size threshold -= systemSettings.sensitivity * 200; // 200 is the step size
if (PCBVersion == 2)
accel2.getAxisReadings(&tx, &ty, &tz);
else if (PCBVersion == 1)
accel.getAxisReadings(&tx, &ty, &tz);
if (PCBVersion == 2) {
accel2.getAxisReadings(&tx, &ty, &tz);
rotation = accel2.getOrientation();
} else if (PCBVersion == 1) {
accel.getAxisReadings(&tx, &ty, &tz);
rotation = accel.getOrientation();
}
if (systemSettings.OrientationMode == 2) {
if (rotation != 0) {
lcd.setRotation(rotation == 2); // link the data through
}
}
datax[currentPointer] = (int32_t) tx; datax[currentPointer] = (int32_t) tx;
datay[currentPointer] = (int32_t) ty; datay[currentPointer] = (int32_t) ty;
dataz[currentPointer] = (int32_t) tz; dataz[currentPointer] = (int32_t) tz;
currentPointer = (currentPointer + 1) % MOVFilter; currentPointer = (currentPointer + 1) % MOVFilter;
#if ACCELDEBUG #if ACCELDEBUG
// Debug for Accel // Debug for Accel
avgx = avgy = avgz = 0; avgx = avgy = avgz = 0;
@@ -961,82 +931,38 @@ void startMOVTask(void const *argument) {
if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET) if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET)
max = 0; max = 0;
#endif #endif
// Only run the actual processing if the sensitivity is set (aka we are
// enabled)
if (systemSettings.sensitivity) {
// calculate averages
avgx = avgy = avgz = 0;
for (uint8_t i = 0; i < MOVFilter; i++) {
avgx += datax[i];
avgy += datay[i];
avgz += dataz[i];
}
avgx /= MOVFilter;
avgy /= MOVFilter;
avgz /= MOVFilter;
// So now we have averages, we want to look if these are different by more // calculate averages
// than the threshold avgx = avgy = avgz = 0;
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)); for (uint8_t i = 0; i < MOVFilter; i++) {
// If error has occured then we update the tick timer avgx += datax[i];
if (error > threshold) { avgy += datay[i];
lastMovementTime = xTaskGetTickCount(); avgz += dataz[i];
} }
avgx /= MOVFilter;
avgy /= MOVFilter;
avgz /= MOVFilter;
// So now we have averages, we want to look if these are different by more
// than the threshold
//Sum the deltas
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
// If error has occurred then we update the tick timer
if (error > threshold) {
lastMovementTime = xTaskGetTickCount();
} }
osDelay(100); // Slow down update rate osDelay(100); // Slow down update rate
} }
} }
/* StartRotationTask function */
void startRotationTask(void const *argument) {
/*
* This task is used to manage rotation of the LCD screen & button re-mapping
*
*/
if (PCBVersion == 3) {
for (;;)
osDelay(5000);
}
switch (systemSettings.OrientationMode) {
case 0:
lcd.setRotation(false);
break;
case 1:
lcd.setRotation(true);
break;
case 2:
lcd.setRotation(false);
break;
default:
break;
}
osDelay(500); // wait for accel to stabilize
for (;;) {
// a rotation event has occurred
uint8_t rotation = 0;
if (PCBVersion == 2) {
rotation = accel2.getOrientation();
} else if (PCBVersion == 1) {
rotation = accel.getOrientation();
}
if (systemSettings.OrientationMode == 2) {
if (rotation != 0) {
lcd.setRotation(rotation == 2); // link the data through
}
}
osDelay(500);
}
}
#define FLASH_LOGOADDR \ #define FLASH_LOGOADDR \
(0x8000000 | 0xF800) /*second last page of flash set aside for logo image*/ (0x8000000 | 0xF800) /*second last page of flash set aside for logo image*/
bool showBootLogoIfavailable() { bool showBootLogoIfavailable() {
// check if the header is there (0xAA,0x55,0xF0,0x0D) // check if the header is there (0xAA,0x55,0xF0,0x0D)
// If so display logo // If so display logo
//TODO REDUCE STACK ON THIS ONE, USE DRAWING IN THE READ LOOP
uint16_t temp[98]; uint16_t temp[98];
for (uint8_t i = 0; i < (98); i++) { for (uint8_t i = 0; i < (98); i++) {
@@ -1061,3 +987,43 @@ bool showBootLogoIfavailable() {
lcd.refresh(); lcd.refresh();
return true; return true;
} }
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (pidTaskNotification) {
/* Notify the task that the transmission is complete. */
vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
/* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch
should be performed to ensure the interrupt returns directly to the highest
priority task. The macro used for this purpose is dependent on the port in
use and may be called portEND_SWITCHING_ISR(). */
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void vApplicationStackOverflowHook( xTaskHandle *pxTask,
signed portCHAR *pcTaskName) {
//We dont have a good way to handle a stack overflow at this point in time
NVIC_SystemReset();
}

View File

@@ -28,9 +28,9 @@ void HAL_MspInit(void) {
/**NOJTAG: JTAG-DP Disabled and SW-DP Enabled /**NOJTAG: JTAG-DP Disabled and SW-DP Enabled
*/ */
__HAL_AFIO_REMAP_SWJ_NOJTAG(); //__HAL_AFIO_REMAP_SWJ_NOJTAG()
// __HAL_AFIO_REMAP_SWJ_DISABLE(); /*Disable swd for debug io use*/ //;
__HAL_AFIO_REMAP_SWJ_DISABLE(); /*Disable swd for debug io use*/
} }
@@ -68,7 +68,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
__HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1); __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
/* ADC1 interrupt Init */ /* ADC1 interrupt Init */
HAL_NVIC_SetPriority(ADC1_2_IRQn, 5, 0); HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(ADC1_2_IRQn); HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
} }
@@ -77,22 +77,51 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitTypeDef GPIO_InitStruct;
if (hi2c->Instance == I2C1) { /**I2C1 GPIO Configuration
/**I2C1 GPIO Configuration PB6 ------> I2C1_SCL
PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA
PB7 ------> I2C1_SDA */
*/ 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_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Peripheral clock enable */ /* Peripheral clock enable */
__HAL_RCC_I2C1_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE()
; ;
/* I2C1 DMA Init */
/* I2C1_RX Init */
hdma_i2c1_rx.Instance = DMA1_Channel7;
hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_i2c1_rx.Init.Mode = DMA_NORMAL;
hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_MEDIUM;
HAL_DMA_Init(&hdma_i2c1_rx);
} __HAL_LINKDMA(hi2c, hdmarx, hdma_i2c1_rx);
/* I2C1_TX Init */
hdma_i2c1_tx.Instance = DMA1_Channel6;
hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
HAL_DMA_Init(&hdma_i2c1_tx);
__HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx);
/* I2C1 interrupt Init */
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
} }

View File

@@ -54,7 +54,6 @@ void SysTick_Handler(void) {
void DMA1_Channel1_IRQHandler(void) { void DMA1_Channel1_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdma_adc1); HAL_DMA_IRQHandler(&hdma_adc1);
} }
//ADC interrupt used for DMA //ADC interrupt used for DMA
void ADC1_2_IRQHandler(void) { void ADC1_2_IRQHandler(void) {
HAL_ADC_IRQHandler(&hadc1); HAL_ADC_IRQHandler(&hadc1);
@@ -63,7 +62,6 @@ void ADC1_2_IRQHandler(void) {
//Timer 1 has overflowed, used for HAL ticks //Timer 1 has overflowed, used for HAL ticks
void TIM1_UP_IRQHandler(void) { void TIM1_UP_IRQHandler(void) {
HAL_TIM_IRQHandler(&htim1); HAL_TIM_IRQHandler(&htim1);
} }
//Timer 3 is used for the PWM output to the tip //Timer 3 is used for the PWM output to the tip
void TIM3_IRQHandler(void) { void TIM3_IRQHandler(void) {
@@ -74,13 +72,18 @@ void TIM3_IRQHandler(void) {
void TIM2_IRQHandler(void) { void TIM2_IRQHandler(void) {
HAL_TIM_IRQHandler(&htim2); HAL_TIM_IRQHandler(&htim2);
} }
//EXTI 3 is triggered via the accelerometer on orientation change
void EXTI3_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); void I2C1_EV_IRQHandler(void) {
HAL_I2C_EV_IRQHandler(&hi2c1);
}
void I2C1_ER_IRQHandler(void) {
HAL_I2C_ER_IRQHandler(&hi2c1);
} }
//EXTI 5 is triggered via the accelerometer on movement
void EXTI9_5_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
void DMA1_Channel6_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
}
void DMA1_Channel7_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdma_i2c1_rx);
} }