feat():initial version
This commit is contained in:
53
code_generator/backup/StudentsRedisDao.cpp
Normal file
53
code_generator/backup/StudentsRedisDao.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
/// @class StudentsRedisDao
|
||||
|
||||
/// @brief cpp底层接口类 操作students内容
|
||||
|
||||
/// TABLE students
|
||||
|
||||
/// @author test.py
|
||||
|
||||
/// @generate date: 2022-07-19 09:19:17
|
||||
|
||||
/// [注:本文件为自动生成,不需要人为编辑,若有修改,请通过配置py脚本来重新生成.]
|
||||
|
||||
include “StudentsRedisDao.h”
|
||||
|
||||
include “include/students_t.h”
|
||||
|
||||
include “RedisManager.h”
|
||||
|
||||
include “common/LogMacros.h”
|
||||
|
||||
include “common/StringUtility/OtherStringFunc.h”
|
||||
|
||||
include “common/DateTime.h”
|
||||
|
||||
namespace redisdao{
|
||||
|
||||
#define PRIMARY_KEY “123”
|
||||
|
||||
const string StudentsRedisDao::TABLE_NAME = “students”;
|
||||
|
||||
const string StudentsRedisDao::TABLE_ID = “115”; //在数据库中的表的唯一性标识符
|
||||
|
||||
const string StudentsRedisDao::KEY_SEPARETER = “stu”;
|
||||
|
||||
StudentsRedisDao::StudentsRedisDao(void)
|
||||
{
|
||||
|
||||
if ( 0 == m_reHandler.EnsureConnect())
|
||||
m_bRedisConnected = true;
|
||||
else
|
||||
m_bRedisConnected = false;
|
||||
}
|
||||
|
||||
StudentsRedisDao::~StudentsRedisDao(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int StudentsRedisDao::InsertRecord(const string& strVal)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
53
code_generator/backup/cpp.template
Normal file
53
code_generator/backup/cpp.template
Normal file
@@ -0,0 +1,53 @@
|
||||
/// @class ${CLASSNAME}
|
||||
|
||||
/// @brief cpp底层接口类 操作${TABLE_NAME}内容
|
||||
|
||||
/// TABLE ${TABLE_NAME_UPPER}
|
||||
|
||||
/// @author test.py
|
||||
|
||||
/// @generate date: ${GENE_DATE}
|
||||
|
||||
/// [注:本文件为自动生成,不需要人为编辑,若有修改,请通过配置py脚本来重新生成.]
|
||||
|
||||
include “${CLASSNAME}.h”
|
||||
|
||||
include “include/${TABLE_NAME}_t.h”
|
||||
|
||||
include “RedisManager.h”
|
||||
|
||||
include “common/LogMacros.h”
|
||||
|
||||
include “common/StringUtility/OtherStringFunc.h”
|
||||
|
||||
include “common/DateTime.h”
|
||||
|
||||
namespace redisdao{
|
||||
|
||||
#define PRIMARY_KEY “${PRIMER_KEY}”
|
||||
|
||||
const string ${CLASSNAME}::TABLE_NAME = “${TABLE_NAME}”;
|
||||
|
||||
const string ${CLASSNAME}::TABLE_ID = “${TABLE_ID}”; //在数据库中的表的唯一性标识符
|
||||
|
||||
const string ${CLASSNAME}::KEY_SEPARETER = “${KEY_SEPARETER}”;
|
||||
|
||||
${CLASSNAME}::${CLASSNAME}(void)
|
||||
{
|
||||
|
||||
if ( 0 == m_reHandler.EnsureConnect())
|
||||
m_bRedisConnected = true;
|
||||
else
|
||||
m_bRedisConnected = false;
|
||||
}
|
||||
|
||||
${CLASSNAME}::~${CLASSNAME}(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int ${CLASSNAME}::InsertRecord(const string& strVal)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
52
code_generator/backup/genService.py
Normal file
52
code_generator/backup/genService.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# coding=utf-8
|
||||
|
||||
import os,sys,re,traceback
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from string import Template
|
||||
|
||||
def generate(self):
|
||||
tableName = 'students'
|
||||
className = '%sRedisDao' % tableName.capitalize()
|
||||
filePath = r'%s.cpp' % className
|
||||
class_file = open(filePath,'w')
|
||||
lines = []
|
||||
#模版文件
|
||||
template_file = open(r'cpp.template','r')
|
||||
tmpl = Template(template_file.read())
|
||||
#模版替换
|
||||
lines.append(tmpl.substitute(
|
||||
CLASSNAME = className, #类名设置
|
||||
TABLE_NAME = tableName, #成员变量设置
|
||||
PRIMER_KEY = 123, #宏定义设置
|
||||
KEY_SEPARETER = 'stu', #成员变量设置
|
||||
TABLE_NAME_UPPER = tableName, #未使用
|
||||
GENE_DATE = datetime.now().strftime('%Y-%m-%d %H:%M:%S'), #代码生成日期设置
|
||||
TABLE_ID = '115', #成员变量设置
|
||||
EXPIRE_DATE = '06JUN14')) #未使用
|
||||
# 0.将生成的代码写入文件
|
||||
class_file.writelines(lines)
|
||||
class_file.close()
|
||||
print('generate %s over. ~_~' % filePath)
|
||||
|
||||
if __name__ == "__main__":
|
||||
#template = "hello %s , your website is %s " % ("大CC","http://blog.me115.com")
|
||||
#print(template)
|
||||
|
||||
## 1.0 字符串替换
|
||||
#tmp = "%s is %s" % ("wate", "fire")
|
||||
#print(tmp)
|
||||
|
||||
## 2.0 format格式化替换
|
||||
#tp = "it is {name}, the {name} age is {age}".format(name="lihao", age=18)
|
||||
#print(tp)
|
||||
|
||||
## 3.0 模板替换
|
||||
#tempTemplate = Template("Hello $name,your website is $message")
|
||||
#print(tempTemplate.substitute(name='CCP',message='http://blog.me115.com'))
|
||||
|
||||
# auto generate code
|
||||
print("generate code start...")
|
||||
generate("auto_code")
|
||||
|
||||
33593
code_generator/backup/get-pip.py
Normal file
33593
code_generator/backup/get-pip.py
Normal file
File diff suppressed because it is too large
Load Diff
112
code_generator/backup/old/main.py
Normal file
112
code_generator/backup/old/main.py
Normal file
@@ -0,0 +1,112 @@
|
||||
# coding=utf-8
|
||||
import time
|
||||
import tkinter as tk
|
||||
from tkinter import Button, Checkbutton, Entry, Image, IntVar, Label, StringVar, scrolledtext, ttk, filedialog, messagebox
|
||||
from datetime import datetime
|
||||
from string import Template
|
||||
import tkinter_ui as gui
|
||||
import template as tmpl
|
||||
|
||||
|
||||
# 获取当前时间
|
||||
def Time(): #getCurrentTime
|
||||
current_time = time.strftime('[%Y-%m-%d %H:%M:%S]',time.localtime(time.time()))
|
||||
return current_time
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# #全局风格类型变量
|
||||
# entry_width = 30
|
||||
# short_entry_width = 15
|
||||
# font_pix = 15
|
||||
# font_type = "微软雅黑"
|
||||
# #window.geometry('1000x500+0+0')
|
||||
# #window.resizable(0,0)
|
||||
# #setWindowCenter(window, 700, 400) #窗口居中,传入窗口句柄和窗口宽高
|
||||
|
||||
#主窗口
|
||||
#实例化一个窗体
|
||||
window = gui.instantiate_the_window("Someip Service Code Generator") #窗口名
|
||||
note = gui.instantiate_the_note(window)
|
||||
#在窗体win中创建一个Notebook,并承载以下两个选项卡
|
||||
TabMain = gui.instantiate_the_tab(note, "Main") #选项卡1
|
||||
Tab2 = gui.instantiate_the_tab(note, "Tab2")
|
||||
|
||||
## 以下为Main选项卡
|
||||
# 第一组 :Create/Modify
|
||||
group_app = gui.instantiate_the_group(TabMain,"App") #创建Frame一组
|
||||
|
||||
|
||||
|
||||
#设置输入框控件,使用textvariable参数来接收变量
|
||||
# 定义输入框1
|
||||
label1 = Label(group_app, text='Run Config File Path')
|
||||
label1.grid(sticky="w", padx=15)
|
||||
entry1 = Entry(group_app, width=tmpl.entry_width, textvariable=tmpl.runConfigFilename)
|
||||
entry1.grid(row=0,column=1,sticky="w")
|
||||
entry1.config(state='normal') #'readonly'
|
||||
# Button(group_app, text='...', command=open_file).grid(row=0, column=2)
|
||||
# 定义输入框2
|
||||
label2 = Label(group_app, text='App name')
|
||||
label2.grid(sticky="w", padx=15)
|
||||
entry2 = Entry(group_app, width=tmpl.entry_width, textvariable=tmpl.appName)
|
||||
entry2.grid(row=1,column=1,sticky="w")
|
||||
# 定义输入框3
|
||||
label3 = Label(group_app, text='Service ID')
|
||||
label3.grid(sticky="w", padx=15)
|
||||
entry3 = Entry(group_app, width=tmpl.entry_width, textvariable=tmpl.serviceID)
|
||||
entry3.grid(row=2,column=1)
|
||||
entry3.config(state='readonly')
|
||||
# 定义输入框4
|
||||
label4 = Label(group_app, text='Instance ID')
|
||||
label4.grid(sticky="w", padx=15)
|
||||
entry4 = Entry(group_app, width=tmpl.ntry_width, textvariable=tmpl.instanceID)
|
||||
entry4.grid(row=3,column=1)
|
||||
entry4.config(state='readonly')
|
||||
|
||||
|
||||
# 设置复选框控件,使用variable参数来接收变量
|
||||
check0 = Checkbutton(window, text="use_tcp",variable = tmpl.use_tcp,onvalue=1,offvalue=0)
|
||||
check1 = Checkbutton(window, text="offer_F-F_method",variable = tmpl.offer_F_F_method,onvalue=1,offvalue=0, command=tmpl.entryState)
|
||||
check2 = Checkbutton(window, text="offer_R-R_method",variable = tmpl.offer_R_R_method,onvalue=1,offvalue=0, command=tmpl.entryState)
|
||||
check3 = Checkbutton(window, text="offer_setter",variable = tmpl.offer_setter,onvalue=1,offvalue=0, command=tmpl.entryState)
|
||||
check4 = Checkbutton(window, text="offer_getter",variable = tmpl.offer_getter,onvalue=1,offvalue=0, command=tmpl.entryState)
|
||||
check56 = Checkbutton(window, text="offer_event",variable = tmpl.offer_event,onvalue=1,offvalue=0, command=tmpl.entryState)
|
||||
check78 = Checkbutton(window, text="offer_field_notifier",variable = tmpl.offer_field_notifier,onvalue=1,offvalue=0, command=tmpl.entryState)
|
||||
|
||||
check0.grid(sticky="w")
|
||||
check1.grid(sticky="w")
|
||||
check2.grid(sticky="w")
|
||||
check3.grid(sticky="w")
|
||||
check4.grid(sticky="w")
|
||||
check56.grid(sticky="w")
|
||||
check78.grid(sticky="w")
|
||||
|
||||
# 设置各种服务类型的IDs,使用textvariable参数来接收变量
|
||||
idEntry1 = Entry(window, width=tmpl.entry_width, textvariable=tmpl.F_F_method_ids)
|
||||
idEntry2 = Entry(window, width=tmpl.entry_width, textvariable=tmpl.R_R_method_ids)
|
||||
idEntry3 = Entry(window, width=tmpl.entry_width, textvariable=tmpl.setter_ids)
|
||||
idEntry4 = Entry(window, width=tmpl.entry_width, textvariable=tmpl.getter_ids)
|
||||
idEntry5 = Entry(window, width=tmpl.short_entry_width, textvariable=tmpl.eventgroup_ids)
|
||||
idEntry6 = Entry(window, width=tmpl.short_entry_width, textvariable=tmpl.event_ids)
|
||||
idEntry7 = Entry(window, width=tmpl.short_entry_width, textvariable=tmpl.ield_eventgroup_ids)
|
||||
idEntry8 = Entry(window, width=tmpl.short_entry_width, textvariable=tmpl.field_event_ids)
|
||||
|
||||
idEntry1.grid_forget()
|
||||
idEntry2.grid_forget()
|
||||
idEntry3.grid_forget()
|
||||
idEntry4.grid_forget()
|
||||
idEntry5.grid_forget()
|
||||
idEntry6.grid_forget()
|
||||
idEntry7.grid_forget()
|
||||
idEntry8.grid_forget()
|
||||
|
||||
# 按钮
|
||||
button1 = Button(window, text="Generate", command=tmpl.generate)
|
||||
button1.grid(row=11, column=0, sticky="w", padx=15, pady=5)
|
||||
|
||||
button2 = Button(window, text='Exit',command=window.quit)
|
||||
button2.grid(row=11, column=1, sticky="e", padx=15, pady=5)
|
||||
|
||||
window.mainloop()
|
||||
54
code_generator/backup/old/sample_cfg_ids.hpp.template
Normal file
54
code_generator/backup/old/sample_cfg_ids.hpp.template
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
|
||||
/// @author liuzhimin@huaxu.com
|
||||
|
||||
/// @generate date: ${GENE_DATE}
|
||||
|
||||
/// [注:本文件为自动生成,不需要人为编辑,若有修改,请通过配置py脚本来重新生成.]
|
||||
|
||||
#ifndef VSOMEIP_${APP_NAME}_CFG_IDS_HPP
|
||||
#define VSOMEIP_${APP_NAME}_CFG_IDS_HPP
|
||||
|
||||
#define VSOMEIP_CONFIGURATION "${RUN_CONFIG_FILENAME}"
|
||||
#define APP_NAME "${APP_NAME}"
|
||||
|
||||
#define ${APP_NAME}_SERVICE_ID ${SERVICE_ID}
|
||||
#define ${APP_NAME}_INSTANCE_ID ${INSTANCE_ID}
|
||||
|
||||
#define USE_TCP ${USE_TCP}
|
||||
|
||||
#define OFFER_F_F_METHOD ${OFFER_F_F_METHOD}
|
||||
#define OFFER_R_R_METHOD ${OFFER_R_R_METHOD}
|
||||
#define OFFER_SETTER ${OFFER_SETTER}
|
||||
#define OFFER_GETTER ${OFFER_GETTER}
|
||||
#define OFFER_EVENT ${OFFER_EVENT}
|
||||
#define OFFER_FIELD_EVENT ${OFFER_FIELD_EVENT}
|
||||
|
||||
#if OFFER_F_F_METHOD
|
||||
#define ${APP_NAME}_${FF_METHOD_NAME}_F_F_METHOD_ID 0x0100 //0x0101,0x0102...
|
||||
#endif
|
||||
|
||||
#if OFFER_R_R_METHOD
|
||||
#define ${APP_NAME}_${RR_METHOD_NAME}_R_R_METHOD_ID 0x0200 //0x0201,0x0202...
|
||||
#endif
|
||||
|
||||
#if OFFER_GETTER
|
||||
#define ${APP_NAME}_${GET_METHOD_NAME}_GET_METHOD_ID 0x0300 //0x0301,0x0302...
|
||||
#endif
|
||||
|
||||
#if OFFER_SETTER
|
||||
#define ${APP_NAME}_${SET_METHOD_NAME}_SET_METHOD_ID 0x0400 //0x0401,0x0402...
|
||||
#endif
|
||||
|
||||
#if OFFER_EVENT
|
||||
#define ${APP_NAME}_${EVENTGROUP_NAME}_EVENTGROUP_ID 0x8100 //0x8200,0x8300...
|
||||
#define ${APP_NAME}_${EVENT_NAME}_EVENT_ID 0x8101 //0x8102,0x8103...
|
||||
#endif
|
||||
|
||||
#if OFFER_FIELD_EVENT
|
||||
#define ${APP_NAME}_${FIELD_EVENTGROUP_NAME}_FIELD_EVENTGROUP_ID 0x8800 //0x8900,0x8a00...
|
||||
#define ${APP_NAME}_${FIELD_EVENT_NAME}_FIELD_EVENT_ID 0x8801 //0x8802,0x8803...
|
||||
#endif
|
||||
|
||||
#endif // VSOMEIP_EXAMPLES_SAMPLE_CFG_IDS_HPP
|
||||
|
||||
54
code_generator/backup/old/tcu_cfg_ids.hpp
Normal file
54
code_generator/backup/old/tcu_cfg_ids.hpp
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
|
||||
/// @author liuzhimin@huaxu.com
|
||||
|
||||
/// @generate date: 2022-07-20 16:22:40
|
||||
|
||||
/// [注:本文件为自动生成,不需要人为编辑,若有修改,请通过配置py脚本来重新生成.]
|
||||
|
||||
#ifndef VSOMEIP_TCU_CFG_IDS_HPP
|
||||
#define VSOMEIP_TCU_CFG_IDS_HPP
|
||||
|
||||
#define VSOMEIP_CONFIGURATION "/etc/vsomeip"
|
||||
#define APP_NAME "TCU"
|
||||
|
||||
#define TCU_SERVICE_ID 0x1000
|
||||
#define TCU_INSTANCE_ID 0x2000
|
||||
|
||||
#define USE_TCP 1
|
||||
|
||||
#define OFFER_F_F_METHOD 1
|
||||
#define OFFER_R_R_METHOD 1
|
||||
#define OFFER_SETTER 1
|
||||
#define OFFER_GETTER 1
|
||||
#define OFFER_EVENT 0
|
||||
#define OFFER_FIELD_EVENT 1
|
||||
|
||||
#if OFFER_F_F_METHOD
|
||||
#define TCU_ADASOFF_F_F_METHOD_ID 0x0100 //0x0101,0x0102...
|
||||
#endif
|
||||
|
||||
#if OFFER_R_R_METHOD
|
||||
#define TCU_CAMSTATUS_R_R_METHOD_ID 0x0200 //0x0201,0x0202...
|
||||
#endif
|
||||
|
||||
#if OFFER_GETTER
|
||||
#define TCU_DISTANCE_GET_METHOD_ID 0x0300 //0x0301,0x0302...
|
||||
#endif
|
||||
|
||||
#if OFFER_SETTER
|
||||
#define TCU_LIMITEDSPEED_SET_METHOD_ID 0x0400 //0x0401,0x0402...
|
||||
#endif
|
||||
|
||||
#if OFFER_EVENT
|
||||
#define TCU_SIGNDETECTED_EVENTGROUP_ID 0x8100 //0x8200,0x8300...
|
||||
#define TCU_SPEEDLIMITSIGNDETECTED_EVENT_ID 0x8101 //0x8102,0x8103...
|
||||
#endif
|
||||
|
||||
#if OFFER_FIELD_EVENT
|
||||
#define TCU_SIGNDETECTED_FIELD_EVENTGROUP_ID 0x8800 //0x8900,0x8a00...
|
||||
#define TCU_SPEEDLIMITSIGNDETECTED_FIELD_EVENT_ID 0x8801 //0x8802,0x8803...
|
||||
#endif
|
||||
|
||||
#endif // VSOMEIP_EXAMPLES_SAMPLE_CFG_IDS_HPP
|
||||
|
||||
112
code_generator/backup/old/template.py
Normal file
112
code_generator/backup/old/template.py
Normal file
@@ -0,0 +1,112 @@
|
||||
# coding=utf-8
|
||||
from datetime import datetime
|
||||
from string import Template
|
||||
from tkinter import Image, IntVar, StringVar,filedialog, messagebox
|
||||
|
||||
#以下是所有需获取的变量
|
||||
runConfigFilename = StringVar("/etc/vsomeip")
|
||||
appName = StringVar(None,"tcu")
|
||||
serviceID = StringVar(None,"0x1000")
|
||||
instanceID = StringVar(None,"0x2000")
|
||||
|
||||
use_tcp = IntVar()
|
||||
offer_F_F_method = IntVar()
|
||||
offer_R_R_method = IntVar()
|
||||
offer_setter = IntVar()
|
||||
offer_getter = IntVar()
|
||||
offer_event = IntVar()
|
||||
offer_field_notifier = IntVar()
|
||||
|
||||
F_F_method_ids = StringVar(None,"adasOFF")
|
||||
R_R_method_ids = StringVar(None,"camStatus")
|
||||
setter_ids = StringVar(None,"limitedSpeed")
|
||||
getter_ids = StringVar(None,"distance")
|
||||
eventgroup_ids = StringVar(None,"SignDetected")
|
||||
event_ids = StringVar(None,"speedLimitSignDetected")
|
||||
field_eventgroup_ids = StringVar(None,"SignDetected")
|
||||
field_event_ids = StringVar(None,"speedLimitSignDetected")
|
||||
|
||||
def generate():
|
||||
filePath = r'%s_cfg_ids.hpp' % appName.get().lower()
|
||||
class_file = open(filePath,'w')
|
||||
lines = []
|
||||
#模版文件
|
||||
template_file = open(r'sample_cfg_ids.hpp.template','r')
|
||||
tmpl = Template(template_file.read())
|
||||
#模版替换
|
||||
lines.append(tmpl.substitute(
|
||||
GENE_DATE = datetime.now().strftime('%Y-%m-%d %H:%M:%S'), #代码生成日期设置
|
||||
RUN_CONFIG_FILENAME = runConfigFilename.get(),
|
||||
APP_NAME = appName.get().upper(),
|
||||
#MODULE_NAME = appName.get().upper(),
|
||||
SERVICE_ID = serviceID.get(),
|
||||
INSTANCE_ID = instanceID.get(),
|
||||
USE_TCP = use_tcp.get(),
|
||||
OFFER_F_F_METHOD = offer_F_F_method.get(),
|
||||
OFFER_R_R_METHOD = offer_R_R_method.get(),
|
||||
OFFER_SETTER = offer_setter.get(),
|
||||
OFFER_GETTER = offer_getter.get(),
|
||||
OFFER_EVENT = offer_event.get(),
|
||||
OFFER_FIELD_EVENT = offer_field_notifier.get(),
|
||||
FF_METHOD_NAME = F_F_method_ids.get().upper(),
|
||||
RR_METHOD_NAME = R_R_method_ids.get().upper(),
|
||||
GET_METHOD_NAME = getter_ids.get().upper(),
|
||||
SET_METHOD_NAME = setter_ids.get().upper(),
|
||||
EVENTGROUP_NAME = eventgroup_ids.get().upper(),
|
||||
EVENT_NAME = event_ids.get().upper(),
|
||||
FIELD_EVENTGROUP_NAME = field_eventgroup_ids.get().upper(),
|
||||
FIELD_EVENT_NAME = field_event_ids.get().upper(),
|
||||
))
|
||||
# 0.将生成的代码写入文件
|
||||
class_file.writelines(lines)
|
||||
class_file.close()
|
||||
print('generate "%s" success. ~_~' % filePath)
|
||||
messagebox.showinfo("tips",'Generate "%s" success.' % filePath)
|
||||
|
||||
def open_file():
|
||||
try:
|
||||
global file
|
||||
filepath = filedialog.askopenfilename() # 打开文件,返回该文件的完整路径
|
||||
runConfigFilename.set(filepath)
|
||||
file = Image.open(runConfigFilename.get())
|
||||
except Exception as e:
|
||||
print("您没有选择任何文件",e)
|
||||
|
||||
def entryState():
|
||||
None
|
||||
# if offer_F_F_method.get():
|
||||
# idEntry1.grid(row=5,column=1)
|
||||
# else:
|
||||
# idEntry1.grid_forget() # the same as grid_remove()
|
||||
|
||||
# if offer_R_R_method.get():
|
||||
# idEntry2.grid(row=6,column=1)
|
||||
# else:
|
||||
# idEntry2.grid_forget()
|
||||
|
||||
# if offer_setter.get():
|
||||
# idEntry3.grid(row=7,column=1)
|
||||
# else:
|
||||
# idEntry3.grid_forget()
|
||||
|
||||
# if offer_getter.get():
|
||||
# idEntry4.grid(row=8,column=1)
|
||||
# else:
|
||||
# idEntry4.grid_forget()
|
||||
|
||||
# if offer_event.get():
|
||||
# idEntry5.grid(sticky="w",row=9,column=1)
|
||||
# idEntry6.grid(sticky="e",row=9,column=1)
|
||||
# else:
|
||||
# idEntry5.grid_forget()
|
||||
# idEntry6.grid_forget()
|
||||
|
||||
# if offer_field_notifier.get():
|
||||
# idEntry7.grid(sticky="w",row=10,column=1)
|
||||
# idEntry8.grid(sticky="e",row=10,column=1)
|
||||
# else:
|
||||
# idEntry7.grid_forget()
|
||||
# idEntry8.grid_forget()
|
||||
|
||||
def modifyContent():
|
||||
print("modifyContent")
|
||||
52
code_generator/backup/old/tkinter_ui.py
Normal file
52
code_generator/backup/old/tkinter_ui.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# coding=utf-8
|
||||
from doctest import OutputChecker
|
||||
import sys
|
||||
import tkinter as tk
|
||||
from tkinter import scrolledtext, ttk, messagebox
|
||||
import time
|
||||
|
||||
# 获取当前时间
|
||||
def Time(): #getCurrentTime
|
||||
current_time = time.strftime('[%Y-%m-%d %H:%M:%S]',time.localtime(time.time()))
|
||||
return current_time
|
||||
|
||||
#设置窗口宽高,以及窗口在屏幕居中显示
|
||||
def setWindowCenter(root, width, height):
|
||||
screenwidth = root.winfo_screenwidth() # 获取显示屏宽度
|
||||
screenheight = root.winfo_screenheight() # 获取显示屏高度
|
||||
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) # 设置窗口居中参数
|
||||
root.geometry(size) # 让窗口居中显示
|
||||
|
||||
def instantiate_the_window(window_name):
|
||||
#实例化一个窗体
|
||||
window = tk.Tk()
|
||||
window.title(window_name) #窗口名
|
||||
#setWindowCenter(window, 800, 400) #窗口居中,传入窗口句柄和窗口宽高
|
||||
return window
|
||||
|
||||
def instantiate_the_note(window):
|
||||
#在窗体win中创建一个Notebook,并承载以下两个选项卡
|
||||
note = ttk.Notebook(window)
|
||||
return note
|
||||
|
||||
def instantiate_the_tab(note, tab_name):
|
||||
#在窗体win中创建一个Notebook,并承载以下两个选项卡
|
||||
tab = ttk.Frame(note,relief="solid",borderwidth=1)
|
||||
note.add(tab, text = tab_name) #选项卡
|
||||
note.pack()
|
||||
return tab
|
||||
|
||||
def instantiate_the_group(tab, group_name, _row=0, _column=0, _padx=10, _pady=10):
|
||||
group = tk.LabelFrame(tab, text=group_name) #创建Frame一组
|
||||
group.grid(row = _row, column = _column, padx = _padx, pady = _pady)
|
||||
return group
|
||||
|
||||
def instantiate_the_element(group,ele_type,ele_name,row,column,padx,pady):
|
||||
#if ele_type
|
||||
None
|
||||
|
||||
# 打印日志定向到滚动文本框
|
||||
def direct_log_to_scrolledtext(tab):
|
||||
log_data_Text = scrolledtext.ScrolledText(tab, width=100, height=10, relief="solid")
|
||||
log_data_Text.pack()
|
||||
sys.stdout = OutputChecker.StdoutRedirector(log_data_Text)
|
||||
314
code_generator/backup/tk_main.py
Normal file
314
code_generator/backup/tk_main.py
Normal file
@@ -0,0 +1,314 @@
|
||||
#encoding: utf-8
|
||||
|
||||
import threading
|
||||
import time
|
||||
import sys
|
||||
import tkinter as tk
|
||||
from tkinter import IntVar, StringVar, scrolledtext, ttk, messagebox,filedialog
|
||||
|
||||
import stdout as out
|
||||
import getchipmsg as getchip
|
||||
import rwexcle as rwsht
|
||||
import sendemail as smail
|
||||
import configmail as cfg
|
||||
|
||||
|
||||
class _Main: #调用SysTrayIcon的Demo窗口
|
||||
|
||||
def __init__(s):
|
||||
s.searching_state = False #搜索状态:是否正在搜索
|
||||
s.running_tk_win = False
|
||||
s.auto_run_thread = None #
|
||||
s.SysTrayIcon = None # 判断是否打开系统托盘图标
|
||||
# def __del__(s):
|
||||
# s.auto_run_thread.join()
|
||||
|
||||
def main(s):
|
||||
s.running_tk_win = True
|
||||
#实例化一个窗体
|
||||
s.win = tk.Tk()
|
||||
s.win.title("Find Chips") #窗口名
|
||||
s.setWindowCenter(s.win, 700, 700) #窗口居中,传入窗口句柄和窗口宽高
|
||||
|
||||
# #在窗体win中创建一个Notebook,并承载以下两个选项卡
|
||||
# note = ttk.Notebook(win)
|
||||
# TabMain = ttk.Frame(note,relief="solid",borderwidth=1)
|
||||
# note.add(TabMain, text = "") #选项卡1
|
||||
# #TabDB = ttk.Frame(note,relief="solid",borderwidth=1)
|
||||
# #note.add(TabDB, text = "Database")#选项卡2
|
||||
# note.pack()
|
||||
|
||||
## 以下为Main选项卡
|
||||
# 第一组 :芯片信息
|
||||
s.group_chipForm= tk.LabelFrame(s.win, text="chipForm") #创建Frame一组
|
||||
s.group_chipForm.grid(row=0, column=0, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.form_label=tk.Label(s.group_chipForm, text="芯片表格:")
|
||||
s.form_label.grid(row=0, column=0, padx=10, pady=10, sticky="w") #创建“芯片表格”字样的Label
|
||||
|
||||
s.file_path_entry = tk.Entry(s.group_chipForm,text='select a form', width = 50) #创建输入框
|
||||
s.file_path_entry.grid(row=0, column=1, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.select_file_button = tk.Button(s.group_chipForm, text="打开芯片表格自动完成搜索", command=s.open_excle_and_search_chips)
|
||||
s.select_file_button.grid(row=0, column=2, padx=10, pady=10, sticky="w")
|
||||
|
||||
|
||||
# 第二组 芯片信息显示列表
|
||||
s.dataTreeview = ttk.Treeview(s.win, column=('1', '2', '3', '4', '5', '6', '7', '8'), show='headings')
|
||||
#s.dataTreeview.place(x=10, y=10, width=660, height=350)
|
||||
s.dataTreeview.grid(row=1, column=0, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.dataTreeview.column('1', width=80, anchor="center")
|
||||
s.dataTreeview.column('2', width=80, anchor="center")
|
||||
s.dataTreeview.column('3', width=80, anchor="center")
|
||||
s.dataTreeview.column('4', width=80, anchor="center")
|
||||
s.dataTreeview.column('5', width=80, anchor="center")
|
||||
s.dataTreeview.column('6', width=80, anchor="center")
|
||||
s.dataTreeview.column('7', width=80, anchor="center")
|
||||
s.dataTreeview.column('8', width=80, anchor="center")
|
||||
# 头显示
|
||||
s.dataTreeview.heading('1', text='型号/参数')
|
||||
s.dataTreeview.heading('2', text='品牌')
|
||||
s.dataTreeview.heading('3', text='需求量')
|
||||
s.dataTreeview.heading('4', text='需求价格')
|
||||
s.dataTreeview.heading('5', text='分销商')
|
||||
s.dataTreeview.heading('6', text='库存')
|
||||
s.dataTreeview.heading('7', text='价格')
|
||||
s.dataTreeview.heading('8', text='是否符合需求')
|
||||
|
||||
# 显示并刷新数据库列表
|
||||
s.showAllInfo(s.dataTreeview,None)
|
||||
|
||||
|
||||
# 第三组 :邮件信息
|
||||
s.group_email= tk.LabelFrame(s.win, text="email") #创建Frame一组
|
||||
s.group_email.grid(row=2, column=0, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.server_addr=tk.Label(s.group_email, text="SMTP服务器地址:")
|
||||
s.server_addr.grid(row=0, column=0, padx=10, pady=10, sticky="w") #创建“SMTP服务器地址”字样的Label
|
||||
s.server_addr_entry = tk.Entry(s.group_email,text='', width=30) #创建SMTP服务器地址输入框
|
||||
s.server_addr_entry.grid(row=0, column=1, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.server_port=tk.Label(s.group_email, text="端口:")
|
||||
s.server_port.grid(row=0, column=1, padx=90, pady=10, sticky="e") #创建“SMTP服务器地址”字样的Label
|
||||
s.server_port_entry = tk.Entry(s.group_email,text='', width=10) #创建SMTP服务器地址输入框
|
||||
s.server_port_entry.grid(row=0, column=1, padx=10, pady=10, sticky="e")
|
||||
|
||||
s.sender_addr=tk.Label(s.group_email, text="发件人地址:")
|
||||
s.sender_addr.grid(row=1, column=0, padx=10, pady=10, sticky="w") #创建“发件人地址”字样的Label
|
||||
s.sender_addr_entry = tk.Entry(s.group_email,text='', width=50) #创建发件人地址输入框
|
||||
s.sender_addr_entry.grid(row=1, column=1, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.sender_passwd=tk.Label(s.group_email, text="密码(或授权码):")
|
||||
s.sender_passwd.grid(row=2, column=0, padx=10, pady=10, sticky="w") #创建“发件人地址”字样的Label
|
||||
s.sender_passwd_entry = tk.Entry(s.group_email,text='', width=50, show='*') #创建发件人地址输入框
|
||||
s.sender_passwd_entry.grid(row=2, column=1, padx=10, pady=10, sticky="w")
|
||||
|
||||
s.receiver_addr=tk.Label(s.group_email, text="收件人(逗号隔开):")
|
||||
s.receiver_addr.grid(row=3, column=0, padx=10, pady=10, sticky="w") #创建“发件人地址”字样的Label
|
||||
s.receiver_addr_entry = tk.Entry(s.group_email,text='', width=50) #创建发件人地址输入框
|
||||
s.receiver_addr_entry.grid(row=3, column=1, padx=10, pady=10, sticky="w")
|
||||
|
||||
# “发送邮件”按钮
|
||||
s.send_email_button = tk.Button(s.group_email, text="发送邮件", command=s.send_email)
|
||||
s.send_email_button.grid(row=0, column=2, padx=10, pady=10, sticky="e")
|
||||
|
||||
# 第四组 自动运行
|
||||
s.group_autorun= tk.LabelFrame(s.win, text="autoRun")
|
||||
s.group_autorun.grid(row=2, column=0, padx=10, pady=10, sticky="se")
|
||||
#s.CheckButtonVar = tk.StringVar()
|
||||
s.check_button_text = StringVar()
|
||||
s.check_button_text.set('当前未自动搜索')
|
||||
s.check_button_value = IntVar()
|
||||
s.run_check_button = tk.Checkbutton(s.group_autorun, text="当前未自动搜索",variable = s.check_button_value, textvariable = s.check_button_text, state='normal',command=s.auto_search)
|
||||
s.run_check_button.grid(row=0, column=0, padx=10, pady=10, sticky="w")# sticky="e")
|
||||
|
||||
s.mail_check_button_value = IntVar()
|
||||
s.mail_check_button = tk.Checkbutton(s.group_autorun, text="符合需求则邮件",variable = s.mail_check_button_value,onvalue = 1, offvalue = 0, state='normal')
|
||||
s.mail_check_button.grid(row=1, column=0, padx=10, pady=10, sticky="w")# sticky="e")
|
||||
|
||||
# s.run_background_button = tk.Button(s.win, text="后台运行", command=s.run_gackground)
|
||||
# s.run_background_button.grid(row=2, column=0, padx=10, pady=10, sticky="se")
|
||||
|
||||
# # 日志框
|
||||
s.log_data_Text = scrolledtext.ScrolledText(s.win, width=90, height=9, relief="solid")
|
||||
s.log_data_Text.grid(row=3, column=0, padx=10, pady=10, sticky="w")
|
||||
sys.stdout = out.StdoutRedirector(s.log_data_Text)
|
||||
|
||||
s.get_mail_config_info()
|
||||
|
||||
##去除“最小化到任务托盘”的功能,目前这功能会使得“查看桌面”的快捷键和鼠标最右下角出现问题
|
||||
#s.win.bind("<Unmap>", lambda event: s.Hidden_window() if s.win.state() == 'iconic' else False) #窗口最小化判断,可以说是调用最重要的一步
|
||||
#s.win.protocol('WM_DELETE_WINDOW', s.exit) #点击Tk窗口关闭时直接调用s.exit,不使用默认关闭
|
||||
##win32gui.ShowWindow(win, 0 )
|
||||
|
||||
# 单独创建一个线程用于自动运行和发送邮件
|
||||
s.auto_run_thread = threading.Thread(target=s.schedule_stsk)
|
||||
s.auto_run_thread.start()
|
||||
# # s.auto_run_thread.join()
|
||||
|
||||
s.win.mainloop()
|
||||
s.running_tk_win = False
|
||||
s.auto_run_thread.join()
|
||||
# #tk窗口
|
||||
# s.root = tk.Tk()
|
||||
# s.root.bind("<Unmap>", lambda event: s.Hidden_window() if s.root.state() == 'iconic' else False) #窗口最小化判断,可以说是调用最重要的一步
|
||||
# s.root.protocol('WM_DELETE_WINDOW', s.exit) #点击Tk窗口关闭时直接调用s.exit,不使用默认关闭
|
||||
# s.root.resizable(0,0) #锁定窗口大小不能改变
|
||||
# s.root.mainloop()
|
||||
|
||||
def exit(s, _sysTrayIcon = None):
|
||||
s.win.destroy()
|
||||
#print ('exit...')
|
||||
|
||||
def get_mail_config_info(s):
|
||||
cfg.touch_config_file() #
|
||||
s.server_addr_entry.insert(0, cfg.getConfig('email','host'))
|
||||
s.server_port_entry.insert(0, cfg.getConfig('email','port'))
|
||||
s.sender_addr_entry.insert(0, cfg.getConfig('email','sender'))
|
||||
s.sender_passwd_entry.insert(0, cfg.getConfig('email','password'))
|
||||
s.receiver_addr_entry.insert(0, cfg.getConfig('email','receiver'))
|
||||
|
||||
# mail_host = "smtp.qq.com" #SMTP服务器地址
|
||||
# mail_sender = "lzm0819@qq.com" #账号
|
||||
# mail_passwd = "zzqkxlaqroidjixx" #密码(或者是授权码!如qq邮箱需要在设置里获取授权码!)
|
||||
# mail_receives="1150732137@qq.com,jimyliu@qq.com" #收件人,多个收件人地址用英文逗号隔开
|
||||
def send_email(s):
|
||||
path = s.file_path_entry.get()
|
||||
mail_host = s.server_addr_entry.get()
|
||||
mail_port = s.server_port_entry.get()
|
||||
mail_sender = s.sender_addr_entry.get()
|
||||
mail_passwd = s.sender_passwd_entry.get()
|
||||
mail_receives = s.receiver_addr_entry.get()
|
||||
if path and mail_host and mail_port and mail_sender and mail_passwd and mail_receives:
|
||||
smail.send_email_with_attachment(path,mail_host,mail_port,mail_sender,mail_passwd,mail_receives)
|
||||
cfg.setConfig('chipForm','path',path)
|
||||
cfg.setConfig('email','host',mail_host)
|
||||
cfg.setConfig('email','port',mail_port)
|
||||
cfg.setConfig('email','sender',mail_sender)
|
||||
cfg.setConfig('email','password',mail_passwd)
|
||||
cfg.setConfig('email','receiver',mail_receives)
|
||||
else:
|
||||
print(out.Time(),"Warn:"+"请选择芯片表格并正确填写邮件信息!")
|
||||
messagebox.showwarning("Warning","请选择芯片表格并正确填写邮件信息!")
|
||||
|
||||
def auto_search(s):
|
||||
# 改变Checkbutton的显示值
|
||||
if s.check_button_value.get() == 1:
|
||||
path = s.file_path_entry.get()
|
||||
if path !="":
|
||||
s.run_check_button.select()
|
||||
s.check_button_text.set('自动搜索中 ...... ')
|
||||
|
||||
# 单独创建一个线程用于自动运行和发送邮件
|
||||
# s.auto_run_thread = threading.Thread(target=s.schedule_stsk)
|
||||
# s.auto_run_thread.start()
|
||||
# s.auto_run_thread.join()
|
||||
else:
|
||||
s.run_check_button.deselect()
|
||||
s.check_button_text.set('当前未自动搜索')
|
||||
print(out.Time(),"Warn:"+"请选择芯片表格或正确填写表格路径!")
|
||||
messagebox.showwarning("Warning","请选择芯片表格或正确填写表格路径!")
|
||||
else:
|
||||
s.run_check_button.deselect()
|
||||
s.check_button_text.set('当前未自动搜索')
|
||||
|
||||
# def auto_mail(s):
|
||||
# if s.mail_check_button_value.get() == 1:
|
||||
# s.send_email()
|
||||
# else:
|
||||
# None
|
||||
|
||||
def schedule_stsk(s):
|
||||
# 当前执行一次,且以后每两小时执行一次
|
||||
schedule.every(2).hours.do(s.auto_run)
|
||||
#schedule.every(2).hour.until("18:00").do(s.auto_run))
|
||||
#schedule.every(2).minutes.do(s.auto_run)
|
||||
while s.running_tk_win :
|
||||
schedule.run_pending()
|
||||
time.sleep(10)
|
||||
|
||||
|
||||
def auto_run(s):
|
||||
# 如果勾选了自动运行,且当前未运行搜索,就去搜索
|
||||
if (s.check_button_value.get() == 1) and (s.searching_state == False):
|
||||
s.searching_state == True # searching_state相当于锁
|
||||
get_msg_state,match_request_state = s.get_chips_msg()
|
||||
s.searching_state == False
|
||||
# 勾选了“符合条件则邮件”,且搜索信息成功,且符合需求量及价格,就发邮件
|
||||
if (s.mail_check_button_value.get() == 1) and get_msg_state and match_request_state:
|
||||
s.send_email()
|
||||
|
||||
|
||||
def get_file_path(s):
|
||||
file_path = filedialog.askopenfilename(title="Select A File", filetypes=(
|
||||
("Microsoft Excle 文件", "*.xlsx"), ("CSV", "*.csv")))
|
||||
s.file_path_entry.delete(0, 'end')
|
||||
s.file_path_entry.insert(0, file_path) #写入value
|
||||
#chipmsg_excle_path = file_path
|
||||
if file_path != "":
|
||||
#s.get_msg_button.config(state="normal")
|
||||
chip_mfg_list=rwsht.read_excle_get_chips_list("input",file_path)
|
||||
if chip_mfg_list:
|
||||
print(out.Time(),"Info:"+"获取待搜索芯片列表成功。")
|
||||
s.showAllInfo(s.dataTreeview,chip_mfg_list)
|
||||
else:
|
||||
print(out.Time(),"Warn:"+"芯片型号未按顺序填写或列表为空!")
|
||||
else:
|
||||
print(out.Time(),"Warn:"+"未选择excle表格!")
|
||||
return file_path
|
||||
|
||||
def get_chips_msg(s):
|
||||
get_msg_state = False
|
||||
match_request_state = False
|
||||
path = s.file_path_entry.get()
|
||||
if path != "":
|
||||
chip_mfg_list=rwsht.read_excle_get_chips_list("input",path)
|
||||
if chip_mfg_list != []:
|
||||
#print(out.Time(),"获取待搜索芯片列表成功。")
|
||||
print(out.Time(),"Info:"+"开始搜索...")
|
||||
all_chips_list,match_request_state = getchip.serch_all_chips_from_list(chip_mfg_list)
|
||||
#print(out.Time(),all_chips_list)
|
||||
if all_chips_list != []:
|
||||
print(out.Time(),"Info:"+"搜索芯片列表信息完成。")
|
||||
write_lines=rwsht.write_chips_msg_to_excle(path,all_chips_list)
|
||||
if write_lines != 0:
|
||||
print(out.Time(),"Info:"+"保存芯片库存价格等信息成功。")
|
||||
chip_output_list=rwsht.read_excle_get_chips_list("output",path)
|
||||
s.showAllInfo(s.dataTreeview,chip_output_list)
|
||||
get_msg_state = True
|
||||
#messagebox.showwarning("Warning","表格信息显示不全,详细信息请参考excle文档!")
|
||||
print(out.Time(),"Warn:"+"表格预览显示不完整,详细信息请参考excle文档!")
|
||||
else:
|
||||
print(out.Time(),"Warn:"+"保存芯片库存价格等信息失败!")
|
||||
else:
|
||||
print(out.Time(),"Warn:"+"搜索芯片信息失败!")
|
||||
else:
|
||||
#print(out.Time(),"芯片型号未按顺序填写或列表为空!")
|
||||
None
|
||||
else:
|
||||
print(out.Time(),"Warn:"+"文件路径为空!")
|
||||
messagebox.showwarning("Warning","文件路径为空!")
|
||||
return get_msg_state,match_request_state
|
||||
|
||||
#设置窗口宽高,以及窗口在屏幕居中显示
|
||||
def setWindowCenter(s,root, width, height):
|
||||
screenwidth = root.winfo_screenwidth() # 获取显示屏宽度
|
||||
screenheight = root.winfo_screenheight() # 获取显示屏高度
|
||||
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) # 设置窗口居中参数
|
||||
root.geometry(size) # 让窗口居中显示
|
||||
|
||||
# 显示函数
|
||||
def showAllInfo(s,dataTreeview_,list):
|
||||
# 先删除显示列表
|
||||
if list:
|
||||
x = dataTreeview_.get_children()
|
||||
for item in x:
|
||||
dataTreeview_.delete(item)
|
||||
for item in range(len(list)):
|
||||
dataTreeview_.insert("", item, text="line1", values=list[item])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
Main = _Main()
|
||||
Main.main()
|
||||
BIN
code_generator/backup/vsomeip_0529.zip
Normal file
BIN
code_generator/backup/vsomeip_0529.zip
Normal file
Binary file not shown.
45
code_generator/backup/vsomeip_client.json
Normal file
45
code_generator/backup/vsomeip_client.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"unicast" : "192.168.225.25",
|
||||
"logging" :
|
||||
{
|
||||
"level" : "debug",
|
||||
"console" : "true",
|
||||
"file" : { "enable" : "true", "path" : "/var/log/vsomeip.log" },
|
||||
"dlt" : "true"
|
||||
},
|
||||
"applications" :
|
||||
[
|
||||
{
|
||||
"name" : "ag_client",
|
||||
"id" : "0x1343"
|
||||
}
|
||||
],
|
||||
"clients" :
|
||||
[
|
||||
{
|
||||
"service" : "0x5034",
|
||||
"instance" : "0x6034",
|
||||
"unreliable" : "30509"
|
||||
},
|
||||
{
|
||||
"service" : "0x5042",
|
||||
"instance" : "0x6042",
|
||||
"reliable" : "30609"
|
||||
}
|
||||
],
|
||||
"routing" : "ag_client",
|
||||
"service-discovery" :
|
||||
{
|
||||
"enable" : "true",
|
||||
"multicast" : "239.71.0.2",
|
||||
"port" : "30490",
|
||||
"protocol" : "udp",
|
||||
"initial_delay_min" : "10",
|
||||
"initial_delay_max" : "100",
|
||||
"repetitions_base_delay" : "100",
|
||||
"repetitions_max" : "3",
|
||||
"ttl" : "3",
|
||||
"cyclic_offer_delay" : "2000",
|
||||
"request_response_delay" : "100"
|
||||
}
|
||||
}
|
||||
732
code_generator/someip_app/read_excel.py
Normal file
732
code_generator/someip_app/read_excel.py
Normal file
@@ -0,0 +1,732 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
===============================================================
|
||||
Python模块:Python操作excel(.xlsx)封装类MyPyXlsToXlsx、myPyXwBook和myPyXwSheet
|
||||
Date:2022年02月07日
|
||||
我的博客:https://datutu.blog.csdn.net/
|
||||
===============================================================
|
||||
"""
|
||||
import re
|
||||
import xlwings as xw
|
||||
from openpyxl.utils import get_column_letter
|
||||
import os
|
||||
import os.path
|
||||
|
||||
|
||||
class MyPyXlsToXlsx:
|
||||
"""
|
||||
类功能: Python使用xlwings操作将xls文件转换为xlsx文件格式类
|
||||
"""
|
||||
|
||||
def __init__(self, strOpenFilePath: str):
|
||||
xlsFilePath = strOpenFilePath
|
||||
# 文件存在就加载,不存在就创建工作簿。
|
||||
if os.path.exists(xlsFilePath):
|
||||
# 文件存在就加载,加载失败就报错。
|
||||
try:
|
||||
app = xw.App(visible=False, add_book=False)
|
||||
app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。 默认为 True。
|
||||
app.screen_updating = False # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。
|
||||
workbook = app.books.open(xlsFilePath) # 打开现有excel
|
||||
workbook.api.SaveAs(xlsFilePath + "x", FileFormat=51) # 参数 51 为xlsx格式;56为 Excel 97-2003的xls版本
|
||||
app.kill() # 使用kill()关闭进程
|
||||
os.remove(xlsFilePath) # 删除老的xls文件
|
||||
except IOError:
|
||||
print("加载xls文件失败!请检查!")
|
||||
else:
|
||||
print("已成功将xls文件转换为xlsx文件!!!\n")
|
||||
else:
|
||||
print("加载的xls文件不存在!请检查!")
|
||||
|
||||
|
||||
class myPyXwBook:
|
||||
"""
|
||||
类功能: Python使用xlwings操作excel(.xlsx)封装类myPyXwBook
|
||||
"""
|
||||
def __init__(self, strOpenFilePath: str):
|
||||
"""
|
||||
:function: 初始化
|
||||
:param strOpenFilePath: 打开的文件绝对路径
|
||||
"""
|
||||
self.strFilePath = strOpenFilePath
|
||||
self.app = None
|
||||
# 工作簿对象
|
||||
self.workbook = None
|
||||
|
||||
# 文件存在就加载,不存在就创建工作簿。
|
||||
if os.path.exists(self.strFilePath):
|
||||
# 文件存在就加载,加载失败就报错。
|
||||
try:
|
||||
self.app = xw.App(visible=False, add_book=False)
|
||||
self.app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。 默认为 True。
|
||||
self.app.screen_updating = False # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。
|
||||
self.workbook = self.app.books.open(self.strFilePath)
|
||||
except IOError:
|
||||
print("加载excel文件失败!请检查!")
|
||||
else:
|
||||
print("已成功加载excel文件(.xlsx)文件!!!\n")
|
||||
else:
|
||||
print("加载excel文件不存在!自动创建文件!")
|
||||
self.app = xw.App(visible=False, add_book=False)
|
||||
self.app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。 默认为 True。
|
||||
self.app.screen_updating = False # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。
|
||||
self.workbook = self.app.books.add() # 创建工作簿
|
||||
|
||||
def openWorkSheet(self, strSheetName: str):
|
||||
"""
|
||||
:function: 打开工作表功能
|
||||
:param strSheetName: 要打开的工作表名称
|
||||
:return: 返回打开的工作表Worksheet对象
|
||||
"""
|
||||
worksheet = None # 工作表对象
|
||||
listSheetNames = []
|
||||
|
||||
for i in range(0, len(self.workbook.sheets)):
|
||||
listSheetNames.append(self.workbook.sheets[i].name)
|
||||
|
||||
if strSheetName in listSheetNames:
|
||||
worksheet = self.workbook.sheets[strSheetName]
|
||||
else:
|
||||
print("表单名称在当前excel文件中不存在,请检查表单名称!")
|
||||
|
||||
return worksheet
|
||||
|
||||
def addSheet(self, strSheetName: str):
|
||||
"""
|
||||
:function: 新建或添加工作表
|
||||
:param strSheetName: 工作表名称
|
||||
"""
|
||||
self.workbook.sheets.add(strSheetName)
|
||||
|
||||
def deleteSheet(self, strSheetName: str):
|
||||
"""
|
||||
:function: 删除工作表
|
||||
:param strSheetName: 工作表名称
|
||||
"""
|
||||
|
||||
if strSheetName in self.getAllSheetNames():
|
||||
self.workbook.sheets[strSheetName].delete()
|
||||
else:
|
||||
print("表单名称在当前excel文件中不存在,请检查表单名称!")
|
||||
|
||||
def getAllSheetNames(self):
|
||||
"""
|
||||
:function: 获取一个工作簿所有工作表名称
|
||||
"""
|
||||
listSheetNames = []
|
||||
|
||||
for i in range(0, len(self.workbook.sheets)):
|
||||
listSheetNames.append(self.workbook.sheets[i].name)
|
||||
|
||||
return listSheetNames
|
||||
|
||||
def getActiveSheet(self):
|
||||
"""
|
||||
:function: 获取当前活跃的sheet
|
||||
"""
|
||||
return self.workbook.sheets.active
|
||||
|
||||
def saveWorkBookData(self):
|
||||
"""
|
||||
:function: 保存工作簿数据
|
||||
"""
|
||||
self.workbook.save(self.strFilePath)
|
||||
|
||||
def saveAsWorkBookData(self, strNewFilePath: str):
|
||||
"""
|
||||
:function: 另存为工作簿数据
|
||||
:param strNewFilePath: 新的工作簿名称
|
||||
"""
|
||||
self.workbook.save(strNewFilePath)
|
||||
|
||||
def closeWorkBook(self):
|
||||
"""
|
||||
:function: 关闭工作簿
|
||||
"""
|
||||
# 关闭此工作簿
|
||||
self.workbook.close()
|
||||
# 关闭app
|
||||
self.app.quit()
|
||||
|
||||
|
||||
class myPyXwSheet:
|
||||
"""
|
||||
类功能: Python使用xlwings操作excel(.xlsx)工作表封装类myPyXwSheet
|
||||
"""
|
||||
def __init__(self, worksheet):
|
||||
# 工作表对象
|
||||
self.worksheet = worksheet
|
||||
|
||||
def insertRows(self, strRowsRange):
|
||||
"""
|
||||
:function: 在strRowRange范围上方插入多行或一行
|
||||
:param strRowsRange: 例,
|
||||
在第3行上方插入1行,即'3'
|
||||
在第3行和第4行上方插入2行,即'3:4'
|
||||
"""
|
||||
self.worksheet.api.Rows(strRowsRange).Insert()
|
||||
|
||||
def deleteRows(self, strCellsRange: str):
|
||||
"""
|
||||
:function: 删除多行或一行
|
||||
:param strCellsRange: 例,
|
||||
删除第4行和第5行,即'4:5'
|
||||
删除第4行,即'4'
|
||||
"""
|
||||
self.worksheet.range(strCellsRange).api.EntireRow.Delete()
|
||||
|
||||
def insertCols(self, strColsRange: str):
|
||||
"""
|
||||
:function: 在strColsRange范围处(左侧)插入多列或一列
|
||||
:param strColsRange: 例,
|
||||
在第C列处插入1列,即'C'
|
||||
在第C列和第D列处插入2列,即'C:D'
|
||||
"""
|
||||
self.worksheet.api.Columns(strColsRange).Insert()
|
||||
|
||||
def deleteCols(self, strColsRange):
|
||||
"""
|
||||
:function: 删除多列或一列
|
||||
:param strColsRange: 单元格范围,例,'C:D'或'C'
|
||||
"""
|
||||
self.worksheet.range(strColsRange).api.EntireColumn.Delete()
|
||||
|
||||
def getSheetName(self):
|
||||
"""
|
||||
:function: 获取工作表名称
|
||||
"""
|
||||
return self.worksheet.name
|
||||
|
||||
def getMaxRows(self):
|
||||
"""
|
||||
:function: 获取工作表最大行数
|
||||
"""
|
||||
return self.worksheet.used_range.last_cell.row
|
||||
|
||||
def getUsedRangeData(self):
|
||||
"""
|
||||
:function: 获取工作表已使用区域的全部数据
|
||||
:备注:返回的是二维列表,例,[[1,2],[3,6]
|
||||
"""
|
||||
return self.worksheet.used_range.value
|
||||
|
||||
def getMaxColumns(self):
|
||||
"""
|
||||
:function: 获取工作表最大列数
|
||||
"""
|
||||
return self.worksheet.used_range.last_cell.column
|
||||
|
||||
def renameSheet(self, strNewSheetName: str):
|
||||
"""
|
||||
:function: 重命名工作表
|
||||
:param strNewSheetName: 新的工作表名称
|
||||
"""
|
||||
self.worksheet.name = strNewSheetName
|
||||
|
||||
def clearSheetContentsAndFormat(self):
|
||||
"""
|
||||
:function: 清空表中所有内容和格式
|
||||
"""
|
||||
self.worksheet.clear()
|
||||
|
||||
def clearSheetContents(self):
|
||||
"""
|
||||
:function: 清除工作表的内容,但保留格式
|
||||
"""
|
||||
self.worksheet.clear_contents()
|
||||
|
||||
def setCellFormula(self, strCellRange: str, strFormat: str):
|
||||
"""
|
||||
:function: 设置单元格公式
|
||||
:param strCellRange: 单元格范围,例,‘C6’
|
||||
:param strFormat: 单元格数字格式,例,'=SUM(B6:B7)'
|
||||
"""
|
||||
self.worksheet[strCellRange].formula = strFormat
|
||||
|
||||
def getCellFormula(self, strCellRange: str):
|
||||
"""
|
||||
:function: 获取单元格公式
|
||||
:param strCellRange: 单元格范围,例,‘C6’
|
||||
"""
|
||||
return self.worksheet[strCellRange].formula_array
|
||||
|
||||
def setCellNumberFormat(self, strCellRange: str, strNumberFormat: str):
|
||||
"""
|
||||
:function: 设置单元格数字格式
|
||||
:param strCellRange: 单元格范围,例,‘C6’
|
||||
:param strNumberFormat: 单元格数字格式,例,'"¥"#,##0.00;-"¥"#,##0.00'
|
||||
或人民币大写:'[DBNum2][$RMB]G/通用格式;[红色][DBNum2][$RMB]G/通用格式'
|
||||
"""
|
||||
self.worksheet[strCellRange].number_format = strNumberFormat
|
||||
|
||||
def setRowHeight(self, nRowIndex: int, valRowHeight):
|
||||
"""
|
||||
:function: 设置行高
|
||||
:param nRowIndex: 行号,取值1,2...整数
|
||||
:param valRowHeight: 行高度值,0~409之间的整数或浮点数
|
||||
:return: 设置成功,返回True;否则反
|
||||
"""
|
||||
# 类型检测
|
||||
if type(nRowIndex) is not int:
|
||||
print("nRowNumber 数据类型错误!请确认为整数类型")
|
||||
return False
|
||||
|
||||
if type(valRowHeight) is not int and type(valRowHeight) is not float:
|
||||
print("cur_num 数据类型错误!请确认为整数类型,或者为浮点数类型!")
|
||||
return False
|
||||
|
||||
# 数字是否出范围
|
||||
if 0 <= valRowHeight <= 409:
|
||||
self.worksheet.range('A' + str(nRowIndex)).row_height = valRowHeight
|
||||
return True
|
||||
else:
|
||||
print("行高度值,超出了目前最大行高度!")
|
||||
return False
|
||||
|
||||
def setColumnWidth(self, strColumnIndex: str, valColumnWidth):
|
||||
"""
|
||||
:function: 设置列宽
|
||||
:param strColumnIndex: 列索引,取值整数1,2...或者'A','B'...
|
||||
:param valColumnWidth: 列宽度值,0~255之间的整数或浮点数
|
||||
:return: 设置成功,返回True;否则反
|
||||
"""
|
||||
# 数字检测
|
||||
if type(strColumnIndex) is int:
|
||||
try:
|
||||
strColumnIndex = get_column_letter(strColumnIndex) # 列号转列字母
|
||||
except ValueError:
|
||||
print("ColumnIndex参数非法!请确认是输入数据为列索引字符串!")
|
||||
return False
|
||||
|
||||
if type(valColumnWidth) is not int and type(valColumnWidth) is not float:
|
||||
print("valColumnWidth 数据类型错误!请确认为整数类型,或者为浮点数类型!")
|
||||
return False
|
||||
|
||||
# 数字是否出范围
|
||||
if 0 <= valColumnWidth <= 255:
|
||||
self.worksheet.range(strColumnIndex + '1').column_width = valColumnWidth
|
||||
return True
|
||||
else:
|
||||
print("列宽度值,超出了目前最大列宽度!")
|
||||
return False
|
||||
|
||||
def setRowsHeight(self, strCellsRange: str, valRowHeight):
|
||||
"""
|
||||
:function: 设置多行行高
|
||||
:param strCellsRange: 例,单元格'A2:D5'或'A2'
|
||||
:param valRowHeight: 行高度值,0~409之间的整数或浮点数
|
||||
:return: 设置成功,返回True;否则反
|
||||
"""
|
||||
if type(valRowHeight) is not int and type(valRowHeight) is not float:
|
||||
print("cur_num 数据类型错误!请确认为整数类型,或者为浮点数类型!")
|
||||
return False
|
||||
|
||||
# 数字是否出范围
|
||||
if 0 <= valRowHeight <= 409:
|
||||
self.worksheet.range(strCellsRange).row_height = valRowHeight
|
||||
return True
|
||||
else:
|
||||
print("行高度值,超出了目前最大行高度!")
|
||||
return False
|
||||
|
||||
def setColumnsWidth(self, strCellsRange: str, valColumnWidth):
|
||||
"""
|
||||
:function: 设置多列列宽
|
||||
:param strCellsRange: 例,单元格'A2:D5'或'A2'
|
||||
:param valColumnWidth: 列宽度值,0~255之间的整数或浮点数
|
||||
:return: 设置成功,返回True;否则反
|
||||
"""
|
||||
if type(valColumnWidth) is not int and type(valColumnWidth) is not float:
|
||||
print("valColumnWidth 数据类型错误!请确认为整数类型,或者为浮点数类型!")
|
||||
return False
|
||||
|
||||
# 数字是否出范围
|
||||
if 0 <= valColumnWidth <= 255:
|
||||
self.worksheet.range(strCellsRange).column_width = valColumnWidth
|
||||
return True
|
||||
else:
|
||||
print("列宽度值,超出了目前最大列宽度!")
|
||||
return False
|
||||
|
||||
def getCellRowIndex(self, strCellRange: str):
|
||||
"""
|
||||
:function: 获取单元格的行标
|
||||
:param strCellRange: 例,单元格'A2'
|
||||
:return: 返回单元格的行标
|
||||
"""
|
||||
return self.worksheet.range(strCellRange).row
|
||||
|
||||
def getCellColIndex(self, strCellRange: str):
|
||||
"""
|
||||
:function: 获取单元格的列标
|
||||
:param strCellRange: 例,单元格'A2'
|
||||
:return: 返回单元格的列标
|
||||
"""
|
||||
return self.worksheet.range(strCellRange).column
|
||||
|
||||
def putDataByCell(self, strCellRange: str, Value):
|
||||
"""
|
||||
:function: 写入一个单元格数据功能
|
||||
:param strCellRange: 例,单元格'A2'
|
||||
:param Value: 写入指定单元格的数值
|
||||
"""
|
||||
self.worksheet.range(strCellRange).value = Value
|
||||
|
||||
def getDataByCell(self, strCellRange: str):
|
||||
"""
|
||||
:function: 读取一个单元格数据功能
|
||||
:param strCellRange: 例,单元格'A2'
|
||||
:备注:返回的数值默认是浮点数
|
||||
"""
|
||||
return self.worksheet.range(strCellRange).value
|
||||
|
||||
def putDataByRowOrCol(self, strCellsRange: str, listData: list):
|
||||
"""
|
||||
:function:写入一行或一列数据
|
||||
:param strCellsRange: 例,单元格范围,一行'A2:D2'或一列'A2:A4'或单元格'A2'
|
||||
:param listData: 一维数据列表,[]
|
||||
"""
|
||||
index = 0
|
||||
|
||||
for row in self.worksheet[strCellsRange]:
|
||||
for cell in row:
|
||||
if index >= len(listData):
|
||||
print("一维列表下表超出范围!")
|
||||
else:
|
||||
cell.value = listData[index]
|
||||
index += 1
|
||||
|
||||
def getDataByRowOrCol(self, strCellsRange: str) -> list:
|
||||
"""
|
||||
:function:读取一行或一列数据
|
||||
:param strCellsRange: 例,单元格范围,一行'A2:D2'或一列'A2:A4'或单元格'A2'
|
||||
:return:一维列表[],返回的数值默认是浮点数
|
||||
"""
|
||||
return self.worksheet.range(strCellsRange).value
|
||||
|
||||
def putDataByRow(self, strCellRange: str, listData: list):
|
||||
"""
|
||||
:function:以第一个单元格为起点,写入一行数据
|
||||
:param strCellRange: 例,单元格'A2'
|
||||
:param listData: 一维数据列表,[]
|
||||
:备注:
|
||||
# 将列表[1,2,3]储存在A1:C1中
|
||||
self.worksheet.range('A1').value=[1,2,3]
|
||||
# 等同于
|
||||
self.worksheet.range('A1:C1').value = [1,2,3]
|
||||
|
||||
"""
|
||||
self.worksheet.range(strCellRange).value = listData
|
||||
|
||||
def putDataByCol(self, strCellRange: str, listData: list):
|
||||
"""
|
||||
:function:以第一个单元格为起点,写入一列数据
|
||||
:param strCellRange: 例,单元格'A2'
|
||||
:param listData: 一维数据列表,[]
|
||||
:备注:
|
||||
# 将列表[1,2,3]储存在A1:A3中
|
||||
self.worksheet.range('A1').options(transpose=True).value=[1,2,3]
|
||||
"""
|
||||
self.worksheet.range(strCellRange).options(transpose=True).value = listData
|
||||
|
||||
def putDataByRows(self, strCellsRange: str, listData: list):
|
||||
"""
|
||||
:function:以第一个单元格为起点,多行输入就要用二维列表
|
||||
:param strCellsRange: 例,单元格'A2'
|
||||
:param listData: 二维数据列表,例,[[1,2],[3,4]]
|
||||
:备注:
|
||||
# 将2x2表格,即二维数组,储存在A1:B2中,如第一行1,2,第二行3,4
|
||||
self.worksheet.range('A1').options(expand='table').value=[[1,2],[3,4]]
|
||||
"""
|
||||
self.worksheet.range(strCellsRange).options(expand='table').value = listData
|
||||
|
||||
def getDataByRows(self, strCellsRange: str) -> list:
|
||||
"""
|
||||
:function:读取多行数据就要用二维列表
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
:return listData: 二维数据列表,例,[[1,2],[3,4]]
|
||||
:备注:返回的数值默认是浮点数
|
||||
"""
|
||||
return self.worksheet.range(strCellsRange).value
|
||||
|
||||
def getCellRowHeight(self, nRowIndex: int):
|
||||
"""
|
||||
:function:获取单元格行高度
|
||||
:param nRowIndex: 例,1, 2, 3,...
|
||||
:return: 返回单元格行高度
|
||||
"""
|
||||
return self.worksheet.range('A' + str(nRowIndex)).row_height
|
||||
|
||||
def getCellColWidth(self, strColumnIndex: str):
|
||||
"""
|
||||
:function:获取单元格列宽度
|
||||
:param strColumnIndex: 例,'A','B',...
|
||||
:return: 返回单元格列宽度
|
||||
"""
|
||||
fColWidth = self.worksheet.range(strColumnIndex + '1').column_width
|
||||
# 浮点数保留2位小数
|
||||
fNewColWidth = round(fColWidth, 2)
|
||||
return fNewColWidth
|
||||
|
||||
def setRowsAutofit(self, strCellsRange: str):
|
||||
"""
|
||||
:function:单元格范围的所有行宽度自适应
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
"""
|
||||
# 所有行宽度自适应
|
||||
self.worksheet.range(strCellsRange).rows.autofit()
|
||||
|
||||
def setColAutofit(self, strCellsRange: str):
|
||||
"""
|
||||
:function:单元格范围的所有列宽度自适应
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
"""
|
||||
# 所有行宽度自适应
|
||||
self.worksheet.range(strCellsRange).columns.autofit()
|
||||
|
||||
def setAutofit(self, strCellsRange: str):
|
||||
"""
|
||||
:function:单元格范围的所有行和列的宽度自适应
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
"""
|
||||
# 所有行宽度自适应
|
||||
self.worksheet.range(strCellsRange).autofit()
|
||||
|
||||
def getRangeRowsCount(self, strCellsRange: str):
|
||||
"""
|
||||
:function:获取单元格范围range的总行数
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
:return : 单元格范围range的总行数
|
||||
"""
|
||||
return self.worksheet.range(strCellsRange).rows.count
|
||||
|
||||
def getRangeColsCount(self, strCellsRange: str):
|
||||
"""
|
||||
:function:获取单元格范围range的总列数
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
:return : 单元格范围range的总列数
|
||||
"""
|
||||
return self.worksheet.range(strCellsRange).columns.count
|
||||
|
||||
def getRangeRows(self, strCellsRange: str) -> list:
|
||||
"""
|
||||
:function:获取单元格范围range的行对象列表
|
||||
:param strCellsRange: 例,单元格范围,'A2:C6'
|
||||
:return : 单元格范围range的行对象列表
|
||||
"""
|
||||
# 返回第一行数据列表
|
||||
# return self.worksheet.range(strCellsRange).rows[0].value
|
||||
# 返回单元格范围range的行对象列表
|
||||
return self.worksheet.range(strCellsRange).rows
|
||||
|
||||
def copyRange(self, strSourceCellsRange: str):
|
||||
"""
|
||||
:function:同一个工作表或不同工作表,把一个区域拷贝到剪贴板
|
||||
:param strSourceCellsRange: 例,源单元格范围,'A1:B3'
|
||||
"""
|
||||
# 参数:destination 设置目标区域,如果省略,rng区域会被拷贝到剪贴板上
|
||||
self.worksheet.range(strSourceCellsRange).copy(destination=None)
|
||||
|
||||
def pasteRange(self, strDestCellsRange: str, paste=None, operation=None, skip_blanks=False, transpose=False):
|
||||
"""
|
||||
:function:同一个工作表或不同工作表,把剪贴板拷贝到目的区域
|
||||
:param strDestCellsRange: 例,目的单元格范围,'D5'或'D5:E7'
|
||||
:param paste:
|
||||
参数:
|
||||
【paste】
|
||||
all_merging_conditional_formats(将粘贴所有内容,并且将合并条件格式)
|
||||
all(粘贴全部内容)
|
||||
all_except_borders(粘贴除边框外的全部内容)
|
||||
all_using_source_theme(使用源主题粘贴全部内容)
|
||||
column_widths(粘贴复制的列宽)
|
||||
comments(粘贴批注)
|
||||
formats(粘贴复制的源格式)
|
||||
formulas(粘贴公式)
|
||||
formulas_and_number_formats(粘贴公式和数字格式)
|
||||
validation(粘贴有效性)
|
||||
values(粘贴值)
|
||||
values_and_number_formats(粘贴值和数字格式)
|
||||
:param operation:
|
||||
参数:
|
||||
【operation】
|
||||
add(加)
|
||||
divide(除)
|
||||
multiply(乘)
|
||||
subtract(减)
|
||||
:param skip_blanks:
|
||||
参数:
|
||||
【skip_blanks】
|
||||
(bool, default False),设为 True 时忽略空白单元格
|
||||
:param transpose:
|
||||
参数:
|
||||
【transpose】
|
||||
(bool, default False),设为 True 时对行列转置
|
||||
"""
|
||||
# 将剪贴板里内容粘贴到指定区域
|
||||
self.worksheet.range(strDestCellsRange).paste(paste=paste, operation=operation,
|
||||
skip_blanks=skip_blanks, transpose=transpose)
|
||||
|
||||
def copyPasteRange(self, strSourceCellsRange: str, strDestCellsRange: str):
|
||||
"""
|
||||
:function:同一个工作表内,把一个区域复制粘贴到目的区域
|
||||
:param strSourceCellsRange: 例,源单元格范围,'A1:B3'
|
||||
:param strDestCellsRange: 例,目的单元格范围,'D5'或'D5:E7'
|
||||
"""
|
||||
'''同个表格复制、粘贴'''
|
||||
# 复制 A1 到 B3 之间单元格的值,粘贴到'D5'中
|
||||
self.worksheet.range(strSourceCellsRange).api.Copy(self.worksheet.range(strDestCellsRange).api)
|
||||
|
||||
def setCellMerge(self, strCellsRange: str):
|
||||
"""
|
||||
:function: 合并单元格
|
||||
:param strCellsRange: 例,单元格范围,'A1:D1'
|
||||
"""
|
||||
self.worksheet.range(strCellsRange).merge(across=False)
|
||||
|
||||
def setCellUnMerge(self, strCellsRange: str):
|
||||
"""
|
||||
:function: 拆分单元格
|
||||
:param strCellsRange: 例,单元格范围,'A1:D1'
|
||||
"""
|
||||
self.worksheet.range(strCellsRange).unmerge()
|
||||
|
||||
def setFontStyleByCells(self, strCellsRange: str, name="宋体", size=11,
|
||||
bold=False, italic=False, color=1):
|
||||
"""
|
||||
:function:设置一个或多个单元格的字体样式风格
|
||||
配置字体格式为:样式(宋体)、尺寸(11)、粗体(flase)、斜体(flase)、颜色(黑色)
|
||||
这里可以根据自己需求修改
|
||||
:param strCellsRange: 例,单元格范围'A29:F39'或单元格'A2'
|
||||
:param name: 字体名称
|
||||
:param size: 字体大小点数
|
||||
:param bold: True表示粗体
|
||||
:param italic: True表示斜体
|
||||
:param color: 字体颜色
|
||||
===字体颜色索引===
|
||||
无色 = -4142,自动 = -4105,黑色 = 1,
|
||||
白色 = 2 , 红色 = 3,鲜绿 = 4,
|
||||
蓝色 = 5 ,黄色 = 6,粉红 = 7,
|
||||
青绿 = 8 ,深红 = 9,绿色 = 10,
|
||||
深蓝 = 11,深黄 = 12 ,紫罗兰 = 13,
|
||||
青色 = 14,灰色25 = 15,褐色 = 53,
|
||||
橄榄 = 52,深绿 = 51,深青 = 49,
|
||||
靛蓝 = 55,灰色80 = 56,橙色 = 46,
|
||||
蓝灰 = 47,灰色50 = 16,浅橙色 = 45,
|
||||
酸橙色 = 43,海绿 = 50, 水绿色 = 42,
|
||||
浅蓝 = 41, 灰色40 = 48,金色 = 44,
|
||||
天蓝 = 33,梅红 = 54,玫瑰红 = 38,
|
||||
茶色 = 40,浅黄 = 36,浅绿 = 35,
|
||||
浅青绿 = 34,淡蓝 = 37,淡紫 = 39,
|
||||
"""
|
||||
cellRange = self.worksheet.range(strCellsRange)
|
||||
cellRange.api.Font.Name = name # 设置字体名称
|
||||
cellRange.api.Font.Size = size # 设置字体大小
|
||||
cellRange.api.Font.Bold = bold # 设置字体是否加粗
|
||||
cellRange.api.Font.Italic = italic # 设置字体是否斜体
|
||||
cellRange.api.Font.ColorIndex = color # 设置字体颜色
|
||||
|
||||
@staticmethod
|
||||
def strHorizontalAlignment_to_int(strHorizontalAlignment: str):
|
||||
"""
|
||||
:function:水平对齐方式字符串转int
|
||||
:param strHorizontalAlignment: 水平对齐方式字符串,'left'、'center'、'right'
|
||||
"""
|
||||
numbers = {
|
||||
'left': -4131,
|
||||
'center': -4108,
|
||||
'right': -4152
|
||||
}
|
||||
|
||||
return numbers.get(strHorizontalAlignment, None)
|
||||
|
||||
@staticmethod
|
||||
def strVerticalAlignment_to_int(strVerticalAlignment: str):
|
||||
"""
|
||||
:function:垂直对齐方式字符串转int
|
||||
:param strVerticalAlignment: 垂直对齐方式字符串,'top'、'center'、'bottom'、'wordwrap'
|
||||
"""
|
||||
numbers = {
|
||||
'top': -4160,
|
||||
'center': -4108,
|
||||
'bottom': -4107,
|
||||
'wordwrap': -4130
|
||||
}
|
||||
|
||||
return numbers.get(strVerticalAlignment, None)
|
||||
|
||||
def setAlignmentStyleByCells(self, strCellsRange: str, horizontal='center', vertical='center'):
|
||||
"""
|
||||
:function:设置一个或多个单元格的对齐方式
|
||||
:param strCellsRange: 例,单元格范围'A29:F39'或单元格'A2'
|
||||
:param horizontal: 水平对齐方式,'left'、'center'、'right'
|
||||
:param vertical: 垂直对齐方式,'top'、'center'、'bottom'、'wordwrap'
|
||||
"""
|
||||
cellRange = self.worksheet.range(strCellsRange)
|
||||
# -4108 水平居中。 -4131 靠左,-4152 靠右。
|
||||
cellRange.api.HorizontalAlignment = self.strHorizontalAlignment_to_int(horizontal)
|
||||
# -4108 垂直居中(默认)。 -4160 靠上,-4107 靠下, -4130 自动换行对齐。
|
||||
cellRange.api.VerticalAlignment = self.strVerticalAlignment_to_int(vertical)
|
||||
|
||||
def setBorderStyleByCell(self, strCellsRange: str, nBorderLineStyle: int = 1, nBorderWeight: int = 2):
|
||||
"""
|
||||
:function:设置一个或多个单元格的边框样式
|
||||
:param strCellsRange: 例,单元格范围'A29:F39'或单元格'A2'
|
||||
:param nBorderLineStyle: 【边框线型】,例,直线:1;虚线:2;点划线:4;双点划线:5
|
||||
:param nBorderWeight: 【边框粗细】,例,默认值2
|
||||
"""
|
||||
cellRange = self.worksheet.range(strCellsRange)
|
||||
|
||||
# Borders(7) 左边框
|
||||
cellRange.api.Borders(7).LineStyle = nBorderLineStyle # 设置边框线型
|
||||
cellRange.api.Borders(7).Weight = nBorderWeight # 设置边框粗细。
|
||||
|
||||
# Borders(8) 顶部框
|
||||
cellRange.api.Borders(8).LineStyle = nBorderLineStyle
|
||||
cellRange.api.Borders(8).Weight = nBorderWeight
|
||||
|
||||
# Borders(9) 底部边框
|
||||
cellRange.api.Borders(9).LineStyle = nBorderLineStyle
|
||||
cellRange.api.Borders(9).Weight = nBorderWeight
|
||||
|
||||
# Borders(10) 右边框
|
||||
cellRange.api.Borders(10).LineStyle = nBorderLineStyle
|
||||
cellRange.api.Borders(10).Weight = nBorderWeight
|
||||
|
||||
"""如果是一个区域的单元格,内部边框设置如下"""
|
||||
# Borders(11) 内部垂直边线
|
||||
cellRange.api.Borders(11).LineStyle = nBorderLineStyle
|
||||
cellRange.api.Borders(11).Weight = nBorderWeight
|
||||
|
||||
# Borders(12) 内部水平边线
|
||||
cellRange.api.Borders(12).LineStyle = nBorderLineStyle
|
||||
cellRange.api.Borders(12).Weight = nBorderWeight
|
||||
|
||||
|
||||
"""
|
||||
===============================================================
|
||||
主函数
|
||||
===============================================================
|
||||
"""
|
||||
if __name__ == '__main__':
|
||||
# excel文件绝对路径
|
||||
xlsxFilePath = os.path.join(os.getcwd() + "\\" + "someip.xlsx")
|
||||
|
||||
# 创建工作簿对象
|
||||
myXwBook = myPyXwBook(xlsxFilePath)
|
||||
# 创建工作表对象
|
||||
myXwSheet1 = myPyXwSheet(myXwBook.openWorkSheet("ServiceInterfaces"))
|
||||
|
||||
# 写入数据
|
||||
# myXwSheet1.putDataByRowOrCol('A1:A4', [1, 2, 3, 4])
|
||||
|
||||
# 读数据
|
||||
readData = myXwSheet1.getDataByCell('A2:C2')
|
||||
|
||||
print(readData)
|
||||
|
||||
# 保存工作簿数据
|
||||
myXwBook.saveWorkBookData()
|
||||
# 关闭工作簿
|
||||
myXwBook.closeWorkBook()
|
||||
|
||||
|
||||
54
code_generator/someip_app/sample_cfg_ids.hpp.template
Normal file
54
code_generator/someip_app/sample_cfg_ids.hpp.template
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
|
||||
/// @author liuzhimin@huaxu.com
|
||||
|
||||
/// @generate date: ${GENE_DATE}
|
||||
|
||||
/// [注:本文件为自动生成,不需要人为编辑,若有修改,请通过配置py脚本来重新生成.]
|
||||
|
||||
#ifndef VSOMEIP_${APP_NAME}_CFG_IDS_HPP
|
||||
#define VSOMEIP_${APP_NAME}_CFG_IDS_HPP
|
||||
|
||||
#define VSOMEIP_CONFIGURATION "${RUN_CONFIG_FILENAME}"
|
||||
#define APP_NAME "${APP_NAME}"
|
||||
|
||||
#define ${APP_NAME}_SERVICE_ID ${SERVICE_ID}
|
||||
#define ${APP_NAME}_INSTANCE_ID ${INSTANCE_ID}
|
||||
|
||||
#define USE_TCP ${USE_TCP}
|
||||
|
||||
#define OFFER_F_F_METHOD ${OFFER_F_F_METHOD}
|
||||
#define OFFER_R_R_METHOD ${OFFER_R_R_METHOD}
|
||||
#define OFFER_SETTER ${OFFER_SETTER}
|
||||
#define OFFER_GETTER ${OFFER_GETTER}
|
||||
#define OFFER_EVENT ${OFFER_EVENT}
|
||||
#define OFFER_FIELD_EVENT ${OFFER_FIELD_EVENT}
|
||||
|
||||
#if OFFER_F_F_METHOD
|
||||
#define ${APP_NAME}_${FF_METHOD_NAME}_F_F_METHOD_ID 0x0100 //0x0101,0x0102...
|
||||
#endif
|
||||
|
||||
#if OFFER_R_R_METHOD
|
||||
#define ${APP_NAME}_${RR_METHOD_NAME}_R_R_METHOD_ID 0x0200 //0x0201,0x0202...
|
||||
#endif
|
||||
|
||||
#if OFFER_GETTER
|
||||
#define ${APP_NAME}_${GET_METHOD_NAME}_GET_METHOD_ID 0x0300 //0x0301,0x0302...
|
||||
#endif
|
||||
|
||||
#if OFFER_SETTER
|
||||
#define ${APP_NAME}_${SET_METHOD_NAME}_SET_METHOD_ID 0x0400 //0x0401,0x0402...
|
||||
#endif
|
||||
|
||||
#if OFFER_EVENT
|
||||
#define ${APP_NAME}_${EVENTGROUP_NAME}_EVENTGROUP_ID 0x8100 //0x8200,0x8300...
|
||||
#define ${APP_NAME}_${EVENT_NAME}_EVENT_ID 0x8101 //0x8102,0x8103...
|
||||
#endif
|
||||
|
||||
#if OFFER_FIELD_EVENT
|
||||
#define ${APP_NAME}_${FIELD_EVENTGROUP_NAME}_FIELD_EVENTGROUP_ID 0x8800 //0x8900,0x8a00...
|
||||
#define ${APP_NAME}_${FIELD_EVENT_NAME}_FIELD_EVENT_ID 0x8801 //0x8802,0x8803...
|
||||
#endif
|
||||
|
||||
#endif // VSOMEIP_EXAMPLES_SAMPLE_CFG_IDS_HPP
|
||||
|
||||
BIN
code_generator/someip_app/someip.xlsx
Normal file
BIN
code_generator/someip_app/someip.xlsx
Normal file
Binary file not shown.
34
code_generator/someip_app/template.someip_ids.hpp
Normal file
34
code_generator/someip_app/template.someip_ids.hpp
Normal file
@@ -0,0 +1,34 @@
|
||||
/*============================================================================*/
|
||||
/* Copyright (C) huaxu (${YEAR}).
|
||||
*
|
||||
* All rights reserved. This software is huaxu property. Duplication
|
||||
* or disclosure without huaxu written authorization is prohibited.
|
||||
*
|
||||
* @file someip_ids.hpp
|
||||
* @brief head file of someip ids
|
||||
* @author ${AUTHOR}
|
||||
* @date ${TIME}
|
||||
*/
|
||||
/*============================================================================*/
|
||||
/*=======[R E V I S I O N H I S T O R Y]====================================*/
|
||||
/* <VERSION> <DATE> <AUTHOR> <REVISION LOG>
|
||||
* V0.0.1 ${DATE} ${AUTHOR} First version by auto generator
|
||||
*/
|
||||
/*============================================================================*/
|
||||
|
||||
#ifndef AG_VSOMEIP_IDS_HPP
|
||||
#define AG_VSOMEIP_IDS_HPP
|
||||
|
||||
/*=======[I N C L U D E S]====================================================*/
|
||||
|
||||
/*=======[M A C R O S]========================================================*/
|
||||
|
||||
${ALL_IDS}
|
||||
|
||||
/*=======[P A R A M T Y P E D E F]==========================================*/
|
||||
|
||||
/*=======[E X P O R T D A T A]==============================================*/
|
||||
|
||||
/*=======[E X P O R T F U N C T I O N D E C L A R A T I O N S]============*/
|
||||
|
||||
#endif // AG_VSOMEIP_IDS_HPP
|
||||
109
code_generator/someip_app/template.someip_service.cpp
Normal file
109
code_generator/someip_app/template.someip_service.cpp
Normal file
@@ -0,0 +1,109 @@
|
||||
/*============================================================================*/
|
||||
/* Copyright (C) huaxu (${YEAR}).
|
||||
*
|
||||
* All rights reserved. This software is huaxu property. Duplication
|
||||
* or disclosure without huaxu written authorization is prohibited.
|
||||
*
|
||||
* @file someip_service.cpp
|
||||
* @brief main entry of someip_service
|
||||
* @author ${AUTHOR}
|
||||
* @date ${TIME}
|
||||
*/
|
||||
/*============================================================================*/
|
||||
/*=======[R E V I S I O N H I S T O R Y]====================================*/
|
||||
/* <VERSION> <DATE> <AUTHOR> <REVISION LOG>
|
||||
* V0.0.1 ${DATE} ${AUTHOR} First version by auto generator
|
||||
*/
|
||||
/*============================================================================*/
|
||||
|
||||
/*=======[I N C L U D E S]====================================================*/
|
||||
|
||||
#include "someip_ids.hpp"
|
||||
#include "someip_type.hpp"
|
||||
#include "someip_service.hpp"
|
||||
#include <list>
|
||||
|
||||
using namespace vsomeip;
|
||||
/*=======[G L O B A L D A T A]==============================================*/
|
||||
|
||||
/*=======[M A C R O S]========================================================*/
|
||||
|
||||
/*=======[I N T E R N A L D A T A]==========================================*/
|
||||
|
||||
/*=======[L O C A L F U N C T I O N D E C L A R A T I O N S]==============*/
|
||||
|
||||
${ALL_FUNCS_DECLARATIONS}
|
||||
|
||||
/*=======[L O C A L F U N C T I O N I M P L E M E N T A T I O N S]========*/
|
||||
|
||||
${ALL_FUNCS_IMPLEMENTATIONS}
|
||||
|
||||
/*=======[G L O B A L F U N C T I O N I M P L E M E N T A T I O N S]======*/
|
||||
|
||||
|
||||
#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
|
||||
service *server_ptr(nullptr);
|
||||
void handle_signal(int _signal)
|
||||
{
|
||||
if (server_ptr != nullptr &&
|
||||
(_signal == SIGINT || _signal == SIGTERM
|
||||
|| _signal == SIGKILL))
|
||||
server_ptr->stop();
|
||||
}
|
||||
#endif
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
service server;
|
||||
|
||||
std::vector<offer_method_t> offer_methods;
|
||||
std::vector<offer_event_t> offer_events;
|
||||
std::vector<offer_service_t> my_services;
|
||||
|
||||
#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
|
||||
server_ptr = &server;
|
||||
signal(SIGINT, handle_signal);
|
||||
signal(SIGTERM, handle_signal);
|
||||
signal(SIGKILL, handle_signal);
|
||||
#endif
|
||||
offer_methods.clear();
|
||||
${ALL_OFFER_METHODS}
|
||||
|
||||
offer_events.clear();
|
||||
${ALL_OFFER_EVENTS}
|
||||
|
||||
my_services.clear();
|
||||
${ALL_OFFER_SERVICES}
|
||||
|
||||
if (server.init())
|
||||
{
|
||||
for (auto const&service: my_services){
|
||||
server.start_offer_service(service._service, service._instance,
|
||||
service._major, service._minor);
|
||||
}
|
||||
|
||||
for (auto const&method: offer_methods){
|
||||
server.start_offer_method(method._service,method._instance,method._method,method._get_response_data_func);
|
||||
}
|
||||
|
||||
for (auto const&event: offer_events){
|
||||
server.start_offer_event(event._service, event._instance, event._eventgroup,
|
||||
event._event, event._type, event._cycle, event._change_resets_cycle,
|
||||
event._update_on_change, event._epsilon_change_func,
|
||||
event._reliability);
|
||||
}
|
||||
|
||||
server.start(); //block function
|
||||
|
||||
// stop:
|
||||
for (auto const&service: my_services){
|
||||
server.stop_offer_service(service._service, service._instance,
|
||||
service._major, service._minor);
|
||||
}
|
||||
server.stop();
|
||||
return 0;
|
||||
}else{
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
158
code_generator/someip_app/template.someip_type.hpp
Normal file
158
code_generator/someip_app/template.someip_type.hpp
Normal file
@@ -0,0 +1,158 @@
|
||||
/*============================================================================*/
|
||||
/* Copyright (C) huaxu (2022).
|
||||
*
|
||||
* All rights reserved. This software is huaxu property. Duplication
|
||||
* or disclosure without huaxu written authorization is prohibited.
|
||||
*
|
||||
* @file someip_type.hpp
|
||||
* @brief head file of someip type defines
|
||||
* @author LiuZhimin
|
||||
* @date 2023-03-15 15:15:00
|
||||
*/
|
||||
/*============================================================================*/
|
||||
/*=======[R E V I S I O N H I S T O R Y]====================================*/
|
||||
/* <VERSION> <DATE> <AUTHOR> <REVISION LOG>
|
||||
* V0.0.1 20230315 Liuzhimin Initial Version
|
||||
*/
|
||||
/*============================================================================*/
|
||||
|
||||
#ifndef AG_VSOMEIP_TYPE_HPP
|
||||
#define AG_VSOMEIP_TYPE_HPP
|
||||
|
||||
/*=======[I N C L U D E S]====================================================*/
|
||||
|
||||
#include <string>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/*=======[M A C R O S]========================================================*/
|
||||
|
||||
/*=======[P A R A M T Y P E D E F]==========================================*/
|
||||
|
||||
${ALL_TYPES}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float Accel_x; //加速度计: 惯导X轴
|
||||
float Accel_y; //加速度计: 惯导Y轴
|
||||
float Accel_z; //加速度计: 惯导Z轴
|
||||
float Gyro_x; //陀螺: 惯导X轴
|
||||
float Gyro_y; //陀螺: 惯导Y轴
|
||||
float Gyro_z; //陀螺: 惯导Z轴
|
||||
bool IMU_Vaild; // IMU信号组有效性标志位
|
||||
bool IMU_Status; // IMU故障标志位
|
||||
float Acc_Bias_X; //加速度计x轴零偏
|
||||
float Acc_Bias_Y; //加速度计y轴零偏
|
||||
float Acc_Bias_Z; //加速度计z轴零偏
|
||||
float Gyro_Bias_X; //陀螺仪x轴零偏
|
||||
float Gyro_Bias_Y; //陀螺仪x轴零偏
|
||||
float Gyro_Bias_Z; //陀螺仪x轴零偏
|
||||
bool Bias_Valid; //零偏信号组有效性标志位
|
||||
uint32_t IMU_Tow; // GPS周内秒(ms),起点每周日的0时0点0分0秒,未同步恒为0
|
||||
uint16_t IMU_Week; // GPS周,起点为1980年1月6日0时0分0秒,未同步恒为0
|
||||
uint64_t IMU_SyncTime; //时间同步后系统unix时间戳,未同步恒为0
|
||||
uint8_t IMU_SyncStatus; //时间同步状态
|
||||
} imu_info_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float INS_GndSpd; // INS地向速度
|
||||
float INS_GndSpdStd; // INS地向速度标准差
|
||||
float INS_EastSpd; // INS东向速度
|
||||
float INS_EastSpdStd; // INS东向速度标准差
|
||||
float INS_NorthSpd; // INS北向速度
|
||||
float INS_NorthSpdStd; // INS北向速度标准差
|
||||
float INS_LocatingHght; // INS高度
|
||||
float INS_HghtStd; // INS高度标准差
|
||||
double INS_Longd; // INS经度
|
||||
float INS_LongdStd; // INS经度标准差
|
||||
double INS_Latd; // INS纬度
|
||||
float INS_LatdStd; // INS纬度标准差
|
||||
float INS_Yaw; // INS航向角
|
||||
float INS_YawStd; // INS航向角标准差
|
||||
float INS_Pitch; // INS俯仰角
|
||||
float INS_PitchStd; // INS俯仰角标准差
|
||||
float INS_Roll; // INS横滚角
|
||||
float INS_RollStd; // INS横滚角标准差
|
||||
bool INS_Valid; // INS_data信号组有效性标志位
|
||||
uint8_t INS_DR_Confidence; // INS DR推算数据置信度
|
||||
uint32_t INS_Tow; // GPS周内秒(ms),起点每周日的0时0点0分0秒,未同步恒为0
|
||||
uint16_t INS_Week; // GPS周,起点为1980年1月6日0时0分0秒,未同步恒为0
|
||||
uint64_t INS_SyncTime; //时间同步后系统时间戳,未同步恒为0
|
||||
uint8_t IMU_SyncStatus; //时间同步状态
|
||||
} ins_info_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool INS_PosIniSta; // INS位置初始化标志位
|
||||
bool INS_VelIniSta; // INS速度初始化标志位
|
||||
bool INS_HeadingIniSta; // INS航向初始化标志位
|
||||
bool INS_AttitudeIniSta; // INS姿态初始化标志位
|
||||
bool INS_INSIniSta; // INS总体初始化标志位
|
||||
bool INS_whlspdfusion_Status; // 轮速融合状态标志位
|
||||
uint16_t INS_Status; // INS故障标志位
|
||||
} ins_status_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t GNSS_NumSV; // GNSS收星数
|
||||
uint8_t GnssFlag_Pos; // GNSS定位解状态
|
||||
uint8_t GNSSRTKDly_HDM; // RTCM差分延迟
|
||||
double GNSS_Latitude; // GNSS纬度
|
||||
double GNSS_Longtitude; // GNSS经度
|
||||
float GNSS_LocatHeight; // GNSS海拔高
|
||||
float GNSS_Heading; // GNSS航向角
|
||||
float GNSS_Pitch; // GNSS俯仰角
|
||||
float GNSS_HorizontalSpd; // GNSS水平速度
|
||||
float GNSS_VerticalSpd; // GNSS垂直速度
|
||||
float GNSS_TrackTrue; // GNSS航迹角
|
||||
float GNSS_Std_Lat; // GNSS纬度_标准差
|
||||
float GNSS_Std_Lon; // GNSS经度_标准差
|
||||
float GNSS_Std_LocatHeight; // GNSS高度_标准差
|
||||
float GNSS_Std_Heading; // GNSS航向角_标准差
|
||||
float GNSS_Std_Pitch; // GNSS俯仰角_标准差
|
||||
float GNSS_Std_HorizontalSpd; // GNSS水平速度_标准差
|
||||
float GNSS_Std_VerticalSpd; // GNSS垂直速度_标准差
|
||||
float GNSS_Std_TrackTrue; // GNSS航迹角_标准差
|
||||
uint16_t GNSS_GDOP; // 几何精度因子
|
||||
uint16_t GNSS_PDOP; // 位置精度因子
|
||||
uint16_t GNSS_HDOP; // 水平精度因子
|
||||
uint16_t GNSS_HTDOP; // 水平和时间精度因子
|
||||
uint8_t SSR_Integrity; // SSR修正数据完好性
|
||||
bool GNSS_Valid; // GNSS_data信号组有效性标志位
|
||||
uint16_t GNSS_Week; // GPS周,起点为1980年1月6日0时0分0秒,未同步恒为0
|
||||
uint32_t GNSS_Tow; // GPS周内秒(ms),起点每周日的0时0点0分0秒,未同步恒为0
|
||||
uint64_t GNSS_SyncTime; // 时间同步后系统时间戳,未同步恒为0
|
||||
uint8_t IMU_SyncStatus; // 时间同步状态
|
||||
} gnss_info_t;
|
||||
|
||||
typedef std::string partNumber_id_t; //XX零件号
|
||||
typedef std::string software_id_t; //XX电子控制单元软件版本号
|
||||
typedef std::string software_id_supplier_t; //供应商电子控制单元软件版本号
|
||||
|
||||
typedef struct
|
||||
{
|
||||
partNumber_id_t partNumber_id;
|
||||
software_id_t software_id;
|
||||
software_id_supplier_t software_id_supplier;
|
||||
} part_info_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float Extrinsic_Roll; // 横滚角误差估计值
|
||||
float Extrinsic_Pitch; // 俯仰角误差估计值
|
||||
float Extrinsic_Yaw; // 偏航角误差估计值
|
||||
bool Extrinsic_Valid; // ExtParameter信号组有效性标志位
|
||||
uint32_t Extrinsic_Tow; // GPS周内秒(ms),起点每周日的0时0点0分0秒,未同步恒为0
|
||||
uint16_t Extrinsic_Week; // GPS周,起点为1980年1月6日0时0分0秒,未同步恒为0
|
||||
uint64_t Extrinsic_SyncTime; // 时间同步后系统时间戳,未同步恒为0
|
||||
uint8_t Extrinsic_SyncStatus; // 时间同步状态
|
||||
} ext_parameter_t;
|
||||
|
||||
typedef std::string gngga_info_t; //GNGGA定位数据
|
||||
|
||||
/*=======[E X P O R T D A T A]==============================================*/
|
||||
|
||||
/*=======[E X P O R T F U N C T I O N D E C L A R A T I O N S]============*/
|
||||
|
||||
#endif // AG_VSOMEIP_TYPE_HPP
|
||||
62
code_generator/someip_app/tmp.template
Normal file
62
code_generator/someip_app/tmp.template
Normal file
@@ -0,0 +1,62 @@
|
||||
##########################ids##############################
|
||||
## ${ALL_IDS}
|
||||
// ${SERVICE DESCRIPTION}
|
||||
#define ${SERVICE_NAME} ${SERVICE_ID} // Service ID
|
||||
#define ${INSTANCE_NAME} ${INSTANCE_ID} // Instance ID
|
||||
${METHODS}
|
||||
${EVENT_GROUPS}
|
||||
|
||||
##${METHODS}
|
||||
#define ${METHOD_NAME} ${METHOD_ID} // ${METHOD_TYPE}
|
||||
|
||||
##${EVENT_GROUPS}
|
||||
#define ${EVENTGROUP_NAME} ${EVENTGROUP_ID} // Event Group
|
||||
${EVENTS}
|
||||
|
||||
##${EVENTS}
|
||||
#define ${EVENT_NAME} ${EVENT_ID} // ${EVENT_TYPE}
|
||||
|
||||
|
||||
###########################types#############################
|
||||
## ${ALL_TYPES}
|
||||
// ${TYPE_DISCRIPTION}
|
||||
typedef ${CONSTRUCTION_TYPE} ${ALL_MEMBERS} ${DEFINE_TYPE};
|
||||
|
||||
## ${ALL_MEMBERS}
|
||||
if ${CONSTRUCTION_TYPE} == <BASE TYPE>
|
||||
${ALL_MEMBERS} == ''
|
||||
else if ${CONSTRUCTION_TYPE} == enum
|
||||
${ALL_MEMBERS} == """
|
||||
{
|
||||
${ENUM_MEMBERS}, // ${COMMENT}
|
||||
}"""
|
||||
else if ${CONSTRUCTION_TYPE} == struct/union/<FROM COLUMN A>
|
||||
${ALL_MEMBERS} == """
|
||||
{
|
||||
${CONSTRUCTION_MEMBERS}; // ${COMMENT}
|
||||
}"""
|
||||
|
||||
|
||||
###########################service#############################
|
||||
##${ALL_FUNCS}
|
||||
static std::vector<byte_t> ${GET_DATA_FUNC_NAME}(void);
|
||||
|
||||
##${ALL_FUNCS_IMPLEMENTATIONS}
|
||||
// ${FUNCTION_DESCRIPTION}
|
||||
static std::vector<byte_t> ${GET_DATA_FUNC_NAME}(void){
|
||||
//...
|
||||
//...
|
||||
std::string example_string = ${FUNCTION_DESCRIPTION};
|
||||
std::vector<byte_t> data;
|
||||
data.assign(example_string.begin(),example_string.end());
|
||||
return data;
|
||||
}
|
||||
##${ALL_OFFER_METHODS}
|
||||
offer_methods.push_back({${SERVICE_ID}, ${INSTANCE_ID}, ${METHOD_ID}, &${GET_DATA_FUNC_NAME}});
|
||||
##${ALL_OFFER_EVENTS}
|
||||
"""offer_events.push_back({${SERVICE_ID}, ${INSTANCE_ID}, ${EVENTGROUP_ID},
|
||||
${EVENT_ID}, ${EVENT_TYPE}, ${EVENT_CYCLE}, false,
|
||||
${UPDATE_ON_CHANGE}, nullptr, ${RELIABILITY}, &${GET_DATA_FUNC_NAME}});"""
|
||||
##${ALL_OFFER_SERVICES}
|
||||
"""my_services.push_back({${SERVICE_ID}, ${INSTANCE_ID}, DEFAULT_MAJOR, DEFAULT_MINOR});"""
|
||||
|
||||
Reference in New Issue
Block a user