/*
 *========================================================================
 *
 *   시스템명 : 요금징수 시스템
 *   파 일 명 : lcc_function.c
 *   작 성 자 : 오효섭 (catacath@neighbor21.co.kr)
 *   작 성 일 : 2012.10.04
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/msg.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <strings.h>

#include "hi_ctrl.h"
#include "snd_rcv_knd.h"
#include "lo_ctrl.h"
#include "hi_packet_format.h"
#include "dir_path.h"
#include "file_lb.h"
#include "lb_func_list.h"
#include "func_list.h"

/*==========================================================================*/
/* 전역 변수 정의                                                           */
/*==========================================================================*/

int lcc_proc_start(), lcc_proc_stop(), lcc_resnd(),     lcc_tbl_dmp();
int lcc_tbl_ord(),    lcc_wrk_stop(),  lcc_lane_test(), lcc_warr_seq();
int lcc_rqseq_snd(),  lcc_iss_info(),  lcc_prev_tr(),   lcc_tag_info();
int lcc_tag_sale(),   lcc_tag_chrg(),  lcc_tag_rfnd();

static    struct    {
    int    cmd;                /* CONTROL COMMAND      */
    int    (*func)();          /* CONTROL FUNCTION    */
} lcc_func[] = {
    { LW_PROC_STRT              ,  lcc_proc_start               },   /* PROCESS START               */
    { LW_PROC_END               ,  lcc_proc_stop                },   /* PROCESS 종료 지시           */
    { LW_RESND_NO               ,  lcc_resnd                    },   /* 재전송지시                  */
    { LW_TBL_DMP                ,  lcc_tbl_dmp                  },   /* TABLE DUMP 지시             */
    { LW_TBLCMD_RQ              ,  lcc_tbl_ord                  },   /* TABLE 지령요구              */
    { LW_WRKEND_CPL             ,  lcc_wrk_stop                 },   /* 근무종료처리 완료           */
    { LW_LANECOMMTEST           ,  lcc_lane_test                },   /* 차로 TEST 지시              */
    { LW_WARR_SND_NO            ,  lcc_warr_seq                 },   /* 보증전송연번지시            */
    { -1                        ,  NULL                         }
};

static unsigned int m_len = 0;                         /* 관리명령 수신 LENGTH */
static    char      m_buf[4096];                       /* 관리명령 수신 BUFF    */
static    struct    sockaddr_un sock_svr, sock_cli;
static    struct    lo_lane_ctrl_reply    llcr;        /* 명령응답        */
#if 0
static    struct    tag_lane_ctrl_reply   tlcr;        /* 명령응답        */
#endif
          struct    lo_lane_ctrl_cmd     *llcc;

struct db_reply{
    char    data[4096];
};


/*==================================== FUNCTION LIST ===========================================
 * lcc_open()                       하위차로운영 응용프로그램과의 INTERFACE CHANNEL OPEN
 * lcc_accept()                     하위차로 운영 응용프로그램의 접속요구 수신 처리
 * lcc_recv()                           "               "     의 요구 전문 수신처리
 * lcc_check()                          "               "     의 요구 전문 실행처리
 * lcc_proc_start()                 하위차로 통신 개시 처리
 * lcc_proc_stop()                  하위차로 통신 종료 처리
 * lcc_resnd()                      축적자료 재전송요구 처리
 * lcc_tbl_dmp()                    TABLE DUMP 처리
 * lcc_tbl_ord()                    TABLE 변경 처리
 * lcc_wrk_stop()                   근무종료 처리완료 전문 처리
 * lcc_lane_test()                  하위차로 통신 TEST 처리
 * lcc_warr_seq()                   보증전송연번 처리
 * lcc_rqseq_snd()                  차로로부터 전송연번을 요구받아 DB 조회 후 결과 송신
 * lcc_iss_info()                   차로로부터 발행정보를 요구받아 DB 조회 후 결과 송신
 * lcc_prev_tr()                    차로로부터 직전거래내역을 요구받아 DB 조회 후 결과 송신
 * lcc_tag_info()                   차로로부터 TAG 정보조회를 요구받아 DB 조회 후 결과 송신
 * lcc_tag_sale()                   정산센터로부터 TAG 판매 등록 결과를 수신받아 차로로 송신
 * lcc_tag_chrg()                   정산센터로부터 TAG 충전 요청 결과를 수신받아 차로로 송신
 * lcc_tag_rfnd()                   정산센터로부터 TAG 충전취소 요청 결과를 수신받아 차로로 송신
 * lcc_reply()                      하위차로 관리 응용프로그램으로 결과 전문 송신
 * lcc_epay_reply()                 전자지불 수집/인증 프로그램으로 결과 전문 송신
 * lcc_error()                          "                  "        오류 전문 송신
*===============================================================================================*/

/*
 *========================================================================
 *
 *   Function : lcc_open()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 관리자 프로그램의 차로제어를 위한 INTERFACE CHANNEL OPEN.
 *
 *========================================================================
*/
int lcc_open()
{
    char    lcc_path[128];
    int    sock;

    hi_comm_ctrl.hi_comm_iffd[0] = -1;        /* Listen socket fd         */
    hi_comm_ctrl.hi_comm_iffd[1] = -1;        /* accepted socket fd         */
    hi_comm_ctrl.tbl_mngt_iffd    = -1;       /* TABLE 관리자(FILE SVR)    */

    sprintf(lcc_path, "%s/%s/tcslcp%.2s%02d", DIR_TCS, DIR_SPOOL,
            hi_comm_ctrl.bas_tbl.plz_id, hi_comm_ctrl.lane_no);
    unlink(lcc_path);
    sock = socket(AF_UNIX, SOCK_STREAM, 0);

    lane_log(" (lcc_function.c) 관리자 OPEN SOCK (%d) PATH (%s)\n", sock, lcc_path);
    if (sock < 0) return (-1);

    bzero(&sock_svr, sizeof(sock_svr));
    sock_svr.sun_family = AF_UNIX;
    strcpy(sock_svr.sun_path, lcc_path);

    if (bind(sock, (struct sockaddr *)&sock_svr, sizeof(sock_svr)) < 0)
    {
        close(sock);
        return (-1);
    }
    listen(sock, 1);

    fcntl(sock, F_SETFL, O_NONBLOCK);
    hi_comm_ctrl.hi_comm_iffd[0] = sock;

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_accept()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 관리자 응용프로그램의 접속요구 ACCEPT.
 *
 *========================================================================
*/
int lcc_accept()
{
    int    sock;
    socklen_t sock_len;

    if (hi_comm_ctrl.hi_comm_iffd[0] < 0 || hi_comm_ctrl.hi_comm_iffd[1] >= 0) return (0);

    sock_len = sizeof(sock_cli);
    sock = accept(hi_comm_ctrl.hi_comm_iffd[0], (struct sockaddr *)&sock_cli, &sock_len);

    if (sock == -1)
    {
        close(hi_comm_ctrl.hi_comm_iffd[0]);
        if (hi_comm_ctrl.hi_comm_iffd[1] >= 0)
            close(hi_comm_ctrl.hi_comm_iffd[1]);

        lcc_open();
        return (0);
    }

    m_len = 0;
    hi_comm_ctrl.hi_comm_iffd[1] = sock;
    lane_log(" (lcc_function.c) 관리자 요구 hi_comm_ctrl.hi_comm_iffd[0] %d hi_comm_ctrl.hi_comm_iffd[1] %d\n", hi_comm_ctrl.hi_comm_iffd[0], hi_comm_ctrl.hi_comm_iffd[1]);
    lane_log(" (lcc_function.c) 관리자 연결 connected ok (%d)\n", sock);

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_recv()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 관리자프로그램으로 부터 제어명령 수신 처리
 *
 *========================================================================
*/
int lcc_recv()
{
    int    r_buf[4096];
    int    r_len;
    
    if (hi_comm_ctrl.hi_comm_iffd[1] < 0)
        return (0);

    r_len = read(hi_comm_ctrl.hi_comm_iffd[1], r_buf, sizeof(r_buf));

    lane_log(" (lcc_function.c) 관리자 명령 수신 receive %d bytes(already %d bytes).\n", r_len, m_len);

    if (r_len <= 0)
    {
        lane_log(" (lcc_function.c) 관리자연결 종료  disconnected from administrator...\n");
        close(hi_comm_ctrl.hi_comm_iffd[1]);
        hi_comm_ctrl.hi_comm_iffd[1] = -1;

        return (0);
    }

    memcpy(&m_buf[m_len], r_buf, r_len);
    m_len += r_len;

    if (m_len < sizeof(struct lo_lane_ctrl_cmd)) return (0);

    llcc = (struct lo_lane_ctrl_cmd *)m_buf;

    lane_log(" (lcc_function.c) 관리자 명령 command = [%d]\n", llcc->cmd);

    /* 하위차로 관리 명령 수신 완료 */
    m_len = 0;

    switch (llcc->cmd)
    {
        case LW_PROC_STRT:            /* PROCESS START               */
        case LW_PROC_END:             /* PROCESS 종료 지시           */
        case LW_RESND_NO:             /* 재전송지시                  */
        case LW_TBL_DMP:              /* TABLE DUMP 지시             */
        case LW_TBLCMD_RQ:            /* TABLE 지령요구              */
        case LW_WRKEND_CPL:           /* 근무종료처리 완료           */
        case LW_LANECOMMTEST:         /* 차로 TEST 지시              */
        case LW_WARR_SND_NO:          /* 보증전송연번지시            */
        case LW_RQ_SEQ_NO:            /* 전송연번 전송               */
lane_log("Come?\n");
            if (hi_comm_ctrl.manager[llcc->cmd-1].lo_lane_ctrl_cmd.cmd != 0)
            {
lane_log("This?\n");
                if ((hi_comm_ctrl.time - hi_comm_ctrl.manager[llcc->cmd-1].req_tm) > 30 * 6)
                    lcc_reply(llcc->cmd,  1, 1, "실행 대기 시간이 초과 되었습니다.");
                else
                {
                    lcc_error(llcc->cmd, "직전 명령 처리 중입니다.");
                    return (0);
                }
            }
lane_log("Why?\n");
            break;
        default:
            lcc_error(llcc->cmd, "제어명령 코드가 틀립니다.");
            return (0);
    }

    lane_log(" (lcc_function.c) 관리명령 [%X] 수신\n", llcc->cmd);

    memcpy(&hi_comm_ctrl.manager[llcc->cmd-1].lo_lane_ctrl_cmd,  llcc, sizeof(struct lo_lane_ctrl_cmd));
    hi_comm_ctrl.manager[llcc->cmd-1].sock = hi_comm_ctrl.hi_comm_iffd[1];
    hi_comm_ctrl.manager[llcc->cmd-1].req_tm = hi_comm_ctrl.time;
    hi_comm_ctrl.manager[llcc->cmd-1].chck = 0;
    hi_comm_ctrl.hi_comm_iffd[1] = -1;

    lane_log("End?\n");
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_check()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 하위통신 관리 응용 프로그렘으로 부터 수신된 명령 처리
 *              명령처리 완료이면 재수신 준비.
 *
 *========================================================================
*/
int lcc_check()
{
    fd_set    rfds;
    struct    timeval    timeval;
    int       timeout, nfound, nfds;
    char      clean_b[128];
    int       clean_l, i;

    for (i=0; i<15; i++)
    {
        if (hi_comm_ctrl.manager[i].lo_lane_ctrl_cmd.cmd == 0)    /* 요구명령 없음 */
            continue;
        if (hi_comm_ctrl.manager[i].chck)             /* 처리 완료     */
        {
            FD_ZERO(&rfds);
            FD_SET(hi_comm_ctrl.manager[i].sock, &rfds);

            timeval.tv_sec = 0;
            timeval.tv_usec = 0;

            nfds = hi_comm_ctrl.manager[i].sock + 1;
            nfound = select(nfds, &rfds, NULL, NULL, &timeval);

            if (nfound <= 0||!FD_ISSET(hi_comm_ctrl.manager[i].sock, &rfds))
                continue;

            clean_l = read(hi_comm_ctrl.manager[i].sock, clean_b, sizeof(clean_b));

            if (clean_l <= 0)
            {
                lane_log(" (lcc_function.c) 관리자 연결 단절 ERRNO[%d] clean_l [%d]\n", errno, clean_l);
                close(hi_comm_ctrl.manager[i].sock);
                hi_comm_ctrl.manager[i].sock = -1;
                hi_comm_ctrl.manager[i].lo_lane_ctrl_cmd.cmd = 0;
            }

            if (lo_comm_ctrl.stat_flag == L_STOP)
            {
                lcc_reply(i+1, 1, 1, "차로와의 통신이 단절 되었읍니다.");
            }
            continue;
        }

        timeout = hi_comm_ctrl.time - hi_comm_ctrl.manager[i].req_tm;

        if (timeout > 30 * 6)             /* 대기 시간초과*/
        {
            lcc_reply(i+1, 1, 1, "실행 대기 시간이 초과 되었습니다.");
            continue;
        }

        lane_log(" (lcc_function.c) 관리자명령 수행 차로로 지령 [%d] \n", i);
        log_write( "lcc_func[%d]\n", i );

        (*lcc_func[i].func)(i);

        lane_comm_snd();
    }
    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : lcc_proc_start()
 *   작 성 자 : 오효섭 (catacath@nate.com)
 *   작 성 일 : 2012.10.04
 *   수 정 일 :
 *   설    명 : 프로세스 START 지시
 *
 *========================================================================
*/
int lcc_proc_start(int cidx)
{
    if (lo_comm_ctrl.stat_flag & L_OPEN && !(lo_comm_ctrl.stat_flag & L_STOP))
        lcc_reply(hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd, 1, 1, "차로통신 프로세스가 이미 실행 중 입니다.");
    else
        lcc_reply(hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd, 0, 1, "차로와의 통신이 재개 되었습니다.");

    if (!(lo_comm_ctrl.stat_flag & L_OPEN)) lo_comm_ctrl.stat_flag |= L_OPEN;
    lo_comm_ctrl.stat_flag &= ~L_STOP;

    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : lcc_proc_stop()
 *   작 성 자 : 오효섭 (catacath@nate.com)
 *   작 성 일 : 2012.10.04
 *   수 정 일 :
 *   설    명 : 프로세스 종료 지시
 *
 *========================================================================
*/
int lcc_proc_stop(int cidx)
{
    lo_comm_ctrl.stat_flag = L_ERR;
    lcc_reply(hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd, 0, 1, "차로와의 통신을 중단 하였습니다.");
    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : lcc_resnd()
 *   작 성 자 : 오효섭 (catacath@nate.com)
 *   작 성 일 : 2012.10.04
 *   수 정 일 :
 *   설    명 : 재전송요구
 *
 *========================================================================
*/
int lcc_resnd(int cidx)
{

    if (hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.arg[0] == 0)
    {
        lcc_reply(LW_RESND_NO, 1, 1, "재전송요구 개시연번이 틀립니다.");
        return (0);
    }

    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_RESND_NO, 1, 1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }

    if (hi_comm_ctrl.snd.len != 0 || (hi_comm_ctrl.now_stat_info & H_PLURAL)) return (0);

    /* 축적 데이타 재전송요구 */
    hi_comm_ctrl.rtr.rq_resnd_strtno = hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.arg[0];     /* 재전송개시연번 */
    hi_comm_ctrl.rtr.rq_resnd_endno = hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.arg[1];      /* 재전송종료연번 */
    e_memcpy(hi_comm_ctrl.rtr.wrk_year, hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.wrk_year); /* 근무일자       */
    e_memcpy(hi_comm_ctrl.rtr.wrk_mon,  hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.wrk_mon ); /* 근무일자       */
    e_memcpy(hi_comm_ctrl.rtr.wrk_day,  hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.wrk_day ); /* 근무일자       */
    e_memcpy(hi_comm_ctrl.rtr.wrk_no,   hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.wrk_no  ); /* 근무번호       */

    lane_log(" (lcc_function.c) 재전송처리 %d~%d %d %d %d\n",
               hi_comm_ctrl.rtr.rq_resnd_strtno, hi_comm_ctrl.rtr.rq_resnd_endno,
               hi_comm_ctrl.rtr.wrk_year, hi_comm_ctrl.rtr.wrk_mon, hi_comm_ctrl.rtr.wrk_day);

    hi_comm_ctrl.manager[cidx].chck = 1;

    hi_comm_ctrl.now_stat_info |= H_ACC_RESND;
    hi_comm_ctrl.now_stat_info &= ~H_FRAME_WAIT;

    hi_comm_ctrl.snd.len = rq_accuml_data_resnd(1);

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_tbl_dmp()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : TABLE DUMP지시
 *
 *========================================================================
*/
int lcc_tbl_dmp(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_TBL_DMP,1,1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }
    lane_log(" (lcc_function.c) TDUMP len=%d, stat=%x\n", hi_comm_ctrl.snd.len, hi_comm_ctrl.now_stat_info);
    if (hi_comm_ctrl.snd.len != 0 || (hi_comm_ctrl.now_stat_info & H_PLURAL))
        return (0);

    hi_comm_ctrl.dmp_tbl_no = hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.arg[0];    /* DUMP TABLE # */
    switch (hi_comm_ctrl.dmp_tbl_no)
    {
        case TB_BAS:          /* 정수 TABLE                 */
        case TB_WRKR:         /* 근무자 TABLE               */
        case TB_HOLI:         /* 휴일 TABLE                 */
        case TB_ISS_COMP:     /* 발행사                */
        case TB_IMM_CARNO:    /* 차량번호면제                 */
        case TB_IMM_CRDNO:    /* 면제카드               */
        case TB_ADV_PAY:      /* 사전등록               */
        case TB_PL_CRD:       /* 교통카드PL               */
        case TB_BL_CRD:       /* 교통카드BL               */
        case TB_RED_CARNO:    /* 차량번호감면               */
            break;
        default:
            lcc_reply(LW_TBL_DMP,1,1, "테이블 구분이 틀립니다.");
            return (0);
    }

    hi_comm_ctrl.snd.len = snd_tbl_cmd(2);
    if (hi_comm_ctrl.snd.len > 0)
        hi_comm_ctrl.manager[cidx].chck = 1;

    lane_log(" (lcc_function.c) Table DUMP request %d...\n", hi_comm_ctrl.snd.len);
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_tbl_ord()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : TABLE 지령 요구
 *
 *========================================================================
*/
int lcc_tbl_ord()
{
    lane_log("테이블 지령 요구\n");
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_TBLCMD_RQ, 1, 1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }

    if (hi_comm_ctrl.snd.len != 0 || (hi_comm_ctrl.now_stat_info & H_PLURAL))
        return (0);

    hi_comm_ctrl.snd.len = snd_tbl_cmd(3);

    lcc_reply(LW_TBLCMD_RQ, 0, 1, "테이블 지령이 처리 되었습니다.");

    return (0);
}

/*
 *========================================================================
 *
 *   함 수 명 : lcc_wrk_stop()
 *   작 성 자 : 오효섭 (catacath@nate.com)
 *   작 성 일 : 2012.10.04
 *   수 정 일 :
 *   설    명 : 근무종료 처리 완료
 *
 *========================================================================
*/
int lcc_wrk_stop(int cidx)
{
    lcc_reply(hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd, 0, 1, "정상처리");
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_lane_test()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 차로통신 TEST 관리자 요구
 *
 *========================================================================
*/

int lcc_lane_test(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_LANECOMMTEST,1,1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }
    if (hi_comm_ctrl.snd.len != 0 || (hi_comm_ctrl.now_stat_info & H_PLURAL))
        return (0);

    hi_comm_ctrl.manager[cidx].chck = 1;
    hi_comm_ctrl.snd.len = rq_plz_cir_test(0);
    hi_comm_ctrl.now_stat_info |= H_CIR;
    lane_log(" (lcc_function.c) snd.len  [%d] [%s]\n",hi_comm_ctrl.snd.len, hi_comm_ctrl.snd.buf);

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcp_ltest()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 차로통신 TEST _LINE_TEST_ 사용시 사용
 *
 *========================================================================
*/
int lcp_ltest()
{

    if (hi_comm_ctrl.snd.len != 0) {
              return (0);
    }
    hi_comm_ctrl.snd.len = rq_plz_cir_test(0);

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_warr_seq()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 보증전송연번 송신
 *
 *========================================================================
*/
int lcc_warr_seq(int cidx)
{
    lcc_reply(LW_WARR_SND_NO, 0, 1, "전송연번 보증 처리가 되었습니다");

    hi_comm_ctrl.warr_snd_no = hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.arg[0];

    if (lo_comm_ctrl.stat_flag == L_STOP)
        return (0);
    if (hi_comm_ctrl.snd.len != 0 || (hi_comm_ctrl.now_stat_info & H_PLURAL))
        return (0);

    hi_comm_ctrl.snd.len = snd_warr_snd_no(0);
    return (0);
}
/* 신규추가 */
#if 0
/*
 *========================================================================
 *
 *   Function : lcc_rqseq_snd()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 전송연번 DB 조회 결과를 차로로 응답
 *
 *========================================================================
*/
int lcc_rqseq_snd(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_RQ_SEQ_NO,1,1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }

    hi_comm_ctrl.snd.len = snd_rq_seq_no((char *)llcc->msg);/* 전송연번 요청 결과 송신 */

    hi_comm_ctrl.manager[cidx].chck = 1;

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_iss_info()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 발행정보 DB 조회 결과를 차로로 응답
 *
 *========================================================================
*/
int lcc_iss_info(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_ISS_INFO,1,1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }

    hi_comm_ctrl.snd.len = snd_iss_info((char *)llcc->msg);/* 발행정보 요청 결과 송신 */

    hi_comm_ctrl.manager[cidx].chck = 1;
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_tag_sale()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 기간권 TAG 판매 요청 결과
 *
 *========================================================================
*/
int lcc_tag_sale(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        if (hi_comm_ctrl.manager[cidx].sock > 0)
            close(hi_comm_ctrl.manager[cidx].sock);
        hi_comm_ctrl.manager[cidx].sock = -1;
        hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd = 0;
        return (0);
    }

    if (hi_comm_ctrl.snd.len != 0 )
        return (0);

    hi_comm_ctrl.snd.len = snd_perd_tag_sale((char *)llcc->msg);    /* 기간권 TAG 판매 요청 결과 */
    lane_log(" [LC2SV] (lcc_function.c) 기간권 TAG 판매 요청 결과 응답코드 [%4.4s]\n", llcc->msg);
    hi_comm_ctrl.manager[cidx].chck = 1;
lane_log("5\n");
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_tag_chrg()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 기명권 TAG 충전 요청 결과
 *
 *========================================================================
*/
int lcc_tag_chrg(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        if (hi_comm_ctrl.manager[cidx].sock > 0)
            close(hi_comm_ctrl.manager[cidx].sock);
        hi_comm_ctrl.manager[cidx].sock = -1;
        hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd = 0;
        return (0);
    }

    if (hi_comm_ctrl.snd.len != 0 )
        return (0);

    hi_comm_ctrl.manager[cidx].chck = 1;
    hi_comm_ctrl.snd.len = snd_rgstr_chrg_reply((char *)llcc->msg);    /* 기명권 TAG 충전 요청 결과 */
    lane_log(" [LC2SV] (lcc_function.c) 기명권 TAG 충전 요청 결과 응답코드 [%4.4s]\n", llcc->msg);

    hi_comm_ctrl.manager[cidx].chck = 1;

    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_prev_tr()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 직전거래 DB 조회 결과를 차로로 응답
 *
 *========================================================================
*/
int lcc_prev_tr(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_PREV_TR,1,1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }

    hi_comm_ctrl.snd.len = snd_prev_tr_info((char *)llcc->msg);/* 직전거래 요청 결과 송신 */

    hi_comm_ctrl.manager[cidx].chck = 1;
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_tag_rfnd()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : 기명권 TAG 충전취소 요청 결과
 *
 *========================================================================
*/
int lcc_tag_rfnd(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        if (hi_comm_ctrl.manager[cidx].sock > 0)
            close(hi_comm_ctrl.manager[cidx].sock);
        hi_comm_ctrl.manager[cidx].sock = -1;
        hi_comm_ctrl.manager[cidx].lo_lane_ctrl_cmd.cmd = 0;
        return (0);
    }

    if (hi_comm_ctrl.snd.len != 0 )
        return (0);

    hi_comm_ctrl.manager[cidx].chck = 1;
    hi_comm_ctrl.snd.len = snd_tag_cncl_chrg((char *)llcc->msg);    /* 기명권 TAG 충전취소 요청 결과 */
    lane_log(" [LC2SV] (lcc_function.c) 기명권 TAG 충전 요청 결과 응답코드 [%4.4s]\n", llcc->msg);

    hi_comm_ctrl.manager[cidx].chck = 1;
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_tag_info()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.09.03
 *   Modified :
 *   Remark   : TAG 정보 DB 조회 결과를 차로로 응답
 *
 *========================================================================
*/
int lcc_tag_info(int cidx)
{
    if (lo_comm_ctrl.stat_flag == L_STOP)
    {
        lcc_reply(LW_PREV_TR,1,1, "차로와의 통신이 단절된 상태 입니다.");
        return (0);
    }
lane_log("1");
    hi_comm_ctrl.snd.len = snd_tag_info_srch((char *)llcc->msg);/* TAG정보 요청 결과 송신 */

    hi_comm_ctrl.manager[cidx].chck = 1;
    return (0);
}
#endif
/*
 *========================================================================
 *
 *   Function : lcc_reply()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 관리자프로그램으로 부터 제어명령 수신 처리
 *
 *========================================================================
*/
int lcc_reply(int cmd, int rsp, int end, char *msg)
{
    int    ret;

    memset(&llcr, 0, sizeof(struct lo_lane_ctrl_reply));
    llcr.cmd = cmd;
    llcr.rsp = rsp;
    llcr.fin = end;

    strcpy(llcr.msg, msg);

    if (hi_comm_ctrl.manager[cmd-1].sock > 0)
    {

        ret = write(hi_comm_ctrl.manager[cmd-1].sock, &llcr, sizeof(llcr));
        if(ret < 0)    return (-1);
    }
    else
        return (-1);

    if (llcr.fin)
    {
        if (hi_comm_ctrl.manager[cmd-1].sock > 0)
            close(hi_comm_ctrl.manager[cmd-1].sock);
        hi_comm_ctrl.manager[cmd-1].sock = -1;
        hi_comm_ctrl.manager[cmd-1].lo_lane_ctrl_cmd.cmd = 0;
    }
    return (0);
}

/*
 *========================================================================
 *
 *   Function : lcc_error()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 관리자프로그램으로 부터 제어명령 수신 처리
 *
 *========================================================================
*/
int lcc_error(int cmd, char *msg)
{
    if (hi_comm_ctrl.hi_comm_iffd[1] < 0)
        return (0);
    lane_log(" (lcc_function.c) 관리자 응답 [%02x]error response [%s]\n", cmd, msg);
    memset(&llcr, 0, sizeof(struct lo_lane_ctrl_reply));
    llcr.cmd = cmd;
    llcr.rsp = 1;            /* ERROR !!!!  */
    strcpy(llcr.msg, msg);
    write(hi_comm_ctrl.hi_comm_iffd[1], &llcr, sizeof(llcr));

    close(hi_comm_ctrl.hi_comm_iffd[1]);
    hi_comm_ctrl.hi_comm_iffd[1] = -1;

    return (0);
}
#if 0
/*
 *========================================================================
 *
 *   Function : lcc_epay_reply()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.24
 *   Modified :
 *   Remark   : 전자지불 수집 / 인증 시스템으로 응답
 *
 *========================================================================
*/
int lcc_epay_reply(int cmd, int rsp,int end, struct db_reply *msg, int len)
{
    int    ret;

    memset(&tlcr, 0, sizeof(struct tag_lane_ctrl_reply));
    tlcr.cmd = cmd;
    tlcr.rsp = rsp;
    tlcr.fin = end;
    tlcr.leng = len;

    memcpy(tlcr.msg, msg->data, len);

    if (hi_comm_ctrl.manager[cmd-1].sock > 0)
    {
        ret = write(hi_comm_ctrl.manager[cmd-1].sock, &tlcr, sizeof(struct tag_lane_ctrl_reply));
        if( ret < 0 )
        {
            lane_log("전자지불 수집/인증시스템 write ret : %d\n", ret);
            return (-1);
        }
    }
    else
    {
        lane_log("전자지불 수집/인증시스템 sock : %d\n", hi_comm_ctrl.manager[cmd-1].sock);
        return (-1);
    }

    if (end)
    {
        if (hi_comm_ctrl.manager[cmd-1].sock > 0)
            close(hi_comm_ctrl.manager[cmd-1].sock);
        hi_comm_ctrl.manager[cmd-1].sock = -1;
        hi_comm_ctrl.manager[cmd-1].lo_lane_ctrl_cmd.cmd = 0;
    }
    return (0);
}
#endif
