/**
 * 声明：
 *      源代码来自阿里云，本公司只是将AMQP与调用API下发的代码整合为一份
 *      接收数据采用AMQP的方式，当然接收还有MNS，但MNS还需要二次收费，看用户个人需求，具体区别请咨询阿里云技术
 *      发送数据采用调用API下发的方式
 *
 */
package com.aliyun.sample;

import com.aliyun.sample.alicloud.ReceiveService;
import com.aliyun.sample.alicloud.SendService;

public class Sample {

   /**
    * 0：DO 继电器输出接口
    * 1：DI 开关量输入接口
    * 2：AI 模拟量输入接口
    * 3：VO 语音输出接口
    * 4：PC电脑开关机接口
    */

    public static int cType = 0;
    static Runnable recService = new ReceiveService();

    public static void main(String[] args_) throws Exception {
        //java.util.List<String> args = java.util.Arrays.asList(args_);

        startReceiveThread();//必须等待接收线程完全启动
        relayControl();

        delayFunc(10*1000);//等待10秒再退出程序
        stopReceiveThread();

    }


    static void startReceiveThread() {
        //Runnable recService = new ReceiveService();
        Thread recTh = new Thread(recService);
        recTh.start();
        delayFunc(10*1000);//必须等待接收线程进入接收状态，否则有些数据会接收不到
    }

    static void stopReceiveThread() {
        ((ReceiveService)recService).isRun = false;
        ((ReceiveService)recService).Distroy();
    }

    // 0：晓玲（女声）
    // 1：尹小坚（男声）
    // 2：易小强（男声）
    // 3：田蓓蓓（女声）
    // 4：唐老鸭（效果器）
    // 5：小燕子（女童声）
    private static int TtsPronunciationPeople = 0;

    // 语调
    // 0 - 不识别汉语拼音 1 - 识别汉语拼音
    // 注意：
    // 1）拼音格式为：1 至 6 位字母 + 1 位数字
    // 2）声调用 1 位数字表示 ：1 阴平、2 阳平、3 上声、4 去声、5 轻声
    private static int ToneOfVoice = 0;

    // 语速 1-10档
    private static int TtsSpeed = 5;

    // 语调 1-10档
    private static int TtsIntonation = 5;

    // 音量 1-10档
    private static int TtsVolume = 5;

    // TTS循环次数
    private static int TtsTimes = 1;

    // TTS间隔时间
    private static int TtsInterval = 1;

    static void relayControl() throws Exception {
        System.out.println(cType);
        switch (cType)
        {
            case 0:
                //控制 DO 继电器输出接口 OUT1 吸合；发送指令：AT+STACH1=1\r\n
                String msg = "AT+STACH1=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                SendService.SendCmd(msg);
                delayFunc(500);

                //时间单位改成 秒；发送指令：AT+DLYUNIT=0\r\n
                msg = "AT+DLYUNIT=0\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                SendService.SendCmd(msg);
                delayFunc(500);

                //控制 DO 继电器输出接口 OUT1 点动开，开启后延时5秒再关闭
                msg =  "AT+STACH1=3,5,100000,1000000\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                SendService.SendCmd(msg);
                delayFunc(500);

                //控制 DO 继电器输出接口 OUT1~OUT4 间隔 1 秒轮流吸合
                msg =  "AT+DODLY=1,1,4,1,1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //继电器 OUT1 每天早上 8 点定时吸合
                msg =  "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";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //N1/DI1 联动控制继电器 OUT1 点动输出 5 秒
                msg =  "AT+LINKAGE1=3,5,100000,1,1000000\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //上电默认状态设置为吸合
                msg =  "AT+DODEFSTA=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //使能状态主动上传
                msg =  "AT+KPUPLOAD=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //使能掉电保存
                msg =  "AT+KPKEEP=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                break;
            case 1:
                //上传类型 uploadType 0：被动上传  1：定时上传  2：触发上传(所有通道)  3：触发上传(单个通道)
                int uploadType = 1;
                int uploadInterval = 300; //上传间隔 单位：10ms

                //读取 DI 开关量输入接口 IN1/DI1 的状态 被动上传(实时读取)
                msg = "AT+OCCH1=?\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //设置DI上传模式
                msg = "AT+OCMOD="+uploadType+","+ (uploadType == 1? uploadInterval : 0)+"\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                break;
            case 2:
                //上传类型 uploadType 0：被动上传  1：定时上传  2：触发上传  3：定时+触发上传
                uploadType = 1;
                uploadInterval = 30; //上传间隔 单位：100ms

                //设置 AI1 接口的信号类型是电压型
                msg = "AT+AIMODE1=0\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //读取 AI1 接口实时采样值 被动上传(实时读取)
                msg = "AT+AIVALUE1=?\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                if (uploadType == 1)
                {
                    //设置3秒上传1次AI1接口采样值(定时上传)
                    uploadInterval = 30;
                    msg = "AT+AIUPLOAD1="+uploadType+","+uploadInterval+"\r\n";
                }
                else if (uploadType == 2)
                {
                    //设置AI1接口采样值高于2000并持续3秒触发上传
                    uploadInterval = 0;
                    msg = "AT+AIUPLOAD1="+uploadType+","+uploadInterval +",20,0,2000,0,0\r\n";
                }
                else if (uploadType == 3)
                {
                    //设置3秒上传1次和AI1接口采样值高于2000并持续3秒触发上传
                    uploadInterval = 30;
                    msg = "AT+AIUPLOAD1="+uploadType+","+uploadInterval +",20,0,2000,0,0\r\n";
                }
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                break;
            case 3:
                System.out.println("VO 语音输出接口测试：");
                //控制 VO1 接口播放文字“泥人科技” 实时播放
                msg = "AT+TTS1=1,0,8\r\n泥人科技";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //控制 VO1 接口播放语音文件 1
                msg = "AT+AUDIO1=1,10\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //VO1 接口每天早上 8 点播放语音文件 1  定时播放
                msg = "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";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //IN1/DI1 联动播放语音文件 1  开关量联动播放
                msg = "AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //使用VO1 接口、晓玲的声音 声调：0 语速：5 语调：5 音量：5播放文本  文本播放拓展(发音人、声调、语速、语调)
                String[] pronunciationPeople = new String[] { "3", "51", "52", "53", "54", "55" };
                //if (string.IsNullOrEmpty(txt)) return;
                String txt = "[m" + pronunciationPeople[TtsPronunciationPeople] + "][s"
                        + TtsSpeed + "][t" + TtsIntonation
                        + "][v" + TtsVolume + "]" + "欢迎[i" + ToneOfVoice+"]shi3用" + "泥人科技1234567890";
                byte[] bytes = txt.getBytes("GB2312");
                //以GB2312的格式转为byte数组
                msg = "AT+TTS1=1,0," + TtsTimes + ","
                        + TtsInterval + "," + bytes.length + "\r\n" + txt;
                //将字符串指令转换为byte数组  编码为GB2312
                //发送数据
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                SendService.SendCmd(msg);
                break;
            case 4:
                //上传类型 uploadType 0：被动上传  1：定时上传  2：触发上传  3：定时+触发上传
                uploadType = 1;
                uploadInterval = 30; //上传间隔 单位：100ms

                msg = "AT+PCSSSTA=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                msg = "AT+AUTOCONT=2,TASK1,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //被动上传(实时读取)
                msg = "AT+PCSSSTA=?\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                //定时上传、触发上传、定时 + 触发上传
                if (uploadType == 1)
                {
                    //设置 3 秒上传 1 次电脑开关机状态
                    msg = "AT+PCSSSTA="+uploadType+","+uploadInterval+"\r\n";
                }
                else if (uploadType == 2)
                {
                    //设置电脑开关机状态触发上传
                    msg = "AT+PCSSSTA="+uploadType+"+\r\n";
                }
                else if (uploadType == 3)
                {
                    //设置3秒和触发电脑开关机 上传1次电脑开关机状态
                    msg = "AT+PCSSSTA="+uploadType+","+uploadInterval+"\r\n";
                }
                //发送数据
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                SendService.SendCmd(msg);
                delayFunc(500);

                msg = "AT+PCSSAUTO=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                delayFunc(500);

                msg = "AT+PCSSEXTKEY=1\r\n";
                System.out.println("SendCmd: " + msg.replace("\r\n","\\r\\n"));
                //发送数据
                SendService.SendCmd(msg);
                break;
            default:
                break;
        }
    }

    static void delayFunc(int millis){
        try{
            Thread.sleep(millis);
        }catch (Exception e){}
    }

}
