#include #include #include "io-helper.h" volatile uint8_t outStates[nrOfOutputs/8]; volatile uint8_t inStatesRaw[nrOfInputs/8]; volatile uint8_t inStates[nrOfInputs/8]; volatile uint8_t outStatesBlinking[nrOfOutputs/8]; volatile uint8_t oldInstates[nrOfInputs/8]; volatile uint8_t inStatesBothEdges[nrOfInputs/8]; volatile uint8_t inStatesRisingEdge[nrOfInputs/8]; volatile uint8_t inStatesFallingEdge[nrOfInputs/8]; uint8_t read_Input(uint8_t nr, uint8_t type) { uint8_t state = 0; switch (type) { case LEVEL: state = ioHelperReadBit(inStates, nr); break; case EDGE: state = ioHelperReadBit(inStatesBothEdges, nr); ioHelperSetBit(inStatesBothEdges, nr, 0); break; case RISING: state = ioHelperReadBit(inStatesRisingEdge, nr); ioHelperSetBit(inStatesRisingEdge, nr, 0); break; case FALLING: state = ioHelperReadBit(inStatesFallingEdge, nr); ioHelperSetBit(inStatesFallingEdge, nr, 0); break; } return state; } void set_Output(uint8_t nr, uint8_t state) { switch (state) { case BLINK: ioHelperSetBit(outStatesBlinking, nr, ON); break; case TOGGLE: ioHelperSetBit(outStatesBlinking, nr, OFF); if (ioHelperReadBit(outStates, nr)) { ioHelperSetBit(outStates, nr, OFF); } else { ioHelperSetBit(outStates, nr, ON); } break; case ON: ioHelperSetBit(outStates, nr, ON); ioHelperSetBit(outStatesBlinking, nr, OFF); break; case OFF: ioHelperSetBit(outStates, nr, OFF); ioHelperSetBit(outStatesBlinking, nr, OFF); break; } } void ioHelperEdgeDetector(void){ for (uint8_t i = 0; i < nrOfInputs/8; i++){ inStatesBothEdges[i] = oldInstates[i] ^ inStates[i]; inStatesRisingEdge[i] = inStatesBothEdges[i] & inStates[i]; inStatesFallingEdge[i] = inStatesBothEdges[i] & oldInstates[i]; oldInstates[i] = inStates[i]; } } /* @brief: copies a single bit from one char to another char (or arrays thereof) * * */ void ioHelperCpArb(volatile uint8_t *source, uint16_t sourceNr,volatile uint8_t *target, uint16_t targetNr) { if(*(source+(sourceNr/8))&(1<<(sourceNr-((sourceNr/8)*8)))) { *(target+(targetNr/8))|=(1<<(targetNr-((targetNr/8)*8))); } else *(target+(targetNr/8))&=~(1<<(targetNr-((targetNr/8)*8))); } volatile uint8_t ioHelperDebounceTable[nrOfInputs]; /* debounceing: */ void ioHelperDebounce(void) { static volatile uint8_t tablePos=0; for(uint8_t i = 0; i