mmaaiinn..cc

来源:互联网 发布:软件项目报价单模板 编辑:程序博客网 时间:2024/05/01 15:14

#include <stdio.h>
#include "shpa3api.h"
#include "mysql.h"

int stateValue=-1;
char *type;
int i;

struct StateInfo
{
 int value;
 char *info;
};
struct StateInfo myState;

struct IDCardANDPass
{
 char *idCard;
 char *pass;
};
struct IDCardANDPass idCardPass[10];

enum ChanelState
{
 IDLE
 WALT_CONNECT
 PLAY_WELCOME
 CHECK_PLAY_COME
 PLAY_SELECT
 CHECK_PLAY_SELECT
 STEP1_CHECK_IDCARD
 STEP1_PLAY_PASS
 STEP1_CHECK_PASS
 STEP1_CHECK_USER
 STEP2_CHECK_IDCARD
 STEP2_PLAY_PASS
 STEP2_CHECK_PASS
 STEP2_PLAY_PASS2
 STEP2_CHECK_PASS2
 STEP2_CHECK_USER
 STEP3_CHECK_IDCARD
 STEP3_PLAY_PASS
 STEP3_CHECK_PASS
 STEP3_PLAY_LOSS
 STEP3_CHECK_LOSS
 CHECK_PLAY_BYEBYE
 NOTRK
};
enum ChanelState chanelState[10]={IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE};

char *currentState="ABC";

//数据库参数
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int t,r;


//主函数
int main ()
{
 InitMySQL();
    int init=0;
    init=SsmStartCti("ShConfig.ini","ShIndex.ini");
    if(init!=0)
    {          
        printf("Init Is Error!/n");
        puts(SsmGetLastErrMsgA());
        return 0;
    }
    else
    {
        printf("Init Is OKa!/n");
    }
   
    int i; 
    while(1)
    {
        for(i=0;i<8;i++)
     {
            getChanelState(i);//通道状态
            getChanelType(i);//通道类型
            scanChanel(i,myState.value);//检测通道
     }
        sleep(1);
        fflush(stdout);
        printf("/n/n");
    }

    int nTmp = getch();
 while ((nTmp != 'q') && (nTmp != 'Q'))
  nTmp = getch();

 ExitSys();
    return 0;
}

InitMySQL()
{
 mysql_init(&mysql);

 if (!mysql_real_connect(&mysql,"localhost", "root", "", "cti",0,NULL,0))
 {
  printf("Error connection to database:%s/n",mysql_error(&mysql));
 }
 else
 {
  printf("Connected......../n");
 } 
}

getChanelState(int chanelIndex)
{
    int temp=SsmGetChState(chanelIndex);
    switch(temp)
    {
        case 0:
            myState.value=0;
            myState.info="Kong Xian";
            break;
        case 1:
            myState.value=1;
            myState.info="Zai ji";
            break;
        case 2:
            myState.value=2;
            myState.info="Zhen Ling";
            break;
        case 3:
            myState.value=3;
            myState.info="Tong Hua";
            break;
        case 4:
            myState.value=4;
            myState.info="Deng Dai Bo Hao Yin";
            break;
        case 5:
            myState.value=5;
            myState.info="Bo Hao";
            break;
        case 6:
            myState.value=6;
            myState.info="Deng Dai Bo Hao Jie Guo";
            break;
        case 7:
            myState.value=7;
            myState.info="Guo Qi";
            break;
        case 9:
            myState.value=9;
            myState.info="Deng Hou Bei Jiao Zhai Ji";
            break;
        default:
            break;
    }
   
    printf("%s------------",myState.info);
    printf("-------myState:%d---------",myState.value);
}

getChanelType(int chanelIndex)
{
 int temp=SsmGetChType(chanelIndex);
 switch(temp)
 {
  case 0:
   type = "Mo Ni";
   break;
  case 1:
   type = "Nei Xian";
   break;
  case 2:
   type = "Zuo Xi";
   break;
  case 3:
   type = "Lu Yin";
   break;
  case 20:
   type = "-1";
   break;
  default:
   type = "-1";
   break;
 }
 printf("%s-----------",type);
}


scanChanel(int ch,int nstate)
{
    if(nstate==7)//挂起
    {
     printf("------nstate=7--------");
        switch(chanelState[ch])
     {
            case CHECK_PLAY_COME:
       printf("------chanelState=4--------");
                SsmStopPlayFileList(ch);
                currentState="Stop Play Welcome Word!";
             break;
            case CHECK_PLAY_SELECT:
            case CHECK_PLAY_BYEBYE:
       printf("------chanelState=6,13,12,8--------");
                SsmStopPlayIndex(ch);
                currentState="Stop Index Play";
             break;
      
     }
    }
    printf("===chanelState:%d===",chanelState[ch]);
    switch(chanelState[ch])
    {
        case IDLE:
      printf("------chanelState=IDLE--------");
            if(nstate==2) //wai xian zhen ling
      {
       printf("------nstate=2--------");
                SsmPickup(ch);
                chanelState[ch]=WALT_CONNECT;
      }
            break;
        case WALT_CONNECT:
      printf("------chanelState=2--------");
      printf("----nstate:%d-----",nstate);
            if(nstate==3)//tonghua zhaungtai
      {
                chanelState[ch]=PLAY_WELCOME;
      }
            currentState="Play Welcome";
            break;
        case PLAY_WELCOME:
      printf("------chanelState=3--------");
            SsmClearFileList(ch);
            if((SsmAddToFileList(ch,"demovoc/Welcom1.voc",6,0,-1)==-1 ||  SsmAddToFileList(ch,"demovoc/Welcom2.voc",6,0,-1)==-1) )
      {
                resetCH(ch);
      }
            else if(SsmPlayFileList(ch) == -1)
      {
                resetCH(ch);
            }     
         else
      {
                chanelState[ch]=CHECK_PLAY_COME;
      }
            currentState="Play Select Alt Voc";
            break;
        case CHECK_PLAY_COME:
      printf("------chanelState=4--------");
            if( SsmCheckPlay(ch) > 0) //停止播放Welcome
                chanelState[ch] = PLAY_SELECT;
                currentState="end of playing welcom";
             break;
        case PLAY_SELECT:
      printf("------chanelState=5--------");
            SsmSetDtmfStopPlay(ch,1);
            if(SsmPlayIndexString(ch,"Select") == -1)
      {
                resetCH(ch);
      }
         else
      {
                SsmClearRxDtmfBuf(ch);
                chanelState[ch] = CHECK_PLAY_SELECT;
      }
            currentState="Select Key!";
            break;
  case CHECK_PLAY_SELECT:
      printf("------chanelState=12--------");
   if(SsmGetRxDtmfLen(ch) >= 1 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
    char temp[100];
    int tt=SsmGet1stDtmf(ch, temp);
    SsmClearRxDtmfBuf(ch);
    switch(temp[0])
    {
     case '1':   //DTMF=1: 验证
      if(SsmPlayIndexString(ch,"PlayIDCard") == -1)
      {
       resetCH(ch);
      }
      else
      {
       chanelState[ch] =STEP1_CHECK_IDCARD;
      }
      break;
     case '2':   //DTMF=2: 修改密码
      if(SsmPlayIndexString(ch,"Step2PlayIDCard") == -1)
      {
       resetCH(ch);
      }
      else
      {
       chanelState[ch] =STEP2_CHECK_IDCARD;
      }
      break ;
     case '3':   //DTMF=3:挂失
      if(SsmPlayIndexString(ch,"Step3PlayIDCard") == -1)
      {
       resetCH(ch);
      }
      else
      {
       chanelState[ch] =STEP3_CHECK_IDCARD;
      }
      break;     
     case '0':   //DTMF=0:  end of service,play "Byebye"
      currentState="Exit";
      if (SsmPlayIndexString(ch, "Byebye" )== -1 )
      {
       resetCH(ch);
      }      
      else
      {
       chanelState[ch]=CHECK_PLAY_BYEBYE;
      }
      break; 
         
     default: 
      break;
    }
   }   
   break; 

 


  /**
  *************************************查询身份证的有效性
  */

  case STEP1_CHECK_IDCARD://验证输入的IDCard
   if(SsmGetRxDtmfLen(ch) >= 19 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
    char temp[19];
    int tt=SsmGetDtmfStr(ch, temp);  
    SsmClearRxDtmfBuf(ch); 
    for(i=0;i<17;i++)
    {
     if(!isdigit(temp[i]))
     {
      printf("NOT IS NUMBER %dKKK/n",temp[i]);
      if (SsmPlayIndexString(ch, "InputError,PlayIDCard" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP1_CHECK_IDCARD;
      }
     }
    }
    if(!(isdigit(temp[17]) || temp[17]=='X') || temp[18]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,PlayIDCard" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP1_CHECK_IDCARD;
     }
    }
    idCardPass[ch].idCard=temp;
    chanelState[ch]=STEP1_PLAY_IDCARD_PASS;
    currentState="GEt ID CARD";
   }
   break;

  case STEP1_PLAY_PASS://播放输入密码
   if (SsmPlayIndexString(ch, "PlayIDCardPass" )== -1 )
   {
    resetCH(ch);
   }
   else
   {
    chanelState[ch] =STEP1_CHECK_PASS;
   }
   break;

  case STEP1_CHECK_PASS://验证密码
   if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
       char temp[7];
    int tt=SsmGetDtmfStr(ch, temp);
    SsmClearRxDtmfBuf(ch);
    for(i=0;i<6;i++)
    {
     if(!isdigit(temp[i]))
     {
      if (SsmPlayIndexString(ch, "InputError,PlayIDCardPass" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP1_CHECK_PASS;
      }
     }
    }
    if(temp[6]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,PlayIDCardPass" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP1_CHECK_PASS;
     }
    }
    idCardPass[ch].pass=temp;
    chanelState[ch] = STEP1_CHECK_USER;
    currentState="this channel is not playing index now";
   }
   
   break ;

  case STEP1_CHECK_USER://验证IDCard和Pass
   if(checkIDCard(idCardPass[ch].idCard,idCardPass[ch].pass)==0)
   {
    if (SsmPlayIndexString(ch, "IDCardSucceed" )== -1 )
    {
     resetCH(ch);
     break;
    }
    else
    {
     chanelState[ch]=CHECK_PLAY_BYEBYE;
    } 
   }
   else
   {
    if (SsmPlayIndexString(ch, "IDCardFailed" )== -1 )
    {
     resetCH(ch);
     break;
    }
    else
    {
     chanelState[ch]=CHECK_PLAY_BYEBYE;
    } 
   }
   break;

 

 

  /**
  *************************************修改密码********
  */

  case STEP2_CHECK_IDCARD://验证输入的IDCard
   if(SsmGetRxDtmfLen(ch) >= 19 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
    char temp[19];
    int tt=SsmGetDtmfStr(ch, temp);  
    SsmClearRxDtmfBuf(ch); 
    for(i=0;i<17;i++)
    {
     if(!isdigit(temp[i]))
     {
      printf("NOT IS NUMBER %dKKK/n",temp[i]);
      if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCard" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP2_CHECK_IDCARD;
      }
     }
    }
    if(!(isdigit(temp[17]) || temp[17]=='X') || temp[18]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCard" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP2_CHECK_IDCARD;
     }
    }
    idCardPass[ch].idCard=temp;
    chanelState[ch]=STEP2_PLAY_PASS;
    currentState="GEt ID CARD";
   }
   break;


  case STEP2_PLAY_PASS://播放输入密码
   if (SsmPlayIndexString(ch, "Step2PlayIDCardPass" )== -1 )
   {
    resetCH(ch);
   }
   else
   {
    chanelState[ch] =STEP2_CHECK_PASS;
   }
   break;

  case STEP2_CHECK_PASS://验证密码
   if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
       char temp[7];
    int tt=SsmGetDtmfStr(ch, temp);
    SsmClearRxDtmfBuf(ch);
    for(i=0;i<6;i++)
    {
     if(!isdigit(temp[i]))
     {
      if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP2_CHECK_PASS;
      }
     }
    }
    if(temp[6]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP2_CHECK_PASS;
     }
    }
    idCardPass[ch].pass=temp;
    chanelState[ch] = STEP2_PLAY_PASS2;
    currentState="this channel is not playing index now";
   }
   
   break ;

  case STEP2_PLAY_PASS2://再次播放输入密码
   if (SsmPlayIndexString(ch, "Step2PlayIDCardPass2" )== -1 )
   {
    resetCH(ch);
   }
   else
   {
    chanelState[ch] =STEP2_CHECK_PASS2;
   }
   break;


  case STEP2_CHECK_PASS2://再次验证密码
   if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
       char temp[7];
    int tt=SsmGetDtmfStr(ch, temp);
    SsmClearRxDtmfBuf(ch);
    for(i=0;i<6;i++)
    {
     if(!isdigit(temp[i]))
     {
      if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass2" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP2_CHECK_PASS2;
      }
     }
    }
    if(temp[6]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass2" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP2_CHECK_PASS2;
     }
    }
    //验证两次新密码是否一样
    if(idCardPass[ch].pass==temp)
    {
     chanelState[ch] = STEP2_CHECK_USER;
    }
    else
    {
     if (SsmPlayIndexString(ch, "TwoNewPassNotSame" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=CHECK_PLAY_SELECT;//返回到提示音
     }
    }
    currentState="this channel is not playing index now";
   }   
   break ;


  case STEP2_CHECK_USER://更新密码
   if(changePassToDB(idCardPass[ch].idCard,idCardPass[ch].pass)==0)
   {
    if (SsmPlayIndexString(ch, "ChangePassSucceed" )== -1 )
    {
     resetCH(ch);
     break;
    }
    else
    {
     chanelState[ch]=CHECK_PLAY_BYEBYE;
    } 
   }
   else
   {
    if (SsmPlayIndexString(ch, "ChangePassFailed" )== -1 )
    {
     resetCH(ch);
     break;
    }
    else
    {
     chanelState[ch]=CHECK_PLAY_BYEBYE;
    } 
   }
   break;

 


  /**
  *************************************挂失********
  */

  case STEP3_CHECK_IDCARD://验证输入的IDCard
   if(SsmGetRxDtmfLen(ch) >= 19 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
    char temp[19];
    int tt=SsmGetDtmfStr(ch, temp);  
    SsmClearRxDtmfBuf(ch); 
    for(i=0;i<17;i++)
    {
     if(!isdigit(temp[i]))
     {
      if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCard" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP2_CHECK_IDCARD;
      }
     }
    }
    if(!(isdigit(temp[17]) || temp[17]=='X') || temp[18]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCard" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP3_CHECK_IDCARD;
     }
    }
    idCardPass[ch].idCard=temp;
    chanelState[ch]=STEP3_PLAY_PASS;
    currentState="GEt ID CARD";
   }
   break;


  case STEP3_PLAY_PASS://播放输入密码
   if (SsmPlayIndexString(ch, "Step3PlayIDCardPass" )== -1 )
   {
    resetCH(ch);
   }
   else
   {
    chanelState[ch] =STEP3_CHECK_PASS;
   }
   break;

  case STEP3_CHECK_PASS://验证密码
   if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
       char temp[7];
    int tt=SsmGetDtmfStr(ch, temp);
    SsmClearRxDtmfBuf(ch);
    for(i=0;i<6;i++)
    {
     if(!isdigit(temp[i]))
     {
      if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCardPass" )== -1 )
      {
       resetCH(ch);
       break;
      }
      else
      {
       chanelState[ch]=STEP3_CHECK_PASS;
      }
     }
    }
    if(temp[6]!='#')
    {
     if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCardPass" )== -1 )
     {
      resetCH(ch);
      break;
     }
     else
     {
      chanelState[ch]=STEP3_CHECK_PASS;
     }
    }
    idCardPass[ch].pass=temp;
    chanelState[ch] = STEP3_PLAY_LOSS;
    currentState="this channel is not playing index now";
   }
   
   break ;
  case STEP3_PLAY_LOSS://播放挂失
   if (SsmPlayIndexString(ch, "Step3PlayLoss" )== -1 )
   {
    resetCH(ch);
   }
   else
   {
    chanelState[ch] =STEP3_CHECK_LOSS;
   }
   break;


  case STEP3_CHECK_LOSS:
   if(SsmGetRxDtmfLen(ch) >= 1 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
   {
    char temp[100];
    int tt=SsmGet1stDtmf(ch, temp);
    SsmClearRxDtmfBuf(ch);
    switch(temp[0])
    {
     case '1':   //DTMF=1: 挂失
      if(changeLossToDB(idCardPass[ch].idCard,1))//挂失成功
      {
       if (SsmPlayIndexString(ch, "Step3LossSucceed" )== -1 )
       {
        resetCH(ch);
        break;
       }
       else
       {
        chanelState[ch]=CHECK_PLAY_BYEBYE;
       }
      }
      else//挂失失败
      {
       if (SsmPlayIndexString(ch, "Step3LossFailed" )== -1 )
       {
        resetCH(ch);
        break;
       }
       else
       {
        chanelState[ch]=CHECK_PLAY_BYEBYE;
       }
      }
      break;
     case '2':   //DTMF=2: 解除挂失
      if(changeLossToDB(idCardPass[ch].idCard,0))//解除挂失成功
      {
       if (SsmPlayIndexString(ch, "Step3ReleaseLossSucceed" )== -1 )
       {
        resetCH(ch);
        break;
       }
       else
       {
        chanelState[ch]=CHECK_PLAY_BYEBYE;
       }
      }
      else//解除挂失失败
      {
       if (SsmPlayIndexString(ch, "Step3ReleaseLossFalied" )== -1 )
       {
        resetCH(ch);
        break;
       }
       else
       {
        chanelState[ch]=CHECK_PLAY_BYEBYE;
       }
      }
      break;
     default: 
      break;
    }
   }   
   break;   

 


  /**
  *************************************离开
  */

  case CHECK_PLAY_BYEBYE://再见
      printf("------chanelState=8--------");
   if(SsmCheckPlay(ch) > 0)
   {
    SsmHangup(ch);
    chanelState[ch] =IDLE;
   }
   break ;
        default:
            break;
    }
    printf("%s/n",currentState);   
}

/*出错时重设通道*/
resetCH(int ch)
{      
 SsmHangup(ch);
 puts(SsmGetLastErrMsgA());
 chanelState[ch] = IDLE;


/*验证IDCard的有效性*/
int checkIDCard(char *idCard,char *pass)
{
 query = "select * from userdata where IDCard='" + idCard + "' and IDPass='" + pass + "'";

 t=mysql_real_query(&mysql,query,(unsigned int) strlen(query));
 if(t)
 {
  printf("Error making query: %s/n",mysql_error(&mysql));
 }
 else
 {
  printf("[%s]made ........../n",query);
 }
 
 res=mysql_store_result(&mysql);
 int reValue=mysql_num_rows(res);

 mysql_free_result(res);
 mysql_close(&mysql);

 if(reValue>0)
 {
  return 0;
 }
 else
 {
  return -1;//-1或0
 }
}

/*修改密码*/
int changePassToDB(char *idCard,char *pass)
{
 int reValue=0;
 query="update userdata set idpass='" + pass + "' where idCard='" + idCard + "'";
 t=mysql_real_query(&mysql,query,(unsigned int) strlen(query));
 if(t)
 {
  printf("Error making query:%s/n",mysql_error(&mysql));
  reValue=-1;
 }
 else
 {
  printf("[%s] made......../n",query);
 }
 mysql_close(&mysql);
 return reValue;
}

/*挂失与解除挂失*/
int changeLossToDB(char *idCard,int loss)
{
 int reValue=0;
 query="update userdata set LossFlag=" + loss + " where idCard='" + idCard + "'";
 t=mysql_real_query(&mysql,query,(unsigned int) strlen(query));
 if(t)
 {
  printf("Error making query:%s/n",mysql_error(&mysql));
  reValue=-1;
 }
 else
 {
  printf("[%s] made......../n",query);
 }
 mysql_close(&mysql);
 return reValue;
}

原创粉丝点击