From e60d75228fb161e464ca59fa2526bf0765f4d902 Mon Sep 17 00:00:00 2001 From: lyg <1543117173@qq.com> Date: 星期四, 22 五月 2025 12:35:55 +0800 Subject: [PATCH] 修改指令json生成,加入fastapi --- db_struct_flow.py | 1605 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 1,342 insertions(+), 263 deletions(-) diff --git a/db_struct_flow.py b/db_struct_flow.py index ade1e21..0cb5312 100644 --- a/db_struct_flow.py +++ b/db_struct_flow.py @@ -1,23 +1,71 @@ import os +import time from datetime import datetime from openai import OpenAI -from pathlib import Path import re import json -import copy -from datas import pkt_vc, pkt_datas, dev_pkt, proj_data -from db.db_generate import create_project, create_device, create_data_stream -from db.models import TProject, TDevice +from langchain_community.chat_models import ChatOpenAI +from langchain_core.prompts import HumanMessagePromptTemplate, SystemMessagePromptTemplate + +import data_templates +from knowledgebase import utils +from knowledgebase.db.db_helper import create_project, create_device, create_data_stream, \ + update_rule_enc, create_extend_info, create_ref_ds_rule_stream, create_ins_format, make_attr +from knowledgebase.db.data_creator import create_prop_enc, create_enc_pkt, get_data_ty, create_any_pkt + +from knowledgebase.db.models import TProject + +from knowledgebase.db.doc_db_helper import doc_dbh + +# file_map = { +# # "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/HY-4A鏁扮鍒嗙郴缁熼仴娴嬫簮鍖呰璁℃姤鍛� Z 240824 鏇存敼3(鍐呴儴) .docx.md", +# # "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/鏁扮鏁板瓧閲忓揩閫熸簮鍖�.md", +# # "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/鏁扮鏁板瓧閲忎腑閫熸簮鍖�.md", +# # "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/纭�氶亾璁惧宸ヤ綔鐘舵�佹暟鎹寘.md", +# # "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/DIU閬ユ祴妯″潡閲囬泦鐨凞S閲�4.md", +# "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/DIU閬ユ祴妯″潡妯℃嫙閲�.md", +# "閬ユ祴澶х翰": "./doc/HY-4A鍗槦閬ユ祴澶х翰 Z 240824 鏇存敼3锛堝唴閮級.docx.md", +# # "鎬荤嚎浼犺緭閫氫俊甯у垎閰�": "./doc/HY-4A鍗槦1553B鎬荤嚎浼犺緭閫氫俊甯у垎閰� Z 240824 鏇存敼3锛堝唴閮級.docx.md", +# "鎬荤嚎浼犺緭閫氫俊甯у垎閰�": "./doc/鎬荤嚎.md", +# "搴旂敤杞欢鐢ㄦ埛闇�姹�": "./doc/HY-4A鏁扮鍒嗙郴缁熷簲鐢ㄨ蒋浠剁敤鎴烽渶姹傦紙鏄熷姟绠$悊鍒嗗唽锛� Z 240831 鏇存敼4锛堝唴閮級.docx.md" +# } +# file_map = { +# "閬ユ祴婧愬寘璁捐鎶ュ憡": "./docs/HY-4A鏁扮鍒嗙郴缁熼仴娴嬫簮鍖呰璁℃姤鍛� Z 240824 鏇存敼3(鍐呴儴) .docx.md", +# "閬ユ祴澶х翰": "./docs/HY-4A鍗槦閬ユ祴澶х翰 Z 240824 鏇存敼3锛堝唴閮級.docx.md", +# "鎬荤嚎浼犺緭閫氫俊甯у垎閰�": "./docs/HY-4A鍗槦1553B鎬荤嚎浼犺緭閫氫俊甯у垎閰� Z 240824 鏇存敼3锛堝唴閮級.docx.md", +# "搴旂敤杞欢鐢ㄦ埛闇�姹�": "./docs/HY-4A鏁扮鍒嗙郴缁熷簲鐢ㄨ蒋浠剁敤鎴烽渶姹傦紙鏄熷姟绠$悊鍒嗗唽锛� Z 240831 鏇存敼4锛堝唴閮級.docx.md" +# } +file_map = { + "鏂囨。鍚堝苟": "./doc/鏂囨。鍚堝苟.md", + "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/XA-5D鏃犱汉鏈哄垎绯荤粺鎺㈡祴婧愬寘璁捐鎶ュ憡锛堝叕寮�锛�.md", + "閬ユ祴澶х翰": "./doc/XA-5D鏃犱汉鏈烘帰娴嬪ぇ绾诧紙鍏紑锛�.md", + "鎬荤嚎浼犺緭閫氫俊甯у垎閰�": "./doc/XA-5D鏃犱汉鏈�1314A鎬荤嚎浼犺緭閫氫俊甯у垎閰嶏紙鍏紑锛�.md", + "鎸囦护鏍煎紡": "./doc/ZL鏍煎紡(鍏紑).docx.md" +} BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1' API_KEY = 'sk-15ecf7e273ad4b729c7f7f42b542749e' -MODEL_NAME = 'qwen-long' +MODEL_NAME = 'qwen2.5-72b-instruct' +# BASE_URL = 'http://10.74.15.164:11434/v1/' +# API_KEY = 'ollama' +# MODEL_NAME = 'qwen2.5:32b-128k' + +# BASE_URL = 'http://chat.com/api' +# API_KEY = 'sk-49457e83f734475cb4cf7066c649d563' +# MODEL_NAME = 'qwen2.5:72b-120k' + +# BASE_URL = 'http://10.74.15.171:8000/v1' +# API_KEY = 'EMPTY' +# MODEL_NAME = 'QwQ:32b' +# MODEL_NAME = 'vllm-Qwen-72b-4bit' + +USE_CACHE = True assistant_msg = """ # 瑙掕壊 -浣犳槸涓�涓笓涓氱殑鏂囨。閫氫俊鍒嗘瀽甯堬紝鎿呴暱杩涜鏂囨。鍒嗘瀽鍜岄�氫俊鍗忚鍒嗘瀽锛屽悓鏃惰兘澶熻В鏋� markdown 绫诲瀷鐨勬枃妗c�傛嫢鏈夋垚鐔熷噯纭殑鏂囨。闃呰涓庡垎鏋愯兘鍔涳紝鑳藉濡ュ杽澶勭悊澶氭枃妗i棿瀛樺湪寮曠敤鍏崇郴鐨勫鏉傛儏鍐点�� +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堬紝鎿呴暱杩涜鏂囨。鍒嗘瀽鍜岄�氫俊鍗忚鍒嗘瀽锛屽悓鏃惰兘澶熻В鏋� markdown 绫诲瀷鐨勬枃妗c�傛嫢鏈夋垚鐔熷噯纭殑鏂囨。闃呰涓庡垎鏋愯兘鍔涳紝鑳藉濡ュ杽澶勭悊澶氭枃妗i棿瀛樺湪寮曠敤鍏崇郴鐨勫鏉傛儏鍐点�� ## 鎶�鑳� ### 鎶�鑳� 1锛氭枃妗e垎鏋愶紙鍖呮嫭 markdown 鏂囨。锛� @@ -25,64 +73,274 @@ 2. 鍒嗘瀽鏂囨。鐨勭粨鏋勩�佷富棰樺拰閲嶇偣鍐呭锛屽悓鏍峰彧渚濇嵁鏂囨。杩涜琛ㄨ堪銆� 3. 濡傛灉鏂囨。闂村瓨鍦ㄥ紩鐢ㄥ叧绯伙紝姊崇悊寮曠敤鑴夌粶锛屾槑纭悇鏂囨。涔嬮棿鐨勫叧鑱旓紝涓斾粎鍛堢幇鏂囨。涓綋鐜扮殑鍐呭銆� - ### 鎶�鑳� 2锛氶�氫俊鍗忚鍒嗘瀽 1. 鎺ユ敹閫氫俊鍗忚鐩稿叧淇℃伅锛岀悊瑙e崗璁殑瑙勫垯鍜屾祦绋嬶紝浠呬緷鎹墍缁欎俊鎭繘琛屽垎鏋愩�� +## 鑳屾櫙鐭ヨ瘑 +###杞欢涓昏鍔熻兘涓庤繍琛屾満鍒舵�荤粨濡備笅锛� +1. 鏁版嵁閲囬泦鍜屽鐞嗭細 + DIU璐熻矗鏍规嵁鍗槦鐨勫伐浣滅姸鎬佹垨妯″紡鎻愪緵閬ユ祴鏁版嵁锛屽寘鎷ā鎷熼噺锛圓N锛夈�佹�荤嚎淇″彿锛圔L锛変互鍙婃俯搴︼紙TH锛夊拰鏁板瓧閲忥紙DS锛夛紝骞跺皢杩欎簺淇℃伅鎵撳寘锛岄�氳繃鎬荤嚎鍙戦�佺粰SMU銆� + SMU鍒欐敹闆嗙‖閫氶亾涓婄殑閬ユ祴鍙傛暟锛屽苟閫氳繃鎬荤嚎鎺ユ敹DIU閲囬泦鐨勪俊鎭�� +2. 澶氳矾澶嶇敤涓庢暟鎹紶杈擄細 + 閬ユ祴婧愬寘琚粍缁囨垚E-PDU锛岃繘涓�姝ュ鐢ㄤ负M-PDU锛屽苟濉厖鍒癡CDU涓瀯鎴愰仴娴嬪抚銆� + 鍒╃敤CCSDS AOS CADU鏍煎紡杩涜閬ユ祴鏁版嵁鐨勫璺鐢ㄥ拰浼犺緭銆� +3. 铏氭嫙淇¢亾锛圴C锛夎皟搴︽満鍒讹細 + 閫氳繃甯歌閬ユ祴VC銆佺獊鍙戞暟鎹甐C銆佸欢鏃堕仴娴媀C銆佽褰曟暟鎹甐C浠ュ強鍥炴斁VC瀹炵幇涓嶅悓绫诲瀷鐨勬暟鎹笅浼犮�� +4. 閬ユ帶鎸囦护澶勭悊锛� + 涓婅閬ユ帶鍖呮嫭鐩存帴鎸囦护鍜岄棿鎺ユ寚浠わ紝闇�缁忚繃鏍煎紡楠岃瘉鍚庤浆鍙戠粰鐩稿簲鍗曟満鎵ц銆� + 閬ユ帶甯ч�氳繃鐗瑰畾鐨勮櫄鎷熶俊閬擄紙VC锛夎繘琛屼紶杈撱�� +杩欎簺鐭ヨ瘑闇�瑕佷綘璁颁綇锛屽啀鍚庣画鐨勫鐞嗕腑鍙互甯姪浣犵悊瑙h澶勭悊鐨勬暟鎹�� + ## 鐩爣瀵煎悜 1. 閫氳繃瀵规枃妗e拰閫氫俊鍗忚鐨勫垎鏋愶紝涓虹敤鎴锋彁渚涙竻鏅般�佸噯纭殑鏁版嵁缁撴瀯锛屽府鍔╃敤鎴锋洿濂藉湴鐞嗚В鍜屼娇鐢ㄧ浉鍏充俊鎭�� -2. 浠� JSON 鏍煎紡缁勭粐杈撳嚭鍐呭锛岀‘淇濇暟鎹粨鏋勭殑瀹屾暣鎬у拰鍙鎬с�� ## 瑙勫垯 -1. 姣忎竴涓瀷鍙烽兘浼氭湁涓�濂楁枃妗o紝闇�鍑嗙‘鍒ゆ柇鏄惁涓哄悓涓�涓瀷鍙风殑鏂囨。鍚庡啀杩涜鏁翠綋鍒嗘瀽銆� -2. 姣忔鍙垎鏋愬悓涓�涓瀷鍙枫�� -3. 澶у鏁版枃妗g粨鏋勪负锛氬瀷鍙蜂笅鍖呭惈璁惧锛岃澶囦笅鍖呭惈鏁版嵁娴侊紝鏁版嵁娴佷笅鍖呭惈鏁版嵁甯э紝鏁版嵁甯т腑鏈変竴鍧楁槸鍖呭煙锛屽寘鍩熶腑浼氭寕杞藉悇绉嶇被鍨嬬殑鏁版嵁鍖呫�� -4. 杩欎簺鏂囨。閮芥槸鏁版嵁浼犺緭鍗忚鐨勬弿杩帮紝鍦ㄦ暟鎹祦銆佹暟鎹抚銆佹暟鎹寘绛変紶杈撳疄浣撲腑閮芥弿杩颁簡鍚勪釜瀛楁鐨勫垎甯冨拰姣忎釜瀛楁鐨勫ぇ灏忥紝涓斿ぇ灏忓崟浣嶄笉缁熶竴锛岄渶鐞嗚В杩欎簺鍗曚綅锛屽苟灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�涓� bits锛岀粺涓�浣跨敤length琛ㄧず銆� -5. 濡傛灉鏈夊眰绾э紝浣跨敤鏍戝舰 JSON 杈撳嚭锛屽瓙鑺傜偣 key 浣跨敤children锛涢渶淇濊瘉鐩稿悓绫诲瀷鐨勬暟鎹粨鏋勭粺涓�锛屽苟涓斿垽鏂瘡涓眰绾ф槸浠�涔堢被鍨嬶紝杈撳嚭绫诲瀷瀛楁锛岀被鍨嬪瓧娈电殑 key 浣跨敤 type 锛涗緥濡傚綋鍓嶅眰绾т负瀛楁鏃朵娇鐢細type:"field"锛涘綋鍓嶅眰绾т负璁惧鏃朵娇鐢細type:"device" -6.鍚嶇О鐩稿叧鐨勫瓧娈电殑 key 浣跨敤name锛涗唬鍙锋垨鑰呭敮涓�鏍囪瘑鐩稿叧鐨勫瓧娈电殑key浣跨敤id锛涘簭鍙风浉鍏崇殑瀛楁鐨刱ey浣跨敤number锛涘叾浠栨病鏈変妇渚嬬殑瀛楁浣跨敤绮剧畝鐨勭炕璇戜綔涓哄瓧娈电殑key锛� -7.鎺㈡祴甯т负CADU锛屽叾涓寘鍚悓姝ュご鍜孷CDU锛屾寜鐓т範鎯渶瑕佷娇鐢╒CDU灞傜骇鍖呭惈涓嬩竴灞傜骇涓紶杈撳抚涓诲澶淬�佷紶杈撳抚鎻掑叆鍩熴�佷紶杈撳抚鏁版嵁鍩熴�佷紶杈撳抚灏剧殑缁撴瀯 - +1. 姣忎竴涓瀷鍙烽兘浼氭湁涓�濂楁枃妗o紝闇�鍑嗙‘鍒ゆ柇鏄惁涓哄悓涓�涓瀷鍙风殑鏂囨。鍚庡啀杩涜鏁翠綋鍒嗘瀽锛屾瘡娆″彧鍒嗘瀽鍚屼竴涓瀷鍙风殑鏂囨。銆� +2. 澶у鏁版枃妗g粨鏋勪负锛氬瀷鍙蜂笅鍖呭惈璁惧锛岃澶囦笅鍖呭惈鏁版嵁娴侊紝鏁版嵁娴佷笅鍖呭惈鏁版嵁甯э紝鏁版嵁甯т腑鏈変竴鍧楁槸鍖呭煙锛屽寘鍩熶腑浼氭寕杞藉悇绉嶇被鍨嬬殑鏁版嵁鍖呫�� +3. 鏂囨。閮芥槸瀵逛簬鏁版嵁浼犺緭鍗忚鐨勬弿杩帮紝鍦ㄦ暟鎹祦銆佹暟鎹抚銆佹暟鎹寘绛変紶杈撳疄浣撲腑閮芥弿杩颁簡鍚勪釜瀛楁鐨勫垎甯冦�佸悇涓瓧娈电殑澶у皬鍜屼綅缃瓑淇℃伅锛屼笖澶у皬鍗曚綅涓嶇粺涓�锛岄渶鐞嗚В杩欎簺鍗曚綅锛屽苟灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�涓� bits锛岄暱搴﹀瓧娈典娇鐢� length 琛ㄧず锛屼綅缃瓧娈典娇鐢� pos 琛ㄧず锛屽鏋滀负鍙橀暱浣跨敤鈥�"鍙橀暱"鈥濊〃绀恒�� +4. 濡傛灉鏈夊眰绾э紝浣跨敤鏍戝舰 JSON 杈撳嚭锛屽鏋滄湁瀛愯妭鐐癸紝瀛愯妭鐐� key 浣跨敤children锛涢渶淇濊瘉涓�娆¤緭鍑虹殑鏁版嵁缁撴瀯缁熶竴锛屽苟涓斿垽鏂瘡涓眰绾ф槸浠�涔堢被鍨嬶紝杈撳嚭绫诲瀷瀛楁锛坱ype锛夛紝绫诲瀷瀛楁鐨� key 浣跨敤 type锛岀被鍨嬪寘鎷細鍨嬪彿锛坧roject锛夈�佽澶囷紙dev锛夈�佸皝瑁呭寘锛坋nc锛夈�佺嚎鎬у寘锛坙inear锛夈�佸弬鏁帮紙para锛夛紝灏佽鍖呭瓙绾ф湁鏁版嵁鍖咃紝鎵�浠ype涓篹nc锛岀嚎鎬у寘瀛愮骇鍙湁鍙傛暟锛屾墍浠ype涓簂inear锛涙瘡涓眰绾ч兘鍖呭惈鍋忕Щ浣嶇疆锛坧os锛夛紝姣忎釜灞傜骇鐨勫亸绉讳綅缃粠0寮�濮嬨�� +5. 鍚嶇О鐩稿叧鐨勫瓧娈电殑 key 浣跨敤name锛涗唬鍙枫�佺紪鍙锋垨鑰呭敮涓�鏍囪瘑鐩稿叧鐨勫瓧娈电殑key浣跨敤id锛宨d鐢辨暟瀛椼�佽嫳鏂囧瓧姣嶃�佷笅鍒掔嚎缁勬垚涓斾互鑻辨枃瀛楁瘝寮�澶达紝闀垮害灏介噺绠�鐭紱搴忓彿鐩稿叧鐨勫瓧娈电殑key浣跨敤number锛涘亸绉讳綅缃浉鍏冲瓧娈电殑key浣跨敤pos锛涘叾浠栨病鏈変妇渚嬬殑瀛楁浣跨敤绮剧畝鐨勭炕璇戜綔涓哄瓧娈电殑key锛涙瘡涓粨鏋勫繀椤诲寘鍚玭ame鍜宨d銆� +6. 閬ユ祴甯т负CADU锛屽叾涓寘鍚悓姝ュご鍜孷CDU锛屾寜鐓т範鎯渶瑕佷娇鐢╒CDU灞傜骇宓屽浼犺緭甯т富瀵煎ご銆佷紶杈撳抚鎻掑叆鍩熴�佷紶杈撳抚鏁版嵁鍩熴�佷紶杈撳抚灏剧殑缁撴瀯銆� +7. 鏁版嵁鍖呭瓧娈靛寘鎷細name銆乮d銆乼ype銆乸os銆乴ength銆乧hildren锛涘弬鏁板瓧娈靛寘鎷細name銆乮d銆乸os銆乼ype銆乴ength锛涘繀椤诲寘鍚玴os鍜宭ength瀛楁銆� +8. 甯哥敤id鍙傝�冿細閬ユ祴锛圱M锛夈�侀仴鎺э紙TC锛夈�佹�荤嚎锛圔US锛夈�佺増鏈彿锛圴er锛夈�佸簲鐢ㄨ繃绋嬫爣璇嗭紙APID锛夈�� +9. 娉ㄦ剰锛氫竴瀹氳璁板緱morkdown鏂囨。涓細灏嗕竴浜涚壒娈婂瓧绗﹁繘琛岃浆涔夛紝浠ユ鏉ヤ繚璇佹枃妗g殑姝g‘鎬э紝杩欎簺杞箟绗﹀彿锛堜篃灏辨槸鍙嶆枩鏉犫�榎鈥欙級涓嶉渶瑕佸湪缁撴灉涓緭鍑恒�� +10. 浠� JSON 鏍煎紡缁勭粐杈撳嚭鍐呭锛岀‘淇濇暟鎹粨鏋勭殑瀹屾暣鎬у拰鍙鎬э紝娉ㄦ剰锛氱敓鎴愮殑JSON璇硶鏍煎紡蹇呴』绗﹀悎json瑙勮寖锛岄伩鍏嶅嚭鐜伴敊璇�� + ## 闄愬埗锛� - 鎵�杈撳嚭鐨勫唴瀹瑰繀椤绘寜鐓SON鏍煎紡杩涜缁勭粐锛屼笉鑳藉亸绂绘鏋惰姹傦紝涓斾弗鏍奸伒寰枃妗e唴瀹硅繘琛岃緭鍑猴紝鍙緭鍑� JSON 锛屼笉瑕佽緭鍑哄叾瀹冩枃瀛椼�� -- 涓嶈緭鍑轰换浣曟敞閲婄瓑鎻忚堪鎬т俊鎭� - +- 涓嶈緭鍑轰换浣曟敞閲婄瓑鎻忚堪鎬т俊鎭�� """ + +tc_system_msg = """ +# 瑙掕壊 +浣犳槸涓�涓祫娣辫蒋浠跺伐绋嬪笀銆� +# 绾︽潫 +- 杈撳嚭鍐呭蹇呴』鏍规嵁鏂囨。鍜岄棶棰樺洖绛旓紝涓嶈鍒涢�犲叾浠栧唴瀹癸紱 +- 杈撳嚭鍐呭蹇呴』鏄紝JSON鏍煎紡锛屼笉瑕佽緭鍑哄叾浠栨枃鏈�� +""" + +g_completion = None + + +def read_from_file(cache_file): + with open(cache_file, 'r', encoding='utf-8') as f: + text = f.read() + return text + + +def save_to_file(text, file_path): + if USE_CACHE: + with open(file_path, 'w', encoding='utf-8') as f: + f.write(text) + + +def remove_think_tag(text): + pattern = r'<think>(.|\n)*?</think>' + result = re.sub(pattern, '', text) + return result + + +json_pat = re.compile(r'```json(.*?)```', re.DOTALL) + + +def get_json_text(text): + # 浣跨敤姝e垯琛ㄨ揪寮忔彁鍙杍son鏂囨湰 + try: + return json_pat.findall(text)[0] + except IndexError: + return text + + +def rt_pkt_map_gen(pkt, trans_ser, rt_pkt_map, pkt_id, vals): + # 閫昏緫灏佽鍖咃紝鏁版嵁鍧椾紶杈撶殑鍙湁涓�涓紝鍙栨暟鐨勬牴鎹甊T鍦板潃銆佸瓙鍦板潃鍜屽抚鍙峰垝鍒� + frame_num = pkt['frameNum'] + if trans_ser == '鏁版嵁鍧椾紶杈�': + # 鏁版嵁鍧椾紶杈撴牴鎹甊T鍦板潃鍜屽瓙鍦板潃鍒掑垎 + key = f'{pkt["rt"]}_{pkt["subAddr"]}' + name = f'{pkt["rt"]}_{pkt["subAddr"]}_{trans_ser}' + else: + # 鍙栨暟鏍规嵁RT鍦板潃銆佸瓙鍦板潃鍜屽抚鍙峰垝鍒� + key = f'{pkt["rt"]}_{pkt["subAddr"]}_{pkt["frameNum"]}' + name = f'{pkt["rt"]}_{pkt["subAddr"]}_甯у彿{frame_num}_{trans_ser}' + # + if key not in rt_pkt_map: + rt_pkt_map[key] = { + "name": name, + "id": pkt_id, + "type": "logic", + "pos": 0, + "content": "CYCLEBUFFER,Message,28,0xFFFF", + "length": "", + "vals": vals, + "children": [] + } + frame = f'{pkt["frameNum"]}' + + interval = f'{pkt["interval"]}'.replace(".", "_") + if trans_ser == '鍙栨暟': + _key = f'RT{pkt["rtAddr"]}Frame{frame.replace("|", "_")}_Per{interval}' + else: + # 鏁版嵁鍧椾紶杈� + if pkt['burst']: + _key = f'RT{pkt["rtAddr"]}FrameALL' + else: + _key = f'RT{pkt["rtAddr"]}Frame{frame}Per{interval}' + + _pkt = next(filter(lambda it: it['name'] == _key, rt_pkt_map[key]['children']), None) + if _pkt is None: + ext_info = None + if trans_ser == '鏁版嵁鍧椾紶杈�' and not pkt['burst']: + # 鏁版嵁鍧椾紶杈撲笖鏈夊懆鏈熺殑鍖呴渶瑕� + ext_info = [{"id": "PeriodTriger", "name": "鏃跺垎澶嶇敤鎬荤嚎瑙﹀彂灞炴��", "val": f"{pkt['interval']}"}, + {"id": "FrameNumber", "name": "鏃跺垎澶嶇敤鍗忚甯у彿", "val": frame}] + _pkt = { + "name": _key, + "id": _key, + "type": "enc", + "pos": 0, + "content": "1:N;EPDU", + "length": "length", + "extInfo": ext_info, + "children": [ + { + "id": "C02_ver", + "name": "閬ユ祴鐗堟湰", + "type": "para", + "pos": 0, + "length": 3, + "dataTy": "INVAR", + "content": "0" + }, + { + "id": "C02_type", + "name": "绫诲瀷", + "type": "para", + "pos": 3, + "length": 1, + "dataTy": "INVAR", + "content": "0" + }, + { + "id": "C02_viceHead", + "name": "鍓澶存爣璇�", + "type": "para", + "pos": 4, + "length": 1, + "content": "1", + "dataTy": "INVAR" + }, + { + "id": "C02_PackSign", + "name": "APID", + "type": "para", + "pos": 5, + "length": 11, + "is_key": True, + "dataTy": "ENUM" + }, + { + "id": "C02_SerCtr_1", + "name": "搴忓垪鏍囪", + "type": "para", + "pos": 16, + "length": 2, + "content": "3" + }, + { + "id": "C02_SerCtr_2", + "name": "鍖呭簭璁℃暟", + "type": "para", + "pos": 18, + "length": 14, + "content": "0:167772:1", + "dataTy": "INCREASE" + }, + { + "id": "C02_PackLen", + "name": "鍖呴暱", + "type": "para", + "pos": 32, + "length": 16, + "content": "1Bytes/C02_Data.length+1", + "dataTy": "LEN" + }, + { + "id": "C02_Ser", + "name": "鏈嶅姟", + "type": "para", + "pos": 48, + "length": 8, + "is_key": True, + "dataTy": "ENUM" + }, + { + "id": "C02_SubSer", + "name": "瀛愭湇鍔�", + "type": "para", + "pos": 56, + "length": 8, + "is_key": True, + "dataTy": "ENUM" + }, + { + "id": "C02_Data", + "name": "鏁版嵁鍖�", + "type": "linear", + "pos": 64, + "length": 'length-current', + "children": [] + }, + ] + } + rt_pkt_map[key]['children'].append(_pkt) + # 鏁版嵁鍖轰笅闈㈢殑鍖� + data_area = next(filter(lambda it: it['name'] == '鏁版嵁鍖�', _pkt['children']), None) + ser_sub_ser: str = pkt['service'] + ser = '' + sub_ser = '' + if ser_sub_ser: + nums = re.findall(r'\d+', ser_sub_ser) + if len(nums) == 2: + ser = nums[0] + sub_ser = nums[1] + if 'children' not in pkt: + pkt['children'] = [] + p_name = pkt['id'] + '_' + pkt['name'] + + data_area['children'].append({ + "name": p_name, + "id": pkt["id"], + "type": "linear", + "pos": 0, + "length": pkt["length"], + "vals": f"0x{pkt['apid']}/{ser}/{sub_ser}/", + "children": pkt['children'], + }) + + +def build_vcid_content(vcs): + _vcs = [] + for vc in vcs: + _vcs.append(vc['name'] + ',' + vc['VCID']) + return ' '.join(_vcs) class DbStructFlow: - files = [] - file_objects = [] + # 宸ョ▼ + proj: TProject = None + # 閬ユ祴婧愬寘鍒楄〃锛屼粎鍖呭悕绉般�佸寘id鍜宧asParams + tm_pkts = [] + # vc婧愬寘 + vc_pkts = [] - def __init__(self, doc_files): + def __init__(self): self.client = OpenAI( api_key=API_KEY, base_url=BASE_URL, # api_key="ollama", # base_url="http://192.168.1.48:11434/v1/", ) - if doc_files: - self.files = doc_files - self.load_file_objs() - self.delete_all_files() - self.upload_files() - - def load_file_objs(self): - file_stk = self.client.files.list() - self.file_objects = file_stk.data - - def delete_all_files(self): - for file_object in self.file_objects: - self.client.files.delete(file_object.id) - - def upload_file(self, file_path): - file_object = self.client.files.create(file=Path(file_path), purpose="file-extract") - return file_object - - def upload_files(self): - self.file_objects = [] - for file_path in self.files: - file_object = self.upload_file(file_path) - self.file_objects.append(file_object) + # self.llm = ChatOpenAI(model=MODEL_NAME, temperature=0, api_key=API_KEY, base_url=BASE_URL) def run(self): # 鐢熸垚鍨嬪彿缁撴瀯 @@ -90,115 +348,103 @@ # 鐢熸垚鏁版嵁娴佺粨鏋� CADU # 鐢熸垚VCDU缁撴瀯 # 鐢熸垚閬ユ祴鏁版嵁鍖呯粨鏋� - proj = self.gen_project([]) - # proj = TProject(C_PROJECT_PK='2e090a487c1a4f7f741be3a437374e2f') + self.proj = self.gen_project() - devs = self.gen_device([], proj) - # with open('datas/璁惧鍒楄〃.json', 'w', encoding='utf8') as f: - # json.dump(devs, f, ensure_ascii=False, indent=4) - # - # proj['devices'] = devs - # - # messages = [] - # cadu = self.gen_tm_frame(messages) - # with open("datas/鎺㈡祴甯�.json", 'w', encoding='utf8') as f: - # json.dump(cadu, f, ensure_ascii=False, indent=4) - # - # messages = [] - # vcs = self.gen_vc(messages) - # with open('datas/铏氭嫙淇¢亾.json', 'w', encoding='utf8') as f: - # json.dump(vcs, f, ensure_ascii=False, indent=4) - # - # messages = [] - # pkt_vcs = self.gen_pkt_vc(messages) - # with open('datas/VC婧愬寘.json', 'w', encoding='utf8') as f: - # json.dump(pkt_vcs, f, ensure_ascii=False, indent=4) - # - # messages = [] - # dev_pkts = self.gen_dev_pkts(messages) - # with open('datas/璁惧婧愬寘.json', 'w', encoding='utf8') as f: - # json.dump(dev_pkts, f, ensure_ascii=False, indent=4) - # - # messages = [] - # _pkts = self.gen_pkts() - # pkts = [] - # for pkt in _pkts: - # _pkt = self.gen_pkt_details(pkt['name']) - # pkts.append(_pkt) - # with open('datas/婧愬寘鍒楄〃.json', 'w', encoding='utf8') as f: - # json.dump(pkts, f, ensure_ascii=False, indent=4) - # - # for dev in devs: - # ds = dev['data_streams'][0] - # _cadu = copy.deepcopy(cadu) - # ds['cadu'] = _cadu - # _vcdu = next(filter(lambda it: it['name'] == '浼犺緭甯�', _cadu['children'])) - # vcdu_data = next(filter(lambda it: it['name'] == '浼犺緭甯ф暟鎹煙', _vcdu['children'])) - # _vcs = copy.deepcopy(vcs) - # vcdu_data['children'] = _vcs - # dev_pkt = next(filter(lambda it: it['name'] == dev['name'], dev_pkts), None) - # if dev_pkt is None: - # continue - # for pkt in dev_pkt['pkts']: - # for vc in _vcs: - # _pkt = next( - # filter(lambda it: it['name'] == pkt['name'] and it['vcs'].__contains__(vc['code']), pkt_vcs), - # None) - # if _pkt: - # if vc.__contains__('pkts') is False: - # vc['pkts'] = [] - # _pkt = next(filter(lambda it: it['name'] == _pkt['name'], pkts), None) - # if _pkt: - # vc['pkts'].append(_pkt) - # - # with open("datas/鍨嬪彿.json", 'w', encoding='utf8') as f: - # json.dump(proj, f, ensure_ascii=False, indent=4) + # devs = self.gen_device(self.proj) + + self.gen_tc() return '' - def _gen(self, msgs, msg): + def get_text_with_entity(self, entity_names: list[str]) -> str: + """ + 鏍规嵁瀹炰綋璇嶈幏鍙栨枃妗f枃鏈� + :param entity_names: str - 瀹炰綋璇嶅悕绉� + :return: str - 鏂囨湰鍐呭 + """ + return doc_dbh.get_text_with_entities(entity_names) + + def _gen(self, msgs, msg, doc_text): + # if files is None: + # files = [file_map['鏂囨。鍚堝苟']] messages = [] if msgs is None else msgs + # doc_text = '' + # for file in files: + # doc_text += '\n' + read_from_file(file) if len(messages) == 0: - # 濡傛灉鏄涓�娆℃彁闂姞鍏ユ枃妗� + # 濡傛灉鏄涓�娆℃彁闂姞鍏ystem娑堟伅 messages.append({'role': 'system', 'content': assistant_msg}) - for file_object in self.file_objects: - messages.append({'role': 'system', 'content': 'fileid://' + file_object.id}) + messages.append({'role': 'user', 'content': "浠ヤ笅鏄枃妗e唴瀹癸細\n" + doc_text}) messages.append({'role': 'user', 'content': msg}) completion = self.client.chat.completions.create( model=MODEL_NAME, messages=messages, stream=True, - temperature=0.0, - top_p=0, + temperature=0.6, + # top_p=0, timeout=30 * 60000, - max_completion_tokens=1000000 + max_completion_tokens=32000, + seed=0 # stream_options={"include_usage": True} ) - + g_completion = completion text = '' for chunk in completion: if chunk.choices[0].delta.content is not None: text += chunk.choices[0].delta.content print(chunk.choices[0].delta.content, end="") print("") + g_completion = None return text - def gen_project(self, messages): - _msg = f""" -鏍规嵁鏂囨。杈撳嚭鍨嬪彿淇℃伅锛屽瀷鍙峰瓧娈靛寘鎷細鍚嶇О鍜屼唬鍙凤紝浠呰緭鍑哄瀷鍙风殑灞炴�э紝涓嶈緭鍑哄叾浠栧眰绾ф暟鎹� + def generate_text(self, msg, cache_file, msgs=None, doc_text=None, validation=None, try_cnt=5, json_text=False): + if msgs is None: + msgs = [] + if USE_CACHE and os.path.isfile(cache_file): + text = read_from_file(cache_file) + else: + s = time.time() + text = self._gen(msgs, msg, doc_text) + text = remove_think_tag(text) + if json_text: + text = get_json_text(text) + if validation: + try: + validation(text) + except BaseException as e: + print(e) + if try_cnt <= 0: + raise RuntimeError('鐢熸垚澶辫触锛岄噸璇曟鏁板お澶氾紝寮哄埗缁撴潫锛�') + return self.generate_text_json(msg, cache_file, msgs, doc_text, validation, try_cnt - 1) + if cache_file: + save_to_file(text, cache_file) + print(f'鑰楁椂锛歿time.time() - s}') + return text + + def generate_text_json(self, msg, cache_file, msgs=None, doc_text=None, validation=None, try_cnt=5): + return self.generate_text(msg, cache_file, msgs, doc_text, validation, try_cnt, True) + + def generate_tc_text(self, msg, cache_file, msgs=None, doc_text=None, validation=None, try_cnt=5): + msgs = [ + {'role': 'system', 'content': tc_system_msg}, + {'role': 'user', 'content': "浠ヤ笅鏄枃妗e唴瀹癸細\n" + doc_text}] + return self.generate_text(msg, cache_file, msgs, doc_text, validation, try_cnt, True) + + def gen_project(self): + _msg = """ + 鏍规嵁鏂囨。鍐呭杈撳嚭鍒嗙郴缁熶俊鎭紝鍒嗙郴缁熷瓧娈靛寘鎷細鍚嶇О鍜屽瀷鍙蜂唬鍙枫�備粎杈撳嚭鍒嗙郴缁熻繖涓�绾с�傚鏋滃瀷鍙蜂唬鍙蜂腑鏈夌鍙蜂篃瑕佽緭鍑猴紝淇濊瘉杈撳嚭瀹屾暣銆� + 渚嬪锛歿"name":"xxx","id":"xxx"} """ print('鍨嬪彿淇℃伅锛�') - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) + doc_text = self.get_text_with_entity(['绯荤粺姒傝堪']) + text = self.generate_text_json(_msg, 'out/鍨嬪彿淇℃伅.json', doc_text=doc_text) proj_dict = json.loads(text) - # return proj_dict code = proj_dict['id'] name = proj_dict['name'] proj = create_project(code, name, code, name, "", datetime.now()) return proj - def gen_device(self, messages, proj): + def gen_device(self, proj): """ 璁惧鍒楄〃鐢熸垚瑙勫垯锛� 1.濡傛枃妗d腑鏈�1553鍗忚鎻忚堪锛屽姞鍏�1553璁惧 @@ -208,28 +454,58 @@ 璁惧绫诲瀷锛氬伐鎺ф満[0]銆�1553B[1] - :param messages: + :param proj: :return: """ proj_pk = proj.C_PROJECT_PK devices = [] - _msg = f""" -杈撳嚭鎵�鏈夎澶囧垪琛紝璁惧瀛楁鍖呮嫭鍚嶇О锛坣ame)銆佷唬鍙凤紙code锛夛紝濡傛灉娌℃湁浠e彿鍒欎娇鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧缂╁啓浠f浛涓旂缉鍐欓暱搴︿笉瓒呰繃5涓瓧绗︼紝JSON鏍煎紡锛屽苟涓旂粰姣忎釜璁惧澧炲姞涓変釜瀛楁锛岀涓�涓瓧娈礹asTcTm鈥滄槸鍚﹀寘鍚仴鎺ч仴娴嬧�濓紝鍒ゆ柇璇ヨ澶囨槸鍚﹀寘鍚仴鎺ч仴娴嬬殑鍔熻兘锛涚浜屼釜瀛楁hasTemperatureAnalog鈥滄槸鍚﹀寘鍚俯搴﹂噺銆佹ā鎷熼噺绛夋暟鎹殑閲囬泦鈥濓紝鍒ゆ柇璇ヨ澶囨槸鍚﹀寘鍚俯搴﹂噺绛変俊鎭殑閲囬泦鍔熻兘锛涚涓変釜瀛楁hasBus鈥滄槸鍚︽槸鎬荤嚎璁惧鈥濓紝鍒ゆ柇璇ヨ澶囨槸鍚﹀睘浜庢�荤嚎璁惧锛屾槸鍚︽湁RT鍦板潃锛涙瘡涓瓧娈电殑鍊奸兘浣跨敤true鎴杅alse鏉ヨ〃绀恒�� -浠呰緭鍑篔SON锛屼笉瑕佽緭鍑篔SON浠ュ鐨勪换浣曞瓧绗︺�� - """ + _msg = """ +# 瑙掕壊 +浣犳槸涓�鍚嶈祫娣辫蒋浠跺伐绋嬪笀銆� +# 鎸囦护 +鎴戦渶瑕佷粠鏂囨。鎻愬彇璁惧鍒楄〃淇℃伅锛屼綘瑕佸府鍔╂垜瀹屾垚璁惧鍒楄〃淇℃伅鎻愬彇銆� +# 闇�姹� +杈撳嚭鍒嗙郴缁熶笅鐨勭‖浠朵骇鍝侊紙璁惧锛夊垪琛紝纭欢浜у搧鍚嶇О涓�鑸細鍖呭惈鈥滅鐞嗗崟鍏冣�濇垨鑰呪�滄帴鍙e崟鍏冣�濓紱 +# 瀛楁鍖呮嫭锛� +- 鍚嶇О(name)锛氳澶囧悕绉帮紱 +- 浠e彿(code)锛氳澶囦唬鍙凤紱 +- 鏄惁鍖呭惈閬ユ帶閬ユ祴(hasTcTm)锛氭爣璇嗚纭欢浜у搧鏄惁鍖呭惈閬ユ帶閬ユ祴鐨勫姛鑳斤紝甯冨皵鍊紅rue鎴杅alse锛� +- 鏄惁鍖呭惈娓╁害閲忔ā鎷熼噺绛夋暟鎹殑閲囬泦(hasTemperatureAnalog)锛氭爣璇嗚纭欢浜у搧鏄惁鍖呭惈娓╁害閲忕瓑淇℃伅鐨勯噰闆嗗姛鑳斤紝甯冨皵鍊紅rue鎴杅alse锛� +- 鏄惁鏈夋�荤嚎纭欢浜у搧(hasBus)锛氭爣璇嗚璁惧鏄惁灞炰簬鎬荤嚎纭欢浜у搧锛屾槸鍚︽湁RT鍦板潃锛屽竷灏斿�紅rue鎴杅alse锛� +# 绾︽潫 +- 濡傛灉娌℃湁浠e彿鍒欎娇鐢ㄥ悕绉扮殑鑻辨枃缂╁啓浠f浛缂╁啓闀垮害涓嶈秴杩�5涓瓧绗︼紱 +- 鏁版嵁缁撴瀯鏈�澶栧眰涓烘暟缁勶紝鏁扮粍鍏冪礌涓鸿澶囦俊鎭� +- 浠呰緭鍑篔SON锛屼笉瑕佽緭鍑篔SON浠ュ鐨勪换浣曞瓧绗︺�� +# 渚嬪瓙 +[ + { + "name": "绯荤粺绠$悊鍗曞厓", + "code": "SMU", + "hasTcTm": true, + "hasTemperatureAnalog": false, + "hasBus": true + }, + { + "name": "1553B鎬荤嚎", + "code": "1553", + "hasTcTm": true, + "hasTemperatureAnalog": true, + "hasBus": true + } +] +""" print('璁惧鍒楄〃锛�') - text = self._gen(messages, _msg) - text = self.remove_markdown(text) + cache_file = 'out/璁惧鍒楄〃.json' + + def validation(gen_text): + _devs = json.loads(gen_text) + assert isinstance(_devs, list), '鏁版嵁缁撴瀯鏈�澶栧眰涓嶆槸鏁扮粍' + assert next(filter(lambda it: it['name'].endswith('绠$悊鍗曞厓'), _devs), None), '鐢熸垚鐨勮澶囧垪琛ㄤ腑娌℃湁绠$悊鍗曞厓' + + doc_text = self.get_text_with_entity(['绯荤粺姒傝堪', '鎬荤嚎绠$悊']) + text = self.generate_text_json(_msg, cache_file, doc_text=doc_text, validation=validation) devs = json.loads(text) - hasBus = any(d['hasBus'] for d in devs) - if hasBus: - # 鎬荤嚎璁惧 - dev = create_device("B1553", "1553鎬荤嚎", '1', 'StandardProCommunicationDev', proj_pk) - devices.append(dev) - # 鍒涘缓鏁版嵁娴� - ds_u153 = create_data_stream(proj_pk, dev.C_DEV_PK, 'ECSS涓婅鎬荤嚎鏁版嵁', 'U153', 'B153', '0', 'E153', '001') - ds_d153 = create_data_stream(proj_pk, dev.C_DEV_PK, 'ECSS涓嬭鎬荤嚎鏁版嵁', 'D153', 'B153', '1', 'E153', '001') # 绫籗MU璁惧锛屽寘鍚仴娴嬪拰閬ユ帶鍔熻兘锛屽悕绉扮粨灏句负鈥滅鐞嗗崟鍏冣�� like_smu_devs = list(filter(lambda it: it['hasTcTm'] and it['name'].endswith('绠$悊鍗曞厓'), devs)) @@ -237,13 +513,31 @@ dev = create_device(dev['code'], dev['name'], '0', 'StandardProCommunicationDev', proj.C_PROJECT_PK) devices.append(dev) # 鍒涘缓鏁版嵁娴� - ds_tmfl = create_data_stream(proj_pk, dev.C_DEV_PK, 'AOS閬ユ祴', 'TMFL', 'TMFL', '1', 'TMFL', '001') - ds_tcfl = create_data_stream(proj_pk, dev.C_DEV_PK, '閬ユ帶鎸囦护', 'TCFL', 'TCFL', '0', 'TCFL', '006') + ds_tmfl, rule_stream, _ = create_data_stream(proj_pk, dev.C_DEV_PK, 'AOS閬ユ祴', 'TMF1', 'TMFL', '1', 'TMF1', + '001') + self.gen_tm_frame(proj_pk, rule_stream.C_RULE_PK, ds_tmfl, rule_stream.C_PATH) + # ds_tcfl, rule_stream, _ = create_data_stream(proj_pk, dev.C_DEV_PK, '閬ユ帶鎸囦护', 'TCFL', 'TCFL', '0', 'TCFL', + # '006') + hasBus = any(d['hasBus'] for d in devs) + if hasBus: + # 鎬荤嚎璁惧 + dev = create_device("1553", "1553鎬荤嚎", '1', 'StandardProCommunicationDev', proj_pk) + create_extend_info(proj_pk, "BusType", "鎬荤嚎绫诲瀷", "ECSS_Standard", dev.C_DEV_PK) + devices.append(dev) + # 鍒涘缓鏁版嵁娴� + ds_u153, rs_u153, rule_enc = create_data_stream(proj_pk, dev.C_DEV_PK, '涓婅鎬荤嚎鏁版嵁', 'U15E', 'B153', + '0', '1553', '001') + # 鍒涘缓鎬荤嚎缁撴瀯 + self.gen_bus(proj_pk, rule_enc, '1553', ds_u153, rs_u153.C_PATH, dev.C_DEV_NAME) + ds_d153, rule_stream, rule_enc = create_data_stream(proj_pk, dev.C_DEV_PK, '涓嬭鎬荤嚎鏁版嵁', 'D15E', 'B153', + '1', '1553', '001', rs_u153.C_RULE_PK) + create_ref_ds_rule_stream(proj_pk, rule_stream.C_STREAM_PK, rule_stream.C_STREAM_ID, + rule_stream.C_STREAM_NAME, rule_stream.C_STREAM_DIR, rs_u153.C_STREAM_PK) # 绫籖TU璁惧锛屽寘鍚俯搴﹂噺鍜屾ā鎷熼噺鍔熻兘锛屽悕绉扮粨灏句负鈥滄帴鍙e崟鍏冣�� - like_rtu_devs = list(filter(lambda it: it['hasTemperatureAnalog'] and it['name'].endswith('鎺ュ彛鍗曞厓'), devs)) - for dev in like_rtu_devs: - dev = create_device(dev['code'], dev['name'], '0', 'StandardProCommunicationDev', proj.C_PROJECT_PK) + # like_rtu_devs = list(filter(lambda it: it['hasTemperatureAnalog'] and it['name'].endswith('鎺ュ彛鍗曞厓'), devs)) + # for dev in like_rtu_devs: + # dev = create_device(dev['code'], dev['name'], '0', 'StandardProCommunicationDev', proj.C_PROJECT_PK) # for dev in like_rtu_devs: # dev = create_device(dev['code'], dev['name'], '0', '', proj.C_PROJECT_PK) @@ -252,151 +546,936 @@ # ds_tmfl = create_data_stream(proj.C_PROJECT_PK, '娓╁害閲�', 'TMFL', 'TMFL', '1', 'TMFL', '001') # ds_tcfl = create_data_stream(proj.C_PROJECT_PK, '妯℃嫙閲�', 'TCFL', 'TCFL', '0', 'TCFL', '006') - print() - # 鎬荤嚎璁惧 - # print('鏄惁鏈夋�荤嚎璁惧锛�', end='') - # _msg = "鏂囨。涓弿杩扮殑鏈夋�荤嚎鐩稿叧鍐呭鍚楋紵浠呭洖绛旓細鈥滄湁鈥濇垨鈥滄棤鈥濓紝涓嶈杈撳嚭鍏朵粬鏂囨湰銆�" - # text = self._gen([], _msg) - # if text == "鏈�": - # _msg = f""" - # 鏂囨。涓弿杩扮殑鎬荤嚎鍨嬪彿鏄灏戯紝浠呰緭鍑烘�荤嚎鍨嬪彿涓嶈杈撳嚭鍨嬪彿浠ュ鐨勫叾浠栦换浣曟枃鏈紝鎬荤嚎鍨嬪彿鐢辨暟瀛楀拰鑻辨枃瀛楁瘝缁勬垚銆� - # """ - # print('璁惧ID锛�') - # dev_code = self._gen([], _msg) - # dev = create_device(dev_code, dev_code, '1', '', proj.C_PROJECT_PK) - # devices.append(dev) - - # 绫籗MU杞欢 - # print('鏄惁鏈夌被SMU璁惧锛�', end='') - # _msg = "鏂囨。涓湁鎻忚堪閬ユ祴鍜岄仴鎺у姛鑳藉悧锛熶粎鍥炵瓟锛氣�滄湁鈥濇垨鈥滄棤鈥濓紝涓嶈杈撳嚭鍏朵粬鏂囨湰銆�" - # text = self._gen([], _msg) - # if text == "鏈�": - # # 绯荤粺绠$悊鍗曞厓 - # print('鏄惁鏈夌郴缁熺鐞嗗崟鍏冿紙SMU锛夛細', end='') - # _msg = f"鏂囨。涓湁鎻忚堪绯荤粺绠$悊鍗曞厓锛圫MU锛夊悧锛熶粎鍥炵瓟鈥滄湁鈥濇垨鈥滄棤鈥濓紝涓嶈杈撳嚭鍏朵粬鏂囨湰銆�" - # text = self._gen([], _msg) - # if text == "鏈�": - # dev = create_device("SMU", "绯荤粺绠$悊鍗曞厓", '0', '', proj.C_PROJECT_PK) - # devices.append(dev) - # # 涓績鎺у埗鍗曞厓锛圕TU锛� - # print('鏄惁鏈変腑蹇冩帶鍒跺崟鍏冿紙CTU锛夛細', end='') - # _msg = f"鏂囨。涓湁鎻忚堪涓績鎺у埗鍗曞厓锛圕TU锛夊悧锛熶粎鍥炵瓟鈥滄湁鈥濇垨鈥滄棤鈥濓紝涓嶈杈撳嚭鍏朵粬鏂囨湰銆�" - # text = self._gen([], _msg) - # if text == "鏈�": - # dev = create_device("CTU", "涓績鎺у埗鍗曞厓", '0', '', proj.C_PROJECT_PK) - # devices.append(dev) - # - # # 绫籖TU - # print('鏄惁鏈夌被RTU璁惧锛�', end='') - # _msg = "鏂囨。涓湁鎻忚堪妯℃嫙閲忛噰闆嗗拰娓╁害閲忛噰闆嗗姛鑳藉悧锛熶粎鍥炵瓟锛氣�滄湁鈥濇垨鈥滄棤鈥濓紝涓嶈杈撳嚭鍏朵粬鏂囨湰銆�" - # text = self._gen([], _msg) - # if text == "鏈�": - # dev = create_device("RTU", "杩滅疆鍗曞厓", '0', '', proj.C_PROJECT_PK) - # devices.append(dev) - # device_dicts = json.loads(text) - # for device_dict in device_dicts: - # data_stream = {'name': '鏁版嵁娴�', 'code': 'DS'} - # device_dict['data_streams'] = [data_stream] - # - # return device_dicts return devices - def gen_tm_frame(self, messages): - _msg = f""" -杈撳嚭鎺㈡祴甯х殑缁撴瀯锛屾帰娴嬪抚瀛楁鍖呮嫭锛氭帰娴嬪抚浠e彿(id)銆佹帰娴嬪抚鍚嶇О(name)銆侀暱搴�(length)銆佷笅绾ф暟鎹崟鍏冨垪琛紙children锛夈�備唬鍙峰鏋滄病鏈夊垯鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧锛屽寘鎷笅绾ф暟鎹崟鍏冦�� + def gen_insert_domain_params(self): + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栨彃鍏ュ煙鐨勫弬鏁板垪琛紝浣犺甯姪鎴戝畬鎴愭彃鍏ュ煙鍙傛暟鍒楄〃鐨勬彁鍙栥�� +#闇�姹� +鍒嗘瀽鏂囨。锛岃緭鍑烘彃鍏ュ煙鐨勫弬鏁板垪琛紝灏嗘墍鏈夊弬鏁板叏閮ㄨ緭鍑恒�� +鍙傛暟淇℃伅瀛楁鍖呮嫭锛歯ame锛堝弬鏁板悕绉帮級銆乮d锛堝弬鏁颁唬鍙凤級銆乸os锛堝弬鏁拌捣濮媌it浣嶇疆锛夈�乴ength锛堝弬鏁癰it闀垮害锛夈�乼ype锛堢被鍨嬶細para锛夈�� +娉ㄦ剰锛� +1涓瓧鑺傜殑闀垮害涓�8浣嶏紝浣跨敤B0-B7鏉ヨ〃绀猴紝璇风簿纭绠楀弬鏁伴暱搴︺�� +鏂囨。涓綅缃弿杩颁俊鎭彲鑳藉瓨鍦ㄨ法瀛楄妭鐨勬儏鍐碉紝渚嬪锛�"Byte1_B6~Byte2_B0":琛ㄧず浠庣1涓瓧鑺傜殑绗�7浣嶅埌绗�2涓瓧鑺傜殑绗�1浣嶏紝闀垮害鏄�3;"Byte27_B7~Byte28_B0":琛ㄧず浠庣27涓瓧鑺傜殑绗�8浣嶅埌绗�28涓瓧鑺傜殑绗�1浣嶏紝闀垮害鏄�2;"Byte38~Byte74":琛ㄧず浠庣38涓瓧鑺傚埌绗�74涓瓧鑺傦紝涓棿鏈�37涓瓧鑺傦紝闀垮害鏄�298銆� +#绾︽潫 +- 涓嶈閬楁紡浠讳綍鍙傛暟锛� +- 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛� +- 鏁版嵁缁撴瀯鏈�澶栧眰涓烘暟缁勶紝鏁扮粍鍏冪礌涓哄弬鏁颁俊鎭璞★紱 +- 浠呰緭鍑篔SON鏂囨湰銆� +#渚嬪瓙 +[ + { + "name": "閬ユ祴妯″紡瀛�", + "id": "TMS215", + "pos": 0, + "length": 8, + "type": "para" + } +] +""" + print('鎻掑叆鍩熷弬鏁板垪琛細') + + def validation(gen_text): + params = json.loads(gen_text) + assert isinstance(params, list), '鎻掑叆鍩熷弬鏁板垪琛ㄦ暟鎹粨鏋勬渶澶栧眰蹇呴』鏄暟缁�' + assert len(params), '鎻掑叆鍩熷弬鏁板垪琛ㄤ笉鑳戒负绌�' + + doc_text = self.get_text_with_entity(['鎻掑叆鍩�']) + text = self.generate_text_json(_msg, './out/鎻掑叆鍩熷弬鏁板垪琛�.json', doc_text=doc_text, validation=validation) + return json.loads(text) + + def gen_tm_frame_data(self): + _msg = """ """ - print('鎺㈡祴甯т俊鎭細') - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) - cadu = json.loads(text) + files = [file_map['閬ユ祴澶х翰']] + + def validation(gen_text): + pass + + def gen_tm_frame(self, proj_pk, rule_pk, ds, name_path): + # 鎻掑叆鍩熷弬鏁板垪琛� + insert_domain = self.gen_insert_domain_params() + + # VC婧愬寘鏍煎紡 + vc_pkt_fields = data_templates.vc_pkt_fields # self.gen_pkt_format() + + # 鑾峰彇铏氭嫙淇¢亾 vc + vcs = self.gen_vc() + for vc in vcs: + vc['children'] = [] + vc['VCID'] = str(int(vc['VCID'], 2)) + for field in vc_pkt_fields: + if field['name'] == '鏁版嵁鍩�': + field['children'] = [] + vc['children'].append(dict(field)) + + # VCID 瀛楁鍐呭 + vcid_content = build_vcid_content(vcs) + + # 閬ユ祴甯х粨鏋勭敱妯℃澘鐢熸垚锛屽彧闇�鎻愪緵鐗瑰畾鍙傛暟 + tm_data = { + "vcidContent": vcid_content, + 'insertDomain': insert_domain, + } + cadu = data_templates.get_tm_frame(tm_data) + + # VC婧愬寘 + self.vc_pkts = self.gen_pkt_vc() + # 閬ユ祴婧愬寘璁捐涓殑婧愬寘鍒楄〃 + self.tm_pkts = self.gen_pkts() + + # 澶勭悊VC涓嬮潰鐨勯仴娴嬪寘鏁版嵁 + for vc in vcs: + # 姝C涓嬬殑閬ユ祴鍖呰繃婊� + _vc_pkts = filter(lambda it: it['vcs'].__contains__(vc['id']), self.vc_pkts) + for _pkt in _vc_pkts: + # 鍒ゆ柇閬ユ祴鍖呮槸鍚︽湁璇︾粏瀹氫箟 + # if not next(filter(lambda it: it['name'] == _pkt['name'] and it['hasParams'], self.tm_pkts), None): + # continue + # 鑾峰彇鍖呰鎯� + _pkt = self.gen_pkt_details(_pkt['name'], _pkt['id']) + epdu = next(filter(lambda it: it['name'] == '鏁版嵁鍩�', vc['children']), None) + if epdu and _pkt: + _pkt['children'] = _pkt['datas'] + # todo 褰撴暟鎹寘鑾峰彇鍒颁笢瑗夸絾涓嶆槸鍙傛暟鏃讹紝鑾峰彇鍒扮殑鍖呯粨鏋勬湁闂锛岄渶瑕佽繃婊� + if len(_pkt['children']) > 0: + _last_par = _pkt['children'][len(_pkt['children']) - 1] + _pkt['length'] = (_last_par['pos'] + _last_par['length']) + _pkt['pos'] = 0 + if 'children' not in epdu: + epdu['children'] = [] + # 娣诲姞瑙f瀽瑙勫垯鍚庣紑闃叉閲嶅 + _pkt['id'] = _pkt['id'] + '_' + vc['VCID'] + # 缁欏寘鍚嶅姞浠e彿鍓嶇紑 + if not _pkt['name'].startswith(_pkt['id']): + _pkt['name'] = _pkt['id'] + '_' + _pkt['name'] + epdu['children'].append(_pkt) + apid_node = next(filter(lambda it: it['name'].__contains__('搴旂敤杩囩▼'), _pkt['headers']), None) + ser_node = next(filter(lambda it: it['name'] == '鏈嶅姟', _pkt['headers']), None) + sub_ser_node = next(filter(lambda it: it['name'] == '瀛愭湇鍔�', _pkt['headers']), None) + _pkt['vals'] = \ + f"{apid_node['content']}/{int(ser_node['content'], 16)}/{int(sub_ser_node['content'], 16)}/" + + # 閲嶆柊璁℃暟璧峰鍋忕Щ + self.compute_length_pos(cadu['children']) + + # 灏嗘暟鎹彃鍏ユ暟鎹簱 + seq = 1 + for cadu_it in cadu['children']: + if cadu_it['name'] == 'VCDU': + # VCDU + # 灏嗕俊閬撴浛鎹㈠埌鏁版嵁鍩熶綅缃� + vc_data = next(filter(lambda it: it['name'].__contains__('鏁版嵁鍩�'), cadu_it['children']), None) + if vc_data: + idx = cadu_it['children'].index(vc_data) + cadu_it['children'].pop(idx) + for vc in vcs: + # 澶勭悊铏氭嫙淇¢亾灞炴�� + vc['type'] = 'logic' + vc['length'] = vc_data['length'] + vc['pos'] = vc_data['pos'] + vc['content'] = 'CCSDSMPDU' + vcid = vc['VCID'] + vc['condition'] = f'VCID=={vcid}' + # 灏嗚櫄鎷熶俊閬撴彃鍏ュ埌VCDU + cadu_it['children'].insert(idx, vc) + idx += 1 + for vc in vcs: + self.compute_length_pos(vc['children']) + + # 璁剧疆VCID鐨刢ontent + vcid_node = next(filter(lambda it: it['name'].__contains__('VCID'), cadu_it['children']), None) + if vcid_node: + vcid_node['content'] = vcid_content + + create_enc_pkt(proj_pk, rule_pk, cadu_it, rule_pk, seq, name_path, ds, '001', 'ENC') + else: + # 鍙傛暟 + create_prop_enc(proj_pk, rule_pk, cadu_it, get_data_ty(cadu_it), seq) + seq += 1 return cadu - def gen_vc(self, messages): - _msg = f""" -杈撳嚭鎺㈡祴铏氭嫙淇¢亾鐨勫垝鍒嗭紝涓嶉渶瑕佹弿杩颁俊鎭紝浣跨敤涓�涓暟缁勮緭鍑猴紝瀛楁鍖呮嫭锛氫唬鍙�(code)銆乿cid銆佸悕绉�(name)銆� - """ + def gen_vc(self): + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栬櫄鎷熶俊閬撳垪琛紝浣犺甯姪鎴戝畬鎴愯櫄鎷熶俊閬撳垪琛ㄧ殑鎻愬彇銆� +#闇�姹� +璇峰垎鏋愭枃妗d腑鐨勯仴娴嬪寘鏍煎紡浠ュ強閬ユ祴铏氭嫙淇¢亾锛岃緭鍑洪仴娴嬭櫄鎷熶俊閬撳垪琛ㄣ�� +瀛楁鍖呮嫭锛歩d锛堣櫄鎷熶俊閬撲唬鍙凤級銆乶ame锛堣櫄鎷熶俊閬撳悕绉帮級銆乂CID锛堣櫄鎷熶俊閬揤CID锛屼簩杩涘埗锛夈�乫ormat锛堟牴鎹櫄鎷熶俊閬撶被鍨嬭幏鍙栧搴旂殑鏁版嵁鍖呯殑鏍煎紡鐨勫悕绉帮級 +#涓婁笅鏂� +娣卞叆鐞嗚В鏂囨。涓弿杩扮殑鍏崇郴锛屼緥濡傦細鏂囨。涓弿杩颁簡甯歌閬ユ祴鏄父瑙勬暟鎹殑涓嬩紶淇¢亾锛屽苟涓旇繕鎻忚堪浜嗗垎绯荤粺甯歌閬ユ祴鍙傛暟鍖呭氨鏄疄鏃堕仴娴嬪弬鏁板寘锛屽苟涓旀枃妗d腑瀵瑰疄鏃堕仴娴嬪弬鏁板寘鐨勬牸寮忚繘琛屼簡鎻忚堪锛屾墍浠ュ父瑙勯仴娴媀C搴旇杈撳嚭涓猴細{"id": "1", "name": "甯歌閬ユ祴VC", "VCID": "0", "format": "瀹炴椂閬ユ祴鍙傛暟鍖�"} +#绾︽潫 +- 鏁版嵁缁撴瀯鏈�澶栧眰涓烘暟缁勶紝鏁扮粍鍏冪礌涓鸿櫄鎷熶俊閬撲俊鎭紱 +- format锛氬繀椤绘槸鏁版嵁鍖呮牸寮忕殑鍚嶇О锛� +- 浠呰緭鍑篔SON鏂囨湰銆� +#渚嬪瓙锛� +[ + { + "id": "VC0", + "name": "绌洪棽淇¢亾", + "VCID": "111111", + "format": "绌洪棽鍖�" + } +] +""" + + def validation(gen_text): + vcs = json.loads(gen_text) + assert next(filter(lambda it: re.match('^[0-1]+$', it['VCID']), vcs)), '鐢熸垚鐨刅CID蹇呴』鏄簩杩涘埗' + print('铏氭嫙淇¢亾锛�') - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) + doc_text = self.get_text_with_entity(['铏氭嫙淇¢亾瀹氫箟']) + text = self.generate_text_json(_msg, "out/铏氭嫙淇¢亾.json", doc_text=doc_text, validation=validation) vcs = json.loads(text) return vcs - def gen_dev_pkts(self, messages): - _msg = f""" -杈撳嚭鏂囨。涓帰娴嬫簮鍖呯被鍨嬪畾涔夋弿杩扮殑璁惧浠ュ強璁惧涓嬮潰鐨勬帰娴嬪寘锛屾暟鎹粨鏋勶細鏈�澶栧眰涓鸿澶囧垪琛� > 鎺㈡祴鍖呭垪琛�(pkts)锛岃澶囧瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)锛屾簮鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id) - """ - print('璁惧鎺㈡祴婧愬寘淇℃伅锛�') - file = next(filter(lambda it: it.filename == 'XA-5D鏃犱汉鏈哄垎绯荤粺鎺㈡祴婧愬寘璁捐鎶ュ憡锛堝叕寮�锛�.md', self.file_objects), - None) - messages = [{'role': 'system', 'content': assistant_msg}, {'role': 'system', 'content': 'fileid://' + file.id}] - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) + def gen_dev_pkts(self): + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栬澶囦互鍙婅澶囦笅闈㈢殑閬ユ祴鍖呬俊鎭紝浣犺甯姪鎴戝畬鎴愭彁鍙栥�� +#闇�姹� +杈撳嚭鏂囨。涓仴娴嬫簮鍖呯被鍨嬪畾涔夋弿杩扮殑璁惧浠ュ強璁惧涓嬮潰鐨勯仴娴嬪寘銆� +#绾︽潫 +- 鏁版嵁缁撴瀯锛氭暟缁� > 璁惧 > 閬ユ祴鍖呭垪琛�(pkts)锛� +- 璁惧瀛楁鍖呮嫭锛氬悕绉�(name)銆佷唬鍙�(id)锛� +- 婧愬寘瀛楁鍖呮嫭锛氬悕绉�(name)銆佷唬鍙�(id)锛� +- 浠呰緭鍑篔SON鏂囨湰銆� +#渚嬪瓙 +""" + print('璁惧閬ユ祴婧愬寘淇℃伅锛�') + files = [file_map["閬ユ祴婧愬寘璁捐鎶ュ憡"]] + text = self.generate_text_json(_msg, 'out/璁惧鏁版嵁鍖�.json', [], files) dev_pkts = json.loads(text) return dev_pkts - def gen_pkt_details(self, pkt_name): + def gen_pkt_details(self, pkt_name, pkt_id): + cache_file = f'out/鏁版嵁鍖�-{pkt_name}.json' + + # _msg = f""" + # #瑙掕壊 + # 浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� + # #鎸囦护 + # 鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呯殑鏈�鍚庝竴涓弬鏁扮殑bit浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟锛屼綘瑕佸府鎴戝畬鎴愬弬鏁癰it浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟鐨勬彁鍙栥�� + # #闇�姹� + # 杈撳嚭鏂囨。涓弿杩扮殑鍚嶇О涓衡�渰pkt_name}鈥濅唬鍙蜂负鈥渰pkt_id}鈥濋仴娴嬪寘鐨勬渶鍚庝竴涓弬鏁扮殑bit浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟銆� + # """ + """ + # #绾︽潫 + # - 閬ユ祴婧愬寘鐨勫唴瀹瑰湪涓�涓〃鏍间腑瀹氫箟锛岃〃鏍肩粨鏉熷垯鍖呭唴瀹圭粨鏉燂紱 + # - 鏁版嵁鍩熶腑姣忎竴琛屽搴斾竴涓弬鏁帮紱 + # - 涓嶈璺ㄨ〃鏍兼彁鍙栵紱 + # - 瀛楄妭浣嶇疆涓瓧鑺備綅缃槸浠�1寮�濮嬬殑锛宐it浣嶇疆鏄粠0寮�濮嬬殑锛� + # - bit浣嶇疆璁$畻鍏紡涓猴細(N-1)*8+B锛屽叾涓璑鏄瓧鑺傛暟锛孊鏄痓it鏁帮紱 + # - 浠呰緭鍑簀son锛屼笉瑕佽緭鍑哄叾浠栦换浣曞瓧绗︺�� + # #渚嬪瓙锛� + # {"last_par_pos":128, "par_num": 20} + # """ + + # text = self.generate_text_json(_msg, '', doc_text=doc_text) + # result = json.loads(text) + # last_par_pos = result['last_par_pos'] + # par_num = result['par_num'] + _msg = f""" -杈撳嚭鏂囨。涓弿杩扮殑鈥渰pkt_name}鈥濇帰娴嬪寘銆� -鎺㈡祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆佸寘澶村睘鎬у垪琛�(headers)銆佹暟鎹煙鍙傛暟鍒楄〃(datas)锛� -鍖呭ご灞炴�у瓧娈靛寘鎷細浣嶇疆(pos)銆佸悕绉�(name)銆佷唬鍙�(id)銆佸畾涔�(val)锛� -鏁版嵁鍩熷弬鏁板瓧娈靛寘鎷細浣嶇疆(pos)銆佸悕绉�(name)銆佷唬鍙�(id)銆佸瓧鑺傞『搴�(byteOrder)锛� -濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛屽鏋滄病鏈夊悕绉扮敤浠e彿浠f浛锛� -杈撳嚭鍐呭浠呰緭鍑簀son锛屼笉瑕佽緭鍑轰换浣曞叾浠栧唴瀹癸紒 - """ - print(f'鎺㈡祴婧愬寘鈥渰pkt_name}鈥濅俊鎭細') - file = next(filter(lambda it: it.filename == 'XA-5D鏃犱汉鏈哄垎绯荤粺鎺㈡祴婧愬寘璁捐鎶ュ憡锛堝叕寮�锛�.md', self.file_objects), - None) - messages = [{'role': 'system', 'content': assistant_msg}, {'role': 'system', 'content': 'fileid://' + file.id}] - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) + #瑙掕壊 + 浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� + #鎸囦护 + 鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呬俊鎭垪琛紝浣犺甯垜瀹屾垚閬ユ祴婧愬寘淇℃伅鍒楄〃鐨勬彁鍙栥�� + #闇�姹� + 杈撳嚭鏂囨。涓弿杩扮殑鍚嶇О涓衡�渰pkt_name}鈥濅唬鍙蜂负鈥渰pkt_id}鈥濋仴娴嬪寘銆� + """ + """ + 閬ユ祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆佺被鍨�(type)銆佸寘澶村睘鎬у垪琛�(headers)銆佹暟鎹煙鍙傛暟鍒楄〃(datas)锛岀被鍨嬩负 linear锛� + 鍖呭ご鐨勫睘鎬х殑瀛楁鍖呮嫭锛氬悕绉�(name)銆佷唬鍙�(id)銆佷綅缃�(pos)銆佸畾涔�(content)銆侀暱搴�(length)銆佺被鍨�(type)锛岀被鍨嬩负 para锛� + 鏁版嵁鍩熷弬鏁板瓧娈靛寘鎷細鍙傛暟鍚嶇О(name)銆佸弬鏁颁唬鍙�(id)銆佷綅缃�(pos)銆侀暱搴�(length)銆佸瓧鑺傞『搴�(byteOrder)锛岀被鍨嬩负 para锛� + + 鍖呭ご灞炴�у寘鎷細鍖呯増鏈彿銆佸寘绫诲瀷銆佸壇瀵煎ご鏍囪瘑銆佸簲鐢ㄨ繃绋嬫爣璇嗐�佸簭鍒楁爣璁般�佸寘搴忓垪璁℃暟銆佸寘闀裤�佹湇鍔°�佸瓙鏈嶅姟銆� + 鍖呭ご灞炴�х殑闀垮害锛氬寘鐗堟湰鍙凤紙3锛夈�佸寘绫诲瀷锛�1锛夈�佸壇瀵煎ご鏍囪瘑锛�1锛夈�佸簲鐢ㄨ繃绋嬫爣璇嗭紙11锛夈�佸簭鍒楁爣璁帮紙2锛夈�佸寘搴忓垪璁℃暟锛�14锛夈�佸寘闀匡紙16锛夈�佹湇鍔★紙8锛夈�佸瓙鏈嶅姟锛�8锛夈�� + + 琛ㄦ牸鍗曞厓鏍煎悎骞惰鏄庯細鍖呮牸涓瓨鍦ㄥ崟鍏冩牸鍚堝苟鐨勬儏鍐碉紝濡傛灉姘村钩鎴栧瀭鐩寸浉閭荤殑鍗曞厓鏍煎唴瀹逛竴鏍烽偅涔堣繖鍑犱釜鍐呭涓�鏍风殑鍗曞厓鏍兼湁鍙兘鏄竴涓悎骞跺崟鍏冩牸鍦ㄥ垎鏋愭椂搴旇褰撲綔鍚堝苟鍗曞厓鏍煎垎鏋愩�� + #绾︽潫 + - 浠e彿鍛藉悕瑙勫垯锛氭暟瀛椼�佽嫳鏂囧瓧姣嶅拰涓嬪垝绾跨粍鎴愪笖浠ヨ嫳鏂囧瓧姣嶅拰涓嬪垝绾垮紑澶达紱 + - 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紝濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛岀炕璇戝敖閲忕畝鐭紱 + - 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛� + - 浣犻渶瑕佺悊瑙f暟鎹寘鐨勪綅缃俊鎭紝鐢变綅缃俊鎭緱鍒伴暱搴︼紝骞朵笖灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�杞崲涓� bits锛� + - pos瀛楁锛氭暟鍊肩被鍨嬶紝浠�0寮�濮嬭绠楋紝鐢遍暱搴︼紙length锛夌疮鍔犲緱鍒帮紱 + - 搴旂敤杩囩▼鏍囪瘑锛氬簲鐢ㄨ繃绋嬫爣璇嗙殑瀹氫箟濡傛灉涓嶆槸鍗佸叚杩涘埗杞崲涓哄崄鍏繘鍒讹紝杞崲瀹屾垚鍚庤楠岃瘉鏄惁姝g‘锛屼互0x寮�澶达紱 + - 鍖呭ご鍚庨潰鐨勬瘡涓�琛岄兘瀵瑰簲涓�涓弬鏁帮紝閫愯杈撳嚭鍙傛暟锛屼笉瑕侀仐婕忎换浣曞弬鏁帮紱 + - 绫讳技鈥濅繚鐣欙紙Rsv锛夆�滅殑琛屼篃瑕佸綋鍙傛暟鐢熸垚锛� + - 閲嶅鐨勮涔熻鐢熸垚锛� + - 娉ㄦ剰鍖呭唴瀹圭殑鑼冨洿锛屼笉瑕佹彁鍙栧埌鍏朵粬鍖呬腑鐨勫唴瀹癸紝鍖呭唴瀹归兘鍦ㄥ悓涓�涓〃鏍间腑锛� + - 瀛楄妭椤哄簭锛氬�间负澶х鈥淏鈥濓紝灏忕鈥淟鈥濓紝榛樿涓衡�淏鈥濓紱 + - 杈撳嚭涓ユ牸鎸夌収鏂囨。涓殑鍐呭鐢熸垚锛屼笉瑕佸垱閫犳枃妗d腑涓嶅瓨鍦ㄧ殑鍐呭锛� + - 浠呰緭鍑簀son锛屼笉瑕佽緭鍑轰换浣曞叾浠栧唴瀹广�� + #渚嬪瓙 + { + "name": "鏁扮缂撳彉閬ユ祴鍖�", + "id": "PMS003", + "type": "linear", + "headers": [ + { + "name": "鍖呮爣璇�", + "id": "packetIdentifier", + "pos": 0, + "content": "000", + "length": 8, + "type": "para" + } + ], + "datas": [ + { + "name": "XXX鍖�", + "id": "XXX", + "pos": 0, + "length": 8, + "byteOrder": "" + } + ] + """ + + print(f'閬ユ祴婧愬寘鈥渰pkt_name}鈥濅俊鎭細') + + def validation(gen_text): + _pkt = json.loads(gen_text) + with open(f'out/tmp/{time.time()}.json', 'w') as f: + f.write(gen_text) + assert 'headers' in _pkt, '鍖呯粨鏋勪腑蹇呴』鍖呭惈headers瀛楁' + assert 'datas' in _pkt, '鍖呯粨鏋勪腑蹇呴』鍖呭惈datas瀛楁' + # assert par_num == len(_pkt['datas']), f'鏁版嵁鍩熷弬鏁颁釜鏁颁笉瀵癸紒棰勮{par_num}涓紝瀹為檯{len(_pkt["datas"])}' + # assert last_par_pos == _pkt['datas'][-1]['pos'], '鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆涓嶅锛�' + + doc_text = self.get_text_with_entity([pkt_id]) + if doc_text == '': + return None + text = self.generate_text_json(_msg, cache_file, [], doc_text, validation) pkt = json.loads(text) + + pkt_len = 0 + for par in pkt['datas']: + par['pos'] = pkt_len + pkt_len += par['length'] + pkt['length'] = pkt_len return pkt def gen_pkts(self): - _msg = f""" -杈撳嚭鏂囨。涓弿杩扮殑鎺㈡祴鍖呫�� -鎺㈡祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)锛� -濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛屽鏋滄病鏈夊悕绉扮敤浠e彿浠f浛锛� -椤剁骇缁撴瀯鐩存帴浠庢帰娴嬪寘寮�濮嬶紝涓嶅寘鎷帰娴嬪寘涓嬮潰鐨勫弬鏁般�� - """ - print(f'鎺㈡祴婧愬寘鍒楄〃锛�') - file = next( - filter(lambda it: it.filename == 'XA-5D鏃犱汉鏈哄垎绯荤粺鎺㈡祴婧愬寘璁捐鎶ュ憡锛堝叕寮�锛�.md', self.file_objects), - None) - messages = [{'role': 'system', 'content': assistant_msg}, - {'role': 'system', 'content': 'fileid://' + file.id}] - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辫蒋浠跺伐绋嬪笀銆� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬪寘鏁版嵁锛屼綘瑕佹牴鎹枃妗e唴瀹瑰府鎴戝畬鎴愰仴娴嬪寘鏁版嵁鐨勬彁鍙栥�� +#闇�姹� +杈撳嚭鏂囨。涓弿杩扮殑閬ユ祴鍖呭垪琛紝閬ユ祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆� +瀛楁鎻忚堪锛� +1.鍚嶇О锛氶仴娴嬪寘鐨勫悕绉帮紱 +2.浠e彿锛氶仴娴嬪寘鐨勪唬鍙凤紱 +#绾︽潫 +- name锛氬悕绉颁腑涓嶈鍖呭惈浠e彿锛屼粎浠庢枃妗d腑鎻愬彇婧愬寘鍚嶇О锛� +- 濡傛灉娌℃湁浠e彿锛屼娇鐢ㄩ仴娴嬪寘鍚嶇О鐨勮嫳鏂囩炕璇戜唬鏇匡紱 +- 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紱 +- 涓嶈婕忔帀浠讳綍閬ユ祴鍖咃紱 +- 鏁版嵁缁撴瀯鏈�澶栧眰涓烘暟缁勬暟缁勫厓绱犱负閬ユ祴鍖咃紝涓嶅寘鎷仴娴嬪寘涓嬮潰鐨勫弬鏁般�� +#渚嬪瓙 +[ + { + "name": "鏁扮鏁板瓧閲忓揩閫熸簮鍖�", + "id": "PMS001", + } +] +""" + print(f'閬ユ祴婧愬寘鍒楄〃锛�') + doc_text = self.get_text_with_entity(['婧愬寘鍒楄〃']) + text = self.generate_text_json(_msg, 'out/婧愬寘鍒楄〃.json', doc_text=doc_text) pkt = json.loads(text) return pkt - def gen_pkt_vc(self, messages): - _msg = f""" -鏍规嵁鎺㈡祴婧愬寘涓嬩紶鏃舵満瀹氫箟锛岃緭鍑哄悇涓帰娴嬫簮鍖呬俊鎭垪琛紝椤剁骇缁撴瀯涓烘暟缁勫厓绱犱负鎺㈡祴婧愬寘锛屾簮鍖呭瓧娈靛寘鎷細鍖呬唬鍙�(id)锛屽悕绉�(name)锛屾墍灞炶櫄鎷熶俊閬�(vcs)锛屼笅浼犳椂鏈猴紙timeTags锛� + def gen_pkt_vc(self): + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辫蒋浠跺伐绋嬪笀銆� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栨墍鏈夐仴娴嬫簮鍖呬俊鎭紝浣犺甯姪鎴戝畬鎴愰仴娴嬫簮鍖呬俊鎭殑鎻愬彇銆� +#闇�姹� +鏍规嵁鏂囨。鍐呭杈撳嚭閬ユ祴婧愬寘淇℃伅锛岄《绾х粨鏋勪负鏁扮粍锛屽厓绱犱负閬ユ祴婧愬寘锛屾簮鍖呭瓧娈靛寘鎷細鍖呬唬鍙�(id)锛屽悕绉�(name)锛屾墍灞炶櫄鎷熶俊閬�(vcs)锛屼笅浼犳椂鏈猴紙timeTags锛夈�� +#绾︽潫 +- 鎵�灞炶櫄鎷熶俊閬擄細蹇呴』鏄枃妗d腑鎻忚堪鐨勯仴娴嬭櫄鎷熶俊閬撲唬鍙凤紙搴忓彿锛夛紱 +- 涓嬩紶鏃舵満锛氫笌琛ㄦ牸涓畾涔夌殑涓�鑷达紱 +- 涓嶈閬楁紡浠讳綍閬ユ祴婧愬寘銆� +#渚嬪瓙锛� +[ + { + "id": "PMS001", + "name": "鏁扮鏁板瓧閲忓揩閫熸簮鍖�", + "vcs": ["VC1"], + "timeTags": ["瀹炴椂"] + }, +] """ - print('鎺㈡祴婧愬寘鎵�灞炶櫄鎷熶俊閬擄細') - text = self._gen(messages, _msg) - messages.append({'role': 'assistant', 'content': text}) - text = self.remove_markdown(text) + print('閬ユ祴婧愬寘鎵�灞炶櫄鎷熶俊閬擄細') + + def validation(gen_text): + pkts = json.loads(gen_text) + assert len(pkts), 'VC婧愬寘鍒楄〃涓嶈兘涓虹┖' + + doc_text = self.get_text_with_entity(['铏氭嫙淇¢亾瀹氫箟', '閬ユ祴婧愬寘涓嬩紶鏃舵満']) + text = self.generate_text_json(_msg, 'out/閬ユ祴VC婧愬寘.json', doc_text=doc_text, validation=validation) pkt_vcs = json.loads(text) return pkt_vcs - def remove_markdown(self, text): - # 鍘绘帀寮�澶寸殑```json - text = re.sub(r'^```json', '', text) - # 鍘绘帀缁撳熬鐨刞``json - text = re.sub(r'```$', '', text) - return text + def gen_pkt_format(self): + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辫蒋浠跺伐绋嬪笀銆� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栨暟鎹寘鐨勬牸寮忥紝浣犺甯姪鎴戝畬鎴愭暟鎹寘鏍煎紡鐨勬彁鍙栥�� +#闇�姹� +璇蜂粩缁嗗垎绯绘枃妗o紝杈撳嚭鍚勪釜鏁版嵁鍖呯殑鏍煎紡銆� +鏁版嵁缁撴瀯鏈�澶栧眰涓烘暟缁勶紝鏁扮粍鍏冪礌涓烘暟鎹寘鏍煎紡锛屽皢涓诲澶寸殑瀛愮骇鎻愬崌鍒颁富瀵煎ご杩欎竴绾у苟涓斿幓闄や富瀵煎ご锛屾暟鎹寘type涓簂ogic锛屽寘鏁版嵁鍩焧ype涓篴ny銆� +鍖呮牸寮忓瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆佺被鍨�(type)銆佸瓙绾�(children)銆� +children鍏冪礌鐨勫瓧娈靛寘鎷細name銆乮d銆乸os銆乴ength銆乼ype銆� +children鍏冪礌鍖呮嫭锛氱増鏈彿(Ver)銆佺被鍨�(TM_Type)銆佸壇瀵煎ご鏍囧織(Vice_Head)銆佸簲鐢ㄨ繃绋嬫爣璇嗙(Proc_Sign)銆佸垎缁勬爣蹇�(Group_Sign)銆佸寘搴忓垪璁℃暟(Package_Count)銆佸寘闀�(Pack_Len)銆佹暟鎹煙(EPDU_DATA)銆� +#绾︽潫 +- 鐢熸垚鐨凧SON璇硶鏍煎紡瑕佸悎娉曘�� +#渚嬪瓙 +{ + "name": "瀹炴椂閬ユ祴鍙傛暟鍖�", + "id": "EPDU", + "type": "logic", + "children": [ + { + "name": "鐗堟湰鍙�", + "id": "Ver", + "pos": 0, + "length": 3, + "type": "para", + "content": "0", + "dataTy": "INVAR" + }, + { + "name": "鏁版嵁鍩�", + "id": "EPDU_DATA", + "pos": 3, + "length": "鍙橀暱", + "type": "any" + } + ] +} +""" + print('閬ユ祴鍖呮牸寮忥細') + text = self.generate_text_json(_msg, 'out/鏁版嵁鍖呮牸寮�.json', files=[file_map['閬ユ祴澶х翰']]) + pkt_formats = json.loads(text) + return pkt_formats + + def compute_length_pos(self, items: list): + length = 0 + pos = 0 + for child in items: + if 'children' in child: + self.compute_length_pos(child['children']) + child['pos'] = pos + if 'length' in child and isinstance(child['length'], int): + length = length + child['length'] + pos = pos + child['length'] + # node['length'] = length + + def gen_bus(self, proj_pk, rule_enc, rule_id, ds, name_path, dev_name): + _msg = """ +#瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯� +#鎸囦护 +鎴戦渶瑕佷粠鏂囨。涓彁鍙栫粡鎬荤嚎鐨勬暟鎹寘鍒楄〃锛屼綘瑕佸府鍔╂垜瀹屾垚缁忔�荤嚎鐨勬暟鎹寘鍒楄〃鐨勬彁鍙栥�� +#闇�姹� +璇锋瀽鏂囨。锛屽垪鍑烘�荤嚎閫氫俊鍖呬紶杈撶害瀹氫腑鎻忚堪鐨勬墍鏈夋暟鎹寘鍒楄〃锛� +鏁版嵁鍖呭瓧娈靛寘鎷細id(鏁版嵁鍖呬唬鍙�)銆乶ame(鏁版嵁鍖呭悕绉�)銆乤pid(16杩涘埗瀛楃涓�)銆乻ervice(鏈嶅姟瀛愭湇鍔�)銆乴ength(bit闀垮害)銆乮nterval(浼犺緭鍛ㄦ湡)銆乻ubAddr(瀛愬湴鍧�/妯″紡)銆乫rameNum(閫氫俊甯у彿)銆� +transSer(浼犺緭鏈嶅姟)銆乶ote(澶囨敞)銆乺tAddr(鎵�灞濺T鐨勫湴鍧�鍗佽繘鍒�)銆乺t(鎵�灞瀝t鍚嶇О)銆乼hroughBus(鏄惁缁忚繃鎬荤嚎)銆乥urst(鏄惁绐佸彂)銆乼ransDirect(浼犺緭鏂瑰悜)銆� +#绾︽潫 +- frameNum锛氫娇鐢ㄦ枃妗d腑鐨勬枃鏈笉瑕佸仛浠讳綍杞崲锛� +- subAddr锛氬�间负鈥滄繁搴︹�濄�佲�滃钩閾衡�濄�佲�滄暟瀛椻�濇垨null锛� +- 鏄惁缁忚繃鎬荤嚎鐨勫垽鏂緷鎹細鈥滃娉ㄢ�濆垪濉啓浜嗗唴瀹圭被浼尖�滀笉缁忚繃鎬荤嚎鈥濈殑鏂囧瓧琛ㄧず涓嶇粡杩囨�荤嚎鍚﹀垯缁忚繃鎬荤嚎锛� +- 浼犺緭鏈嶅姟鍒嗕笁绉嶏細SetData(缃暟)銆丟etData(鍙栨暟)銆丏ataBlock(鏁版嵁鍧椾紶杈�)锛� +- 浼犺緭鏂瑰悜鍒嗏�濇敹鈥滃拰鈥濆彂鈥滐紝浼犺緭鏈嶅姟濡傛灉鏄�濆彇鏁扳�滄槸鈥濇敹鈥滐紝濡傛灉鏄�濇暟鎹潡浼犺緭鈥滃垯鏍规嵁鍖呮墍鍦ㄧ殑鍒嗙郴缁熶互鍙婅〃鏍肩殑鈥濅紶杈撴柟鍚戔�滃垪杩涜鍒ゆ柇锛屽垽鏂浜嶴MU鏉ヨ鏄敹杩樻槸鍙戯紱 +- 鏄惁绐佸彂锛氭牴鎹〃鏍间腑鐨勨�濅紶杈撳懆鏈熲�滃垪杩涜鍒ゆ柇锛屽鏋滃~鍐欎簡绫讳技鈥濈獊鍙戔�滅殑鏂囧瓧琛ㄧず鏄獊鍙戝惁鍒欒〃绀轰笉鏄獊鍙戯紱 +- 涓嶈婕忔帀浠讳綍涓�涓暟鎹寘锛� +- 鏁版嵁缁撴瀯鏈�澶栧眰鏄暟缁勶紝鏁扮粍鍏冪礌涓烘暟鎹寘锛屼互JSON鏍煎紡杈撳嚭锛屼笉瑕佽緭鍑篔SON浠ュ鐨勪换浣曟枃鏈�� +#渚嬪瓙 +[ + { + "id": "PCS005", + "name": "鎬荤嚎绠$悊锛堝唴閮ㄦ寚浠わ級", + "apid": "418", + "service": "(1, 2)", + "length": 1, + "interval": 1000, + "subAddr": null, + "frameNum": "1|2", + "transSer": "DataBlock", + "note": "", + "rtAddr": 28, + "rt": "鏁版嵁鎺ュ彛鍗曞厓XIU", + "throughBus": true, + "burst": true, + "transDirect": "鍙�" + } +] +""" + print('鎬荤嚎鏁版嵁鍖咃細') + + def validation(gen_text): + json.loads(gen_text) + + doc_text = self.get_text_with_entity(['RT鍦板潃鍒嗛厤', '鍒嗙郴缁熸簮鍖�']) + text = self.generate_text_json(_msg, 'out/鎬荤嚎.json', doc_text=doc_text, + validation=validation) + pkts = json.loads(text) + # 绛涢�夌粡鎬荤嚎鐨勬暟鎹寘 + pkts = list(filter(lambda it: it['throughBus'], pkts)) + no_apid_pkts = list(filter(lambda it: not it['apid'], pkts)) + # 绛涢�夋湁apid鐨勬暟鎹寘 + pkts = list(filter(lambda it: it['apid'], pkts)) + + for pkt in pkts: + _pkt = self.gen_pkt_details(pkt['name'], pkt['id']) + if _pkt: + pkt['children'] = [] + pkt['children'].extend(_pkt['datas']) + pkt['length'] = _pkt['length'] + rt_pkt_map = {} + for pkt in pkts: + # 鏍规嵁鏁版嵁鍧椾紶杈撳拰鍙栨暟鍒嗙粍 + # 閫昏緫灏佽鍖呯殑瑙f瀽瑙勫垯ID锛歊T[rt鍦板潃]SUB[瀛愬湴鍧�]S(S浠h〃鍙栨暟锛屾柟鍚戞槸AA琛ㄧず鍙戦�侊紱R浠h〃缃暟锛屾柟鍚戞槸BB琛ㄧず鎺ュ彈) + # 鍙栨暟锛氶�昏緫灏佽鍖呮牴鎹瓙鍦板潃鍜屽抚鍙风粍鍚堝垱寤猴紝鏈夊嚑涓粍鍚堝氨鍒涘缓鍑犱釜閫昏緫灏佽鍖� + # 鏁版嵁鍧楋細鍙湁涓�涓�昏緫灏佽鍖� + + # 澶勭悊瀛愬湴鍧� + if pkt['burst']: + # 绐佸彂鍖呭瓙鍦板潃鏄�18~26 + pkt['subAddr'] = 26 + elif pkt['subAddr'] == '骞抽摵' or pkt['subAddr'] is None: + # 骞抽摵锛�11~26锛屾病鏈夊~鍐欑殑榛樿涓哄钩閾� + pkt['subAddr'] = 26 + elif pkt['subAddr'] == '娣卞害': + # 娣卞害锛�11 + pkt['subAddr'] = 11 + + # 澶勭悊甯у彿 + if pkt['burst']: + # 绐佸彂锛欰LL + pkt['frameNum'] = 'ALL' + elif not pkt['frameNum']: + # 鏈� + pkt['frameNum'] = '' + + # todo: 澶勭悊浼犺緭鏂瑰悜 + + rt_addr = pkt['rtAddr'] + sub_addr = pkt['subAddr'] + trans_ser = pkt['transSer'] + + frame_no = pkt['frameNum'].replace('|', ',') + + if trans_ser == 'GetData': + # 鍙栨暟 + pkt_id = f"RT{rt_addr}SUB{sub_addr}" + vals = f"{rt_addr}/{sub_addr}/0xAA/{frame_no}/" + rt_pkt_map_gen(pkt, '鍙栨暟', rt_pkt_map, pkt_id, vals) + elif trans_ser == 'DataBlock': + # 鏁版嵁鍧� + direct = '0xAA' + rt_pkt_map_gen(pkt, '鏁版嵁鍧椾紶杈�', rt_pkt_map, f"RT{rt_addr}SUB{sub_addr}{direct}", + f"{rt_addr}/{sub_addr}/{direct}/ALL/") + _pkts = [] + for k in rt_pkt_map: + _pkts.append(rt_pkt_map[k]) + + bus_items = data_templates.get_bus_datas(_pkts) + seq = 1 + sub_key_nodes = list(filter(lambda it: 'is_key' in it, bus_items)) + has_key = any(sub_key_nodes) + rule_pk = rule_enc.C_ENC_PK + sub_key = '' + key_items = [] + self.compute_length_pos(bus_items) + for item in bus_items: + if item['type'] == 'enc': + if has_key: + _prop_enc = create_any_pkt(proj_pk, rule_pk, item, seq, name_path, ds, 'ENC', sub_key_nodes, + key_items) + else: + _prop_enc, rule_stream, _ = create_enc_pkt(proj_pk, rule_pk, item, rule_enc.C_ENC_PK, seq, + name_path, ds, '001', 'ENC') + else: + # 鍙傛暟 + _prop_enc = create_prop_enc(proj_pk, rule_pk, item, get_data_ty(item), seq) + if item.__contains__('is_key'): + sub_key += _prop_enc.C_ENCITEM_PK + '/' + key_items.append( + {"pk": _prop_enc.C_ENCITEM_PK, + 'id': _prop_enc.C_SEGMENT_ID, + 'name': _prop_enc.C_NAME, + 'val': ''}) + seq += 1 + if sub_key: + rule_enc.C_KEY = sub_key + update_rule_enc(rule_enc) + + def gen_tc(self): + # 鏁版嵁甯ф牸寮� + frame = self.gen_tc_transfer_frame_format() + # 閬ユ帶鍖呮牸寮� + pkt_format = self.gen_tc_pkt_format() + # 閬ユ帶鍖呭垪琛� + instructions = self.gen_tc_transfer_pkts() + for inst in instructions: + # 閬ユ帶鎸囦护鏁版嵁鍖哄唴瀹� + self.gen_tc_pkt_details(inst) + inst['type'] = 'insUnit' + format_text = json.dumps(pkt_format, ensure_ascii=False) + format_text = utils.replace_tpl_paras(format_text, inst) + pf = json.loads(format_text) + pf['name'] = inst['name'] + pf['code'] = inst['code'] + data_area = next(filter(lambda x: x['name'] == '搴旂敤鏁版嵁鍖�', pf['children'])) + data_area['children'].append(inst) + frame['subPkts'].append(pf) + self.order = 0 + + def build_def(item: dict): + if item['type'] in ['enum', 'sendFlag']: + if isinstance(item['enums'], str): + enums = json.loads(item['enums']) + else: + enums = item['enums'] + return json.dumps({"EnumItems": enums, "CanInput": True}, ensure_ascii=False) + elif item['type'] == 'length': + return None + elif item['type'] == 'checkSum': + return json.dumps({"ChecksumType": item['value']['type']}) + elif item['type'] == 'subPkt': + return json.dumps({"CanInput": False}) + elif item['type'] in ['combPkt', 'insUnitList', 'input']: + return None + elif item['type'] == 'insUnit': + return '{"MinLength":null,"MaxLength":null,"IsSubPackage":false,"InputParams":[],"OutPutParams":[],"MatchItems":[]}' + elif item['type'] == 'pkt': + return '''{"MaxLength":1024,"IsSplit8":false,"Split8Start":null,"Split8End":null,"PadCode":null,"Alignment":null,"InputParams":[],"OutPutParams":[],"MatchItems":[]}''' + elif item['type'] == 'pktSeqCnt': + return json.dumps({"FirstPackValue":"PackCount","MiddlePackValue":"PackIndex","LastPackValue":"PackIndex","IndependPackValue":"InsUnitCount"}) + elif 'value' in item: + return item['value'] + + def create_tc_format(parent_pk, field, parent_parent_pk=None): + """ + 鍒涘缓閬ユ帶鏍煎紡 + + 鏁版嵁搴撴暟鎹粨鏋勶細 + 甯у瓧娈� parent_pk=null, pk=pk_001, type=1 + 鍖垮悕瀛楁(瀛愬寘) parent_pk=pk_001, pk=pk_002, type=22 + 瀛楁1 parent_pk=pk_002, pk=pk_003, type=15 + 瀛楁2 parent_pk=pk_002, pk=pk_004, type=15 + 鍖呭瓧娈� parent_pk=pk_001, pk=pk_005, type=1 + 鍖垮悕瀛楁(瀛愬寘) parent_pk=pk_005, pk=pk_006, type=22 + 瀛楁3 parent_pk=pk_006, pk=pk_007, type=15 + 鎸囦护鍗曞厓 parent_pk=pk_005, pk=pk_007, type=4 + 瀛楁4 parent_pk=pk_007, pk=pk_008, type=15 + + :param parent_pk: 鐖剁骇pk + :param field: 鏍煎紡瀛楁 + :param parent_parent_pk: 鐖剁骇鐨勭埗绾k + :return: + """ + field['order'] = self.order + self.order += 1 + field['def'] = build_def(field) + if 'length' in field: + field['bitWidth'] = field['length'] + field['bitOrder'] = None + field['attr'] = make_attr(field) + if field['type'] == 'length' and 'value' in field and field['value']: + val = field['value'] + field['range'] = val['start'] + "~" + val['end'] + field['formula'] = val['formula'] + # 鍗虫椂杈撳叆闀垮害涓簄ull鍒欐槸鍙橀暱瀛楁锛岄渶瑕佹妸绫诲瀷鏀逛负variableLength + if field['type'] == 'input' and field['length'] is None: + field['type'] = 'variableLength' + # 鏋氫妇鍊奸粯璁ゅ�艰缃� + if field['type'] == 'enum' and len(field['enums']) and not next(filter(lambda x: 'default' in x and x['default'], field['enums']), None): + field['enums'][0]['default'] = True + # 鏍¢獙鍜� + if field['type'] == 'checkSum': + field['range'] = f'{field["value"]["start"]}~{field["value"]["end"]}' + ins_format = create_ins_format(self.proj.C_PROJECT_PK, parent_pk, field) + ins_format_pk = ins_format.C_INS_FORMAT_PK + if 'children' in field: + autocode = 1 + if field['type'] == 'pkt': + info = { + 'order': self.order, + 'type': 'subPkt', + 'def': json.dumps({"CanInput": False}) + } + ins_format = create_ins_format(self.proj.C_PROJECT_PK, ins_format_pk, info) + self.order += 1 + for child in field['children']: + child['autocode'] = autocode + autocode += 1 + if field['type'] == 'insUnitList': + _parent_pk = parent_parent_pk + else: + _parent_pk = ins_format.C_INS_FORMAT_PK + create_tc_format(_parent_pk, child, ins_format_pk) + if 'subPkts' in field: + for _pkt in field['subPkts']: + create_tc_format(ins_format_pk, _pkt, parent_pk) + + create_tc_format(None, frame) + + def gen_tc_transfer_frame_format(self): + _msg = ''' +# 瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� +# 鎸囦护 +鍒嗘瀽閬ユ帶浼犻�佸抚鏍煎紡锛屾彁鍙栭仴鎺т紶閫佸抚鏍煎紡鐨勫瓧娈靛畾涔夈�� +# 闇�姹� +瑕佹彁鍙栧�肩殑甯ф牸寮忓瓧娈碉細 +- 鐗堟湰鍙凤細const锛屼簩杩涘埗锛屼互B缁撳熬锛� +- 閫氳繃鏍囧織锛歝onst锛屼簩杩涘埗锛屼互B缁撳熬锛� +- 鎺у埗鍛戒护鏍囧織锛歝onst锛屼簩杩涘埗锛屼互B缁撳熬锛� +- 绌洪棽浣嶏細const锛屼簩杩涘埗锛屼互B缁撳熬锛� +- 鑸ぉ鍣ㄦ爣璇嗭細const锛屽崄鍏繘鍒讹紝浠�0x寮�澶达紝濡傛灉鏄簩杩涘埗鎴栧崄杩涘埗闇�瑕佽浆鎹负鍗佸叚杩涘埗锛� +- 铏氭嫙淇¢亾鏍囪瘑锛歴endFlag锛屽彂閫佹爣璁帮紝榛樿涓衡�滀换鍔℃敞鍏ュ抚鈥濓紝鎵�鏈夌殑鍊奸兘瑕佸垪涓惧嚭鏉ワ紱 +# 鏁版嵁绫诲瀷 +- const锛氬浐瀹氱爜瀛楋紝鏁板�硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱 +- sendFlag锛氬彂閫佹爣璁帮紝绫讳技鏋氫妇锛屽畾涔夋牱渚嬶細[{"n":"name","v":"value","c":"code","default":true}]锛宯琛ㄧず鍚嶇О锛寁琛ㄧず鍊硷紝c琛ㄧずcode锛堟病鏈夌┖鐫�锛夛紝default琛ㄧず鏄粯璁ゅ�硷紱 +- checkSum锛氭牎楠屽拰锛屽鏋滄槸鏍¢獙鍜岀被鍨嬭繕闇�瑕佸垎鏋愭牎楠屽拰鐨勭畻娉曪紝骞朵繚瀛樺湪value涓紝鏍¢獙鍜岀畻娉曞寘鎷細瀛楄妭寮傛垨锛圔yteXOR锛夈�佺疮鍔犲拰鍙栧弽锛圫umNot锛夈�佺疮鍔犲拰锛圓ddSum锛夈�佸簲鐢ㄥ惊鐜啑浣欙紙CRC-CCITT锛夈�丆RC8锛圕RC8锛夈�両SO鍜屾牎楠岋紙ISOSum锛夈�佸鏍¢獙锛圤dd锛夈�佸伓鏍¢獙锛圗ven锛夈�佸叾浠栵紙Other锛� +# 绾︽潫 +- 浠SON鏍煎紡杈撳嚭锛� +- 浠呰緭鍑篔SON鏂囨湰锛屼笉瑕佽緭鍑轰换浣曞叾浠栨枃鏈�� +# 杈撳嚭渚嬪瓙锛� +{ + "鐗堟湰鍙�": "00B", + "閫氳繃鏍囧織": "0", + ... +} +''' + + def validation(gen_text): + json.loads(gen_text) + + doc_text = self.get_text_with_entity(['閬ユ帶甯ф牸寮�']) + text = self.generate_tc_text(_msg, 'out/tc_transfer_frame.json', doc_text=doc_text, + validation=validation) + result: dict = json.loads(text) + format_text = utils.read_from_file('tpl/tc_transfer_frame.json') + format_text = utils.replace_tpl_paras(format_text, result) + frame = json.loads(format_text) + return frame + + def gen_tc_pkt_format(self): + _msg = ''' +# 瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� +# 鎸囦护 +鍒嗘瀽閬ユ帶鍖呮牸寮忥紝鎻愬彇閬ユ帶鍖呮牸寮忕殑瀛楁瀹氫箟銆� +# 闇�姹� +瑕佹彁鍙栧�肩殑鍖呮牸寮忓瓧娈碉細 +- 鍖呯増鏈彿: const锛屼簩杩涘埗锛� +- 鍖呯被鍨�: const锛屼簩杩涘埗锛� +- 鏁版嵁鍖哄ご鏍囧織: const锛屼簩杩涘埗锛� +- 搴忓垪鏍囧織: const锛屼簩杩涘埗锛� +- 鍖呴暱锛歭ength锛� +- 鍓澶存爣蹇�: const锛屼簩杩涘埗锛� +- 閬ユ帶鍖呯増鏈彿: const锛屼簩杩涘埗锛� +- 鍛戒护姝g‘搴旂瓟: const锛屼簩杩涘埗锛� +- 婧愬湴鍧�: const锛屽崄鍏繘鍒躲�� +# 鏁版嵁绫诲瀷 +- 鍥哄畾鐮佸瓧锛歝onst锛屾暟鍊硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱 +- 闀垮害锛歭ength锛屽鏋滃瓧娈垫弿杩板唴瀹逛负鏁版嵁鍖哄煙鐨勯暱搴﹀垯琛ㄧず鏄暱搴︼紝闀垮害鐨剉alue涓烘暟鍊笺�乶ull鎴栬寖鍥村畾涔夛紝 +- 鏋氫妇鍊硷細enum锛� +- 鏍¢獙鍜岋細checkSum锛屽鏋滄槸鏍¢獙鍜岀被鍨嬭繕闇�瑕佸垎鏋愭牎楠屽拰鐨勭畻娉曪紝骞朵繚瀛樺湪value涓紝鏍¢獙鍜岀畻娉曞寘鎷細瀛楄妭寮傛垨锛圔yteXOR锛夈�佺疮鍔犲拰鍙栧弽锛圫umNot锛夈�佺疮鍔犲拰锛圓ddSum锛夈�佸簲鐢ㄥ惊鐜啑浣欙紙CRC-CCITT锛夈�丆RC8锛圕RC8锛夈�両SO鍜屾牎楠岋紙ISOSum锛夈�佸鏍¢獙锛圤dd锛夈�佸伓鏍¢獙锛圗ven锛夈�佸叾浠栵紙Other锛� +- 鍗虫椂杈撳叆锛歩nput銆� +# 闀垮害绫诲瀷鐨勮寖鍥村畾涔夋弿杩� +{"start": "璧峰瀛楁code", "end": "缁撴潫瀛楁code", "formula": "璁$畻鍏紡"} +- start锛氳捣濮嬪瓧娈礳ode锛岄暱搴﹀寘鎷捣濮嬪瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡璧峰瀛楁锛� +- end锛氱粨鏉熷瓧娈礳ode锛岄暱搴﹀寘鎷粨鏉熷瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡缁撴潫瀛楁锛� +- formula锛氳绠楀叕寮忥紝濡傛灉娌℃湁璁$畻鐩稿叧鎻忚堪鍒欒〃绀轰笉闇�瑕佽绠楀叕寮忋�� +璁$畻鍏紡瀹氫箟锛� +- BYTES锛氭寜瀛楄妭璁$畻锛� +- N-x锛氭�诲瓧鑺傛暟鍑弜锛屼緥濡傛�诲瓧鑺傛暟鍑�1鐨勫叕寮忎负N-1銆� +# 绾︽潫 +- 浠SON鏍煎紡杈撳嚭锛� +- 浠呰緭鍑篔SON鏂囨湰锛屼笉瑕佽緭鍑轰换浣曞叾浠栨枃鏈�� +# 杈撳嚭渚嬪瓙锛� +{ + "鍖呯増鏈彿": "00B", + "鍖呯被鍨�": "1B", + ... +} +''' + + def validation(gen_text): + json.loads(gen_text) + + doc_text = self.get_text_with_entity(['閬ユ帶鍖呮牸寮�']) + text = self.generate_tc_text(_msg, 'out/tc_transfer_pkt.json', doc_text=doc_text, + validation=validation) + result = json.loads(text) + + format_text = utils.read_from_file('tpl/tc_pkt_format.json') + format_text = utils.replace_tpl_paras(format_text, result) + pkt_format = json.loads(format_text) + return pkt_format + + def gen_tc_transfer_pkts(self): + _msg = ''' +# 瑙掕壊 +浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛�� +# 鎸囦护 +鍒嗘瀽鏂囨。鍒楀嚭鎵�鏈夌殑閬ユ帶鎸囦护銆� +# 绾︽潫 +- 搴旂敤杩囩▼鏍囪瘑锛氬簲鐢ㄨ繃绋嬫爣璇嗗氨鏄疉PID锛屼竴鑸細鍦ㄥ悕绉板悗鐨勬嫭鍙蜂腑鍒楀嚭鏉ワ紱 +- code锛氭寚浠や唬鍙凤紝娌℃湁灏辩┖鐫�锛� +- name锛氭寚浠ゅ悕绉帮紝鏍规嵁琛ㄦ牸鍐呭鎻愬彇锛屾敞鎰忓悕绉伴渶瑕佹彁鍙栧畬鏁达紝濡傛灉鏈夊鍒楀垯鍚堝苟鐢�-鍒嗗壊锛� +- 搴旂敤鏁版嵁鍖猴細鎻愬彇琛ㄦ牸涓殑搴旂敤鏁版嵁鍖哄唴瀹广�� +# 杈撳嚭渚嬪瓙锛� +[{ +"name": "xxx", +"code":"pkt", +"搴旂敤杩囩▼鏍囪瘑绗�":"0xAA", +"鏈嶅姟绫诲瀷":"0x1", +"鏈嶅姟瀛愮被鍨�":"0x2", +"搴旂敤鏁版嵁鍖�": "" +}] +''' + + def validation(gen_text): + json.loads(gen_text) + + doc_text = self.get_text_with_entity(['APID鍒嗛厤']) + text = self.generate_tc_text(_msg, 'out/tc_transfer_pkts.json', doc_text=doc_text, + validation=validation) + pkts = json.loads(text) + return pkts + + def gen_tc_pkt_details(self, pkt): + result = [] + tc_name = pkt['name'] + tc_code = pkt['code'] + pkt['name'] = f'{tc_code} {tc_name}' + _msg = f""" +# 瑙掕壊 +浣犳槸涓�涓祫娣辫蒋浠跺伐绋嬪笀銆� + +# 鎸囦护 +鍒嗘瀽鏂囨。锛屼粠鏂囨。涓彁鍙栭仴鎺ф寚浠ゅ悕绉颁负鈥渰tc_name}鈥濅唬鍙蜂负鈥渰tc_code}鈥濈殑鎸囦护搴旂敤鏁版嵁鍖哄畾涔夈�� + +鏈変簺鏂囨。鍐呭闈炲父绠�鍗曚粎浠呭寘鍚壒瀹氬瓧鑺傜殑鍐呭鎻忚堪锛屽鏋滄槸杩欑鏂囨。锛屽垯姣忎釜鐗瑰畾瀛楄妭鐨勫唴瀹规弿杩板畾涔変负涓�涓瓧娈碉紝瀛楁绫诲瀷鏍规嵁瀛楄妭鍐呭纭畾銆� +""" + """ + +# 瀛楁绫诲瀷 +- 鍥哄畾鐮佸瓧锛歝onst锛屾暟鍊硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱 +- 闀垮害锛歭ength锛屽鏋滃瓧娈垫弿杩板唴瀹逛负鏁版嵁鍖哄煙鐨勯暱搴﹀垯琛ㄧず鏄暱搴︼紝闀垮害鐨剉alue涓烘暟鍊笺�乶ull鎴栬寖鍥村畾涔夛紝 +- 鏋氫妇鍊硷細enum锛� +- 鏍¢獙鍜岋細checkSum锛屽鏋滄槸鏍¢獙鍜岀被鍨嬭繕闇�瑕佸垎鏋愭牎楠屽拰鐨勭畻娉曟槸浠�涔堬紝骞朵繚瀛樺湪value涓紝 +- 鍗虫椂杈撳叆锛歩nput锛屽鏋滄槸鍗虫椂杈撳叆value鐨勫�间负绌哄瓧绗︿覆銆� + +# 闀垮害绫诲瀷鐨勮寖鍥村畾涔夋弿杩� +{"start": "璧峰瀛楁code", "end": "缁撴潫瀛楁code", "formula": "璁$畻鍏紡"} +- start锛氳捣濮嬪瓧娈礳ode锛岄暱搴﹀寘鎷捣濮嬪瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡璧峰瀛楁锛� +- end锛氱粨鏉熷瓧娈礳ode锛岄暱搴﹀寘鎷粨鏉熷瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡缁撴潫瀛楁锛� +- formula锛氳绠楀叕寮忥紝濡傛灉娌℃湁闀垮害鐗规畩璁$畻鐩稿叧鎻忚堪鍒欎娇鐢˙YTES銆� +璁$畻鍏紡瀹氫箟锛� +- BYTES锛氭寜瀛楄妭璁$畻锛屽瓧鑺傛暟锛� +- N-x锛氭�诲瓧鑺傛暟鍑弜锛屼緥濡傛�诲瓧鑺傛暟鍑�1鐨勫叕寮忎负N-1銆� + +# 瀛楁绫诲瀷鍒嗘瀽鏂规硶 +- 鏍规嵁瀛楁鎻忚堪鍒嗘瀽瀛楁鐨勭被鍨嬶紱 +- 瀛楁鎻忚堪涓槑纭寚瀹氫簡瀛楁鍊肩殑锛岀被鍨嬩负const锛� +- 瀛楁鎻忚堪涓病鏈夋槑纭寚瀹氬瓧娈靛�硷紝浣嗘槸缃楀垪浜嗗彇鍊艰寖鍥寸殑锛岀被鍨嬩负enum锛� +- 瀛楁鎻忚堪涓鏋滄病鏈夋槑纭寚瀹氬瓧娈靛�间篃娌℃湁缃楀垪鍙栧�艰寖鍥寸殑锛岀被鍨嬩负input锛� +- 瀛楁濡傛灉鏄拰鈥滈暱搴︹�濇湁鍏筹紝绫诲瀷涓簂ength锛� +- 濡傛灉鍜屾暟鎹煙鏈夊叧锛岀被鍨嬩负const锛� +- 瀛楁濡傛灉鍜屾牎楠屽拰鏈夊叧锛岀被鍨嬩负checkSum锛屽垎鏋愭牎楠屽拰鐨勭畻娉曪紝骞朵繚瀛樺湪value涓紝鏍¢獙鍜岀畻娉曞寘鎷細瀛楄妭寮傛垨锛圔yteXOR锛夈�佺疮鍔犲拰鍙栧弽锛圫umNot锛夈�佺疮鍔犲拰锛圓ddSum锛夈�佸簲鐢ㄥ惊鐜啑浣欙紙CRC-CCITT锛夈�丆RC8锛圕RC8锛夈�両SO鍜屾牎楠岋紙ISOSum锛夈�佸鏍¢獙锛圤dd锛夈�佸伓鏍¢獙锛圗ven锛夈�佸叾浠栵紙Other锛夈�� + +# 绾︽潫 +- code 濡傛灉娌℃湁鏄庣‘瀹氫箟鍒欎娇鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧锛屽敖閲忕畝鐭紱 +- length 鑷姩杞崲涓篵it闀垮害锛屽繀椤绘槸鏁板�笺�乶ull鎴栬寖鍥村畾涔夛紝涓嶈兘涓�0锛� +- value 鏍规嵁瀛楁鎻忚堪鎻愬彇瀛楁鍊硷紝瀛楁鍊间竴鑸负鏁板�肩被鍨嬶紝闇�瑕佹牴鎹瓧娈电被鍨嬫潵鍒嗘瀽锛屽鏋滄槸length绫诲瀷value鐨勫�间负鑼冨洿瀹氫箟锛� +- enums 鏋氫妇绫诲瀷鐨勫瓧娈靛繀椤昏鏈塭nums锛屾牴鎹瓧娈垫弿杩版彁鍙栵紝鏋氫妇鍏冪礌鐨勬暟鎹粨鏋勪负{"n":"","v":"","c":""}锛� +- length绫诲瀷瀛楁鐨勮寖鍥村畾涔変腑鐨剆tart鍜宔nd蹇呴』鏄敓鎴愮粨鏋滀腑鐨勫瓧娈礳ode锛岄暱搴﹀寘鎷瑂tart鍜宔nd锛屽繀椤讳娇鐢ㄩ暱搴︽弿杩颁腑鐨勫瓧娈碉紱 +- 杈撳嚭鏁版嵁缁撴瀯涓烘暟缁勶紝鏁扮粍鍏冪礌涓哄瓧娈典俊鎭紱 +- 杈撳嚭鍐呭蹇呴』涓轰弗鏍肩殑json锛屼笉鑳借緭鍑洪櫎json浠ュ鐨勪换浣曞唴瀹广�� + +# 杈撳嚭渚嬪瓙锛� +[ + { + "name": "para1", + "code": "para1", + "length": 8, + "type": "const", + "value": "0xAA" + }, + { + "name": "para2", + "code": "para2", + "length": 8, + "type": "length", + "value": {"start": "data", "end": "data", "formula": "BYTES"} + }, + { + "name": "鏁版嵁", + "code": "data", + "length": null, + "type": "input", + "value": "" + } +] +""" + + def validation(gen_text): + fields = json.loads(gen_text) + for field in fields: + if field['type'] == 'length': + if field['value'] is None: + raise Exception('length绫诲瀷鐨剉alue涓嶈兘涓虹┖') + if 'start' not in field['value'] or 'end' not in field['value']: + raise Exception('length绫诲瀷鐨剉alue蹇呴』鍖呭惈start鍜宔nd') + if field['value']['start'] not in [f['code'] for f in fields]: + raise Exception('length绫诲瀷鐨剉alue鐨剆tart瀛楁蹇呴』鍦╢ields涓�') + if field['value']['end'] not in [f['code'] for f in fields]: + raise Exception('length绫诲瀷鐨剉alue鐨別nd瀛楁蹇呴』鍦╢ields涓�') + elif field['type'] == 'enum': + if 'enums' not in field: + raise Exception('enum绫诲瀷鐨刦ield蹇呴』鍖呭惈enums') + if len(field['enums']) == 0: + raise Exception('enum绫诲瀷鐨刦ield鐨別nums涓嶈兘涓虹┖') + for enum in field['enums']: + if 'n' not in enum or 'v' not in enum: + raise Exception('enum绫诲瀷鐨刦ield鐨別nums鐨勫厓绱犲繀椤诲寘鍚玭銆乿銆乧') + if enum['n'] == '' or enum['v'] == '': + raise Exception('enum绫诲瀷鐨刦ield鐨別nums鐨勫厓绱犱笉鑳戒负绌�') + + doc_text = self.get_text_with_entity([tc_name]) + if doc_text == '': + doc_text = pkt['搴旂敤鏁版嵁鍖�'] + text = self.generate_tc_text(_msg, + f'out/閬ユ帶鎸囦护鏁版嵁鍩�-{tc_code}-{utils.to_file_name(tc_name)}.json', + doc_text=doc_text, + validation=validation) + result = json.loads(text) + pkt['children'] = result if __name__ == '__main__': - md_file = 'D:\\workspace\\PythonProjects\\KnowledgeBase\\doc\\鏂囨。鍚堝苟.md' - md_file2 = 'D:\\workspace\\PythonProjects\\KnowledgeBase\\doc\\XA-5D鏃犱汉鏈哄垎绯荤粺鎺㈡祴婧愬寘璁捐鎶ュ憡锛堝叕寮�锛�.md' - # 鍚姩澶фā鍨嬪鐞嗘祦绋� - ret_text = DbStructFlow([md_file, md_file2]).run() + try: + os.makedirs("./out/pkts", exist_ok=True) + os.makedirs("./out/tmp", exist_ok=True) + # 鍚姩澶фā鍨嬪鐞嗘祦绋� + ret_text = DbStructFlow().run() + except KeyboardInterrupt: + if g_completion: + g_completion.close() -- Gitblit v1.9.1