#include "CSocket.h"

int main() {
	// 0：DO 继电器输出接口
	// 1：DI 开关量输入接口
	// 2：AI 模拟量输入接口
	// 3：VO 语音输出接口
	// 4：PC 电脑开关机接口
	const int Type = 0;
	
    printf("本机作为服务端\r\n");
    printf("本机IP：192.168.10.173 端口：6000\r\n");
    int serverFd = InitSocket("192.168.10.173",6000);
    if(serverFd < 0) {
        perror("初始化服务端失败，请检查端口是否被占用!\r\n");
        return 0;
    }

    printf("启动侦听，等待客户端请求连接。。。\r\n");
    int clientFd = AcceptSocket(serverFd);
    if(clientFd < 0) {
        perror("accept error!\r\n");
        return 0;
    }
	
	switch(Type)
	{
		case 0:
		{
			printf("DO继电器输出接口测试：");
			printf("控制DO继电器输出接口OUT1吸合；发送指令：AT+STACH1=1\\r\\n  \r\n");
			SendCmd(clientFd,"AT+STACH1=1\r\n",strlen("AT+STACH1=1\r\n"));
			sleep(1);

			printf("时间单位改成 秒；发送指令：AT+DLYUNIT=0\\r\\n  \r\n");
			SendCmd(clientFd,"AT+DLYUNIT=0\r\n",strlen("AT+DLYUNIT=0\r\n"));
			sleep(1);

			printf("控制DO继电器输出接口OUT1点动开，开启后延时5秒再关闭：AT+STACH1=3,5,100000,1000000\\r\\n  \r\n");
			SendCmd(clientFd,"AT+STACH1=3,5,100000,1000000\r\n",strlen("AT+STACH1=3,5,100000,1000000\r\n"));
			sleep(1);

			printf("控制DO继电器输出接口OUT1~OUT4间隔1秒轮流吸合：AT+DODLY=1,1,4,1,1\\r\\n  \r\n");
			SendCmd(clientFd,"AT+DODLY=1,1,4,1,1\r\n",strlen("AT+DODLY=1,1,4,1,1\r\n"));
			sleep(1);

			printf("继电器OUT1每天早上8点定时吸合：AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[DO:0,1,1,100000,100000,1000000],[N:1,0]\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[DO:0,1,1,100000,100000,1000000],[N:1,0]\r\n",strlen("AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[DO:0,1,1,100000,100000,1000000],[N:1,0]\r\n"));
			sleep(1);

			printf("N1/DI1联动控制继电器OUT1点动输出5秒：AT+LINKAGE1=3,5,100000,1,1000000\\r\\n  \r\n");
			SendCmd(clientFd,"AT+LINKAGE1=3,5,100000,1,1000000\r\n",strlen("AT+LINKAGE1=3,5,100000,1,1000000\r\n"));
			sleep(1);

			printf("上电默认状态设置为吸合指令：AT+DODEFSTA=1\\r\\n  \r\n");
			SendCmd(clientFd,"AT+DODEFSTA=1\r\n",strlen("AT+DODEFSTA=1\r\n"));
			sleep(1);

			printf("使能状态主动上传指令：AT+KPUPLOAD=1\\r\\n  \r\n");
			SendCmd(clientFd,"AT+KPUPLOAD=1\r\n",strlen("AT+KPUPLOAD=1\r\n"));
			sleep(1);

			printf("使能掉电保存指令：AT+KPKEEP=1\\r\\n  \r\n");
			SendCmd(clientFd,"AT+KPKEEP=1\r\n",strlen("AT+KPKEEP=1\r\n"));
		}
		break;
		case 1:
		{
			printf("DI开关量输入接口测试：");
			printf("读取DI开关量输入接口IN1/DI1的状态指令：AT+OCCH1=?\\r\\n  \r\n");
			SendCmd(clientFd,"AT+OCCH1=?\r\n",strlen("AT+OCCH1=?\r\n"));
			sleep(1);

			// 被动上传  AT+OCMOD=0\r\n
			// 定时上传	AT+OCMOD=1,300   1：上传模式  300：上传间隔 单位：10ms
			// 触发上传(所有通道)	AT+OCMOD=2,0
			// 触发上传(单个通道)	AT+OCMOD=3,0
			printf("设置DI上传模式：每3秒设置上传一次DI状态：AT+OCMOD=1,300\\r\\n  \r\n");
			SendCmd(clientFd,"AT+OCMOD=1,300\r\n",strlen("AT+OCMOD=1,300\r\n"));

		}
		break;
		case 2:
		{
			printf("AI模拟量输入接口测试：");
			printf("设置AI1接口的信号类型是电压型：AT+AIMODE1=0\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AIMODE1=0\r\n",strlen("AT+AIMODE1=0\r\n"));
			sleep(1);
			
			printf("读取AI1接口实时采样值：AT+AIVALUE1=?\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AIVALUE1=?\r\n",strlen("AT+AIVALUE1=?\r\n"));
			sleep(1);

			// 0：被动上传  使用AT+AIVALUE1=?\r\n指令读取AI1接口实时采样值
			// 1：定时上传	AT+AIUPLOAD1=1,30\r\n   30：上传间隔 单位：100ms
			// 2：触发上传	AT+AIUPLOAD1=2,0,30,0,2000,0,0\r\n  设置 AI1 接口采样值高于 2000 并持续 3 秒触发上传
			// 3：定时+触发上传 AT+AIUPLOAD1=2,30,30,0,2000,0,0\r\n  设置 AI1 接口 3秒上传一次 或 采样值高于 2000 并持续 3 秒触发上传
			printf("设置3秒上传1次AI1接口采样值：AT+AIUPLOAD1=1,30\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AIUPLOAD1=1,30\r\n",strlen("AT+AIUPLOAD1=1,30\r\n"));
			sleep(1);
		}
		break;
		case 3:
		{
			printf("VO语音输出接口测试：");
			printf("控制VO1接口播放文字“泥人科技”：AT+TTS1=1,0,8\\r\\n泥人科技  \r\n");
			SendCmd(clientFd,"AT+TTS1=1,0,8\r\n泥人科技",strlen("AT+TTS1=1,0,8\r\n泥人科技"));
			sleep(1);
			
			printf("控制VO1接口播放语音文件1：AT+AUDIO1=1,10\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AUDIO1=1,10\r\n",strlen("AT+AUDIO1=1,10\r\n"));
			sleep(1);

			printf("定时播放 VO1接口每天早上8点播放语音文件1：AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[VO:0,1,1,10,1,0],[N:1,0]\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[VO:0,1,1,10,1,0],[N:1,0]\r\n",strlen("AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[VO:0,1,1,10,1,0],[N:1,0]\r\n"));
			sleep(1);

			printf("IN1/DI1联动播放语音文件1：AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\r\n",strlen("AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\r\n"));
			sleep(1);

			// 文本播放拓展（发音人、声调、语速、语调）
			// VO1 接口使用 
			// 发音人：[m3] 3 晓玲(女声) 51 尹小坚(男声) 52 易小强(男声) 53 田蓓蓓(女声) 54 唐老鸭(效果器) 55 小燕子(女童声)
			// 声调：[i0] 0 - 不识别汉语拼音 1 - 识别汉语拼音 
			// 注意： 欢迎[i0]shi3泥人科技  读作：欢迎shi3用泥人科技   欢迎[i1]shi3用泥人科技  读作：欢迎使用泥人科技
			// 1）拼音格式为：1 至 6 位字母 + 1 位数字   
			// 2）声调用 1 位数字表示 ：1 阴平、2 阳平、3 上声、4 去声、5 轻声 
			// 语速：1-10档 [s5]
			// 语调：1-10档 [t5]
			// 音量：1-10档 [v5]
			// VO1接口使用发音人：晓玲,声调：5,语速：5,语调：5,音量：5播放文本
			printf("VO1接口使用发音人：晓玲,声调：5,语速：5,语调：5,音量：5播放文本：AT+TTS1=1,0,1,1,49\\r\\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技\\r\\n  \r\n");
			SendCmd(clientFd,"AT+TTS1=1,0,1,1,49\r\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技",strlen("AT+TTS1=1,0,1,1,49\r\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技"));
			sleep(1);
		}
		break;
		case 4:
		{
			printf("电脑开关机接口测试：\r\n");
			printf("发送开机指令：AT+PCSSSTA=1\\r\\n  \r\n");
			SendCmd(clientFd,"AT+PCSSSTA=1\r\n",strlen("AT+PCSSSTA=1\r\n"));
			sleep(1);

			printf("发送每天早上8点定时开机指令：AT+AUTOCONT=2,每天早上8点定时开机,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\\r\\n  \r\n");
			SendCmd(clientFd,"AT+AUTOCONT=2,每天早上8点定时开机,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\r\n",strlen("AT+AUTOCONT=2,每天早上8点定时开机,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\r\n")); 
			sleep(1);

			// 0：被动上传  设置指令：AT+PCSSUPLOAD=0\r\n 读取指令：使用AT+PCSSSTA=?\r\n指令读取开关机状态
			// 1：定时上传	AT+PCSSUPLOAD=1,30\r\n   30：上传间隔 单位：100ms
			// 2：触发上传	AT+PCSSUPLOAD=2\r\n  
			// 3：定时+触发上传 AT+PCSSUPLOAD=3,30\r\n 
			// 设置3秒上传1次电脑开关机状态
			printf("设置3秒上传1次电脑开关机状态：AT+PCSSUPLOAD=1,30\\r\\n  \r\n");
			SendCmd(clientFd,"AT+PCSSUPLOAD=1,30\r\n",strlen("AT+PCSSUPLOAD=1,30\r\n"));
			sleep(1);

			printf("上电禁用机箱按键，即按键失效：AT+PCSSEXTKEY=1\\r\\n   \r\n");
			SendCmd(clientFd,"AT+PCSSEXTKEY=1\r\n",strlen("AT+PCSSEXTKEY=1\r\n"));	
		}
		break;
		default:
		break;
	}
	
    printf("更多控制指令的详细解释请查阅《网络控制器AT指令手册V2.9.PDF》\r\n");
    printf("本Demo仅用于开发参考，不能直接用于商业项目实施！\r\n");

    return 0;
}




