@@ -146,7 +146,7 @@ struct ct_address_bus {
146146};
147147} // namespace
148148
149- TEST_CASE (" write a register with integral constant address" , " [read ]" ) {
149+ TEST_CASE (" write a register with integral constant address" , " [write ]" ) {
150150 using R =
151151 groov::reg<" reg" , std::uint32_t , std::integral_constant<int , 42 >{}>;
152152 constexpr auto g = groov::group<" group" , ct_address_bus, R>{};
@@ -155,3 +155,32 @@ TEST_CASE("write a register with integral constant address", "[read]") {
155155 sync_write (g (" reg" _r = 0xa5a5'a5a5u ));
156156 CHECK (data<42 > == 0xa5a5'a5a5u );
157157}
158+
159+ namespace {
160+ struct bus_u8 {
161+ struct dummy_sender {
162+ using is_sender = void ;
163+ };
164+ template <auto > static auto read (auto ) -> async::sender auto {
165+ return dummy_sender{};
166+ }
167+
168+ template <auto Mask, auto IdMask, auto IdValue>
169+ static auto write (auto addr, auto value) -> async::sender auto {
170+ return async::just_result_of ([=] { *addr = (*addr & ~Mask) | value; });
171+ }
172+ };
173+
174+ std::uint8_t data_u8{};
175+ using R_u8 =
176+ groov::reg<" reg" , std::uint8_t , &data_u8, groov::w::replace, F0, F1, F2>;
177+ using G_u8 = groov::group<" group" , bus_u8, R_u8>;
178+ constexpr auto grp_u8 = G_u8{};
179+ } // namespace
180+
181+ TEST_CASE (" write a std::uint8_t register" , " [write]" ) {
182+ using namespace groov ::literals;
183+ data_u8 = 0b1'1010'1u ;
184+ sync_write (grp_u8 (" reg.field1" _f = 1 ));
185+ CHECK (data_u8 == 0b1'0001'1u );
186+ }
0 commit comments