• Python VIL Service Bin


    #!/usr/bin/python
    #coding:UTF-8
    
    import sys
    import re
    import getopt
    import md5
    import os
    import subprocess
    import shutil
    import xlrd
    import xlwt
    from xlutils.copy import copy
    
    
    #from subprocess import call
    
    g_bAllBin = 0
    g_bAllBinbyId = 0
    g_bDecrypt = 0
    g_binDir = "./decryptDir"
    g_strBinPath="./"
    g_BinSplitext=[".BIN", ".bin"]
    g_listBoard = ["VR01A", "VR01AX", "VR01B"]
    g_listUI = ["videocon", "sansui", "philips"]
    g_listMode = []
    
    mapModeCode = {}
    g_headerLen = 16*1024
    g_listBin=[]
    
    
    '''
    解密当前目录BIN文件到 decryptDir文件夹
        运行命令:
        python gen_codebin.py -d
    
    
    VIL 服务软件:
        运行命令:
        
        编译全部modeCode
        python gen_codebin.py -a
        
        编译EXCEL文档包含的MODELCODE
        python gen_codebin.py -i [./]
        
        将当前目录所有的BIN打包为“VIL_SER.BIN”
        python gen_codebin.py [-p]   
        
        打包格式为:HEAD长度+BIN总数+BIN_1名字+BIN_1长度+....BIN_N名字+BIN_N长度+版本号+BIN内容
        步骤:
        先读取“Design Data.xls”得到需要的打包ModeID,然后根据ModeID逐个进行编译。再将编译完成的BIN打包 
    '''
    
    def fun_get_head_info():
        try:
            raise Exception
        except:
            f = sys.exc_info()[2].tb_frame.f_back
        print("[debug]function :%s, line :%s"%(f.f_code.co_name, str(f.f_lineno)))
    
    def usage():
        print'''param error.'''
    
    def fun_parse_InputParam():
        global g_bAllBin
        global g_bDecrypt
        global g_strBinPath
        global g_bAllBinbyId
        try:
            opts, args = getopt.getopt(sys.argv[1:], 'hi:dpa')
        except getopt.GetoptError, err:
            print str(err)
            usage()
            sys.exit()
    
        for op, value in opts:
            if op == "-i":
                g_bAllBin = 1
                g_strBinPath = value
            elif op == "-p":
                g_bAllBin = 0
            elif op == "-a":
                g_bAllBinbyId = 1
            elif op == "-d":
                g_bDecrypt = 1
            elif op == "-h":
                usage()
                sys.exit()
            else:
                print("unhandled option")
                sys.exit()
    
    #==生成BIN LIST==#
    def fun_getBinList(Path):
        for item in os.listdir(Path):
            abs_item=os.path.join(Path, item)
            if os.path.isdir(abs_item):
                fun_getBinList(abs_item)
            elif os.path.isfile(abs_item):
                if  os.path.splitext(abs_item)[1] in g_BinSplitext:
                    g_listBin.append(abs_item)
                    #print abs_item
                else:
                    pass
            else:
                pass
        return
    
    def fun_decryptBinFile(listBin):
        os.mkdir(g_binDir)
        os.system('gcc -m32 -o decrypt decrypt.c')
        for line in listBin:
            outfile = ""
            strCmd = "./decrypt %s" %line
            os.system(strCmd)
            outfile = "./decrypt_%s" %(line[2:])
            shutil.move(outfile,g_binDir)
    
    
    def fun_genCombinationbin(binCombinFile, str_BinTable, str_BinData):
        print str_BinTable
        with open(str_BinTable) as binTable_op:
            #print binTable_op
            for line in binTable_op:
                binCombinFile.write(line)
        binCombinFile.seek(g_headerLen)
                
        with open(str_BinData) as bindata1_op:
            for line in bindata1_op:
                binCombinFile.write(line)
                    
                
        return
    
    def fun_GetBinTableandBin(list_binpath, binTable_op, binData_op):
        strTable=""
        for binpath in list_binpath:
            with open(binpath,"r+") as binFile:
                binFile.truncate(4*1024*1024)#(0x3e083c) FLASH编译大小
                for line in binFile:
                    binData_op.write(line)
                   
            binname = os.path.basename(binpath)
            binsize = os.path.getsize(binpath)
            #删除每个文件的扩展名.bin
            binname = binname[:-4]
            strTable=binname+","+str(binsize)+","
            print strTable
            binTable_op.write(strTable)
            #os.remove(binpath)
        #写默认版本号为1
        binTable_op.write("1,")
                                    
    def fun_getBinCountToProject():
        with open("../aps/application/radisson/videocon/sys_common_guiobj/app_guiobj_setup.c", "r") as project_op:
            temStr = '#define CONFIG_FLASH_BIN_COUNT ' + str(len(g_listBin))
            print temStr
            content = project_op.read()
    
            pos = content.find('#define CONFIG_FLASH_BIN_COUNT')
            if pos != -1:
                pos_end = content[pos:].find('
    ')
                print '======================================='      
                print 'pos = %d, pos_end = %d' %(pos, pos_end)
                content = content[:pos] + temStr + content[pos + pos_end:]
                with open("../aps/application/radisson/videocon/sys_common_guiobj/app_guiobj_setup.c", "w") as project_op:
                    project_op.write(content)
                    
                    
                    
    def fun_getMapModeCode():
        #读EXCEL到映射表
        book = xlrd.open_workbook(r'Design Data.xls')
        sheet = book.sheet_by_index(0)
        
        for row in range(sheet.nrows):
            bFindModeId = False
            for col in range(sheet.ncols):
                cellStr = str(sheet.cell(row,col).value)
                cellStr.rstrip()
                if cellStr == "MODEL ID":
                    bFindModeId = True
                    break
            if bFindModeId:
                break
        
        
        for id in range(row+1,sheet.nrows):
            listValue = []
            strMode = sheet.cell(id,col).value
            if len(strMode) <= 8:
                continue
            listValue.append(strMode)
            if sheet.cell(id,col-3).value != "":
                strBoard = sheet.cell(id,col-3).value
            listValue.append(strBoard)
            listValue.append("videocon" if sheet.cell(id,col-4).value == "V" else "sansui")
            mapModeCode[id-row] = listValue
            
    def fun_modifyCommonPatchFile(strMode):
        modeId = ""
        for board in g_listBoard:
            for line in open("../aps/customer/radisson/%s/adaptable/model_data.c" %board,"r"):
                if strMode in line and re.search(".*?(d+).*{.*",line):
                    modeId = re.search(".*?(d+).*{.*",line).group(1)
                    with open("../aps/include/common_patch.h","r") as file:
                        tempStr = "#define DEFAULT_MODE_ID                        " + modeId
                        content = file.read()
                        pos = content.find("#define DEFAULT_MODE_ID")
                        if pos != -1:
                            pos_end = content[pos:].find('
    ')
                            content = content[:pos] + tempStr + content[pos + pos_end:]
                            with open("../aps/include/common_patch.h", "w") as project_op:
                                project_op.write(content)
                    return True
        return False
    
    def fun_genAllSerBin():
        listSave = []
        fun_getMapModeCode()
        with open("../mconfig.config", "r") as mFile:
            list = mFile.readlines()
        for (k,v) in mapModeCode.items():
            strMode = v[0]
            board = v[1]
            ui = v[2]
            if fun_modifyCommonPatchFile(strMode) == False:
                continue
            os.system('cd ..; make clean')
            for line in list:
                if "#" in line:
                    continue
                elif line.find("CONFIG_BOARD_") != -1 :
                    line = "CONFIG_BOARD_%s__RADISSON__RADISSON__RADISSON=y
    " %(board)
                    listSave.append(line)
                elif line.find("CONFIG_MODEL_BOARD_NAME") != -1:
                    line = "CONFIG_MODEL_BOARD_NAME="%s"
    " %(board)
                    listSave.append(line)
                elif line.find("CONFIG_PROJECT_NAME") != -1 :
                    line = "CONFIG_PROJECT_NAME="%s___%s___ATV"
    " %(board,ui)
                    listSave.append(line)
                elif line.find("CONFIG_APP_FOLDER_NAME") != -1:
                    line = "CONFIG_APP_FOLDER_NAME="%s"
    " %(ui)
                    listSave.append(line)
                elif re.search("CONFIG_.*___ATV__RADISSON__RADISSON__RADISSON",line):
                    line = "CONFIG_%s_%s___ATV__RADISSON__RADISSON__RADISSON=y
    " %(board,ui.upper())
                    listSave.append(line)
                else:
                    listSave.append(line)
            with open("../mconfig.config", "w") as mFile:
                mFile.writelines(listSave)
            listSave = []
            
            shutil.copy("../aps/customer/radisson/sub_customer/radisson/radisson/project/%s___%s___ATV.config" %(board,ui), "../menuconfig.config")
            os.system('cd ..; make clean; make -j')
            
            if ui == "videocon" and os.path.exists("../mergedir/VIDEOCON.code.bin"):
                shutil.copy("../mergedir/VIDEOCON.code.bin","../kitking/%s.bin" %strMode)
            elif ui == "philips" and os.path.exists("../mergedir/PHILIPS.code.bin"):
                shutil.copy("../mergedir/PHILIPS.code.bin","../kitking/%s.bin" %strMode)
            elif ui == "sansui" and os.path.exists("../mergedir/SANSUI.code.bin"):
                shutil.copy("../mergedir/SANSUI.code.bin","../kitking/%s.bin" %strMode)
                
            #print k,strMode,board,ui
            #var = raw_input("debug pause:")
            
    def fun_searchModeCode(board):
        global g_listMode
        global mapModeCode
        g_listMode = []
        mapModeCode = {}
        modeId = ""
        for line in open("../aps/customer/radisson/%s/adaptable/model_data.c" %board,"r"):
            if re.search(".*?(d+).*{.*"(.*)".*",line):
                modeId = re.search(".*?(d+).*{.*",line).group(1)
                strMode = re.search(".*?(d+).*{.*"(.*)".*",line).group(2)
                mapModeCode[modeId] = strMode
                g_listMode.append(strMode)   
        return modeId
                
                
    def fun_genCommonPatchFilebyId(modeId):
        with open("../aps/include/common_patch.h","r") as file:
            tempStr = "#define DEFAULT_MODE_ID                        " + modeId
            content = file.read()
            pos = content.find("#define DEFAULT_MODE_ID")
            if pos != -1:
                pos_end = content[pos:].find('
    ')
                content = content[:pos] + tempStr + content[pos + pos_end:]
                with open("../aps/include/common_patch.h", "w") as project_op:
                    project_op.write(content)
    
            
    def fun_genAllSerBinbyId():
        listSave = []
        with open("../mconfig.config", "r") as mFile:
            list = mFile.readlines()
            
        for board in g_listBoard: 
            fun_searchModeCode(board)  
            for ui in g_listUI:
                os.system('cd ..; make clean')
                for line in list:
                    if "#" in line:
                        continue
                    elif line.find("CONFIG_BOARD_") != -1 :
                        line = "CONFIG_BOARD_%s__RADISSON__RADISSON__RADISSON=y
    " %(board)
                        listSave.append(line)
                    elif line.find("CONFIG_MODEL_BOARD_NAME") != -1:
                        line = "CONFIG_MODEL_BOARD_NAME="%s"
    " %(board)
                        listSave.append(line)
                    elif line.find("CONFIG_PROJECT_NAME") != -1 :
                        line = "CONFIG_PROJECT_NAME="%s___%s___ATV"
    " %(board,ui)
                        listSave.append(line)
                    elif line.find("CONFIG_APP_FOLDER_NAME") != -1:
                        line = "CONFIG_APP_FOLDER_NAME="%s"
    " %(ui)
                        listSave.append(line)
                    elif re.search("CONFIG_.*___ATV__RADISSON__RADISSON__RADISSON",line):
                        line = "CONFIG_%s_%s___ATV__RADISSON__RADISSON__RADISSON=y
    " %(board,ui.upper())
                        listSave.append(line)
                    else:
                        listSave.append(line)
                with open("../mconfig.config", "w") as mFile:
                    mFile.writelines(listSave)
                listSave = []
                    
                for (k,v) in mapModeCode.items():
                    fun_genCommonPatchFilebyId(k)
                    shutil.copy("../aps/customer/radisson/sub_customer/radisson/radisson/project/%s___%s___ATV.config" %(board,ui), "../menuconfig.config")
                    os.system('make -j')
                    
                    if ui == "videocon" and os.path.exists("../mergedir/VIDEOCON.code.bin"):
                        shutil.copy("../mergedir/VIDEOCON.code.bin","../kitking/%s_%s_%s.bin" %(board,ui.upper(),v))
                    elif ui == "philips" and os.path.exists("../mergedir/PHILIPS.code.bin"):
                        shutil.copy("../mergedir/PHILIPS.code.bin","../kitking/%s_%s_%s.bin" %(board,ui.upper(),v))
                    elif ui == "sansui" and os.path.exists("../mergedir/SANSUI.code.bin"):
                        shutil.copy("../mergedir/SANSUI.code.bin","../kitking/%s_%s_%s.bin" %(board,ui.upper(),v))
                        
                    print board,ui
                    #var = raw_input("debug pause:")
                
    
    def main():
            
        str_BinTable="bintable.txt"
        str_BinData="bindata.txt"
        str_CombinationBin="VIL_SER.BIN"
    
        str_temp=""
        int_tablesize=0
        
        #get bin path
        fun_parse_InputParam()
    
        if os.path.exists(str_CombinationBin):
            os.remove(str_CombinationBin)
            
        if os.path.exists(g_binDir):
            shutil.rmtree(g_binDir)
        
        #gen all service bin file
        if g_bAllBinbyId:
            fun_genAllSerBinbyId()
            return
        elif g_bAllBin:
            fun_genAllSerBin()
            return
        else:
            print "
    This mode don't compile all modeCode!"
            print "python gen_codebin.py -i complie all modeCode
    "
    
        #get bin name
        fun_getBinList(g_strBinPath)
        g_listBin.sort()
        
        #decrypt bin file
        if g_bDecrypt:
            fun_decryptBinFile(g_listBin)
            print "Decrypt finish"
            return
    
        binTable_op = open(str_BinTable, "w+")
        binData_op = open(str_BinData, "wb+")
    
        fun_GetBinTableandBin(g_listBin, binTable_op, binData_op)
        #binTable_op.truncate(1024)
        binTable_op.close()
        binData_op.close()
    
        #gen header bin
        binCombinFile = open(str_CombinationBin, "wb+")
        int_tablesize=os.path.getsize(str_BinTable)
        str_temp=str(int_tablesize)+","+str(len(g_listBin))+","
        int_tablesize+=len(str_temp)
        binCombinFile.write(str(g_headerLen) + ","+ str(len(g_listBin))+",")
        
        #gen combin bin
        fun_genCombinationbin(binCombinFile, str_BinTable, str_BinData)
    
        binCombinFile.close()
        #subprocess.call(["mv", str_CombinationBin, g_strBinPath])
        os.remove(str_BinTable)
        os.remove(str_BinData)
        
    if __name__ == '__main__':
        main()
  • 相关阅读:
    money 和 smallmoney
    Sql server decimal 和 numeric
    SQL server数据类型int、bigint、smallint、tinyint
    c# 的传递参数值传递与传递引用的区别,ref与out区别
    释放SQL Server占用的内存
    JavaScript学习总结(一)——JavaScript基础
    js1
    Expected URL scheme 'http' or 'https' but no colon was found
    转载:SpringBoot Process finished with exit code 0
    转载:十大经典排序算法(动图演示)
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/9278468.html
Copyright © 2020-2023  润新知