/*
 *========================================================================
 *
 *   시스템명 : 요금징수 시스템
 *   파 일 명 : lane_shared.c
 *   작 성 자 : JBY (catacath@neighbor21.co.kr)
 *   작 성 일 : 2019.05.11
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

/*==========================================================================*/
/* Head  정의                                                               */
/*==========================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/msg.h>
#include "hi_ctrl.h"
#include "snd_rcv_knd.h"
#include "hi_packet_format.h"
#include "file_lb.h"

extern FILE *debug;

static    int  wrk_start2shared(), wrk_end_data2shared();
static    int  hnd_data2shared();

static    struct    sm_wrk_stat    *sws = NULL;

static struct    {
    int    kind;            /* DATA 종별        */
    int    (*func)();        /* 근무 MONITORING 처리 */
} monitor_cmd[] = {

    { NS_WRK_START, wrk_start2shared    }, /* 근무개시보고 */
    { NS_WRK_END  , wrk_end_data2shared }, /* 출구근무종료 */
    { NS_HND_DATA , hnd_data2shared     }, /* 통행권확인   */
    { -1          , NULL                }
};

/*
 *========================================================================
 *
 *   함 수 명 : recv2shared()
 *   작 성 자 : JBY (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.11
 *   수 정 일 :
 *   설    명 : 공유 Memory 로 수신 DATA 전달
 *
 *========================================================================
*/
int recv2shared()
{
    struct msgbuf    *mbuf;
    int    msqid, shmid, shmsz;
    void   *shmad;
    int    i;

    for (i=0; monitor_cmd[i].kind != -1; i++)
    {
        if (monitor_cmd[i].kind == hi_comm_ctrl.rcv_ctrl.cmd) break;
    }
    if (monitor_cmd[i].kind == 0) return (0);

    /* 차로 프로그램에서의 MONITORING DATA 생성 */
    if (monitor_cmd[i].func != NULL)
    {
        if (sws == NULL)
        {
            shmsz = sizeof(struct sm_wrk_stat)*MAX_LANE;

            if (hi_comm_ctrl.lane_no == 1)
                shmid = shmget(KM_KMST, shmsz, IPC_CREAT | 0666);
            else
                shmid = shmget(KM_KMST, shmsz, 0666);

            if (shmid >= 0)
            {
                shmad = shmat(shmid, (void *)0, 0666);
                if (shmad != NULL)
                    sws = (struct sm_wrk_stat *)shmad;
            }
        }
        if (sws != NULL){
            (*monitor_cmd[i].func)(hi_comm_ctrl.rcv_ctrl.buf);
        }
    }
    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : wrk_start2shared()
 *   작 성 자 : JBY (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.11
 *   수 정 일 :
 *   설    명 : 근무개시보고 처리
 *
 *========================================================================
*/
static int wrk_start2shared(struct hi_wrk_start *hws)
{
    int    i, j, k;

    k = hi_comm_ctrl.lane_no - 1;
    sws[k].lane_no = k+1;
    sws[k].wrk_stat = wkr_no2wrk_stat(hws->wrkr_no);        /* 근무상태 */
    memcpy(sws[k].wrk_no, hws->wrk_no, 4);               /* 근무번호 */
    memcpy(sws[k].wrkr_no, hws->wrkr_no, 4);             /* 근무자번호 */
    sws[k].wrk_year = lb_data2atoi(hws->wrk_date  , 4);                         /* 근무일자 */
    sws[k].wrk_mon  = lb_data2atoi(hws->wrk_date+4, 2);
    sws[k].wrk_day  = lb_data2atoi(hws->wrk_date+6, 2);
    sws[k].wrk_strt_day = lb_data2atoi(hws->wrk_start_day, 2);           /* 개시일시 */
    sws[k].wrk_strt_hr =  lb_data2atoi(hws->wrk_start_hour, 2);
    sws[k].wrk_strt_min = lb_data2atoi(hws->wrk_start_min, 2);
    sws[k].wrk_end_day = 0;                              /* 종료일시 */
    sws[k].wrk_end_hr = 0;
    sws[k].wrk_end_min = 0;
    for (i=0; i<2; i++)                                   /* 감지/처리 대수 */
        for (j=0; j<6; j++)
            sws[k].cars[i][j] = 0;

    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : wrk_end_data2shared()
 *   작 성 자 : JBY (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.11
 *   수 정 일 :
 *   설    명 : 출구근무종료 처리
 *
 *========================================================================
*/
static int wrk_end_data2shared(struct hi_wrk_end *hwwe)
{
    int    k;

    k = hi_comm_ctrl.lane_no - 1;
    sws[k].lane_no = k+1;
    sws[k].wrk_stat = 0;                               /* 비근무중 */
    memcpy(sws[k].wrk_no, hwwe->wrk_no, 4);            /* 근무번호 */
    memcpy(sws[k].wrkr_no, hwwe->wrkr_no, 4);          /* 근무자번호 */
    sws[k].wrk_year = lb_data2atoi(hwwe->wrk_date  , 4);                  /* 근무일자 */
    sws[k].wrk_mon  = lb_data2atoi(hwwe->wrk_date+4, 2);
    sws[k].wrk_day  = lb_data2atoi(hwwe->wrk_date+6, 2);
    sws[k].wrk_strt_day = lb_data2atoi(hwwe->wrk_start_day , 2);        /* 개시일시 */
    sws[k].wrk_strt_hr  = lb_data2atoi(hwwe->wrk_start_hour, 2);
    sws[k].wrk_strt_min = lb_data2atoi(hwwe->wrk_start_min , 2);
    sws[k].wrk_end_day  = lb_data2atoi(hwwe->wrk_end_day   , 2);            /* 종료일시 */
    sws[k].wrk_end_hr   = lb_data2atoi(hwwe->wrk_end_hour  , 2);
    sws[k].wrk_end_min  = lb_data2atoi(hwwe->wrk_end_min   , 2);

    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : hnd_data2shared()
 *   작 성 자 : JBY (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.11
 *   수 정 일 :
 *   설    명 : 통행권확인 처리
 *
 *========================================================================
*/
static int hnd_data2shared(struct hi_hnd_data *hhd)
{
    int    k;
    int    j;

    /* 차종으로 처리 */
    k=hi_comm_ctrl.lane_no - 1;
    sws[k].lane_no = k+1;
    if (hhd->car_kind - '0' >= 1 && hhd->car_kind - '0' <= 6)
        j=hhd->car_kind -'0' - 1;
    else
        j=0;

    sws[k].cars[1][j]++;

    return(0);
}

/*
 *========================================================================
 *
 *   함 수 명 : lane_stat2shared()
 *   작 성 자 : JBY (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.11
 *   수 정 일 :
 *   설    명 : 근무자 모니터링 데이타 생성 차로 정보이용
 *
 *========================================================================
*/
lane_stat2shared()
{
    int    shmid, shmsz;
    char    *shmad;
    int    k;
    int    wrk_no;

    /* 차로 프로그램에서의 MONITORING DATA 생성 */
    if (sws == NULL)
    {
        shmsz = sizeof(struct sm_wrk_stat)*MAX_LANE;
        shmid = shmget(KM_KMST, shmsz, IPC_CREAT | 0666);
        if (shmid >= 0)
        {
            shmad = shmat(shmid, (void *)0, 0666);
            if (shmad != NULL)
                sws = (struct sm_wrk_stat *)shmad;
        }
    }
    if (sws == NULL) return(0);

    k = lb_data2atoi(hi_comm_ctrl.lane_stat_info.lane_no, 2) - 1;
    sws[k].lane_no = k+1;
    sws[k].wrk_stat = hi_comm_ctrl.lane_stat_info.wrk_stat;
    wrk_no = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_no, sizeof(hi_comm_ctrl.lane_stat_info.wrk_no));

    if (wrk_no != 0)
    {
        memcpy(sws[k].wrk_no, hi_comm_ctrl.lane_stat_info.wrk_no, 4);
        memcpy(sws[k].wrkr_no, hi_comm_ctrl.lane_stat_info.wrkr_no, 4);
    }
    else
    {
        memcpy(sws[k].wrk_no, hi_comm_ctrl.lane_stat_info.be_wrk_no, 4);
        memcpy(sws[k].wrkr_no, hi_comm_ctrl.lane_stat_info.be_wrkr_no, 4);
    }

    /* 근무     일 */
    sws[k].wrk_year = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_year, 4);
    sws[k].wrk_mon = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_mon, 2);
    sws[k].wrk_day = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_day, 2);
    /* 근무 개시 일시분 */
    sws[k].wrk_strt_day = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_strt_day, 2);
    sws[k].wrk_strt_hr = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_strt_hr, 2);
    sws[k].wrk_strt_min = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_strt_min, 2);
    /* 근무 종료 일시분 */
    sws[k].wrk_end_day = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_end_day, 2);
    sws[k].wrk_end_hr = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_end_hr, 2);
    sws[k].wrk_end_min = lb_data2atoi(hi_comm_ctrl.lane_stat_info.wrk_end_min, 2);

    return(0);
}
