This commit is contained in:
nuknal
2024-05-21 17:41:00 +08:00
parent 84c8b5d23c
commit db650cdaa9
7 changed files with 487 additions and 72 deletions

View File

@@ -4,20 +4,21 @@ import (
"os"
log "github.com/sirupsen/logrus"
"github.com/tealeg/xlsx"
"github.com/xuri/excelize/v2"
)
func (e Extractor) ExtractAux(auxfile, xlsxfile string) error {
if err := createAuxXlxs(xlsxfile); err != nil {
os.Remove(xlsxfile)
if err := createAuxXlsx(xlsxfile); err != nil {
return err
}
wb, err := xlsx.OpenFile(xlsxfile)
f, err := excelize.OpenFile(xlsxfile)
if err != nil {
panic(err)
return err
}
sh := wb.Sheets[0]
defer f.Close()
data, err := os.ReadFile(auxfile)
if err != nil {
@@ -25,21 +26,23 @@ func (e Extractor) ExtractAux(auxfile, xlsxfile string) error {
return err
}
row := 2
col := 1
for i := 0; i < len(data); i += 24 + 128 + 512 {
row := sh.AddRow()
var head AuxFrameHead
head.Decode(data[i : i+24])
head.SaveXlsx(row)
l0, _ := head.SaveXlsx(f, col, row)
var box AuxFocalBox
box.Decode(data[i+24 : i+24+128])
box.SaveXlsx(row)
l1, _ := box.SaveXlsx(f, col+l0, row)
var plat AuxPlatform
plat.Decode(data[i+24+128 : i+24+128+512])
box.SaveXlsx(row)
plat.SaveXlsx(f, col+l0+l1, row)
row++
}
return nil
return f.Save()
}

View File

@@ -2,11 +2,9 @@ package extract
import (
"fmt"
"os"
"github.com/k0kubun/pp/v3"
"github.com/sirupsen/logrus"
"github.com/tealeg/xlsx"
"github.com/xuri/excelize/v2"
)
// 卫星时间起点 北京时间 2000-01-01 20:00:00
@@ -141,27 +139,79 @@ func (ab AuxFocalBox) PGAGainValue() string {
}
}
func (ab AuxFocalBox) SaveXlsx(row *xlsx.Row) error {
return nil
}
func (e *Extractor) ParseAuxEBox(auxfile string) ([]*AuxFocalBox, error) {
data, err := os.ReadFile(auxfile)
if err != nil {
logrus.Println("read aux data from", auxfile, "error:", err.Error())
return nil, err
func (ab AuxFocalBox) SaveXlsx(f *excelize.File, col, row int) (int, error) {
values := []interface{}{
ab.TransferTime,
ab.TrainingDone,
ab.WorkMode,
ab.IntegralDirection,
ab.PGAGain,
ab.PIntegrationLevel,
ab.B1IntegrationLevel,
ab.B2IntegrationLevel,
ab.B3IntegrationLevel,
ab.B4IntegrationLevel,
ab.SecPluseState,
"",
ab.DarkFieldBias,
ab.PWinAddr,
ab.B1WinAddr,
ab.B2WinAddr,
ab.B3WinAddr,
ab.B4WinAddr,
"面阵模式Linetime时钟周期数",
"面阵模式开窗地址",
"面阵模式开窗大小",
"面阵曝光时间粗调EXP_C",
"面阵曝光时间精调EXP_F",
"面阵模式最小读出行",
"硬盘1温度",
"硬盘2温度",
"保留",
"传感器温度",
"FPGA逻辑版本号",
ab.CCDWorkMode,
ab.RawDiskAvailableCap,
ab.ZipDiskAvailableCap,
"原始盘状态",
"原始盘Host初始化状态",
"原始盘SATA控制器状态",
"原始盘SATA错误计数",
"压缩盘状态",
"压缩盘Host初始化状态",
"压缩盘SATA控制器状态",
"压缩盘SATA错误计数",
"保留",
"DDR初始化状态",
"原始图像硬盘状态",
"压缩数据硬盘状态",
"硬盘1读写状态",
"硬盘2读写状态",
"硬盘1初始化状态",
"硬盘2初始化状态",
"保留",
"保留",
"硬盘1禁用标志",
"硬盘2禁用标志",
"保留",
"B2数据移位",
"B1数据移位",
"B4数据移位",
"B3数据移位",
ab.CommandCount,
ab.LastCommandCode,
"指令接收状态",
"错误指令计数",
"错误指令帧编号",
"保留",
"传感器数字电路温度",
}
var afs []*AuxFocalBox
for i := 0; i < len(data); i += 128 {
var ab AuxFocalBox
if err := ab.Decode(data[i : i+128]); err != nil {
return nil, err
}
afs = append(afs, &ab)
ab.Print()
break
for i := 0; i < len(values); i++ {
cell, _ := excelize.CoordinatesToCellName(col, row)
f.SetCellValue("Sheet1", cell, values[i])
col++
}
return afs, nil
return len(values), nil
}

View File

@@ -1,22 +1,23 @@
package extract
import "github.com/tealeg/xlsx"
import (
"github.com/xuri/excelize/v2"
)
func createAuxXlxs(fname string) error {
nwb := xlsx.NewFile()
sheet, err := nwb.AddSheet("辅助数据")
func createAuxXlsx(fname string) error {
f := excelize.NewFile()
defer f.Close()
cell, err := excelize.CoordinatesToCellName(1, 1)
if err != nil {
panic(err)
return err
}
row := sheet.AddRow()
for _, header := range AuxHeader {
cell := row.AddCell()
cell.SetString(header)
}
return nwb.Save(fname)
f.SetSheetRow("Sheet1", cell, &AuxHeader)
return f.SaveAs(fname)
}
var AuxHeader = []string{
var AuxHeader = []interface{}{
"包头信息",
"填充位",
"帧头信息",

View File

@@ -5,7 +5,7 @@ import (
"errors"
"fmt"
"github.com/tealeg/xlsx"
"github.com/xuri/excelize/v2"
)
// 每行传感器数据帧头信息长度为24字节
@@ -99,28 +99,30 @@ func (afh AuxFrameHead) CheckFrmHead() bool {
return false
}
func (afh AuxFrameHead) SaveXlsx(row *xlsx.Row) error {
values := []string{
fmt.Sprintf("0x%x", afh.PkgHead),
func (afh AuxFrameHead) SaveXlsx(f *excelize.File, col, row int) (int, error) {
values := []interface{}{
fmt.Sprintf("0x%X", afh.PkgHead),
"",
fmt.Sprintf("0x%x", afh.FrmHead),
fmt.Sprintf("0x%X", afh.FrmHead),
afh.ImageMode(),
afh.BandStatus(afh.B4),
afh.BandStatus(afh.B3),
afh.BandStatus(afh.B2),
afh.BandStatus(afh.B1),
afh.BandStatus(afh.B0),
fmt.Sprintf("%d", afh.SerialNo),
fmt.Sprintf("%d", afh.TimeSec),
fmt.Sprintf("%d", afh.TimeSecFrac),
fmt.Sprintf("%d", afh.FileNo),
afh.SerialNo,
afh.TimeSec,
afh.TimeSecFrac,
afh.FileNo,
}
for _, v := range values {
row.AddCell().SetString(v)
for i := 0; i < len(values); i++ {
cell, _ := excelize.CoordinatesToCellName(col, row)
f.SetCellValue("Sheet1", cell, values[i])
col++
}
return nil
return len(values), nil
}
func (afh AuxFrameHead) ImageMode() string {

View File

@@ -7,7 +7,7 @@ import (
"time"
"github.com/k0kubun/pp/v3"
"github.com/tealeg/xlsx"
"github.com/xuri/excelize/v2"
log "github.com/sirupsen/logrus"
"starwiz.cn/sjy01/preprocessing/calculator"
@@ -338,8 +338,356 @@ func (ap AuxPlatform) Print() {
pp.Println(ap)
}
func (ap AuxPlatform) SaveXlsx(row *xlsx.Row) error {
return nil
func (ap AuxPlatform) SaveXlsx(f *excelize.File, col, row int) (int, error) {
var values = []interface{}{
ap.UTCTimeSec,
ap.Waveway,
ap.Microsecond,
ap.QuatAttstarQ0,
ap.QuatAttstarQ1,
ap.QuatAttstarQ2,
ap.QuatAttstarQ3,
ap.QuatOrbitQ1,
ap.QuatOrbitQ2,
ap.QuatOrbitQ3,
ap.QuatOrbJQ1,
ap.QuatOrbJQ2,
ap.QuatOrbJQ3,
ap.Eular1,
ap.Eular2,
ap.Eular3,
ap.DotEular1,
ap.DotEular2,
ap.DotEular3,
ap.ModTime,
ap.DTime,
ap.AutoState,
ap.ProTrack,
ap.QeQ1,
ap.QeQ2,
ap.QeQ3,
ap.We1,
ap.We2,
ap.We3,
ap.WTFX,
ap.WTFY,
ap.WTFZ,
ap.FbdriftX,
ap.FbdriftY,
ap.FbdriftZ,
ap.KalbX,
ap.KalbY,
ap.KalbZ,
ap.HTDX,
ap.HTDY,
ap.HTDZ,
ap.CommandWheelX,
ap.CommandWheelY,
ap.CommandWheelZ,
ap.QuatG1,
ap.QuatG2,
ap.QuatG3,
ap.WG1,
ap.WG2,
ap.WG3,
ap.J2000PosX,
ap.J2000PosY,
ap.J2000PosZ,
ap.J2000VelX,
ap.J2000VelY,
ap.J2000VelZ,
ap.W84PosX,
ap.W84PosY,
ap.W84PosZ,
ap.W84VelX,
ap.W84VelY,
ap.W84VelZ,
ap.AngleDraft,
ap.DataTransLong,
ap.DataTransLat,
ap.DataTransH,
ap.StarPrio[0],
ap.StarPrio[1],
ap.StarPrio[2],
ap.WheelspeedcalX,
ap.WheelspeedcalY,
ap.WheelspeedcalZ,
"",
"",
"",
"",
"锂电池温度",
"相机主镜温度",
"相机次镜温度",
"推进模块温度",
"负X侧相机桁架杆温度",
"正X正Y侧相机桁架杆温度",
"正X负Y侧相机桁架杆温度",
"正X侧相机支撑背板温度",
"负X侧相机支撑背板温度",
"星敏支架温度",
"成像电箱温度",
"正Y帆板温度",
"电源下位机温度",
"配电热控驱动温度",
"电源控制器温度",
"数字太阳敏矢量数据有效位",
"数字太阳敏矢量数据X",
"数字太阳敏矢量数据Y",
"数字太阳敏位置X1",
"数字太阳敏位置X2",
"数字太阳敏位置Y1",
"数字太阳敏位置Y2",
"太阳敏温度",
"数字太阳敏当前正在使用的阈值(源码)",
"数字太阳敏当前正在使用的增益",
"保留",
"保留",
"保留",
"错误码计数",
"单粒子错误计数",
"配电错误码1",
"配电错误码2",
"配电错误码3",
"配电错误码4",
"配电错误码5",
"GPS天内秒",
"GPSUTC时间累计秒",
"太阳阵电流",
"母线电流",
"负载电流",
"蓄电池电压",
"电源母线电压",
"CPU5.2V电压遥测值",
"5.2V配电电压遥测值",
"保留",
"蓄电池组当前电量",
"模式运行时间秒",
"卫星现运行模式",
"组合业务标识",
"当前业务状态",
"中心机指令接收总计数",
"中心机错误指令计数",
"执行指令所在分系统",
"执行指令的指令代码",
"执行延时指令总计数",
"当前延时指令计数",
"执行延时指令所在分系统",
"执行延时指令的指令代码",
"当前延时业务计数",
"成功执行业务计数",
"异常中止业务计数",
"指令执行状态",
"业务异常中止状态",
"测控数传一体机通信状态",
"保留",
"北斗短报文通信状态",
"GPS接收机通信状态",
"数字太阳敏通信状态",
"星敏1通信状态",
"星敏2通信状态",
"光纤陀螺通信状态",
"MEMS陀螺通信状态",
"飞轮1通信状态",
"飞轮2通信状态",
"飞轮3通信状态",
"飞轮4通信状态",
"智能载荷通信状态",
"保留",
"保留",
"电磁阀开关状态",
"业务保存状态",
"卫星类型标识",
"卫星序号标识",
"保留",
"保留",
"保留",
"保留",
"锂电池加热器通断状态",
"相机主镜加热器通断状态",
"相机次镜加热器通断状态",
"推进模块加热器通断状态",
"相机负X侧桁架杆加热器通断状态",
"成像电箱加热器通断状态",
"相机正X正Y侧桁架杆加热器通断状态",
"相机正X负Y侧桁架杆加热器通断状态",
"相机正X侧支撑背板加热器通断状态",
"相机负X侧支撑背板加热器通断状态",
"星敏支架加热器通断状态",
"保留",
"温度修正系数校验状态",
"电源下位机广播帧监视功能",
"当前控温码表",
"默认控温码表",
"飞轮1电源供电状态",
"飞轮2电源供电状态",
"飞轮3电源供电状态",
"SADA1电源供电状态",
"SADA2电源供电状态",
"测控数传电源供电状态",
"保留",
"保留",
"北斗短报文供电状态",
"推进电源供电状态",
"焦面电源供电状态",
"飞轮4电源供电状态",
"星敏1电源供电状态",
"星敏2电源供电状态",
"数字太阳敏电源供电状态",
"导航电源供电状态",
"三轴光纤陀螺电源供电状态",
"MEMS陀螺电源供电状态",
"热控正线状态",
"热控1状态",
"热控2状态",
"保留",
"保留",
"保留",
"锂电池加热器控温模式",
"相机主镜加热器控温模式",
"相机次镜加热器控温模式",
"推进模块加热器控温模式",
"相机负X侧桁架杆加热器控温模式",
"相机正X正Y侧桁架杆加热器控温模式",
"相机正X负Y侧桁架杆加热器控温模式",
"相机正X侧支撑背板加热器控温模式",
"相机负X侧支撑背板加热器控温模式",
"星敏支架加热器控温模式",
"成像电箱加热器控温模式",
"保留",
"保留",
"保留",
"保留",
"保留",
"保留",
"保留",
"接收机时间来源",
"定位模式",
"轨道数据有效标示",
"主备机标志",
"PPS状态",
"GPS最高信噪比",
"BD最高信噪比",
"参与定位的GPS导航星数",
"参与定位的BD导航星数",
"GPS几何精度因子",
"GPS连续工作时间",
"保留",
"保留",
ap.WGS84PosX,
ap.WGS84PosY,
ap.WGS84PosZ,
ap.WGS84VelX,
ap.WGS84VelY,
ap.WGS84VelZ,
ap.J2000Pos_X,
ap.J2000Pos_Y,
ap.J2000Pos_Z,
ap.J2000Vel_X,
ap.J2000Vel_Y,
ap.J2000Vel_Z,
ap.FOGyroXAV,
ap.FOGyroYAV,
ap.FOGyroZAV,
ap.FOGyroXAV1,
ap.FOGyroYAV1,
ap.FOGyroZAV1,
ap.SS1_UTCTime,
ap.SS1_UTCTimeFrac,
ap.SS1_Q1,
ap.SS1_Q2,
ap.SS1_Q3,
ap.SS1_Q4,
ap.SS1_ExposureTime,
ap.SS1_Threshold,
ap.SS1_BackgroudV,
"星敏A上电进入boot标志",
"星敏AEDAC打开标志",
"星敏A程序版本",
"星敏A四元数滤波标志",
"星敏A系统内部工作进程代号",
ap.SS1_WorkMode,
ap.SS1_ExtractStars,
ap.SS1_NavStars,
ap.SS1_Gain,
ap.SS1_RegonizedStars,
ap.SS1_ExtenalImage,
ap.SS1_AttitudeActive,
"星敏A内部软件版本号低3位",
"星敏A产品设备编号低5位",
"星敏A成像传感器温度",
"星敏A在轨EDAC错误计数",
ap.SS1_ImgFrmNo,
"星敏A四星寻找阈值",
"星敏A跟踪阈值",
"星敏ASAA阈值",
"星敏ASAA工作模式",
"星敏A动态模式标志位",
ap.SS1_XAV,
ap.SS1_YAV,
ap.SS1_ZAV,
"星敏A星点阈值自适应功能",
"保留",
"星敏A速率质量",
ap.SS2_UTCTime,
ap.SS2_UTCTimeFrac,
ap.SS2_Q1,
ap.SS2_Q2,
ap.SS2_Q3,
ap.SS2_Q4,
ap.SS2_ExposureTime,
ap.SS2_Threshold,
ap.SS2_BackgroudV,
"星敏B上电进入boot标志",
"星敏BEDAC打开标志",
"星敏B程序版本",
"星敏B四元数滤波标志",
"星敏B系统内部工作进程代号",
ap.SS2_WorkMode,
ap.SS2_ExtractStars,
ap.SS2_NavStars,
ap.SS2_Gain,
ap.SS2_RegonizedStars,
ap.SS2_ExtenalImage,
ap.SS2_AttitudeActive,
"星敏B内部软件版本号低3位",
"星敏B产品设备编号低5位",
"星敏B成像传感器温度",
"星敏B在轨EDAC错误计数",
ap.SS2_ImgFrmNo,
"星敏B四星寻找阈值",
"星敏B跟踪阈值",
"星敏BSAA阈值",
"星敏BSAA工作模式",
"星敏B动态模式标志位",
"保留",
ap.FlyWheel1_Vel,
ap.FlyWheel1_Amps,
ap.FlyWheel2_Vel,
ap.FlyWheel2_Amps,
ap.FlyWheel3_Vel,
ap.FlyWheel3_Amps,
ap.FlyWheel4_Vel,
ap.FlyWheel4_Amps,
ap.MemsGyroXAV,
ap.MemsGyroYAV,
ap.MemsGyroZAV,
ap.MagnetictrengthX,
ap.MagnetictrengthY,
ap.MagnetictrengthZ,
ap.ASSTimeInt,
ap.ASSTimeDec,
"",
fmt.Sprintf("%08b", ap.CheckSum),
}
for i := 0; i < len(values); i++ {
cell, _ := excelize.CoordinatesToCellName(col, row)
f.SetCellValue("Sheet1", cell, values[i])
col++
}
return len(values), nil
}
// Extractor 辅助数据提取器