|
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