kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			
		
			
				
	
	
		
			71 wiersze
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			71 wiersze
		
	
	
		
			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
 |