|
12 | 12 | */
|
13 | 13 | // ----------------------------------------------------------------------------
|
14 | 14 |
|
| 15 | +#include <inttypes.h> |
| 16 | + |
15 | 17 | #include <modm/board.hpp>
|
16 | 18 | #include <modm/debug/logger.hpp>
|
17 |
| -#include <modm/processing/timer.hpp> |
18 |
| -#include <modm/processing/protothread.hpp> |
19 |
| - |
20 | 19 | #include <modm/driver/motion/adns9800.hpp>
|
21 |
| - |
22 |
| -#include <inttypes.h> |
| 20 | +#include <modm/processing/fiber.hpp> |
| 21 | +#include <modm/processing/timer.hpp> |
23 | 22 |
|
24 | 23 | // ----------------------------------------------------------------------------
|
25 | 24 | // Set the log level
|
26 |
| -#undef MODM_LOG_LEVEL |
27 |
| -#define MODM_LOG_LEVEL modm::log::DEBUG |
| 25 | +#undef MODM_LOG_LEVEL |
| 26 | +#define MODM_LOG_LEVEL modm::log::DEBUG |
28 | 27 |
|
29 | 28 | using Usart2 = BufferedUart<UsartHal2, UartTxBuffer<256>>;
|
30 | 29 | // Create an IODeviceWrapper around the Uart Peripheral we want to use
|
31 |
| -modm::IODeviceWrapper< Usart2, modm::IOBuffer::BlockIfFull > loggerDevice; |
| 30 | +modm::IODeviceWrapper<Usart2, modm::IOBuffer::BlockIfFull> loggerDevice; |
32 | 31 |
|
33 | 32 | // Set all four logger streams to use the UART
|
34 | 33 | modm::log::Logger modm::log::debug(loggerDevice);
|
35 | 34 | modm::log::Logger modm::log::info(loggerDevice);
|
36 | 35 | modm::log::Logger modm::log::warning(loggerDevice);
|
37 | 36 | modm::log::Logger modm::log::error(loggerDevice);
|
38 | 37 |
|
39 |
| -class BlinkThread : public modm::pt::Protothread |
40 |
| -{ |
41 |
| -public: |
42 |
| - BlinkThread() |
43 |
| - { |
44 |
| - timeout.restart(100ms); |
45 |
| - } |
| 38 | +using Cs = GpioOutputA4; |
| 39 | +using Adns9800 = modm::Adns9800<SpiMaster1, Cs>; |
46 | 40 |
|
47 |
| - bool |
48 |
| - update() |
49 |
| - { |
50 |
| - PT_BEGIN(); |
51 |
| - |
52 |
| - while (true) |
53 |
| - { |
54 |
| - Board::LedGreen::reset(); |
55 |
| - |
56 |
| - PT_WAIT_UNTIL(timeout.isExpired()); |
57 |
| - timeout.restart(100ms); |
| 41 | +modm::Vector2i position; |
58 | 42 |
|
59 |
| - Board::LedGreen::set(); |
| 43 | +modm::Fiber<> adns9800_fiber([]() { |
| 44 | + Adns9800::Data data; |
| 45 | + Adns9800 adns9800{data}; |
60 | 46 |
|
61 |
| - PT_WAIT_UNTIL(timeout.isExpired()) ; |
62 |
| - timeout.restart(4.9s); |
| 47 | + Cs::setOutput(modm::Gpio::High); |
63 | 48 |
|
64 |
| - MODM_LOG_INFO << "Seconds since reboot: " << uptime << modm::endl; |
| 49 | + SpiMaster1::connect<GpioOutputA7::Mosi, GpioOutputA5::Sck, GpioInputA6::Miso>(); |
| 50 | + SpiMaster1::initialize<Board::SystemClock, 2.25_MHz>(); |
| 51 | + SpiMaster1::setDataMode(SpiMaster1::DataMode::Mode3); |
65 | 52 |
|
66 |
| - uptime += 5; |
67 |
| - } |
68 |
| - |
69 |
| - PT_END(); |
70 |
| - } |
71 |
| - |
72 |
| -private: |
73 |
| - modm::ShortTimeout timeout; |
74 |
| - uint32_t uptime; |
75 |
| -}; |
76 |
| - |
77 |
| -class Adns9800Thread : public modm::pt::Protothread |
78 |
| -{ |
79 |
| -public: |
80 |
| - Adns9800Thread() : timer(10ms), x(0), y(0) |
81 |
| - { |
82 |
| - } |
| 53 | + adns9800.initialize(); |
| 54 | + adns9800.setResolution(Adns9800::Resolution<8200>()); |
| 55 | + Adns9800::Shutter shutter = { |
| 56 | + period_min: 10000, |
| 57 | + period_max: 40000, |
| 58 | + exposure_max: 50000 |
| 59 | + }; |
| 60 | + adns9800.setShutter(shutter); |
83 | 61 |
|
84 |
| - bool |
85 |
| - update() |
| 62 | + while (true) |
86 | 63 | {
|
87 |
| - PT_BEGIN(); |
88 |
| - |
89 |
| - Cs::setOutput(modm::Gpio::High); |
90 |
| - |
91 |
| - SpiMaster1::connect<GpioOutputA7::Mosi, GpioOutputA5::Sck, GpioInputA6::Miso>(); |
92 |
| - SpiMaster1::initialize<Board::SystemClock, 2.25_MHz>(); |
93 |
| - SpiMaster1::setDataMode(SpiMaster1::DataMode::Mode3); |
94 |
| - |
95 |
| - adns9800::initialise(); |
| 64 | + adns9800.read(); |
| 65 | + position += data; |
96 | 66 |
|
97 |
| - while (true) |
98 |
| - { |
99 |
| - PT_WAIT_UNTIL(timer.execute()); |
| 67 | + MODM_LOG_INFO << "increment: " << data << modm::endl; |
| 68 | + MODM_LOG_INFO << "position: " << position << modm::endl; |
| 69 | + MODM_LOG_INFO << modm::endl; |
100 | 70 |
|
101 |
| - { |
102 |
| - int16_t delta_x, delta_y; |
103 |
| - adns9800::getDeltaXY(delta_x, delta_y); |
104 |
| - MODM_LOG_INFO.printf("dx = %5" PRId16 ", dy = %5" PRId16"; x = %9" PRId32", y=%9" PRId32 "\n", delta_x, delta_y, x, y); |
105 |
| - |
106 |
| - x += delta_x; |
107 |
| - y += delta_y; |
108 |
| - } |
109 |
| - } |
110 |
| - |
111 |
| - PT_END(); |
| 71 | + modm::this_fiber::sleep_for(10ms); |
112 | 72 | }
|
| 73 | +}); |
113 | 74 |
|
114 |
| -private: |
115 |
| - modm::ShortPeriodicTimer timer; |
116 |
| - int32_t x, y; |
117 |
| - |
118 |
| - using Cs = GpioOutputA4; |
119 |
| - |
120 |
| - using adns9800 = modm::Adns9800< |
121 |
| - /* Spi = */ SpiMaster1, |
122 |
| - /* Ncs = */ Cs >; |
123 |
| -}; |
124 |
| - |
125 |
| - |
126 |
| -BlinkThread blinkThread; |
127 |
| -Adns9800Thread adns9800Thread; |
128 |
| - |
129 |
| - |
130 |
| -// ---------------------------------------------------------------------------- |
131 | 75 | int
|
132 | 76 | main()
|
133 | 77 | {
|
134 | 78 | Board::initialize();
|
135 | 79 |
|
136 |
| - // initialize Uart2 for MODM_LOG_* |
137 | 80 | Usart2::connect<GpioOutputA2::Tx>();
|
138 | 81 | Usart2::initialize<Board::SystemClock, 115200_Bd>();
|
139 | 82 |
|
140 |
| - // Use the logging streams to print some messages. |
141 |
| - // Change MODM_LOG_LEVEL above to enable or disable these messages |
142 |
| - MODM_LOG_DEBUG << "debug" << modm::endl; |
143 |
| - MODM_LOG_INFO << "info" << modm::endl; |
144 |
| - MODM_LOG_WARNING << "warning" << modm::endl; |
145 |
| - MODM_LOG_ERROR << "error" << modm::endl; |
146 |
| - |
147 | 83 | MODM_LOG_INFO << "Welcome to ADNS 9800 demo." << modm::endl;
|
148 | 84 |
|
149 |
| - while (true) |
150 |
| - { |
151 |
| - blinkThread.update(); |
152 |
| - adns9800Thread.update(); |
153 |
| - } |
154 |
| - |
| 85 | + modm::fiber::Scheduler::run(); |
155 | 86 | return 0;
|
156 | 87 | }
|
0 commit comments