21,6 → 21,8 |
#include "gpt.h" |
#include <string.h> |
#include "keil/GPS_dekoduj.h" |
#include <../../os/various/chprintf.h> |
#include <chstreams.h.> |
|
/*MAX delka prikazu, ktery uzivatel muze zadat*/ |
#define MAX_DELKA_PRIKAZU 10 |
27,11 → 29,27 |
|
/*Velikost GPS bufferu*/ |
#define GPS_BUFFER 500 |
#define PWM_PERIODA_NORMAL 20000 |
#define PWM_SIRKA_NORMAL PWM_PERIODA_NORMAL/2 |
|
extern NMEA_GPGGA GPGGA_informace; |
Thread *tp_odpal = NULL; |
uint8_t uvitaci_zprava[] = "\r\n\r\n* * * * * * * * * * * * * * * * * * * * * * * * * *\r\nVita vas Automaticky Vypoustec Meteobalonu 1.1\r\nZapojeni vyvodu:\r\n\tGPIOB10 - ventil\r\n\tGPIOB11 - lis\r\n\tGPIOB12 - zataveni balonu\r\n\tGPIOB13 - otevreni krytu\r\nPrikazy:\r\n\t<odpal> zahajeni sekvence vypousteni\n\r\t<zrus> zruseni vypousteni\n\r\t<help> napoveda\r\n* * * * * * * * * * * * * * * * * * * * * * * * * *\r\n\r\n"; |
|
static PWMConfig pwmcfg = { |
10000, /* 10kHz PWM clock frequency. */ |
PWM_PERIODA_NORMAL, /* PWM period 1S (in ticks). */ |
NULL, |
{ |
{PWM_OUTPUT_ACTIVE_HIGH, NULL}, |
{PWM_OUTPUT_ACTIVE_HIGH, NULL}, |
{PWM_OUTPUT_DISABLED, NULL}, |
{PWM_OUTPUT_DISABLED, NULL} |
}, |
/* HW dependent part.*/ |
0 |
}; |
|
/* |
* Konfigurace USART2 |
*/ |
48,13 → 66,13 |
0 |
}; |
|
/* |
* GPT2 callback. |
*/ |
|
/* |
* GPT2 callback. |
*/ |
static void gpt2cb(GPTDriver *gptp) |
{ |
(void)gptp; |
palTogglePad(GPIOB, GPIOB_LED4); |
/* Wakes up the thread.*/ |
chSysLockFromIsr(); |
if (tp_odpal != NULL) { |
65,6 → 83,7 |
chSysUnlockFromIsr(); |
} |
|
|
/* |
*Konfigurace casovace 2 |
*/ |
82,8 → 101,9 |
static msg_t Thread_odpal(void *arg) { |
uint8_t stav = 0; // rika, ve ktere fazi je odpalovani |
uint8_t odpal_povolen = 0; |
uint8_t msg_zrusen[] = "Odpal zrusen uzivatelem.\r\n"; |
uint8_t odpal_pomocna = 0; |
uint8_t pocet_opakovani = 1; |
uint16_t perioda_casovace = 500; |
(void)arg; |
chRegSetThreadName("Odpal_vlakno"); |
|
103,8 → 123,10 |
{ |
odpal_povolen = 1; |
odpal_pomocna++; |
stav = 0; |
pocet_opakovani = 1; |
} |
else if (msg == 2) //Pokud se ma odpal zrusit v prubehu |
else if (msg == 2) //Pokud se ma odpal zrusit v prubehu vypousteni |
{ |
/* |
* Pro jistotu se vypnou vsechny vystupy pri zruseni odpalu |
114,10 → 136,15 |
palClearPad(GPIOB, GPIOB_PIN12); |
palClearPad(GPIOB, GPIOB_PIN13); |
|
if(odpal_povolen == 1) |
chprintf((BaseSequentialStream *)&SD1,"\r\nOdpal zrusen uzivatelem.\r\n"); |
else |
chprintf((BaseSequentialStream *)&SD1,"Odpal nebyl aktivovan.\r\n"); |
|
odpal_povolen = 0; |
odpal_pomocna = 0; |
stav = 0; |
sdWrite(&SD1, msg_zrusen, sizeof(msg_zrusen)/sizeof(uint8_t)); |
pocet_opakovani = 1; |
} |
else if (msg == 50 && odpal_povolen == 1) // preruseni od GPT |
{ |
129,32 → 156,75 |
switch (stav) |
{ |
case 0: |
sdWrite(&SD1,"Vypousteni zahajeno!\r\n",sizeof("Vypousteni zahajeno!\r\n")/sizeof(char)); |
sdWrite(&SD1,"(1/4)\tVentil otevren -> nafukovani balonu\r\n",sizeof("1/4)\tVentil otevren -> nafukovani balonu\r\n")/sizeof(char)); |
palSetPad(GPIOB, GPIOB_PIN10); |
gptStartOneShot(&GPTD2,10000); |
if (pocet_opakovani == 1) |
chprintf((BaseSequentialStream *)&SD1,"Vypousteni zahajeno!\r\n"); |
|
if (pocet_opakovani <= 20) |
{ |
//sdWrite(&SD1,,sizeof("1/4)\tVentil otevren -> nafukovani balonu\r\n")/sizeof(char)); |
chprintf((BaseSequentialStream *)&SD1,"(1/4)\tVentil otevren -> nafukovani balonu %d%%\r",pocet_opakovani*5); |
palSetPad(GPIOB, GPIOB_PIN10); |
gptStartOneShot(&GPTD2,perioda_casovace); |
pocet_opakovani++; |
if (pocet_opakovani == 21) |
{ |
chprintf((BaseSequentialStream *)&SD1,"\r\n"); |
stav++; |
pocet_opakovani = 1; |
} |
} |
break; |
case 1: |
palClearPad(GPIOB, GPIOB_PIN10); |
palSetPad(GPIOB, GPIOB_PIN11); |
sdWrite(&SD1,"(2/4)\tPrepalovani lisu...\r\n",sizeof("(2/4)\tPrepalovani lisu...\r\n")/sizeof(char)); |
gptStartOneShot(&GPTD2,5000); |
if (pocet_opakovani <= 10) |
{ |
palClearPad(GPIOB, GPIOB_PIN10); |
palSetPad(GPIOB, GPIOB_PIN11); |
chprintf((BaseSequentialStream *)&SD1,"(2/4)\tPrepalovani lisu... %d%%\r",pocet_opakovani*10); |
gptStartOneShot(&GPTD2,perioda_casovace); |
pocet_opakovani++; |
if (pocet_opakovani == 11) |
{ |
chprintf((BaseSequentialStream *)&SD1,"\r\n"); |
stav++; |
pocet_opakovani = 1; |
} |
} |
break; |
case 2: |
palClearPad(GPIOB, GPIOB_PIN11); |
palSetPad(GPIOB, GPIOB_PIN12); |
sdWrite(&SD1,"(3/4)\tZatavovani balonu...\r\n",sizeof("(3/4)\tZatavovani balonu...\r\n")/sizeof(char)); |
gptStartOneShot(&GPTD2,5000); |
if (pocet_opakovani <= 10) |
{ |
palClearPad(GPIOB, GPIOB_PIN11); |
palSetPad(GPIOB, GPIOB_PIN12); |
chprintf((BaseSequentialStream *)&SD1,"(3/4)\tZatavovani balonu... %d%%\r",pocet_opakovani*10); |
gptStartOneShot(&GPTD2,perioda_casovace); |
pocet_opakovani++; |
if (pocet_opakovani == 11) |
{ |
chprintf((BaseSequentialStream *)&SD1,"\r\n"); |
stav++; |
pocet_opakovani = 1; |
} |
} |
break; |
case 3: |
palClearPad(GPIOB, GPIOB_PIN12); |
palSetPad(GPIOB, GPIOB_PIN13); |
sdWrite(&SD1,"(4/4)\tOtevirani vika...\r\n",sizeof("(4/4)\tOtevirani vika...\r\n")/sizeof(char)); |
gptStartOneShot(&GPTD2,3000); |
if (pocet_opakovani <= 20) |
{ |
palClearPad(GPIOB, GPIOB_PIN12); |
palSetPad(GPIOB, GPIOB_PIN13); |
chprintf((BaseSequentialStream *)&SD1,"(4/4)\tOtevirani vika... %d%%\r",pocet_opakovani*5); |
gptStartOneShot(&GPTD2,perioda_casovace); |
pocet_opakovani++; |
if (pocet_opakovani == 21) |
{ |
chprintf((BaseSequentialStream *)&SD1,"\r\n"); |
stav++; |
pocet_opakovani = 1; |
} |
} |
break; |
case 4: |
palClearPad(GPIOB, GPIOB_PIN13); |
sdWrite(&SD1,"Vypousteni ukonceno!\r\n",sizeof("Vypousteni ukonceno!\r\n")/sizeof(char)); |
chprintf((BaseSequentialStream *)&SD1,"Vypousteni ukonceno!\r\n"); |
odpal_povolen = 0; |
odpal_pomocna = 0; |
stav = 0; |
162,7 → 232,6 |
default: |
break; |
} |
stav++; |
} |
} |
} |
245,8 → 314,8 |
chSchReadyI(tp_odpal); |
tp_odpal = NULL; |
} |
chSysUnlockFromIsr(); |
palTogglePad(GPIOB, GPIOB_LED4); |
chSysUnlockFromIsr(); |
|
} |
else if (strcmp(prikaz,"zrus") == 0) |
{ |
257,7 → 326,7 |
chSchReadyI(tp_odpal); |
tp_odpal = NULL; |
} |
chSysUnlockFromIsr(); |
chSysUnlockFromIsr(); |
} |
else if (strcmp(prikaz,"help") == 0) |
{ |
265,7 → 334,7 |
} |
else |
{ |
uint8_t zp_neplatny[] = "Neplatny prikaz, napiste <odpal> pro zahajeni sekvence\n\r ci <zrus> pro zruseni vypousteni\n\r"; |
uint8_t zp_neplatny[] = "Neplatny prikaz!\r\n\t<odpal> pro zahajeni sekvence\n\r\t<zrus> pro zruseni vypousteni\n\r"; |
sdWrite(&SD1,zp_neplatny,sizeof(zp_neplatny)/sizeof(uint8_t)); |
palTogglePad(GPIOB, GPIOB_LED3); |
} |
311,22 → 380,31 |
/* |
* LED na vyvojove desce |
*/ |
palSetPadMode(GPIOB, GPIOB_LED4, PAL_MODE_OUTPUT_PUSHPULL); |
palSetPadMode(GPIOB, GPIOB_LED3, PAL_MODE_OUTPUT_PUSHPULL); |
|
/* |
* Porty pro vypousteci sekvenci |
*/ |
palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL); |
palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL); |
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL); |
palSetPadMode(GPIOB, 13, PAL_MODE_OUTPUT_PUSHPULL); |
/* |
* Initializes the PWM driver 4, routes the TIM4 outputs to the board LEDs. |
*/ |
pwmStart(&PWMD4, &pwmcfg); |
palSetPadMode(GPIOB, GPIOB_LED4, PAL_MODE_ALTERNATE(2)); |
pwmEnableChannel(&PWMD4,0,PWM_SIRKA_NORMAL); |
|
|
/* |
* Aktivuje timer2 a prejde tak do aktivniho stavu |
* Porty pro vypousteci sekvenci |
*/ |
gptStart(&GPTD2,&gpt2cfg); |
|
|
palSetPadMode(GPIOB, GPIOB_PIN10, PAL_MODE_OUTPUT_PUSHPULL); |
palClearPad(GPIOB, GPIOB_PIN10); |
palSetPadMode(GPIOB, GPIOB_PIN11, PAL_MODE_OUTPUT_PUSHPULL); |
palClearPad(GPIOB, GPIOB_PIN11); |
palSetPadMode(GPIOB, GPIOB_PIN12, PAL_MODE_OUTPUT_PUSHPULL); |
palClearPad(GPIOB, GPIOB_PIN12); |
palSetPadMode(GPIOB, GPIOB_PIN13, PAL_MODE_OUTPUT_PUSHPULL); |
palClearPad(GPIOB, GPIOB_PIN13); |
/* |
* Aktivuje timer2 a timer3 prejde tak do aktivniho stavu |
*/ |
gptStart(&GPTD2,&gpt2cfg); |
/* |
* Vytvori vlakno pro prijem dat z GPS modulu |
*/ |
344,7 → 422,9 |
* pressed the test procedure is launched with output on the serial |
* driver 1. |
*/ |
|
while (TRUE) { |
|
sdRead(&SD1,znaky,1); |
/*Kdyz uzivatel stiskne enter -> dekoduj a vykonej prikaz, nebo pokud je prikaz delsi, nez by mel byt, |
*prestane ukladat a upozorni uzivatele |