diff options
-rw-r--r-- | arcin/main.cpp | 103 |
1 files changed, 68 insertions, 35 deletions
diff --git a/arcin/main.cpp b/arcin/main.cpp index 8f6abc3..7fc3902 100644 --- a/arcin/main.cpp +++ b/arcin/main.cpp @@ -153,6 +153,42 @@ HID_arcin usb_hid(usb, report_desc_p); USB_strings usb_strings(usb, config.label); +class Axis { + public: + virtual uint32_t get() = 0; +}; + +class QEAxis : public Axis { + private: + TIM_t& tim; + + public: + QEAxis(TIM_t& t) : tim(t) {} + + void enable(bool invert, int8_t sens) { + if(!invert) { + tim.CCER = 1 << 1; + } + + tim.CCMR1 = (1 << 8) | (1 << 0); + tim.SMCR = 3; + tim.CR1 = 1; + + if(sens < 0) { + tim.ARR = 256 * -sens - 1; + } else { + tim.ARR = 256 - 1; + } + } + + virtual uint32_t get() final { + return tim.CNT; + } +}; + +QEAxis axis_qe1(TIM2); +QEAxis axis_qe2(TIM3); + int main() { rcc_init(); @@ -190,47 +226,44 @@ int main() { led2.set_mode(Pin::Output); led2.on(); - RCC.enable(RCC.TIM2); - RCC.enable(RCC.TIM3); - - if(!(config.flags & (1 << 1))) { - TIM2.CCER = 1 << 1; - } - - TIM2.CCMR1 = (1 << 8) | (1 << 0); - TIM2.SMCR = 3; - TIM2.CR1 = 1; + Axis* axis_1; - if(config.qe1_sens < 0) { - TIM2.ARR = 256 * -config.qe1_sens - 1; + if(0) { + // TODO: Analog mode. + + //axis_1 = &ana_1; } else { - TIM2.ARR = 256 - 1; - } - - if(!(config.flags & (1 << 2))) { - TIM3.CCER = 1 << 1; + RCC.enable(RCC.TIM2); + + axis_qe1.enable(config.flags & (1 << 1), config.qe1_sens); + + qe1a.set_af(1); + qe1b.set_af(1); + qe1a.set_mode(Pin::AF); + qe1b.set_mode(Pin::AF); + + axis_1 = &axis_qe1; } - TIM3.CCMR1 = (1 << 8) | (1 << 0); - TIM3.SMCR = 3; - TIM3.CR1 = 1; + Axis* axis_2; - if(config.qe2_sens < 0) { - TIM3.ARR = 256 * -config.qe2_sens - 1; + if(0) { + // TODO: Analog mode. + + //axis_2 = &ana_2; } else { - TIM3.ARR = 256 - 1; + RCC.enable(RCC.TIM3); + + axis_qe2.enable(config.flags & (1 << 2), config.qe2_sens); + + qe2a.set_af(1); + qe2b.set_af(1); + qe2a.set_mode(Pin::AF); + qe2b.set_mode(Pin::AF); + + axis_2 = &axis_qe2; } - qe1a.set_af(1); - qe1b.set_af(1); - qe1a.set_mode(Pin::AF); - qe1b.set_mode(Pin::AF); - - qe2a.set_af(2); - qe2b.set_af(2); - qe2a.set_mode(Pin::AF); - qe2b.set_mode(Pin::AF); - uint8_t last_x = 0; uint8_t last_y = 0; @@ -257,8 +290,8 @@ int main() { } if(usb.ep_ready(1)) { - uint32_t qe1_count = TIM2.CNT; - uint32_t qe2_count = TIM3.CNT; + uint32_t qe1_count = axis_1->get(); + uint32_t qe2_count = axis_2->get(); int8_t rx = qe1_count - last_x; int8_t ry = qe2_count - last_y; |