Skip to content

Commit

Permalink
finished Verification type and its embedding
Browse files Browse the repository at this point in the history
  • Loading branch information
TomSaw committed Jul 23, 2024
1 parent ba9a743 commit f08654c
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 18 deletions.
6 changes: 5 additions & 1 deletion examples/blue_pill_f103/adns_9800/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@ modm::Fiber<> adns9800_fiber([]() {
SpiMaster1::initialize<Board::SystemClock, 2.25_MHz>();
SpiMaster1::setDataMode(SpiMaster1::DataMode::Mode3);

adns9800.initialize();
if(not adns9800.initialize()) {
MODM_LOG_INFO << "Failed to initialize ADNS9800" << modm::endl;
return;
}

adns9800.set(Adns9800::Resolution<8200>());
adns9800.set(Adns9800::ShutterConfig{
period_min: 10000,
Expand Down
39 changes: 22 additions & 17 deletions src/modm/driver/motion/adns9800.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,24 +158,29 @@ class Adns9800 : public adns9800, public modm::SpiDevice<SpiMaster> {
/// @endcond
};

union VerificationResult {
uint8_t value;
struct {
bool ProductId: 1;
bool ProductIdInverse: 1;
bool RevisionId: 1;
};
static constexpr uint8_t Ok = 0b111;
struct Verification {
bool ProductId: 1;
bool ProductIdInverse: 1;
bool RevisionId: 1;

// @todo allFine() maybe a better name
// bool allFine() const {
operator bool() const {
return ProductId and ProductIdInverse and RevisionId;
}
};

void
Verification
initialize() {
powerUp();
const VerificationResult result = verifyIdentity();
if(result.value == VerificationResult::Ok) {

const Verification verification = verify();
if(verification) {
writeFirmware();
laserEnable();
}

return verification;
}

/// @brief Reset the device's internal state after power-loss or user invoked shutdown().
Expand All @@ -201,12 +206,12 @@ class Adns9800 : public adns9800, public modm::SpiDevice<SpiMaster> {
/**
* @brief Verify presence of the device by validating various id registers.
*/
VerificationResult
verifyIdentity() {
return VerificationResult{
ProductId: readRegister(Register::Product_ID) == uint8_t(0x33),
ProductIdInverse: readRegister(Register::Inverse_Product_ID) == uint8_t(~0x33),
RevisionId: readRegister(Register::Revision_ID) == uint8_t(0x03)
Verification
verify() {
return {
ProductId: readRegister(Register::Product_ID) == static_cast<uint8_t>(0x33),
ProductIdInverse: readRegister(Register::Inverse_Product_ID) == static_cast<uint8_t>(~0x33),
RevisionId: readRegister(Register::Revision_ID) == static_cast<uint8_t>(0x03)
};
}

Expand Down

0 comments on commit f08654c

Please sign in to comment.