// // Created by MightyPork on 2018/02/03. // #ifndef GEX_F072_SIPO_INTERNAL_H #define GEX_F072_SIPO_INTERNAL_H #ifndef SIPO_INTERNAL #error bad include! #endif #include "unit_base.h" /** Private data structure */ struct priv { struct { // settings Resource pin_store; bool store_pol; //!< Store pulse active edge Resource pin_shift; bool shift_pol; //!< Shift clock active edge Resource pin_clear; bool clear_pol; //!< Clear signal active level char data_pname; uint16_t data_pins; } cfg; // live fields uint32_t store_ll; uint32_t shift_ll; uint32_t clear_ll; GPIO_TypeDef *store_port; GPIO_TypeDef *shift_port; GPIO_TypeDef *clear_port; GPIO_TypeDef *data_port; uint8_t data_width; }; /** Allocate data structure and set defaults */ error_t USIPO_preInit(Unit *unit); /** Load from a binary buffer stored in Flash */ void USIPO_loadBinary(Unit *unit, PayloadParser *pp); /** Write to a binary buffer for storing in Flash */ void USIPO_writeBinary(Unit *unit, PayloadBuilder *pb); // ------------------------------------------------------------------------ /** Parse a key-value pair from the INI file */ error_t USIPO_loadIni(Unit *unit, const char *key, const char *value); /** Generate INI file section for the unit */ void USIPO_writeIni(Unit *unit, IniWriter *iw); // ------------------------------------------------------------------------ /** Finalize unit set-up */ error_t USIPO_init(Unit *unit); /** Tear down the unit */ void USIPO_deInit(Unit *unit); // ------------------------------------------------------------------------ /** * Write a buffer to the pins. * Buffer contains data for the individual channels, sequentially (AAAAAA BBBBBB CCCCCC ...) * The bytes are sent LSB first, from the last byte (e.g. 1,2,3 - 3 is sent first, LSB-first). * * The chunks order is from the lowest to the highest bit * * @param unit * @param buffer - buffer of data to send * @param buflen - number of bytes in the buffer * @param terminal_data - data to set before sending the store pulse (final data lines state, will not appear in the SIPOs) * @return success */ error_t UU_SIPO_Write(Unit *unit, const uint8_t *buffer, uint16_t buflen, uint16_t terminal_data); /** * Direct access to the output data pins (may be useful for debugging, or circuits that use them * for something else when not loading a new value). * * @param unit * @param data_packed - packed data to set on the output (right-aligned, highest to lowest pin) * @return success */ error_t UU_SIPO_DirectData(Unit *unit, uint16_t data_packed); /** * Send a clear pulse. * * @param unit * @return success */ error_t UU_SIPO_DirectClear(Unit *unit); /** * Send a shift pulse. * * @param unit * @return success */ error_t UU_SIPO_DirectShift(Unit *unit); /** * Send a store pulse. * * @param unit * @return success */ error_t UU_SIPO_DirectStore(Unit *unit); #endif //GEX_F072_SIPO_INTERNAL_H