#include #include "io-helper.h" volatile uint8_t outStates[NUMBER_OF_INPUT_BYTES]; volatile uint8_t outStatesBlinking[NUMBER_OF_INPUT_BYTES]; volatile uint8_t inStatesRaw[NUMBER_OF_INPUT_BYTES]; volatile uint8_t inStates[NUMBER_OF_INPUT_BYTES]; volatile uint8_t ioHelperDebounceTable[NUMBER_OF_INPUT_BYTES*8]; volatile uint8_t oldInstates[NUMBER_OF_INPUT_BYTES]; volatile uint8_t inStatesBothEdges[NUMBER_OF_INPUT_BYTES]; volatile uint8_t inStatesRisingEdge[NUMBER_OF_INPUT_BYTES]; volatile uint8_t inStatesFallingEdge[NUMBER_OF_INPUT_BYTES]; volatile uint8_t ioHelperDebounceTable[NUMBER_OF_INPUT_BYTES*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; } //reset edges after being read once // if (state) { // if (type == EDGE) // ioHelperSetBit(inStatesBothEdges, nr, OFF); // if (type == RISING) // ioHelperSetBit(inStatesRisingEdge, nr, OFF); // if (type == FALLING) // ioHelperSetBit(inStatesFallingEdge, nr, OFF); // } 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 ioHelperInitBuffer(void){ for(uint8_t i = 0; i < NUMBER_OF_INPUT_BYTES; i++){ outStates[i]= 0; inStatesRaw[i] = 0; inStates[i] = 0; oldInstates[i] = 0; inStatesBothEdges[i] = 0; inStatesRisingEdge[i] = 0; inStatesFallingEdge[i] = 0; } for(uint8_t i = 0; i < NUMBER_OF_INPUT_BYTES*8; i++){ ioHelperDebounceTable[i] = 0; } } /* Flankenwechsel Rising Falling alt neu | (alt XOR neu) | (Flankenwechsel UND neu) | (flankenwechsel UND alt) 0 0 | 0 | 0 | 0 0 1 | 1 | 1 | 0 1 0 | 1 | 0 | 1 1 1 | 0 | 0 | 0 */ void ioHelperEdgeDetector(void){ for (uint8_t i = 0; i < NUMBER_OF_INPUT_BYTES; 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))); } /* debounceing: */ void ioHelperDebounce(void) { static volatile uint8_t tablePos=0; for(uint8_t i = 0; i< NUMBER_OF_INPUT_BYTES*8; i++) { ioHelperCpArb(inStatesRaw,i,ioHelperDebounceTable,i*8+tablePos); if(ioHelperDebounceTable[i]==0) ioHelperSetBit(inStates,i,0); else if(ioHelperDebounceTable[i]==0xFF) ioHelperSetBit(inStates,i,1); } if (tablePos<7) { tablePos++; } else tablePos=0; } void ioHelperSetBit(volatile uint8_t *list, uint8_t nr, uint8_t state) { unsigned char ArC=0; ArC=nr/8; if(state) *(list+ArC)|=(1<<(nr-(ArC*8))); else *(list+ArC)&=~(1<<(nr-(ArC*8))); } unsigned char ioHelperReadBit(volatile uint8_t *list, uint8_t nr) { unsigned char ArC=0; ArC=nr/8; if (*(list+ArC)&(1<<(nr-(ArC*8)))) { return 1; } else return 0; } void ioHelperCpBit(uint8_t reg, uint8_t bi, uint8_t bo) { ioHelperSetBit(inStatesRaw,bo,reg&(1<