import struct
import types
import json
from crcmod import *

'''
from json to bin
input:
json_str: '{
 "term_addr":1
}'
length:
output:
bin_str: 0
length:
'''
def protocol_encode(json_str, length):
    err_code=0
    #parse
    obj=json.loads(json_str)
    #encode
    fmt=">6B"
    bin_str=struct.pack(fmt, obj['term_addr'], 3, 0, 0, 0, 8)
    crc16=crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
    crcout=crc16(bin_str)
    fmt=">6sH"
    bin_str=struct.pack(fmt, bin_str, ((crcout<<8)&0xFF00)+(crcout>>8))
    data_str=""
    for i in bin_str:
        data_str=data_str + ("%02x" % ord(i))
    print(err_code, data_str, len(data_str))
    return err_code, data_str, len(data_str)

'''
input:
bin_str:'010310012A021B002F022B000D0011FFFFFFFF59B7'
length:21
'''
def protocol_decode(bin_str, length):
    err_code=0
    fmt=">3B9H"
    obj={}
    #convert
    t_str=''
    for i in range(0,len(bin_str),2):
        t_str=t_str + chr(int(bin_str[i:i+2], 16))
    bin_str=t_str
    #parse
    _,_,_,wendu,shidu,guangzhao,zaosheng,PM2,PM10,daqiya,TVOC,crc=struct.unpack(fmt, bin_str)
    #calc
    obj['wendu_DLg7l']=round((wendu&0x7F00)/10.0,2)
    obj['shifushidu_tNmsf']=round(shidu/10.0,2)
    obj['zhaodu_OiTQg']=guangzhao*4
    obj['zaoyin_hqSLz']=round(zaosheng/10,2)
    obj['PM25_NOhQr']=PM2
    obj['PM10_2unGk']=PM10
    obj['daqiya']=round(daqiya/100.0,2)
    obj['TVOC']=round(TVOC/10.0,2)
    #encode
    json_str=json.dumps(obj)

    print(err_code, json_str, len(json_str))

    return err_code,json_str,len(json_str)

#protocol_encode('{"term_addr":1}',15)

#protocol_decode('010310012A021B002F022B000D0011FFFFFFFF59B7',42)


