#include "shift_register_internal.h" #include #include ShiftRegisterHandle avr_piso_shift_register_create( const DataPosition* clockEnable, const DataPosition* clockPulse, const DataPosition* output, const DataPosition* parallelLoad, int waitTime ) { PisoShiftRegister* shiftRegister = (PisoShiftRegister*) calloc(1, sizeof(PisoShiftRegister)); shiftRegister->output = output; shiftRegister->parallelLoad = parallelLoad; shiftRegister->shiftRegister.clockEnable = clockEnable; shiftRegister->shiftRegister.clockPulse = clockPulse; shiftRegister->shiftRegister.waitTime = waitTime; return shiftRegister; } void avr_piso_shift_register_init(ShiftRegisterHandle shiftRegisterHandle) { PisoShiftRegister* shiftRegister = (PisoShiftRegister*) shiftRegisterHandle; data_position_reset_ddr(shiftRegister->output); data_position_set_ddr(shiftRegister->parallelLoad); data_position_set_ddr(shiftRegister->shiftRegister.clockPulse); data_position_set_ddr(shiftRegister->shiftRegister.clockEnable); data_position_set_port(shiftRegister->parallelLoad); avr_shift_register_enable_clock(shiftRegisterHandle); } void avr_piso_shift_register_destroy(ShiftRegisterHandle shiftRegisterHandle) { free((PisoShiftRegister*) shiftRegisterHandle); } void avr_piso_shift_register_parallel_load(ShiftRegisterHandle shiftRegisterHandle) { PisoShiftRegister* shiftRegister = (PisoShiftRegister*) shiftRegisterHandle; data_position_reset_port(shiftRegister->parallelLoad); _delay_ms(1); data_position_set_port(shiftRegister->parallelLoad); } void avr_piso_shift_register_shift(ShiftRegisterHandle shiftRegisterHandle) { avr_shift_register_clock_pulse(shiftRegisterHandle); } bool avr_piso_shift_register_read_bit(ShiftRegisterHandle shiftRegisterHandle) { PisoShiftRegister* shiftRegister = (PisoShiftRegister*) shiftRegisterHandle; return data_position_get_pin(shiftRegister->output); } byte avr_piso_shift_register_read_byte(ShiftRegisterHandle shiftRegisterHandle) { byte output = 0; for (int i = 0; i < 8; i++) { output |= avr_piso_shift_register_read_bit(shiftRegisterHandle) << i; } return output; }