Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.30 KB | None | 0 0
  1. #include "main.h"
  2. #include "cmsis_os.h"
  3. #include "adc.h"
  4. #include "gpio.h"
  5. #include "rtc.h"
  6.  
  7. #include "math.h"
  8. #include "h/tube.h"
  9.  
  10.  
  11. #include "eeprom.h"
  12.  
  13.  
  14.  
  15.  
  16.  
  17. void btn_onpress( button_t * btn ){
  18.   char *str = (char *)btn->ctx;
  19.   CDC_Transmit_FS(str, strlen(str) );
  20.  
  21.   CDC_Transmit_FS("\n", 1);
  22. }
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. typedef enum
  30. {
  31.   DISPLAY_TIME,
  32.  
  33.   SET_TIME_HR_BLINK,
  34.   SET_TIME_MIN_BLINK,
  35.   SET_TIME_SEC_BLINK,
  36.  
  37.   SET_ANIMATION,
  38.  
  39.   SET_BRIGHTNESS,
  40.  
  41. } clock_state;
  42.  
  43. void clk_go_SET_TIME_HR_BLINK(void);
  44.  
  45. void clk_go_SET_TIME_MIN_BLINK(void);
  46.  
  47. void clk_go_DISPLAY_TIME(void);
  48.  
  49.  
  50.  
  51. clock_state clk_state = DISPLAY_TIME;
  52.  
  53.  
  54.  
  55.  
  56. typedef struct {
  57.   int8_t hr_inc;
  58.   int8_t min_inc;
  59.   int8_t sec_inc;
  60.  
  61. } action_btn_change_time_ctx;
  62.  
  63. #define CLOCK_SET_INCR_SPEED 50
  64.  
  65.  
  66. void action_btn_change_time( button_t * btn ){
  67.   action_btn_change_time_ctx *ctx = (action_btn_change_time_ctx *)btn->ctx;
  68.  
  69.   RTC_TimeTypeDef sTime = {0};
  70.  
  71.   if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){
  72.       return;
  73.   }
  74.  
  75.  
  76.   if( (sTime.Hours + ctx->hr_inc) < 0 ){
  77.     sTime.Hours = 23;
  78.   }else {
  79.     sTime.Hours += ctx->hr_inc;
  80.   }
  81.  
  82.   if( (sTime.Minutes + ctx->min_inc) < 0 ){
  83.     sTime.Minutes = 59;
  84.   }else {
  85.     sTime.Minutes += ctx->min_inc;
  86.   }
  87.  
  88.   if( (sTime.Seconds + ctx->sec_inc) < 0 ){
  89.     sTime.Seconds = 59;
  90.   }else {
  91.     sTime.Seconds += ctx->sec_inc;
  92.   }
  93.  
  94.  
  95.  
  96.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  97.   {
  98.     Error_Handler();
  99.   }
  100.  
  101. }
  102.  
  103. static uint32_t changetime_is_held = 0;
  104.  
  105. int action_btn_change_time_hold( button_t * btn ){
  106.   action_btn_change_time(btn);
  107.    
  108.   changetime_is_held = 1;
  109.  
  110.   return 50;
  111. }
  112.  
  113. void action_btn_change_time_release( button_t * btn ){
  114.   changetime_is_held = 0;
  115. }
  116.  
  117.  
  118.  
  119. #define ENABLED 1
  120.  
  121.  
  122. button_t btn_blue, btn_black, btn_red;
  123.  
  124. action_btn_change_time_ctx hr_inc_ctx = {
  125.   .hr_inc = 1,
  126.   .min_inc = 0,
  127.   .sec_inc = 0,
  128. };
  129.  
  130. action_btn_change_time_ctx hr_dec_ctx = {
  131.   .hr_inc = -1,
  132.   .min_inc = 0,
  133.   .sec_inc = 0,
  134. };
  135.  
  136. action_btn_change_time_ctx min_inc_ctx = {
  137.   .hr_inc = 0,
  138.   .min_inc = 1,
  139.   .sec_inc = 0,
  140. };
  141.  
  142. action_btn_change_time_ctx min_dec_ctx = {
  143.   .hr_inc = 0,
  144.   .min_inc = -1,
  145.   .sec_inc = 0,
  146. };
  147.  
  148. //add sec here
  149.  
  150.  
  151.  
  152. #define btn_SET_TIME_enter btn_red
  153. #define btn_SET_TIME_inc btn_black
  154. #define btn_SET_TIME_dec btn_blue
  155.  
  156. void btncb_SET_TIME_setbtn_onpress( button_t * btn ){
  157.   //switch between hr min sec setting modes on press
  158.  
  159.   switch ( clk_state ){
  160.   case SET_TIME_HR_BLINK:
  161.       clk_go_SET_TIME_MIN_BLINK();
  162.     break;
  163.    
  164.   case SET_TIME_MIN_BLINK:
  165.       clk_go_SET_TIME_HR_BLINK();
  166.     break;
  167.    
  168.     //add minutes here
  169.    
  170.     default:
  171.        clk_go_DISPLAY_TIME(); //shouldn't get here...
  172.   }
  173. }
  174.  
  175.  
  176. int btncb_SET_TIME_setbtn_onhold( button_t * btn ){
  177.   // on first hold enter hoours set mode and set onpress handler
  178.   if(clk_state == DISPLAY_TIME){
  179.    
  180.     // switch setmode on press
  181.     btn_SET_TIME_enter.onpress = btncb_SET_TIME_setbtn_onpress;
  182.    
  183.     //starting from hour set mode
  184.     clk_go_SET_TIME_HR_BLINK();
  185.    
  186.    
  187.   // exit settings mode on second hold
  188.   }else {
  189.     changetime_is_held = 0;
  190.    
  191.     clk_go_DISPLAY_TIME();
  192.   }
  193.  
  194.   return 0;
  195. }
  196.  
  197.  
  198. void clk_SET_TIME_set_btn_cb(void){
  199.   btn_SET_TIME_inc.onpress = action_btn_change_time;
  200.   btn_SET_TIME_dec.onpress = action_btn_change_time;
  201.  
  202.   btn_SET_TIME_inc.onhold = action_btn_change_time_hold;
  203.   btn_SET_TIME_dec.onhold = action_btn_change_time_hold;
  204.  
  205.   btn_SET_TIME_inc.onrelease = action_btn_change_time_release;
  206.   btn_SET_TIME_dec.onrelease = action_btn_change_time_release;
  207.  
  208.   //maybe sec here...
  209. }
  210.  
  211. void clk_go_SET_TIME_HR_BLINK(void){
  212.     clk_state = SET_TIME_HR_BLINK;
  213.      
  214.     clk_SET_TIME_set_btn_cb();
  215.    
  216.     btn_SET_TIME_inc.ctx = (void*) &hr_inc_ctx;
  217.     btn_SET_TIME_dec.ctx = (void*) &hr_dec_ctx;
  218.    
  219.    
  220. }
  221.  
  222. void clk_go_SET_TIME_MIN_BLINK(void){
  223.     clk_state = SET_TIME_MIN_BLINK;
  224.    
  225.     clk_SET_TIME_set_btn_cb();
  226.    
  227.     btn_SET_TIME_inc.ctx = (void*) &min_inc_ctx;
  228.     btn_SET_TIME_dec.ctx = (void*) &min_dec_ctx;
  229. }
  230.  
  231.  
  232. int btncb_SET_ANIMATION_modebtn_onhold( button_t * btn );
  233. int btncb_SET_BRIGHTNESS_modebtn_onhold( button_t * btn );
  234.  
  235.  
  236. void clk_go_DISPLAY_TIME(void){
  237.     clk_state = DISPLAY_TIME;
  238.    
  239.     // shouldn't react on first press, enter setting mode only on hold
  240.     // btn_red
  241.     btn_SET_TIME_enter.onpress = NULL;
  242.     btn_SET_TIME_enter.onhold = btncb_SET_TIME_setbtn_onhold;
  243.    
  244.     btn_black.onpress = NULL;
  245.     btn_black.onhold = btncb_SET_BRIGHTNESS_modebtn_onhold;
  246.    
  247.     btn_blue.onpress = NULL;
  248.     btn_blue.onhold = btncb_SET_ANIMATION_modebtn_onhold;
  249.    
  250.    
  251.     //make sure all tubes are enabled if some were blinking
  252.     for(uint8_t i = 0; i < DISPLAY_DIGITS_COUNT; i++){
  253.       display_set_tube_state(i, 1);
  254.     }
  255. }
  256.  
  257.  
  258.  
  259.  
  260. typedef struct {
  261.   uint16_t max;
  262.   uint16_t min;
  263. } dimming_level;
  264.  
  265. typedef enum {
  266.   DOTS_NONE,
  267.   DOTS_R2L,
  268.   DOTS_L2R,
  269.   DOTS_C_OUT,
  270.   DOTS_C_IN,
  271.  
  272.   DOTS_C_BLINK,
  273.   DOTS_RANDOM,
  274.  
  275.   #define DOTS_ANIMATIONS_COUNT 7
  276.  
  277. } dot_animation;
  278.  
  279.  
  280. typedef struct {
  281.   #define CLOCK_CFG_IS_INIT 0xFF335577
  282.   uint32_t is_init_flag;
  283.  
  284.   dimming_level dimm_level;
  285.  
  286.   display_animation animation;
  287.  
  288.   dot_animation dots_mode;
  289.  
  290.   uint32_t dummy;
  291. } clock_cfg_t;
  292.  
  293.  
  294. clock_cfg_t clock_cfg = {
  295.   .is_init_flag = CLOCK_CFG_IS_INIT,
  296.  
  297.   .animation = ANIMATION_NONE,
  298.  
  299.   .dimm_level = {
  300.     .max = 10,
  301.     .min = 2,
  302.   },
  303. };
  304.  
  305.  
  306. void clk_write_cfg(void);
  307.  
  308. void clk_read_cfg(void){
  309.   clock_cfg_t clock_cfg_read;
  310.  
  311.   EE_Reads(0, sizeof(clock_cfg_read)/4, (uint32_t*)&clock_cfg_read);
  312.  
  313.   if(clock_cfg_read.is_init_flag != CLOCK_CFG_IS_INIT){
  314.     clk_write_cfg();
  315.    
  316.     return;
  317.   }
  318.  
  319.   clock_cfg = clock_cfg_read;
  320. }
  321.  
  322. void clk_write_cfg(void){
  323.  
  324.   EE_Format();
  325.   EE_Writes(0, sizeof(clock_cfg)/4, (uint32_t*)&clock_cfg);
  326. }
  327.  
  328.  
  329.  
  330.  
  331. void clk_go_SET_ANIMATION(void);
  332.  
  333. void btncb_SET_ANIMATION_setbtn_onpress_next( button_t * btn ){
  334.   clock_cfg.animation = (clock_cfg.animation + 1)% ANIMATIONS_COUNT;
  335. }
  336.  
  337. void btncb_SET_ANIMATION_DOTS_setbtn_onpress_next( button_t * btn ){
  338.   clock_cfg.dots_mode = (clock_cfg.dots_mode + 1) % DOTS_ANIMATIONS_COUNT;
  339. }
  340.  
  341.  
  342. void btncb_SET_ANIMATION_setbtn_onpress_prev( button_t * btn ){
  343.   int8_t val = clock_cfg.animation - 1;
  344.  
  345.   if(val < 0){
  346.     val = ANIMATIONS_COUNT - 1;
  347.   }
  348.  
  349.   clock_cfg.animation = val;
  350. }
  351.  
  352. int btncb_SET_ANIMATION_modebtn_onhold( button_t * btn ){
  353.   if(clk_state == DISPLAY_TIME){
  354.     clk_go_SET_ANIMATION();
  355.   } else {
  356.    
  357.     //save config before exiting
  358.     clk_write_cfg();
  359.    
  360.    
  361.     clk_go_DISPLAY_TIME();
  362.   }
  363.  
  364.   return 0;
  365. }
  366.  
  367. void clk_go_SET_ANIMATION(void){
  368.     clk_state = SET_ANIMATION;
  369.    
  370.     btn_blue.onpress = NULL;
  371.     btn_blue.onhold = btncb_SET_ANIMATION_modebtn_onhold;
  372.  
  373.     //btn_black.onpress = btncb_SET_ANIMATION_setbtn_onpress_prev;
  374.     btn_black.onpress = btncb_SET_ANIMATION_DOTS_setbtn_onpress_next;
  375.    
  376.     btn_black.onhold = NULL;
  377.    
  378.    
  379.    
  380.     btn_red.onpress = btncb_SET_ANIMATION_setbtn_onpress_next;
  381.     btn_red.onhold = NULL;
  382.    
  383.    
  384.     //make sure all tubes are enabled if some were blinking
  385.     for(uint8_t i = 0; i < DISPLAY_DIGITS_COUNT; i++){
  386.       display_set_tube_state(i, 1);
  387.     }
  388. }
  389.  
  390.  
  391. typedef enum {
  392.   BRIGHTNESS_SHOW_MIN = 0,
  393.   BRIGHTNESS_SHOW_MAX = 1,
  394.  
  395.   BRIGHTNESS_SHOW_CURRENT = 2,
  396.  
  397. } brighntess_menu_state_t;
  398.  
  399. brighntess_menu_state_t brightness_menu_state = BRIGHTNESS_SHOW_MIN;
  400.  
  401.  
  402. uint16_t clk_get_adc_light_pwm_level(void){
  403.   HAL_ADC_Start(&hadc1);
  404.  
  405.   uint32_t value = 0;
  406.   if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
  407.   {
  408.        value = HAL_ADC_GetValue(&hadc1);
  409.   }
  410.  
  411.   uint32_t light_level = (4096 - value);
  412.  
  413.   light_level =  light_level / (  4096/100  );
  414.   // 100 - very bright room
  415.   // 80 - is light room
  416.   // 50 is moderately light ( evening sun trough windows )
  417.   // 0 is dark
  418.  
  419.   if(light_level > 90){
  420.     light_level = 100;
  421.   }
  422.  
  423.   uint16_t pwm_level =
  424.     ( light_level * ( clock_cfg.dimm_level.max - clock_cfg.dimm_level.min )/90) + clock_cfg.dimm_level.min;
  425.  
  426.   return pwm_level;
  427. }
  428.  
  429.  
  430. void btncb_SET_BRIGHTNESS_modebtn_onpress( button_t * btn ){
  431.   brightness_menu_state = (brightness_menu_state + 1) % 3;
  432. }
  433.  
  434. void btncb_SET_BRIGHTNESS_setbtn_onpress( button_t * btn ){
  435.    int8_t inc = (int8_t) btn->ctx;
  436.  
  437.    uint16_t *levelptr;
  438.    
  439.    if(brightness_menu_state == BRIGHTNESS_SHOW_MIN){
  440.        levelptr = &clock_cfg.dimm_level.min;
  441.    }
  442.    
  443.    if(brightness_menu_state == BRIGHTNESS_SHOW_MAX){
  444.        levelptr = &clock_cfg.dimm_level.max;
  445.    }
  446.    
  447.    
  448.    int16_t new_val = *levelptr + inc;
  449.    
  450.    if(new_val < 0){
  451.     new_val = 0;
  452.    }
  453.    
  454.    if(new_val > 20){
  455.     new_val = 20;
  456.    }
  457.    
  458.    *levelptr = new_val;
  459.    
  460.    if(clock_cfg.dimm_level.min > clock_cfg.dimm_level.max){
  461.     clock_cfg.dimm_level.max = clock_cfg.dimm_level.min;
  462.    }
  463.    
  464. }
  465.  
  466. void clk_go_SET_BRIGHTNESS(void);
  467.  
  468. int btncb_SET_BRIGHTNESS_modebtn_onhold( button_t * btn ){
  469.   if(clk_state == SET_BRIGHTNESS){
  470.     //save config before exiting
  471.     clk_write_cfg();
  472.    
  473.     clk_go_DISPLAY_TIME();
  474.   }else {
  475.     clk_go_SET_BRIGHTNESS();
  476.   }
  477.  
  478.   return 0;
  479. }
  480.  
  481.  
  482. void clk_go_SET_BRIGHTNESS(void){
  483.     clk_state = SET_BRIGHTNESS;
  484.    
  485.     btn_blue.onpress = btncb_SET_BRIGHTNESS_setbtn_onpress;
  486.     btn_blue.onhold = NULL;
  487.     btn_blue.ctx = (void *) -1; // decr
  488.    
  489.     btn_black.onpress = btncb_SET_BRIGHTNESS_modebtn_onpress;
  490.     btn_black.onhold = btncb_SET_BRIGHTNESS_modebtn_onhold;
  491.    
  492.     btn_red.onpress = btncb_SET_BRIGHTNESS_setbtn_onpress;
  493.     btn_red.onhold = NULL;
  494.     btn_red.ctx = (void *) 1; // incr
  495.    
  496. }
  497.  
  498.  
  499. static uint32_t rndseed = 355;
  500. uint32_t get_random(void) {
  501.   rndseed ^= (rndseed << 27);
  502.   rndseed ^= (rndseed >> 14);
  503.   rndseed ^= (rndseed << 4);
  504.   return rndseed;
  505. }
  506.  
  507.  
  508.  
  509. void StartClockTask(void const * argument)
  510. {
  511.   tube_set_current_all(2);
  512.  
  513.   display_number(0);
  514.  
  515.   #define CLOCK_DISPLAY_INTERVAL 100
  516.  
  517.   clk_read_cfg();
  518.  
  519.   clk_go_DISPLAY_TIME();
  520.  
  521.  
  522.  
  523.   for(;;){
  524.     static uint16_t tick = 0;
  525.    
  526.     osDelay(CLOCK_DISPLAY_INTERVAL); //don't move this to end of cycle, or "continue" will skip waiting
  527.     tick += CLOCK_DISPLAY_INTERVAL;
  528.    
  529.    
  530.     if(tick > 10000){ // power of ten based overflow, so code that realy on modulus == 0 doesnt break on overflow
  531.       tick = 0;
  532.     }
  533.    
  534.     uint8_t blink_state = tick % 200 < 100;
  535.     if(changetime_is_held){
  536.       blink_state = 1;
  537.     }
  538.    
  539.     display_init_animation(clock_cfg.animation);
  540.    
  541.    
  542.     uint16_t dots_animation_source;
  543.    
  544.     switch(clk_state){
  545.  
  546.       case SET_TIME_HR_BLINK:
  547.         display_init_animation(ANIMATION_NONE);
  548.        
  549.         display_set_tube_state(0, blink_state);
  550.         display_set_tube_state(1, blink_state);
  551.        
  552.         display_set_tube_state(2, 1);
  553.         display_set_tube_state(3, 1);
  554.        
  555.        
  556.         goto display_time_label;
  557.      
  558.       case SET_TIME_MIN_BLINK:
  559.         display_init_animation(ANIMATION_NONE);
  560.        
  561.         display_set_tube_state(0, 1);
  562.         display_set_tube_state(1, 1);
  563.        
  564.         display_set_tube_state(2, blink_state);
  565.         display_set_tube_state(3, blink_state);
  566.        
  567.         goto display_time_label;
  568.        
  569.       case SET_ANIMATION:
  570.         if( (tick % 300) != 0 ) {
  571.           continue;
  572.         };
  573.        
  574.         display_reset_dots();
  575.         display_number(tick / 200);
  576.        
  577.         dots_animation_source = tick / 300;
  578.        
  579.         goto display_dots_label;
  580.       break;
  581.      
  582.  
  583.     case SET_BRIGHTNESS:
  584.         display_reset_dots();
  585.        
  586.  
  587.        
  588.         if(brightness_menu_state == BRIGHTNESS_SHOW_CURRENT){
  589.           uint16_t pwm = clk_get_adc_light_pwm_level();
  590.           tube_set_pwm(pwm);
  591.          
  592.           display_set_dot(1, 1);
  593.           display_set_dot(2, 1);
  594.          
  595.           display_digit(0, -1 );
  596.           display_digit(1, pwm / 10 );
  597.           display_digit(2, pwm % 10 );
  598.           display_digit(3, -1 );
  599.          
  600.         } else {
  601.          
  602.           if(brightness_menu_state == BRIGHTNESS_SHOW_MIN){
  603.             tube_set_pwm(clock_cfg.dimm_level.min);
  604.            
  605.             display_set_dot(3, 1);
  606.             display_set_dot(2, 1);
  607.           }
  608.          
  609.           if(brightness_menu_state == BRIGHTNESS_SHOW_MAX){
  610.             tube_set_pwm(clock_cfg.dimm_level.max);
  611.            
  612.             display_set_dot(0, 1);
  613.             display_set_dot(1, 1);
  614.           }
  615.          
  616.           display_digit(0, clock_cfg.dimm_level.max / 10 );
  617.           display_digit(1, clock_cfg.dimm_level.max % 10 );
  618.          
  619.           display_digit(2, clock_cfg.dimm_level.min / 10 );
  620.           display_digit(3, clock_cfg.dimm_level.min % 10 );
  621.          
  622.         }
  623.        
  624.  
  625.      
  626.       break;
  627.      
  628.       default: //DISPLAY_TIME
  629.        
  630.        
  631.         display_time_label:;
  632.        
  633.         //run every 500ms to let animation finish between displaying cycles
  634.         if( (tick % 500) != 0 ) {
  635.           continue;
  636.         };
  637.        
  638.       uint16_t pwm = clk_get_adc_light_pwm_level();
  639.       tube_set_pwm(pwm);
  640.        
  641.       RTC_TimeTypeDef sTime = {0};
  642.       if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){
  643.         continue;
  644.       }
  645.      
  646.      
  647.      
  648.       display_digit(0, sTime.Hours / 10 );
  649.       display_digit(1, sTime.Hours % 10 );
  650.      
  651.       display_digit(2, sTime.Minutes / 10 );
  652.       display_digit(3, sTime.Minutes % 10 );
  653.      
  654.      
  655.       //display_digit(3, sTime.Seconds / 10 );
  656.       //display_digit(4, sTime.Seconds % 10 );
  657.      
  658.       dots_animation_source = sTime.Seconds;
  659.      
  660.       display_dots_label:
  661.      
  662.       display_reset_dots();
  663.        
  664.       switch(clock_cfg.dots_mode){
  665.           case DOTS_L2R:
  666.             display_set_dot(dots_animation_source % 4, 1);
  667.           break;
  668.          
  669.           case DOTS_R2L:
  670.             display_set_dot( 3 - (dots_animation_source % 4) , 1);
  671.           break;
  672.          
  673.          
  674.           uint8_t dot_center_phase;
  675.          
  676.           case DOTS_C_IN:
  677.             dot_center_phase = 2 - (dots_animation_source % 3);
  678.            
  679.             goto label_dots_center_animation;
  680.            
  681.           case DOTS_C_OUT:
  682.             dot_center_phase = (dots_animation_source % 3);
  683.            
  684.             label_dots_center_animation:
  685.            
  686.             switch(dot_center_phase){
  687.               case 0:
  688.                 display_set_dot(1, 1);
  689.                 display_set_dot(2, 1);
  690.               break;
  691.              
  692.               case 1:
  693.                 display_set_dot(0, 1);
  694.                 display_set_dot(3, 1);
  695.               break;
  696.              
  697.               case 2:
  698.                
  699.               break;
  700.             }
  701.            
  702.           break;
  703.          
  704.           case DOTS_C_BLINK:
  705.             uint8_t centerblink_state = (dots_animation_source % 2);
  706.             display_set_dot( 1, centerblink_state);
  707.             display_set_dot( 2, centerblink_state);
  708.           break;
  709.          
  710.          
  711.           case DOTS_RANDOM:
  712.             static uint16_t prev_dots_animation_source;
  713.            
  714.             //ontransition
  715.             if( prev_dots_animation_source != dots_animation_source ){
  716.               get_random();
  717.              
  718.               prev_dots_animation_source = dots_animation_source;
  719.             }
  720.            
  721.             //display_set_dot(rndseed % 4, 1);
  722.            
  723.             display_set_dot(0 , rndseed & (1 << 0) );
  724.             display_set_dot(1 , rndseed & (1 << 1) );
  725.             display_set_dot(2 , rndseed & (1 << 2) );
  726.             display_set_dot(3 , rndseed & (1 << 3) );
  727.            
  728.           break;
  729.          
  730.           case DOTS_NONE:
  731.           default:
  732.             ;
  733.       }
  734.        
  735.      
  736.      
  737.       display_start_animation();
  738.      
  739.      
  740.       break;
  741.     }
  742.    
  743.   }
  744. }
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751. void StartControlsTask(void const * argument)
  752. {
  753.   //vTaskDelete( NULL );
  754.  
  755.  
  756.   button_init(&btn_blue, GPIOA, GPIO_PIN_3);
  757.   button_init(&btn_black, GPIOA, GPIO_PIN_1);
  758.   button_init(&btn_red, GPIOA, GPIO_PIN_2);
  759.  
  760.   clk_go_DISPLAY_TIME(); // init btns
  761.  
  762.  
  763.  
  764.  
  765.  
  766.   for(;;)
  767.   {
  768.       button_process_all();
  769.      
  770.       osDelay(BUTTON_POLL_INTERVAL);
  771.   }
  772. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement