<?php
    //曼彻斯特解编码函数,参数$code为码元,$decode判断此动作是否为解码
    function Manchester($code,$decode=0)
    {
        $code_result="";
        if(!$decode){
            for($i=0;$i<strlen($code);$i++){
                if($code[$i]=="0"){
                    $code_result.="01";
                }else if($code[$i]=="1"){
                    $code_result.="10";
                }else{
                    return ERROR;
                }
            }
        }else{
            if(strlen($code)%2==1){
                return ERROR_DECODE;
            }else{
                for($i=0;$i<strlen($code);$i=$i+2){
                    if($code[$i]=="0" && $code[$i+1]=="0" || $code[$i]=="1" && $code[$i+1]=="1"){
                        return ERROR_MAN;
                    }else{
                        if($code[$i]=="0" && $code[$i+1]=="1"){
                            $code_result.="0";
                        }else{
                            $code_result.="1";
                        }
                    }
                }
            }
        }
        return $code_result;
    }
    
    //米勒编解码函数,参数$code为码元,$decode判断此动作是否为解码
    function Miler($code,$decode=0)
    {
        $code_result="";
        if(!$decode){
            $tmp=$special="";
            for($i=0;$i<strlen($code);$i++){
                if($code[$i]=="0"){
                    if($tmp==""){
                        $special="  系统默认前一个电平为1且为11";
                        $tmp="11";
                        $code_result.="11";
                    }else{
                        if($code[$i-1]=="0"){
                            if($tmp=='11'){
                                $tmp="00";
                                $code_result.="00";
                            }else{
                                $tmp="11";
                                $code_result.="11";
                            }
                        }else{
                            if($tmp[1]=="0"){
                                $tmp="00";
                                $code_result.="00";
                            }else{
                                $tmp="11";
                                $code_result.="11";
                            }
                        }
                    }
                }else if($code[$i]=="1"){
                    if($tmp==""){
                        $special="  系统默认前一个电平为1且为01";
                        $tmp="10";
                        $code_result.="10";
                    }else{
                        if($tmp[1]=="0"){
                            $tmp="01";
                            $code_result.="01";
                        }else{
                            $tmp="10";
                            $code_result.="10";
                        }    
                    }
                }else{
                    return ERROR;
                }
            }
        }else{
            if(strlen($code)%2==1){
                return ERROR_DECODE;
            }else{
                for($i=0;$i<strlen($code);$i=$i+2){
                    if($code[$i]=="0" && $code[$i+1]=="0" || $code[$i]=="1" && $code[$i+1]=="1"){
                        $code_result.="0";
                    }else{
                        $code_result.="1";
                    }
                }
            }
        }
        return isset($special) ? $code_result.$special : $code_result;
    }
    
    //CMI编解码函数,参数$code为码元,$decode判断此动作是否为解码
    function CMI($code,$decode=0)
    {
        $code_result="";
        if(!$decode){
            for($i=0,$tmp=1;$i<strlen($code);$i++){
                if($code[$i]=="0"){
                    $code_result.="01";
                }else if($code[$i]=="1"){
                    if($tmp%2==0){
                        $code_result.="00";
                    }else{
                        $code_result.="11";
                    }
                    $tmp++;
                }else{
                    return ERROR;
                }
            }
        }else{
            if(strlen($code)%2==1){
                return ERROR_DECODE;
            }else{
                for($i=0;$i<strlen($code);$i=$i+2){
                    if($code[$i]=="0" && $code[$i+1]=="0" || $code[$i]=="1" && $code[$i+1]=="1"){
                        $code_result.="1";
                    }else{
                        if($code[$i]=="0" && $code[$i+1]=="1"){
                            $code_result.="0";
                        }else{
                            return ERROR_CMI;
                        }
                    }
                }
            }
        }
        return $code_result;
    }
    
?>