/*
 * @Author: chensong chens@bmser.com
 * @Date: 2024-04-07 14:25:58
 * @LastEditors: chensong chens@bmser.com
 * @LastEditTime: 2024-10-28 22:02:42
 * @FilePath: /rk3568_sdk_master/rk3568_sdk/bmser_app/alarm_common/src/main.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <pthread.h>
#include "toolkit.h"
#include "platmacro.h"
#include "bmser_mqtt.h"
#include "bmser_ems_db_control_db.h"
#include "event_process.h"
#include "bmser_log.h"
#include "communication.h"
#include "dtc_export_cfg_parse.h"
#include "wave_record_json_prase.h"
#include "wave_record_queue.h"
#include "wave_record_csv_storage.h"
#include "dtc_db3_common.h"
#include "dtc_export.h"
#include "thread_monitor.h"
#include "wave_record_file_system.h"

void exit_handler(){
    threads_monitor_stop_all();
    communication_deinit();
    eventprocess_deinit();
    if (DTC_export_get_isEnable()) {
        DTC_Export_DB3_deinit();
    }
    wave_record_queue_deinit();
    wave_record_fs_deinit();
}

void signalHandler(int signal){
    exit(0); // 显式调用exit，将会导致atexit注册的函数被调用
}

bool g_wave_record_partition_is_exist = false;
int main(int argc, char *argv[])
{
    int ret = 0;
    atexit(exit_handler);
    // 设置信号处理函数
    signal(SIGINT, signalHandler);  // 对于Ctrl+C
    signal(SIGTERM, signalHandler); // 对于请求终止进程的信号 
    BMSER_CALL_FUNC_RETURN_VAL(wave_record_json_init());
    BMSER_CALL_FUNC_RETURN_VAL(BMSDB_Init());
    g_wave_record_partition_is_exist = check_wave_record_partition_is_exist();
    //只有存在分区的情况下才初始化录播功能
    if(g_wave_record_partition_is_exist){
        ret |= wave_record_csv_init();   
    }else{
        dy_syslog(LOG_ERR, "Wave record partition is not exist, so wave record function is not init. \r\n");
    }
    ret |= DTC_jsonData_init(DTC_RECORD_INFO_FILE);
    ret |= eventprocess_init();
    DTC_export_parse_config(DTC_RECORD_CFG_FILE);
    if (DTC_export_get_isEnable()) {
        ret |= DTC_EXport_run_init();
    }
    ret |= communication_init();


    if (0 != ret){
        dy_syslog(LOG_ERR, "alarm common Init error. \r\n");
        return ret;
    }

    while(1)
    {
        //TF卡case:一开始没插卡，等插上卡再初始化录播
        if(!g_wave_record_partition_is_exist && check_wave_record_partition_is_exist()){
            g_wave_record_partition_is_exist = true;
            wave_record_csv_init();
            dy_syslog(LOG_ERR, "wave record partition is exist ,wave record starting\r\n");
        }
        threads_monitor_runnable();
        sleep(5);
    }


    exit(EXIT_SUCCESS);
}
