//------------------------------------------------------------------------------ static void task_leds_func(void* param) { bool b_err; // Clear_DS_COUNTS(); // for (;;) { if (DK[CUR_DK].CUR.source==ALARM) { //tn_task_sleep(50); if (b_err) pin_on(OPIN_ERR_LED); else pin_off(OPIN_ERR_LED); /// b_err=!b_err; } else { pin_on(OPIN_ERR_LED); } /////////////////////////// hw_watchdog_clear(); tn_task_sleep(900); pin_off(OPIN_CPU_LED); tn_task_sleep(100); pin_on(OPIN_CPU_LED); ////////////////////// WAIT_1S_COUNT++; if (WAIT_1S_COUNT > DS_COUNT) Check_DS(); } }
//---------------------------------------------------------------------------- void task_led1_func (void *par) { unsigned int Blink = 1; while(1){ if (Blink & 1) Led1On(); else Led1Off(); Blink = Blink ^ 1; tn_task_sleep(250); // Sleep 250 ticks. } }
//------------------------------------------------------------------------------ // следующая попытка static void Next_Try(bool b) { if (!DK[CUR_DK].no_FAULT) if (b) { //все отключаем if (reboot_tryes<PROJ[CUR_DK].guard.restarts) { reboot_tryes++; if (chan_faults!=FT_RED_CONFL) { POWER_SET(false); // off rele SIGNAL_OFF(); Save_LET(); // for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; Init_DK(); DK_ALARM_OC(); } // DK_MAIN(); light_machine.work=false; // } else { Save_LET(); for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; //Init_DK(); //DK_ALARM_YF(); } DK_MAIN(); } Next_Try_wait = true; chan_faults=FT_NO; tn_task_sleep(100); } else { DK_HALT(); } } }
//---------------------------------------------------------------------------- void task_checkmem_func(void * par) { int cnt = 0; volatile char buf[192]; int i; volatile unsigned short *Pointer16; unsigned short mem_pattern[8] = {0x1111, 0x0000, 0x5555, 0xAAAA, 0xFFFF, 0xCCCC, 0x3333, 0x7777}; unsigned short mem_pattern_read[8]; for(;;) { Pointer16 = (unsigned short *)(0x80000300); for(i=0; i<8; i++){ *Pointer16 = mem_pattern[i]; Pointer16++; } Pointer16 = (unsigned short *)(0x80000310); for(i=0; i<8; i++){ mem_pattern_read[i] = *Pointer16 & 0xffff; Pointer16++; } tn_snprintf((char*)buf,sizeof(buf),"Memory test #%03d results: " "%04X %04X %04X %04X %04X %04X %04X %04X -> " "%04X %04X %04X %04X %04X %04X %04X %04X" "\r\n",cnt, mem_pattern[0], mem_pattern[1], mem_pattern[2], mem_pattern[3], mem_pattern[4], mem_pattern[5], mem_pattern[6], mem_pattern[7], mem_pattern_read[0], mem_pattern_read[1], mem_pattern_read[2], mem_pattern_read[3], mem_pattern_read[4], mem_pattern_read[5], mem_pattern_read[6], mem_pattern_read[7]); cnt++; exs_send_to_uart((unsigned char*)buf); tn_task_sleep(2000); tn_task_exit(0); // exit task. } }
/*loop cycle*/ static void task_light_func(void* param) { //unsigned short light; bool b_ch;//, b_err; unsigned int fpattern; //int i_sec; SYSTEMTIME cur_time; DS1390_TIME time; CUR_DK=0; SIGNAL_OFF(); POWER_SET(true); SIGNAL_OFF(); pin_off(OPIN_ERR_LED); // error enabled // tn_task_sleep(500); SIGNAL_OFF(); pin_off(OPIN_TR_EN);//включить выходные регистры // Event_Push_Str("СТАРТ");// запись в журнал старт light_time_out=1; for (;;) { //считать время GetTime_DS1390(&time); // обновить cur_time.tm_hour = time.hour; cur_time.tm_mday = time.date; cur_time.tm_min = time.min; cur_time.tm_sec = time.sec; cur_time.tm_mon = time.month; cur_time.tm_year = time.year; // if (Next_Try_wait) if (Seconds_Between(&L_ERR_TIME, &cur_time) > PROJ[CUR_DK].guard.restart_interval){ for (int i_dk=0; i_dk<dk_num; i_dk++) { DK[i_dk].REQ.req[ALARM].presence = false; } light_machine.work=true; // if (chan_faults!=FT_RED_CONFL){ SIGNAL_OFF(); POWER_SET(true); SIGNAL_OFF(); } // Next_Try_wait = false; } // test mode if(DK[0].test) { if(!DK[0].test_init){ SIGNAL_OFF(); DK[0].test_init=true; } // Clear_UDC_Arrays(); tn_task_sleep(500); // Check_Channels(); continue; } // last time error Check_LET(); // work mode if (!light_machine.work){ tn_task_sleep(500); continue; } //machine stat switch (LIGHT_STA) { case LIGHT_WORK: { tn_event_wait(&g_light_evt, EVENT_SINHRO_TIME, TN_EVENT_WCOND_OR, &fpattern, TN_WAIT_INFINITE); //синхронизация времени GPS&RTC Synk_TIME(); //проверка конфликтов каналов b_ch = Check_Chan(); if(b_ch){ Next_Try(b_ch);break;} // основная логика работы DK_MAIN(); tn_task_sleep(500);// delay 0.5S //проверка конфликтов каналов b_ch = Check_Chan(); if(b_ch){ Next_Try(b_ch);break;} // здесь организовано миганине силовых выходов вот так!(в проетке его нет) /*for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; // тукущий ДК Update_STATES(true); } */ SET_OUTPUTS(); break; } case LIGHT_FAULT: { tn_task_sleep(500); break; } }// end switch }// end for }
/*----------------------------------------------------------------------------*/ static void task_light_func(void* param) { bool b_ch; unsigned int fpattern; WORD TimeErrorGPS; BYTE fStat=false; SYSTEMTIME cur_time; DS1390_TIME time; CUR_DK=0; SIGNAL_OFF(); POWER_SET(true); SIGNAL_OFF(); pin_off(OPIN_ERR_LED); // error enabled // tn_task_sleep(500); SIGNAL_OFF(); pin_off(OPIN_TR_EN);//включить выходные регистры // Event_Push_Str("СТАРТ");// запись в журнал старт light_time_out=1; for (;;) { //считать время GetTime_DS1390(&time); // обновить cur_time.tm_hour = time.hour; cur_time.tm_mday = time.date; cur_time.tm_min = time.min; cur_time.tm_sec = time.sec; cur_time.tm_mon = time.month; cur_time.tm_year = time.year; // if (Next_Try_wait) if (Seconds_Between(&L_ERR_TIME, &cur_time) > PROJ[CUR_DK].guard.restart_interval){ for (int i_dk=0; i_dk<dk_num; i_dk++) { DK[i_dk].REQ.req[ALARM].presence = false; } light_machine.work=true; // if (chan_faults!=FT_RED_CONFL){ SIGNAL_OFF(); POWER_SET(true); SIGNAL_OFF(); } // Next_Try_wait = false; } // test mode if(DK[0].test) { if(!DK[0].test_init){ SIGNAL_OFF(); DK[0].test_init=true; } // Clear_UDC_Arrays(); tn_task_sleep(500); // Check_Channels(); continue; } // last time error Check_LET(); // work mode if (!light_machine.work){ tn_task_sleep(500); continue; } // ждем данных от GPS if((DK[0].PROJ->guard.gpsON)&&(LIGHT_STA==LIGHT_WORK)){ // работаем только с GPS DK_Service_undo(); GPS_INFO gps; Get_gps_info(&gps); switch(fStat) { case Null: // первый старт time_valid if(gps.time_valid==false){// выходим с аварией gps.fix_valid tn_task_sleep(2000); DK_ALARM_OC(); break;} DK_ALARM_undo();// включаем режим TimeErrorGPS = 0; fStat=One; break; case One:// нет данных GPS if(!gps.time_valid){TimeErrorGPS = 0;fStat=Two;} // gps.fix_valid break; case Two:// задерка на выключение 5 мин if(++TimeErrorGPS>300){DK_ALARM_OC();fStat=Three;} if(gps.time_valid)fStat=One; //gps.fix_valid break; case Three://ждем GPS данные if(gps.time_valid){TimeErrorGPS =0;fStat=Five;} // gps.fix_valid break; case Five:// задерка на включение 2 мин if(++TimeErrorGPS>120){DK_ALARM_undo();fStat=One;} if(!gps.time_valid)fStat=Three; // gps.fix_valid break; default:fStat=One;break; } } //machine stat switch (LIGHT_STA) { case LIGHT_WORK: { tn_event_wait(&g_light_evt, EVENT_SINHRO_TIME, TN_EVENT_WCOND_OR, &fpattern, TN_WAIT_INFINITE); //синхронизация времени GPS&RTC Synk_TIME(); //проверка конфликтов каналов b_ch = Check_Chan(); if(b_ch){ Next_Try(b_ch);break;} // основная логика работы DK_MAIN(); tn_task_sleep(500);// delay 0.5S //проверка конфликтов каналов b_ch = Check_Chan(); if(b_ch){ Next_Try(b_ch);break;} // провка проекта, он слетает checksumProject(); // здесь организовано миганине силовых выходов вот так!(в проетке его нет) /*for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; // тукущий ДК Update_STATES(true); } */ SET_OUTPUTS(); break; } case LIGHT_FAULT: { tn_task_sleep(500); break; } }// end switch }// end for }
//------------------------------------------------------------------------------ static void task_GPS_func(void* param) { unsigned char time_valid = gps_info.time_valid = 0; unsigned char fix_valid = gps_info.fix_valid = 0; unsigned char health = gps_info.health = 0; static unsigned char count_time=0; GPS_synk_flag=false; // pin_on(OPIN_TEST1); for (;;) { tn_task_sleep(GPS_REFRESH_INTERVAL); // Check_State_LED(); // if (GPS_LED==1) { pin_off(OPIN_TEST1); tn_task_sleep(100); pin_on(OPIN_TEST1); } //упрвление светодиодом if (GPS_LED==2) { if (count_time % 2) { pin_off(OPIN_TEST1); } else { pin_on(OPIN_TEST1); } } //разрешить обновление времени. if ((++count_time % 5)==0) GPS_synk_flag=true; // if (health_count > 4) { gps_info.health = FALSE; //PPS_INT_ENABLE(); //PPS_INT_DISABLE(); pin_on(OPIN_GPS_RESET); // Пробуем сбросить модуль GPS health_count = 1; } else { pin_off(OPIN_GPS_RESET); if (!health_count++) gps_info.health = TRUE; } //if (health != gps_info.health) { health = gps_info.health; if (health){ dbg_puts("GPS/GLONASS module found"); WrateEventStr(ST_M_OK); } else{ dbg_puts("GPS/GLONASS module lost"); WrateEventStr(ST_M_NO); } } if (fix_valid != gps_info.fix_valid) { fix_valid = gps_info.fix_valid; if (fix_valid){ dbg_puts("GPS/GLONASS FIX valid"); WrateEventStr(ST_F_OK); } else{ dbg_puts("GPS/GLONASS FIX invalid"); WrateEventStr(ST_F_NO); } } if (time_valid != gps_info.time_valid) { time_valid = gps_info.time_valid; if (time_valid) { dbg_puts("GPS/GLONASS time valid"); PPS_INT_ENABLE(); WrateEventStr(ST_T_OK); } else{ dbg_puts("GPS/GLONASS time invalid"); WrateEventStr(ST_T_NO); } } } }