From 2e8904e8b0537b238f42ebe0fdb6cda1e0952625 Mon Sep 17 00:00:00 2001 From: "arnaud.houdelette" Date: Tue, 22 Oct 2019 11:56:33 +0200 Subject: [PATCH] Reorganisation du code --- Makefile | 2 +- analog.c | 58 ++++++++++++++++++++++++++ analog.h | 11 +++++ main.c | 119 ++++++++++++++++++++++++++++++----------------------- radio.c | 20 +++++++++ radio.h | 13 ++++++ schema.pdf | Bin 182337 -> 181358 bytes status.h | 17 ++++++++ ui.c | 63 ++++++++++++++++++++++++++++ ui.h | 12 ++++++ 10 files changed, 263 insertions(+), 52 deletions(-) create mode 100644 analog.c create mode 100644 analog.h create mode 100644 radio.c create mode 100644 radio.h create mode 100644 status.h create mode 100644 ui.c create mode 100644 ui.h diff --git a/Makefile b/Makefile index a33cb72..e20c541 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Micro-if00 TARGET = pyrorf -SRC = main.c lcd.c spi.c rf24.c Hamming.c HammingCalculateParitySmallAndFast.c tools.c +SRC = main.c lcd.c spi.c rf24.c Hamming.c HammingCalculateParitySmallAndFast.c tools.c radio.c analog.c ui.c CXXSRC = ASRC = i2cmaster.S MCU = atmega32a diff --git a/analog.c b/analog.c new file mode 100644 index 0000000..e1b3e93 --- /dev/null +++ b/analog.c @@ -0,0 +1,58 @@ +#include "analog.h" +#include "status.h" +#include + +uint8_t analog_cpt=0; + + +#define BATT 9 +#define WAIT 10 + +uint8_t st = WAIT; + +void start(){ + //setup adc + ADCSRA = _BV(ADEN)|_BV(ADPS2)|_BV(ADPS1); // ADC Clock : 1/64 (125KHz) + ADMUX = _BV(REFS1)|_BV(REFS0); // Reference 2.56V + + st=0; + ADCSRA |= _BV(ADSC); // start first conversion + +} + +void stop(){ + ADCSRA=0; +} + + +void analog_run() +{ + if(st==WAIT){ + if (analog_cpt) + return; + start(); + return; + } + if(!( ADCSRA & _BV(ADSC) )) // ADC still running + return; + if(st >= BATT){ + uint16_t battval= ADC; + //TODO => lowbatt detection; + st=WAIT; + stop(); + return; + } + + lines[st] = ADC; + st++; + if(st<=7){ + ADMUX = _BV(REFS1)|_BV(REFS0)| st; + ADCSRA |= _BV(ADSC); + return; + } + if(st==BATT){ + ADMUX = _BV(REFS0)| 0b11110; // mesure la ref 1.22 / VCC + ADCSRA |= _BV(ADSC); + return; + } +} diff --git a/analog.h b/analog.h new file mode 100644 index 0000000..069b261 --- /dev/null +++ b/analog.h @@ -0,0 +1,11 @@ +#include +#include + +#ifndef ANALOG_h +#define ANALOG_h + +extern uint8_t analog_cpt; + +void analog_run(); + +#endif diff --git a/main.c b/main.c index 4ec1497..91f5078 100644 --- a/main.c +++ b/main.c @@ -10,38 +10,44 @@ #include #include + #include "defines.h" -#include "lcd.h" -#include "spi.h" + +/*#include "spi.h" #include "rf24.h" #include "Hamming.h" #include "tools.h" +*/ + +#include "status.h" + +#include "analog.h" +#include "radio.h" +#include "ui.h" + int main (void); void setup (void); -void loop (void); -void _lcd(); -void _radio(); +void master_loop (void); -uint8_t radiobuffer[32]; + + +uint8_t patch[16]; +uint16_t lines[16]; + +bool TIR_ON=0; volatile uint8_t skip_sleep; -volatile uint8_t t_lcd=0,t_radio=0; - -uint8_t p=0; int main(void) { setup(); while (1) - loop(); + master_loop(); } void setup(void) { -#if defined(USBCON) - USBCON=0; -#endif // Setup ports @@ -56,54 +62,64 @@ void setup(void) // Port D => Output : BATT_ENABLE (PD6), pullup on (PD2-4) - PORTD= _BV(PD2)|_BV(PD3)|_BV(PD4); + PORTD= _BV(PD2)|_BV(PD3)|_BV(PD4); + DDRD= _BV(PD6); + - lcd_init(20,4); - lcd_backlight(1); - lcd_clear(); - lcd_home(); - lcd_display(); - lcd_setCursor(1,1); - lcdprint("** Pyro RF ! **"); - spi_init_master(); - _delay_ms(500); - lcd_setCursor(3,2); - lcdprint("Init"); - GICR|=_BV(INT2); - - // Timer1 => 5ms -#if F_CPU == 8000000UL -#define TIMERLOOP 5000 -#else -#define TIMERLOOP 10000 -#endif - - -#if defined(TIMSK1) + // Timer1 => 1 tick toutes les 5ms TCCR1A = 0; TCNT1=0; - OCR1A = TIMERLOOP; - TIMSK1 = _BV(OCIE1A); - TCCR1B = _BV(WGM12)|_BV(CS11); -#else - TCCR1A = 0; - TCNT1=0; - OCR1A = TIMERLOOP; - TIMSK = _BV(OCIE1A); - TCCR1B = _BV(WGM12)|_BV(CS11); -#endif + OCR1A = 5000; // Compare A => 5000 + TIMSK = _BV(OCIE1A); // Interuption sur Compare A + TCCR1B = _BV(WGM12)|_BV(CS11); // Mode CTC (retour a zero sur CompA) et prescaler = 1/8 (1MHz) + sei(); } -void loop(void) +enum master_states state = INIT; + +void master_loop(void) { skip_sleep=0; - + analog_run(); + radio_run(); + ui_run(); + + // Automate + switch(state){ + case INIT: + state=STD; + break; + case STD: + if(RADIO_ASSOC==1) + state= ASSOC; + if(TIR_ON==1) + state= STD_TIR; + break; + case STD_TIR: + if(TIR_ON==0) + state= STD; + break; + case ASSOC: + if (RADIO_ASSOC==0) + state=STD; + if (TIR_ON==1) + state=ASSOC_TIR; + break; + case ASSOC_TIR: + if (RADIO_ASSOC==0) + state=STD; + if (TIR_ON==0) + state= ASSOC; + break; + } + + if(!skip_sleep){ set_sleep_mode(SLEEP_MODE_IDLE); @@ -114,10 +130,11 @@ void loop(void) ISR(TIMER1_COMPA_vect){ skip_sleep=1; + + if(analog_cpt) analog_cpt--; + if(radio_cpt) radio_cpt--; + if(ui_cpt) ui_cpt--; } -ISR(INT2_vect){ - skip_sleep=1; -} diff --git a/radio.c b/radio.c new file mode 100644 index 0000000..5176040 --- /dev/null +++ b/radio.c @@ -0,0 +1,20 @@ +#include "radio.h" +#include "status.h" +#include +#include + +bool RADIO_ASSOC=false; +uint8_t radio_cpt; + +void init() +{ + GICR|=_BV(INT2); +} + +ISR(INT2_vect){ + skip_sleep=1; +} + + +void radio_run(){ +} diff --git a/radio.h b/radio.h new file mode 100644 index 0000000..b517589 --- /dev/null +++ b/radio.h @@ -0,0 +1,13 @@ +#include +#include +#include + +#ifndef RADIO_h +#define RADIO_h + +extern uint8_t radio_cpt; +extern bool RADIO_ASSOC; + +void radio_run(); + +#endif diff --git a/schema.pdf b/schema.pdf index 0710a306015022517cbbe7a1dd05174012222619..8ac55ca30b927fe7a8d3ad5cac955f401f56e1e8 100644 GIT binary patch delta 3382 zcmcInyKmD#9F`-oTw$RwK$q)~28PymKEDoCt?1i;M3i;{F__e8163S3PStjaI>Cq- z$bgU-sf5G?nVDEC{tzS5x$c@1U1Ip)J8#eUKKp!M**mkC!^-?Q|(p* zyC$7;UGCUG1*$7C?5JTX^&)*e3hPzewN8FV`X<)5BEM3riUW&>NcV6Y)dM&H?yLm+ zu^$JR6SzOyu}$0?QnGaGh$YJ)T_RcV4Jlbhf5ehy zF7--ozWth7x>Cp_-V_Y2*(mcN z=gDdwI24x$oI9-Lz0XYM8ln;hB{+zJ5+ayUM3M{Jmc=Yw!d(nxhznN|j8f=Q5^JPD zs{?j1W4q+)AfEkox;D@W@8cK=56-xkPw)(I^7*WJfz-+~0$_Nz&*~0;tn|QF%jtMnk zqe=`ISBWh`xZ)WwjjExeHdv>60Wb#&vq#JohnTM0oc@uSEUEl1v3Sa$IP%MTK_q|P uY?hA#k$3R^9>Q-3(NExQ$g7k>-2NYWcP;j#Sf(g-iETM3n_YdphW-I7O>=hu delta 4401 zcmchb&u`;I6vvfFXeI9jw&DO>MndTit%zsFzh+jYD5Tr6fJBvYLmW)%rh!!)*$&#} z;sX-P5s5>kmAG)>f|d&?XYQQ$zo7pBd*HpX#~C~2(1fg2rSkK5=Dkn8^L=)%zQ6tF z54Z1jP7aUWVO`Ja{PFj*e=L_!5`XcfwZBj7kE6*byC5Ef1{NXYviG$8`nOlN=2y2` zALKd4aVT7of=X^hlQTSbswwc2eg9E*e42$>ME3VFfU%Im39GgP>+vue9KVmjcZ)jg zL6pX`WEiCcX$*|2gi%!qSn9kK;Q7x_T5>1HU`dxz${bB4sP4!0R;TM%^EBvkHSf*o zVqqJm``!{=q+!x!rf5pMtoRCmmg0K}e0%dJzqP*F&b3tGniK)kj2UXG*ahoBX0)29 zLD|8HUjs$oP{XRg&0_AAo6!)l0#f5_%13i9zKlBOpPsjV?c_|W7D4-B0a|-VVGXOR znVG&-GYc0$-$CoRDQK*4v!LI)26SPz2M3qE7p<+W%7c03a)n3y{-X748_cfq2#{}O z5lnl>+Eh)ms!{b;lrP5(v019u$+vJ=qqUfFDdo%SeQy5O+wJeR>rKw75OeJu>muf+ zVbu`(t0LZfo4W?F0%AG@H?^Y?*E`*1FKNH|%kvN0wQeWn!XLQyjkPhGepSO9tcrQ_ z{q8!<&4%Zg`YACx^@cYG%=4XGMXM(Y=1AS`9Bm`(LU#VM+X;(o!NbapO;}a;((OV4 zF}3WN>d}zv-EKa7+P<@sYrSHhlM6?7{;xjgn8sDpv0PEdsjlbEnB^ShMnUS!!cy=TL#3PeXqIK3DT({7xM_V!eU{Ui#raXdN1 z*PPwMdz>;!CH0x_N-p!eliAyb7 z9mMxMfO$?-j0wg(m>Lf|NF)(8RnlodJ3STzv#Taro z$5AOfd|ahDM0GYekYdn`F?d~rozslb<%K1FtBrA@Ssdel-k^Z%Q^tjqjSLx+TxAH? zs{~WooOH^TDXDMk%=G<#8>`G5ID~1?vR_sVmG*QDiNTZ&N2VK*s z7%zelBvb1`{Z-bk6lkh=R51_kZN>uXxy?la>iW&3;mce~8pgTie8`{SF9gl%1O +#include +#include + +#ifndef STATUS_h +#define STATUS_h + +extern uint8_t patch[16]; +extern uint16_t lines[16]; + +extern bool TIR_ON; +extern volatile uint8_t skip_sleep; + +enum master_states {INIT, STD, STD_TIR, ASSOC, ASSOC_TIR }; +extern enum master_states state; + +#endif diff --git a/ui.c b/ui.c new file mode 100644 index 0000000..6670c5a --- /dev/null +++ b/ui.c @@ -0,0 +1,63 @@ +#include "ui.h" +#include "lcd.h" +#include "tools.h" +#include "status.h" + +uint16_t ui_cpt=0; + +/* + lcd_init(20,4); + lcd_backlight(1); + lcd_clear(); + lcd_home(); + lcd_display(); + lcd_setCursor(1,1); + lcdprint("** Pyro RF ! **"); + spi_init_master(); + _delay_ms(500); + lcd_setCursor(3,2); + lcdprint("Init"); + */ +void ui_setup() +{ + lcd_init(20,4); + lcd_backlight(1); + lcd_clear(); + lcd_home(); + lcd_display(); +}; + +void ui_splash(){ + lcd_setCursor(1,1); + lcdprint("** Pyro RF ! **"); + lcd_setCursor(2,2); + lcdprint("A. Houdelette"); + lcd_setCursor(3,4); + lcdprint("E. Langlois"); +} + +void ui_main(){ +} + +enum ui_states { UI_START, UI_INIT, UI_MAIN} ui_state = UI_START; + +void ui_run(){ + switch(ui_state){ + case UI_START: + ui_setup(); + ui_splash(); + ui_state = UI_INIT; + ui_cpt=400; // 2s; + break; + case UI_INIT: + if(ui_cpt) return; + if(state==INIT) return; + lcd_clear(); + ui_state=UI_MAIN; + + case UI_MAIN: + ui_main(); + break; + + } +} diff --git a/ui.h b/ui.h new file mode 100644 index 0000000..733c43e --- /dev/null +++ b/ui.h @@ -0,0 +1,12 @@ +#include +#include + +#ifndef UI_h +#define UI_h + + +extern uint16_t ui_cpt; + +void ui_run(); + +#endif