EncoderTool

@luni I can report that the encoders for my DRO's and for the spindle are working great. Is there any chance that your library gets updated?

I have completed my Electronic Lead Screw project, save for some cable clamps. Of course I will add more features, but it is very usable as is. In the first photo I cut a 5/8"-11 TPI thread in steel using the ELS. (15.875mm 2.3091 mm pitch) The ELS does 25 imperial threads, 24 metric threads, and feeds in imperial and metric. I can add more, it just needs updating of some tables. Does right handed and left handed threading. Next feature I will add feed to a stop. Still thinking about partial automation of threading. I think this project came out pretty well. Started on this 1 May 2022. Finished the box for the ILI9341 display and the Teensy 4.1 last week. Had to learn 3D CAD, PCB Design SW, all about the Teensy, learn about 3D printing, and do a bit of machining to get it all done. Was a bit of a workout!

PXL_20221124_005857428_1024.jpgPXL_20221123_222001884_1024.jpg
 
Sure, give me a few days, I want to change the callback system as well in this release.

Thanks! You know, I think you could add a use case to your github description of decoding quadrature encoders, like DRO's and rotary spindle encoders. This has been working quite well for me. No, I can't use it for very high RPM, but in the 0-2000 RPM region it works very, very well. 136K interrupts per second! (2000 Rev/Min x 1min/60sec * 4096 counts/1 rev = 136533 counts/second)
 
@luni, just checking in. I have been using your test EncoderTool repo for a while. I'd like to release my software and let someone else compile it. Have you merged the test repo with main yet? In a few days, I'd like to ship an ELS to my first customer. Would be nice to be able for him to rebuild the software using standard libraries. Once I get his ELS working and debugged on his lathe, I'd like to open source my code.

ELS #2 has passed all of the on lathe tests. Stepper, encoder, and DRO's all work. Only errors were my hand wiring errors inside the box! Strange thing is I made the same wiring errors the first time I built it. Oops.
 
@luni I'm working with IDE2 now. This seemed to have broken a few things. I installed EncoderTool 3.0.6.

Code:
Encoder_tpl<int64_t> SpindleEnc;
doesn't work. The Compilation error is: "Encoder_tpl" does not name a type. How do I use declare an instance of Encoder now?

Will this construct work for callbacks?
Code:
void onEncoderChanged(int64_t value, int64_t delta)
{
}
This has broken my code, so it would be nice to fix up. :)
 
Looks like you are using an old version? 3.1.0 is the latest on GitHub. Can you try this version?
 
I just cloned EncoderTool. I'm getting a bunch of errors.
Code:
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:107:15: error: previous definition of 'union stdext::inplace_function_detail::aligned_storage_helper<Cap>'
         union aligned_storage_helper

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:130:81: note: original definition appeared here
         template <size_t Cap, size_t Align = alignof(aligned_storage_helper<Cap>)>
                                                                                 ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:149:16: error: previous definition of 'struct stdext::inplace_function_detail::wrapper<T>'
         struct wrapper
                ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:155:16: error: previous definition of 'struct stdext::inplace_function_detail::vtable<R, Args>'
         struct vtable
                ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:205:8: error: previous definition of 'struct stdext::inplace_function_detail::is_valid_inplace_dst<DstCap, DstAlign, SrcCap, SrcAlign>'
 struct is_valid_inplace_dst : std::true_type
        ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:220:8: error: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl< <template-parameter-1-1>, R, F, Args>'
 struct is_invocable_r_impl : std::false_type
        ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:225:8: error: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype ((declval<F>()((declval<Args>)()...), void())), void, F, Args ...>'
 struct is_invocable_r_impl<
        ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:234:8: error: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype ((declval<F>()((declval<Args>)()...), void())), const void, F, Args ...>'
 struct is_invocable_r_impl<
        ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:243:8: error: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype (accept<R>(declval<F>()((declval<Args>)()...))), R, F, Args ...>'
 struct is_invocable_r_impl<
        ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:261:49: note: original definition appeared here
     size_t Capacity  = inplace_function_detail::InplaceFunctionDefaultCapacity,
                                                 ^

In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26:0,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:268:12: error: previous definition of 'struct stdext::inplace_function_detail::is_inplace_function< <template-parameter-1-1> >'
     struct is_inplace_function : std::false_type
            ^
I don't know what is going on. Getting a lot of similar errors with TeensyTimerTool. However, let's solve one at a time!

I am using IDE2 for the first time. It has been a rocky transition. The compiler seems a lot stricter in IDE2 than 1.
 
Actually, I don't use IDE2 currently (using VisualTeensy and/or PlatformIO). I'll install it later today and see what is going wrong.
Edit: are you using the TimerTool and the EncoderTool in the same project?
 
Actually, I don't use IDE2 currently (using VisualTeensy and/or PlatformIO). I'll install it later today and see what is going wrong.
Edit: are you using the TimerTool and the EncoderTool in the same project?

Yes I am. Are the incompatible now? They used to work great together under 1.8.19.
I changed to 0.58.3, with EncoderTool at 3.1.0 and TeensyTimerTool at 1.2.0 and I am getting all sorts of errors

Code:
In file included from /home/bruce/Arduino/libraries/ILI9341_fonts-master/font_DroidSansMono.h:4,
                 from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:5,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/.arduino15/packages/teensy/hardware/avr/0.58.3/libraries/ILI9341_t3/ILI9341_t3.h:176: warning: "ILI9341_SPICLOCK" redefined
  176 | #define ILI9341_SPICLOCK 30000000
      | 
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:253: note: this is the location of the previous definition
  253 | #define ILI9341_SPICLOCK 30000000u
      | 
In file included from /home/bruce/Arduino/libraries/ILI9341_fonts-master/font_DroidSansMono.h:4,
                 from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:5,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/.arduino15/packages/teensy/hardware/avr/0.58.3/libraries/ILI9341_t3/ILI9341_t3.h:177: warning: "ILI9341_SPICLOCK_READ" redefined
  177 | #define ILI9341_SPICLOCK_READ 6500000
      | 
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:254: note: this is the location of the previous definition
  254 | #define ILI9341_SPICLOCK_READ 2000000
      | 
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:10:13: error: redefinition of 'void panic()'
   10 | inline void panic() // could be weak to be overriden by a user error handler?
      |             ^~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:10:13: note: 'void panic()' previously defined here
   10 | inline void panic() // could be weak to be overriden by a user error handler?
      |             ^~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:100:33: error: redefinition of 'constexpr const size_t stdext::inplace_function_detail::InplaceFunctionDefaultCapacity'
  100 |         static constexpr size_t InplaceFunctionDefaultCapacity = 32;
      |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:100:33: note: 'constexpr const size_t stdext::inplace_function_detail::InplaceFunctionDefaultCapacity' previously defined here
  100 |         static constexpr size_t InplaceFunctionDefaultCapacity = 32;
      |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:107:15: error: redefinition of 'union stdext::inplace_function_detail::aligned_storage_helper<Cap>'
  107 |         union aligned_storage_helper
      |               ^~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:107:15: note: previous definition of 'union stdext::inplace_function_detail::aligned_storage_helper<Cap>'
  107 |         union aligned_storage_helper
      |               ^~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:131:16: error: redefinition of default argument for 'unsigned int Align'
  131 |         struct aligned_storage
      |                ^~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:130:81: note: original definition appeared here
  130 |         template <size_t Cap, size_t Align = alignof(aligned_storage_helper<Cap>)>
      |                                                                                 ^
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:149:16: error: redefinition of 'struct stdext::inplace_function_detail::wrapper<T>'
  149 |         struct wrapper
      |                ^~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:149:16: note: previous definition of 'struct stdext::inplace_function_detail::wrapper<T>'
  149 |         struct wrapper
      |                ^~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:155:16: error: redefinition of 'struct stdext::inplace_function_detail::vtable<R, Args>'
  155 |         struct vtable
      |                ^~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:155:16: note: previous definition of 'struct stdext::inplace_function_detail::vtable<R, Args>'
  155 |         struct vtable
      |                ^~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:202:9: error: redefinition of 'template<class R, class ... Args> stdext::inplace_function_detail::vtable<R, Args ...> stdext::inplace_function_detail::empty_vtable'
  202 |         empty_vtable{};
      |         ^~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:202:9: note: 'template<class R, class ... Args> stdext::inplace_function_detail::vtable<R, Args ...> stdext::inplace_function_detail::empty_vtable<R, Args ...>' previously declared here
  202 |         empty_vtable{};
      |         ^~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:205:8: error: redefinition of 'struct stdext::inplace_function_detail::is_valid_inplace_dst<DstCap, DstAlign, SrcCap, SrcAlign>'
  205 | struct is_valid_inplace_dst : std::true_type
      |        ^~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:205:8: note: previous definition of 'struct stdext::inplace_function_detail::is_valid_inplace_dst<DstCap, DstAlign, SrcCap, SrcAlign>'
  205 | struct is_valid_inplace_dst : std::true_type
      |        ^~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:220:8: error: redefinition of 'struct stdext::inplace_function_detail::is_invocable_r_impl< <template-parameter-1-1>, R, F, Args>'
  220 | struct is_invocable_r_impl : std::false_type
      |        ^~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:220:8: note: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl< <template-parameter-1-1>, R, F, Args>'
  220 | struct is_invocable_r_impl : std::false_type
      |        ^~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:225:8: error: redefinition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype ((declval<F>()((declval<Args>)()...), void())), void, F, Args ...>'
  225 | struct is_invocable_r_impl<
      |        ^~~~~~~~~~~~~~~~~~~~
  226 |     decltype(std::declval<F>()(std::declval<Args>()...), void()),
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  227 |     void,
      |     ~~~~~
  228 |     F,
      |     ~~  
  229 |     Args...> : std::true_type
      |     ~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:225:8: note: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype ((declval<F>()((declval<Args>)()...), void())), void, F, Args ...>'
  225 | struct is_invocable_r_impl<
      |        ^~~~~~~~~~~~~~~~~~~~
  226 |     decltype(std::declval<F>()(std::declval<Args>()...), void()),
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  227 |     void,
      |     ~~~~~
  228 |     F,
      |     ~~  
  229 |     Args...> : std::true_type
      |     ~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:234:8: error: redefinition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype ((declval<F>()((declval<Args>)()...), void())), const void, F, Args ...>'
  234 | struct is_invocable_r_impl<
      |        ^~~~~~~~~~~~~~~~~~~~
  235 |     decltype(std::declval<F>()(std::declval<Args>()...), void()),
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  236 |     const void,
      |     ~~~~~~~~~~~
  237 |     F,
      |     ~~  
  238 |     Args...> : std::true_type
      |     ~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:234:8: note: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype ((declval<F>()((declval<Args>)()...), void())), const void, F, Args ...>'
  234 | struct is_invocable_r_impl<
      |        ^~~~~~~~~~~~~~~~~~~~
  235 |     decltype(std::declval<F>()(std::declval<Args>()...), void()),
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  236 |     const void,
      |     ~~~~~~~~~~~
  237 |     F,
      |     ~~  
  238 |     Args...> : std::true_type
      |     ~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:243:8: error: redefinition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype (accept<R>(declval<F>()((declval<Args>)()...))), R, F, Args ...>'
  243 | struct is_invocable_r_impl<
      |        ^~~~~~~~~~~~~~~~~~~~
  244 |     decltype(accept<R>(std::declval<F>()(std::declval<Args>()...))),
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  245 |     R,
      |     ~~  
  246 |     F,
      |     ~~  
  247 |     Args...> : std::true_type
      |     ~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:243:8: note: previous definition of 'struct stdext::inplace_function_detail::is_invocable_r_impl<decltype (accept<R>(declval<F>()((declval<Args>)()...))), R, F, Args ...>'
  243 | struct is_invocable_r_impl<
      |        ^~~~~~~~~~~~~~~~~~~~
  244 |     decltype(accept<R>(std::declval<F>()(std::declval<Args>()...))),
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  245 |     R,
      |     ~~  
  246 |     F,
      |     ~~  
  247 |     Args...> : std::true_type
      |     ~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:263:7: error: redefinition of default argument for 'unsigned int Capacity'
  263 | class inplace_function; // unspecified
      |       ^~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:261:49: note: original definition appeared here
  261 |     size_t Capacity  = inplace_function_detail::InplaceFunctionDefaultCapacity,
      |                                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:268:12: error: redefinition of 'struct stdext::inplace_function_detail::is_inplace_function< <template-parameter-1-1> >'
  268 |     struct is_inplace_function : std::false_type
      |            ^~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:268:12: note: previous definition of 'struct stdext::inplace_function_detail::is_inplace_function< <template-parameter-1-1> >'
  268 |     struct is_inplace_function : std::false_type
      |            ^~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:272:12: error: redefinition of 'struct stdext::inplace_function_detail::is_inplace_function<stdext::inplace_function<Sig, Cap, Align> >'
  272 |     struct is_inplace_function<inplace_function<Sig, Cap, Align>> : std::true_type
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:272:12: note: previous definition of 'struct stdext::inplace_function_detail::is_inplace_function<stdext::inplace_function<Sig, Cap, Align> >'
  272 |     struct is_inplace_function<inplace_function<Sig, Cap, Align>> : std::true_type
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/TeensyTimerTool/src/types.h:9,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/ITimerChannel.h:3,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/baseTimer.h:5,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/API/oneShotTimer.h:4,
                 from /home/bruce/Arduino/libraries/TeensyTimerTool/src/TeensyTimerTool.h:3,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:15,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/TeensyTimerTool/src/inplace_function.h:282:7: error: redefinition of 'class stdext::inplace_function<R(Args ...), Capacity, Alignment>'
  282 | class inplace_function<R(Args...), Capacity, Alignment>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/EncoderTool/src/config.h:26,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderBase.h:6,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlexBase.h:3,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/Multiplexed/EncPlex74165.h:7,
                 from /home/bruce/Arduino/libraries/EncoderTool/src/EncoderTool.h:8,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:14,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/EncoderTool/src/inplace_function.h:282:7: note: previous definition of 'class stdext::inplace_function<R(Args ...), Capacity, Alignment>'
  282 | class inplace_function<R(Args...), Capacity, Alignment>
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/ILI9341_fonts-master/font_DroidSansMono.h:4,
                 from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:5,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/.arduino15/packages/teensy/hardware/avr/0.58.3/libraries/ILI9341_t3/ILI9341_t3.h:170:3: error: conflicting declaration 'typedef struct ILI9341_t3_font_t ILI9341_t3_font_t'
  170 | } ILI9341_t3_font_t;
      |   ^~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:108,
                 from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_fonts.h:25:3: note: previous declaration as 'typedef struct ILI9341_t3_font_t ILI9341_t3_font_t'
   25 | } ILI9341_t3_font_t;
      |   ^~~~~~~~~~~~~~~~~
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:1166:29: error: redefinition of 'class ILI9341_Button'
 1166 | #define Adafruit_GFX_Button ILI9341_Button
      |                             ^~~~~~~~~~~~~~
/home/bruce/.arduino15/packages/teensy/hardware/avr/0.58.3/libraries/ILI9341_t3/ILI9341_t3.h:560:7: note: in expansion of macro 'Adafruit_GFX_Button'
  560 | class Adafruit_GFX_Button {
      |       ^~~~~~~~~~~~~~~~~~~
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:1167:7: note: previous definition of 'class ILI9341_Button'
 1167 | class ILI9341_Button {
      |       ^~~~~~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/DRO.ino: In function 'void updateZ()':
/home/bruce/Arduino/ELS_IDE2/DRO.ino:23:43: warning: invalid conversion from 'uint16_t*' {aka 'short unsigned int*'} to 'int16_t*' {aka 'short int*'} [-fpermissive]
   23 |     tft.getTextBounds(newstr, cxgZ, cygZ, &x1, &y1, &w, &h);
      |                                           ^~~
      |                                           |
      |                                           uint16_t* {aka short unsigned int*}
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:470:72: note:   initializing argument 4 of 'void ILI9341_t3n::getTextBounds(const String&, int16_t, int16_t, int16_t*, int16_t*, uint16_t*, uint16_t*)'
  470 |   void getTextBounds(const String &str, int16_t x, int16_t y, int16_t *x1,
      |                                                               ~~~~~~~~~^~
/home/bruce/Arduino/ELS_IDE2/DRO.ino:23:48: warning: invalid conversion from 'uint16_t*' {aka 'short unsigned int*'} to 'int16_t*' {aka 'short int*'} [-fpermissive]
   23 |     tft.getTextBounds(newstr, cxgZ, cygZ, &x1, &y1, &w, &h);
      |                                                ^~~
      |                                                |
      |                                                uint16_t* {aka short unsigned int*}
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:471:31: note:   initializing argument 5 of 'void ILI9341_t3n::getTextBounds(const String&, int16_t, int16_t, int16_t*, int16_t*, uint16_t*, uint16_t*)'
  471 |                      int16_t *y1, uint16_t *w, uint16_t *h);
      |                      ~~~~~~~~~^~
/home/bruce/Arduino/ELS_IDE2/DRO.ino: In function 'void updateX()':
/home/bruce/Arduino/ELS_IDE2/DRO.ino:72:43: warning: invalid conversion from 'uint16_t*' {aka 'short unsigned int*'} to 'int16_t*' {aka 'short int*'} [-fpermissive]
   72 |     tft.getTextBounds(newstr, cxgX, cygX, &x1, &y1, &w, &h);
      |                                           ^~~
      |                                           |
      |                                           uint16_t* {aka short unsigned int*}
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:470:72: note:   initializing argument 4 of 'void ILI9341_t3n::getTextBounds(const String&, int16_t, int16_t, int16_t*, int16_t*, uint16_t*, uint16_t*)'
  470 |   void getTextBounds(const String &str, int16_t x, int16_t y, int16_t *x1,
      |                                                               ~~~~~~~~~^~
/home/bruce/Arduino/ELS_IDE2/DRO.ino:72:48: warning: invalid conversion from 'uint16_t*' {aka 'short unsigned int*'} to 'int16_t*' {aka 'short int*'} [-fpermissive]
   72 |     tft.getTextBounds(newstr, cxgX, cygX, &x1, &y1, &w, &h);
      |                                                ^~~
      |                                                |
      |                                                uint16_t* {aka short unsigned int*}
In file included from /home/bruce/Arduino/ELS_IDE2/touchdisplay.h:2,
                 from /home/bruce/Arduino/ELS_IDE2/ELS.h:16,
                 from /home/bruce/Arduino/ELS_IDE2/ELS_IDE2.ino:1:
/home/bruce/Arduino/libraries/ILI9341_t3n-master/src/ILI9341_t3n.h:471:31: note:   initializing argument 5 of 'void ILI9341_t3n::getTextBounds(const String&, int16_t, int16_t, int16_t*, int16_t*, uint16_t*, uint16_t*)'
  471 |                      int16_t *y1, uint16_t *w, uint16_t *h);
      |                      ~~~~~~~~~^~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino: In function 'void displayScreen0(bool, float, bool)':
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:106:58: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  106 |         textcolor = ILI9341_BLACK;  char * boxText[2] = {"TPI", "mm"};
      |                                                          ^~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:106:65: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  106 |         textcolor = ILI9341_BLACK;  char * boxText[2] = {"TPI", "mm"};
      |                                                                 ^~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:117:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  117 |           char * boxText1[2] = {"in", "mm"};
      |                                 ^~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:117:39: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  117 |           char * boxText1[2] = {"in", "mm"};
      |                                       ^~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:140:58: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  140 |         textcolor = ILI9341_BLACK;  char * boxText[2] = {"Thread", "Feed"};
      |                                                          ^~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:140:68: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  140 |         textcolor = ILI9341_BLACK;  char * boxText[2] = {"Thread", "Feed"};
      |                                                                    ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:152:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  152 |         char * buttonText[1] = {"Setup"};   char **mytext = buttonText;
      |                                 ^~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:161:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  161 |         char * buttonText[1] = {"Start"};   char **mytext = buttonText;
      |                                 ^~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:170:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  170 |         char * buttonText[1] = {"Stop"};  char **mytext = buttonText;
      |                                 ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:179:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  179 |         char * buttonText[2] = {"RightHand", "LeftHand"};   char **mytext = buttonText;
      |                                 ^~~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:179:46: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  179 |         char * buttonText[2] = {"RightHand", "LeftHand"};   char **mytext = buttonText;
      |                                              ^~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:198:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  198 |         char * buttonText[1] = {"Clear Z"};   char **mytext = buttonText;
      |                                 ^~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:207:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  207 |         char * buttonText[1] = {"Clear X"};   char **mytext = buttonText;
      |                                 ^~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:216:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  216 |         char * buttonText[1] = {"Spcl Fcn"};   char **mytext = buttonText;
      |                                 ^~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino: In function 'void setupMenuFeedingorThreading()':
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:245:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  245 |         char * buttonText[1] = {"FEED"};  char **mytext = buttonText;
      |                                 ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:256:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  256 |         char * buttonText[1] = {"THREAD"};  char **mytext = buttonText;
      |                                 ^~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:265:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  265 |         char * buttonText[1] = {"IMPERIAL"};   char **mytext = buttonText;
      |                                 ^~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:274:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  274 |         char * buttonText[1] = {"METRIC"};   char **mytext = buttonText;
      |                                 ^~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:289:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  289 |         char * buttonText[1] = {"TPI"};   char **mytext = buttonText;
      |                                 ^~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:298:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  298 |         char * buttonText[1] = {"uSTEP"};   char **mytext = buttonText;
      |                                 ^~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:307:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  307 |         char * buttonText[1] = {"N"};   char **mytext = buttonText;
      |                                 ^~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:316:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  316 |         char * buttonText[1] = {"D"};   char **mytext = buttonText;
      |                                 ^~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:325:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  325 |         char * buttonText[1] = {"Quit"};    char **mytext = buttonText;
      |                                 ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:334:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  334 |         char * buttonText[1] = {"Save"};    char **mytext = buttonText;
      |                                 ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino: In function 'void setupMenuThreading()':
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:362:27: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  362 |   char * buttonText[1] = {"FEED"};  char **mytext = buttonText;
      |                           ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino: In function 'void feedingMenu()':
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:519:15: warning: unused variable 'x1' [-Wunused-variable]
  519 |   uint16_t x, x1, y, y1, h, w = 0;
      |               ^~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:519:22: warning: unused variable 'y1' [-Wunused-variable]
  519 |   uint16_t x, x1, y, y1, h, w = 0;
      |                      ^~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:521:23: warning: unused variable 'facecolor' [-Wunused-variable]
  521 |   uint16_t linecolor, facecolor, textcolor;
      |                       ^~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino: In function 'void specialfunctions()':
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:580:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  580 |         char * buttonText[1] = {"Quit"};  char **mytext = buttonText;
      |                                 ^~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:589:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  589 |         char * buttonText[1] = {"Feed to Stop"};  char **mytext = buttonText;
      |                                 ^~~~~~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:598:33: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
  598 |         char * buttonText[1] = {"Thread to Stop"};  char **mytext = buttonText;
      |                                 ^~~~~~~~~~~~~~~~
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino: In function 'void processTouch()':
/home/bruce/Arduino/ELS_IDE2/touchdisplay.ino:726:29: warning: unused variable 'mydatum' [-Wunused-variable]
  726 |               x=40; uint8_t mydatum = BC_DATUM;
      |                             ^~~~~~~

exit status 1

Compilation error: exit status 1

I know about the ISO C++ warnings and the unused variables. Have to deal with that later. I also have to fix the ILI9341_fonts from pulling in ILI9341_t3, when I installed ILI9341_t3n. Might uninstall the fonts and just copy over the font I want!
 
Are the incompatible now
Of course they shouldn't but I stumbled over such an issue a couple of weeks ago, fixed it and obviously forgot to push it to github. Unfortunately I'm currently not at my desk and have no access to my computer with the fix on it. I'll push a new version tomorrow.
 
Of course they shouldn't but I stumbled over such an issue a couple of weeks ago, fixed it and obviously forgot to push it to github. Unfortunately I'm currently not at my desk and have no access to my computer with the fix on it. I'll push a new version tomorrow.

Thanks, appreciate it. Can wait, have plenty of other stuff to do!
 
Of course they shouldn't but I stumbled over such an issue a couple of weeks ago, fixed it and obviously forgot to push it to github. Unfortunately I'm currently not at my desk and have no access to my computer with the fix on it. I'll push a new version tomorrow.

I'd appreciate if you could get to it. Visited your repos and saw nothing obviously new.
 
@luni, Issues registered on github. Don't know what else to do. I realize you are busy, but would appreciate your help here. Thanks.

Trying to set up a gitlab repo with full instructions on how to build, but currently with IDE2 and the latest versions of your tools, my project is unbuildable.
 
Please try EncoderTool v3.2.0 and TeensyTimerTool v1.3.0. They should work together in the old and the new IDE.

And no, it does not accelerate things if you post the same complaint on each and every channel after I already told you that I can reproduce the issue and will fix it asap. Sometimes "asap" takes longer than you might like but don't forget that most people on this forum are helping for free and in their sometimes very limited spare time.
 
Please try EncoderTool v3.2.0 and TeensyTimerTool v1.3.0. They should work together in the old and the new IDE.

And no, it does not accelerate things if you post the same complaint on each and every channel after I already told you that I can reproduce the issue and will fix it asap. Sometimes "asap" takes longer than you might like but don't forget that most people on this forum are helping for free and in their sometimes very limited spare time.

Thank you for solving the problem. It now compiles, but I have not tested this on a live platform yet. I will try it tomorrow.

Sorry to have touched a nerve. I was very anxious about fixing this, and experiencing numerous software faults all at once. It was traumatic to have no way to recreate my application. I shall be more patient in the future. I and everybody here appreciate both your contributions and limited spare time. My apologies. Peace.
 
I have tested the IDE2 generated hex file on my lathe. Seems to work fine, for which I am very grateful. Now I have to synchronize all my platforms - but that is not an EncoderTool topic.
 
@clinker8 I need to fix an EncoderTool issue for the ESP32. To fix it, I need to touch the part of the code which generated the compile issue you had some months ago. Can I talk you into trying the code in the "fix-esp-compile-issue" branch and see if your application compiles with it?
 
@clinker8 I need to fix an EncoderTool issue for the ESP32. To fix it, I need to touch the part of the code which generated the compile issue you had some months ago. Can I talk you into trying the code in the "fix-esp-compile-issue" branch and see if your application compiles with it?

@luni, my pleasure. Besides changing the branch, are there any other requirements or things to change? I'm using 1.58.1 for Teensy, is that ok?
Yes, I will try it out.
 
@luni, have you considered adding support for the I2C 23017 multiplexer? I am using them in a Pi Pico W project (Adafruit MCP 23017 GPIO Expander). If successful, I will probably port them over to my Teensy 4.1 project that is currently using CD74HC4067 multiplexers (burning too many GPIO pins...). It would help me enormously if your EncoderTool supported the 23017.

Thanks, Len
 
Back
Top