#include <stdio.h>      /*標準輸入輸出定義*/
#include <stdlib.h>     /*標準函數庫定義*/
#include <string.h>
#include <stdint.h>

#include "../Config.h"
#include "../Log/log.h"
#include "../Define/define.h"
#include "../ShareMemory/shmMem.h"

int wtdFd = -1;
struct StatusCodeData           *ShmStatusCodeData;

void CreateWatchdog(void);
void TryCloseWatchdog(void);
void TryFeedWatchdog(void);

int InitWatchDog()
{
    int fd;
    int timeout = 180;

    system("/usr/bin/fuser -k /dev/watchdog");
    sleep(1);
    system("echo V > /dev/watchdog");
    sleep(1);
    fd=open("/dev/watchdog", O_RDWR);

    if(fd<=0)
    {
        log_info("Open watchdog fd:%d",fd);
        log_error("System watch dog initial fail.\n");
    }
    ioctl(fd, _IOWR('W', 6, int), &timeout);

    return fd;
}

void CreateWatchdog(void)
{
    wtdFd = InitWatchDog();

    ShmStatusCodeData = (struct StatusCodeData*)GetShmStatusCodeData();
    if(wtdFd < 0)
    {
        log_info("Watchdog Initial Fail");
        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
    }
    else
    {
        log_info("Watchdog Initial Success (%d)",wtdFd);
    }
}

void TryCloseWatchdog(void)
{
    if(wtdFd > 0)
    {
        write(wtdFd, "V", 1);
        close(wtdFd);
    }
}

void TryFeedWatchdog(void)
{
    if(wtdFd > 0)
    {
        write(wtdFd, "a", 1);
    }
}