add button stuff and timer stuff

This commit is contained in:
Wolfgang Hottgenroth 2016-09-08 14:05:57 +02:00
parent 7c854e7353
commit 8e08c2045e
13 changed files with 238 additions and 26 deletions

60
src/button.c Normal file
View File

@ -0,0 +1,60 @@
/*
* button.c
*
* Created on: 08.09.2016
* Author: dehottgw
*/
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include "button.h"
#include "gpio.h"
const uint32_t BUTTON_CYCLE = 10;
const uint8_t ACTIVE_STATE_CNT_REQUIRED = 5;
tPin buttonPins[BUTTONS_END] = { BUTTON_1 };
typedef struct {
void (*action)(void *);
void *actionArg;
uint8_t activeStateCnt;
} tButtonHandle;
tButtonHandle buttonHandles[BUTTONS_END];
void buttonInit(void *handleArg) {
for (tButton b = BUTTONS_FIRST; b < BUTTONS_END; b++) {
buttonHandles[b].action = NULL;
buttonHandles[b].actionArg = NULL;
buttonHandles[b].activeStateCnt = 0;
}
}
void buttonExec(void *handleArg) {
for (tButton b = BUTTONS_FIRST; b < BUTTONS_END; b++) {
if (buttonHandles[b].action != NULL) {
if (gpioGetPin(buttonPins[b]) == LOW) {
buttonHandles[b].activeStateCnt++;
if (buttonHandles[b].activeStateCnt > ACTIVE_STATE_CNT_REQUIRED) {
buttonHandles[b].action(buttonHandles[b].actionArg);
buttonHandles[b].activeStateCnt = 0;
}
}
}
}
}
void buttonRegister(void (*action)(void *), void *actionArg, tButton button) {
buttonHandles[button].action = action;
buttonHandles[button].actionArg = actionArg;
buttonHandles[button].activeStateCnt = 0;
}

28
src/button.h Normal file
View File

@ -0,0 +1,28 @@
/*
* button.h
*
* Created on: 08.09.2016
* Author: dehottgw
*/
#ifndef BUTTON_H_
#define BUTTON_H_
#include <stdint.h>
extern uint32_t BUTTON_CYCLE;
typedef enum {
BUTTONS_FIRST,
BUTTON_START_TIMER = BUTTONS_FIRST,
BUTTONS_END
} tButton;
void buttonInit(void *handleArg);
void buttonExec(void *handleArg);
void buttonRegister(void (*action)(void *), void *actionArg, tButton button);
#endif /* BUTTON_H_ */

View File

@ -13,6 +13,8 @@
#include "displayMuxer.h" #include "displayMuxer.h"
#include "display.h" #include "display.h"
const uint32_t DISPLAY_MUXER_CYCLE = 500;
typedef struct { typedef struct {
uint8_t value; uint8_t value;

View File

@ -11,6 +11,10 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
extern const uint32_t DISPLAY_MUXER_CYCLE;
typedef enum { typedef enum {
FIRST_MUX = 0, FIRST_MUX = 0,
TIMER_MUX = FIRST_MUX, TIMER_MUX = FIRST_MUX,

49
src/eggTimer.c Normal file
View File

@ -0,0 +1,49 @@
/*
* eggTimer.c
*
* Created on: 08.09.2016
* Author: dehottgw
*/
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include "eggTimer.h"
#include "displayMuxer.h"
#include "button.h"
const uint32_t EGG_TIMER_CYCLE = 1000;
const uint8_t COOKING_TIME = 120;
uint8_t restCookingTime;
bool timerRunning;
bool timerStarted;
void eggTimerInit(void *handleArg) {
restCookingTime = COOKING_TIME;
timerRunning = false;
timerStarted = false;
buttonRegister(eggTimerStart, NULL, BUTTON_START_TIMER);
}
void eggTimerExec(void *handleArg) {
if (timerRunning) {
restCookingTime--;
displayMuxerSetValue(restCookingTime, true, TIMER_MUX);
if (restCookingTime == 0) {
// activate alarm
timerRunning = false;
}
}
}
void eggTimerStart(void *handleArg) {
if (! timerStarted) {
timerRunning = true;
timerStarted = true;
}
}

21
src/eggTimer.h Normal file
View File

@ -0,0 +1,21 @@
/*
* eggTimer.h
*
* Created on: 08.09.2016
* Author: dehottgw
*/
#ifndef EGGTIMER_H_
#define EGGTIMER_H_
#include <stdint.h>
void eggTimerInit(void *handleArg);
void eggTimerExec(void *handleArg);
void eggTimerStart(void *handleArg);
#endif /* EGGTIMER_H_ */

View File

@ -22,13 +22,37 @@ void gpioInitPins() {
for (tPin p = PINS_FIRST; p < PINS_END; p += 1) { for (tPin p = PINS_FIRST; p < PINS_END; p += 1) {
tPinCfg pin = pinCfg[p]; tPinCfg pin = pinCfg[p];
if (pin.portId == PORT1) { if (pin.portId == PORT1) {
P1DIR |= pin.bit; if (pin.direction == PIN_OUT) {
P1SEL &= ~pin.bit; P1DIR |= pin.bit;
P1SEL2 &= ~pin.bit; P1SEL &= ~pin.bit;
P1SEL2 &= ~pin.bit;
} else if (pin.direction == PIN_IN) {
P1DIR &= ~pin.bit;
P1SEL &= ~pin.bit;
P1SEL2 &= ~pin.bit;
P1REN &= ~pin.bit;
} else if (pin.direction == PIN_IN_PULLUP) {
P1DIR &= ~pin.bit;
P1SEL &= ~pin.bit;
P1SEL2 &= ~pin.bit;
P1REN |= pin.bit;
}
} else if (pin.portId == PORT2) { } else if (pin.portId == PORT2) {
P2DIR |= pin.bit; if (pin.direction == PIN_OUT) {
P2SEL &= ~pin.bit; P2DIR |= pin.bit;
P2SEL2 &= ~pin.bit; P2SEL &= ~pin.bit;
P2SEL2 &= ~pin.bit;
} else if (pin.direction == PIN_IN) {
P2DIR &= ~pin.bit;
P2SEL &= ~pin.bit;
P2SEL2 &= ~pin.bit;
P2REN &= ~pin.bit;
} else if (pin.direction == PIN_IN_PULLUP) {
P2DIR &= ~pin.bit;
P2SEL &= ~pin.bit;
P2SEL2 &= ~pin.bit;
P2REN |= pin.bit;
}
} }
gpioSetPin(p, pin.defaultOut); gpioSetPin(p, pin.defaultOut);
} }
@ -51,3 +75,13 @@ void gpioSetPin(tPin p, tPinState v) {
} }
} }
tPinState gpioGetPin(tPin p) {
tPinCfg pin = pinCfg[p];
uint16_t pinValue = 0;
if (pin.portId == PORT1) {
pinValue = P1IN;
} else if (pin.portId == PORT2) {
pinValue = P2IN;
}
return (pinValue & pin.bit) ? HIGH : LOW;
}

View File

@ -24,9 +24,16 @@ typedef enum {
HIGH, HIGH,
} tPinState; } tPinState;
typedef enum {
PIN_OUT,
PIN_IN,
PIN_IN_PULLUP
} tPinDirection;
typedef struct { typedef struct {
tPort portId; tPort portId;
uint16_t bit; uint16_t bit;
tPinDirection direction;
tPinState defaultOut; tPinState defaultOut;
} tPinCfg; } tPinCfg;
@ -42,13 +49,13 @@ typedef enum {
SEG_G, SEG_G,
DIGIT_0, DIGIT_0,
DIGIT_1, DIGIT_1,
TESTPIN1, BUTTON_1,
TESTPIN2,
PINS_END PINS_END
} tPin; } tPin;
void gpioInitPins(); void gpioInitPins();
void gpioSetPin(tPin p, tPinState v); void gpioSetPin(tPin p, tPinState v);
tPinState gpioGetPin(tPin p);

View File

@ -8,15 +8,14 @@
#include "gpio.h" #include "gpio.h"
tPinCfg pinCfg[PINS_END] = { tPinCfg pinCfg[PINS_END] = {
{PORT1, BIT7, LOW}, //A {PORT1, BIT7, PIN_OUT, LOW}, //A
{PORT1, BIT6, LOW}, //B {PORT1, BIT6, PIN_OUT, LOW}, //B
{PORT2, BIT1, LOW}, //C {PORT2, BIT1, PIN_OUT, LOW}, //C
{PORT2, BIT3, LOW}, //D {PORT2, BIT3, PIN_OUT, LOW}, //D
{PORT2, BIT4, LOW}, //E {PORT2, BIT4, PIN_OUT, LOW}, //E
{PORT2, BIT5, LOW}, //F {PORT2, BIT5, PIN_OUT, LOW}, //F
{PORT2, BIT2, LOW}, //G {PORT2, BIT2, PIN_OUT, LOW}, //G
{PORT2, BIT0, HIGH}, //0 {PORT2, BIT0, PIN_OUT, HIGH}, //0
{PORT1, BIT5, HIGH}, //1 {PORT1, BIT5, PIN_OUT, HIGH}, //1
{PORT1, BIT1, LOW}, // TESTPIN1 {PORT1, BIT1, PIN_IN, LOW}, // BUTTON_1
{PORT1, BIT2, LOW}, // TESTPIN2
}; };

View File

@ -16,6 +16,8 @@
#include "displayMuxer.h" #include "displayMuxer.h"
#include "PontCoopScheduler.h" #include "PontCoopScheduler.h"
#include "measure.h" #include "measure.h"
#include "eggTimer.h"
int main() { int main() {
@ -38,17 +40,23 @@ int main() {
__disable_interrupt(); __disable_interrupt();
measureInit(NULL); measureInit(NULL);
// displayMuxerInit(NULL); displayMuxerInit(NULL);
eggTimerInit(NULL);
// schAdd(displayExec, NULL, 0, DISPLAY_CYCLE);
schAdd(displayExec, NULL, 0, DISPLAY_CYCLE);
schAdd(measureStartConversion, NULL, 0, MEASURE_CYCLE); schAdd(measureStartConversion, NULL, 0, MEASURE_CYCLE);
// schAdd(displayMuxerExec, NULL, 0, 500); schAdd(displayMuxerExec, NULL, 0, DISPLAY_MUXER_CYCLE);
schAdd(eggTimerExec, NULL, 0, EGG_TIMER_CYCLE);
__enable_interrupt(); __enable_interrupt();
while (1) { while (1) {
schExec(); schExec();
// put it into the idle loop, it is not time critical
// but should get as much time as possible to avoid
// flicker
displayExec(NULL);
} }
} }

View File

@ -14,7 +14,7 @@
#include "measure.h" #include "measure.h"
#include "PontCoopScheduler.h" #include "PontCoopScheduler.h"
#include "displayMuxer.h" #include "displayMuxer.h"
#include "display.h" // #include "display.h"
#include "gpio.h" #include "gpio.h"
@ -75,8 +75,8 @@ void measureCollectAndProcessConversion(void *handleArg) {
uint8_t temperature = (t < 0) ? 0 : ((uint8_t)t); uint8_t temperature = (t < 0) ? 0 : ((uint8_t)t);
displaySetValue(temperature); // displaySetValue(temperature);
// displayMuxerSetValue(temperature, true, TEMPERATURE_MUX); displayMuxerSetValue(temperature, true, TEMPERATURE_MUX);
averagingCnt = 0; averagingCnt = 0;
averagingSum = 0; averagingSum = 0;