Skip to content

Commit

Permalink
README
Browse files Browse the repository at this point in the history
  • Loading branch information
osnosn committed Jul 1, 2024
1 parent 257ccb5 commit 7b8bc85
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 46 deletions.
53 changes: 43 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,65 @@ Flight Data Decode 2, 解析,解码,译码 原始QAR数据 raw.dat 文件。ARIN

当前目录是 rust workspace 的根目录。包含几个子项:
* qar_raw_dump
- `dump_raw_aligned` 扫描raw文件,通过 sync 同步字出现的顺序和间隔,确定是否 aligned格式。
- `dump_raw_bitstream` 扫描raw文件,通过 sync 同步字出现的顺序和间隔,确定是否 bitstream格式。
* qar_decode. 解码个别参数
- `qar_decode5` 解1024.PRM. (源码保留,不编译)
- `qar_decode7` 解320.PRM. (源码保留,不编译)
- `qar_decode8` 解320.PRM, **配置来自json文件。解码所有参数.**(2024-05)
- **`dump_raw_aligned`** 扫描raw文件,通过 sync 同步字出现的顺序和间隔,确定是否 aligned格式。
- **`dump_raw_bitstream`** 扫描raw文件,通过 sync 同步字出现的顺序和间隔,确定是否 bitstream格式。
* qar_decode. 解码参数
- `qar_decode5` 解1024.PRM. 解码个别参数。(源码保留,不编译)
- `qar_decode7` 解320.PRM. 解码个别参数。(源码保留,不编译)
- ~~qar_decode8 配置来自json文件。解码所有参数.~~ (2024-05)
-`prm_conf320.json`文件中读取解码配置。
- 对于PRM配置,可以用`read_prm717.py`生成json配置文件。
- 对于VEC配置,可以用另一个项目中[FlightDataDecode](https://github.com/osnosn/FlightDataDecode)`/ARINC717/VEC717_to_json.py`生成json配置文件。
- 解码参数后, 写入自定义格式文件.dat。可以用 `ALL_read_datafile.py` 来读取,导入pandas.DataFrame中。
- 解码程序没写完。处理了 BNR,ISO,BCD,DIS 格式的数据。其他类型还没有处理 (默认按BNR处理)。
- 这个程序的解码逻辑,写的不好。应该要重写。(2024-06)
- `qar_decode9` 按一个Frame为单位(包含4个subFrame),进行解码。在decode8基础上重写。(2024-06)
- 这个程序的按subFrame为单位,进行解码,不好。应该要改写。(2024-06)
- **`qar_decode9`** 按一个Frame为单位(包含4个subFrame),进行解码。
**配置来自json文件。解码所有参数.** 在decode8基础上改写。(2024-06)
- 使用json格式的解码配置。
- 解码参数后, 写入自定义格式文件.dat。可以用 `ALL_read_datafile.py` 来读取,导入pandas.DataFrame中。
- 解码程序。处理了 BNR,ISO,BCD,DIS,UTC,CHAR 格式的数据。其他类型 (默认按BNR处理)。
* qar_decode_lua. 支持嵌入lua脚本.
- `qar_decode6` 嵌入lua脚本测试, 解码个别参数. (源码保留,不编译)
- `qar_datafile2` **读取自定义格式文件,通过嵌入lua脚本,修改自定义格式文件.**
- **`qar_datafile2`** **读取自定义格式文件,通过嵌入lua脚本,修改自定义格式文件.**
- 执行lua脚本, 可 调取,修改,删除 参数的值.
- lua中支持的内嵌函数, 请看`qar_datafile2 --luahelp`
或者看`qar_datafile2`源码, 在`qar_decode_lua/src/bin/qar_datafile2.rs`
```
Luajit-5.2
table=json.decode(str)
把json字符串, 解码为lua的table,失败:会抛出错误; 可用pcall()调用.
str=json.encode(table, pretty)
把lua的table, 转化为json字符串, pretty=true显示更漂亮
支持 json.null值, json.array()函数.
str=qar.meta
获取/设置Header.meta信息 (json字符串格式), 此属性,可读,可写
str=qar:get_meta() OR qar.get_meta(qar)
获取Header.meta信息 (json字符串格式)
qar:set_meta(str) OR qar.set_meta(qar,str)
设置Header.meta信息 (json字符串格式)
num=qar:get_param_num()
获取所有参数的数量
table=qar:get_param_list()
获取所有的参数名, 如无参数名,返回空table []
table=qar:get_param(name) OR qar.get_param(qar,name)
获取参数名name的所有值, 如果没找到参数,返回nil
stat,txt=qar:set_param(name,data) OR qar.set_param(qar,name,data)
设置参数名name的值, 如果参数名存在则覆盖,不存在则创建, 成功stat>=1,失败stat<=-1, txt=失败的原因
默认用bzip2压缩保存.
data中的info,建议用json字符串.
值为str类型:
data={ info='{"msg":"test"}', val='[[0,"v12"],[0.5,"v23"],[1,"vv34"], ...]' } --val建议用json字符串
值为float,int类型.
参数的rate是通过第一组值和第二组值中,第一个值的差值来计算的. 后续组中的第一个值被忽略.
data={ info='{"msg":"test"}', val={ {0.0,10.1},{0.5,10.2},{1.0,10.3},{1.5,10.4}, ... } } --rate通过0.0, 0.5计算
data={ info='{"msg":"test"}', val={ {0,101},{1,102},{2,103},{3,104}, ... } } --rate通过0, 1计算
stat,txt=qar:del_param(name) OR qar.del_param(qar,name)
删除参数名name的值, 成功stat=1,失败stat<=-1, txt=失败的原因
```
data/ 目录,有示例数据。
python3/ 目录,有几个 py3 程序。其中:
* `ALL_read_datafile.py` 用于**读取**, 存放于自定义格式文件中的,解码后的参数, **并导入pandas.DataFrame中**。(2024-05)
* **`ALL_read_datafile.py`** 用于**读取**, 存放于自定义格式文件中的,解码后的参数, **并导入pandas.DataFrame中**。(2024-05)
## 更新
* **2024-06 最后更新**
Expand Down
6 changes: 3 additions & 3 deletions python3/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ Flight Data Decode 2, 解析,解码,译码 原始QAR数据 raw.dat 文件。ARIN
* `bitstream2aligned.py`, 把bitstream格式转换为aligned格式, 并把数据帧对齐。(补帧未实现,2024-06)
* `decode5_arinc717_aligned.py` 解320.PRM, raw320.dat
-`param_prm5.py` 解码配置320.PRM
* `decode6_arinc717_aligned.py` 解单个参数
* ~~decode6_arinc717_aligned.py 解单个参数~~
- 用命令行参数指定 "解码配置" 和 "原始数据文件"
* `decode8_arinc717_aligned.py` 解单个参数, 或所有参数
* `decode8_arinc717_aligned.py` 解单个参数, 或所有参数
- 用命令行参数指定 "解码配置" 和 "原始数据文件"
- 解所有参数, 写入自定格式的单文件
- 这个py程序旧了。对应`qar_decode8`的后续修改, 没有同步修改这个py程序。
* 对应`qar_decode9`的rust程序, 没写python3的版本。
* 对应`qar_decode9`的rust程序, 没写python3的版本。


## 其他
Expand Down
28 changes: 15 additions & 13 deletions python3/decode6_arinc717_aligned.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def qar_file(self,qar_filename):

def get_param(self, prm_name, filename_write):
# (frame_pos, param_set, word_per_sec ):
pm_list=[] #用于返回,解码后的数据

# 参数的配置,
#prm_words #取值位置的配置
Expand All @@ -52,9 +53,10 @@ def get_param(self, prm_name, filename_write):
prm_param = self.prm['param'][prm_name]
else:
print("参数没找到:\"{}\"".format( prm_name))
return
return pm_list
prm_words = prm_param['words']
prm_superframe = prm_param['superframe']
#prm_superframe = prm_param['superframe']
prm_superframe = prm_words[0][0]
if len(prm_param['res'])>0:
[_, _, res_A, res_B, res_C] = prm_param['res'][0]
else:
Expand All @@ -65,7 +67,7 @@ def get_param(self, prm_name, filename_write):
prm_superFrameCnt_prm = self.prm['param']["SuperFrameCounter"]
else:
print("参数没找到:\"{}\"".format( "SuperFrameCounter"))
return
return pm_list
prm_superFrameCnt = prm_superFrameCnt_prm['words'][0]
if "UTC_HOUR" in self.prm['param']:
frame_hour_prm = self.prm['param']["UTC_HOUR"]
Expand All @@ -89,7 +91,7 @@ def get_param(self, prm_name, filename_write):
# 参数的 每秒记录个数
# 这个值,算的很粗糙,可能会不正确 !!!!!
#param_rate: f32
if prm_words[0][0] == 0 :
if prm_words[0][1] == 0 :
param_rate = len(prm_words)
else :
param_rate = 1
Expand Down Expand Up @@ -174,29 +176,29 @@ def get_dword_raw(self, param_prm, prm_set):
dword_raw = 0
ttl_bit = 0 #总bit计数
#为了倒序循环,计算最后一组配置的值
ii = (len(prm_set) // 5 - 1) * 5 #整数 乘除.
ii = (len(prm_set) // 6 - 1) * 6 #整数 乘除.
while True:
#倒序循环
#配置中 是否 指定了 subframe
if prm_set[ii] > 0 and prm_set[ii] != self.subframe_idx :
if prm_set[ii+1] > 0 and prm_set[ii+1] != self.subframe_idx :
return None
if prm_set[ii + 4] != 0 :
if prm_set[ii + 5] != 0 :
#targetBit !=0 不知道如何拼接,暂时忽略这个配置。只给出提示信息。
print("--> INFO.targetBit !=0, 取值结果可能不正确")
bits_cnt = prm_set[ii + 3] - prm_set[ii + 2] + 1
bits_cnt = prm_set[ii + 4] - prm_set[ii + 3] + 1
ttl_bit += bits_cnt #总bit位数
bits_mask = (1 << bits_cnt) - 1
dword_raw <<= bits_cnt
#dword_raw |= (((self.raw[self.byte_cnt + (prm_set[ii + 1] - 1) * 2 + 1]) << 8 | self.raw[self.byte_cnt + (prm_set[ii + 1] - 1) * 2]) >> (prm_set[ii + 2] - 1)) & bits_mask
dword_raw |= (( self.getWord(self.byte_cnt + (prm_set[ii + 1] - 1) * 2) ) >> (prm_set[ii + 2] - 1)) & bits_mask
#dword_raw |= (((self.raw[self.byte_cnt + (prm_set[ii + 2] - 1) * 2 + 1]) << 8 | self.raw[self.byte_cnt + (prm_set[ii + 2] - 1) * 2]) >> (prm_set[ii + 3] - 1)) & bits_mask
dword_raw |= (( self.getWord(self.byte_cnt + (prm_set[ii + 2] - 1) * 2) ) >> (prm_set[ii + 3] - 1)) & bits_mask
if ii > 0 :
ii -= 5 #step
ii -= 6 #step
else :
break

#如果有符号位,并且,最高位为1 . 默认最高bit为符号位.
#if param_prm.signed == true && dword_raw & (1 << (ttl_bit - 1)) > 0 {
if param_prm['signRecType'] == True and dword_raw & (1 << (ttl_bit - 1)) > 0 :
#if param_prm['signRecType'] == True and dword_raw & (1 << (ttl_bit - 1)) > 0 :
if param_prm['signed'] == True and dword_raw & (1 << (ttl_bit - 1)) > 0 :
#计算补码
dword_raw -= 1 << ttl_bit
#println!("--> INFO.signed=true, 计算补码")
Expand Down
79 changes: 66 additions & 13 deletions python3/decode8_arinc717_aligned.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ def get_param(self, prm_name):
dword_error = 0
#value; #解码后的工程值
#frame_time #frame时间轴
self.words_sort(prm_words) #按target排序, 怎么排序都不对,#注释这行,还是用原始顺序
while True :
if self.find_SYNC() == False:
break
Expand All @@ -120,9 +121,40 @@ def get_param(self, prm_name):
continue
else:
dword_raw = val
value = float(dword_raw) * res_B + res_A #通过系数,转换为工程值
frame_time = float(self.subframe_cnt) + (rate_cnt / param_rate)
pm_list.append({'t':round(frame_time,10),'v':round(value,10)})
if 'BCD' == prm_param['RecFormat'] :
# 处理BCD, 即,十进制数值
bcd_dword = 0
ii = 0
#倒序
for bcd_bits in reversed(prm_param['ConvConfig']) :
bits_mask = (1 << bcd_bits) - 1
bcd_dword += (bits_mask & dword_raw) * (10 ** ii)
dword_raw >>= bcd_bits
ii += 1
dword_raw = bcd_dword
#BCD也有转换系数
value = float(dword_raw) * res_B + res_A #通过系数,转换为工程值
value = round(value,10)
elif prm_param['RecFormat'].startswith("ISO") or prm_param['RecFormat'].startswith("CHAR"):
# 处理CHR,
chr_dword = ""
#倒序
for chr_bits in reversed(prm_param['ConvConfig']) :
bits_mask = (1 << chr_bits) - 1
chr_dword += chr(bits_mask & dword_raw)
#chr_dword += chr(self.reverse_bits(bits_mask & dword_raw, chr_bits))
dword_raw >>= chr_bits
value = chr_dword
elif "UTC" == prm_param['RecFormat']:
ss= dword_raw & 0x3f
mm= (dword_raw>>6) & 0x3f
hh= (dword_raw>>12) & 0x3f
value="{:02}:{:02}:{:02}".format(hh,mm,ss)
else:
value = float(dword_raw) * res_B + res_A #通过系数,转换为工程值
value = round(value,10)
pm_list.append({'t':round(frame_time,10),'v':value})

#if self.word_cnt < 12800 :
# print( "subframe:{}, frametime:{:.5f}, val:{}".format( self.subframe_idx, frame_time, value))
Expand Down Expand Up @@ -172,19 +204,40 @@ def get_dword_raw(self, param_prm, prm_set):
#计算补码
dword_raw -= 1 << ttl_bit
#println!("--> INFO.signed=true, 计算补码")
# 处理BCD, 即,十进制数值
if 'BCD' == param_prm['RecFormat'] :
bcd_dword = 0
ii = 0
#倒序
for bcd_bits in reversed(param_prm['ConvConfig']) :
bits_mask = (1 << bcd_bits) - 1
bcd_dword += (bits_mask & dword_raw) * (10 ** ii)
dword_raw >>= bcd_bits
ii += 1
dword_raw = bcd_dword
return dword_raw,dword_error

def words_sort(self,words):
'''
-- 解码时, 是左移,倒序取值,放入低位
如果按target的正序排序, 解码结果不正确
如果按target的倒序排序, 解码结果也不正确
还是按本来的顺序, 解码结果似乎比较正确
'''
print('FR:',words)
for jj in range(0,len(words)):
if len(words[jj])>6:
tmp=[]
for ii in range(0,len(words[jj]),6):
tmp.append([ii,words[jj][ii+5]])
tmp.sort(key=lambda x:x[1],reverse=False) #正序,target最大值放最后,应该用这个
#tmp.sort(key=lambda x:x[1],reverse=True) #倒序,target最大值放最前
word_sorted=[]
for v2 in tmp:
word_sorted.extend([words[jj][v2[0]], words[jj][v2[0]+1], words[jj][v2[0]+2], words[jj][v2[0]+3], words[jj][v2[0]+4], words[jj][v2[0]+5],])
words[jj]=word_sorted
print('TO:',words)
pass
def reverse_bits(self,bits,bitlen):
if bitlen<1 or bitlen>31:
return bits
result=0
mask= 0x1
for ii in range(0,bitlen):
result <<=1
if bits & mask >0:
result |= 0x1
mask <<=1
return result
def getWord(self, pos, word_len=1):
'''
word_len=1,取2字节; word_len=2,取4字节;
Expand Down
11 changes: 6 additions & 5 deletions python3/read_prm717.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,14 +330,15 @@ def words_sort(words):
还是按本来的顺序, 解码结果似乎比较正确
'''
for jj in range(0,len(words)):
if len(words[jj])>5:
if len(words[jj])>6:
tmp=[]
for ii in range(0,len(words[jj]),5):
tmp.append([ii,words[jj][ii+4]])
tmp.sort(key=lambda x:x[1],reverse=False)
for ii in range(0,len(words[jj]),6):
tmp.append([ii,words[jj][ii+5]])
tmp.sort(key=lambda x:x[1],reverse=False) #正序,target最大值放最后,应该用这个
tmp.sort(key=lambda x:x[1],reverse=True) #倒序,target最大值放最前
word_sorted=[]
for v2 in tmp:
word_sorted.extend([words[jj][v2[0]], words[jj][v2[0]+1], words[jj][v2[0]+2], words[jj][v2[0]+3], words[jj][v2[0]+4],])
word_sorted.extend([words[jj][v2[0]], words[jj][v2[0]+1], words[jj][v2[0]+2], words[jj][v2[0]+3], words[jj][v2[0]+4], words[jj][v2[0]+5],])
words[jj]=word_sorted
pass
def read_parameter_file(dataver):
Expand Down
4 changes: 2 additions & 2 deletions qar_decode_lua/src/bin/qar_datafile2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -910,15 +910,15 @@ fn showLuaHelp(_bin_name: String) {
let buf = r##"
Luajit-5.2
table=json.decode(str)
把json字符串, 解码为lua的table,失败:会抛出错误
把json字符串, 解码为lua的table,失败:会抛出错误; 可用pcall()调用.
str=json.encode(table, pretty)
把lua的table, 转化为json字符串, pretty=true显示更漂亮
支持 json.null值, json.array()函数.
str=qar.meta
获取/设置Header.meta信息 (json字符串格式), 此属性,可读,可写
str=qar:get_meta() OR qar.get_meta(qar)
获取Header.meta信息 (json字符串格式)
str=qar:get_meta() OR qar.get_meta(qar)
str=qar:set_meta() OR qar.set_meta(qar)
设置Header.meta信息 (json字符串格式)
num=qar:get_param_num()
获取所有参数的数量
Expand Down

0 comments on commit 7b8bc85

Please sign in to comment.