From 6c8980f7e6dcc5d6ce2c54b1afb896517579e1f6 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 15 Apr 2023 20:26:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=A9=E5=BA=A6=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 5 +- app/MDK-ARM/app.uvguix.h_zha | 248 +++----------------------- app/MDK-ARM/app.uvoptx | 72 ++++++-- app/MDK-ARM/app.uvprojx | 25 ++- dep/libiflytop_micro | 2 +- src/board/device_io_service.cpp | 175 ++++++++++++++++++ src/board/device_io_service.hpp | 69 +++++++ src/board/fan_state_monitor.cpp | 70 ++++++++ src/board/fan_state_monitor.hpp | 46 +++++ src/board/hardware.cpp | 148 +++++++++++++++ src/board/hardware.hpp | 36 ++++ src/board/libtmcimpl.cpp | 35 ++++ src/board/libtmcimpl.hpp | 41 +++++ src/device_io_service.cpp | 176 ------------------ src/device_io_service.hpp | 70 -------- src/fan_state_monitor.cpp | 70 -------- src/fan_state_monitor.hpp | 46 ----- src/libtmcimpl.cpp | 28 --- src/libtmcimpl.hpp | 34 ---- src/lncubator_temperature_control_service.cpp | 129 ++++++++++++++ src/lncubator_temperature_control_service.hpp | 55 ++++++ src/project_board.hpp | 2 + src/umain.cpp | 182 ++----------------- 23 files changed, 926 insertions(+), 838 deletions(-) create mode 100644 src/board/device_io_service.cpp create mode 100644 src/board/device_io_service.hpp create mode 100644 src/board/fan_state_monitor.cpp create mode 100644 src/board/fan_state_monitor.hpp create mode 100644 src/board/hardware.cpp create mode 100644 src/board/hardware.hpp create mode 100644 src/board/libtmcimpl.cpp create mode 100644 src/board/libtmcimpl.hpp delete mode 100644 src/device_io_service.cpp delete mode 100644 src/device_io_service.hpp delete mode 100644 src/fan_state_monitor.cpp delete mode 100644 src/fan_state_monitor.hpp delete mode 100644 src/libtmcimpl.cpp delete mode 100644 src/libtmcimpl.hpp create mode 100644 src/lncubator_temperature_control_service.cpp create mode 100644 src/lncubator_temperature_control_service.hpp diff --git a/.vscode/settings.json b/.vscode/settings.json index 181a970..9e0ec99 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -61,6 +61,9 @@ "cinttypes": "cpp", "typeinfo": "cpp", "can.h": "c", - "deque": "cpp" + "deque": "cpp", + "param.h": "c", + "stdbool.h": "c", + "check.h": "c" } } \ No newline at end of file diff --git a/app/MDK-ARM/app.uvguix.h_zha b/app/MDK-ARM/app.uvguix.h_zha index c916671..ca739b8 100644 --- a/app/MDK-ARM/app.uvguix.h_zha +++ b/app/MDK-ARM/app.uvguix.h_zha @@ -6,7 +6,7 @@
### uVision Project, (C) Keil Software
- D:\workspace\project_boditech_vidas_a8000\Incubator_control_system\src + D:\workspace\project_boditech_vidas_a8000\Incubator_control_system\src\board @@ -93,8 +93,8 @@ 2 3 - -1 - -1 + -32000 + -32000 -1 @@ -110,8 +110,8 @@ 0 - 3699 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000019000000180000000100000056443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF64443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C4D444B2D41524D5C737461727475705F73746D33326634303778782E730000000015737461727475705F73746D33326634303778782E7300000000FFDC7800FFFFFFFF7D443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C49464C59544F502D544D432D4150495C746D635C69635C544D4334333631415C544D4334333631412E63000000000A544D4334333631412E6300000000BECEA100FFFFFFFF74443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C49464C59544F502D544D432D4150495C746D635C68656C706572735C4352432E6300000000054352432E6300000000F0A0A100FFFFFFFF79443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C49464C59544F502D544D432D4150495C746D635C72616D705C4C696E65617252616D70312E63000000000D4C696E65617252616D70312E6300000000BCA8E100FFFFFFFF78443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C49464C59544F502D544D432D4150495C746D635C72616D705C4C696E65617252616D702E63000000000C4C696E65617252616D702E63000000009CC1B600FFFFFFFF66443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C7372635C69635C746D6334333631412E637070000000000C746D6334333631412E63707000000000F7B88600FFFFFFFF50443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C756D61696E2E6370700000000009756D61696E2E63707000000000D9ADC200FFFFFFFF77443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C447269766572735C53544D3332463478785F48414C5F4472697665725C5372635C73746D3332663478785F68616C2E63000000000F73746D3332663478785F68616C2E6300000000A5C2D700FFFFFFFF7C443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C447269766572735C53544D3332463478785F48414C5F4472697665725C5372635C73746D3332663478785F68616C5F756172742E63000000001473746D3332663478785F68616C5F756172742E6300000000B3A6BE00FFFFFFFF66443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C7372635C69635C746D6334333631412E687070000000000C746D6334333631412E68707000000000EAD6A300FFFFFFFF5E443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C436F72655C5372635C73746D3332663478785F69742E63000000000E73746D3332663478785F69742E6300000000F6FA7D00FFFFFFFF65443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C7372635C69635C746D63323136302E637070000000000B746D63323136302E63707000000000B5E99D00FFFFFFFF7B443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C49464C59544F502D544D432D4150495C746D635C69635C544D43323136305C544D43323136302E630000000009544D43323136302E63000000005FC3CF00FFFFFFFF7B443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C447269766572735C53544D3332463478785F48414C5F4472697665725C5372635C73746D3332663478785F68616C5F7370692E63000000001373746D3332663478785F68616C5F7370692E6300000000C1838300FFFFFFFF77443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C69627472696E616D69635C49464C59544F502D544D432D4150495C746D635C68656C706572735C4D6163726F732E6800000000084D6163726F732E6800000000CACAD500FFFFFFFF27433A5C4B65696C5F76355C41524D5C41524D43435C696E636C7564655C66756E6374696F6E616C000000000A66756E6374696F6E616C00000000C5D4F200FFFFFFFF7D443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C62617369635C73746D33325F68616C5F7265735F6D616E616765722E637070000000001973746D33325F68616C5F7265735F6D616E616765722E63707000000000FFDC7800FFFFFFFF6B443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C62617369635C62617369632E63000000000762617369632E6300000000BECEA100FFFFFFFF7B443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6170705C447269766572735C53544D3332463478785F48414C5F4472697665725C5372635C73746D3332663478785F68616C5F63616E2E63000000001373746D3332663478785F68616C5F63616E2E6300000000F0A0A100FFFFFFFF92443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C636F6D706F6E656E745C69666C79746F705F63616E5F736C6176655F76315C69666C79746F705F63616E5F736C6176652E637070000000001569666C79746F705F63616E5F736C6176652E63707000000000BCA8E100FFFFFFFF79443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C636F6D706F6E656E745C746D703131375C746D703131372E637070000000000A746D703131372E637070000000009CC1B600FFFFFFFF6F443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C62617369635C7A7369676E616C2E687070000000000B7A7369676E616C2E68707000000000F7B88600FFFFFFFF77443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C6465705C6C696269666C79746F705F6D6963726F5C73746D33325C62617369635C73746D33325F68616C5F7574696C732E637070000000001373746D33325F68616C5F7574696C732E63707000000000D9ADC200FFFFFFFF5C443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C66616E5F73746174655F6D6F6E69746F722E687070000000001566616E5F73746174655F6D6F6E69746F722E68707000000000A5C2D700FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000E9000000660000009006000099020000 + 637 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000300000002000000010000005B443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C626F6172645C6C6962746D63696D706C2E637070000000000E6C6962746D63696D706C2E63707000000000C5D4F200FFFFFFFF70443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C6C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E63707000000000296C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E63707000000000FFDC7800FFFFFFFF70443A5C776F726B73706163655C70726F6A6563745F626F6469746563685F76696461735F61383030305C496E63756261746F725F636F6E74726F6C5F73797374656D5C7372635C6C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E68707000000000296C6E63756261746F725F74656D70657261747572655F636F6E74726F6C5F736572766963652E68707000000000BECEA100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000FC01000066000000900600006A020000 @@ -150,7 +150,7 @@ 0 16 - 0300000066000000E200000069020000 + 0300000066000000F50100003A020000 16 @@ -170,7 +170,7 @@ 0 16 - 0300000066000000E200000069020000 + 0300000066000000F50100003A020000 16 @@ -450,7 +450,7 @@ 0 16 - 0300000066000000E200000069020000 + 0300000066000000F50100003A020000 16 @@ -470,7 +470,7 @@ 0 16 - 0300000066000000E200000069020000 + 0300000066000000F50100003A020000 16 @@ -490,7 +490,7 @@ 0 16 - 000000009A02000090060000C0030000 + 000000006B02000090060000C0030000 16 @@ -530,7 +530,7 @@ 0 16 - 030000009D0200008D060000A7030000 + 030000006E0200008D06000078030000 16 @@ -1170,7 +1170,7 @@ 0 16 - 030000009D0200008D060000A7030000 + 030000006E0200008D06000078030000 16 @@ -1190,7 +1190,7 @@ 0 16 - 030000009D0200008D060000A7030000 + 030000006E0200008D06000078030000 16 @@ -1250,7 +1250,7 @@ 0 16 - 030000009D0200008D060000A7030000 + 030000006E0200008D06000078030000 16 @@ -1270,7 +1270,7 @@ 0 16 - 030000009D0200008D060000A7030000 + 030000006E0200008D06000078030000 16 @@ -1799,14 +1799,14 @@ 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFD6000000D9000000DC040000DD000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000D600000066000000DC040000F0000000D60000004F000000DC040000D90000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF060400004F0000000A04000013020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000000A04000066000000DC0400002A0200000A0400004F000000DC0400001302000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFE50000004F000000E90000008202000001000000020000100400000001000000B7FEFFFF3C050000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000E500000099020000000000004F000000E5000000820200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF00000000FF010000DC0400000302000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000001A020000DC040000B80200000000000003020000DC040000A102000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFF6E0200000302000072020000A102000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000008202000090060000860200000100000001000010040000000100000038FEFFFF9E010000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000009D02000090060000D7030000000000008602000090060000C00300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFD6000000D9000000DC040000DD000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000D600000066000000DC040000F0000000D60000004F000000DC040000D90000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF060400004F0000000A04000013020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000000A04000066000000DC0400002A0200000A0400004F000000DC0400001302000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF80100004F000000FC010000530200000100000002000010040000000100000030FDFFFFB5030000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000E500000099020000000000004F000000F8010000530200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF00000000FF010000DC0400000302000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000001A020000DC040000B80200000000000003020000DC040000A102000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFF6E0200000302000072020000A102000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000530200009006000057020000010000000100001004000000010000009AFCFFFF00000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000009D02000090060000D7030000000000005702000090060000C00300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File 2537 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -1838,7 +1838,7 @@ Debug 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 898 @@ -3603,117 +3603,9 @@ 0 100 - 24 - - ../Core/Src/main.c - 0 - 60 - 70 - 1 - - 0 - - - startup_stm32f407xx.s - 0 - 168 - 174 - 1 - - 0 - - - ..\..\dep\libtrinamic\IFLYTOP-TMC-API\tmc\ic\TMC4361A\TMC4361A.c - 0 - 194 - 201 - 1 - - 0 - - - ..\..\dep\libtrinamic\IFLYTOP-TMC-API\tmc\helpers\CRC.c - 0 - 1 - 1 - 1 - - 0 - - - ..\..\dep\libtrinamic\IFLYTOP-TMC-API\tmc\ramp\LinearRamp1.c - 0 - 1 - 1 - 1 - - 0 - + 2 - D:\workspace\project_boditech_vidas_a8000\Incubator_control_system\dep\libtrinamic\IFLYTOP-TMC-API\tmc\ramp\LinearRamp.c - 0 - 1 - 1 - 1 - - 0 - - - ..\..\dep\libtrinamic\src\ic\tmc4361A.cpp - 21 - 66 - 76 - 1 - - 0 - - - ..\..\src\umain.cpp - 0 - 60 - 70 - 1 - - 0 - - - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c - 0 - 315 - 325 - 1 - - 0 - - - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c - 0 - 3171 - 3181 - 1 - - 0 - - - ..\..\dep\libtrinamic\src\ic\tmc4361A.hpp - 5 - 141 - 151 - 1 - - 0 - - - ../Core/Src/stm32f4xx_it.c - 0 - 79 - 89 - 1 - - 0 - - - ..\..\dep\libtrinamic\src\ic\tmc2160.cpp + ..\..\src\board\libtmcimpl.cpp 0 1 10 @@ -3722,35 +3614,8 @@ 0 - ..\..\dep\libtrinamic\IFLYTOP-TMC-API\tmc\ic\TMC2160\TMC2160.c - 0 - 104 - 114 - 1 - - 0 - - - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c - 0 - 1252 - 1262 - 1 - - 0 - - - ..\..\dep\libtrinamic\IFLYTOP-TMC-API\tmc\helpers\Macros.h - 0 - 6 - 27 - 1 - - 0 - - - C:\Keil_v5\ARM\ARMCC\include\functional - 0 + ..\..\src\lncubator_temperature_control_service.cpp + 47 1 1 1 @@ -3758,73 +3623,10 @@ 0 - ..\..\dep\libiflytop_micro\stm32\basic\stm32_hal_res_manager.cpp - 0 + ..\..\src\lncubator_temperature_control_service.hpp + 26 1 - 18 - 1 - - 0 - - - ..\..\dep\libiflytop_micro\stm32\basic\basic.c - 0 - 2 - 25 - 1 - - 0 - - - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c - 0 - 1719 - 1726 - 1 - - 0 - - - ..\..\dep\libiflytop_micro\stm32\component\iflytop_can_slave_v1\iflytop_can_slave.cpp - 10 - 104 - 114 - 1 - - 0 - - - ..\..\dep\libiflytop_micro\stm32\component\tmp117\tmp117.cpp - 17 - 24 - 47 - 1 - - 0 - - - ..\..\dep\libiflytop_micro\stm32\basic\zsignal.hpp - 96 - 72 - 95 - 1 - - 0 - - - ..\..\dep\libiflytop_micro\stm32\basic\stm32_hal_utils.cpp - 14 - 90 - 120 - 1 - - 0 - - - ..\..\src\fan_state_monitor.hpp - 6 - 3 - 33 + 17 1 0 diff --git a/app/MDK-ARM/app.uvoptx b/app/MDK-ARM/app.uvoptx index ae00568..cd8d82f 100644 --- a/app/MDK-ARM/app.uvoptx +++ b/app/MDK-ARM/app.uvoptx @@ -925,8 +925,8 @@ 0 0 0 - ..\..\src\device_io_service.cpp - device_io_service.cpp + ..\..\src\lncubator_temperature_control_service.cpp + lncubator_temperature_control_service.cpp 0 0 @@ -937,7 +937,43 @@ 0 0 0 - ..\..\src\libtmcimpl.cpp + ..\..\src\board\device_io_service.cpp + device_io_service.cpp + 0 + 0 + + + 6 + 42 + 8 + 0 + 0 + 0 + ..\..\src\board\fan_state_monitor.cpp + fan_state_monitor.cpp + 0 + 0 + + + 6 + 43 + 8 + 0 + 0 + 0 + ..\..\src\board\hardware.cpp + hardware.cpp + 0 + 0 + + + 6 + 44 + 8 + 0 + 0 + 0 + ..\..\src\board\libtmcimpl.cpp libtmcimpl.cpp 0 0 @@ -952,7 +988,7 @@ 0 7 - 42 + 45 1 0 0 @@ -964,7 +1000,7 @@ 7 - 43 + 46 1 0 0 @@ -976,7 +1012,7 @@ 7 - 44 + 47 1 0 0 @@ -988,7 +1024,7 @@ 7 - 45 + 48 1 0 0 @@ -1000,7 +1036,7 @@ 7 - 46 + 49 8 0 0 @@ -1012,7 +1048,7 @@ 7 - 47 + 50 1 0 0 @@ -1024,7 +1060,7 @@ 7 - 48 + 51 1 0 0 @@ -1036,7 +1072,7 @@ 7 - 49 + 52 8 0 0 @@ -1048,7 +1084,7 @@ 7 - 50 + 53 8 0 0 @@ -1060,7 +1096,7 @@ 7 - 51 + 54 8 0 0 @@ -1072,7 +1108,7 @@ 7 - 52 + 55 8 0 0 @@ -1084,13 +1120,13 @@ 7 - 53 - 8 + 56 + 1 0 0 0 - ..\..\src\fan_state_monitor.cpp - fan_state_monitor.cpp + ..\..\dep\libiflytop_micro\stm32\component\pid\pid_ctrl.c + pid_ctrl.c 0 0 diff --git a/app/MDK-ARM/app.uvprojx b/app/MDK-ARM/app.uvprojx index 25b29b6..3020990 100644 --- a/app/MDK-ARM/app.uvprojx +++ b/app/MDK-ARM/app.uvprojx @@ -1216,14 +1216,29 @@ ..\..\src\umain.cpp + lncubator_temperature_control_service.cpp + 8 + ..\..\src\lncubator_temperature_control_service.cpp + + device_io_service.cpp 8 - ..\..\src\device_io_service.cpp + ..\..\src\board\device_io_service.cpp + + + fan_state_monitor.cpp + 8 + ..\..\src\board\fan_state_monitor.cpp + + + hardware.cpp + 8 + ..\..\src\board\hardware.cpp libtmcimpl.cpp 8 - ..\..\src\libtmcimpl.cpp + ..\..\src\board\libtmcimpl.cpp @@ -1286,9 +1301,9 @@ ..\..\dep\libiflytop_micro\stm32\basic\stm32_hal_utils.cpp - fan_state_monitor.cpp - 8 - ..\..\src\fan_state_monitor.cpp + pid_ctrl.c + 1 + ..\..\dep\libiflytop_micro\stm32\component\pid\pid_ctrl.c diff --git a/dep/libiflytop_micro b/dep/libiflytop_micro index 1be6e0e..645e10e 160000 --- a/dep/libiflytop_micro +++ b/dep/libiflytop_micro @@ -1 +1 @@ -Subproject commit 1be6e0ea5a7193a1eac2460413476302bd9c8dea +Subproject commit 645e10e79f235ef9a05d3026091d692b18f6b5f8 diff --git a/src/board/device_io_service.cpp b/src/board/device_io_service.cpp new file mode 100644 index 0000000..09d46ce --- /dev/null +++ b/src/board/device_io_service.cpp @@ -0,0 +1,175 @@ +#include "device_io_service.hpp" + +#include "libiflytop_micro/stm32/basic/stm32_hal_utils.hpp" +#define TAG "DEVICE_IO_SERVICE" +extern "C" { +int fputc(int ch, FILE *stream) { + uint8_t c = ch; + HAL_UART_Transmit(&DEBUG_UART, &c, 1, 100); + return ch; +} +} + +using namespace iflytop; +namespace iflytop { +} + +void DeviceIoService::fanInit(int freq) { + Stm32HalUtils::setPWMFreq(&htim2, freq); // fan0->fan3 + Stm32HalUtils::setPWMFreq(&htim4, freq); // fan4 + Stm32HalUtils::setPWMFreq(&htim8, freq); // fan5 + + // fan0 fan1 fan2 fan3 + Stm32HalUtils::gpioInit(GPIOC, GPIO_PIN_0, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); + // fan4 + Stm32HalUtils::gpioInit(GPIOC, GPIO_PIN_2, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); + // fan5 + Stm32HalUtils::gpioInit(GPIOC, GPIO_PIN_3, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); +} + +void DeviceIoService::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { + if (fanIndex > 5) { + while (1) { + ZLOGE(TAG, "fanIndex is out of range!"); + } + } + + if (fanIndex <= 3) { + Stm32HalUtils::setPWMDuty(&htim2, TIM_CHANNEL_2, dutyCycle); + m_fanState[0] = dutyCycle > 0; + m_fanState[1] = dutyCycle > 0; + m_fanState[2] = dutyCycle > 0; + m_fanState[3] = dutyCycle > 0; + + if (dutyCycle > 0) { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); + } else { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); + } + + } else if (fanIndex == 4) { + Stm32HalUtils::setPWMDuty(&htim4, TIM_CHANNEL_3, dutyCycle); + m_fanState[4] = dutyCycle > 0; + + if (dutyCycle > 0) { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); + } else { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); + } + } else if (fanIndex == 5) { + Stm32HalUtils::setPWMDuty(&htim8, TIM_CHANNEL_3, dutyCycle); + m_fanState[5] = dutyCycle > 0; + + if (dutyCycle > 0) { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); + } else { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); + } + } +} +bool *DeviceIoService::fanGetPowerState(int fanIndex) { + if (fanIndex >= 5) { + while (1) { + ZLOGE(TAG, "fanIndex is out of range!"); + } + } + return &m_fanState[fanIndex]; +} +void DeviceIoService::fanSetState0to3(uint16_t dutyCycle) { fanSetDutyCycle(0, dutyCycle); } +void DeviceIoService::fanSetState4(uint16_t dutyCycle) { fanSetDutyCycle(4, dutyCycle); } +void DeviceIoService::fanSetState5(uint16_t dutyCycle) { fanSetDutyCycle(5, dutyCycle); } + +/******************************************************************************* + * 帕尔贴驱动电路 * + *******************************************************************************/ +void DeviceIoService::peltier_cold_ctr_pwm(int pwm) { + __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm); + HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); +} +// PB0 HOT_CTR_PWM0 +void DeviceIoService::peltier_hot_ctr_pwm(int pwm) { + __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, pwm); + HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); +} +void DeviceIoService::peltier_init() { // + Stm32HalUtils::gpioInit(GPIOB, GPIO_PIN_1, GPIO_MODE_AF_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); + Stm32HalUtils::gpioInit(GPIOE, GPIO_PIN_10, GPIO_MODE_AF_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); +} +void DeviceIoService::peltier_set_pwm(int pwm) { + /** + * @brief + * + * 待机状态 + * HOT_CTR_PWM0(AL) = 0 + * HOT_CTR(AH) = 0 + * COLD_CTR_PWM0(BL) = 0 + * COLD_CTR(BH) = 0 + * 加热时 + * HOT_CTR_PWM0(AL) = 1(PWM) + * HOT_CTR(AH) = 0 + * COLD_CTR_PWM0(BL) = 0 + * COLD_CTR(BH) = 1(IO/保持) + * 制冷时 + * HOT_CTR_PWM0(AL) = 0 + * HOT_CTR(AH) = 1(IO/保持) + * COLD_CTR_PWM0(BL) = 1(PWM) + * COLD_CTR(BH) = 0 + */ + pwm = pwm * 1000; + if (pwm == 0) { + peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ + } else if (pwm > 0) { + peltier_hot_ctr_pwm(pwm); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET); /*COLD_CTR*/ + } else { + peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(-pwm); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ + } +} +/******************************************************************************* + * tmc芯片驱动相关 * + *******************************************************************************/ +void DeviceIoService::tmc_init() { + Stm32HalUtils::gpioInit( // + GPIOA, GPIO_PIN_4, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); + Stm32HalUtils::gpioInit( // + GPIOE, GPIO_PIN_12, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); + Stm32HalUtils::gpioInit( // + GPIOE, GPIO_PIN_11, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); +} + +void DeviceIoService::tmc_motor_spi_select(int channel, bool state) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, state ? GPIO_PIN_SET : GPIO_PIN_RESET); } +void DeviceIoService::tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length) { + if (channel == MOTOR_1_TMC4361A_CHANNEL) { + tmc_motor_spi_select(channel, false); + sleepus(10); + HAL_SPI_TransmitReceive(&hspi1, data, data, length, 1000); + tmc_motor_spi_select(channel, true); + } +} +void DeviceIoService::tmc_extern_clk_enable() { +#if 1 + /** + * @brief TMC使用的外部时钟在stm32cubemx中已经进行配置,输出时钟为16MHZ + * 配置可以参考https://iflytop1.feishu.cn/wiki/wikcnog3hFm6dGFLMRksnhLb7Aw + */ +#endif +} +void DeviceIoService::tmc_nFREEZE_pin_set_state(uint8_t channel, bool state) { + if (channel == MOTOR_1_TMC4361A_CHANNEL) { + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, state ? GPIO_PIN_SET : GPIO_PIN_RESET); + } +} +void DeviceIoService::tmc_ENN_pin_set_state(uint8_t channel, bool state) { + if (channel == MOTOR_1_TMC2160_CHANNEL) { + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, state ? GPIO_PIN_SET : GPIO_PIN_RESET); + } +} +void DeviceIoService::tmc_nRESET_pin_set_state(uint8_t channel, bool state) {} diff --git a/src/board/device_io_service.hpp b/src/board/device_io_service.hpp new file mode 100644 index 0000000..f9a84bc --- /dev/null +++ b/src/board/device_io_service.hpp @@ -0,0 +1,69 @@ +#pragma once +#include +#include + +#include "libiflytop_micro/stm32/basic/basic.h" +#include "libiflytop_micro\stm32\basic\iflytop_micro_os.hpp" +#include "libtrinamic/src/ic/tmc2160.hpp" +#include "libtrinamic\src\ic\tmc4361A.hpp" +#include "main.h" +#include "project_board.hpp" +#include "spi.h" +#include "tim.h" +#include "usart.h" + +namespace iflytop { +using namespace std; + +class DeviceIoService : public IflytopMicroOS { + private: + /* data */ + + bool m_fanState[6]; + + public: + DeviceIoService(/* args */) {} + ~DeviceIoService() {} + /******************************************************************************* + * 风扇控制 * + *******************************************************************************/ + void fanInit(int freq); + void fanSetDutyCycle(int fanIndex, uint16_t dutyCycle); + bool *fanGetPowerState(int fanIndex); + void fanSetState0to3(uint16_t dutyCycle); + void fanSetState4(uint16_t dutyCycle); + void fanSetState5(uint16_t dutyCycle); + /******************************************************************************* + * 帕尔贴驱动电路 * + *******************************************************************************/ + void peltier_init(); + void peltier_set_pwm(int pwm); + /******************************************************************************* + * tmc芯片驱动相关 * + *******************************************************************************/ + void tmc_init(); + void tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length); + void tmc_extern_clk_enable(); + void tmc_nFREEZE_pin_set_state(uint8_t channel, bool state); + void tmc_ENN_pin_set_state(uint8_t channel, bool state); + void tmc_nRESET_pin_set_state(uint8_t channel, bool state); + + /******************************************************************************* + * OVERRIDE IflytopMicroOS * + *******************************************************************************/ + virtual void sleepMS(int ms) { HAL_Delay(ms); }; + virtual uint32_t hasPassedMS(uint32_t ticket) { return sys_haspassedms(ticket); }; + virtual uint32_t getTicket() { return HAL_GetTick(); }; + virtual uint32_t getNowMS() { return HAL_GetTick(); }; + virtual void sleepus(uint32_t us) { sys_delay_us(&DELAY_US_TIMER, us); } + + private: + // PE9 COLD_CTR_PWM0 + void peltier_cold_ctr_pwm(int pwm); + // PB0 HOT_CTR_PWM0 + void peltier_hot_ctr_pwm(int pwm); + + void tmc_motor_spi_select(int channel, bool state); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/src/board/fan_state_monitor.cpp b/src/board/fan_state_monitor.cpp new file mode 100644 index 0000000..efe9761 --- /dev/null +++ b/src/board/fan_state_monitor.cpp @@ -0,0 +1,70 @@ +#include "fan_state_monitor.hpp" + +#include "libiflytop_micro/stm32/basic/basic.h" +#include "libiflytop_micro\stm32\basic\stm32_hal_utils.hpp" + +using namespace iflytop; + +#define TAG "FAN_STATE_MONITOR" +void FanStateMonitor::initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate) { + m_FB_GPIOx = FB_GPIOx; + m_FB_GPIO_Pin = FB_GPIO_Pin; + m_fanstate = fanstate; + m_os = os; + m_fanFBCount = 0; + m_lastPinState = GPIO_PIN_RESET; + m_lastCallTicket = 0; + m_fanOpenTicket = 0; + m_lastFanState = false; + m_fanError = false; + + Stm32HalUtils::gpioInitAsInput(FB_GPIOx, FB_GPIO_Pin); + m_lastPinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); +} +void FanStateMonitor::doFanStateCheckPeriodicJob() { + /** + * @brief 捕获风扇异常反馈信号 + */ + GPIO_PinState pinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); + if (HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin) != m_lastPinState) { + m_fanFBCount++; + m_lastPinState = pinState; + } + + /** + * @brief 电机工作超过2秒,且2秒内没有反馈信号,判断电机不工作 + */ + if (m_os->hasPassedMS(m_fanOpenTicket) > 2000 && m_os->hasPassedMS(m_lastCallTicket) > 2000) { + if (m_fanFBCount == 0) { + ZLOGE(TAG, "Fan is not working!"); + m_fanError = true; + } + m_lastCallTicket = m_os->getTicket(); + m_fanFBCount = 0; + } +} +void FanStateMonitor::periodicJob() { + // + bool& fanstate = *m_fanstate; + + if (fanstate != m_lastFanState) { + m_lastFanState = fanstate; + if (fanstate) { + /** + * @brief 风扇有关到开 + */ + // 启动检查 + m_fanOpenTicket = m_os->getTicket(); + m_lastCallTicket = m_os->getTicket(); + m_fanFBCount = 0; + m_fanError = false; + } + } + + /** + * @brief 如果当前风扇正在工作,则周期性检查风扇状态 + */ + if (fanstate) { + doFanStateCheckPeriodicJob(); + } +} \ No newline at end of file diff --git a/src/board/fan_state_monitor.hpp b/src/board/fan_state_monitor.hpp new file mode 100644 index 0000000..e8eeeb9 --- /dev/null +++ b/src/board/fan_state_monitor.hpp @@ -0,0 +1,46 @@ +#pragma once +#include "libiflytop_micro/stm32/basic/iflytop_micro_os.hpp" +#include "main.h" +namespace iflytop { +class FanStateMonitor { + GPIO_TypeDef* m_FB_GPIOx; // 风扇反馈引脚 + uint16_t m_FB_GPIO_Pin; // 风扇反馈引脚 + bool* m_fanstate; // 风扇当前是否正在工作 + IflytopMicroOS* m_os; // 系统基础方法 + uint16_t m_fanFBCount; // 风扇反馈计数 + GPIO_PinState m_lastPinState; // 上次风扇反馈引脚状态,用来实现风扇反馈计数逻辑 + uint32_t m_lastCallTicket; // 上次调用周期性任务的时间戳 + uint32_t m_fanOpenTicket; // 风扇打开的时间戳 + bool m_lastFanState; // 上次风扇状态,用来实现捕获风扇打开事件 + + bool m_fanError; // 风扇故障标志位 + + public: + FanStateMonitor(/* args */){}; + ~FanStateMonitor(){}; + + void initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate); + + /** + * @brief 读取风扇故障状态 + * 风扇故障异常会在以下两种情况被清除 + * 1. 风扇关闭后又重新启动 + * 2. 上层代码调用clearFanError()清除 + * @return true + * @return false + */ + bool getFanError() { return m_fanError; } + void clearFanError() { m_fanError = false; } + + /******************************************************************************* + * 周期性调度任务 * + *******************************************************************************/ + /** + * @brief 周期性调度任务,需要上层代码尽可能的频繁调度 + */ + void periodicJob(); + + private: + void doFanStateCheckPeriodicJob(); +}; +} // namespace iflytop \ No newline at end of file diff --git a/src/board/hardware.cpp b/src/board/hardware.cpp new file mode 100644 index 0000000..c9606e0 --- /dev/null +++ b/src/board/hardware.cpp @@ -0,0 +1,148 @@ +#include "hardware.hpp" + +#include "i2c.h" +using namespace iflytop; +#define TAG "hardware" +void Hardware::hardwareinit() { + m_os = &m_deviceIoService; + /******************************************************************************* + * CANSLAVEService初始化 * + *******************************************************************************/ + IflytopCanSlave::iflytop_can_slave_config_t *config = canSlaveService.createDefaultConfig(DEVICE_ID); + canSlaveService.initialize(m_os, config); + /******************************************************************************* + * 帕尔贴初始化 * + *******************************************************************************/ + m_deviceIoService.peltier_init(); + /******************************************************************************* + * 温度传感器初始化 * + *******************************************************************************/ + tmp117[0].initializate(&hi2c1, TMP117::ID0); + tmp117[1].initializate(&hi2c1, TMP117::ID1); + tmp117[2].initializate(&hi2c1, TMP117::ID2); + tmp117[3].initializate(&hi2c1, TMP117::ID3); + + /******************************************************************************* + * 电机初始化 * + *******************************************************************************/ + m_deviceIoService.tmc_init(); + m_deviceIoService.tmc_extern_clk_enable(); + // 4361初始化 + TMC4361AImpl::TMC4361AConfig_t *tmc4361aconfig = TMC4361AImpl::createDeafultTMC4361AConfig(); + tmc4361aconfig->base_config.fs_per_rev = 200; + tmc4361aconfig->encoder_config.diff_enc_in_disable = false; + tmc4361aconfig->encoder_config.enc_in_res = 4000; + tmc4361aconfig->close_loop_config.enable_closed_loop = true; + + tmc4361motor1.initialize(&m_deviceIoService, MOTOR_1_TMC4361A_CHANNEL, TMC4361A::IC_TMC2160, tmc4361aconfig); + tmc4361motor1.setMaximumAcceleration(300000); + tmc4361motor1.setMaximumDeceleration(300000); + + // 2160初始化 + tmc2160motor1.setMaximumCurrent(3); + tmc2160motor1.initialize(&m_deviceIoService, &tmc4361motor1, MOTOR_1_TMC2160_CHANNEL); + + HAL_Delay(100); + // 使能电机 + tmc4361motor1.enableIC(true); + tmc2160motor1.enableIC(true); + /** + * @brief 通过读取Version寄存器来判断芯片是否正常 + */ + int32_t ic4361Version = tmc4361motor1.readICVersion(); + int32_t ic2160Version = tmc2160motor1.readICVersion(); + // 期望 4361Version:2 ic2160Version:30 + ZLOGI(TAG, "TMC4361Version:%x TMC2160VERSION:%x", ic4361Version, ic2160Version); + if (ic4361Version != 2 || ic2160Version != 30) { + ZLOGE(TAG, "TMC4361 or TMC2160 is not normal"); + } + + /******************************************************************************* + * 风扇初始化 * + *******************************************************************************/ + m_deviceIoService.fanInit(1000); + /** + * @brief 风扇反馈初始化 + * + * FAN0_FB_INT PC1 + * FAN1_FB_INT PC4 + * FAN2_FB_INT PC5 + * FAN3_FB_INT PC6 + * FAN4_FB_INT PC7 + * FAN5_FB_INT PC10 + */ + + m_fanStateMonitor[0].initialize(m_os, GPIOC, GPIO_PIN_1, m_deviceIoService.fanGetPowerState(0)); + m_fanStateMonitor[1].initialize(m_os, GPIOC, GPIO_PIN_4, m_deviceIoService.fanGetPowerState(1)); + m_fanStateMonitor[2].initialize(m_os, GPIOC, GPIO_PIN_5, m_deviceIoService.fanGetPowerState(2)); + m_fanStateMonitor[3].initialize(m_os, GPIOC, GPIO_PIN_6, m_deviceIoService.fanGetPowerState(3)); + m_fanStateMonitor[4].initialize(m_os, GPIOC, GPIO_PIN_7, m_deviceIoService.fanGetPowerState(4)); + m_fanStateMonitor[5].initialize(m_os, GPIOC, GPIO_PIN_10, m_deviceIoService.fanGetPowerState(5)); +} +void Hardware::periodicJob() { + /** + * @brief 风扇状态监控服务周期调度 + */ + for (size_t i = 0; i < ZARRAY_SIZE(m_fanStateMonitor); i++) { + m_fanStateMonitor[i].periodicJob(); + } + do_debug_light_state(); +} +void Hardware::do_debug_light_state() { + static uint32_t lastprocess = 0; + if (sys_haspassedms(lastprocess) > 300) { + lastprocess = HAL_GetTick(); + HAL_GPIO_TogglePin(DEBUG_LIGHT_PORT, DEBUG_LIGHT_PIN); + } +} +/******************************************************************************* + * 硬件测试 * + *******************************************************************************/ +void Hardware::testTmp117() { + static uint32_t lastcall; + if (m_os->hasPassedMS(lastcall) > 1000) { + lastcall = m_os->getTicket(); + for (size_t i = 0; i < 4; i++) { + float temp = tmp117[i].getTemperature(); + if (tmp117[i].getLastCallStatus() == HAL_OK) { + ZLOGI(TAG, "tmp117_%d:%f", i, temp); + } else { + ZLOGI(TAG, "tmp117_%d:read fail", i); + } + } + } +} + +/** + * @brief 测试CAN的发送和接收 + */ +void Hardware::testCanSlaveTxAndRx(bool canOnRxDataFlag) { + { + static uint32_t lastcall; + static uint8_t tx[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + if (m_os->hasPassedMS(lastcall) > 1000) { + lastcall = m_os->getTicket(); + canSlaveService.translate(0x01, tx, 8, 2); + if (canSlaveService.getLastTransmitStatus() == HAL_OK) { + ZLOGI(TAG, "send ok"); + } else { + ZLOGI(TAG, "send fail"); + } + } + } + + /** + * @brief 接收CAN消息 + */ + if (canOnRxDataFlag) { + canOnRxDataFlag = false; + static CAN_RxHeaderTypeDef packetHeader; + static uint8_t packetData[8]; + while (canSlaveService.getRxMessage(&packetHeader, packetData)) { + ZLOGI(TAG, "rx packet:"); + ZLOGI(TAG, "\tid:%x len:%d", packetHeader.StdId, packetHeader.DLC); + ZLOGI_HEX(TAG, packetData, packetHeader.DLC); + } + canSlaveService.activateRxIT(); + } +} diff --git a/src/board/hardware.hpp b/src/board/hardware.hpp new file mode 100644 index 0000000..4c0ee8c --- /dev/null +++ b/src/board/hardware.hpp @@ -0,0 +1,36 @@ + +#pragma once +#include "board/device_io_service.hpp" +#include "board/fan_state_monitor.hpp" +#include "board/libtmcimpl.hpp" +#include "libiflytop_micro\stm32\component\iflytop_can_slave_v1\iflytop_can_slave.hpp" +#include "libiflytop_micro\stm32\component\tmp117\tmp117.hpp" + +namespace iflytop { +class Hardware { + private: + /* data */ + public: + TMC4361AImpl tmc4361motor1; + TMC2160Impl tmc2160motor1; + TMP117 tmp117[4]; + FanStateMonitor m_fanStateMonitor[6]; + IflytopCanSlave canSlaveService; + IflytopMicroOS* m_os; + DeviceIoService m_deviceIoService; + + Hardware(/* args */){}; + ~Hardware(){}; + + void hardwareinit(); + void periodicJob(); + + /******************************************************************************* + * 测试 * + *******************************************************************************/ + void testTmp117(); + void testCanSlaveTxAndRx(bool canOnRxDataFlag); + void do_debug_light_state(); +}; + +} // namespace iflytop diff --git a/src/board/libtmcimpl.cpp b/src/board/libtmcimpl.cpp new file mode 100644 index 0000000..d517932 --- /dev/null +++ b/src/board/libtmcimpl.cpp @@ -0,0 +1,35 @@ +#pragma once +#include "libtmcimpl.hpp" + +#include "device_io_service.hpp" +namespace iflytop { +using namespace std; +/******************************************************************************* + * TMC4361AImpl * + *******************************************************************************/ +void TMC4361AImpl::setResetPinState(bool state) { m_deviceIoService->tmc_nRESET_pin_set_state(m_channel, state); }; +void TMC4361AImpl::setFREEZEPinState(bool state) { m_deviceIoService->tmc_nFREEZE_pin_set_state(m_channel, state); }; +void TMC4361AImpl::setENNPinState(bool state) { m_deviceIoService->tmc_ENN_pin_set_state(m_channel, state); }; +bool TMC4361AImpl::getTargetReachedPinState() { return false; }; +void TMC4361AImpl::sleepus(int32_t us) { m_deviceIoService->sleepus(us); }; +void TMC4361AImpl::readWriteArray(uint8_t *data, size_t length) { // + m_deviceIoService->tmc_motor_spi_write_and_read(m_channel, data, length); +}; + +void TMC4361AImpl::initialize(DeviceIoService *deviceIoService, uint8_t channel, driver_ic_type_t driver_ic_type, TMC4361AConfig_t *config) { + m_deviceIoService = deviceIoService; + TMC4361A::initialize(channel, driver_ic_type, config); +} + +/******************************************************************************* + * TMC2160Impl * + *******************************************************************************/ +void TMC2160Impl::initialize(DeviceIoService *deviceIoService, TMC4361A *tmc4361, uint8_t channelId) { + m_tmc4361 = tmc4361; + m_deviceIoService = deviceIoService; + TMC2160::initialize(channelId); +} +void TMC2160Impl::setENNPinState(bool state) { m_deviceIoService->tmc_ENN_pin_set_state(m_channel, state); }; +void TMC2160Impl::sleepus(int32_t us) { m_deviceIoService->sleepus(us); }; +void TMC2160Impl::readWriteArray(uint8_t *data, size_t length) { m_tmc4361->readWriteCover(data, length); }; +} // namespace iflytop \ No newline at end of file diff --git a/src/board/libtmcimpl.hpp b/src/board/libtmcimpl.hpp new file mode 100644 index 0000000..47eaa0a --- /dev/null +++ b/src/board/libtmcimpl.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include "board/device_io_service.hpp" +#include "libiflytop_micro/stm32/basic/basic.h" +#include "libtrinamic/src/ic/tmc2160.hpp" +#include "libtrinamic\src\ic\tmc4361A.hpp" +namespace iflytop { +using namespace std; +/** + * @brief 对接TMC4361和硬件的接口 + */ +class TMC4361AImpl : public TMC4361A { + DeviceIoService *m_deviceIoService; + + protected: + virtual void setResetPinState(bool state); + virtual void setFREEZEPinState(bool state); + virtual void setENNPinState(bool state); + virtual bool getTargetReachedPinState(); + virtual void sleepus(int32_t us); + virtual void readWriteArray(uint8_t *data, size_t length); + + public: + void initialize(DeviceIoService *deviceIoService, uint8_t channel, driver_ic_type_t driver_ic_type, TMC4361AConfig_t *config); +}; +/** + * @brief 对接TMC2160和硬件的接口 + */ +class TMC2160Impl : public TMC2160 { + TMC4361A *m_tmc4361; + DeviceIoService *m_deviceIoService; + + public: + void initialize(DeviceIoService *deviceIoService, TMC4361A *tmc4361, uint8_t channelId); + + protected: + virtual void setENNPinState(bool state); + virtual void sleepus(int32_t us); + virtual void readWriteArray(uint8_t *data, size_t length); +}; +} // namespace iflytop \ No newline at end of file diff --git a/src/device_io_service.cpp b/src/device_io_service.cpp deleted file mode 100644 index 3aa35b5..0000000 --- a/src/device_io_service.cpp +++ /dev/null @@ -1,176 +0,0 @@ -#include "device_io_service.hpp" - -#include "libiflytop_micro/stm32/basic/stm32_hal_utils.hpp" -#define TAG "DEVICE_IO_SERVICE" -extern "C" { -int fputc(int ch, FILE *stream) { - uint8_t c = ch; - HAL_UART_Transmit(&DEBUG_UART, &c, 1, 100); - return ch; -} -} - -using namespace iflytop; -namespace iflytop { -DeviceIoService deviceIoService; -} - -void DeviceIoService::fanInit(int freq) { - Stm32HalUtils::setPWMFreq(&htim2, freq); // fan0->fan3 - Stm32HalUtils::setPWMFreq(&htim4, freq); // fan4 - Stm32HalUtils::setPWMFreq(&htim8, freq); // fan5 - - // fan0 fan1 fan2 fan3 - Stm32HalUtils::gpioInit(GPIOC, GPIO_PIN_0, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); - // fan4 - Stm32HalUtils::gpioInit(GPIOC, GPIO_PIN_2, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); - // fan5 - Stm32HalUtils::gpioInit(GPIOC, GPIO_PIN_3, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); -} - -void DeviceIoService::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { - if (fanIndex > 5) { - while (1) { - ZLOGE(TAG, "fanIndex is out of range!"); - } - } - - if (fanIndex <= 3) { - Stm32HalUtils::setPWMDuty(&htim2, TIM_CHANNEL_2, dutyCycle); - m_fanState[0] = dutyCycle > 0; - m_fanState[1] = dutyCycle > 0; - m_fanState[2] = dutyCycle > 0; - m_fanState[3] = dutyCycle > 0; - - if (dutyCycle > 0) { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); - } else { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); - } - - } else if (fanIndex == 4) { - Stm32HalUtils::setPWMDuty(&htim4, TIM_CHANNEL_3, dutyCycle); - m_fanState[4] = dutyCycle > 0; - - if (dutyCycle > 0) { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); - } else { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); - } - } else if (fanIndex == 5) { - Stm32HalUtils::setPWMDuty(&htim8, TIM_CHANNEL_3, dutyCycle); - m_fanState[5] = dutyCycle > 0; - - if (dutyCycle > 0) { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); - } else { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); - } - } -} -bool *DeviceIoService::fanGetPowerState(int fanIndex) { - if (fanIndex >= 5) { - while (1) { - ZLOGE(TAG, "fanIndex is out of range!"); - } - } - return &m_fanState[fanIndex]; -} -void DeviceIoService::fanSetState0to3(uint16_t dutyCycle) { fanSetDutyCycle(0, dutyCycle); } -void DeviceIoService::fanSetState4(uint16_t dutyCycle) { fanSetDutyCycle(4, dutyCycle); } -void DeviceIoService::fanSetState5(uint16_t dutyCycle) { fanSetDutyCycle(5, dutyCycle); } - -/******************************************************************************* - * 帕尔贴驱动电路 * - *******************************************************************************/ -void DeviceIoService::peltier_cold_ctr_pwm(int pwm) { - __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm); - HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); -} -// PB0 HOT_CTR_PWM0 -void DeviceIoService::peltier_hot_ctr_pwm(int pwm) { - __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, pwm); - HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); -} -void DeviceIoService::peltier_init() { // - Stm32HalUtils::gpioInit(GPIOB, GPIO_PIN_1, GPIO_MODE_AF_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); - Stm32HalUtils::gpioInit(GPIOE, GPIO_PIN_10, GPIO_MODE_AF_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); -} -void DeviceIoService::peltier_set_pwm(int pwm) { - /** - * @brief - * - * 待机状态 - * HOT_CTR_PWM0(AL) = 0 - * HOT_CTR(AH) = 0 - * COLD_CTR_PWM0(BL) = 0 - * COLD_CTR(BH) = 0 - * 加热时 - * HOT_CTR_PWM0(AL) = 1(PWM) - * HOT_CTR(AH) = 0 - * COLD_CTR_PWM0(BL) = 0 - * COLD_CTR(BH) = 1(IO/保持) - * 制冷时 - * HOT_CTR_PWM0(AL) = 0 - * HOT_CTR(AH) = 1(IO/保持) - * COLD_CTR_PWM0(BL) = 1(PWM) - * COLD_CTR(BH) = 0 - */ - pwm = pwm * 1000; - if (pwm == 0) { - peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ - peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ - HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ - } else if (pwm > 0) { - peltier_hot_ctr_pwm(pwm); /*HOT_CTR_PWM0*/ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ - peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ - HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET); /*COLD_CTR*/ - } else { - peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); /*HOT_CTR*/ - peltier_cold_ctr_pwm(-pwm); /*COLD_CTR_PWM0*/ - HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ - } -} -/******************************************************************************* - * tmc芯片驱动相关 * - *******************************************************************************/ -void DeviceIoService::tmc_init() { - Stm32HalUtils::gpioInit( // - GPIOA, GPIO_PIN_4, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); - Stm32HalUtils::gpioInit( // - GPIOE, GPIO_PIN_12, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); - Stm32HalUtils::gpioInit( // - GPIOE, GPIO_PIN_11, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_SET); -} - -void DeviceIoService::tmc_motor_spi_select(int channel, bool state) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, state ? GPIO_PIN_SET : GPIO_PIN_RESET); } -void DeviceIoService::tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length) { - if (channel == MOTOR_1_TMC4361A_CHANNEL) { - tmc_motor_spi_select(channel, false); - sleepus(10); - HAL_SPI_TransmitReceive(&hspi1, data, data, length, 1000); - tmc_motor_spi_select(channel, true); - } -} -void DeviceIoService::tmc_extern_clk_enable() { -#if 1 - /** - * @brief TMC使用的外部时钟在stm32cubemx中已经进行配置,输出时钟为16MHZ - * 配置可以参考https://iflytop1.feishu.cn/wiki/wikcnog3hFm6dGFLMRksnhLb7Aw - */ -#endif -} -void DeviceIoService::tmc_nFREEZE_pin_set_state(uint8_t channel, bool state) { - if (channel == MOTOR_1_TMC4361A_CHANNEL) { - HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, state ? GPIO_PIN_SET : GPIO_PIN_RESET); - } -} -void DeviceIoService::tmc_ENN_pin_set_state(uint8_t channel, bool state) { - if (channel == MOTOR_1_TMC2160_CHANNEL) { - HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, state ? GPIO_PIN_SET : GPIO_PIN_RESET); - } -} -void DeviceIoService::tmc_nRESET_pin_set_state(uint8_t channel, bool state) {} diff --git a/src/device_io_service.hpp b/src/device_io_service.hpp deleted file mode 100644 index 42da01b..0000000 --- a/src/device_io_service.hpp +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once -#include -#include - -#include "libiflytop_micro/stm32/basic/basic.h" -#include "libiflytop_micro\stm32\basic\iflytop_micro_os.hpp" -#include "libtrinamic/src/ic/tmc2160.hpp" -#include "libtrinamic\src\ic\tmc4361A.hpp" -#include "main.h" -#include "project_board.hpp" -#include "spi.h" -#include "tim.h" -#include "usart.h" - -namespace iflytop { -using namespace std; - -class DeviceIoService : public IflytopMicroOS { - private: - /* data */ - - bool m_fanState[5]; - - public: - DeviceIoService(/* args */) {} - ~DeviceIoService() {} - /******************************************************************************* - * 风扇控制 * - *******************************************************************************/ - void fanInit(int freq); - void fanSetDutyCycle(int fanIndex, uint16_t dutyCycle); - bool *fanGetPowerState(int fanIndex); - void fanSetState0to3(uint16_t dutyCycle); - void fanSetState4(uint16_t dutyCycle); - void fanSetState5(uint16_t dutyCycle); - /******************************************************************************* - * 帕尔贴驱动电路 * - *******************************************************************************/ - void peltier_init(); - void peltier_set_pwm(int pwm); - /******************************************************************************* - * tmc芯片驱动相关 * - *******************************************************************************/ - void tmc_init(); - void tmc_motor_spi_write_and_read(int channel, uint8_t *data, size_t length); - void tmc_extern_clk_enable(); - void tmc_nFREEZE_pin_set_state(uint8_t channel, bool state); - void tmc_ENN_pin_set_state(uint8_t channel, bool state); - void tmc_nRESET_pin_set_state(uint8_t channel, bool state); - - /******************************************************************************* - * OVERRIDE IflytopMicroOS * - *******************************************************************************/ - virtual void sleepMS(int ms) { HAL_Delay(ms); }; - virtual uint32_t hasPassedMS(uint32_t ticket) { return sys_haspassedms(ticket); }; - virtual uint32_t getTicket() { return HAL_GetTick(); }; - virtual uint32_t getNowMS() { return HAL_GetTick(); }; - virtual void sleepus(uint32_t us) { sys_delay_us(&DELAY_US_TIMER, us); } - - private: - // PE9 COLD_CTR_PWM0 - void peltier_cold_ctr_pwm(int pwm); - // PB0 HOT_CTR_PWM0 - void peltier_hot_ctr_pwm(int pwm); - - void tmc_motor_spi_select(int channel, bool state); -}; - -extern DeviceIoService deviceIoService; -} // namespace iflytop \ No newline at end of file diff --git a/src/fan_state_monitor.cpp b/src/fan_state_monitor.cpp deleted file mode 100644 index efe9761..0000000 --- a/src/fan_state_monitor.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "fan_state_monitor.hpp" - -#include "libiflytop_micro/stm32/basic/basic.h" -#include "libiflytop_micro\stm32\basic\stm32_hal_utils.hpp" - -using namespace iflytop; - -#define TAG "FAN_STATE_MONITOR" -void FanStateMonitor::initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate) { - m_FB_GPIOx = FB_GPIOx; - m_FB_GPIO_Pin = FB_GPIO_Pin; - m_fanstate = fanstate; - m_os = os; - m_fanFBCount = 0; - m_lastPinState = GPIO_PIN_RESET; - m_lastCallTicket = 0; - m_fanOpenTicket = 0; - m_lastFanState = false; - m_fanError = false; - - Stm32HalUtils::gpioInitAsInput(FB_GPIOx, FB_GPIO_Pin); - m_lastPinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); -} -void FanStateMonitor::doFanStateCheckPeriodicJob() { - /** - * @brief 捕获风扇异常反馈信号 - */ - GPIO_PinState pinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); - if (HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin) != m_lastPinState) { - m_fanFBCount++; - m_lastPinState = pinState; - } - - /** - * @brief 电机工作超过2秒,且2秒内没有反馈信号,判断电机不工作 - */ - if (m_os->hasPassedMS(m_fanOpenTicket) > 2000 && m_os->hasPassedMS(m_lastCallTicket) > 2000) { - if (m_fanFBCount == 0) { - ZLOGE(TAG, "Fan is not working!"); - m_fanError = true; - } - m_lastCallTicket = m_os->getTicket(); - m_fanFBCount = 0; - } -} -void FanStateMonitor::periodicJob() { - // - bool& fanstate = *m_fanstate; - - if (fanstate != m_lastFanState) { - m_lastFanState = fanstate; - if (fanstate) { - /** - * @brief 风扇有关到开 - */ - // 启动检查 - m_fanOpenTicket = m_os->getTicket(); - m_lastCallTicket = m_os->getTicket(); - m_fanFBCount = 0; - m_fanError = false; - } - } - - /** - * @brief 如果当前风扇正在工作,则周期性检查风扇状态 - */ - if (fanstate) { - doFanStateCheckPeriodicJob(); - } -} \ No newline at end of file diff --git a/src/fan_state_monitor.hpp b/src/fan_state_monitor.hpp deleted file mode 100644 index e8eeeb9..0000000 --- a/src/fan_state_monitor.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#include "libiflytop_micro/stm32/basic/iflytop_micro_os.hpp" -#include "main.h" -namespace iflytop { -class FanStateMonitor { - GPIO_TypeDef* m_FB_GPIOx; // 风扇反馈引脚 - uint16_t m_FB_GPIO_Pin; // 风扇反馈引脚 - bool* m_fanstate; // 风扇当前是否正在工作 - IflytopMicroOS* m_os; // 系统基础方法 - uint16_t m_fanFBCount; // 风扇反馈计数 - GPIO_PinState m_lastPinState; // 上次风扇反馈引脚状态,用来实现风扇反馈计数逻辑 - uint32_t m_lastCallTicket; // 上次调用周期性任务的时间戳 - uint32_t m_fanOpenTicket; // 风扇打开的时间戳 - bool m_lastFanState; // 上次风扇状态,用来实现捕获风扇打开事件 - - bool m_fanError; // 风扇故障标志位 - - public: - FanStateMonitor(/* args */){}; - ~FanStateMonitor(){}; - - void initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate); - - /** - * @brief 读取风扇故障状态 - * 风扇故障异常会在以下两种情况被清除 - * 1. 风扇关闭后又重新启动 - * 2. 上层代码调用clearFanError()清除 - * @return true - * @return false - */ - bool getFanError() { return m_fanError; } - void clearFanError() { m_fanError = false; } - - /******************************************************************************* - * 周期性调度任务 * - *******************************************************************************/ - /** - * @brief 周期性调度任务,需要上层代码尽可能的频繁调度 - */ - void periodicJob(); - - private: - void doFanStateCheckPeriodicJob(); -}; -} // namespace iflytop \ No newline at end of file diff --git a/src/libtmcimpl.cpp b/src/libtmcimpl.cpp deleted file mode 100644 index 371b5f2..0000000 --- a/src/libtmcimpl.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include "libtmcimpl.hpp" - -#include "device_io_service.hpp" -namespace iflytop { -using namespace std; -/******************************************************************************* - * TMC4361AImpl * - *******************************************************************************/ -void TMC4361AImpl::setResetPinState(bool state) { deviceIoService.tmc_nRESET_pin_set_state(m_channel, state); }; -void TMC4361AImpl::setFREEZEPinState(bool state) { deviceIoService.tmc_nFREEZE_pin_set_state(m_channel, state); }; -void TMC4361AImpl::setENNPinState(bool state) { deviceIoService.tmc_ENN_pin_set_state(m_channel, state); }; -bool TMC4361AImpl::getTargetReachedPinState() { return false; }; -void TMC4361AImpl::sleepus(int32_t us) { deviceIoService.sleepus(us); }; -void TMC4361AImpl::readWriteArray(uint8_t *data, size_t length) { // - deviceIoService.tmc_motor_spi_write_and_read(m_channel, data, length); -}; -/******************************************************************************* - * TMC2160Impl * - *******************************************************************************/ -void TMC2160Impl::initialize(uint8_t channel, TMC4361A *tmc4361) { - m_tmc4361 = tmc4361; - TMC2160::initialize(channel); -} -void TMC2160Impl::setENNPinState(bool state) { deviceIoService.tmc_ENN_pin_set_state(m_channel, state); }; -void TMC2160Impl::sleepus(int32_t us) { deviceIoService.sleepus(us); }; -void TMC2160Impl::readWriteArray(uint8_t *data, size_t length) { m_tmc4361->readWriteCover(data, length); }; -} // namespace iflytop \ No newline at end of file diff --git a/src/libtmcimpl.hpp b/src/libtmcimpl.hpp deleted file mode 100644 index b1eb381..0000000 --- a/src/libtmcimpl.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "libiflytop_micro/stm32/basic/basic.h" -#include "libtrinamic/src/ic/tmc2160.hpp" -#include "libtrinamic\src\ic\tmc4361A.hpp" -namespace iflytop { -using namespace std; -/** - * @brief 对接TMC4361和硬件的接口 - */ -class TMC4361AImpl : public TMC4361A { - protected: - virtual void setResetPinState(bool state); - virtual void setFREEZEPinState(bool state); - virtual void setENNPinState(bool state); - virtual bool getTargetReachedPinState(); - virtual void sleepus(int32_t us); - virtual void readWriteArray(uint8_t *data, size_t length); -}; -/** - * @brief 对接TMC2160和硬件的接口 - */ -class TMC2160Impl : public TMC2160 { - TMC4361A *m_tmc4361; - - public: - void initialize(uint8_t channel, TMC4361A *tmc4361); - - protected: - virtual void setENNPinState(bool state); - virtual void sleepus(int32_t us); - virtual void readWriteArray(uint8_t *data, size_t length); -}; -} // namespace iflytop \ No newline at end of file diff --git a/src/lncubator_temperature_control_service.cpp b/src/lncubator_temperature_control_service.cpp new file mode 100644 index 0000000..7d9f478 --- /dev/null +++ b/src/lncubator_temperature_control_service.cpp @@ -0,0 +1,129 @@ +#include "lncubator_temperature_control_service.hpp" +using namespace iflytop; +#define TAG "LTCS" + +const int LncubatorTemperatureControlService::m_compute_periodms = 1000; +const float LncubatorTemperatureControlService::m_error_limit = 50; +const float LncubatorTemperatureControlService::m_kp = 30; +const float LncubatorTemperatureControlService::m_ki = 1; +const float LncubatorTemperatureControlService::m_kd = 0; +const float LncubatorTemperatureControlService::m_max_output = 100; +const float LncubatorTemperatureControlService::m_min_output = -100; +const bool LncubatorTemperatureControlService::m_dumpvalue = false; + +void LncubatorTemperatureControlService::initialize(Hardware* hardware) { +#if 0 + pid_ctrl_config_t m_init_config; + pid_ctrl_block_handle_t m_pidblock; + IflytopMicroOS* m_os; + float m_nowoutput = 0; + bool m_workingState; +#endif + + m_init_config.init_param.kp = 30; + m_init_config.init_param.ki = 1; + m_init_config.init_param.kd = 0; + m_init_config.init_param.cal_type = PID_CAL_TYPE_POSITIONAL; + m_init_config.init_param.max_output = m_max_output; + m_init_config.init_param.min_output = m_min_output; + m_init_config.init_param.max_integral = m_error_limit; + m_init_config.init_param.min_integral = -m_error_limit; + + pid_new_control_block(&m_init_config, &m_pidblock); + ZASSERT(m_pidblock != NULL); + m_hardware = hardware; + m_nowoutput = 0; + + m_target_temperature = 25; + + m_periodicJobLastExecuteTicket = 0; +} + +void LncubatorTemperatureControlService::setTargetTemperature(int targetTemperature) { // + m_target_temperature = targetTemperature; +} +void LncubatorTemperatureControlService::setPidKp(float value) { + m_init_config.init_param.kp = value; + pid_update_parameters(m_pidblock, &m_init_config.init_param); +} +void LncubatorTemperatureControlService::setPidKi(float value) { + m_init_config.init_param.ki = value; + pid_update_parameters(m_pidblock, &m_init_config.init_param); +} +void LncubatorTemperatureControlService::setPidKd(float value) { + m_init_config.init_param.kd = value; + pid_update_parameters(m_pidblock, &m_init_config.init_param); +} + +void LncubatorTemperatureControlService::setPidParameters(float kp, float ki, float kd) { + m_init_config.init_param.kp = kp; + m_init_config.init_param.ki = ki; + m_init_config.init_param.kd = kd; + pid_update_parameters(m_pidblock, &m_init_config.init_param); +} +float LncubatorTemperatureControlService::getTemperature() { + float temperature[4]; + temperature[0] = m_hardware->tmp117[0].getTemperature(); + temperature[1] = m_hardware->tmp117[1].getTemperature(); + temperature[2] = m_hardware->tmp117[2].getTemperature(); + temperature[3] = m_hardware->tmp117[3].getTemperature(); + + float temperature_median = 0; + // 取温度的中位数 + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) { + if (temperature[i] > temperature[j]) { + float temp = temperature[i]; + temperature[i] = temperature[j]; + temperature[j] = temp; + } + } + } + temperature_median = (temperature[1] + temperature[2]) / 2; + return temperature_median; +} +void LncubatorTemperatureControlService::setPwmOutput(float output) { m_hardware->m_deviceIoService.peltier_set_pwm(output); } + +void LncubatorTemperatureControlService::start() { + pid_reset(m_pidblock); + /** + * @brief + * 启动时,之所以将积分极限积分,主要是因为正常使用时,温度基本上是从20度开始,加热过程中积分通常会累计到极限值, + * 同时为了方便确定当前PID参数是否正确,需要多次测试到达目标温度后,曲线是否稳定,但每次测试降低温度温度到室温 + * 很耽误时间,所以这里直接将积分拉满,这样就不需要降低温度就能测试PID参数了。 + */ + pid_set_integral_err(m_pidblock, m_error_limit); + m_workingState = true; +} +void LncubatorTemperatureControlService::stop() {} + +void LncubatorTemperatureControlService::periodicJob() { + if (!m_workingState) return; + if (m_hardware->m_os->hasPassedMS(m_periodicJobLastExecuteTicket) < m_compute_periodms) { + return; + } + m_periodicJobLastExecuteTicket = m_os->getTicket(); + + float current_temperature = getTemperature(); + float output = 0; + pid_compute(m_pidblock, m_target_temperature - current_temperature, &output); + pwmOutputFilter(output, &m_nowoutput); + if (m_dumpvalue) { + ZLOGI(TAG, "%.2f,%.2f,%.2f,%.2f", m_target_temperature, current_temperature, pid_get_integral_err(m_pidblock), m_nowoutput); + } + setPwmOutput(m_nowoutput); +} + +void LncubatorTemperatureControlService::pwmOutputFilter(float now, float* output) { + /** + * @brief 控制PWM输出最多以每次10的步进进行变化 + */ + if (now > *output) { + *output += 10; + if (*output > now) { + *output = now; + } + } else if (now < *output) { + *output = now; + } +} diff --git a/src/lncubator_temperature_control_service.hpp b/src/lncubator_temperature_control_service.hpp new file mode 100644 index 0000000..542af8e --- /dev/null +++ b/src/lncubator_temperature_control_service.hpp @@ -0,0 +1,55 @@ +#pragma once +#include "board/device_io_service.hpp" +#include "board\hardware.hpp" +#include "libiflytop_micro\stm32\basic\iflytop_micro_os.hpp" +#include "libiflytop_micro\stm32\component\pid\pid_ctrl.h" +#include "libiflytop_micro\stm32\component\tmp117\tmp117.hpp" +namespace iflytop { + +class LncubatorTemperatureControlService { + /******************************************************************************* + * Config * + *******************************************************************************/ + static const int m_compute_periodms; + static const float m_error_limit; + static const float m_kp; + static const float m_ki; + static const float m_kd; + static const float m_max_output; + static const float m_min_output; + static const bool m_dumpvalue; + + pid_ctrl_config_t m_init_config; + pid_ctrl_block_handle_t m_pidblock; + Hardware* m_hardware; + IflytopMicroOS* m_os; + float m_nowoutput; + bool m_workingState; + float m_target_temperature; + + uint32_t m_periodicJobLastExecuteTicket; + + public: + void initialize(Hardware* hardware); + + void setPidParameters(float kp, float ki, float kd); + void setPidKp(float value); + void setPidKi(float value); + void setPidKd(float value); + void setTargetTemperature(int targetTemperature); + + void start(); + void stop(); + + /** + * @brief 主循环中尽可能多的机会调用该方法 + */ + void periodicJob(); + + private: + void pwmOutputFilter(float now, float* output); + float getTemperature(); + void setPwmOutput(float output); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/src/project_board.hpp b/src/project_board.hpp index 82e08dd..9dd8c82 100644 --- a/src/project_board.hpp +++ b/src/project_board.hpp @@ -18,3 +18,5 @@ // 电机编号 #define MOTOR_1_TMC4361A_CHANNEL 1 #define MOTOR_1_TMC2160_CHANNEL 2 + +// \ No newline at end of file diff --git a/src/umain.cpp b/src/umain.cpp index 0706a76..b178d3c 100644 --- a/src/umain.cpp +++ b/src/umain.cpp @@ -1,18 +1,19 @@ #include #include -#include "device_io_service.hpp" +#include "board/device_io_service.hpp" +#include "board/libtmcimpl.hpp" #include "libiflytop_micro\stm32\basic\basic.h" -#include "libtmcimpl.hpp" #include "libtrinamic/src/ic/tmc2160.hpp" #include "libtrinamic\src\ic\tmc4361A.hpp" #include "project_board.hpp" // -#include "fan_state_monitor.hpp" +#include "board/hardware.hpp" #include "i2c.h" #include "libiflytop_micro\stm32\basic\zsignal.hpp" #include "libiflytop_micro\stm32\component\iflytop_can_slave_v1\iflytop_can_slave.hpp" #include "libiflytop_micro\stm32\component\tmp117\tmp117.hpp" +#include "lncubator_temperature_control_service.hpp" #define TAG "main" using namespace iflytop; @@ -21,13 +22,10 @@ class Main { public: signal_listener_t zsignal_listener[20]; - TMC4361AImpl tmc4361motor1; - TMC2160Impl tmc2160motor1; - TMP117 tmp117[4]; - IflytopCanSlave canSlaveService; - IflytopMicroOS *os; - - FanStateMonitor m_fanStateMonitor[6]; + LncubatorTemperatureControlService m_lncubatorTemperatureControlService; + Hardware m_hardware; + IflytopCanSlave *canSlaveService; + IflytopMicroOS *os; bool canOnRxDataFlag; @@ -35,110 +33,18 @@ class Main { ZSLOT0(Main, onCanRxData); void onCanRxData() { canOnRxDataFlag = true; - canSlaveService.deactivateRxIT(); + canSlaveService->deactivateRxIT(); } void initialize(); void main(int argc, char const *argv[]); - - void do_debug_light_state() { - static uint32_t lastprocess = 0; - if (sys_haspassedms(lastprocess) > 300) { - lastprocess = HAL_GetTick(); - HAL_GPIO_TogglePin(DEBUG_LIGHT_PORT, DEBUG_LIGHT_PIN); - } - } - - /******************************************************************************* - * 单元测试 * - *******************************************************************************/ - /** - * @brief 测试CAN的发送和接收 - */ - void testCanSlaveTxAndRx(); - void testTmp117(); }; void Main::initialize() { zsignal_init(zsignal_listener, ZARRAY_SIZE(zsignal_listener)); - os = &deviceIoService; - - /******************************************************************************* - * 帕尔贴初始化 * - *******************************************************************************/ - deviceIoService.peltier_init(); - - /******************************************************************************* - * 温度传感器初始化 * - *******************************************************************************/ - tmp117[0].initializate(&hi2c1, TMP117::ID0); - tmp117[1].initializate(&hi2c1, TMP117::ID1); - tmp117[2].initializate(&hi2c1, TMP117::ID2); - tmp117[3].initializate(&hi2c1, TMP117::ID3); - - /******************************************************************************* - * 电机初始化 * - *******************************************************************************/ - deviceIoService.tmc_init(); - deviceIoService.tmc_extern_clk_enable(); - // 4361初始化 - TMC4361AImpl::TMC4361AConfig_t *tmc4361aconfig = TMC4361AImpl::createDeafultTMC4361AConfig(); - tmc4361aconfig->base_config.fs_per_rev = 200; - tmc4361aconfig->encoder_config.diff_enc_in_disable = false; - tmc4361aconfig->encoder_config.enc_in_res = 4000; - tmc4361aconfig->close_loop_config.enable_closed_loop = true; - - tmc4361motor1.initialize(MOTOR_1_TMC4361A_CHANNEL, TMC4361A::IC_TMC2160, tmc4361aconfig); - tmc4361motor1.setMaximumAcceleration(300000); - tmc4361motor1.setMaximumDeceleration(300000); - - // 2160初始化 - tmc2160motor1.setMaximumCurrent(3); - tmc2160motor1.initialize(MOTOR_1_TMC2160_CHANNEL, &tmc4361motor1); - - HAL_Delay(100); - // 使能电机 - tmc4361motor1.enableIC(true); - tmc2160motor1.enableIC(true); - /** - * @brief 通过读取Version寄存器来判断芯片是否正常 - */ - int32_t ic4361Version = tmc4361motor1.readICVersion(); - int32_t ic2160Version = tmc2160motor1.readICVersion(); - // 期望 4361Version:2 ic2160Version:30 - ZLOGI(TAG, "TMC4361Version:%x TMC2160VERSION:%x", ic4361Version, ic2160Version); - if (ic4361Version != 2 || ic2160Version != 30) { - ZLOGE(TAG, "TMC4361 or TMC2160 is not normal"); - } - - /******************************************************************************* - * CANSLAVEService初始化 * - *******************************************************************************/ - IflytopCanSlave::iflytop_can_slave_config_t *config = canSlaveService.createDefaultConfig(DEVICE_ID); - canSlaveService.initialize(os, config); - canSlaveService.onCanRxData.connect(this, &Main::onCanRxData); - canSlaveService.activateRxIT(); - - /******************************************************************************* - * 风扇初始化 * - *******************************************************************************/ - deviceIoService.fanInit(1000); - /** - * @brief 风扇反馈初始化 - * - * FAN0_FB_INT PC1 - * FAN1_FB_INT PC4 - * FAN2_FB_INT PC5 - * FAN3_FB_INT PC6 - * FAN4_FB_INT PC7 - * FAN5_FB_INT PC10 - */ - - m_fanStateMonitor[0].initialize(os, GPIOC, GPIO_PIN_1, deviceIoService.fanGetPowerState(0)); - m_fanStateMonitor[1].initialize(os, GPIOC, GPIO_PIN_4, deviceIoService.fanGetPowerState(1)); - m_fanStateMonitor[2].initialize(os, GPIOC, GPIO_PIN_5, deviceIoService.fanGetPowerState(2)); - m_fanStateMonitor[3].initialize(os, GPIOC, GPIO_PIN_6, deviceIoService.fanGetPowerState(3)); - m_fanStateMonitor[4].initialize(os, GPIOC, GPIO_PIN_7, deviceIoService.fanGetPowerState(4)); - m_fanStateMonitor[5].initialize(os, GPIOC, GPIO_PIN_10, deviceIoService.fanGetPowerState(5)); + m_hardware.hardwareinit(); + canSlaveService = &m_hardware.canSlaveService; + canSlaveService->onCanRxData.connect(this, &Main::onCanRxData); + canSlaveService->activateRxIT(); } void Main::main(int argc, char const *argv[]) { @@ -147,16 +53,9 @@ void Main::main(int argc, char const *argv[]) { // port_peltier_set_pwm(0); initialize(); while (true) { - do_debug_light_state(); - // testCanSlaveTxAndRx(); - // testTmp117(); - - /** - * @brief 风扇状态监控服务周期调度 - */ - for (size_t i = 0; i < ZARRAY_SIZE(m_fanStateMonitor); i++) { - m_fanStateMonitor[i].periodicJob(); - } + m_hardware.periodicJob(); + // m_hardware.testCanSlaveTxAndRx(canOnRxDataFlag); + // m_hardware.testTmp117(); } } @@ -164,55 +63,6 @@ void Main::main(int argc, char const *argv[]) { * 单元测试 * *******************************************************************************/ -/** - * @brief 测试CAN的发送和接收 - */ -void Main::testCanSlaveTxAndRx() { - { - static uint32_t lastcall; - static uint8_t tx[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - if (os->hasPassedMS(lastcall) > 1000) { - lastcall = os->getTicket(); - canSlaveService.translate(0x01, tx, 8, 2); - if (canSlaveService.getLastTransmitStatus() == HAL_OK) { - ZLOGI(TAG, "send ok"); - } else { - ZLOGI(TAG, "send fail"); - } - } - } - - /** - * @brief 接收CAN消息 - */ - if (canOnRxDataFlag) { - canOnRxDataFlag = false; - static CAN_RxHeaderTypeDef packetHeader; - static uint8_t packetData[8]; - while (canSlaveService.getRxMessage(&packetHeader, packetData)) { - ZLOGI(TAG, "rx packet:"); - ZLOGI(TAG, "\tid:%x len:%d", packetHeader.StdId, packetHeader.DLC); - ZLOGI_HEX(TAG, packetData, packetHeader.DLC); - } - canSlaveService.activateRxIT(); - } -} - -void Main::testTmp117() { - static uint32_t lastcall; - if (os->hasPassedMS(lastcall) > 1000) { - lastcall = os->getTicket(); - for (size_t i = 0; i < 4; i++) { - float temp = tmp117[i].getTemperature(); - if (tmp117[i].getLastCallStatus() == HAL_OK) { - ZLOGI(TAG, "tmp117_%d:%f", i, temp); - } else { - ZLOGI(TAG, "tmp117_%d:read fail", i); - } - } - } -} - static Main mainObject; extern "C" { int umain(int argc, char const *argv[]) {