RFMessageUploadModule.java 9.08 KB
package com.sunvote.xpadcomm;

import android.os.Handler;
import android.os.HandlerThread;

import com.sunvote.util.LogUtil;

import java.io.UnsupportedEncodingException;

/**
 * Created by Elvis on 2018/3/27 9:48
 * Email:Eluis@psunsky.com
 * 版权所有:长沙中天电子设计开发有限公司
 * Description: 人大通用版
 * 短消息上传模块
 */
public class RFMessageUploadModule {

    public static final byte PACKTYPE = 3 ;
    private static RFMessageUploadModule instance ;

    private IUploadListener uploadListener ;

    private String filename;
    private byte[] datas = "test message".getBytes();
    private int length = 1024;
    private HandlerThread handlerThread ;
    private Handler handler ;
    private byte[] keyid;
    private Runnable task;
    private int packTotal ;
    private boolean stop = false;

    private RFMessageUploadModule(){
        handlerThread = new HandlerThread(RFMessageUploadModule.class.getSimpleName());
        handlerThread.start();
        handler = new Handler(handlerThread.getLooper());
    }

    public static RFMessageUploadModule getInstance() {
        if(instance == null){
            instance = new RFMessageUploadModule();
        }
        return instance;
    }

    public void setMessageContent(byte[] messageContent) {
        this.datas = messageContent;
        uploadMsgData(datas);
        removeTask();
    }

    public void setMessageContent(String message) {
        try {
            this.datas = message.getBytes("GB2312");
            uploadMsgData(datas);
            removeTask();
            handler.removeCallbacks(failCall);
            handler.postDelayed(failCall,10000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean uploadMsgData(byte[] ds){
        System.out.println("uploadMsgData" + ds);
        if(ds != null){
            length = ds.length ;
            filename = null ;
            this.datas = new byte[length ];
            System.arraycopy(ds,0,this.datas,0,length);
//            this.datas[length] = 0x13 ;
//            this.datas[length + 1] = 0x0 ;
//            this.datas[length + 2] = 0x10 ;
//            this.datas[length + 3] = 0x0 ;
            task = new A0(filename,length);
            handler.removeCallbacks(task);
            handler.post(task);
            return true;
        }
        return false;
    }


    public void setKeyid(byte[] keyid) {
        this.keyid = keyid;
    }

    public void uploadData(byte packid, byte packH, byte[] packLs){
        System.out.println("uploadData");
        handler.removeCallbacks(task);
        task = new A2(keyid,packid,packH,datas,packLs);
        handler.post(task);
        if(uploadListener != null){
            double process = 0 ;
            if(packTotal > 0){
                int count = 0 ;
                int sen = (packLs[1] & 0xFF) * 256 + (packLs[0]  & 0XFF);
                for(int i = 0 ; i < 16 ; i++){
                    if((sen & (1 << i)) != 0){
                        count ++ ;
                    }
                }
                process = (double)(packH * 16 + count) / packTotal ;
            }
            uploadListener.onUploadProcess(process);
        }
    }

    public void packetConfirmation(byte packid){
        System.out.println("packetConfirmation");
        handler.removeCallbacks(task);
        byte[] names = null;
        if(filename != null){
            try {
                names = filename.getBytes("GB2312");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        task = new A1(keyid,(byte)((length  ) / 65535), (byte)(((length )  % 65535) / 256),(byte)(((length ) % 256 / 16 + (length % 16 == 0 ? 0 : 1))),names);
        handler.post(task);
    }

    public void packetReceptionConfirmed(byte packid,byte packH){
        System.out.println("packetReceptionConfirmed");
        handler.removeCallbacks(task);
        task = new A3(keyid,packid,packH);
        handler.post(task);
    }

    public boolean uploadMessage(byte[] datas){
        System.out.println("uploadMsgData" + datas);
        if(datas != null){
            length = datas.length ;
            filename = null ;
            this.datas = new byte[length ];
            System.arraycopy(datas,0,this.datas,0,length);
//            datas[length] = 0x13 ;
//            datas[length + 1] = 0x0 ;
//            datas[length + 2] = 0x10 ;
//            datas[length + 3] = 0x0 ;
            task = new A0(filename,length);
            handler.removeCallbacks(task);
            handler.post(task);
            return true;
        }
        return false;
    }


    public void setUploadListener(IUploadListener uploadListener) {
        this.uploadListener = uploadListener;
    }

    class A0 implements Runnable{
        private int length ;
        private String filename;
        private int times ;
        public A0(String filename,int length){
            this.length = length ;
            this.filename = filename;
            packTotal = length / 16  + 1;
            times = 0 ;
        }

        @Override
        public void run() {
            XPadApi.getInstance().applyFileUpload(this.length,this.filename,PACKTYPE,RFFileUploadModule.index);
        }
    }

    class A1 implements Runnable{

        private byte[] keyid;
        private byte packid ;
        private byte packH ;
        private byte packL ;
        private byte[] names ;
        private int times ;

        public A1(byte[] keyid, byte packid,byte packH,byte packL,byte[] names) {
            this.keyid = keyid;
            this.packid = packid;
            this.packH = packH ;
            this.packL = packL ;
            this.names = names ;
            times = 0 ;
        }

        @Override
        public void run() {
            XPadApi.getInstance().packetConfirmation(this.keyid,this.packid,this.packH,this.packL,this.names,PACKTYPE);
            times ++ ;
            if(task != null && times < 5){
                handler.postDelayed(task,1000);
            }
            if(uploadListener != null){
                uploadListener.onUploadStart();
            }

            handler.removeCallbacks(failCall);
            handler.postDelayed(failCall,10000);
        }
    }

    class A2 implements Runnable{
        private byte[] keyid;
        private byte packid;
        private byte packH;
        private byte[] datas ;
        private byte[] packLs;
        private int times ;

        public A2(byte[] keyid, byte packid, byte packH, byte[] datas, byte[] packLs) {
            this.keyid = keyid;
            this.packid = packid;
            this.packH = packH;
            this.datas = datas;
            this.packLs = packLs;
            times = 0 ;
        }

        @Override
        public void run() {

            int packLsi = packLs[1] * 256 + packLs[0];
            int offset = 0 ;
            int length = 16;
            System.out.println("packLsi:" + packLsi);
            for(byte packL = 0 ;packL < 16 ;packL ++) {
                if((packLsi & (1 << packL)) != 0){
                    offset = ((packid * 65535) + (packH) * 256 + 16 * (packL)) & 0xFFFF;
                    XPadApi.getInstance().uploadFileData(this.keyid, this.packid, this.packH, (byte)(packL), this.datas, offset, length,PACKTYPE);
                    try{
                        Thread.sleep(50);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            times ++ ;
            if(task != null && times < 5){
                handler.postDelayed(task,1000);
            }
            handler.removeCallbacks(failCall);
            handler.postDelayed(failCall,10000);
        }
    }

    class A3 implements Runnable{
        private byte[] keyid;
        private byte packid ;
        private byte packH;

        public A3(byte[] keyid, byte packid, byte packH) {
            this.keyid = keyid;
            this.packid = packid;
            this.packH = packH;
        }

        @Override
        public void run() {
            XPadApi.getInstance().packetReceptionConfirmed(this.keyid,this.packid,this.packH,PACKTYPE);
            if(uploadListener != null){
                uploadListener.onUploadStop();
            }
            handler.removeCallbacks(failCall);
        }
    }

    public void onUploadMessage(byte data, byte[] keyid, byte packid, byte packH, byte[] packLs) {
        LogUtil.i("RFMessageUploadModule","onUploadMessage:" + data);
        if (data == 1) {
           setKeyid(keyid);
           packetConfirmation(packid);
        }
        if (data == 2) {
            uploadData(packid, packH, packLs);
        }
        if (data == 3) {
           packetReceptionConfirmed(packid, packH);
        }
    }

    private void removeTask(){
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                handler.removeCallbacks(task);
            }
        },5000);
    }

    private Runnable failCall = new Runnable() {
        @Override
        public void run() {
            if(uploadListener != null){
                uploadListener.onFail();
            }
        }
    };
}