feat():initial version

This commit is contained in:
2026-06-09 20:16:47 +08:00
commit 85fbb3188c
14809 changed files with 3044607 additions and 0 deletions

View 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)
{
}

View 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)
{
}

View 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")

File diff suppressed because it is too large Load Diff

View 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()

View 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

View 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

View 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")

View 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)

View 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()

Binary file not shown.

View 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"
}
}

View File

@@ -0,0 +1,732 @@
# -*- coding: utf-8 -*-
"""
===============================================================
Python模块Python操作excel.xlsx封装类MyPyXlsToXlsx、myPyXwBook和myPyXwSheet
Date2022年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]储存在A1C1中
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中如第一行12第二行34
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()

View 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

Binary file not shown.

View 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

View 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;
}
}

View 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

View 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});"""