mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4718efe79b | ||
|
|
771f0a1b9e | ||
|
|
1fef2fb53a | ||
|
|
bf1fa74d72 | ||
|
|
1ae8b2f216 | ||
|
|
98ed6be197 | ||
|
|
19240f2ae5 | ||
|
|
dd2fdbcb8e | ||
|
|
42db57da25 | ||
|
|
b6351f9696 | ||
|
|
bf7f1f5062 | ||
|
|
6500eb5eed | ||
|
|
311d5182eb | ||
|
|
88ea45d8c8 | ||
|
|
576575d7ba | ||
|
|
7c1937b412 | ||
|
|
f599624b6f | ||
|
|
cc09157106 | ||
|
|
586267f586 | ||
|
|
f2f20111b6 | ||
|
|
58061e3c26 | ||
|
|
f04cca8677 | ||
|
|
79477685bd | ||
|
|
a062317e7a | ||
|
|
2928e4d39c | ||
|
|
c9cfe965ef | ||
|
|
080ca31890 | ||
|
|
e94bcfc2b8 | ||
|
|
8eadb98496 | ||
|
|
fe5ee91104 | ||
|
|
762236b485 | ||
|
|
c4230d79bf |
@@ -34,36 +34,36 @@ ADC1.SamplingTime-4\#ChannelInjectedConversion=ADC_SAMPLETIME_239CYCLES_5
|
||||
ADC1.SamplingTime-5\#ChannelInjectedConversion=ADC_SAMPLETIME_71CYCLES_5
|
||||
ADC1.ScanConvMode=ADC_SCAN_ENABLE
|
||||
ADC1.master=1
|
||||
Dma.ADC1.2.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.ADC1.2.Instance=DMA1_Channel1
|
||||
Dma.ADC1.2.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||
Dma.ADC1.2.MemInc=DMA_MINC_ENABLE
|
||||
Dma.ADC1.2.Mode=DMA_CIRCULAR
|
||||
Dma.ADC1.2.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||
Dma.ADC1.2.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.ADC1.2.Priority=DMA_PRIORITY_VERY_HIGH
|
||||
Dma.ADC1.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.I2C1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.I2C1_RX.0.Instance=DMA1_Channel7
|
||||
Dma.I2C1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C1_RX.0.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C1_RX.0.Mode=DMA_NORMAL
|
||||
Dma.I2C1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C1_RX.0.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C1_RX.0.Priority=DMA_PRIORITY_LOW
|
||||
Dma.I2C1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.I2C1_TX.1.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.I2C1_TX.1.Instance=DMA1_Channel6
|
||||
Dma.I2C1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C1_TX.1.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C1_TX.1.Mode=DMA_NORMAL
|
||||
Dma.I2C1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C1_TX.1.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C1_TX.1.Priority=DMA_PRIORITY_LOW
|
||||
Dma.I2C1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.Request0=I2C1_RX
|
||||
Dma.Request1=I2C1_TX
|
||||
Dma.Request2=ADC1
|
||||
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.ADC1.0.Instance=DMA1_Channel1
|
||||
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
|
||||
Dma.ADC1.0.Mode=DMA_CIRCULAR
|
||||
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.ADC1.0.Priority=DMA_PRIORITY_VERY_HIGH
|
||||
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.I2C1_RX.1.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.I2C1_RX.1.Instance=DMA1_Channel7
|
||||
Dma.I2C1_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C1_RX.1.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C1_RX.1.Mode=DMA_NORMAL
|
||||
Dma.I2C1_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C1_RX.1.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C1_RX.1.Priority=DMA_PRIORITY_MEDIUM
|
||||
Dma.I2C1_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.I2C1_TX.2.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.I2C1_TX.2.Instance=DMA1_Channel6
|
||||
Dma.I2C1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C1_TX.2.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C1_TX.2.Mode=DMA_NORMAL
|
||||
Dma.I2C1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C1_TX.2.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C1_TX.2.Priority=DMA_PRIORITY_MEDIUM
|
||||
Dma.I2C1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.Request0=ADC1
|
||||
Dma.Request1=I2C1_RX
|
||||
Dma.Request2=I2C1_TX
|
||||
Dma.RequestsNb=3
|
||||
FREERTOS.FootprintOK=true
|
||||
FREERTOS.INCLUDE_vTaskDelete=0
|
||||
@@ -74,8 +74,9 @@ FREERTOS.configMINIMAL_STACK_SIZE=256
|
||||
FREERTOS.configTICK_RATE_HZ=100
|
||||
FREERTOS.configTOTAL_HEAP_SIZE=10240
|
||||
File.Version=6
|
||||
I2C1.DutyCycle=I2C_DUTYCYCLE_2
|
||||
I2C1.I2C_Mode=I2C_Fast
|
||||
I2C1.IPParameters=I2C_Mode
|
||||
I2C1.IPParameters=I2C_Mode,DutyCycle
|
||||
IWDG.IPParameters=Prescaler
|
||||
IWDG.Prescaler=IWDG_PRESCALER_256
|
||||
KeepUserPlacement=false
|
||||
@@ -88,8 +89,9 @@ Mcu.IP4=IWDG
|
||||
Mcu.IP5=NVIC
|
||||
Mcu.IP6=RCC
|
||||
Mcu.IP7=SYS
|
||||
Mcu.IP8=TIM3
|
||||
Mcu.IPNb=9
|
||||
Mcu.IP8=TIM2
|
||||
Mcu.IP9=TIM3
|
||||
Mcu.IPNb=10
|
||||
Mcu.Name=STM32F103T(8-B)Ux
|
||||
Mcu.Package=VFQFPN36
|
||||
Mcu.Pin0=PA6
|
||||
@@ -100,9 +102,12 @@ Mcu.Pin12=PB7
|
||||
Mcu.Pin13=VP_FREERTOS_VS_ENABLE
|
||||
Mcu.Pin14=VP_IWDG_VS_IWDG
|
||||
Mcu.Pin15=VP_SYS_VS_tim1
|
||||
Mcu.Pin16=VP_TIM3_VS_ClockSourceINT
|
||||
Mcu.Pin17=VP_TIM3_VS_no_output4
|
||||
Mcu.Pin16=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin17=VP_TIM2_VS_no_output1
|
||||
Mcu.Pin18=VP_TIM2_VS_no_output3
|
||||
Mcu.Pin19=VP_TIM3_VS_ClockSourceINT
|
||||
Mcu.Pin2=PB0
|
||||
Mcu.Pin20=VP_TIM3_VS_no_output4
|
||||
Mcu.Pin3=PB1
|
||||
Mcu.Pin4=PA8
|
||||
Mcu.Pin5=PA9
|
||||
@@ -110,28 +115,31 @@ Mcu.Pin6=PA13
|
||||
Mcu.Pin7=PA14
|
||||
Mcu.Pin8=PB3
|
||||
Mcu.Pin9=PB4
|
||||
Mcu.PinsNb=18
|
||||
Mcu.PinsNb=21
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32F103T8Ux
|
||||
MxCube.Version=4.22.0
|
||||
MxDb.Version=DB.4.0.220
|
||||
NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true
|
||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true
|
||||
NVIC.DMA1_Channel6_IRQn=true\:5\:0\:false\:false\:true\:true
|
||||
NVIC.DMA1_Channel7_IRQn=true\:5\:0\:false\:false\:true\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true
|
||||
MxCube.Version=4.25.0
|
||||
MxDb.Version=DB.4.0.250
|
||||
NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true\:true
|
||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\: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\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
NVIC.I2C1_ER_IRQn=true\:5\:0\:false\:false\:true\:true\:true
|
||||
NVIC.I2C1_EV_IRQn=true\:5\:0\:false\:false\:true\:true\:true
|
||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:true
|
||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
|
||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false
|
||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true
|
||||
NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:true
|
||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true\:true
|
||||
NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
NVIC.TimeBase=TIM1_UP_IRQn
|
||||
NVIC.TimeBaseIP=TIM1
|
||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false
|
||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
||||
PA13.Locked=true
|
||||
PA13.Mode=Serial_Wire
|
||||
PA13.Signal=SYS_JTMS-SWDIO
|
||||
@@ -193,29 +201,30 @@ PCC.Vdd=3.3
|
||||
PinOutPanel.RotationAngle=0
|
||||
ProjectManager.AskForMigrate=true
|
||||
ProjectManager.BackupPrevious=false
|
||||
ProjectManager.CompilerOptimize=2
|
||||
ProjectManager.CompilerOptimize=3
|
||||
ProjectManager.ComputerToolchain=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.DeletePrevious=true
|
||||
ProjectManager.DeviceId=STM32F103T8Ux
|
||||
ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.0
|
||||
ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.1
|
||||
ProjectManager.FreePins=true
|
||||
ProjectManager.HalAssertFull=false
|
||||
ProjectManager.HeapSize=0x200
|
||||
ProjectManager.KeepUserCode=true
|
||||
ProjectManager.LastFirmware=true
|
||||
ProjectManager.LibraryCopy=1
|
||||
ProjectManager.MainLocation=Src
|
||||
ProjectManager.PreviousToolchain=SW4STM32
|
||||
ProjectManager.ProjectBuild=false
|
||||
ProjectManager.ProjectFileName=TS100.ioc
|
||||
ProjectManager.ProjectName=TS100
|
||||
ProjectManager.StackSize=0x400
|
||||
ProjectManager.TargetToolchain=SW4STM32
|
||||
ProjectManager.ToolChainLocation=C\:\\Users\\Ralim\\Repo\\ts100\\TS100
|
||||
ProjectManager.ToolChainLocation=
|
||||
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.ADCPresc=RCC_ADCPCLK2_DIV8
|
||||
RCC.AHBFreq_Value=64000000
|
||||
@@ -252,6 +261,9 @@ SH.GPXTI5.0=GPIO_EXTI5
|
||||
SH.GPXTI5.ConfNb=1
|
||||
SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1
|
||||
SH.S_TIM3_CH1.ConfNb=1
|
||||
TIM2.Channel-PWM\ Generation1\ No\ Output=TIM_CHANNEL_1
|
||||
TIM2.Channel-PWM\ Generation3\ No\ Output=TIM_CHANNEL_3
|
||||
TIM2.IPParameters=Channel-PWM Generation1 No Output,Channel-PWM Generation3 No Output
|
||||
TIM3.Channel-Output\ Compare4\ No\ Output=TIM_CHANNEL_4
|
||||
TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
|
||||
TIM3.ClockDivision=TIM_CLOCKDIVISION_DIV4
|
||||
@@ -267,6 +279,12 @@ VP_IWDG_VS_IWDG.Mode=IWDG_Activate
|
||||
VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
|
||||
VP_SYS_VS_tim1.Mode=TIM1
|
||||
VP_SYS_VS_tim1.Signal=SYS_VS_tim1
|
||||
VP_TIM2_VS_ClockSourceINT.Mode=Internal
|
||||
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
|
||||
VP_TIM2_VS_no_output1.Mode=PWM Generation1 No Output
|
||||
VP_TIM2_VS_no_output1.Signal=TIM2_VS_no_output1
|
||||
VP_TIM2_VS_no_output3.Mode=PWM Generation3 No Output
|
||||
VP_TIM2_VS_no_output3.Signal=TIM2_VS_no_output3
|
||||
VP_TIM3_VS_ClockSourceINT.Mode=Internal
|
||||
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
|
||||
VP_TIM3_VS_no_output4.Mode=Output Compare4 No Output
|
||||
|
||||
674
LICENSE
Normal file
674
LICENSE
Normal 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>.
|
||||
@@ -1,7 +1,7 @@
|
||||
# TS100
|
||||
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.
|
||||
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).
|
||||
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.
|
||||
|
||||
BIN
workspace/TS100/..cproject.swp
Normal file
BIN
workspace/TS100/..cproject.swp
Normal file
Binary file not shown.
@@ -22,7 +22,7 @@
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.317155453" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
|
||||
<builder buildPath="${workspace_loc:/TS100}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.910934658" 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.319926124" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
|
||||
<option id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1178790692" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.debug" valueType="enumerated"/>
|
||||
<option id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1178790692" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.debugging.level.1214895662" 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.1766485383" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/inc""/>
|
||||
@@ -44,11 +44,12 @@
|
||||
<listOptionValue builtIn="false" value="USE_RTOS_SYSTICK"/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.dialect.std.565083189" 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.338139343" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.fdata" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.176392389" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
|
||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.893418158" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
|
||||
</tool>
|
||||
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1941847243" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
|
||||
<option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1283353237" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.debug" valueType="enumerated"/>
|
||||
<option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1283353237" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
|
||||
<option id="gnu.cpp.compiler.option.debugging.level.224874042" 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.1749257477" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/inc""/>
|
||||
@@ -70,6 +71,7 @@
|
||||
<listOptionValue builtIn="false" value="USE_RTOS_SYSTICK"/>
|
||||
</option>
|
||||
<option id="gnu.cpp.compiler.option.dialect.std.1681974405" 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.1463726438" 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.149685854" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
|
||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1092052043" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
|
||||
</tool>
|
||||
@@ -108,120 +110,6 @@
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</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 "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size -B "${BuildArtifactFileName}" ;arm-none-eabi-objcopy -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex"">
|
||||
<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=""${ProjDirPath}/inc""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/CMSIS/core""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/CMSIS/device""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/HAL_Driver/Inc/Legacy""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/HAL_Driver/Inc""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/include""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3""/>
|
||||
</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=""${ProjDirPath}/inc""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/CMSIS/core""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/CMSIS/device""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/HAL_Driver/Inc/Legacy""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/HAL_Driver/Inc""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/include""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3""/>
|
||||
</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=""${ProjDirPath}/inc""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/CMSIS/core""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/CMSIS/device""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/HAL_Driver/Inc/Legacy""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/HAL_Driver/Inc""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/include""/>
|
||||
<listOptionValue builtIn="false" value=""${ProjDirPath}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3""/>
|
||||
</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 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"/>
|
||||
|
||||
@@ -6,19 +6,7 @@
|
||||
<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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
|
||||
66
workspace/TS100/.vscode/c_cpp_properties.json
vendored
Normal file
66
workspace/TS100/.vscode/c_cpp_properties.json
vendored
Normal 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
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
* @retval None
|
||||
*/
|
||||
|
||||
@@ -7,6 +7,7 @@ endif
|
||||
# Discover the source files to build
|
||||
SOURCE := $(shell find . -type f -name '*.c')
|
||||
SOURCE_CPP := $(shell find . -type f -name '*.cpp')
|
||||
SOURCES := $(shell find . -type f -name '*.c*')
|
||||
S_SRCS := $(shell find . -type f -name '*.s')
|
||||
|
||||
APP_INC_DIR = ./inc
|
||||
@@ -31,7 +32,7 @@ HEXFILE_DIR=Hexfile
|
||||
OUTPUT_DIR=Objects
|
||||
|
||||
# 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 ---------------------------------------------------------------
|
||||
@@ -130,7 +131,11 @@ CXXFLAGS=$(CPUFLAGS) \
|
||||
-fno-rtti \
|
||||
-fno-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)
|
||||
|
||||
|
||||
@@ -173,7 +178,7 @@ OUT_OBJS_S=$(addprefix $(OUTPUT_DIR)/,$(OBJS_S))
|
||||
OUT_HEXFILE=$(addprefix $(HEXFILE_DIR)/,$(OUTPUT_EXE))
|
||||
|
||||
all: $(OUT_HEXFILE).hex
|
||||
|
||||
|
||||
#
|
||||
# The rule to create the target directory
|
||||
#
|
||||
|
||||
27
workspace/TS100/TS100.cfg
Normal file
27
workspace/TS100/TS100.cfg
Normal 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]
|
||||
@@ -19,7 +19,19 @@ make -j16 lang=PL
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=RU
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=SE
|
||||
make -j16 lang=FI
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=TR
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=BG
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=SK
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=HUN
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=BR
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=LT
|
||||
rm -rf Objects/src
|
||||
make -j16 lang=UA
|
||||
rm -rf Objects/src
|
||||
|
||||
31
workspace/TS100/inc/FRToSI2C.hpp
Normal file
31
workspace/TS100/inc/FRToSI2C.hpp
Normal 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_ */
|
||||
@@ -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,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
|
||||
|
||||
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)
|
||||
|
||||
@@ -101,12 +101,14 @@
|
||||
#define configTICK_RATE_HZ ((TickType_t)100)
|
||||
#define configMAX_PRIORITIES ( 4 )
|
||||
#define configMINIMAL_STACK_SIZE ((uint16_t)256)
|
||||
#define configTOTAL_HEAP_SIZE ((size_t)10240)
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configTOTAL_HEAP_SIZE ((size_t)10240) /*Currently use about 9000*/
|
||||
#define configMAX_TASK_NAME_LEN ( 48 )
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configQUEUE_REGISTRY_SIZE 8
|
||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
|
||||
#define configCHECK_FOR_STACK_OVERFLOW 2
|
||||
|
||||
|
||||
/* Co-routine definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
@@ -122,6 +124,7 @@ to exclude the API function. */
|
||||
#define INCLUDE_vTaskDelayUntil 0
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
#define INCLUDE_xTaskGetSchedulerState 1
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
||||
|
||||
/* Cortex-M specific definitions. */
|
||||
#ifdef __NVIC_PRIO_BITS
|
||||
|
||||
@@ -8,10 +8,11 @@
|
||||
#ifndef LIS2DH12_HPP_
|
||||
#define LIS2DH12_HPP_
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "FRToSI2C.hpp"
|
||||
#include "LIS2DH12_defines.hpp"
|
||||
class LIS2DH12 {
|
||||
public:
|
||||
LIS2DH12(I2C_HandleTypeDef* i2cHandle);
|
||||
LIS2DH12(FRToSI2C* i2cHandle);
|
||||
void initalize();
|
||||
uint8_t getOrientation();
|
||||
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);
|
||||
uint8_t I2C_RegisterRead(uint8_t reg);
|
||||
I2C_HandleTypeDef* i2c;
|
||||
FRToSI2C* i2c;
|
||||
};
|
||||
|
||||
#endif /* LIS2DH12_HPP_ */
|
||||
|
||||
@@ -9,11 +9,12 @@
|
||||
#define MMA8652FC_HPP_
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "MMA8652FC_defines.h"
|
||||
#include "FRToSI2C.hpp"
|
||||
class MMA8652FC {
|
||||
|
||||
public:
|
||||
|
||||
MMA8652FC(I2C_HandleTypeDef* i2cHandle);
|
||||
MMA8652FC(FRToSI2C* i2cHandle);
|
||||
void initalize(); // Initalize the system
|
||||
uint8_t getOrientation();// Reads the I2C register and returns the orientation (true == left)
|
||||
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);
|
||||
uint8_t I2C_RegisterRead(uint8_t reg);
|
||||
I2C_HandleTypeDef* i2c;
|
||||
FRToSI2C* i2c;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <hardware.h>
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include <stdbool.h>
|
||||
#include "FRToSI2C.hpp"
|
||||
#include "Font.h"
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -25,17 +26,17 @@ extern "C" {
|
||||
|
||||
class OLED {
|
||||
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 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 setRotation(bool leftHanded); // Set the rotation for the screen
|
||||
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 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 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);
|
||||
// Draws an image to the buffer, at x offset from top to bottom (fixed height renders)
|
||||
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 drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
|
||||
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:
|
||||
|
||||
//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
|
||||
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* secondStripPtr; //Pointers to the strips
|
||||
bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM)
|
||||
|
||||
@@ -11,31 +11,34 @@
|
||||
#define SETTINGS_H_
|
||||
#include <stdint.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
|
||||
*/
|
||||
typedef struct {
|
||||
uint16_t SolderingTemp; //current set point for the iron
|
||||
uint16_t SleepTemp; //temp to drop to in sleep
|
||||
uint8_t SleepTime; //minutes timeout to sleep
|
||||
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 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 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 coolingTempBlink :1; //Should the temperature blink on the cool down screen until its <50C
|
||||
uint16_t SolderingTemp; //current set point for the iron
|
||||
uint16_t SleepTemp; //temp to drop to in sleep
|
||||
uint8_t SleepTime; //minutes timeout to sleep
|
||||
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 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 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 coolingTempBlink :1; //Should the temperature blink on the cool down screen until its <50C
|
||||
uint8_t detailedIDLE :1; //Detailed idle screen
|
||||
uint8_t detailedSoldering :1; //Detailed soldering screens
|
||||
uint8_t temperatureInF; //Should the temp be in F or C (true is F)
|
||||
uint8_t descriptionScrollSpeed:1; // Description scroll speed
|
||||
uint16_t voltageDiv; //Voltage divisor factor
|
||||
uint16_t BoostTemp; //Boost mode set point for 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
|
||||
uint32_t padding; //This is here for in case we are not an even divisor so that nothing gets cut off
|
||||
uint8_t temperatureInF; //Should the temp be in F or C (true is F)
|
||||
uint8_t descriptionScrollSpeed:1; // Description scroll speed
|
||||
uint16_t voltageDiv; //Voltage divisor factor
|
||||
uint16_t BoostTemp; //Boost mode set point for the iron
|
||||
int16_t CalibrationOffset; //This stores the temperature offset for this tip in the iron.
|
||||
uint8_t PID_P; //PID P Term
|
||||
uint8_t PID_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;
|
||||
|
||||
extern volatile systemSettingsType systemSettings;
|
||||
|
||||
@@ -17,9 +17,10 @@ extern "C" {
|
||||
extern ADC_HandleTypeDef hadc1;
|
||||
extern DMA_HandleTypeDef hdma_adc1;
|
||||
|
||||
extern DMA_HandleTypeDef hdma_i2c1_rx;
|
||||
extern DMA_HandleTypeDef hdma_i2c1_tx;
|
||||
extern I2C_HandleTypeDef hi2c1;
|
||||
|
||||
|
||||
extern IWDG_HandleTypeDef hiwdg;
|
||||
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
|
||||
@@ -39,6 +39,7 @@ extern const char* IdleTipString;
|
||||
extern const char* IdleSetString;
|
||||
extern const char* TipDisconnectedString;
|
||||
extern const char* SolderingAdvancedPowerPrompt;
|
||||
extern const char* OffString;
|
||||
|
||||
extern const char SettingTrueChar;
|
||||
extern const char SettingFalseChar;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
extern OLED lcd;
|
||||
extern MMA8652FC accel;
|
||||
|
||||
extern uint8_t PCBVersion;
|
||||
enum ButtonState {
|
||||
BUTTON_NONE = 0, /* No buttons pressed / < filter time*/
|
||||
BUTTON_F_SHORT = 1, /* User has pressed the front button*/
|
||||
@@ -25,5 +25,20 @@ enum ButtonState {
|
||||
|
||||
ButtonState getButtonState();
|
||||
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 */
|
||||
|
||||
102
workspace/TS100/src/FRToSI2C.cpp
Normal file
102
workspace/TS100/src/FRToSI2C.cpp
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include <LIS2DH12.hpp>
|
||||
#include "cmsis_os.h"
|
||||
LIS2DH12::LIS2DH12(I2C_HandleTypeDef* i2cHandle) {
|
||||
LIS2DH12::LIS2DH12(FRToSI2C* i2cHandle) {
|
||||
i2c = i2cHandle;
|
||||
}
|
||||
|
||||
@@ -44,12 +44,9 @@ uint8_t LIS2DH12::getOrientation() {
|
||||
|
||||
void LIS2DH12::getAxisReadings(int16_t* x, int16_t* y, int16_t* z) {
|
||||
uint8_t tempArr[6];
|
||||
taskENTER_CRITICAL();
|
||||
while (HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, 0xA8,
|
||||
I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6, 5000) != HAL_OK) {
|
||||
HAL_Delay(5);
|
||||
}
|
||||
taskEXIT_CRITICAL();
|
||||
i2c->Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT,
|
||||
(uint8_t*) tempArr, 6);
|
||||
|
||||
(*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0]));
|
||||
(*y) = ((uint16_t) (tempArr[3] << 8 | tempArr[2]));
|
||||
(*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) {
|
||||
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 tx_data[1];
|
||||
HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
|
||||
tx_data, 1, 500);
|
||||
|
||||
i2c->Mem_Read( LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data, 1);
|
||||
return tx_data[0];
|
||||
}
|
||||
|
||||
@@ -8,20 +8,18 @@
|
||||
#include <MMA8652FC.hpp>
|
||||
#include "cmsis_os.h"
|
||||
|
||||
MMA8652FC::MMA8652FC(I2C_HandleTypeDef* i2cHandle) {
|
||||
MMA8652FC::MMA8652FC(FRToSI2C* i2cHandle) {
|
||||
i2c = i2cHandle;
|
||||
}
|
||||
|
||||
void MMA8652FC::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
||||
|
||||
HAL_I2C_Mem_Write(i2c, MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
|
||||
&data, 1, 500);
|
||||
i2c->Mem_Write( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1);
|
||||
}
|
||||
|
||||
uint8_t MMA8652FC::I2C_RegisterRead(uint8_t reg) {
|
||||
uint8_t tx_data[1];
|
||||
HAL_I2C_Mem_Read(i2c, MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
|
||||
tx_data, 1, 500);
|
||||
i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data,
|
||||
1);
|
||||
|
||||
return tx_data[0];
|
||||
}
|
||||
@@ -36,51 +34,42 @@ void MMA8652FC::initalize() {
|
||||
I2C_RegisterWrite(PL_COUNT_REG, 200); //200 count debounce
|
||||
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( 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_REG2, 0x12); //Set maximum resolution oversampling
|
||||
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( CTRL_REG1, 0x19); // ODR=12 Hz, Active mode
|
||||
HAL_Delay(2); // ~1ms delay
|
||||
|
||||
}
|
||||
|
||||
void MMA8652FC::setSensitivity(uint8_t threshold, uint8_t filterTime) {
|
||||
uint8_t sens = 9 * 2 + 17;
|
||||
sens -= 2 * threshold;
|
||||
taskENTER_CRITICAL();
|
||||
I2C_RegisterWrite( CTRL_REG1, 0); // sleep mode
|
||||
I2C_RegisterWrite(FF_MT_THS_REG, (sens & 0x7F));// Set accumulation threshold
|
||||
I2C_RegisterWrite(FF_MT_COUNT_REG, filterTime); // Set debounce threshold
|
||||
I2C_RegisterWrite( CTRL_REG1, 0x31); // ODR=12 Hz, Active mode
|
||||
taskEXIT_CRITICAL();
|
||||
}
|
||||
|
||||
uint8_t MMA8652FC::getOrientation() {
|
||||
//First read the PL_STATUS register
|
||||
taskENTER_CRITICAL();
|
||||
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG);
|
||||
taskEXIT_CRITICAL();
|
||||
if ((plStatus & 0b10000000) == 0b10000000) {
|
||||
plStatus >>= 1; //We don't need the up/down bit
|
||||
plStatus &= 0x03; //mask to the two lower bits
|
||||
//0 == left handed
|
||||
//1 == right handed
|
||||
|
||||
return plStatus==0?2:1;
|
||||
return plStatus == 0 ? 2 : 1;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
void MMA8652FC::getAxisReadings(int16_t *x, int16_t *y, int16_t *z) {
|
||||
uint8_t tempArr[6];
|
||||
taskENTER_CRITICAL();
|
||||
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();
|
||||
i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6);
|
||||
|
||||
(*x) = tempArr[0] << 8 | tempArr[1];
|
||||
(*y) = tempArr[2] << 8 | tempArr[3];
|
||||
(*z) = tempArr[4] << 8 | tempArr[5];
|
||||
|
||||
@@ -43,14 +43,14 @@ uint8_t OLED_Setup_Array[] = { /**/
|
||||
};
|
||||
//Setup based on the SSD1307 and modified for the SSD1306
|
||||
|
||||
OLED::OLED(I2C_HandleTypeDef* i2cHandle) {
|
||||
OLED::OLED(FRToSI2C* i2cHandle) {
|
||||
i2c = i2cHandle;
|
||||
cursor_x = cursor_y = 0;
|
||||
currentFont = FONT_12;
|
||||
fontWidth = 12;
|
||||
inLeftHandedMode = false;
|
||||
firstStripPtr = &screenBuffer[13];
|
||||
secondStripPtr = &screenBuffer[13 + 96];
|
||||
firstStripPtr = &screenBuffer[16 + 1];
|
||||
secondStripPtr = &screenBuffer[16 + 1 + 96];
|
||||
fontHeight = 16;
|
||||
fontWidth = 12;
|
||||
displayOffset = 0;
|
||||
@@ -61,37 +61,33 @@ OLED::OLED(I2C_HandleTypeDef* i2cHandle) {
|
||||
void OLED::initialize() {
|
||||
HAL_Delay(5);
|
||||
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
|
||||
HAL_Delay(5);
|
||||
HAL_Delay(10);
|
||||
//Send the setup settings
|
||||
HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array,
|
||||
configLength, 0xFFFF);
|
||||
//displayOnOff(true);
|
||||
|
||||
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, configLength);
|
||||
displayOnOff(true);
|
||||
}
|
||||
|
||||
//Write out the buffer to the OLEd & call any rendering objects
|
||||
void OLED::refresh() {
|
||||
screenBuffer[0] = 0x80;
|
||||
screenBuffer[1] = 0x21;
|
||||
screenBuffer[1] = displayOnOffState ? 0xAF : 0xAE;
|
||||
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[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
|
||||
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();
|
||||
i2c->Transmit( DEVICEADDR_OLED, screenBuffer, 16 + (96 * 2) + 1);
|
||||
|
||||
}
|
||||
|
||||
@@ -101,10 +97,9 @@ void OLED::refresh() {
|
||||
* Precursor is the command char that is used to select the table.
|
||||
*/
|
||||
void OLED::drawChar(char c, char PrecursorCommand) {
|
||||
if( c=='\n' && cursor_y==0)
|
||||
{
|
||||
cursor_x=0;
|
||||
cursor_y=8;
|
||||
if (c == '\n' && cursor_y == 0) {
|
||||
cursor_x = 0;
|
||||
cursor_y = 8;
|
||||
}
|
||||
if (c < ' ') {
|
||||
return;
|
||||
@@ -128,10 +123,10 @@ void OLED::drawChar(char c, char PrecursorCommand) {
|
||||
index = (128) + (c);
|
||||
break;
|
||||
#if defined(LANG_RU) || defined(LANG_UK) || defined(LANG_SR) || defined(LANG_BG) || defined(LANG_MK)
|
||||
case 0xD0:
|
||||
case 0xD0:
|
||||
index = (192) + (c);
|
||||
break;
|
||||
case 0xD1:
|
||||
case 0xD1:
|
||||
index = (256) + (c);
|
||||
break;
|
||||
#else
|
||||
@@ -157,19 +152,7 @@ void OLED::drawChar(char c, char PrecursorCommand) {
|
||||
}
|
||||
|
||||
void OLED::displayOnOff(bool 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;
|
||||
}
|
||||
displayOnOffState = on;
|
||||
}
|
||||
|
||||
void OLED::setRotation(bool leftHanded) {
|
||||
@@ -182,11 +165,8 @@ void OLED::setRotation(bool leftHanded) {
|
||||
OLED_Setup_Array[11] = 0xC0;
|
||||
OLED_Setup_Array[19] = 0xA0;
|
||||
}
|
||||
taskENTER_CRITICAL();
|
||||
|
||||
HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED,
|
||||
(uint8_t*) OLED_Setup_Array, 50, 0xFFFF);
|
||||
taskEXIT_CRITICAL();
|
||||
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array,
|
||||
configLength);
|
||||
inLeftHandedMode = leftHanded;
|
||||
}
|
||||
}
|
||||
@@ -278,7 +258,7 @@ void OLED::drawBattery(uint8_t state) {
|
||||
drawSymbol(3 + state);
|
||||
}
|
||||
void OLED::drawCheckbox(bool state) {
|
||||
drawSymbol((state) ? 17 : 18);
|
||||
drawSymbol((state) ? 16 : 17);
|
||||
}
|
||||
void OLED::drawSymbol(uint8_t symbolID) {
|
||||
//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;
|
||||
|
||||
// trimming to draw partials
|
||||
if(x < 0) {
|
||||
visibleStart -= x; //subtract negative value == add absolute value
|
||||
if (x < 0) {
|
||||
visibleStart -= x; //subtract negative value == add absolute value
|
||||
}
|
||||
if(x + wide > 96) {
|
||||
visibleEnd = 96 - x;
|
||||
if (x + wide > 96) {
|
||||
visibleEnd = 96 - x;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -66,12 +66,12 @@ void restoreSettings() {
|
||||
*/
|
||||
uint8_t lookupVoltageLevel(uint8_t level) {
|
||||
if (level == 0)
|
||||
return 100; //10V since iron does not function effectively below this
|
||||
return 90; //9V since iron does not function effectively below this
|
||||
else
|
||||
return (level * 33) + (33 * 2);
|
||||
}
|
||||
void resetSettings() {
|
||||
|
||||
memset((void*)&systemSettings,0,sizeof(systemSettingsType));
|
||||
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.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.temperatureInF = 0; //default to 0
|
||||
systemSettings.descriptionScrollSpeed=0;//default to slow
|
||||
systemSettings.PID_P =42;
|
||||
systemSettings.PID_I =50;
|
||||
systemSettings.PID_D =15;
|
||||
|
||||
saveSettings();
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ ADC_HandleTypeDef hadc1;
|
||||
DMA_HandleTypeDef hdma_adc1;
|
||||
|
||||
I2C_HandleTypeDef hi2c1;
|
||||
DMA_HandleTypeDef hdma_i2c1_rx;
|
||||
DMA_HandleTypeDef hdma_i2c1_tx;
|
||||
|
||||
IWDG_HandleTypeDef hiwdg;
|
||||
TIM_HandleTypeDef htim2;
|
||||
@@ -36,7 +38,7 @@ void Setup_HAL() {
|
||||
MX_TIM2_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
|
||||
}
|
||||
|
||||
@@ -75,7 +77,7 @@ void SystemClock_Config(void) {
|
||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||
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);
|
||||
|
||||
@@ -129,31 +131,39 @@ static void MX_ADC1_Init(void) {
|
||||
//F in = 10.66 MHz
|
||||
/*
|
||||
* 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.InjectedRank = 1;
|
||||
sConfigInjected.InjectedNbrOfConversion = 4;
|
||||
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_13CYCLES_5;
|
||||
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5;
|
||||
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1;
|
||||
sConfigInjected.AutoInjectedConv = DISABLE;
|
||||
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
|
||||
sConfigInjected.InjectedOffset = 0;
|
||||
|
||||
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
||||
|
||||
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
||||
sConfigInjected.InjectedRank = 2;
|
||||
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
||||
sConfigInjected.InjectedRank = 3;
|
||||
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
||||
sConfigInjected.InjectedRank = 4;
|
||||
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 */
|
||||
static void MX_I2C1_Init(void) {
|
||||
|
||||
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.OwnAddress1 = 0;
|
||||
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||
@@ -170,7 +180,7 @@ static void MX_IWDG_Init(void) {
|
||||
|
||||
hiwdg.Instance = IWDG;
|
||||
hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
|
||||
hiwdg.Init.Reload = 50;
|
||||
hiwdg.Init.Reload = 100;
|
||||
HAL_IWDG_Init(&hiwdg);
|
||||
|
||||
}
|
||||
@@ -252,11 +262,11 @@ static void MX_TIM2_Init(void) {
|
||||
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
|
||||
|
||||
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||
sConfigOC.Pulse = 117;
|
||||
sConfigOC.Pulse = 118;
|
||||
/*
|
||||
* It takes 4 milliseconds for output to be stable after PWM turns off.
|
||||
* 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.OCFastMode = TIM_OCFAST_ENABLE;
|
||||
@@ -285,13 +295,13 @@ static void MX_DMA_Init(void) {
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* 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);
|
||||
/* 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);
|
||||
/* 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);
|
||||
|
||||
}
|
||||
@@ -333,13 +343,16 @@ static void MX_GPIO_Init(void) {
|
||||
| GPIO_PIN_15;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||
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.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
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_13, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pins : 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;
|
||||
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.Mode = GPIO_MODE_IT_FALLING;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP; //Technically the IMU is P-P but safer to pullup (very tiny current cost)
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/*Configure peripheral I/O remapping */
|
||||
|
||||
@@ -75,6 +75,15 @@ const char* SettingsDescriptions[17] = {
|
||||
/* Calibrate input voltage */ "VIN Calibration. Buttons adjust, long press to exit",
|
||||
/* Advanced soldering screen enabled */ "Display detailed information while soldering",
|
||||
/* 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!";
|
||||
@@ -93,6 +102,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -106,7 +116,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Power", "source"},
|
||||
/* (<= 9) Sleep temperature */ {"Sleep", "temp"},
|
||||
/* (<= 9) Sleep timeout */ {"Sleep", "timeout"},
|
||||
/* (<= 11) Shutdown timeout */ {"Shutdown", "timeout"},
|
||||
/* (<= 10) Shutdown timeout */ {"Shutdown", "timeout"},
|
||||
/* (<= 13) Motion sensitivity level */ {"Motion", "sensitivity"},
|
||||
/* (<= 13) Temperature in F and C */ {"Temperature", "units"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Detailed", "idle screen"},
|
||||
@@ -120,6 +130,13 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 16) Calibrate input voltage */ {"Calibrate", "input voltage?"},
|
||||
/* (<= 13) Advanced soldering screen enabled */ {"Detailed", "solder screen"},
|
||||
/* (<= 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)
|
||||
@@ -176,6 +193,7 @@ const char* IdleTipString = "Връх:"; // IdleTipString+
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "ВРЪХ ЛОША ВРЪЗКА"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Захранване: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -189,7 +207,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Източник", "захранване"},
|
||||
/* (<= 9) Sleep temperature */ {"Темп.", "сън"},
|
||||
/* (<= 9) Sleep timeout */ {"Време", "сън"},
|
||||
/* (<= 11) Shutdown timeout */ {"Време", "изкл."},
|
||||
/* (<= 10) Shutdown timeout */ {"Време", "изкл."},
|
||||
/* (<= 13) Motion sensitivity level */ {"Усещане", "за движение"},
|
||||
/* (<= 13) Temperature in F and C */ {"Единици за", "температура"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Детайлен", "екран в покой"},
|
||||
@@ -223,41 +241,42 @@ const char* SettingsMenuEntriesDescriptions[4] = {
|
||||
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> <S 3.3 V на батарею>",
|
||||
/* Sleep temperature */ "Температура режима ожидания <С>",
|
||||
/* Sleep timeout */ "Время до перехода в режим ожидания <Минуты>",
|
||||
/* Shutdown timeout */ "Время до отключения <Минуты>",
|
||||
/* Motion sensitivity level */ "Акселерометр <0. Выкл. 1. мин. чувствительный 9. макс. чувствительный>",
|
||||
/* Temperature in F and C */ "В чем измерять температуру",
|
||||
/* Advanced idle display mode enabled */ "Показывать детальную информацию маленьким шрифтом на домашнем экране",
|
||||
/* Display rotation mode */ "Ориентация дисплея <A. Автоматический, Л. Левая рука, П. Правая рука>",
|
||||
/* Boost enabled */ "Турбо-режим при удержании кнопки А при пайке ",
|
||||
/* Boost temperature */ "Температура в турбо-режиме",
|
||||
/* Automatic start mode */ "Автоматический запуск паяльника при включении питания. T=Нагрев, S=Режим ожидания,F=Выкл.",
|
||||
/* Cooldown blink */ "Показывать температуру на экране охлаждения, пока жало остается горячим.",
|
||||
/* Temperature calibration enter menu */ "Калибровка термодатчика.",
|
||||
/* Settings reset command */ "Сброс всех настроек.",
|
||||
/* 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 */ "Speed this text scrolls past at",
|
||||
/* Description Scroll Speed */ "Скорость прокрутки текста.",
|
||||
};
|
||||
|
||||
const char* SettingsCalibrationWarning = "Убедитесь, что жало остыло до комнатной температуры, прежде чем продолжать!";
|
||||
const char* SettingsResetWarning = "Are you sure to reset settings to default values?";
|
||||
const char* UVLOWarningString = "БАТ РАЗР"; // <=8 chars
|
||||
const char* UndervoltageString = "Undervoltage"; // <=16 chars
|
||||
const char* InputVoltageString = "Input V: "; // <=11 chars, preferably end with a space
|
||||
const char* WarningTipTempString = "Tip Temp: "; // <=12 chars, preferably end with a space
|
||||
const char* BadTipString = "BAD TIP"; // <=8 chars
|
||||
const char* SleepingSimpleString = "Хррр"; // Must be <= 4 chars
|
||||
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
|
||||
cconst char* SleepingTipAdvancedString = "Tip:"; // <=6 chars
|
||||
const char* IdleTipString = "Tip:"; // IdleTipString+IdleSetString <= 10
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 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 ="Off"; // 3 chars max
|
||||
|
||||
/*
|
||||
* #TODO change support for multibyte constants here
|
||||
@@ -269,40 +288,40 @@ const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
const char SettingAutoChar = 'A';
|
||||
|
||||
const char SettingFastChar = 'F';
|
||||
const char SettingSlowChar = 'S';
|
||||
const char SettingFastChar = '+';
|
||||
const char SettingSlowChar = '-';
|
||||
|
||||
const enum ShortNameType SettingsShortNameType = SHORT_NAME_SINGLE_LINE;
|
||||
const enum ShortNameType SettingsShortNameType = SHORT_NAME_DOUBLE_LINE;
|
||||
const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 5) Power source (DC or batt) */ {"ИстП "},
|
||||
/* (<= 4) Sleep temperature */ {"Тожд"},
|
||||
/* (<= 4) Sleep timeout */ {"Вожд "},
|
||||
/* (<= 5) Shutdown timeout */ {"Тоткл "},
|
||||
/* (<= 6) Motion sensitivity level */ {"ЧувсДв "},
|
||||
/* (<= 6) Temperature in F and C */ {"ЕдТемп "},
|
||||
/* (<= 6) Advanced idle display mode enabled */ {"ИнфОжд "},
|
||||
/* (<= 6) Display rotation mode */ {"ПовЭкр "},
|
||||
/* (<= 6) Boost enabled */ {"Турбо "},
|
||||
/* (<= 4) Boost temperature */ {"Ттур "},
|
||||
/* (<= 6) Automatic start mode */ {"Астарт"},
|
||||
/* (<= 6) Cooldown blink */ {"Охлажд "},
|
||||
/* (<= 8) Temperature calibration enter menu */ {"КалибрТ"},
|
||||
/* (<= 8) Settings reset command */ {"СБРОС?"},
|
||||
/* (<= 8) Calibrate input voltage */ {"КалибрU?"},
|
||||
/* (<= 6) Advanced soldering screen enabled */ {"ИнфПай "},
|
||||
/* (<= 6) Message Scroll Speed */ {"DESCSP"},
|
||||
/* (<= 11) Power source (DC or batt) */ {"Источник","питания"}, //8,7
|
||||
/* (<= 9) Sleep temperature */ {"Темпер.","сна"}, //7,3
|
||||
/* (<= 9) Sleep timeout */ {"Таймаут","сна"}, //7,3
|
||||
/* (<= 10) Shutdown timeout */ {"Время до","отключения"}, //8,10
|
||||
/* (<= 13) Motion sensitivity level */ {"Чувст. сенсо-","ра движения"}, //13,11
|
||||
/* (<= 13) Temperature in F and C */ {"Формат темпе-","ратуры(C°/F°)"}, //13,13
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Подробный ре-","жим ожидания"}, //13,12
|
||||
/* (<= 13) Display rotation mode */ {"Автоповорот","экрана"}, //11,6
|
||||
/* (<= 13) Boost enabled */ {"Режим","Турбо"}, //5,5
|
||||
/* (<= 9) Boost temperature */ {"Темпер.","Турбо"}, //7,5
|
||||
/* (<= 13) Automatic start mode */ {"Горячий","старт"}, //9,9
|
||||
/* (<= 13) Cooldown blink */ {"Показ t° при","остывании"}, //7,3
|
||||
/* (<= 16) Temperature calibration enter menu */ {"Калибровка","температуры"}, //10,11
|
||||
/* (<= 16) Settings reset command */ {"Сбросить все","настройки?"}, //12,10
|
||||
/* (<= 16) Calibrate input voltage */ {"Калибровка","напряжения"}, //10,10
|
||||
/* (<= 13) Advanced soldering screen enabled */ {"Подробный ре-","жим пайки"}, //13,9
|
||||
/* (<= 11) Message Scroll Speed */ {"Скорость","текста"}, //8,6
|
||||
};
|
||||
|
||||
const char* SettingsMenuEntries[4] = {
|
||||
/*Soldering Menu*/"Soldering\nSettings",
|
||||
/* Power Saving Menu*/"Sleep\nModes",
|
||||
/* UI Menu*/"User\nInterface",
|
||||
/* Advanced Menu*/"Advanced\nOptions", };
|
||||
/*Soldering Menu*/"Пайка",
|
||||
/* Power Saving Menu*/"Сон",
|
||||
/* UI Menu*/"Интерфейс",
|
||||
/* Advanced Menu*/"Другие", };
|
||||
const char* SettingsMenuEntriesDescriptions[4] ={
|
||||
"Soldering settings",
|
||||
"Power Saving Settings",
|
||||
"User Interface settings",
|
||||
"Advanced options"
|
||||
"Настройки для режима пайки. Действуют при включенном жале.",
|
||||
"Настройки при бездействии. Полезно чтобы не обжечься и случайно не сжечь жилище.",
|
||||
"Пользовательский интерфейс.",
|
||||
"Расширенные настройки. Дополнительные удобства."
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -316,21 +335,21 @@ const char* SettingsDescriptions[17] = {
|
||||
/* Shutdown timeout */ "Tiempo hasta apagado. <Minutos>",
|
||||
/* Motion sensitivity level */ "Sensibilidad del movimiento. <0=Apagado 1=El menos sensible 9=El más sensible>",
|
||||
/* Temperature in F and C */ "Unidad de temperatura.",
|
||||
/* Advanced idle display mode enabled */ "Display detailed information in a smaller font on the idle screen.",
|
||||
/* Advanced idle display mode enabled */ "Mostrar información detallada con fuente de menor tamaño en la pantalla de reposo.",
|
||||
/* Display rotation mode */ "Orientación de la pantalla <A=Automático I=Mano izquierda D=Mano derecha>",
|
||||
/* Boost enabled */ "Activar el botón \"Boost\" en modo soldadura.",
|
||||
/* Boost temperature */ "Temperatura en modo \"Boost\". <C>",
|
||||
/* Automatic start mode */ "Iniciar modo soldadura en el encendido. <V=Sí S=Modo reposo F=No>",
|
||||
/* Cooldown blink */ "Parpadea la temperatura en el enfriamiento si la punta sigue caliente.",
|
||||
/* Temperature calibration enter menu */ "Calibrate tip offset.",
|
||||
/* Settings reset command */ "Reset all settings",
|
||||
/* Calibrate input voltage */ "VIN Calibration. Buttons adjust, long press to exit",
|
||||
/* Advanced soldering screen enabled */ "Display detailed information while soldering",
|
||||
/* Description Scroll Speed */ "Speed this text scrolls past at",
|
||||
/* Temperature calibration enter menu */ "Calibrar desviación térmica de la punta.",
|
||||
/* Settings reset command */ "Volver a estado de fábrica.",
|
||||
/* Calibrate input voltage */ "Calibración VIN (Voltaje de entrada). Ajuste con ambos botones, pulsación larga para salir.",
|
||||
/* Advanced soldering screen enabled */ "Mostrar información detallada mientras suelda.",
|
||||
/* Description Scroll Speed */ "Velocidad de desplazamiento del texto.",
|
||||
};
|
||||
|
||||
const char* SettingsCalibrationWarning = "Please ensure the tip is at room temperature before continuing!";
|
||||
const char* SettingsResetWarning = "Are you sure to reset settings to default values?";
|
||||
const char* SettingsCalibrationWarning = "Por favor, ¡asegúrese que la punta esté a temperatura ambiente antes de proceder!";
|
||||
const char* SettingsResetWarning = "¿Está seguro de volver a estado de fábrica?";
|
||||
const char* UVLOWarningString = "DC LOW"; // <=8 chars
|
||||
const char* UndervoltageString = "Undervoltage"; // <=16 chars
|
||||
const char* InputVoltageString = "Input V: "; // <=11 chars, preferably end with a space
|
||||
@@ -345,13 +364,14 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSe
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
const char SettingRightChar = 'D'; // D is "Derecha" = Right
|
||||
const char SettingLeftChar = 'I'; // I is "Izquierda" = Left
|
||||
const char SettingAutoChar = 'A';
|
||||
|
||||
const char SettingFastChar = 'F';
|
||||
const char SettingSlowChar = 'S';
|
||||
const char SettingFastChar = 'R'; // R is "Rápido" = Fast
|
||||
const char SettingSlowChar = 'L'; // L is "Lento" = Slow
|
||||
|
||||
const enum ShortNameType SettingsShortNameType = SHORT_NAME_SINGLE_LINE;
|
||||
const char* SettingsShortNames[17][2] = {
|
||||
@@ -374,95 +394,102 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 6) Message Scroll Speed */ {"DESCSP"},
|
||||
};
|
||||
const char* SettingsMenuEntries[4] = {
|
||||
/*Soldering Menu*/"Soldering\nSettings",
|
||||
/* Power Saving Menu*/"Sleep\nModes",
|
||||
/* UI Menu*/"User\nInterface",
|
||||
/* Advanced Menu*/"Advanced\nOptions", };
|
||||
/*Soldering Menu*/"Opciones de\nsoldadura",
|
||||
/* Power Saving Menu*/"Modos de\nreposo",
|
||||
/* UI Menu*/"Interfaz de\nusuario",
|
||||
/* Advanced Menu*/"Opciones\navanzadas", };
|
||||
const char* SettingsMenuEntriesDescriptions[4] ={
|
||||
"Soldering settings",
|
||||
"Power Saving Settings",
|
||||
"User Interface settings",
|
||||
"Advanced options"
|
||||
"Opciones de soldadura",
|
||||
"Opciones de ahorro energético",
|
||||
"Opciones de interfaz de usuario",
|
||||
"Opciones avanzadas"
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef LANG_SE
|
||||
#ifdef LANG_FI
|
||||
|
||||
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> <S 3.3 V на батарею>",
|
||||
/* Sleep temperature */ "Температура Сна <С>",
|
||||
/* Sleep timeout */ "Переход в режим Сна <Минуты>",
|
||||
/* Shutdown timeout */ "Переходит в режим ожидания <Минуты>",
|
||||
/* Motion sensitivity level */ "Акселерометр <0. Выкл. 1. мин. чувствительный 9. макс. чувствительный>",
|
||||
/* Temperature in F and C */ "В чем измерять температуру",
|
||||
/* Advanced idle display mode enabled */ "Display detailed information in a smaller font on the idle screen.",
|
||||
/* Display rotation mode */ "Ориентация Дисплея <A. Автоматический L. Левая Рука R. Правая Рука>",
|
||||
/* Boost enabled */ "Активация кнопки A для Турбо режима до 450С при пайке ",
|
||||
/* Boost temperature */ "Установка температуры для Турбо режима",
|
||||
/* Automatic start mode */ "Автоматический запуск паяльника при включении питания. T=Нагрев, S= Режим Сна,F=Выкл.",
|
||||
/* Cooldown blink */ "Мигает температура на экране охлаждения, пока жало остается горячим.",
|
||||
/* Temperature calibration enter menu */ "Calibrate tip offset.",
|
||||
/* Settings reset command */ "Reset all settings",
|
||||
/* Calibrate input voltage */ "VIN Calibration. Buttons adjust, long press to exit",
|
||||
/* Advanced soldering screen enabled */ "Display detailed information while soldering",
|
||||
/* Description Scroll Speed */ "Speed this text scrolls past at",
|
||||
// These are all the help text for all the settings.
|
||||
// No requirements on spacing or length.
|
||||
/* 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 */ "Lepotilan lämpötila. <C>", //"Lepolämpötila <C>",
|
||||
/* Sleep timeout */ "Lepotilan viive. <minuuttia/sekuntia>",//"Lepoviive <minuuttia/sekuntia>",
|
||||
/* Shutdown timeout */ "Automaattisen sammutuksen aikaviive. <minuuttia>",
|
||||
/* 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 */ "Lämpötilan yksikkö. <C=celsius, F=fahrenheit>",
|
||||
/* Advanced idle display mode enabled */ "Näyttää yksityiskohtaisemmat tiedot lepotilassa.", //"Näyttää tarkemmat tiedot leponäytössä",
|
||||
/* 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 */ "Etupainikeella siirrytään juotettaessa tehostustilaan.",
|
||||
/* Boost temperature */ "Tehostustilan lämpötila.", //"Tehostuksen lämpötila kun käytetään tehostustilaa",
|
||||
/* 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 */ "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 */ "Kalibroi kärjen lämpötilaeron.", //"Kalibroidaan juotoskärjen lämpötilaero",
|
||||
/* Settings reset command */ "Palauta kaikki asetukset oletusarvoihin.", //"Palautetaan kaikki asetukset alkuperäisiksi",
|
||||
/* Calibrate input voltage */ "Tulojännitten kalibrointi (VIN). Painikkeilla säädetään ja pitkään painamalla poistutaan.",
|
||||
/* Advanced soldering screen enabled */ "Näyttää yksityiskohtaisemmat tiedot juotostilassa.", //"Näytetään tarkemmat tiedot juottamisen aikana",
|
||||
/* 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* SettingsResetWarning = "Are you sure to reset settings to default values?";
|
||||
const char* UVLOWarningString = "DC LOW"; // <=8 chars
|
||||
const char* UndervoltageString = "Undervoltage"; // <=16 chars
|
||||
const char* InputVoltageString = "Input V: "; // <=11 chars, preferably end with a space
|
||||
const char* WarningTipTempString = "Tip Temp: "; // <=12 chars, preferably end with a space
|
||||
const char* BadTipString = "BAD TIP"; // <=8 chars
|
||||
const char* SleepingSimpleString = "Zzzz"; // Must be <= 4 chars
|
||||
const char* SleepingAdvancedString = "Sleeping..."; // <=16 chars
|
||||
const char* WarningSimpleString = "HOT!"; // Must be <= 4 chars
|
||||
const char* WarningAdvancedString = "WARNING! TIP HOT!"; // <=16 chars
|
||||
const char* SleepingTipAdvancedString = "Tip:"; // <=6 chars
|
||||
const char* IdleTipString = "Tip:"; // IdleTipString+IdleSetString <= 10
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
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 = "Haluatko varmasti palauttaa oletusarvot?"; //"Haluatko palauttaa oletusarvot?";
|
||||
const char* UVLOWarningString = "DC LOW"; // <=8 chars
|
||||
const char* UndervoltageString = "Alijännite"; // <=16 chars
|
||||
const char* InputVoltageString = "Jännite: "; // <=11 chars, preferably end with a space
|
||||
const char* WarningTipTempString = "Lämpötila: "; // <=12 chars, preferably end with a space
|
||||
const char* BadTipString = "VIKATILA"; // <=8 chars
|
||||
const char* SleepingSimpleString = "Zzz"; // Must be <= 4 chars
|
||||
const char* SleepingAdvancedString = "Lepotila..."; // <=16 chars
|
||||
const char* WarningSimpleString = "HOT"; // Must be <= 4 chars
|
||||
const char* WarningAdvancedString = " ! KÄRKI KUUMA !"; //"KUUMA KÄRKI"; // <=16 chars
|
||||
const char* SleepingTipAdvancedString = "Kärki:"; // <=6 chars
|
||||
const char* IdleTipString = "Kärki:"; // IdleTipString+IdleSetString <= 10
|
||||
const char* IdleSetString = " Asetus:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "KÄRKI ON IRTI"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Teho: "; // <=12 chars
|
||||
const char* OffString ="OFF"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
const char SettingRightChar = 'O';
|
||||
const char SettingLeftChar = 'V';
|
||||
const char SettingAutoChar = 'A';
|
||||
|
||||
const char SettingFastChar = 'F';
|
||||
const char SettingSlowChar = 'S';
|
||||
const char SettingFastChar = 'N'; //'F';
|
||||
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] = {
|
||||
/* (<= 5) Power source (DC or batt) */ {"PWRSC"},
|
||||
/* (<= 4) Sleep temperature */ {"STMP"},
|
||||
/* (<= 4) Sleep timeout */ {"STME"},
|
||||
/* (<= 5) Shutdown timeout */ {"SHTME"},
|
||||
/* (<= 6) Motion sensitivity level */ {"MSENSE"},
|
||||
/* (<= 6) Temperature in F and C */ {"TMPUNT"},
|
||||
/* (<= 6) Advanced idle display mode enabled */ {"ADVIDL"},
|
||||
/* (<= 6) Display rotation mode */ {"DSPROT"},
|
||||
/* (<= 6) Boost enabled */ {"BOOST"},
|
||||
/* (<= 4) Boost temperature */ {"BTMP"},
|
||||
/* (<= 6) Automatic start mode */ {"ASTART"},
|
||||
/* (<= 6) Cooldown blink */ {"CLBLNK"},
|
||||
/* (<= 8) Temperature calibration enter menu */ {"TMP CAL?"},
|
||||
/* (<= 8) Settings reset command */ {"RESET?"},
|
||||
/* (<= 8) Calibrate input voltage */ {"CAL VIN?"},
|
||||
/* (<= 6) Advanced soldering screen enabled */ {"ADVSLD"},
|
||||
/* (<= 6) Message Scroll Speed */ {"DESCSP"},
|
||||
/* (<= 11) Power source (DC or batt) */ {"Virtalähde", "DC"},
|
||||
/* (<= 9) Sleep temperature */ {"Lepotilan", "lämpötila"},
|
||||
/* (<= 9) Sleep timeout */ {"Lepotilan", "viive"},
|
||||
/* (<= 10) Shutdown timeout */ {"Sammutus", "viive"},
|
||||
/* (<= 13) Motion sensitivity level */ {"Liikkeen", "herkkyys"},
|
||||
/* (<= 13) Temperature in F and C */ {"Lämpötilan", "yksikkö"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Tiedot", "lepotilassa"},
|
||||
/* (<= 13) Display rotation mode */ {"Näytön", "kierto"},
|
||||
/* (<= 13) Boost enabled */ {"Tehostus", "käytössä"},
|
||||
/* (<= 9) Boost temperature */ {"Tehostus-", "lämpötila"},
|
||||
/* (<= 13) Automatic start mode */ {"Autom.", "käynnistys"},
|
||||
|
||||
/* (<= 13) Cooldown blink */ {"Jäähdytyksen", "vilkutus"},
|
||||
/* (<= 16) Temperature calibration enter menu */ {"Kalibroi", "lämpötila?"},
|
||||
/* (<= 16) Settings reset command */ {"Palauta", "tehdasasetukset?"},
|
||||
/* (<= 16) Calibrate input voltage */ {"Kalibroi", "tulojännite?"},
|
||||
/* (<= 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] = {
|
||||
/*Soldering Menu*/"Soldering\nSettings",
|
||||
/* Power Saving Menu*/"Sleep\nModes",
|
||||
/* UI Menu*/"User\nInterface",
|
||||
/* Advanced Menu*/"Advanced\nOptions", };
|
||||
const char* SettingsMenuEntriesDescriptions[4] ={
|
||||
"Soldering settings",
|
||||
"Power Saving Settings",
|
||||
"User Interface settings",
|
||||
"Advanced options"
|
||||
/* Soldering Menu */ "Juotos-\nasetukset" ,//"Juotos\nasetukset",
|
||||
/* Power Saving Menu */ "Lepotilan\nasetukset", // "Lepo\ntila",
|
||||
/* UI Menu */ "Käyttö-\nliittymä", //"Käyttö\nliittymä",
|
||||
/* Advanced Menu */ "Lisä-\nasetukset", // "Lisä\nasetukset",
|
||||
};
|
||||
|
||||
const char* SettingsMenuEntriesDescriptions[4] = {
|
||||
"Juotosasetukset",
|
||||
"Virransäästöasetukset",
|
||||
"Käyttöliittymän asetukset",
|
||||
"Lisäasetukset"
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -471,15 +498,15 @@ 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) */"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 timeout */"Imposta il timer per entrare in modalità standby <minuti/secondi>",
|
||||
/* Sleep temperature */"Imposta la temperatura da mantenere in modalità Standby <°C/°F>",
|
||||
/* Sleep timeout */"Imposta il timer per entrare in modalità Standby <minuti/secondi>",
|
||||
/* 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>",
|
||||
/* 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>",
|
||||
/* Boost enabled */"Il tasto superiore attiva la funzione \"turbo\" durante la modalità Saldatura",
|
||||
/* Boost temperature */"Imposta la temperatura della funzione \"turbo\"",
|
||||
/* Boost enabled */"Il tasto superiore attiva la funzione «Turbo» durante la modalità Saldatura",
|
||||
/* Boost temperature */"Imposta la temperatura della funzione «Turbo»",
|
||||
/* 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",
|
||||
/* Temperature calibration enter menu */"Calibra le rilevazioni di temperatura",
|
||||
@@ -495,7 +522,7 @@ const char* SettingsResetWarning = "Ripristinare le impostazioni iniziali?";
|
||||
const char* UVLOWarningString = "DC BASSA"; // <=8 chars
|
||||
const char* UndervoltageString = "DC INSUFFICIENTE"; // <=16 chars
|
||||
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* SleepingSimpleString = "ZZZ "; // Must be <= 4 chars
|
||||
const char* SleepingAdvancedString = "Standby"; // <=16 chars
|
||||
@@ -506,6 +533,7 @@ const char* IdleTipString = "Punta:"; // IdleTipString+IdleSetS
|
||||
const char* IdleSetString = "/"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "PUNTA ASSENTE"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Potenza:"; // <=12 chars
|
||||
const char* OffString ="OFF"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'D';
|
||||
const char SettingLeftChar = 'S';
|
||||
@@ -519,13 +547,13 @@ const enum ShortNameType SettingsShortNameType = SHORT_NAME_DOUBLE_LINE;
|
||||
/* (<= 11) Power source (DC or batt) */ {"Sorgente", "alimentaz"},
|
||||
/* (<= 9) Sleep temperature */ {"Temp", "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) Temperature in F and C */ {"Unità di", "temperatura"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Mostra", "dettagli"},
|
||||
/* (<= 13) Display rotation mode */ {"Orientamento", "display"},
|
||||
/* (<= 13) Boost enabled */ {"Funzione", "\"turbo\""},
|
||||
/* (<= 9) Boost temperature */ {"Temp", "\"turbo\""},
|
||||
/* (<= 13) Boost enabled */ {"Funzione", "«Turbo»"},
|
||||
/* (<= 9) Boost temperature */ {"Temp", "«Turbo»"},
|
||||
/* (<= 13) Automatic start mode */ {"Avvio", "automatico"},
|
||||
/* (<= 13) Cooldown blink */ {"Avviso", "punta calda"},
|
||||
/* (<= 16) Temperature calibration enter menu */ {"Calibrazione", "temperatura"},
|
||||
@@ -587,6 +615,7 @@ const char* IdleTipString = "PANNE:"; // IdleTipString+IdleS
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "PANNE DEBRANCH"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Puissance: "; // <= 12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'D';
|
||||
const char SettingLeftChar = 'G';
|
||||
@@ -600,7 +629,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Source", "d'alim"},
|
||||
/* (<= 9) Sleep temperature */ {"Temp.", "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) Temperature in F and C */ {"Unité de", "température"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Ecran veille", "détaillé"},
|
||||
@@ -668,6 +697,7 @@ const char* IdleTipString = "Ist:"; // IdleTipString+IdleSe
|
||||
const char* IdleSetString = " Soll:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "Spitze fehlt"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Leistung: "; // <= 12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -681,7 +711,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Spannungs-", "quelle"},
|
||||
/* (<= 9) Sleep temperature */ {"Ruhetemp-", "eratur"},
|
||||
/* (<= 9) Sleep timeout */ {"Ruhever-", "zögerung"},
|
||||
/* (<= 11) Shutdown timeout */ {"Abschalt-", "zeit"},
|
||||
/* (<= 10) Shutdown timeout */ {"Abschalt-", "zeit"},
|
||||
/* (<= 13) Motion sensitivity level */ {"Bewegungs-", "empfindlichk."},
|
||||
/* (<= 13) Temperature in F and C */ {"Temperatur-", "einheit"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Detaillierte", "Ruheansicht"},
|
||||
@@ -748,6 +778,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSe
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -828,6 +859,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -908,6 +940,7 @@ const char* IdleTipString = "Vrh: "; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " / "; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "VRH NIJE SPOJEN!"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Snaga: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'D';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -921,7 +954,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Izvor", "napajanja"},
|
||||
/* (<= 9) Sleep temperature */ {"Temp", "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) Temperature in F and C */ {"Jedinica", "temperature"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Detalji", "pri čekanju"},
|
||||
@@ -986,6 +1019,7 @@ const char* IdleTipString = "Hrot:"; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " Cíl:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "HROT NEPŘIPOJEN"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Ohřev: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'P';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -999,7 +1033,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Zdroj", "napájení"},
|
||||
/* (<= 9) Sleep temperature */ {"Teplota v", "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) Temperature in F and C */ {"Jednotky", "teploty"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Podrobnosti", "na vých. obr."},
|
||||
@@ -1070,6 +1104,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'R';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -1150,6 +1185,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'H';
|
||||
const char SettingLeftChar = 'V';
|
||||
@@ -1230,6 +1266,7 @@ const char* IdleTipString = "Tip:"; // IdleTipString+IdleSet
|
||||
const char* IdleSetString = " Set:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "TIP DISCONNECTED"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'P';
|
||||
const char SettingLeftChar = 'L';
|
||||
@@ -1310,6 +1347,7 @@ const char* IdleTipString = "Ponta:"; // IdleTipString+IdleSetSt
|
||||
const char* IdleSetString = " Aj:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "SEM PONTA"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Power: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'D';
|
||||
const char SettingLeftChar = 'C';
|
||||
@@ -1390,6 +1428,7 @@ const char* IdleTipString = "Ant:"; // IdleTipString+Idle
|
||||
const char* IdleSetString = " Nust:"; // preferably start with a space; IdleTipString+IdleSetString <= 10
|
||||
const char* TipDisconnectedString = "ANTGAL ATJUNGTAS"; // <=16 chars
|
||||
const char* SolderingAdvancedPowerPrompt = "Maitinimas: "; // <=12 chars
|
||||
const char* OffString ="Off"; // 3 chars max
|
||||
|
||||
const char SettingRightChar = 'D';
|
||||
const char SettingLeftChar = 'K';
|
||||
@@ -1403,7 +1442,7 @@ const char* SettingsShortNames[17][2] = {
|
||||
/* (<= 11) Power source (DC or batt) */ {"Maitinimo", "šaltinis"},
|
||||
/* (<= 9) Sleep temperature */ {"Miego", "temperat."},
|
||||
/* (<= 9) Sleep timeout */ {"Miego", "laikas"},
|
||||
/* (<= 11) Shutdown timeout */ {"Išjungimo", "laikas"},
|
||||
/* (<= 10) Shutdown timeout */ {"Išjungimo", "laikas"},
|
||||
/* (<= 13) Motion sensitivity level */ {"Jautrumas", "judesiui"},
|
||||
/* (<= 13) Temperature in F and C */ {"Temperatūros", "vienetai"},
|
||||
/* (<= 13) Advanced idle display mode enabled */ {"Detalus lauki-", "mo ekranas"},
|
||||
@@ -1431,3 +1470,87 @@ const char* SettingsMenuEntriesDescriptions[4] ={
|
||||
"Išplėstiniai nustatymai"
|
||||
};
|
||||
#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
|
||||
|
||||
@@ -31,7 +31,15 @@ static void settings_setAdvancedIDLEScreens(void);
|
||||
static void settings_displayAdvancedIDLEScreens(void);
|
||||
static void settings_setScrollSpeed(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_displayDisplayRotation(void);
|
||||
static void settings_setBoostModeEnabled(void);
|
||||
@@ -181,6 +189,15 @@ const menuitem advancedMenu[] = {
|
||||
settings_displayCalibrate } }, /*Calibrate tip*/
|
||||
{ (const char*) SettingsDescriptions[14], { settings_setCalibrateVIN }, {
|
||||
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
|
||||
};
|
||||
|
||||
@@ -228,15 +245,11 @@ static int userConfirmation(const char* message) {
|
||||
int16_t lastOffset = -1;
|
||||
bool lcdRefresh = true;
|
||||
|
||||
|
||||
for (;;) {
|
||||
|
||||
int16_t messageOffset =
|
||||
((xTaskGetTickCount() - messageStart)
|
||||
/ (systemSettings.descriptionScrollSpeed == 1 ?
|
||||
1 : 2));
|
||||
messageOffset %= messageWidth; //Roll around at the end
|
||||
|
||||
int16_t messageOffset = ((xTaskGetTickCount() - messageStart)
|
||||
/ (systemSettings.descriptionScrollSpeed == 1 ? 1 : 2));
|
||||
messageOffset %= messageWidth; //Roll around at the end
|
||||
|
||||
if (lastOffset != messageOffset) {
|
||||
lcd.clearScreen();
|
||||
@@ -289,9 +302,16 @@ static void settings_displayInputVRange(void) {
|
||||
}
|
||||
|
||||
static void settings_setSleepTemp(void) {
|
||||
systemSettings.SleepTemp += 10;
|
||||
if (systemSettings.SleepTemp > 300)
|
||||
systemSettings.SleepTemp = 50;
|
||||
//If in C, 10 deg, if in F 20 deg
|
||||
if (systemSettings.temperatureInF) {
|
||||
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) {
|
||||
@@ -302,15 +322,18 @@ static void settings_displaySleepTemp(void) {
|
||||
static void settings_setSleepTime(void) {
|
||||
systemSettings.SleepTime++; // Go up 1 minute at a time
|
||||
if (systemSettings.SleepTime >= 16) {
|
||||
systemSettings.SleepTime = 1; // can't set time over 10 mins
|
||||
systemSettings.SleepTime = 0; // can't set time over 10 mins
|
||||
}
|
||||
// Remember that ^ is the time of no movement
|
||||
if (PCBVersion == 3)
|
||||
systemSettings.SleepTime = 0; //Disable sleep on no accel
|
||||
}
|
||||
|
||||
static void settings_displaySleepTime(void) {
|
||||
printShortDescription(2, 5);
|
||||
|
||||
if (systemSettings.SleepTime < 6) {
|
||||
if (systemSettings.SleepTime == 0) {
|
||||
lcd.print(OffString);
|
||||
} else if (systemSettings.SleepTime < 6) {
|
||||
lcd.printNumber(systemSettings.SleepTime * 10, 2);
|
||||
lcd.drawChar('S');
|
||||
} else {
|
||||
@@ -324,15 +347,46 @@ static void settings_setShutdownTime(void) {
|
||||
if (systemSettings.ShutdownTime > 60) {
|
||||
systemSettings.ShutdownTime = 0; // wrap to off
|
||||
}
|
||||
if (PCBVersion == 3)
|
||||
systemSettings.ShutdownTime = 0; //Disable shutdown on no accel
|
||||
}
|
||||
|
||||
static void settings_displayShutdownTime(void) {
|
||||
printShortDescription(3, 6);
|
||||
lcd.printNumber(systemSettings.ShutdownTime, 2);
|
||||
printShortDescription(3, 5);
|
||||
if (systemSettings.ShutdownTime == 0) {
|
||||
lcd.print(OffString);
|
||||
} else {
|
||||
lcd.printNumber(systemSettings.ShutdownTime, 2);
|
||||
lcd.drawChar('M');
|
||||
}
|
||||
}
|
||||
|
||||
static void settings_setTempF(void) {
|
||||
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) {
|
||||
@@ -388,18 +442,18 @@ static void settings_setDisplayRotation(void) {
|
||||
systemSettings.OrientationMode++;
|
||||
systemSettings.OrientationMode = systemSettings.OrientationMode % 3;
|
||||
switch (systemSettings.OrientationMode) {
|
||||
case 0:
|
||||
lcd.setRotation(false);
|
||||
break;
|
||||
case 1:
|
||||
lcd.setRotation(true);
|
||||
break;
|
||||
case 2:
|
||||
//do nothing on auto
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
lcd.setRotation(false);
|
||||
break;
|
||||
case 1:
|
||||
lcd.setRotation(true);
|
||||
break;
|
||||
case 2:
|
||||
//do nothing on auto
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void settings_displayDisplayRotation(void) {
|
||||
@@ -432,12 +486,14 @@ static void settings_displayBoostModeEnabled(void) {
|
||||
}
|
||||
|
||||
static void settings_setBoostTemp(void) {
|
||||
systemSettings.BoostTemp += 10; // Go up 10 at a time
|
||||
|
||||
if (systemSettings.temperatureInF) {
|
||||
systemSettings.BoostTemp += 20; // Go up 20F at a time
|
||||
if (systemSettings.BoostTemp > 850) {
|
||||
systemSettings.BoostTemp = 480; // loop back at 250
|
||||
}
|
||||
} else {
|
||||
systemSettings.BoostTemp += 10; // Go up 10C at a time
|
||||
if (systemSettings.BoostTemp > 450) {
|
||||
systemSettings.BoostTemp = 250; // loop back at 250
|
||||
}
|
||||
@@ -449,6 +505,33 @@ static void settings_displayBoostTemp(void) {
|
||||
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) {
|
||||
systemSettings.autoStartMode++;
|
||||
systemSettings.autoStartMode %= 2;
|
||||
@@ -456,7 +539,6 @@ static void settings_setAutomaticStartMode(void) {
|
||||
|
||||
static void settings_displayAutomaticStartMode(void) {
|
||||
printShortDescription(10, 7);
|
||||
|
||||
lcd.drawCheckbox(systemSettings.autoStartMode);
|
||||
}
|
||||
|
||||
@@ -719,7 +801,8 @@ void gui_Menu(const menuitem* menu) {
|
||||
|
||||
if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration)
|
||||
< PRESS_ACCEL_INTERVAL_MIN) {
|
||||
autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX - PRESS_ACCEL_INTERVAL_MIN;
|
||||
autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX
|
||||
- PRESS_ACCEL_INTERVAL_MIN;
|
||||
}
|
||||
|
||||
if (lcdRefresh) {
|
||||
|
||||
@@ -60,35 +60,17 @@ uint16_t getTipInstantTemperature() {
|
||||
|
||||
}
|
||||
uint16_t getTipRawTemp(uint8_t instant) {
|
||||
#define filterDepth1 1
|
||||
/*Pre filter used before PID*/
|
||||
#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;
|
||||
static int64_t filterFP = 0;
|
||||
const uint8_t filterBeta = 5; //higher values smooth out more, but reduce responsiveness
|
||||
|
||||
if (instant) {
|
||||
uint16_t itemp = getTipInstantTemperature();
|
||||
filterLayer1[index] = itemp;
|
||||
index = (index + 1) % filterDepth1;
|
||||
uint32_t total = 0;
|
||||
for (uint8_t i = 0; i < filterDepth1; i++)
|
||||
total += filterLayer1[i];
|
||||
|
||||
return total / filterDepth1;
|
||||
filterFP = (filterFP << filterBeta) - filterFP;
|
||||
filterFP += (itemp << 9);
|
||||
filterFP = filterFP >> filterBeta;
|
||||
return itemp;
|
||||
} else {
|
||||
uint32_t total = 0;
|
||||
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;
|
||||
return filterFP >> 9;
|
||||
}
|
||||
}
|
||||
uint16_t getInputVoltageX10(uint8_t divisor) {
|
||||
@@ -120,15 +102,10 @@ uint8_t getTipPWM() {
|
||||
return htim2.Instance->CCR4;
|
||||
}
|
||||
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)
|
||||
pulse = 100;
|
||||
if (pulse) {
|
||||
htim2.Instance->CCR4 = pulse;
|
||||
} else {
|
||||
htim2.Instance->CCR4 = 0;
|
||||
}
|
||||
|
||||
htim2.Instance->CCR4 = pulse;
|
||||
}
|
||||
|
||||
//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) {
|
||||
//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.
|
||||
//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) {
|
||||
htim3.Instance->CCR1 = 50;
|
||||
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
|
||||
@@ -159,12 +136,9 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
|
||||
htim3.Instance->CCR1 = 0;
|
||||
|
||||
} /*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_14, GPIO_PIN_RESET);
|
||||
}*/
|
||||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) {
|
||||
|
||||
}
|
||||
|
||||
@@ -10,12 +10,14 @@
|
||||
#include "string.h"
|
||||
#include "LIS2DH12.hpp"
|
||||
#include <gui.hpp>
|
||||
#include "FRToSI2C.hpp"
|
||||
|
||||
#define ACCELDEBUG 0
|
||||
// C++ objects
|
||||
OLED lcd(&hi2c1);
|
||||
MMA8652FC accel(&hi2c1);
|
||||
LIS2DH12 accel2(&hi2c1);
|
||||
FRToSI2C i2cDev(&hi2c1);
|
||||
OLED lcd(&i2cDev);
|
||||
MMA8652FC accel(&i2cDev);
|
||||
LIS2DH12 accel2(&i2cDev);
|
||||
uint8_t PCBVersion = 0;
|
||||
// File local variables
|
||||
uint16_t currentlyActiveTemperatureTarget = 0;
|
||||
@@ -25,15 +27,13 @@ uint32_t lastButtonTime = 0;
|
||||
// FreeRTOS variables
|
||||
osThreadId GUITaskHandle;
|
||||
osThreadId PIDTaskHandle;
|
||||
osThreadId ROTTaskHandle;
|
||||
osThreadId MOVTaskHandle;
|
||||
SemaphoreHandle_t rotationChangedSemaphore = NULL;
|
||||
SemaphoreHandle_t accelDataAvailableSemaphore = NULL;
|
||||
|
||||
static TaskHandle_t pidTaskNotification = NULL;
|
||||
|
||||
void startGUITask(void const *argument);
|
||||
void startPIDTask(void const *argument);
|
||||
void startMOVTask(void const *argument);
|
||||
void startRotationTask(void const *argument);
|
||||
// End FreeRTOS
|
||||
|
||||
// Main sets up the hardware then hands over to the FreeRTOS kernel
|
||||
@@ -42,11 +42,13 @@ int main(void) {
|
||||
*/
|
||||
HAL_Init();
|
||||
Setup_HAL(); // Setup all the HAL objects
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
setTipPWM(0);
|
||||
lcd.initialize(); // start up the LCD
|
||||
lcd.setFont(0); // default to bigger font
|
||||
//Testing for new weird board version
|
||||
uint8_t buffer[1];
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1,
|
||||
1000) == HAL_OK) {
|
||||
PCBVersion = 1;
|
||||
@@ -59,6 +61,9 @@ int main(void) {
|
||||
accel2.initalize(); //startup the accelerometer
|
||||
} else {
|
||||
PCBVersion = 3;
|
||||
systemSettings.SleepTime = 0;
|
||||
systemSettings.ShutdownTime = 0; //No accel -> disable sleep
|
||||
systemSettings.sensitivity = 0;
|
||||
}
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
restoreSettings(); // load the settings from flash
|
||||
@@ -67,25 +72,18 @@ int main(void) {
|
||||
|
||||
/* Create the thread(s) */
|
||||
/* definition and creation of GUITask */
|
||||
osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 512);
|
||||
osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 768); //3k
|
||||
GUITaskHandle = osThreadCreate(osThread(GUITask), NULL);
|
||||
|
||||
/* definition and creation of PIDTask */
|
||||
osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 256);
|
||||
osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 512); //2k
|
||||
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 */
|
||||
osKernelStart();
|
||||
|
||||
@@ -93,10 +91,15 @@ int main(void) {
|
||||
while (1) {
|
||||
}
|
||||
}
|
||||
void GUIDelay() {
|
||||
osDelay(50); // 20Hz
|
||||
void printVoltage() {
|
||||
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
|
||||
uint16_t Temp = getTipRawTemp(0);
|
||||
|
||||
@@ -109,6 +112,12 @@ void gui_drawTipTemp() {
|
||||
// Temp = systemSettings.SolderingTemp;
|
||||
|
||||
lcd.printNumber(Temp, 3); // Draw the tip temp out finally
|
||||
if (symbol) {
|
||||
if (systemSettings.temperatureInF)
|
||||
lcd.print("F");
|
||||
else
|
||||
lcd.print("C");
|
||||
}
|
||||
}
|
||||
ButtonState getButtonState() {
|
||||
/*
|
||||
@@ -218,11 +227,7 @@ static bool checkVoltageForExit() {
|
||||
lcd.print(UndervoltageString);
|
||||
lcd.setCursor(0, 8);
|
||||
lcd.print(InputVoltageString);
|
||||
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10,
|
||||
2);
|
||||
lcd.drawChar('.');
|
||||
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
|
||||
1);
|
||||
printVoltage();
|
||||
lcd.print("V");
|
||||
|
||||
} else {
|
||||
@@ -253,7 +258,7 @@ static void gui_drawBatteryIcon() {
|
||||
cellV = 9;
|
||||
lcd.drawBattery(cellV + 1);
|
||||
} else
|
||||
lcd.drawSymbol(16); // Draw the DC Logo
|
||||
lcd.drawSymbol(15); // Draw the DC Logo
|
||||
}
|
||||
static void gui_solderingTempAdjust() {
|
||||
uint32_t lastChange = xTaskGetTickCount();
|
||||
@@ -329,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) {
|
||||
if (a > b)
|
||||
return b;
|
||||
@@ -398,14 +353,15 @@ static int gui_SolderingSleepingMode() {
|
||||
if (checkVoltageForExit())
|
||||
return 1; // return non-zero on error
|
||||
|
||||
if (systemSettings.temperatureInF)
|
||||
if (systemSettings.temperatureInF) {
|
||||
currentlyActiveTemperatureTarget = ftoTipMeasurement(
|
||||
min(systemSettings.SleepTemp,
|
||||
systemSettings.SolderingTemp));
|
||||
else
|
||||
} else {
|
||||
currentlyActiveTemperatureTarget = ctoTipMeasurement(
|
||||
min(systemSettings.SleepTemp,
|
||||
systemSettings.SolderingTemp));
|
||||
}
|
||||
// draw the lcd
|
||||
uint16_t tipTemp;
|
||||
if (systemSettings.temperatureInF)
|
||||
@@ -427,11 +383,7 @@ static int gui_SolderingSleepingMode() {
|
||||
lcd.print("C");
|
||||
|
||||
lcd.print(" ");
|
||||
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10,
|
||||
2);
|
||||
lcd.drawChar('.');
|
||||
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
|
||||
1);
|
||||
printVoltage();
|
||||
lcd.drawChar('V');
|
||||
} else {
|
||||
lcd.setFont(0);
|
||||
@@ -527,24 +479,9 @@ static void gui_solderingMode() {
|
||||
|
||||
lcd.setCursor(0, 8);
|
||||
lcd.print(SleepingTipAdvancedString);
|
||||
uint16_t Temp = getTipRawTemp(0);
|
||||
|
||||
if (systemSettings.temperatureInF)
|
||||
Temp = tipMeasurementToF(Temp);
|
||||
else
|
||||
Temp = tipMeasurementToC(Temp);
|
||||
lcd.printNumber(Temp, 3);
|
||||
if (systemSettings.temperatureInF)
|
||||
lcd.print("F");
|
||||
else
|
||||
lcd.print("C");
|
||||
|
||||
gui_drawTipTemp(true);
|
||||
lcd.print(" ");
|
||||
lcd.printNumber(
|
||||
getInputVoltageX10(systemSettings.voltageDiv) / 10, 2);
|
||||
lcd.drawChar('.');
|
||||
lcd.printNumber(
|
||||
getInputVoltageX10(systemSettings.voltageDiv) % 10, 1);
|
||||
printVoltage();
|
||||
lcd.drawChar('V');
|
||||
} else {
|
||||
// We switch the layout direction depending on the orientation of the lcd.
|
||||
@@ -553,13 +490,7 @@ static void gui_solderingMode() {
|
||||
gui_drawBatteryIcon();
|
||||
|
||||
lcd.drawChar(' '); // Space out gap between battery <-> 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
|
||||
}
|
||||
gui_drawTipTemp(true); // Draw current tip temp
|
||||
|
||||
// We draw boost arrow if boosting, or else gap temp <-> heat indicator
|
||||
if (boostModeOn)
|
||||
@@ -568,31 +499,16 @@ static void gui_solderingMode() {
|
||||
lcd.drawChar(' ');
|
||||
|
||||
// Draw heating/cooling symbols
|
||||
// If tip PWM > 10% then we are 'heating'
|
||||
if (getTipPWM() > 10)
|
||||
lcd.drawSymbol(14);
|
||||
else
|
||||
lcd.drawSymbol(15);
|
||||
lcd.drawHeatSymbol(getTipPWM());
|
||||
} else {
|
||||
// Draw heating/cooling symbols
|
||||
// If tip PWM > 10% then we are 'heating'
|
||||
if (getTipPWM() > 10)
|
||||
lcd.drawSymbol(14);
|
||||
else
|
||||
lcd.drawSymbol(15);
|
||||
lcd.drawHeatSymbol(getTipPWM());
|
||||
// We draw boost arrow if boosting, or else gap temp <-> heat indicator
|
||||
if (boostModeOn)
|
||||
lcd.drawSymbol(2);
|
||||
else
|
||||
lcd.drawChar(' ');
|
||||
|
||||
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
|
||||
}
|
||||
gui_drawTipTemp(true); // Draw current tip temp
|
||||
|
||||
lcd.drawChar(' '); // Space out gap between battery <-> temp
|
||||
|
||||
@@ -620,14 +536,16 @@ static void gui_solderingMode() {
|
||||
|
||||
// Undervoltage test
|
||||
if (checkVoltageForExit()) {
|
||||
lastButtonTime = xTaskGetTickCount();
|
||||
return;
|
||||
}
|
||||
|
||||
lcd.refresh();
|
||||
if (systemSettings.sensitivity)
|
||||
if (systemSettings.sensitivity && systemSettings.SleepTime)
|
||||
if (xTaskGetTickCount() - lastMovementTime > sleepThres
|
||||
&& xTaskGetTickCount() - lastButtonTime > sleepThres) {
|
||||
if (gui_SolderingSleepingMode()) {
|
||||
lastButtonTime = xTaskGetTickCount();
|
||||
return; // If the function returns non-0 then exit
|
||||
}
|
||||
}
|
||||
@@ -635,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 */
|
||||
void startGUITask(void const *argument) {
|
||||
/*
|
||||
* 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;
|
||||
i2cDev.FRToSInit();
|
||||
uint8_t tempWarningState = 0;
|
||||
bool buttonLockout = false;
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
|
||||
switch (systemSettings.OrientationMode) {
|
||||
case 0:
|
||||
lcd.setRotation(false);
|
||||
@@ -685,8 +635,6 @@ void startGUITask(void const *argument) {
|
||||
ticks = xTaskGetTickCount(); //make timeout now so we will exit
|
||||
GUIDelay();
|
||||
}
|
||||
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
if (systemSettings.autoStartMode) {
|
||||
// jump directly to the autostart mode
|
||||
if (systemSettings.autoStartMode == 1)
|
||||
@@ -704,12 +652,14 @@ void startGUITask(void const *argument) {
|
||||
|
||||
for (;;) {
|
||||
ButtonState buttons = getButtonState();
|
||||
|
||||
if (tempWarningState == 2)
|
||||
buttons = BUTTON_F_SHORT;
|
||||
if (buttons != BUTTON_NONE && buttonLockout)
|
||||
buttons = BUTTON_NONE;
|
||||
else
|
||||
buttonLockout = false;
|
||||
|
||||
switch (buttons) {
|
||||
case BUTTON_NONE:
|
||||
// Do nothing
|
||||
@@ -721,18 +671,7 @@ void startGUITask(void const *argument) {
|
||||
|
||||
case BUTTON_B_LONG:
|
||||
// Show the version information
|
||||
{
|
||||
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
|
||||
}
|
||||
showVersion();
|
||||
break;
|
||||
case BUTTON_F_LONG:
|
||||
gui_solderingTempAdjust();
|
||||
@@ -742,7 +681,7 @@ void startGUITask(void const *argument) {
|
||||
lcd.setFont(0);
|
||||
lcd.displayOnOff(true); // turn lcd on
|
||||
gui_solderingMode(); // enter soldering mode
|
||||
tempWarningState = 0; // make sure warning can show
|
||||
buttonLockout = true;
|
||||
break;
|
||||
case BUTTON_B_SHORT:
|
||||
lcd.setFont(0);
|
||||
@@ -755,33 +694,28 @@ void startGUITask(void const *argument) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
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 (systemSettings.sensitivity) {
|
||||
|
||||
if ((xTaskGetTickCount() - lastMovementTime) > 6000
|
||||
&& (xTaskGetTickCount() - lastButtonTime) > 6000)
|
||||
&& (xTaskGetTickCount() - lastButtonTime) > 6000) {
|
||||
lcd.displayOnOff(false); // turn lcd off when no movement
|
||||
else
|
||||
} else
|
||||
lcd.displayOnOff(true); // turn lcd on
|
||||
} else
|
||||
lcd.displayOnOff(true); // turn lcd on
|
||||
lcd.displayOnOff(true); // turn lcd on - disabled motion sleep
|
||||
} else
|
||||
lcd.displayOnOff(true); // turn lcd on
|
||||
lcd.displayOnOff(true); // turn lcd on when temp > 50C
|
||||
|
||||
if (tipTemp > 600)
|
||||
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
|
||||
lcd.clearScreen();
|
||||
lcd.setCursor(0, 0);
|
||||
@@ -800,11 +734,7 @@ void startGUITask(void const *argument) {
|
||||
}
|
||||
lcd.setCursor(0, 8);
|
||||
lcd.print(InputVoltageString);
|
||||
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10,
|
||||
2);
|
||||
lcd.drawChar('.');
|
||||
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
|
||||
1);
|
||||
printVoltage();
|
||||
lcd.print("V");
|
||||
|
||||
} else {
|
||||
@@ -814,14 +744,29 @@ void startGUITask(void const *argument) {
|
||||
lcd.setCursor(0, 0);
|
||||
gui_drawBatteryIcon();
|
||||
} 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);
|
||||
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();
|
||||
animationStep++;
|
||||
GUIDelay();
|
||||
}
|
||||
}
|
||||
@@ -838,67 +783,90 @@ void startPIDTask(void const *argument) {
|
||||
* struct
|
||||
*
|
||||
*/
|
||||
setTipPWM(0); // disable the output driver if the output is set to be off
|
||||
osDelay(500);
|
||||
int32_t integralCount = 0;
|
||||
int32_t derivativeLastValue = 0;
|
||||
int32_t kp, ki, kd;
|
||||
kp = 30;
|
||||
ki = 60;
|
||||
kd = 20;
|
||||
// REMEBER ^^^^ These constants are backwards
|
||||
// They act as dividers, so to 'increase' a P term, you make the number
|
||||
// smaller.
|
||||
const int32_t itermMax = 60;
|
||||
|
||||
// REMEBER ^^^^ These constants are backwards
|
||||
// They act as dividers, so to 'increase' a P term, you make the number
|
||||
// smaller.
|
||||
|
||||
const int32_t itermMax = 100;
|
||||
pidTaskNotification = xTaskGetCurrentTaskHandle();
|
||||
for (;;) {
|
||||
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
|
||||
if (currentlyActiveTemperatureTarget) {
|
||||
// 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)
|
||||
if (ulTaskNotifyTake( pdTRUE, 50)) {
|
||||
//Wait a max of 50ms
|
||||
//This is a call to block this thread until the ADC does its samples
|
||||
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
|
||||
if (currentlyActiveTemperatureTarget) {
|
||||
// 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;
|
||||
int32_t ierror = (rawTempError / ki);
|
||||
integralCount += ierror;
|
||||
if (integralCount > (itermMax / 2))
|
||||
integralCount = itermMax / 2; // prevent too much lead
|
||||
else if (integralCount < -itermMax)
|
||||
integralCount = itermMax;
|
||||
// Cap the max set point to 450C
|
||||
if (currentlyActiveTemperatureTarget > ctoTipMeasurement(450)) {
|
||||
currentlyActiveTemperatureTarget = ctoTipMeasurement(450);
|
||||
}
|
||||
|
||||
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 output = (rawTempError / kp);
|
||||
if (ki)
|
||||
output += integralCount;
|
||||
if (kd)
|
||||
output -= (dInput / kd);
|
||||
int32_t dInput = (rawTemp - derivativeLastValue);
|
||||
|
||||
if (output > 100) {
|
||||
output = 100; // saturate
|
||||
} else if (output < 0) {
|
||||
output = 0;
|
||||
/*Compute PID Output*/
|
||||
int32_t output = (rawTempError / ((int32_t)systemSettings.PID_P));
|
||||
if (((int32_t)systemSettings.PID_I))
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
osDelay(10); // 100 Hz temp loop
|
||||
}
|
||||
}
|
||||
#define MOVFilter 8
|
||||
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 datay[MOVFilter];
|
||||
int16_t dataz[MOVFilter];
|
||||
@@ -913,24 +881,29 @@ void startMOVTask(void const *argument) {
|
||||
#if ACCELDEBUG
|
||||
uint32_t max = 0;
|
||||
#endif
|
||||
|
||||
if (PCBVersion == 3) {
|
||||
for (;;)
|
||||
osDelay(5000);
|
||||
}
|
||||
uint8_t rotation = 0;
|
||||
for (;;) {
|
||||
int32_t threshold = 1200 + (9 * 200);
|
||||
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);
|
||||
int32_t threshold = 1500 + (9 * 200);
|
||||
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
|
||||
|
||||
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;
|
||||
datay[currentPointer] = (int32_t) ty;
|
||||
dataz[currentPointer] = (int32_t) tz;
|
||||
currentPointer = (currentPointer + 1) % MOVFilter;
|
||||
#if ACCELDEBUG
|
||||
|
||||
// Debug for Accel
|
||||
|
||||
avgx = avgy = avgz = 0;
|
||||
@@ -958,82 +931,38 @@ void startMOVTask(void const *argument) {
|
||||
if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET)
|
||||
max = 0;
|
||||
#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
|
||||
// than the threshold
|
||||
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
||||
// If error has occured then we update the tick timer
|
||||
if (error > threshold) {
|
||||
lastMovementTime = xTaskGetTickCount();
|
||||
}
|
||||
// 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
|
||||
// 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
|
||||
}
|
||||
}
|
||||
/* 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 \
|
||||
(0x8000000 | 0xF800) /*second last page of flash set aside for logo image*/
|
||||
|
||||
bool showBootLogoIfavailable() {
|
||||
// check if the header is there (0xAA,0x55,0xF0,0x0D)
|
||||
// If so display logo
|
||||
// check if the header is there (0xAA,0x55,0xF0,0x0D)
|
||||
// If so display logo
|
||||
//TODO REDUCE STACK ON THIS ONE, USE DRAWING IN THE READ LOOP
|
||||
uint16_t temp[98];
|
||||
|
||||
for (uint8_t i = 0; i < (98); i++) {
|
||||
@@ -1058,3 +987,43 @@ bool showBootLogoIfavailable() {
|
||||
lcd.refresh();
|
||||
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();
|
||||
|
||||
}
|
||||
|
||||
@@ -28,10 +28,10 @@ void HAL_MspInit(void) {
|
||||
|
||||
/**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*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
|
||||
@@ -68,7 +68,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
|
||||
__HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
@@ -77,22 +77,51 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
|
||||
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct;
|
||||
if (hi2c->Instance == I2C1) {
|
||||
/**I2C1 GPIO Configuration
|
||||
PB6 ------> I2C1_SCL
|
||||
PB7 ------> I2C1_SDA
|
||||
*/
|
||||
GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
/**I2C1 GPIO Configuration
|
||||
PB6 ------> I2C1_SCL
|
||||
PB7 ------> I2C1_SDA
|
||||
*/
|
||||
GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* Peripheral clock enable */
|
||||
__HAL_RCC_I2C1_CLK_ENABLE()
|
||||
;
|
||||
/* Peripheral clock 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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -12,35 +12,27 @@ extern TIM_HandleTypeDef htim1; //used for the systick
|
||||
/******************************************************************************/
|
||||
|
||||
void NMI_Handler(void) {
|
||||
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
//We have the assembly for a breakpoint trigger here to halt the system when a debugger is connected
|
||||
// Hardfault handler, often a screwup in the code
|
||||
void HardFault_Handler(void) {
|
||||
while (1) {
|
||||
asm("bkpt");
|
||||
}
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
// Memory management unit had an error
|
||||
void MemManage_Handler(void) {
|
||||
while (1) {
|
||||
asm("bkpt");
|
||||
}
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
// Prefetcher or busfault occured
|
||||
void BusFault_Handler(void) {
|
||||
while (1) {
|
||||
asm("bkpt");
|
||||
}
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void UsageFault_Handler(void) {
|
||||
while (1) {
|
||||
asm("bkpt");
|
||||
}
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void DebugMon_Handler(void) {
|
||||
@@ -62,7 +54,6 @@ void SysTick_Handler(void) {
|
||||
void DMA1_Channel1_IRQHandler(void) {
|
||||
HAL_DMA_IRQHandler(&hdma_adc1);
|
||||
}
|
||||
|
||||
//ADC interrupt used for DMA
|
||||
void ADC1_2_IRQHandler(void) {
|
||||
HAL_ADC_IRQHandler(&hadc1);
|
||||
@@ -71,7 +62,6 @@ void ADC1_2_IRQHandler(void) {
|
||||
//Timer 1 has overflowed, used for HAL ticks
|
||||
void TIM1_UP_IRQHandler(void) {
|
||||
HAL_TIM_IRQHandler(&htim1);
|
||||
|
||||
}
|
||||
//Timer 3 is used for the PWM output to the tip
|
||||
void TIM3_IRQHandler(void) {
|
||||
@@ -82,13 +72,18 @@ void TIM3_IRQHandler(void) {
|
||||
void TIM2_IRQHandler(void) {
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user