Matthew Kennedy
fcb9897443
resolve VVT phase using every tooth, not just sync point ( #4434 )
...
* resolve VVT phase using every tooth, not just sync point
* fix tests
* comment
* changelog
2022-08-12 08:08:23 -04:00
Matthew Kennedy
6267b8621a
big delete ICU ( #4270 )
...
* big delete
* icu vestiges
* changelog
2022-07-07 15:27:59 -04:00
Matthew Kennedy
88ff234c91
Injector scheduled by angle, not tooth index ( #4208 )
...
* trigger decoder returns a result
* TriggerFormDetails
* s
* don't reach out and touch the engine
* injection doesn't care about teeth
* fix up existing tests
* oh look, we can actually test this logic now without trying to depend on trigger shape!!!
* fix a real bug
* simplify
2022-06-24 17:43:23 -04:00
Matthew Kennedy
d5f1235a43
trigger tweaks cleanup ( #4278 )
...
* simplify some math
* we say yes to the todo
* and put back that test
* test
2022-06-23 23:11:29 -04:00
rusefi
dcde5cea9e
verbose trigger sync should reuse engineSnifferRpmThreshold #4259
...
docs
2022-06-18 14:44:21 -04:00
rusefi
514531bc5c
verbose trigger sync should reuse engineSnifferRpmThreshold #4259
...
reducing complexity
2022-06-18 14:17:36 -04:00
rusefillc
f3a5b027d9
more into "triggerinfo"
2022-06-17 22:10:48 -04:00
Matthew Kennedy
c2f61dc95f
Remove third trigger channel ( #4226 )
...
* remove third trigger
* clean up the honda mess
* there was nothing novel about this engine config
* include
* missed a few
* s
* x
* changelog
* don't set the third trigger input
* don't redefine the same thing 3 times
* only two inputs!
* test
2022-06-01 21:24:20 -04:00
Matthew Kennedy
56e7acd869
Trigger cleanup init ( #4222 )
...
* extra parameter
* name decoders in constructor
* s
2022-06-01 00:55:34 -04:00
Matthew Kennedy
54c339c0a4
remove trigger duty cycle calculation ( #4213 )
...
* This field was ignored.
* move pad out
* gone
* make trigger configuration a little clearer
* even simpler!
* format
* test fix
* remove duty cycle thing
2022-05-30 22:39:57 -04:00
Matthew Kennedy
b5d212dcd8
remove dead useOnlyFirstChannel ( #4211 )
...
* This field was ignored.
* move pad out
* gone
2022-05-30 07:03:40 -04:00
Matthew Kennedy
cf51533f45
More trigger encapsulation ( #4207 )
...
* trigger decoder returns a result
* TriggerFormDetails
* s
* don't reach out and touch the engine
2022-05-29 13:49:00 -04:00
Matthew Kennedy
6ea78efbe7
bail from trigger_central ( #4210 )
2022-05-29 10:42:08 -04:00
Matthew Kennedy
d85ed5f3c0
trigger decoder returns a result ( #4206 )
2022-05-28 09:01:45 -04:00
Matthew Kennedy
eb257b2335
12 tooth crank mode ( #4179 )
...
* 12 tooth crank
* comment
* s
* rusefi config
2022-05-17 21:38:24 -04:00
Matthew Kennedy
cf89b42716
move logic in to trigger decoder ( #4162 )
...
* move logic in to trigger decoder
* status loop
* minor cleanup
* s
2022-05-10 23:55:28 +03:00
Matthew Kennedy
b243d3fca0
TriggerState -> TriggerDecoder ( #4157 )
2022-05-10 11:41:39 +03:00
Matthew Kennedy
dede3f8215
phase resolution rpm limit ( #4156 )
2022-05-10 07:22:50 +03:00
Matthew Kennedy
55fdd3f3c7
encapsulate stuff properly ( #4154 )
2022-05-09 15:46:36 -04:00
rusefillc
394d1fe961
refactoring: bringing method names up to date
2022-05-08 09:04:27 -04:00
rusefillc
b2771f9b44
Remove value copy from controller into outputChannels #4095
2022-05-08 08:50:27 -04:00
Matthew Kennedy
83caf1ea1b
Brain pin is enum class ( #4108 )
...
* change most usages to Gpio::
* board configs
* engine configs etc
* isBrainPinValid, smart gpio
* generator
* generator
* generator
* connector yamls
* kinetis enums
* cypress txt
* kinetis config
* frankenso
* config generator
* actually do it for the others
* disable skips for pr ci
* fix tle8888
* misc
* weird cast from int
* needs this operator too
* this can be an unsigned subtract
* happy tests
* s
* kinetis isConfigurationChanged weirdness
* missed J/K
* cypress efifeatures
* build script mistake (!)
* mistake in smart gpio
* debounce
* eg33
* kinetis, so needy
* it's pretty green, we can skip these again
2022-04-28 17:32:39 -04:00
rusefillc
d1173219b6
Remove value copy from controller into outputChannels #4095
2022-04-23 19:53:05 -04:00
rusefillc
1ce5be5629
m_hasSynchronizedSymmetrical handling improvements #4099 ( #4101 )
2022-04-23 19:45:29 -04:00
rusefillc
8f1fb5dc0f
i will confess: i need to fit a debug build into discovery
2022-04-16 17:24:31 -04:00
Andrey
20dbc1ff82
Trigger setup in TS is highly confusing: hide operation mode from users? #4031
...
WOW it works?!
2022-04-03 02:30:43 -04:00
Andrey
6c69e55ea0
Trigger setup in TS is highly confusing: hide operation mode from users? #4031
2022-04-03 01:11:53 -04:00
rusefillc
9ae96ea7e5
refactoring: method rename
2022-04-02 21:01:29 -04:00
rusefillc
b555d9e82b
toothed previous time #4019
2022-03-21 20:41:09 -04:00
Andrey
fe790bee93
Mitsubishi 3A92 Support - 3 cylinder #4011
2022-03-19 22:24:50 -04:00
Andrey
8b5fdfa852
Mitsubishi 3A92 Support - 3 cylinder #4011
2022-03-19 22:11:51 -04:00
rusefillc
9d8c316aff
Remove Miata MX5 NB1 trigger fix #3488
2022-01-31 18:20:43 -05:00
rusefillc
22f679870a
Bosch Quick Start on B6 Passat is confused about phase #3812
...
running engine proved VVT_BOSCH_QUICK_START to match VVT_SECOND_HALF thus hard-coding phase choice
2022-01-19 01:30:16 -05:00
rusefillc
a4479259cf
Bosch Quick Start on B6 Passat is confused about phase #3812
...
OMG :( we were totally not using VVT info of VVT_BOSCH_QUICK_START and VVT_NISSAN_MR and etc etc
2022-01-19 00:48:39 -05:00
rusefillc
a2c71f07c6
refactoring: reusing existing flag instead of switch which refers to same thing
2022-01-19 00:48:39 -05:00
rusefillc
107eae67e0
docs
2021-12-29 16:18:21 -05:00
Matthew Kennedy
513187decc
remove vvtSyncTimeNt ( #3722 )
...
* s
* poke
* poke again for science
* kick for science
* kick
* kick
* comment kick
* s
* don't try to compare the array decay pointer to 0 (!)
* collateral damage
* adjust miata sync
* reset trigger states correctly on engine stop
* s
* check synchronized bit
* now we don't need it at all?!
* and *NOT* synced
* start VVT sync earlier
2021-12-28 00:00:26 -05:00
Matthew Kennedy
b392a7120e
improved noFiringUntilVvtSync logic ( #3696 )
...
* s
* poke
* poke again for science
* kick for science
* kick
* kick
* comment kick
* s
* don't try to compare the array decay pointer to 0 (!)
* collateral damage
* adjust miata sync
* reset trigger states correctly on engine stop
* s
* nissan MR too
2021-12-27 12:09:38 -05:00
Andrey
f5ead049c3
MAP phase sensing #3544
...
limiting to below cranking RPM limit
2021-12-11 02:56:19 -05:00
Matthew Kennedy
d6a0154f79
maybe more working MAP sampling ( #3689 )
...
* what if we do this
* cleanup
* s
* test
2021-12-11 03:01:28 -04:00
rusefillc
e7dec2a4b9
MAP phase sensing #3544
2021-12-09 22:16:42 -05:00
rusefillc
80c62ce888
MAP phase sensing #3544
...
gauge name fix
2021-12-08 12:44:43 -05:00
Andrey
b8a197d0f0
MAP phase sensing #3544
...
new implementation seems complete? 360 fix
2021-12-07 21:37:33 -05:00
Andrey
d3afd617d2
MAP phase sensing #3544
...
new implementation seems complete?
2021-12-07 21:08:25 -05:00
Andrey
d2c46b3310
Let's always have TS structure so that unit tests can check values in outputChannels, kind of making outputChannels a god dump for state but whatever since Live View is coming
2021-12-07 20:18:47 -05:00
Andrey
0f6c9e15c3
MAP phase sensing #3544
...
new implementation
2021-12-07 20:00:04 -05:00
rusefillc
ddbe875d98
MAP phase sensing #3544
...
trigger sync better gauges/logging
2021-12-06 17:04:05 -05:00
Matthew Kennedy
99367c8348
log actual tooth angle ( #3646 )
2021-12-02 19:22:33 -05:00
rusefillc
9ce37314c0
Engine phase wrap around in log #3645
...
refactoring & docs
2021-12-02 17:06:20 -05:00
rusefillc
2476fae92a
Engine phase wrap around in log #3645
...
refactoring & docs
2021-12-02 17:06:20 -05:00
rusefillc
37ed110750
how many more spelling mistakes?!
2021-12-02 01:06:40 -05:00
Matthew Kennedy
faf4801175
remove define_constructor ( #3640 )
...
* no define_constructor
* jar
* sim needs live doc
2021-11-30 19:31:54 -05:00
Matthew Kennedy
9bd8a19564
oh my god we've had no asserts ( #3595 )
2021-11-22 17:52:03 -05:00
Scott Smith
659cc68be1
Final cleanup of ENGINE macros ( #3567 )
...
Fix some uses of ENGINE() not detected by regex due to parenthesis.
Remove now empty engine_ptr.h
Don't worry about EFI_* not being defined, the compiler defaults to 0 if they aren't.
2021-11-17 13:45:10 -05:00
Scott Smith
80091498a6
Programmatically replace ENGINE() and CONFIG() with engine-> etc ( #3565 )
...
git grep -l -w ENGINE | xargs sed -i -r "s/ENGINE\(([]a-zA-Z_0-9.[]+)\)/engine->\1/g"
git grep -l -w CONFIG | xargs sed -i -r "s/([^a-zA-Z_])CONFIG\(([]a-zA-Z_0-9.[]+)\)/\1engineConfiguration->\2/g"
2021-11-17 03:54:21 -05:00
Scott Smith
dac2ae9b1d
Programmatically remove EnginePtr/inject, EXPAND_Engine, and WITH_ENGINE_TEST_HELPER* ( #3560 )
...
* Programmatically remove EnginePtr/inject, EXPAND_Engine, and WITH_ENGINE_TEST_HELPER*
for i in ": public EnginePtr " ", public EnginePtr" "EXPAND_Engine;" "EXPAND_Engine"; do
git grep -l "$i" | xargs sed -i "s/$i//g"
done
git grep -l "inject" | xargs sed -i "/inject[(][)]/d"
for i in WITH_ENGINE_TEST_HELPER_SENS WITH_ENGINE_TEST_HELPER_BOARD_CALLBACK WITH_ENGINE_TEST_HELPER; do
git grep -l "$i" | xargs sed -i "s/$i/EngineTestHelper eth/g"
done
git checkout firmware/controllers/core/engine_ptr.h
git checkout unit_tests/global.h
* Review fixups.
2021-11-16 16:52:11 -05:00
Matthew Kennedy
7296593448
remove engine pointer passing ( #3556 )
...
* some
* more
* more
* the last?!
2021-11-16 04:15:29 -05:00
Andrey
7b790d36f6
random refactoring: trigger central encapsulation
2021-11-15 20:22:05 -05:00
Matthew Kennedy
c1941f3a49
(void) -> () ( #3550 )
...
* static functions with (void)
* more
* Revert "more"
This reverts commit 246e53441f935451437df186ac92d7df26b62fb6.
* s
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-11-15 13:02:34 +01:00
Matthew Kennedy
bd04dc8352
less macro, more c++ ( #3549 )
...
* less macro
* s
2021-11-15 12:44:40 +01:00
rusefillc
29670184e2
script settings need names!
2021-11-13 22:47:46 -05:00
rusefillc
5ddd516860
refactoring - magic constant bad
2021-11-07 00:09:17 -04:00
Matthew Kennedy
f45d365f24
log current engine phase on trigger teeth ( #3471 )
...
* log phase on trigger teeth
* ui
* guard
2021-11-05 20:02:15 -04:00
Matthew Kennedy
cadaf2a801
extract engine phase function ( #3456 )
...
* extract getCurrentEnginePhase
* inject engine ref
* never invalid RPM, use 0 instead
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-11-04 05:46:16 -04:00
rusefillc
a2f1cd2467
Override trigger gaps feature #2734
2021-10-30 10:45:32 -04:00
Andrey
1685ec95cf
Honda K cam wheels #3405
2021-10-28 19:26:59 -04:00
Andrey
965333e410
dead magic macro
2021-10-28 19:18:50 -04:00
rusefi
74d302ad50
VVT to be reported after primary
2021-10-28 16:46:54 -04:00
Andrey
68c1995044
Honda K cam wheels #3405
2021-10-28 13:49:54 -04:00
Andrey
94b5b3a089
Honda K cam wheels #3405
2021-10-28 11:40:31 -04:00
Andrey
5527f77589
Honda K cam wheels #3405
2021-10-28 10:36:41 -04:00
Andrey
5fcb2f75a5
refactoring: extracting method to improve readability
2021-10-28 10:30:05 -04:00
rusefillc
61af92bb25
progress
2021-10-24 15:30:17 -04:00
rusefi
4dd1ae7035
triggerinfo progress
2021-10-23 19:01:31 -04:00
rusefillc
bee1eb2c6b
very old very dead code
2021-10-20 10:38:36 -04:00
rusefillc
fec25e0a39
Nick has RPM spikes and engine hiccups #3269
2021-10-03 01:48:34 -04:00
rusefillc
46e6e621da
reduce chance of invalid CAM setting fix #3105
2021-08-03 22:15:40 -04:00
Matthew Kennedy
d3ec2b21d1
Use pch in lots of files ( #3066 )
...
* most engine.h
* most engine_configuration
* more
* more
* more
* more
* more
* moooooore
* ok I'm done for now
* oops
2021-07-26 01:05:17 -04:00
Andrey
e8aef0dcd3
VVT position of first cam is off on first cycle fix #2987
2021-07-22 01:02:37 -04:00
Matthew Kennedy
e3849b95d5
don't require EXTERN_ENGINE in every file ( #2969 )
...
* move enginePins
* no more extern engine
* uses
* more
* extern config too
* put this where it belongs
* include correct header
* merge
2021-07-16 18:13:33 -04:00
Andrey
64d95dd5aa
trigger signal debug pins - logic level output #2959
2021-07-16 17:18:03 -04:00
Andrey
cbbfce2123
trigger signal debug pins - logic level output #2959
2021-07-16 16:42:26 -04:00
rusefi
c5399a4632
FATAL on NB2 tune jim stim input signal fix #2965
2021-07-14 21:18:05 -04:00
Andrey
d93cece1dc
FATAL on NB2 tune jim stim input signal #2965
2021-07-14 16:05:53 -04:00
Andrey
47f285c50c
FATAL on NB2 tune jim stim input signal #2965
2021-07-14 16:03:00 -04:00
Andrey
8814476f8b
trigger signal debug pins - logic level output #2959
2021-07-13 20:33:27 -04:00
Andrey
564c380851
trigger signal debug pins - logic level output #2959
2021-07-13 20:15:55 -04:00
Andrey
b3f33a1249
trigger signal debug pins - logic level output #2959
2021-07-13 18:16:32 -04:00
Matthew Kennedy
ff9c14c239
fix vvt indication ( #2926 )
...
* wrap logic
* rename gauges
* names and ranges
* binary log
* we actually don't need that warning
* values auto wrap
* values auto wrap
* bye warnings
* comparison
2021-07-12 16:29:07 -04:00
Andrey
3759028a32
unit tests pass on Linux fail on Windows fix #2902
...
reducing code duplication
2021-07-05 23:51:13 -04:00
Andrey
bb181ac8fd
Nissan VVT trigger decoder #2887
...
another bug - improper handling of three-times-symmetrical
2021-07-05 23:15:44 -04:00
Andrey
7ec3ef4b28
Nissan VVT trigger decoder #2887
...
that's all very strange
2021-07-05 22:17:26 -04:00
Andrey
59e33b3577
restore testQuadCam #2911
2021-07-05 21:04:09 -04:00
rusefi
de750354a2
Nissan progress!!!
2021-07-05 20:29:49 -04:00
Andrey
f8d5e3f51b
Nissan
2021-07-05 18:43:39 -04:00
rusefillc
e223ff4d9e
Nissan
2021-07-05 18:38:34 -04:00
Andrey
4c19e22237
Nissan VVT trigger decoder #2887
...
one step back
2021-07-03 12:42:07 -04:00
Andrey
fb7639f347
Nissan VVT trigger decoder #2887
2021-07-03 12:26:31 -04:00
Andrey
e34b04bd46
Nissan VVT trigger decoder #2887
2021-07-03 12:02:00 -04:00
Andrey
2ad22a262b
Nissan VVT trigger decoder #2887
2021-07-03 11:08:22 -04:00
Andrey
9ad5ec8044
refactoring: getShaftSynchronized
2021-07-03 10:37:03 -04:00
Andrey
26fdfb1ab6
Nissan VVT trigger decoder #2887
2021-07-03 10:15:41 -04:00
Andrey
f3ffecbc2b
Nissan VVT trigger decoder #2887
2021-07-03 09:43:27 -04:00
Andrey
cd4842f2b8
Nissan VVT trigger decoder #2887
2021-07-02 20:28:15 -04:00
Andrey
9339f0169d
Nissan progress
2021-07-02 20:12:31 -04:00
Andrey
4e18c2a0ae
todo: vvt
2021-07-02 19:06:07 -04:00
Matthew Kennedy
ee6f49e65f
Consolidate hwHandleShaftSignal ( #2875 )
...
* consolidate trigger input
* merge functions
* comment
* dead
* hw vs. not hw
* stray comma
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-06-28 10:06:22 -04:00
Andrey
8185eb2de3
refactoring maybe making code reuse more possible in the future
2021-06-27 13:00:01 -04:00
Andrey
083a2e12f9
depressing code comment
2021-06-26 23:01:47 -04:00
Andrey
738b03b63e
refactoring - crankDivider etc etc
2021-06-26 22:42:53 -04:00
Andrey
4627707e1c
refactoring - explicit read method
2021-06-26 22:17:07 -04:00
Matthew Kennedy
95f9e949a5
fix trigger changed logic ( #2860 )
...
* reenable
* fix
* longer interval between updates
* only deinit hard trigger outputs if necessary
* init logic
* init order
* warning
* guard
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-06-25 19:38:42 -04:00
Andrey
742935567b
Trigger: warning code on normal engine start up #669
...
making more code unit-testable
2021-06-25 11:30:06 -04:00
Andrey
f567c764ab
giving unit tests a chance to use tdcMarkCallback
2021-06-25 01:31:53 -04:00
rusefillc
68d2fdb6ce
https://rusefi.com/forum/viewtopic.php?f=16&t=2027
2021-05-27 05:50:59 -04:00
Andrey
9865b04bf7
Override trigger gaps feature #2734
2021-05-23 20:52:18 -04:00
Andrey
765d229efb
Override trigger gaps feature #2734
2021-05-23 19:58:03 -04:00
rusefillc
99059ef846
https://rusefi.com/forum/viewtopic.php?f=16&t=1996
2021-04-25 09:34:40 -04:00
rusefillc
87e0b28cc4
https://rusefi.com/forum/viewtopic.php?f=16&t=1996
2021-04-25 09:18:35 -04:00
rusefi
7300bbe750
improving QC process
2021-04-23 00:45:36 -04:00
rusefi
be0f2210c5
improving QC process
2021-04-22 21:23:20 -04:00
Matthew Kennedy
5f0791f9fb
Destroy all shared logger ( #2574 )
...
* most of shared logger
* a few more
* one more
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-04-21 14:28:48 -04:00
Matthew Kennedy
737ee444b8
rip the bandaid: find-replace most of scheduleMsg ( #2572 )
...
* biiiig find replace
* more trivial find replace
* pwm
* almost all of them
* few more
* gpio
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-04-21 12:53:13 -04:00
rusefillc
ffe845ab1a
CUSTOM_ERR_VVT_OUT_OF_RANGE warning false-positive fix #2534
2021-04-08 14:39:26 -04:00
rusefillc
a9e822f790
'displayLogicLevelsInEngineSniffer' on VVT input reports too much into engine sniffer fix #2528
2021-04-04 23:12:07 -04:00
rusefillc
f8aa71bf63
refactoring
2021-04-04 23:03:51 -04:00
rusefillc
181db048fe
todo?
2021-04-04 22:05:55 -04:00
Andrey G
5fda278503
hip9011: get callback from spark on each cylinder ( #2499 )
...
* hip9011: get callback from spark on each cylinder
* hip9011: cleanup unused
2021-03-27 14:12:49 -04:00
Matthew Kennedy
4e1d30f86d
plumbing for multiple vvt ( #2488 )
...
* plumb multiple vvt
* fix test
* s
* fix barra while we're at it
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-03-25 07:39:23 -04:00
Matthew Kennedy
db7856523c
barra vvt cam pattern ( #2483 )
...
* barra vvt cam pattern
* two tooth sync
* I think this needs to be here too
2021-03-22 07:48:29 -04:00
Matthew Kennedy
c168c748ea
dead code, warnings ( #2461 )
2021-03-15 10:23:19 -04:00
Matthew Kennedy
abdce83190
virtual zero timer ( #2426 )
...
* virtual zero timer
* it would help to call the correct function
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-03-07 15:32:41 -05:00
rusefillc
654a739e6b
M62T vanos support #2243
2021-02-08 22:21:02 -05:00
rusefillc
8fa1a6530b
M62T vanos support #2243
2021-02-08 21:50:31 -05:00
rusefi
d39b285834
M62T vanos support #2243
2021-02-08 21:28:57 -05:00
rusefi
1012b61e02
M62T vanos support #2243
2021-02-08 20:38:38 -05:00
rusefi
2ccb75a064
refactoring: naming consistency
2021-02-08 18:20:53 -05:00
rusefillc
7fb7cc6679
extracting runtime state from trigger central
2021-01-31 22:41:17 -05:00
rusefillc
11aa253ae9
vvt/cam events to pass index
2021-01-31 22:24:45 -05:00
rusefillc
aa24ba3068
M62T vanos support #2243
2021-01-26 22:54:25 -05:00
rusefillc
c0e9d2914b
M62T vanos support #2243
2021-01-26 21:43:23 -05:00
rusefillc
9ce59f5da4
M62T vanos support #2243
2021-01-26 21:16:47 -05:00
Matthew Kennedy
56b4d87fcd
generate triggers.txt from parametric test ( #2186 )
...
* add new test
* comment
* remove old
* main cleanup
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2021-01-05 17:58:34 -05:00
Matthew Kennedy
279f8bad03
use limp mgr for trigger disable ( #2145 )
...
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
2020-12-26 18:12:36 -05:00
rusefillc
1d434336f8
VR_HW_CHECK_MODE
2020-12-21 13:33:09 -05:00
rusefi
9194323b5d
proteus_f4_hardware_QC_special_build
2020-12-20 11:17:38 -05:00
rusefillc
47db5d0d99
clang warnings again #2055
2020-12-11 10:33:00 -05:00
rusefillc
4072db3052
trigger lifecycle
2020-12-09 12:19:25 -05:00
rusefillc
59e4e3187b
all triggers should be documented way nicer #2001
2020-12-04 11:58:26 -05:00
rusefillc
9a897007c4
FORD ST170 CAM TRIGGER PATTERN fix #2009
2020-12-03 23:54:08 -05:00