1d4487b6cd
* Improved pin manager, ethernet config * Ethernet is configured prior even to LED pins * Pin Manager allocation / deallocation functions now take an "ownership" tag parameter, helping avoid accidentally free'ing pins that were allocated by other code * Pin Manager now has ability to allocate multiple pins at once; Simplifies error handling * Fix operator precedence error Bitwise AND has lower precedence than the relational "greater than" operator. * PinManager update for some user modules * don't build everything... * Final step to reduce RAM overhead * update comment * remove macros * Remove leftover allocated * Init ethernet after settings saved Co-authored-by: Christian Schwinne <dev.aircoookie@gmail.com>
71 lines
2.9 KiB
C++
71 lines
2.9 KiB
C++
#ifndef CHIP_SELECT_H
|
|
#define CHIP_SELECT_H
|
|
|
|
#include "Hardware.h"
|
|
|
|
/*
|
|
* `digit`s are as defined in Hardware.h, 0 == seconds ones, 5 == hours tens.
|
|
*/
|
|
|
|
class ChipSelect {
|
|
private:
|
|
uint8_t digits_map;
|
|
const uint8_t all_on = 0x3F;
|
|
const uint8_t all_off = 0x00;
|
|
public:
|
|
ChipSelect() : digits_map(all_off) {}
|
|
|
|
void update() {
|
|
// Documented in README.md. Q7 and Q6 are unused. Q5 is Seconds Ones, Q0 is Hours Tens.
|
|
// Q7 is the first bit written, Q0 is the last. So we push two dummy bits, then start with
|
|
// Seconds Ones and end with Hours Tens.
|
|
// CS is Active Low, but digits_map is 1 for enable, 0 for disable. So we bit-wise NOT first.
|
|
|
|
uint8_t to_shift = (~digits_map) << 2;
|
|
|
|
digitalWrite(CSSR_LATCH_PIN, LOW);
|
|
shiftOut(CSSR_DATA_PIN, CSSR_CLOCK_PIN, LSBFIRST, to_shift);
|
|
digitalWrite(CSSR_LATCH_PIN, HIGH);
|
|
}
|
|
|
|
void begin()
|
|
{
|
|
pinMode(CSSR_LATCH_PIN, OUTPUT);
|
|
pinMode(CSSR_DATA_PIN, OUTPUT);
|
|
pinMode(CSSR_CLOCK_PIN, OUTPUT);
|
|
|
|
digitalWrite(CSSR_DATA_PIN, LOW);
|
|
digitalWrite(CSSR_CLOCK_PIN, LOW);
|
|
digitalWrite(CSSR_LATCH_PIN, LOW);
|
|
update();
|
|
}
|
|
|
|
// These speak the indexes defined in Hardware.h.
|
|
// So 0 is disabled, 1 is enabled (even though CS is active low, this gets mapped.)
|
|
// So bit 0 (LSB), is index 0, is SECONDS_ONES
|
|
// Translation to what the 74HC595 uses is done in update()
|
|
void setDigitMap(uint8_t map, bool update_=true) { digits_map = map; if (update_) update(); }
|
|
uint8_t getDigitMap() { return digits_map; }
|
|
|
|
// Helper functions
|
|
// Sets just the one digit by digit number
|
|
void setDigit(uint8_t digit, bool update_=true) { setDigitMap(0x01 << digit, update_); }
|
|
void setAll(bool update_=true) { setDigitMap(all_on, update_); }
|
|
void clear(bool update_=true) { setDigitMap(all_off, update_); }
|
|
void setSecondsOnes() { setDigit(SECONDS_ONES); }
|
|
void setSecondsTens() { setDigit(SECONDS_TENS); }
|
|
void setMinutesOnes() { setDigit(MINUTES_ONES); }
|
|
void setMinutesTens() { setDigit(MINUTES_TENS); }
|
|
void setHoursOnes() { setDigit(HOURS_ONES); }
|
|
void setHoursTens() { setDigit(HOURS_TENS); }
|
|
bool isSecondsOnes() { return ((digits_map & SECONDS_ONES_MAP) > 0); }
|
|
bool isSecondsTens() { return ((digits_map & SECONDS_TENS_MAP) > 0); }
|
|
bool isMinutesOnes() { return ((digits_map & MINUTES_ONES_MAP) > 0); }
|
|
bool isMinutesTens() { return ((digits_map & MINUTES_TENS_MAP) > 0); }
|
|
bool isHoursOnes() { return ((digits_map & HOURS_ONES_MAP) > 0); }
|
|
bool isHoursTens() { return ((digits_map & HOURS_TENS_MAP) > 0); }
|
|
};
|
|
|
|
|
|
#endif // CHIP_SELECT_H
|