diff options
Diffstat (limited to 'Libraries/Head_Task/head_task.c')
-rw-r--r-- | Libraries/Head_Task/head_task.c | 288 |
1 files changed, 104 insertions, 184 deletions
diff --git a/Libraries/Head_Task/head_task.c b/Libraries/Head_Task/head_task.c index 7df305d..3a1729a 100644 --- a/Libraries/Head_Task/head_task.c +++ b/Libraries/Head_Task/head_task.c @@ -1,6 +1,6 @@ #include "head_task.h" -// FreeRTOS includes +// FreeRTOS includes #include "FreeRTOS.h" #include "task.h" #include "queue.h" @@ -14,38 +14,33 @@ #include "stm32f0xx_rtc.h" -// Номера функций меню +// Номера функций меню typedef enum { - MENU_FUNC_SIMPLE_TIME_VIEW = 0, MENU_ADJ_TIME, - MAX_MENU_FUNCTIONS - } MenuFunctionsNums_t; -// Состояния режима меню AdjTime +// Состояния режима меню AdjTime typedef enum { - STATE_MENU_ADJ_TIME_START, STATE_MENU_ADJ_TIME_TIMER_OUT - } MenuAdjTimeStates_t; static MenuFunctionsNums_t curr_menu_func = MENU_FUNC_SIMPLE_TIME_VIEW; -// Прототипы функций меню +// Прототипы функций меню static void MenuFunc_SimpleTimeView ( void ); static void MenuFunc_AdjTime ( void ); -// Массив указателей на функции-меню +// Массив указателей РЅР° функции-меню typedef void ( *MenuFunctions_t ) ( void ); static const MenuFunctions_t MenuFunctions[MAX_MENU_FUNCTIONS] = { - + MenuFunc_SimpleTimeView, MenuFunc_AdjTime - + }; void GetCurrTime ( DataToIndicate_t* indic_data ); @@ -58,158 +53,137 @@ void ChangeValue ( uint8_t increase, uint8_t *data, uint8_t limit ); DataToIndicate_t indic_data; extern QueueHandle_t queue_data_to_indic; // indicate_modes_task.c extern QueueHandle_t queue_but_comb; // button_handler.c -extern QueueHandle_t queue_data_to_blink_mode; +extern QueueHandle_t queue_data_to_blink_mode; QueueHandle_t queue_switch_indic_mode; static MenuAdjTimeStates_t state_adj_time = STATE_MENU_ADJ_TIME_START; // ---------------------------------------------------------------------------- -// +// // ---------------------------------------------------------------------------- void HeadTaskInit ( void ) { queue_switch_indic_mode = xQueueCreate ( 1, sizeof (IndicModesNums_t) ); configASSERT( queue_switch_indic_mode ); - + curr_menu_func = MENU_FUNC_SIMPLE_TIME_VIEW; } // ---------------------------------------------------------------------------- -// +// // ---------------------------------------------------------------------------- void MenuFunc_SimpleTimeView ( void ) { - //static uint8_t prev_time = 0; - //static uint8_t curr_time = 1; - RTC_TimeTypeDef RTC_TimeStructure; - + /* Get the current Time */ RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure); - -// curr_time = RTC_TimeStructure.RTC_Seconds; -// -// if ( prev_time != curr_time ) -// { -// prev_time = curr_time; -// - GetCurrTime ( &indic_data ); - xQueueSend ( queue_data_to_indic, &indic_data, 0 ); -// } + GetCurrTime ( &indic_data ); + xQueueSend ( queue_data_to_indic, &indic_data, 0 ); } // ---------------------------------------------------------------------------- -// Ф-я-меню настройки времени +// Р¤-СЏ-меню настройки времени // ---------------------------------------------------------------------------- void MenuFunc_AdjTime ( void ) { static const uint32_t TIME_ADJ_OUT = 5000; //ms - + static IndicModesMsgBlink_t blink_data_struct; static ButtonCombName_t but_comb_name; IndicModesNums_t indic_mode_num; static uint8_t position_mask; - - //uint8_t prev_time = 1; - //uint8_t curr_time = 0; - - // - при этом нужно постоянно слать текущее время на вывод, то есть - // при настройке времени оно тикает как в обычном режиме, только - // пользователь может его изменять при этом - + + // - РїСЂРё этом РЅСѓР¶РЅРѕ постоянно слать текущее время РЅР° вывод, то есть + // РїСЂРё настройке времени РѕРЅРѕ тикает как РІ обычном режиме, только + // пользователь может его изменять РїСЂРё этом + switch ( state_adj_time ) { case STATE_MENU_ADJ_TIME_START: - + indic_mode_num = INDIC_MODE_BLINK; - // Отправляем сообщение на переключение режима индикации + // Отправляем сообщение РЅР° переключение режима индикации xQueueSend ( queue_switch_indic_mode, &indic_mode_num, 0 ); - - // Отправляем сообщение с данными для индикации - // Но сначала, сотрем, вдруг прошлое собщение не было прочитано + + // Отправляем сообщение СЃ данными для индикации + // РќРѕ сначала, сотрем, РІРґСЂСѓРі прошлое собщение РЅРµ было прочитано xQueueReceive ( queue_data_to_blink_mode, &blink_data_struct, 0 ); - + GetCurrTime ( &blink_data_struct.data ); blink_data_struct.mask_byte = 32; position_mask = blink_data_struct.mask_byte; - + xQueueSend ( queue_data_to_blink_mode, &blink_data_struct, 0 ); - + state_adj_time = STATE_MENU_ADJ_TIME_TIMER_OUT; StartLTimer ( LTIMER_MENU_ADJ_TIME_OUT ); - + break; - + case STATE_MENU_ADJ_TIME_TIMER_OUT: - + if ( GetLTimer (LTIMER_MENU_ADJ_TIME_OUT) >= TIME_ADJ_OUT ) { state_adj_time = STATE_MENU_ADJ_TIME_START; - // Выходим из этого меню режима + // Выходим РёР· этого меню режима curr_menu_func = MENU_FUNC_SIMPLE_TIME_VIEW; indic_mode_num = INDIC_MODE_STANDART; xQueueSend ( queue_switch_indic_mode, &indic_mode_num, 0 ); - // При выходе из настройки времени нужно послать сообщ. на обновление - // данных в простой режим, т.к. фаза в моргающем режиме могла быть - // отрицательной, а данные обновляются только раз в секунду, и поэтому - // лампа может быть потухшей 1 секунду. - // - тут лучше сделать завершение фазы моргания + // РџСЂРё выходе РёР· настройки времени РЅСѓР¶РЅРѕ послать СЃРѕРѕР±С‰. РЅР° обновление + // данных РІ простой режим, С‚.Рє. фаза РІ моргающем режиме могла быть + // отрицательной, Р° данные обновляются только раз РІ секунду, Рё поэтому + // лампа может быть потухшей 1 секунду. + // - тут лучше сделать завершение фазы моргания GetCurrTime ( &indic_data ); - xQueueSend ( queue_data_to_indic, &indic_data, 0 ); + xQueueSend ( queue_data_to_indic, &indic_data, 0 ); } else { - // Если жмакнули кнопушку, то сбрасываем таймер, затем смотрим - // какую кнопушку жмакнули + // Если жмакнули кнопушку, то сбрасываем таймер, затем смотрим + // какую кнопушку жмакнули if ( pdPASS == xQueueReceive ( queue_but_comb, &but_comb_name, 0 ) ) { StartLTimer ( LTIMER_MENU_ADJ_TIME_OUT ); - - // Тут в зависимости от того, какую кнопушку жмакнули + + // РўСѓС‚ РІ зависимости РѕС‚ того, какую кнопушку жмакнули switch ( but_comb_name ) { case BUTTON_SINGLE_FORWARD: - case BUTTON_SINGLE_BACKWARD: - // Меняем позицию времени - AdjTimeChangeTube (but_comb_name, &position_mask); + case BUTTON_SINGLE_BACKWARD: + // Меняем позицию времени + AdjTimeChangeTube (but_comb_name, &position_mask); GetCurrTime ( &blink_data_struct.data ); blink_data_struct.mask_byte = position_mask; xQueueSend ( queue_data_to_blink_mode, &blink_data_struct, 0 ); break; - + case BUTTON_HOLD_FORWARD: - case BUTTON_HOLD_BACKWARD: - // Меняем значение времени + case BUTTON_HOLD_BACKWARD: + // Меняем значение времени GetCurrTime ( &blink_data_struct.data ); AdjTimeChangeValue ( but_comb_name, &blink_data_struct, position_mask ); SetTime ( &blink_data_struct.data ); xQueueSend ( queue_data_to_blink_mode, &blink_data_struct, 0 ); break; - + default: break; } } else { - // - тут, если время изменилось, то отправляем его на вывод + // - тут, если время изменилось, то отправляем его РЅР° вывод GetCurrTime ( &blink_data_struct.data ); - - //curr_time = blink_data_struct.data.indic_6; - - //if ( curr_time != prev_time ) - //{ - // prev_time = curr_time; - xQueueSend ( queue_data_to_blink_mode, &blink_data_struct, 0 ); - //} + xQueueSend ( queue_data_to_blink_mode, &blink_data_struct, 0 ); } } - + break; - + default: break; } @@ -220,31 +194,30 @@ void MenuFunc_AdjTime ( void ) // // ---------------------------------------------------------------------------- void ProcessFSM_Head ( void ) -{ - - // - тут можно совершать внешние переключения функций меню: - // - ловить сообщения от внешних источников для перехода в нужный пункт - // меню (сообщения от gps модуля, wifi и тд.) - - // 1. Ловим сообщение из модуля-обработчика нажатий кнопушек с командой - // на переход в меню настройки (две кнопки зажать на 3 сек) - - // - перед отправкой сообщения в режим индикации сначала стираем сообщение - +{ + + // - тут РјРѕР¶РЅРѕ совершать внешние переключения функций меню: + // - ловить сообщения РѕС‚ внешних источников для перехода РІ нужный РїСѓРЅРєС‚ + // меню (сообщения РѕС‚ gps модуля, wifi Рё тд.) + + // 1. Ловим сообщение РёР· модуля-обработчика нажатий кнопушек СЃ командой + // РЅР° переход РІ меню настройки (РґРІРµ РєРЅРѕРїРєРё зажать РЅР° 3 сек) + + // - перед отправкой сообщения РІ режим индикации сначала стираем сообщение + static ButtonCombName_t but_comb_name; - + if ( pdPASS == xQueuePeek ( queue_but_comb, &but_comb_name, 0 ) ) { if ( but_comb_name == BUTTON_LONG ) { - // - при изменении состояния меню или режима, нужно также сбрасывать - // внутреннее состояние текущего режима - + // - РїСЂРё изменении состояния меню или режима, РЅСѓР¶РЅРѕ также сбрасывать + // внутреннее состояние текущего режима + xQueueReceive ( queue_but_comb, &but_comb_name, 0 ); curr_menu_func = MENU_ADJ_TIME; } } - MenuFunctions [curr_menu_func](); taskYIELD(); } @@ -254,67 +227,48 @@ void ProcessFSM_Head ( void ) // // ---------------------------------------------------------------------------- -//static DataToIndicate_t const_time; - - void GetCurrTime ( DataToIndicate_t *indic_data ) { RTC_TimeTypeDef RTC_TimeStructure; - + /* Get the current Time */ RTC_GetTime ( RTC_Format_BCD, &RTC_TimeStructure ); - - indic_data->indic_1 = RTC_TimeStructure.RTC_Hours>>4; - indic_data->indic_2 = RTC_TimeStructure.RTC_Hours&0x0F; - - indic_data->indic_3 = RTC_TimeStructure.RTC_Minutes>>4; - indic_data->indic_4 = RTC_TimeStructure.RTC_Minutes&0x0F; - - indic_data->indic_5 = RTC_TimeStructure.RTC_Seconds>>4; - indic_data->indic_6 = RTC_TimeStructure.RTC_Seconds&0x0F; - -// indic_data->indic_1 = const_time.indic_1; -// indic_data->indic_2 = const_time.indic_2; -// -// indic_data->indic_3 = const_time.indic_3; -// indic_data->indic_4 = const_time.indic_4; -// -// indic_data->indic_5 = const_time.indic_5; -// indic_data->indic_6 = const_time.indic_6; + + indic_data->indic_1 = RTC_TimeStructure.RTC_Hours>>4; + indic_data->indic_2 = RTC_TimeStructure.RTC_Hours&0x0F; + + indic_data->indic_3 = RTC_TimeStructure.RTC_Minutes>>4; + indic_data->indic_4 = RTC_TimeStructure.RTC_Minutes&0x0F; + + indic_data->indic_5 = RTC_TimeStructure.RTC_Seconds>>4; + indic_data->indic_6 = RTC_TimeStructure.RTC_Seconds&0x0F; } // ---------------------------------------------------------------------------- -// +// // ---------------------------------------------------------------------------- void SetTime ( DataToIndicate_t* indic_data ) { -// const_time.indic_1 = indic_data->indic_1; -// const_time.indic_2 = indic_data->indic_2; -// const_time.indic_3 = indic_data->indic_3; -// const_time.indic_4 = indic_data->indic_4; -// const_time.indic_5 = indic_data->indic_5; -// const_time.indic_6 = indic_data->indic_6; - RTC_TimeTypeDef RTC_TimeStructure; - + RTC_TimeStructure.RTC_Hours = indic_data->indic_1 << 4; RTC_TimeStructure.RTC_Hours |= indic_data->indic_2 & 0x0F; - + RTC_TimeStructure.RTC_Minutes = indic_data->indic_3 << 4; RTC_TimeStructure.RTC_Minutes |= indic_data->indic_4 & 0x0F; - + RTC_TimeStructure.RTC_Seconds = indic_data->indic_5 << 4; RTC_TimeStructure.RTC_Seconds |= indic_data->indic_6 & 0x0F; - + RTC_SetTime ( RTC_Format_BCD, &RTC_TimeStructure ); } // ---------------------------------------------------------------------------- -// Ф-я изменения текущего положения моргающей лампы при настройке времени -// Ф-я вызывается из MenuFunc_AdjTime -// Номер лампы соотносится с номером лампы ( левый бит - нулевой, и лампа тоже ) +// Р¤-СЏ изменения текущего положения моргающей лампы РїСЂРё настройке времени +// Р¤-СЏ вызывается РёР· MenuFunc_AdjTime +// Номер лампы соотносится СЃ номером лампы ( левый Р±РёС‚ - нулевой, Рё лампа тоже ) // ---------------------------------------------------------------------------- void AdjTimeChangeTube ( ButtonCombName_t but_comb_name, uint8_t *position_mask ) { @@ -332,36 +286,36 @@ void AdjTimeChangeTube ( ButtonCombName_t but_comb_name, uint8_t *position_mask // ---------------------------------------------------------------------------- -// Ф-я изменения значения цифры в текущем положении -// То есть тут настраиваем время "поцифирно" +// Р¤-СЏ изменения значения цифры РІ текущем положении +// РўРѕ есть тут настраиваем время "поцифирно" // ---------------------------------------------------------------------------- void AdjTimeChangeValue ( ButtonCombName_t but_comb_name, IndicModesMsgBlink_t *data_struct, uint8_t position_mask ) { uint8_t increase; - + if ( but_comb_name == BUTTON_HOLD_FORWARD ) { increase = 1; } else { increase = 0; } switch ( position_mask & 0x3F ) { - case 0x01: // Секунды единицы + case 0x01: // Секунды единицы ChangeValue ( increase, &data_struct->data.indic_6, 9 ); break; - - case 0x04: // Минуты единицы + + case 0x04: // Минуты единицы ChangeValue ( increase, &data_struct->data.indic_4, 9 ); break; - - case 0x02: // Секунды десятки + + case 0x02: // Секунды десятки ChangeValue ( increase, &data_struct->data.indic_5, 5 ); break; - - case 0x08: // Минуты десятки + + case 0x08: // Минуты десятки ChangeValue ( increase, &data_struct->data.indic_3, 5 ); break; - - case 0x10: // Часы единицы - if ( data_struct->data.indic_1 == 2 ) + + case 0x10: // Часы единицы + if ( data_struct->data.indic_1 == 2 ) { ChangeValue ( increase, &data_struct->data.indic_2, 3 ); } @@ -370,8 +324,8 @@ void AdjTimeChangeValue ( ButtonCombName_t but_comb_name, IndicModesMsgBlink_t * ChangeValue ( increase, &data_struct->data.indic_2, 9 ); } break; - - case 0x20: // Часы десятки + + case 0x20: // Часы десятки if ( data_struct->data.indic_2 <= 3 ) { ChangeValue ( increase, &data_struct->data.indic_1, 2 ); @@ -388,14 +342,11 @@ void AdjTimeChangeValue ( ButtonCombName_t but_comb_name, IndicModesMsgBlink_t * // ---------------------------------------------------------------------------- // // ---------------------------------------------------------------------------- -//static uint8_t temp; void ChangeValue ( uint8_t increase, uint8_t *data, uint8_t limit ) { - //temp = *data; - + if ( increase ) - //if ( temp ) { if ( *data < limit ) { *data += 1; } else { *data = 0; } @@ -409,40 +360,9 @@ void ChangeValue ( uint8_t increase, uint8_t *data, uint8_t limit ) // ---------------------------------------------------------------------------- -// Задача ОС, реализующая головную задачу программы NixieClockSimply +// Задача РћРЎ, реализующая головную задачу программы NixieClockSimply // ---------------------------------------------------------------------------- void Head_Task ( void *pvParameters ) { while(1)ProcessFSM_Head (); - //vTaskDelete(NULL); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |