Appia의 IT세상

파이썬[Python] Project01-03 DBC_Base Message/Siganl Class Commnet(주석) Parse 추가 본문

Python/Python 응용

파이썬[Python] Project01-03 DBC_Base Message/Siganl Class Commnet(주석) Parse 추가

Appia 2020. 1. 10. 21:19
반응형

저 번 포스팅에서는 DBC 파일의 Message / Signal등을 Parsing하는 부분에 대해서 다루었습니다. 포스팅을 하던 차에는 생각치 못했던 문제에 봉착하게 되었습니다. 그것은 다름 아니라, 바로 주석 즉 Commnet에 대한 파싱 부분을 누락했던 것입니다. 

 

파이썬[Python] Project01-02 DBC_Base Message/Siganl Class

 

파이썬[Python] Project01-02 DBC_Base Message/Siganl Class

앞서 포스팅에서 언급한 바와 같이 이번 포스팅에서는 DBC_Base부분으로 구성을 해볼까 합니다. DBC 파일을 읽어와서, Message, Signal 부분으로 나누어 저장하는 부분으로 구성이 됩니다. 전체적인 구성은 다음과..

appia.tistory.com

많은 분들은 주석에 대해서 생각보다 많이 중요하게 상각합니다. 그래서 저번 포스팅에 이어서 이번 포스팅은 주석 부분을 파싱 하는 부분에 대해서 포스팅을 하고자 합니다. 

 

주석을 추가하는 부분에 대해서 좀 많은 고민을 했습니다. Class안에 관련된 기능을 추가할 것지 아니면, 별도의 함수에서 관련된 클래스에 추가하여 작업을 할것인지에 대해서죠. 

 

일단 별도의 함수에서 Class로 정의된 리스트에 접근해서 각 부분에 대해서 확인하여 Commnet를 입력하는 형태로 구성해봤습니다. 

 

Commnent 추가 

Message/Signal에 따라서 각 부분에 맞춰서 Comment를 추가하는 부분에 대해서 기능을 구현했습니다. 

def insert_MSG_commnet(Messages,Comment):
    eComment = Comment.split(' ')
    tCommnet = re.findall('["].+["]', Comment)
    for Message in Messages:
        if Message.MessageID == eComment[2]:
            break

    if eComment[1] == 'SG_':
        for signal in Message.signals:
            if signal['signalName'] == eComment[3]:
                signal['commnet'] = tCommnet[0]

    elif eComment[1] == 'BO_':
        Message.Commnet = tCommnet[0]

관련해서 간단히 해석해보면, Messages는 Message 클래스를 담고 있는 List입니다. 그리고 Comment는 DBC파일의 각각 줄입니다. 단, CM_ (comment) Prefix를 가지고 있는 라인입니다. 

 

우선, Line를 받자마자, 공백으로 나눕니다. 그럼 다음과 같은 형태로 구성이 될 것입니다. 

tComment는 " " 안의 있는 글자들을 별도로 저장하기 위해서 다음과 같은 정규식 형태로 저장하였습니다. ( 이부분은 나중에 별도로 포스팅 하도록 하겠습니다. 

 

eComment[1] 부분은 이 부분이 어떤 부분의 대한 Comment인지 즉, Message/Signal에 대한 지침입니다. 그리고 eCommnet[2]는 MessageID입니다. eComment[3]은 Signal name입니다. 

 

그 부분을 바탕으로 위에 부분을 추측 하시길 바랍니다. 그리고 여기 뿐만 아니라 메인 부분에도 몇가지 손을 봤습니다. 

 

Message Class

class Msg :
    def __init__(self,data):
        data.replace('\n','')
        data = data.split(' ')
        data[3].replace(':','')
        self._,self.MessageID,self.MessageName,self.SignalCount,self.TxNode = data
        self.signals=[]
        # 추가 부분 01-03
        self.Commnet = None

위의 추가한 부분은 필수 부분은 아니지만, 나중을 위해서 일단, 추가 해놓은 부분입니다. 

 

Organize_Data

def Organize_Data(DBCFile):
    Total = []
    eMsg = None
    for i in DBCFile :
        if "BO_ " == i[:4]:
            if eMsg != None :
                Total.append(eMsg)
                eMsg = None
            eMsg = Msg(i)
        elif " SG_ " == i[:5]:
            eMsg.insert_signal(i)

        # 추가 부분 01-03
        elif "CM_ " == i[:4]:
            insert_MSG_commnet(Total,i)

    return Total

여기에서는 데이터를 정리할 때 CM_ 부분을 보고 Comment 부분을 추가하기 위해 별도의 Action을 하기 위해서 다음과 같이 추가하였습니다. 즉, CM_ 부분일 때 주석 추가하는 부분의 함수인 insert_MSG_comment를 실행할 것입니다. 

 

혹시 문의사항 및 궁금하신 사항이 있으시면 언제든지 댓글 및 방명록에 글 부탁드립니다. 

반응형
Comments