diff --git a/io-helper.c b/io-helper.c index 2faa794..337d299 100644 --- a/io-helper.c +++ b/io-helper.c @@ -5,8 +5,69 @@ 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) * diff --git a/io-helper.h b/io-helper.h index ab31023..fec5968 100644 --- a/io-helper.h +++ b/io-helper.h @@ -3,19 +3,33 @@ #include +#define LEVEL 0 +#define EDGE 1 +#define RISING 2 +#define FALLING 3 + +#define OFF 0 +#define ON 1 +#define BLINK 2 +#define TOGGLE 3 + #define nrOfOutputs 32 //must be multiple of 8 #define nrOfInputs 32 //must be multiple of 8 extern volatile uint8_t outStates[nrOfOutputs/8]; extern volatile uint8_t inStates[nrOfInputs/8]; extern volatile uint8_t ioHelperDebounceTable[nrOfInputs]; + void ioHelperSetOuts(void); void ioHelperReadPins(void); void ioHelperIoConf(void); void ioHelperSetBit(volatile uint8_t *list, uint8_t nr, uint8_t state); unsigned char ioHelperReadBit(volatile uint8_t *list, uint8_t nr); void ioHelperDebounce(void); +void ioHelperEdgeDetector(void); +uint8_t read_Input(uint8_t nr, uint8_t type); +void set_Output(uint8_t nr, uint8_t state); //Outputs //Pin | Bit in outStates diff --git a/iohelperhelper.py b/iohelperhelper.py index 156660f..b1a7d00 100644 --- a/iohelperhelper.py +++ b/iohelperhelper.py @@ -1,92 +1,97 @@ import string ddr="""#ifdef DDRA -DDRA|=0 +ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + DDRA|=0 #ifdef BitPA0 -|(1<<0) + |(1<<0) #endif #ifdef BitPA1 -|(1<<1) + |(1<<1) #endif #ifdef BitPA2 -|(1<<2) + |(1<<2) #endif #ifdef BitPA3 -|(1<<3) + |(1<<3) #endif #ifdef BitPA4 -|(1<<4) + |(1<<4) #endif #ifdef BitPA5 -|(1<<5) + |(1<<5) #endif #ifdef BitPA6 -|(1<<6) + |(1<<6) #endif #ifdef BitPA7 -|(1<<7) + |(1<<7) #endif -|0; - + |0; +} #endif """ port=""" #ifdef PORTA -PORTA|=0 +ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + PORTA|=0 #ifdef BitPA0 -|(getBit1(BitPA0)<<0) + |(getBit1(BitPA0)<<0) #endif #ifdef BitPA1 -|(getBit1(BitPA1)<<1) + |(getBit1(BitPA1)<<1) #endif #ifdef BitPA2 -|(getBit1(BitPA2)<<2) + |(getBit1(BitPA2)<<2) #endif #ifdef BitPA3 -|(getBit1(BitPA3)<<3) + |(getBit1(BitPA3)<<3) #endif #ifdef BitPA4 -|(getBit1(BitPA4)<<4) + |(getBit1(BitPA4)<<4) #endif #ifdef BitPA5 -|(getBit1(BitPA5)<<5) + |(getBit1(BitPA5)<<5) #endif #ifdef BitPA6 -|(getBit1(BitPA6)<<6) + |(getBit1(BitPA6)<<6) #endif #ifdef BitPA7 -|(getBit1(BitPA7)<<7) + |(getBit1(BitPA7)<<7) #endif -|0; + |0; +} -PORTA&=~(0 +ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + PORTA&=~(0 #ifdef BitPA0 -|(getBit0(BitPA0)<<0) + |(getBit0(BitPA0)<<0) #endif #ifdef BitPA1 -|(getBit0(BitPA1)<<1) + |(getBit0(BitPA1)<<1) #endif #ifdef BitPA2 -|(getBit0(BitPA2)<<2) + |(getBit0(BitPA2)<<2) #endif #ifdef BitPA3 -|(getBit0(BitPA3)<<3) + |(getBit0(BitPA3)<<3) #endif #ifdef BitPA4 -|(getBit0(BitPA4)<<4) + |(getBit0(BitPA4)<<4) #endif #ifdef BitPA5 -|(getBit0(BitPA5)<<5) + |(getBit0(BitPA5)<<5) #endif #ifdef BitPA6 -|(getBit0(BitPA6)<<6) + |(getBit0(BitPA6)<<6) #endif #ifdef BitPA7 -|(getBit0(BitPA7)<<7) + |(getBit0(BitPA7)<<7) #endif -|0); + |0); +} #endif """