ioext.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #ifndef IO_EXTENDER_H_
  2. #define IO_EXTENDER_H_
  3. #include "pcf8574.h"
  4. #include "util.h"
  5. enum ioext_bits {
  6. EXTOUT_VALVE0,
  7. EXTOUT_VALVE1,
  8. EXTOUT_VALVE2,
  9. EXTOUT_VALVE3,
  10. EXTOUT_VALVE4,
  11. EXTOUT_VALVE5,
  12. };
  13. #define EXTOUT_NR_CHIPS 1
  14. struct ioext_context {
  15. struct pcf8574_chip chips[EXTOUT_NR_CHIPS];
  16. uint8_t old_states[EXTOUT_NR_CHIPS];
  17. uint8_t states[EXTOUT_NR_CHIPS];
  18. };
  19. extern struct ioext_context ioext_ctx;
  20. static inline bool ioext_bit_is_set(uint8_t bit_number)
  21. {
  22. uint8_t chip = bit_number / 8;
  23. uint8_t bit = bit_number % 8;
  24. return (ioext_ctx.states[chip] >> bit) & 1;
  25. }
  26. static inline bool ioext_bit_is_clear(uint8_t bit_number)
  27. {
  28. return !ioext_bit_is_set(bit_number);
  29. }
  30. static inline void ioext_set_bit(uint8_t bit_number)
  31. {
  32. uint8_t chip = bit_number / 8;
  33. uint8_t bit = bit_number % 8;
  34. ioext_ctx.states[chip] |= BITMASK8(bit);
  35. }
  36. static inline void ioext_clear_bit(uint8_t bit_number)
  37. {
  38. uint8_t chip = bit_number / 8;
  39. uint8_t bit = bit_number % 8;
  40. ioext_ctx.states[chip] &= ~BITMASK8(bit);
  41. }
  42. static inline void ioext_write_bit(uint8_t bit_number, bool set)
  43. {
  44. if (set)
  45. ioext_set_bit(bit_number);
  46. else
  47. ioext_clear_bit(bit_number);
  48. }
  49. void ioext_commit(void);
  50. void ioext_init(bool all_ones);
  51. #endif /* IO_EXTENDER_H_ */