第一次提交

This commit is contained in:
华海艳 2024-02-06 14:27:07 +08:00
commit 15d7a63c30
457 changed files with 241577 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
/XPlatForm.pro.user.37f85c8
/XPlatForm.pro.user.d0fd913
/XPlatForm.pro.user.dc0a3c9
/XPlatForm.pro.user
/.svn

23
Lot/csvcode.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef CSVCODE_H
#define CSVCODE_H
#define CSV_MC_TYPE_01 0x01 //平绣机
#define CSV_MC_TYPE_02 0x02 //带毛巾
#define CSV_MC_TYPE_03 0x03 //带缠绕
#define CSV_00_CODE_1 0x0001 //通用-主轴点动
#define CSV_00_CODE_2 0x0002 //通用-定起绣点
#define CSV_00_CODE_3 0x0003 //通用-回起绣点
#define CSV_00_CODE_4 0x0004 //通用-边框检查
#define CSV_00_CODE_5 0x0005 //通用-手动换色
#define CSV_00_CODE_6 0x0006 //通用-手动加油
#define CSV_00_CODE_7 0x0007 //通用-匹绣
#define CSV_00_CODE_8 0x0008 //通用-自动定软限位
#define CSV_00_CODE_9 0x0009 //通用-遍历
#define CSV_02_CODE_1 0x0001 //毛巾-毛巾M轴归零
#define CSV_02_CODE_2 0x0002 //毛巾-毛巾打环轴归零
#define CSV_03_CODE_1 0x0001 //缠绕-缠绕压脚电机归零
#define CSV_03_CODE_2 0x0002 //缠绕-缠绕锯齿电机归零
#endif // CSVCODE_H

196
XPlatForm.pro Normal file
View File

@ -0,0 +1,196 @@
#-------------------------------------------------
#
# Project created by Qt5.9.1 2021-03-08T08:42:36
# created by HUAHAIYAN
#-------------------------------------------------
TEMPLATE = app
TARGET = XPlatForm
CONFIG += c++11
CONFIG += resources_big
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
OBJECTS_DIR += obj
MOC_DIR += moc
UI_DIR += forms
RCC_DIR += rccs
#昆仑通态操作屏设置时间的库
unix:LIBS +=-L/usr/local/MCGS/sysroot-mcgs/usr/lib -lmcgs-hal
FORMS += \
sharedviews/colorordersetwidget.ui \
sharedviews/controlactionwidget.ui \
sharedviews/needlebarsetwidget.ui \
sharedviews/numerinputdialog.ui \
sharedviews/parametersetdialog.ui \
sharedviews/passworddialog.ui \
sharedviews/patternmanagewidget.ui \
sharedviews/patternselectwidget.ui \
sharedviews/promptdialog.ui \
sharedviews/sensorinputwidget.ui \
sharedviews/systemmanagedialog.ui \
sharedviews/wordsinputdialog.ui \
mctype/patternsingleboard/mainUI/mainwidget.ui \
sharedviews/sheetwidget.ui \
sharedviews/setworkarea.ui \
sharedviews/brokenlinedialog.ui \
sharedviews/debuginfodialog.ui
HEADERS += \
main.h \
items/paraitem.h \
items/sensoritem.h \
machine/comport.h \
machine/error.h \
machine/machine.h \
machine/qbindtcpsocket.h \
machine/tcpclient.h \
machine/comm/comm.h \
machine/comm/config.h \
machine/comm/crc16.h \
machine/comm/crc32.h \
machine/comm/datadef.h \
machine/comm/protocol.h \
machine/comm/typedef.h \
machine/qextserial/qextserialbase.h \
machine/qextserial/qextserialport.h \
datafile/datafiledst.h \
datafile/embdata.h \
datafile/datafiledsr.h \
items/outctrlitem.h \
items/shortcutitem.h \
items/cmdconfig.h \
items/fileitem.h \
settings/settings.h \
sharedviews/colorordersetwidget.h \
sharedviews/controlactionwidget.h \
sharedviews/needlebarsetwidget.h \
sharedviews/numerinputdialog.h \
sharedviews/parametersetdialog.h \
sharedviews/passworddialog.h \
sharedviews/patternmanagewidget.h \
sharedviews/patternselectwidget.h \
sharedviews/promptdialog.h \
sharedviews/sensorinputwidget.h \
sharedviews/systemmanagedialog.h \
sharedviews/wordsinputdialog.h \
sharedviews/mybutton.h \
mctype/mainwidgetfunction.h \
sharedviews/setcontrolstyle.h \
datafile/dsrcryption.h \
items/itemsmanage.h \
items/assistitem.h \
items/patternsetitem.h \
items/embfunctionitem.h \
datafile/outline.h \
mctype/patternsingleboard/mainUI/mainwidget.h \
mctype/patternsingleboard/function/flatembroidery.h \
settings/lotsettings.h \
machine/lotmachine.h \
items/parasetitem.h \
mctype/machinetypefun.h \
sharedviews/sheetwidget.h \
machine/gatewaytcpclient.h \
items/errorcodestateitem.h \
sharedviews/setworkarea.h \
sharedviews/brokenlinedialog.h \
Lot/csvcode.h \
mctype/patternsingleboard/function/quiembroidery.h \
sharedviews/debuginfodialog.h
SOURCES += \
main.cpp \
items/paraitem.cpp \
items/sensoritem.cpp \
machine/comport.cpp \
machine/error.cpp \
machine/machine.cpp \
machine/qbindtcpsocket.cpp \
machine/tcpclient.cpp \
machine/comm/comm.cpp \
machine/comm/crc16.cpp \
machine/comm/crc32.cpp \
machine/qextserial/qextserialbase.cpp \
machine/qextserial/qextserialport.cpp \
datafile/datafiledst.cpp \
datafile/embdata.cpp \
datafile/datafiledsr.cpp \
items/outctrlitem.cpp \
items/shortcutitem.cpp \
items/fileitem.cpp \
settings/settings.cpp \
sharedviews/colorordersetwidget.cpp \
sharedviews/controlactionwidget.cpp \
sharedviews/needlebarsetwidget.cpp \
sharedviews/numerinputdialog.cpp \
sharedviews/parametersetdialog.cpp \
sharedviews/passworddialog.cpp \
sharedviews/patternmanagewidget.cpp \
sharedviews/patternselectwidget.cpp \
sharedviews/promptdialog.cpp \
sharedviews/sensorinputwidget.cpp \
sharedviews/systemmanagedialog.cpp \
sharedviews/wordsinputdialog.cpp \
sharedviews/mybutton.cpp \
mctype/mainwidgetfunction.cpp \
sharedviews/setcontrolstyle.cpp \
datafile/dsrcryption.cpp \
items/itemsmanage.cpp \
items/assistitem.cpp \
items/patternsetitem.cpp \
items/embfunctionitem.cpp \
datafile/outline.cpp \
mctype/patternsingleboard/mainUI/mainwidget.cpp \
mctype/patternsingleboard/function/flatembroidery.cpp \
machine/lotmachine.cpp \
items/parasetitem.cpp \
mctype/machinetypefun.cpp \
sharedviews/sheetwidget.cpp \
machine/gatewaytcpclient.cpp \
items/errorcodestateitem.cpp \
sharedviews/setworkarea.cpp \
sharedviews/brokenlinedialog.cpp \
mctype/patternsingleboard/function/quiembroidery.cpp \
sharedviews/debuginfodialog.cpp
#windows下调用库
#win32:LIBS += $$PWD/../../HMI-Widget/XPlatform/Dll/Machine.dll
#win32:LIBS += $$PWD/../../HMI-Widget/XPlatform/Dll/DataFileComb.dll
#linux下调用库
#unix:LIBS += $$PWD/../../HMI-Widget/XPlatform/Dll/Machine
#RESOURCES += \
# bf.qrc
unix:INSTALLS += target
unix:target.path=/root
TRANSLATIONS += chinese.ts\
english.ts\
spanish.ts\
bengal.ts\
turkey.ts\
portugal.ts\
french.ts\
arabic.ts\
ukrainian.ts\
russian.ts\
uzbek.ts\
korean.ts
unix:HEADERS += machine/qextserial/posix_qextserialport.h
unix:SOURCES += machine/qextserial/posix_qextserialport.cpp
unix:DEFINES += _TTY_POSIX_
win32:HEADERS += machine/qextserial/win_qextserialport.h
win32:SOURCES += machine/qextserial/win_qextserialport.cpp
win32:DEFINES += _TTY_WIN_

BIN
arabic.qm Normal file

Binary file not shown.

11633
arabic.ts Normal file

File diff suppressed because it is too large Load Diff

1
bengal.qm Normal file
View File

@ -0,0 +1 @@
<クd<>箆!ソ`。スン

11819
bengal.ts Normal file

File diff suppressed because it is too large Load Diff

BIN
chinese.qm Normal file

Binary file not shown.

11836
chinese.ts Normal file

File diff suppressed because it is too large Load Diff

4
csvcode.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef CSVCODE_H
#define CSVCODE_H
#endif // CSVCODE_H

1323
datafile/datafiledsr.cpp Normal file

File diff suppressed because it is too large Load Diff

210
datafile/datafiledsr.h Normal file
View File

@ -0,0 +1,210 @@
#ifndef DATAFILEDSR_H
#define DATAFILEDSR_H
#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#include <QLinearGradient>
#include "dsrcryption.h"
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
//-----------------------------------------------
#define MAX_WIDTH_OF_DBZ 70 // 摆针最大范围7mm
#define MIN_WIDTH_OF_DBZ 2 // 摆针最小范围0.2mm
#define MAX_HEIGHT_OF_SBZ 40 // Y最大范围4mm
#define MIN_HEIGHT_OF_SBZ 8 // Y最小范围0.8mm
#define DSR_PREVIEW_SIDE (15) // 留边大小
#define DSR_PREVIEW_WIDTH (156) // 默认预览图区域宽度
#define DSR_PREVIEW_HEIGHT (164) // 默认预览图区域高度
#define DSR_VERSION_5 5.00f
#define DSR_VERSION_6_3 6.30f
typedef struct strDsrHead
{
// 0x00
DWORD verCode; // 文件版本 LSB
DWORD cryWord; // 加密字
BYTE reserved1[8]; // 保留 8 字节
// 0x10
DWORD dataBegin; // 数据起始 LSB
DWORD stepSize; // 数据字段大小
DWORD xyUnit; // 长度数据单位
DWORD rUnit; // 角度数据单位
// 0x20
DWORD stitches; // 针数 LSB
DWORD fileID; // 文件id,和智能识别有关 = 0, 不能识别
BYTE reserved3[8]; // 保留 8 字节
// 0x30
s32 rangeNx; // 范围 -X LSB
s32 rangePx; // 范围 +X LSB
s32 rangeNy; // 范围 -Y LSB
s32 rangePy; // 范围 +Y LSB
// 0x40
long startX; // 起点坐标X LSB
long startY; // 起点坐标Y LSB
long anchorX; // 定位点X LSB
long anchorY; // 定位点Y LSB
// 0x50
DWORD angleFix; // 角度修正量
// 0x54
BYTE reserved4[0x84-0x54]; // 保留字节
// //0X84 //132
u32 offsetEn; // bit0,偏移点X向允许 0,不允许 1,允许
// // bit1,偏移点Y向允许 0,不允许 1,允许
// // bit2,平绣数据有无 0,无 1,有
// // bit3,激光数据有无 0,无 1,有
// // bit4,毛巾链式数据有无 0,无 1,有
// // bit5,缠绕锯齿盘带数据有无 0,无 1,有
// //0x82 //136
s32 offsetX; // 偏移点X
// //0x8C //140
s32 offsetY;
// //0x90 //144
BYTE reserved5[0x118-0x90]; // 保留字节
// 0x118
u8 begWorkHead; // 以何种工作机头定点
// 0x119
u8 reserved6[0x200-0x119]; //BYTE // 保留字节
// 0x200
u8 switchTable[0x400-0x200]; //BYTE // 色序设定表, 支持512个色序设定
}__attribute__ ((packed)) DsrHead;
//dsr6.3版本的文件头扩展
typedef struct strDsrHead63
{
//0x00
u8 switchTable2[0x200-0x000]; //BYTE // 换色表2扩展色序设定表,512个字节
//0x200
u8 towelHighTable[0x600-0x200]; //BYTE // 毛巾高度设定表, 支持1024个高度设定每个字节对应一个高度等级0非有效高度。1--11, 有效的高度等级)
}__attribute__ ((packed)) DsrHead63;
typedef struct strDsrStep
{
BYTE ctrl; // 控制字节
BYTE attr; // 属性字节
WORD action;// 附加动作
s32 dx; // X绝对偏移
s32 dy; // Y绝对偏移
s32 dr; // R角度
}__attribute__ ((packed)) DsrStep;
//-----------------------------------------------
#define DSR_NULL 0x00 // 文件结束
#define DSR_SEWING 0x01 // 缝纫数据
#define DSR_OFFSET 0x02 // 偏移数据
#define DSR_CUTTING 0x03 // 切刀数据
#define DSR_LASER 0x04 // 激光数据
#define DSR_DRAWING 0x05 // 记号数据
#define DSR_SEWING_R 0x06 // 第二缝纫数据
#define DSR_PAUSE 0x08 // 暂停
#define DSR_ANGLE 0x09 // 拐点
#define DSR_CUT 0x0A // 剪线
#define DSR_JUMP 0x0B // 跳针
#define DSR_PUNCH 0x0C // 冲孔
#define DSR_EMB 0x0D // 绣花
#define DSR_CHGND 0x0E // 换色
#define DSR_CHENILLE 0x41 // 毛巾环式
#define DSR_CHAIN 0x42 // 毛巾链式
#define DSR_TOWELHIGH 0x43 // 毛巾高度
#define DSR_COIL 0x44 // 缠绕数据
#define DSR_SAWTOOTH 0x45 // 锯齿数据
#define DSR_RIBBON 0x46 // 盘带数据
#define DSR_END 0x10 // 结束码
//-----------------------------------------------
#define DSR_EMB_DATADIRX (1) // X向数据坐标与下位机坐标系统的差异
#define DSR_EMB_DATADIRY (1) // Y向数据坐标与下位机坐标系统的差异
#define DSR_EMB_DATADIRR (1) // R向数据坐标与下位机坐标系统的差异
#define DSR_SHOWDIRX (-1) // X向显示坐标和数据坐标的差异
#define DSR_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异
class DataFileDsr
{
public:
DataFileDsr();
~DataFileDsr();
public:
void initColor(int cnum = 0, QRgb * pColor = NULL);
void initFile(const QString & fullPathName);
int checkDsrVersion();//检查dsr文件版本非5.2和6.3版本和错误格式返回-1
void convertDataToEmbAbs(); // 转换为绝对数据
//是否保存 //笔宽 //是否渐变
int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int gradientFlag = 1, int reDraw = 0); // 生成预览文件
public:
void clear();
void loadFile();
void saveFile();
void writePointToFile(u8 type, int x, int y, int st = 0,u8 workHead = 0);//写入起绣点到文件中
void writeOffsetXYMoveToFile(s32 EnFlag,s32 offsetX,s32 offsetY);//偏移点XY写回dsr头文件
inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称
inline QByteArray & getFileData() {return m_fileData;} // 得到文件数据
inline QByteArray & getEmbAbsData() {return m_embAbsData;} // 得到转换后的数据
QByteArray getTowelHighTable(QString path); //获取毛巾高度
QString getFileFullPath(); // 文件所在目录
QString getFileFullName(); // 文件名称(包括扩展名)
QString getFileName(); // 文件名称(不包括扩展名)
QString getFileSuffix(); // 文件扩展名
int getStitchNums();//得到数据的针数
int getColorNums();//得到数据的色数
int getTowelHighNums();//得到毛巾高度设置码数
int getFileid();//得到fileid
int getDatWidth();//得到数据的图形宽度
int getDatHeight();//得到数据的图形高度
int getMaxX();//得到数据最大X+
int getMinX();//得到数据最小X-
int getMaxY();//得到数据最大Y+
int getMinY();//得到数据最小Y-
int getJumpNeedleNum();//得到总的跳针数
protected:
QString m_fileFullPathName; // 文件路径
QByteArray m_embAbsData; // 转换后的绝对坐标数据
public:
QByteArray m_fileData;// 文件数据内容(原始数据)
private:
int m_colorNum;//颜色数
QRgb * m_pColor;//颜色rgb值
QString m_fileName; // 文件路径
private:
int m_minX;
int m_maxX;
int m_minY;
int m_maxY;
private:
int checkFileCryption();//检查dsr文件是否加密
void getDsrMinMax();
private:
int checkDefaultSwitchTable(int colornum = 0);
QColor getBrightAdd(QColor embcolor);//补光增加
QColor getBrightDec(QColor embcolor);//补光减少
};
#endif // DATAFILEDSR_H

1511
datafile/datafiledst.cpp Normal file

File diff suppressed because it is too large Load Diff

161
datafile/datafiledst.h Normal file
View File

@ -0,0 +1,161 @@
#ifndef DATAFILEDST_H
#define DATAFILEDST_H
#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#include <QLinearGradient>
#include "main.h"
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#define DATAFACTOR 10 //dst绝对坐标数据转换为ds16前需要扩大10倍
#define DST_EMB_DATADIRX (1) // X向数据坐标与下位机坐标系统的差异
#define DST_EMB_DATADIRY (-1) // Y向数据坐标与下位机坐标系统的差异
#define DST_SHOWDIRX (-1) // X向显示坐标和数据坐标的差异
#define DST_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异
#define DST_PREVIEW_SIDE (15) // 留边大小
#define DST_PREVIEW_WIDTH (156) // 默认预览图区域宽度
#define DST_PREVIEW_HEIGHT (164) // 默认预览图区域高度
// dst文件头
#pragma pack(1)//设定为1字节对齐
struct DstHead
{
// 0
char la[20];
char st[11];
char co[7];
char xp[9];
char xn[9];
char yp[9];
char yn[9];
char ax[10];
char ay[10];
char mx[10];
char my[10];
char pd[10];
char sub;
char reserved1[3];
// 128 // 自定义,存储色序
u8 switchTable[256-128]; //BYTE // 色序设定表, 支持128个色序设定缝绣机
// 256
s16 reserved2;
// 258
int anchorX; //定位点
int anchorY;
// 266
s32 startX; //起绣点
s32 startY;
// 274
u32 begWorkHead;//工作机头
//278
u32 offsetEn; // bit0,偏移点X向允许 0,不允许 1,允许
// // bit1,偏移点Y向允许 0,不允许 1,允许
// // bit2,平绣数据有无 0,无 1,有
// // bit3,激光数据有无 0,无 1,有
// // bit4,毛巾链式数据有无 0,无 1,有
// // bit5,缠绕锯齿盘带数据有无 0,无 1,有
//282
s32 offsetX; // 偏移点X
// 286
s32 offsetY;
//290
u8 reserved3[512-290]; //BYTE // 保留字节
};
#pragma pack(1)//恢复对齐状态
// 针步数据
typedef struct strDstStep
{
u8 c1; ////BYTE
u8 c2; ////BYTE
u8 c3; ////BYTE
}__attribute__ ((packed)) DstStep;
class DataFileDst
{
public:
DataFileDst();
~DataFileDst();
public:
void initColor(int cnum = 0, QRgb * pColor = NULL);
void initFile(const QString & fullPathName);
int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int gradientFlag = 1, int reDraw = 0); // 生成预览文件
void convertDataToAbs(); // 转换为绝对坐标数据
void writePointToFile(u8 type, int x, int y, int st = 0,u8 workHead=0);//写入起绣点到文件中
void writeOffsetXYMoveToFile(s32 EnFlag,s32 offsetX,s32 offsetY);
int checkDstFile();//检查dst文件是否正确
public:
void clear();
void loadFile();
void saveFile();
inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称
inline QByteArray & getFileData() {return m_fileData;} // 得到文件数据
inline QByteArray & getEmbAbsData() {return m_embAbsData;} // 得到转换后的数据
QString getFileFullPath(); // 文件所在目录
QString getFileFullName(); // 文件名称(包括扩展名)
QString getFileName(); // 文件名称(不包括扩展名)
QString getFileSuffix(); // 文件扩展名
int getStitchNums();//得到数据的针数
int getColorNums();//得到数据的色数
int getFileid();//得到fileid
int getDatWidth();//得到数据的图形宽度
int getDatHeight();//得到数据的图形高度
int getMaxX();//得到数据最大X+
int getMinX();//得到数据最小X-
int getMaxY();//得到数据最大Y+
int getMinY();//得到数据最小Y-
int getJumpNeedleNum();//得到总的跳针数
int getBeadSequinMap(QByteArray & map); // 得到有效珠片码的位图
int setBeadSequinTable(u8 * val); // 设置珠片码对应表
protected:
QString m_fileFullPathName; // 文件路径
QByteArray m_embAbsData; // 转换后的绝对坐标数据
private:
QByteArray m_fileData;// 文件数据内容(原始数据)
int m_colorNum;//颜色数
QRgb * m_pColor;//颜色rgb值
QString m_fileName; // 文件路径
private:
double m_minX;
double m_maxX;
double m_minY;
double m_maxY;
QByteArray m_beadSequinMap; // 有效珠片码的位图
QByteArray m_beadSequinTable; // 珠片码对应表
private:
int checkDefaultSwitchTable(int colornum = 0);
int changeDstStep(DstStep * pDststep, Ds4Item & ds4step);
QColor getBrightAdd(QColor embcolor);//补光增加
QColor getBrightDec(QColor embcolor);//补光减少
};
#endif // DATAFILEDST_H

319
datafile/dsrcryption.cpp Normal file
View File

@ -0,0 +1,319 @@
#include "dsrcryption.h"
#include <QString>
#include <QTime>
DsrCryption::DsrCryption()
{
m_initflag = 0;
m_cryword = 0;
memset(m_factors, 0, BYTES_OF_CRY_FACTORS);
}
// 初始化加密控制, 生成加密字和加密因子
int DsrCryption::InitDsrCryptionCtrl(int version, unsigned int cryword, const unsigned char * factors)
{
int rslt = 0;
m_initflag = 0;
m_cryword = 0;
memset(m_factors, 0, BYTES_OF_CRY_FACTORS);
if (version >= 0)
{
rslt = CreateCryWord(version);
}
else
{
m_cryword = cryword;
}
if (rslt == 0)
{
rslt = CreateCryFactors(factors);
}
if (rslt == 0)
{
m_initflag++;
}
return rslt;
}
// 获取加密字
unsigned int DsrCryption::GetDsrCryptionWord()
{
return m_cryword;
}
// 加密数据
int DsrCryption::EnCryption(unsigned char * pData, int size)
{
if (pData == NULL || size <= 0)
{
return -1;
}
unsigned char thisfactors[BYTES_OF_CRY_FACTORS];
unsigned char tempbuff[BYTES_OF_CRY_FACTORS];
memcpy(thisfactors, m_factors, BYTES_OF_CRY_FACTORS); // 拷贝临时的加密因子,做计算用
int i, j;
for (i = 0; i < size; i += BYTES_OF_CRY_FACTORS)
{
// 拷贝数据到临时buff
int mv = 0;
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
if (i+j < size)
{
tempbuff[j] = pData[i+j]; // 拷贝数据
}
else
{
tempbuff[j] = 0;
}
mv += thisfactors[j]; // 累加因子,作为移动因子
}
// 移动数据
if (i + BYTES_OF_CRY_FACTORS < size)
{
// 生成移动索引
unsigned char mvidx[BYTES_OF_CRY_FACTORS];
int idx, setdidx = BYTES_OF_CRY_FACTORS-1;
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
idx = (mv >> j) & 0x1f;
for (int k = 0; k < j; k++)
{
if (mvidx[k] == idx)
{
idx = setdidx;
do
{
int kk;
for (kk = 0; kk < j; kk++)
{
if (mvidx[kk] == idx)
{
break;
}
}
if (kk < j)
{
idx--;
}
else
{
setdidx = idx-1;
break;
}
} while(1);
break;
}
}
mvidx[j] = idx;
}
// 移动数据
unsigned char tempdat[BYTES_OF_CRY_FACTORS];
memcpy(tempdat, tempbuff, BYTES_OF_CRY_FACTORS);
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
tempbuff[j] = tempdat[mvidx[j]];
}
}
// 数据加密
for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++)
{
tempbuff[j] ^= thisfactors[j]; // 异或加密
pData[i+j] = tempbuff[j]; // 保存
}
// 下次的变幻因子
int temp = 0;
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
temp += thisfactors[j];
temp *= 3;
temp += 1;
temp /= 2;
thisfactors[j] = temp;
}
}
return 0;
}
// 解密数据
int DsrCryption::DeCryption(unsigned char * pData, int size)
{
if (pData == NULL || size <= 0)
{
return -1;
}
if (pData == NULL || size <= 0)
{
return -1;
}
unsigned char thisfactors[BYTES_OF_CRY_FACTORS];
unsigned char tempbuff[BYTES_OF_CRY_FACTORS];
memcpy(thisfactors, m_factors, BYTES_OF_CRY_FACTORS);
int i, j;
for (i = 0; i < size; i += BYTES_OF_CRY_FACTORS)
{
// 拷贝数据到临时buff
int mv = 0;
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
if (i+j < size)
{
tempbuff[j] = pData[i+j]; // 拷贝数据
}
else
{
tempbuff[j] = 0;
}
mv += thisfactors[j]; // 累加因子,作为移动因子
}
// 数据解密
for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++)
{
tempbuff[j] ^= thisfactors[j];
}
// 数据移动回去
if (i + BYTES_OF_CRY_FACTORS < size)
{
// 生成移动索引
unsigned char mvidx[BYTES_OF_CRY_FACTORS];
int idx, setdidx = BYTES_OF_CRY_FACTORS-1;
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
idx = (mv >> j) & 0x1f;
for (int k = 0; k < j; k++)
{
if (mvidx[k] == idx)
{
idx = setdidx;
do
{
int kk;
for (kk = 0; kk < j; kk++)
{
if (mvidx[kk] == idx)
{
break;
}
}
if (kk < j)
{
idx--;
}
else
{
setdidx = idx-1;
break;
}
} while(1);
break;
}
}
mvidx[j] = idx;
}
// 移动数据
unsigned char tempdat[BYTES_OF_CRY_FACTORS];
memcpy(tempdat, tempbuff, BYTES_OF_CRY_FACTORS);
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
tempbuff[mvidx[j]] = tempdat[j];
}
}
// 保存解密数据
for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++)
{
pData[i+j] = tempbuff[j]; // 保存
}
// 下次的变幻因子
int temp = 0;
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
{
temp += thisfactors[j];
temp *= 3;
temp += 1;
temp /= 2;
thisfactors[j] = temp;
}
}
return 0;
}
// 生成加密字
int DsrCryption::CreateCryWord(int version)
{
if (version < 0 || version > 250)
{
return -1;
}
int rdw;
if (version == 0)
{
rdw = 0;
}
else
{
QTime time= QTime::currentTime();
qsrand(time.msec()+time.second()*1000);
rdw = qrand(); // 产生随机数
}
m_cryword = rdw & 0xffffff;
m_cryword *= 251;
m_cryword += version;
return 0;
}
// 生成加密因子
int DsrCryption::CreateCryFactors(const unsigned char * factors)
{
if (factors == NULL)
{
return -1;
}
memcpy(m_factors, factors, BYTES_OF_CRY_FACTORS);
int * pDat = (int*)m_factors;
// 变幻加密因子,兼容非加密情况
for (int i = 0; i < BYTES_OF_CRY_FACTORS; i+=sizeof(int))
{
*pDat *= m_cryword;
pDat++;
}
return 0;
}

33
datafile/dsrcryption.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef DSRCRYPTION_H
#define DSRCRYPTION_H
#define CRY_VERSION1 0x01
#define CRY_VERSION2 0x02
#define CUR_CRY_VERSION 0x01 // 当前的加密版本(取值范围为 0 -- 250方便通过版本使用不同的加密方法。
#define BYTES_OF_CRY_FACTORS 32 // 加密因子字节数
class DsrCryption
{
public:
DsrCryption();
public:
int InitDsrCryptionCtrl(int version, unsigned int cryword, const unsigned char * factors); // 初始化加密控制, 自动生成生成加密字和加密因子
unsigned int GetDsrCryptionWord(); // 获取加密字
int EnCryption(unsigned char * pData, int size); // 加密数据,使用当前的加密字和加密因子
int DeCryption(unsigned char * pData, int size); // 解密数据,使用当前的加密字和加密因子
private:
int CreateCryWord(int version); // 生成加密字
int CreateCryFactors(const unsigned char * factors); // 生成加密因子
private:
int m_initflag;
unsigned int m_cryword;
unsigned char m_factors[BYTES_OF_CRY_FACTORS];
};
#endif // DSRCRYPTION_H

5997
datafile/embdata.cpp Normal file

File diff suppressed because it is too large Load Diff

300
datafile/embdata.h Normal file
View File

@ -0,0 +1,300 @@
#ifndef EMBDATA_H
#define EMBDATA_H
#include <QList>
#include <QByteArray>
#include <QApplication>
#include <QDir>
#include <QImage>
#include <qmath.h>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QPainter>
#include <QObject>
#include <QVector>
//#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#include "outline.h"
#define ZERO 1e-6
#define DIRECTION 8
#define MAX_EMB_STEP 121//四字节针步最大针步限制
#define DEFAULT_JUMP 70//默认针步大小
#define TOTAL_NEEDLE_NUM 122
//总的针杆数,
//绣花32个(1-32),
//冲孔16个(33-48),
//缝纫2个(49-50),
//盘带2个(51-52),
////预留1个(52),之前盘带是1个后来变成了2个
//毛巾16个(53-68),
//链式16个(69-84)
//缠绕9个85-93)
//预留7个(94-100),
//锯齿6个(101-106),
//预留6个(107-112),
//激光1个(113-122)
#define EMB_NEEDLE_NUM 32//绣花32个针杆
#define PUNCH_NEEDLE_NUM 16//冲孔16个针杆
#define SEW_NEEDLE_NUM 2 //缝纫2个针杆
#define RIBBON_NEEDLE_NUM 2 //盘带2个针杆
//#define REV1_NEEDLE_NUM 1//预留1个针杆
#define TOWEL_NEEDLE_NUM 16 //毛巾16个针杆
#define CHAIN_NEEDLE_NUM 16 //链式16个针杆
#define COIL_NEEDLE_NUM 9//缠绕9个针杆
#define REV2_NEEDLE_NUM 7//预留7个针杆
#define SAWTOOTH_NEEDLE_NUM 6//锯齿6个针杆
#define REV3_NEEDLE_NUM 6//预留6个针杆
#define LASER_NEEDLE_NUM 10// 激光10个针杆
#define SEQUIN_NUM 12 //亮片最大数量
#define BEAD_NUM 6 //散珠最大数量
#define COLORTABLE_NUM 512//色序表
#define EMB_PREVIEW_SIDE (32) // 留边大小
#define TENTHOUSANDNEEDLE 100000
#define EMB_SHOWDIRX (-1) // X向显示坐标和数据坐标的差异
#define EMB_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异
#define OUTLINESTEPFACTOR 100 // 生成轮廓花样针步乘以的系数单位是0.01所以乘以100
#define COLOR_GREY 186 //纯灰色的rgb
#define PI10000 31416
#define PI20000 62832
// 花样轮廓
typedef struct
{
int x;
int y;
int dir;
char var;
}__attribute__ ((packed)) OutLineItem;
class EmbData: public QObject
{
Q_OBJECT
public:
EmbData();
~EmbData();
public:
void clear();
void initColor(int cnum = 0, QRgb * pColor = NULL);//初始化颜色
QByteArray & getDsDat();//得到转换后的ds16数据
bool checkFirstEndNeedle();//检查起针和末针的x坐标是否一致如果相差0.5mm以上绗绣机是不能绣作的,需要重新打版
inline DataDs16FileHead * getDsDatHead(){return m_pEmbDs16Head;}//得到转换后的ds16数据的文件头
void setDsDatHeadFileID(u32 fileid);//设置数据区文件头的fileid
void getAbsDatRangeXY();//得到绝对坐标的maxXY和minXY
void appendACombEmbFile(QString filePath);//附加一个绝对坐标的绣花文件(组合文件)
void appendAEmbAbsFile(QString filePath,QByteArray array,int mirror = 0);//附加一个绝对坐标的花样文件
int addLockStitchs(int locktimes, int locksteps, int lockstepsize, int jumpStichs,int isColorlock);
int mergeMinStep(u16 minStep, int mergeStep); //合并小针步
int removeAEmbFile(int idx = -1);//删除一个绣花文件
int saveAsCombFile(QString fullpathname,QString name);//保存为comb文件(组合文件的格式)
public:
int getPattenNum();//得到花版个数
inline QString getFileName(){return m_pEmbDs16Head->fileName;}//得到花版名称
inline int getStitchNums(){return m_pEmbDs16Head->itemNums;}//得到数据的针数
inline int getColorNums(){return m_pEmbDs16Head->colorNum;}//得到数据的色数
inline int getTowelHighNums(){return m_pEmbDs16Head->towelHighNum;}//得到毛巾高度数
inline int getDatWidth(){return m_pEmbDs16Head->maxX - m_pEmbDs16Head->minX;}//得到数据的图形宽度
inline int getDatHeight(){return m_pEmbDs16Head->maxY - m_pEmbDs16Head->minY;}//得到数据的图形高度
inline int getMaxX(){return m_pEmbDs16Head->maxX;}//得到数据最大X+
inline int getMinX(){return m_pEmbDs16Head->minX;}//得到数据最小X-
inline int getMaxY(){return m_pEmbDs16Head->maxY;}//得到数据最大Y+
inline int getMinY(){return m_pEmbDs16Head->minY;}//得到数据最小Y-
inline int getJumpNeedleNum(){return m_pEmbDs16Head->jumpNeedleNum;}//得到总的跳针数
inline void setDsDataStepUnit(u16 unit){m_dsDataStepUnit = unit;}
public:
void setAbsDat(QByteArray & dat);
QByteArray & getAbsDat(void);
QByteArray getColorTable();//得到数据的色序表
int getAFileDs16Range(int idx, int & beg, int & end); //得到普通花
int getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & posr, int & colorIdx);
int getPosInfoFromColorIdx(int & stitchIdx, int & posx, int & posy, int & posr, int colorIdx);
int getNeedleIdxFromColorIdx(int & needleIdx, int colorIdx, u8 & stepCtrl);
int getNeedleIdxFromTowelHighIdx(int & needleIdx, int highIdx, u8 & stepCtrl);
void setDs16ColorOfTable(u8* table); //改变色序颜色
void setNeedleColorTable(int colorIdx, int colorvalue); //针杆颜色
void setBeadColorTable(int colorIdx, int colorvalue); //散珠颜色
void setSequinColorTable(int colorIdx, int colorvalue); //亮片颜色
PatternParaStruct getPatternParaStruct(QString path);
void setPatternParaStruct(PatternParaStruct paraStruct);
void setStartPosition(int x, int y, int st = 0,u8 workHead = 1);//设置起始点
public:
void setConvertSkipStepSize(u16 stepSize , u16 jumpStepSize );//需要插入跳针的针步大小
void setDataStepUnit(u16 stepUnit);
int modifyStepAngle(u16 mode = 0);//修改针步角度
void setMcRepeatEmb(DataFileHead fileHead);//设置主控反复绣改变ds16文件头
int getDataListRange(QList <QByteArray> *datList,
double &minX,double &maxX,double &minY,double &maxY);// 得到所有列表内花样范围
void PaintedGrid(QVector<QVector<char> >& visited,int x,int y,int r); // 涂格子
void PaintedLine(QVector<QVector<char> >& visited, int begx, int begy, int endx, int endy,int zoom,int vectorH,int vectorV);// 绘制直线
OutLineItem FindNextPos(QVector<QVector<char> >& visited,OutLineItem pos); // 寻找下一个点
int setNeedleXYCompensation(double valueX,double valueY);//分别设置xy针步补偿
void setOffsetXYData(s32 EnFlag,s32 offsetX,s32 offsetY);
double getAngle(double x1, double y1, double x2, double y2);
int setDatSizeChange(int dsx, int dsy, int idx = -1);//设置尺寸变化
int setMirror(int mirror, int idx = -1);//设置镜像
int setFLip(int mirror, int idx = -1);//设置镜像
int setRotate(int dr, int idx = -1);//设置旋转
int setToMiddle(int idx = -1);//设置居中
int setDatMove(int dx, int dy, int idx = -1);//设置数据移动
void createSameColorEmbDs16Dat(int num);//按色通常并转换为ds16数据
void createPatternOutlineFile(int outlineStep,int outlineZoom,int outlineShape = 0);//生成花样轮廓文件
QString createBorderEmbData(QString filePath);//生成边框刺绣的数据
QByteArray createOpenLineEmbData(QList<OpenLineNode> &list);//生成开位线绣的数据
private:
void splitBorderStitchAndAdd(QByteArray & dat,int bx,int by,int ex,int ey);//分割针步并添加
//此函数转换传入的绝对坐标值,是否取镜像及反复时数据之间的间距
void convertAbsDat(QByteArray & dat,int mirror = 0);
QList<QByteArray> getDataList(QString name);
int createEmbDs16FromAbs();//生成DS16数据
int reCalcDataChecksum();//重新计算文件CRC
QByteArray intTo2ByteArray(s16 value);//短整型转换为byte
void drawNeedleIdxPen(int x, int y, QPainter &painter);//绘制针数索引的跟踪笔
void eraseNeedleIdxPen(QPainter &painter);//擦除针数索引的跟踪笔
void drawBeadOrSequin(QPainter &painter,u8 action, int bx, int by,int ex,int ey,QRgb beadColor,s16 grey = 0);//绘制散珠或亮片
public:
int m_editedflag;//数据被编辑的标志
int m_spaceX;//横向间隙
int m_spaceY;//纵向移动距离
//用于调节颜色
#if(1)
QString m_selfilename;
#endif
double m_minX;
double m_maxX;
double m_minY;
double m_maxY;
int m_beginX;
int m_beginY;
int m_beginR;
s32 m_enFlag;
s32 m_offsetX;
s32 m_offsetY;
s16 m_sequinColorTable[SEQUIN_NUM];//亮片颜色table
s16 m_beadColorTable[BEAD_NUM];//散珠颜色table
s16 m_towelColorTable[TOWEL_NEEDLE_NUM];//毛巾颜色table
s16 m_needleColorTable[TOTAL_NEEDLE_NUM];//32个绣花针杆颜色索引(后期还会增加冲孔缝纫毛巾等)
PatternParaStruct m_patternParaStruct;//花样参数结构体
QByteArray m_colortab;//发给下位机的数据(需要转换)
private:
QByteArray m_embAbsData; // 转换后的绝对坐标数据
QList <QByteArray> m_dataAbsList;//文件绝对位置列表
QByteArray m_embDs16Data;//发给下位机的ds16数据需要转换
QList <int> m_embDatEndList;
QList <QByteArray> m_arrayAbsList;//排列前的文件绝对位置列表
int m_totalJumpNeedle;//总跳针数
DataDs16FileHead * m_pEmbDs16Head;//ds16 文件头 //数据转换用的都是DataDs16FileHead
double m_factor;//绘制数据与实际数据的缩放率
QByteArray m_extractContours;//花样轮廓数据
u16 m_convertSkipStepSize;
u16 m_jumpStepSize;
u16 m_dsDataStepUnit; //0.01mm或0.1mm教学一体机为步进电机针步精度为0.1mm需要将数据除以10
//图形预览、刷新
public:
//显示所有线迹(原色显示)
//显示所有线迹(有效区域内的显示原色,其余显示灰色)
//显示所有线迹(执行过的显示原色,其余显示灰色)
//刷新部分线迹(缝纫中进度显示)
enum DISP_MODE {DISP_ALL_NORMAL = 0, DISP_ALL_AREA, DISP_ALL_EXEC, DISP_EXECING};
enum DRAW_MODE {DRAW_VIEW = 0, DRAW_PREVIEW};//绘制模式(非预览模式、预览模式)
public:
int setViewInfo(int width, int height);//设置视图尺寸(透明背景)
void setViewInfo(QPixmap pix);//设置视图(带背景图片背景)
//重新重置ds16数据(换色点击取消后数据会变为单个图元的原数据,
//若图形经过变换数据会不对换色界面保存了最后的数据和XY范围
//若点击换色并取消后恢复为换色界面最后保存的数据即可)
void reSetEmbData(QByteArray ary);
void reSetEmbDataRange(int maxX,int minX,int maxY,int minY);
void setEmbData(int redraw = 0);//重置数据
//是否重绘 //是否为渐变
void setDispMode(DISP_MODE dispmode = DISP_ALL_NORMAL, int redraw = 0,int gradientFlag = 0);//设置预览模式
void setDrawMode(DRAW_MODE drawmode = DRAW_VIEW);//设置绘制模式
void setGreyAreaRange(int begin, int end);//设置灰色区域显示
void setDispAreaRange(int begin, int end, int redraw = 0);//设置区域显示参数
void setExecIndex(int index);//设置进度显示数据
void reDraw();//重新绘图
public:
inline QPixmap getPreviewImage(){return m_canvas;}//返回预览图片
private:
int createDispFromEmbDs16Dat(QByteArray & ds16dat);//创建显示用的数据(为了快速显示)
int drawImageByDispFile(int gradientFlag = 0);//用显示数据画图(是否渐变显示)
QColor getBrightAdd(QColor embcolor);//补光增加
QColor getBrightDec(QColor embcolor);//补光减少
private:
void getCurvePointFillLine(QList<DsAbsItem> &inList, double indRunLen,QList<DsAbsItem> &outList);
int getTotalDistanceFillLine(QList<DsAbsItem> *pPointList, double &dTotal);
bool getPointInSectFillLine(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp);
//距p1点距离为d的点
// d > s : out_p在p2延长线上
// s >= d >= 0 : out_p在p1、p2线段上
// d < 0 : out_p在p1延长线上
bool getPointAtSect(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp);
private:
int m_penX, m_penY;//执行过程中绘制跟踪笔的坐标索引
QPixmap m_canvas;
QPixmap m_penPix;//跟踪笔绘制的临时区域
int m_viewWidth;
int m_viewHight;
int m_tabelColorNum;//颜色数
QRgb * m_pColor;//颜色rgb
QString m_filePath;//文件路径
private:
QByteArray m_dispDat;//绘制图形的绝对数据(进行缩放的)
QByteArray m_ds16ToAbsDat;//ds16转换的绝对数据(用于轮廓提取)
int m_stitchIndex;
int m_dispIndex;
int m_showColorBeg;
int m_showColorEnd;
int m_greyColorBeg;
int m_greyColorEnd;
DISP_MODE m_dispMode;
DRAW_MODE m_drawMode;
signals:
void siDrawNeedleIdx(int idx);
};
#endif // EMBDATA_H

2033
datafile/outline.cpp Normal file

File diff suppressed because it is too large Load Diff

34
datafile/outline.h Normal file
View File

@ -0,0 +1,34 @@
#ifndef OUTLINE_H
#define OUTLINE_H
#include <QObject>
#include <QImage>
#include "datafiledsr.h"
class OutLine : public QObject
{
Q_OBJECT
public:
explicit OutLine(QObject *parent = 0);
public:
void setRangeXY(int maxX,int minX,int maxY,int minY);//设置花样范围
QList<DsrStep> getOutLine(QImage *img);//获取花样轮廓
private:
int m_maxX;
int m_minX;
int m_maxY;
int m_minY;
int getDsrDr(int dx, int dy);
QStringList getDsrPointX(QStringList list_x_contour, int dsr_x_max, int dsr_x_min, int point_x_max, int point_x_min);
QStringList getDsrPointY(QStringList list_y_contour, int dsr_y_max, int dsr_y_min, int point_y_max, int point_y_min);
double getPointLength(int x1, int y1, int x2, int y2);
signals:
public slots:
};
#endif // OUTLINE_H

BIN
english.qm Normal file

Binary file not shown.

11833
english.ts Normal file

File diff suppressed because it is too large Load Diff

1
french.qm Normal file
View File

@ -0,0 +1 @@
<クd<>箆!ソ`。スン

11638
french.ts Normal file

File diff suppressed because it is too large Load Diff

43
items/assistitem.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "assistitem.h"
AssistItem::AssistItem(QObject *parent) : QObject(parent)
{
clean();
}
AssistItem::~AssistItem()
{
clean();
}
AssistItem::AssistItem(const AssistItem & item) : QObject()
{
copyData(item);
}
AssistItem & AssistItem::operator= (const AssistItem & item)
{
copyData(item);
return *this;
}
void AssistItem::clean()
{
m_macType = 0;
m_showPriority = 0;
m_name.clear();
m_topImageName.clear();
m_enumFunction = 0;
}
void AssistItem::copyData(const AssistItem &item)
{
if (this != &item)
{
this->m_macType = item.m_macType;
this->m_showPriority = item.m_showPriority;
this->m_name = item.m_name;
this->m_topImageName = item.m_topImageName;
this->m_enumFunction = item.m_enumFunction;
}
}

36
items/assistitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef ASSISTITEM_H
#define ASSISTITEM_H
#include <QObject>
class AssistItem : public QObject
{
Q_OBJECT
public:
explicit AssistItem(QObject *parent = 0);
~AssistItem();
public:
AssistItem(const AssistItem & item);
AssistItem & operator= (const AssistItem & item);
public:
void clean();
private:
void copyData(const AssistItem & item);
public:
int m_macType; // 机器类型
int m_showPriority; // 显示优先级
QString m_name; // label名称
QString m_topImageName; // 顶图图标logo名称
int m_enumFunction; // 对应的事件的枚举值
signals:
public slots:
};
#endif // ASSISTITEM_H

355
items/cmdconfig.h Normal file
View File

@ -0,0 +1,355 @@
#ifndef CMDCONFIG_H
#define CMDCONFIG_H
//点击触发型参数枚举(绣花机超级用户参数、冲缝绣产线软件设置参数、网络管理参数)
enum CLICK_ALL_FUNCTION {
ROOT_HMICONFIGURATION = 0, //界面配置
ROOT_MACHINEPARA, // 机器参数
ROOT_WORKPARA, // 工作参数
ROOT_TRAVERSESET , // 遍历设置
ROOT_HEADBOARDBUSDETECT, //机头板总线检测
ROOT_AUTOSETSOFTLIMIT, // 自动定软限位
ROOT_EMBHEADPARAMETER, // 平绣机头板参数
ROOT_TOWELHEADPARAMETER, // 毛巾机头板参数
ROOT_COILHEADPARAMETER, // 缠绕机头板参数
ROOT_HCPSPARAMETER, // 换色板参数
ROOT_TOWELHCPSPARAMETER, // 毛巾色板参数
ROOT_PATTERNPARAMETERS, //花样参数
ROOT_EMBLOCKTEST , // 平绣锁头测试
ROOT_EMBHOOKTEST , // 平绣勾刀测试
ROOT_HEADUPDATE, // 平绣机头板升级
ROOT_TOWELHEADUPDATE, // 毛巾机头板升级
ROOT_COILHEADUPDATE, // 缠绕机头板升级
ROOT_HCPSUPDATE, // 换色板升级
ROOT_CLEARPATTERN, //花样总清
ROOT_VERSIONRECOVERY, //版本恢复
ROOT_DEBUGMODE, //界面进入调试模式
ROOT_RESOLUTION, //分辨率
ROOT_MACTYPE, //机器类型
ROOT_PRODUCTTYPE, //产品类型
ROOT_COMBINEEMB, //双头组合绣
ROOT_THREECOMBINEEMB, //三头组合绣
ROOT_HEADEMB, //隔头绣
ROOT_LASER, //激光
ROOT_SHUTTLECHANGE, //自动换梭
ROOT_TRACKROPEEMB, //跟踪绳绣
ROOT_STEPPERDRIVE,//步进驱动
ROOT_CAMCOLORCHANGE,//凸轮换色
ROOT_BEAD, //散珠
ROOT_SEQUIN, //亮片
ROOT_TOWEL, //毛巾
ROOT_COIL, //缠绕
ROOT_SIMPLETOWEL, //简易毛巾
ROOT_INDEFOOT, //独立压脚
ROOT_WATERMARKSET, //主背景水印设置(是否带水印)
ROOT_WIFI, //是否带Wifi
ROOT_GRADIENT, // 3D显示
ROOT_PARASORTSET, //参数分类设置(是否分类)
ROOT_FILESENDMODE,//文件发送模式
ROOT_HMIDECRYPT, // 界面解密
ROOT_CHANGEPASSWORD, //修改一级密码
ROOT_IOTCONFIGURATION, //物联网配置-物联网配置
ROOT_GATEWAYCONNECTIONMETHOD, //物联网配置-网关连接方式
ROOT_RACKNUMBERINPUT, //物联网配置-机架号输入
ROOT_NETWORKSETTINGS, //物联网配置-网络设置
ROOT_DELIVERYTIME, //物联网配置-工厂预计交货时间
ROOT_DEBUGPROGRESS, //物联网配置-调试进度
ROOT_DELETEINI, //删除配置文件
ROOT_IMPORTCSV , //导入CSV文件
ROOT_DELETECSV , //删除CSV文件
ROOT_RESETCSV , //重置安装调试进度
ROOT_FRAMEANGLESETTING, //动框角度设置
ROOT_EMBSPINDlLEGEARRATIO,//平绣主轴齿轮比测试
ROOT_TOWELSPINDlLEGEARRATIO,//毛巾主轴齿轮比测试
ROOT_FLAT_ECD_WIDTH, // 测试平绣主轴编码器宽度
ROOT_FOOTTEST,//独立压脚测试
ROOT_EMBWORKAREA ,//平绣设置可工作区域
ROOT_CHENWORKAREA, //毛巾设置可工作区域
ROOT_COILWORKAREA, //缠绕设置可工作区域
ROOT_FRAMEIMPORTPARA, //动框参数导入
ROOT_FRAMEEXPORTPARA, //动框参数导出
ROOT_CLEARPATTERNFCG, //删除花样fcg文件
ROOT_CLEARPATTERNFCG_FILEID, //清除花样fcg文件影响fileid的数据
PSE_SOFTWAREPARA_IMPORTPARA, // 参数导入
PSE_SOFTWAREPARA_EXPORTPARA, // 参数导出
PSE_SOFTWAREPARA_HMIUPDATE, // 界面升级
PSE_SOFTWAREPARA_MCUPDATE, // 主控升级
PSE_SOFTWAREPARA_EXIT , // 退出程序
//毛巾调试参数
ROOT_LIFTMOTORCONTROL,//提升电机控制
ROOT_ELASTICCONTROL ,//松紧线控制(毛巾)
ROOT_CHENILLECOLORDEBUG// 毛巾换色调试
};
//组合动作功能类型(罩杯口罩机中有用,其他暂未使用)
enum COMBINE_TYPE { TYPE1 = 1, TYPE2, TYPE3,TYPE4,TYPE5,TYPE6,TYPE7,
TYPE8,TYPE9,TYPE10,TYPE11,TYPE12,TYPE13,TYPE14,TYPE15,
TYPE16,TYPE17,TYPE18,TYPE19,TYPE20,TYPE21,TYPE22,
TYPE23,TYPE24,TYPE25,TYPE26,TYPE27};
enum MC_TYPE { NUM1 = 1, NUM2, NUM3, NUM4, NUM5, NUM6, NUM7, NUM8, NUM9 };//板卡号
enum COMBINE_FUN
{
COMBINE_RUN = 1, //组合动作
COMBINE_NULL
};
//产线主界面功能的枚举
enum MAIN_FUNCTION {
MAIN_SENSOR = 1, // 传感器信号
MAIN_PARASET, // 参数设置
MAIN_OUTCONTROL, // 控制动作
MAIN_COMBINEACTION, // 组合动作
MAIN_BOTTOMLINECOUNTRESET, // 底线计数复位
MAIN_COUNTCLEAR , // 计数清零
MAIN_REASTALL ,//整机全部复位
MAIN_MANUALSWITCH, // 手动切换
MAIN_AUTOSWITCH // 自动切换
};
//此头文件定义了常用功能的枚举
enum SHORTCUT_FUNCTION {
//平绣机
FUN_ALLTOZERO = 1, // 全部归零
FUN_FLATEMBHOOK, // 平绣勾线
FUN_SPINDLEJOG, // 主轴点动
FUN_SPINDLEROTATE, // 主轴旋转
FUN_BACKWORKPOINT, // 回工作点
FUN_BACKTOORIGIN, // 回原点
FUN_SETOFFSETPOINT, // 定偏移点
FUN_BACKOFFSETPOINT, // 回偏移点
FUN_SETSTARTEMBPOINT, // 定起绣点(绣花机)
FUN_BACKSTARTEMBPOINT, // 回起绣点(绣花机)
FUN_SETANCHORPOINT, // 定定位点
FUN_BACKANCHORPOINT, // 回定位点
FUN_CHECKFRAME, // 边框检查
FUN_FORWARDORBACK, // 前进回退
FUN_QUANTITYMOVEFRAME, // 定量移框
FUN_NEEDLERODPOSITION, //针杆定位
FUN_SIMULATEFRAME, //空走边框
FUN_PROCESSRESET, //流程复位
FUN_SETFEEDINGPOINT, //定上料点
FUN_BACKFEEDINGPOINT, //回上料点
FUN_MANUALOIL, //手动加油
FUN_PATTERNSELECT, // 花样选择
FUN_SHUTTLECOUNT,//梭盘计数复位
FUN_EMBWORKAREA,//平绣设置可工作区域
FUN_RESETREPEATNUM,//重置反复次数
//亮片
FUN_LEFTSEQUINCHANGECOLOR, // 左亮片换色
FUN_RIGHTSEQUINCHANGECOLOR, // 右亮片换色
//毛巾和平绣都有的功能
FUN_MANUALTRIM, // 手动(平绣,毛巾)剪线
FUN_CUTOPENANDCLOSE, // 剪刀(平绣,毛巾)开合
FUN_SWITCHHEAD, //机头(平绣,毛巾)切换
FUN_MANUALCHANGECOLOR, // 手动(平绣,毛巾)换色
FUN_TOWELCHANGECOLOR, // 毛巾换色 //只有毛巾的时候会用到
FUN_CHENWORKAREA,// 毛巾设置可工作区域
//缠绕
FUN_THREAD, // 缠绕剪线,主轴动作,剪线
FUN_ONOFF, // 缠绕剪刀开合,只剪刀开合动作,也叫做下剪线
FUN_SPINDLE_TO_ANGLE, // 缠绕主轴去指定角度
FUN_COIL_MS_JOG, // 缠绕点动
FUN_COILWORKAREA,// 缠绕设置可工作区域
FUN_MS_ROTATE, //M轴旋转
FUN_PRODUCTSTATIS, //生产统计
FUN_NULL = 10000 // 无功能 无功能应该放在最后一位,因为常用功能得最大值就是无功能,否则无法一一对应
};
//辅助功能的枚举
enum ASSIST_FUNCTION {
ASSIST_SENSOR = 1, // 传感器信号
ASSIST_CONTROLACTION, // 控制动作
ASSIST_HMIUPGRADE, // 界面升级
ASSIST_MCUPGRADE, // 主控升级
ASSIST_EXBUPGRADE, // 外围板升级
ASSIST_PARAIMPORT, // 参数导入
ASSIST_PARAEXPORT, // 参数导出
ASSIST_SOFTWARESET, // 软件设置
ASSIST_AUTHORIZATION, // 软件授权
ASSIST_NETWORK, // 网络管理
ASSIST_WIFI, // WIFI管理
ASSIST_NEEDLESET, // 针杆设置
ASSIST_TIMESET, // 时间设置
ASSIST_SHORTCUTSET, // 常用设置
ASSIST_PRODUCTSTATICS, // 生产统计
ASSIST_LOGFILE,//文件日志
ASSIST_ERRORLOG,//错误日志
ASSIST_BREAKAGELOG,//断线日志
ASSIST_MCVERSION, // 版本信息
ASSIST_EXBVERSION, // 外围板信息
ASSIST_BOTTOMLINEDETECT, //底线检测(平绣)
ASSIST_FACELINEDETECT, //面线检测(平绣)
ASSIST_COILBOTTOMLINEDETECT, //底线检测(缠绕)
ASSIST_COILFACELINEDETECT, //面线检测(缠绕)
ASSIST_SPINDLETEST, //主轴研车
ASSIST_SEQUINDEBUG ,//亮片调试
ASSIST_TOWELDEBUG,//毛巾调试
ASSIST_MSPINDLE_TO_ANGLE,//缠绕M轴去指定角度
ASSIST_CHANGEASHUTTLE ,// 自动换一个梭
ASSIST_AGINGTEST,//老化测试(内缝被界面)
ASSIST_ROOT, //超级用户
ASSIST_SHUTDOWN, //关机
ASSIST_WKPARAIMPORT, // 工作参数导入
ASSIST_BOTTOMLINECOUNTRESET, // 底线计数复位
ASSIST_DEBUGINFO,//调试信息
ASSIST_NULL // 无功能
};
//花样设置功能的枚举
enum PATTERNSET_FUNCTION {
PATTERNSET_PATTERNSELECT = 1, // 花样选择
PATTERNSET_PATTERNPARA, // 花样参数
PATTERNSET_PATTERNCOLOR, // 花样色序
PATTERNSET_TOWELHEIGHT, // 毛巾高度
PATTERNSET_PATTERNIMPORT, // 花样导入
PATTERNSET_PATTERNEXPORT, // 花样导出
PATTERNSET_PATTERNDELETE, // 花样删除
PATTERNSET_NULL // 无功能
};
//参数设置参数类型的枚举
enum PARASET_FUNCTION {
PARASET_POSITION = 1, // 位置参数
PARASET_SPEED, // 速度参数
PARASET_ACTION, // 动作参数
PARASET_DETECT, // 检测参数
PARASET_SETTING , // 设置参数
PARASET_EMB , // 绣花参数
PARASET_CHEN, // 毛巾参数
PARASET_FEED, // 上下料参数
PARASET_SHUTTLE , //自动换梭参数
PARASET_LASER, //激光参数
PARASET_CUT, //剪线参数
PARASET_COIL , //缠绕参数
PARASET_SQU, //亮片参数
PARASET_BEAD , //散珠参数
PARASET_SIMPLETOWEL, //简易毛巾参数
PARASET_TRACKROPR//跟踪绳绣参数
};
//刺绣功能的枚举
enum EMBFUN_FUNCTION {
EMBFUN_BORDEREMB = 1, // 边框刺绣
EMBFUN_MATEEMB, // 匹绣
EMBFUN_HEADEMB, // 隔头绣
EMBFUN_PATCHEMB, // 贴布绣
EMBFUN_OPENLINEEMB, // 开位线绣
EMBFUN_OUTLINE, // 花样轮廓
EMBFUN_OUTLINECHECK, //轮廓刺绣
EMBFUN_LINEOFFSET, // 线迹偏移
EMBFUN_REPEATED, // 反复绣
EMBFUN_WORKSUSPENSION, // 工作暂停(绗绣机)
EMBFUN_NULL // 无功能
};
enum OUTCONTROL_FUN {
OUTCONTROL_ENABLE = 1, // 使能
OUTCONTROL_DISABLE, // 失能
OUTCONTROL_MS_ENABLE, // 平绣主轴电机使能
OUTCONTROL_MS_DISABLE, // 平绣主轴电机失能
OUTCONTROL_TOWEL_ENABLE, // 毛巾主轴电机使能
OUTCONTROL_TOWEL_DISABLE, // 毛巾主轴电机失能
OUTCONTROL_TOWELM_ENABLE, // 毛巾M主轴电机使能
OUTCONTROL_TOWELM_DISABLE, // 毛巾M主轴电机失能
OUTCONTROL_TOWELRM_ENABLE, // 毛巾打环轴电机使能
OUTCONTROL_TOWELRM_DISABLE, // 毛巾打环轴电机失能
OUTCONTROL_COIL_ENABLE, // 缠绕主轴电机使能
OUTCONTROL_COIL_DISABLE, // 缠绕主轴电机失能
OUTCONTROL_COILM_ENABLE, // 缠绕M主轴电机使能
OUTCONTROL_COILM_DISABLE, // 缠绕M主轴电机失能
OUTCONTROL_JOGP, // 正转
OUTCONTROL_JOGN, // 反转
OUTCONTROL_STOP, // 停止
OUTCONTROL_ZERO, // 归零
OUTCONTROL_LEFT, // 左位
OUTCONTROL_MIDDLE, // 中位
OUTCONTROL_RIGHT, // 右位
OUTCONTROL_UP, // 上升
OUTCONTROL_DOWN, // 下降
MANUALACTION_RUN, // 执行
OUTCONTROL_OPEN, // 打开
OUTCONTROL_CLOSE, // 关闭
OUTCONTROL_STARTOIL, // 开始
OUTCONTROL_STOPOIL, // 停止
OUTCONTROL_FOLLOWPOS, // 缠绕压脚跟随位
OUTCONTROL_TOUP, // 缠绕锯齿上位
OUTCONTROL_CTRL1 , //缠绕锯齿摆动位1
OUTCONTROL_CTRL2, //缠绕锯齿摆动位2
OUTCONTROL_ZEROPOS //缠绕锯齿零位
};
//软件设置的顺序枚举
enum ENUM_SOFTWARESET {
SET_THEME = 0, // 主题
SET_LANGUAGE = 0, // 语言
SET_FONTSIZE, //字体大小
SET_CONNECTMODE, //连接方式(通讯方式)
SET_TITLEBAR //设置标题栏
//参数设置界面参数显示方式
};
//花样参数的顺序枚举
enum ENUM_PATTERNPARA {
SET_ROTATESTYLE = 0, // 旋转式样
SET_HORIZONTALSTYLE, // 水平翻转样式
SET_VERTICALSTYLE, // 垂直翻转样式
SET_ROTATEANGLE, // 旋转角度
SET_XZOOM, // X向倍率
SET_YZOOM, // Y向倍率
SET_REPEATSTYLE, // 反复方式
SET_PRIORITY, // 优先次序
SET_XREPEATNUM, // X向反复次数
SET_YREPEATNUM, // Y向反复次数
SET_XREPEATSPACE, // X向反复间距
SET_YREPEATSPACE, // Y向反复间距
SET_LOCKNEEDLESNUM, // 锁针次数
SET_LOCKNEEDLESSTEPNUM, // 锁针步数
SET_LOCKNEEDLESSTEPLENTH, // 锁针针步长度
SET_JUMPNEEDLECHANGE, // 跳针变越框锁针针数
SET_CHANGLOOKNEEDLE, // 换色锁针针数
SET_XCOMPENSATE, // X向补偿
SET_YCOMPENSATE, // Y向补偿
SET_MINSTEP, // 过滤针步长度
SET_STEPCOMPENSATE, // 针步补偿
SET_CONVERTJUMPSTEPSIZE, // 绣花机中需要插入跳针的针步大小
SET_JUMPSTEPSIZE, // 绣花机中插入跳针的针步大小
SET_OFFSETPOINTXENFLAG , // 偏移点X向允许
SET_OFFSETPOINTYENFLAG , // 偏移点Y向允许
SET_OFFSETPOINTX , // 偏移点X
SET_OFFSETPOINTY , // 偏移点Y
SET_MC_REPETITIONPARA1,//反复启动方式
SET_MC_REPETITIONPARA2,//反复绣起绣点是否暂停
SET_MC_XREPEATNUM, // X向反复次数
SET_MC_XREPEATSPACE, // X向反复间距
SET_MC_YREPEATNUM, // Y向反复次数
SET_MC_YREPEATSPACE, // Y向反复间距
SET_MC_PRIORITY, // 优先次序
SET_BEADSEQUIN, //珠片基索引
SET_PLEATEDMODE //是否为褶绣模式
};
//花样轮廓参数的顺序枚举
enum ENUM_PATTERNOUTLINEPARA {
SET_OUTLINESTEP = 0, // 轮廓针步
SET_OUTLINEZOOM, // 轮廓放大
SET_OUTLINESHAPE // 轮廓形状(凹形、凸形)
};
//网络管理设置的顺序枚举
enum ENUM_NETWORKSET {
SET_MQTT_SERVERIP = 0, // 网关服务器IP
SET_MQTT_SERVERPORT, // 网关服务器端口
SET_MACHINE_SERVERIP, // 机器服务器IP
SET_MACHINE_SERVERPORT, // 机器服务器端口
SET_LOCALIP, // 本地IP
SET_LOCALPORT // 本地端口
};
#endif // CMDCONFIG_H

51
items/combactionitem.cpp Normal file
View File

@ -0,0 +1,51 @@
#include "combactionitem.h"
CombActionItem::CombActionItem(QObject *parent) :
QObject(parent)
{
clean();
}
CombActionItem::~CombActionItem()
{
clean();
}
CombActionItem::CombActionItem(const CombActionItem & item) : QObject()
{
copyData(item);
}
CombActionItem & CombActionItem::operator= (const CombActionItem & item)
{
copyData(item);
return *this;
}
void CombActionItem::clean()
{
m_name.clear(); // 名称
m_mcNum = 1;
m_mcType = -1;
m_type = -1;
m_def = -1;
m_btnclickfun = -1;
m_btnprefun = -1;
m_btnrelfun = -1;
}
void CombActionItem::copyData(const CombActionItem & item)
{
if (this != &item)
{
this->m_mcNum = item.m_mcNum;
this->m_mcType = item.m_mcType;
this->m_type = item.m_type;
this->m_name = item.m_name; // 名称
this->m_def = item.m_def;
this->m_btnclickfun = item.m_btnclickfun;
this->m_btnprefun = item.m_btnprefun;
this->m_btnrelfun = item.m_btnrelfun;
}
}

42
items/combactionitem.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef COMBACTIONITEM_H
#define COMBACTIONITEM_H
#include <QObject>
#include "items/cmdconfig.h"
class CombActionItem : public QObject
{
Q_OBJECT
public:
explicit CombActionItem(QObject *parent = 0);
public:
~CombActionItem();
public:
CombActionItem(const CombActionItem & item);
CombActionItem & operator= (const CombActionItem & item);
signals:
public slots:
public:
void clean();
private:
void copyData(const CombActionItem & item);
public:
int m_mcType; //机器类型
QString m_name; // 名称
int m_mcNum; // 板卡号
int m_type; // 功能类型
int m_def; // 对应的事件宏定义
int m_btnclickfun; // 按钮对应的点击事件 -1代表没有
int m_btnprefun; // 按钮对应的按下事件 -1代表没有
int m_btnrelfun; // 按钮对应的抬起事件 -1代表没有
};
#endif // COMBACTIONITEM_H

43
items/embfunctionitem.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "embfunctionitem.h"
EmbFunctionItem::EmbFunctionItem(QObject *parent) : QObject(parent)
{
clean();
}
EmbFunctionItem::~EmbFunctionItem()
{
clean();
}
EmbFunctionItem::EmbFunctionItem(const EmbFunctionItem & item) : QObject()
{
copyData(item);
}
EmbFunctionItem & EmbFunctionItem::operator= (const EmbFunctionItem & item)
{
copyData(item);
return *this;
}
void EmbFunctionItem::clean()
{
m_macType = 0;
m_showPriority = 0;
m_name.clear();
m_topImageName.clear();
m_enumFunction = 0;
}
void EmbFunctionItem::copyData(const EmbFunctionItem &item)
{
if (this != &item)
{
this->m_macType = item.m_macType;
this->m_showPriority = item.m_showPriority;
this->m_name = item.m_name;
this->m_topImageName = item.m_topImageName;
this->m_enumFunction = item.m_enumFunction;
}
}

36
items/embfunctionitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef EMBFUNCTIONITEM_H
#define EMBFUNCTIONITEM_H
#include <QObject>
class EmbFunctionItem : public QObject
{
Q_OBJECT
public:
explicit EmbFunctionItem(QObject *parent = 0);
~EmbFunctionItem();
public:
EmbFunctionItem(const EmbFunctionItem & item);
EmbFunctionItem & operator= (const EmbFunctionItem & item);
public:
void clean();
private:
void copyData(const EmbFunctionItem & item);
public:
int m_macType; // 机器类型
int m_showPriority; // 显示优先级
QString m_name; // label名称
QString m_topImageName; // 顶图图标logo名称
int m_enumFunction; // 对应的事件的枚举值
signals:
public slots:
};
#endif // EMBFUNCTIONITEM_H

View File

@ -0,0 +1,37 @@
#include "errorcodestateitem.h"
ErrorCodeStateItem::ErrorCodeStateItem(QObject *parent) : QObject(parent)
{
clean();
}
ErrorCodeStateItem::~ErrorCodeStateItem()
{
clean();
}
ErrorCodeStateItem::ErrorCodeStateItem(const ErrorCodeStateItem &item) : QObject()
{
copyData(item);
}
ErrorCodeStateItem &ErrorCodeStateItem::operator=(const ErrorCodeStateItem &item)
{
copyData(item);
return *this;
}
void ErrorCodeStateItem::clean()
{
m_code = 0;
m_name.clear();
}
void ErrorCodeStateItem::copyData(const ErrorCodeStateItem &item)
{
if (this != &item)
{
this->m_code = item.m_code ; // 代码
this->m_name = item.m_name ; // 代码对应的名称
}
}

View File

@ -0,0 +1,33 @@
#ifndef ERRORCODESTATEITEM_H
#define ERRORCODESTATEITEM_H
#include <QObject>
class ErrorCodeStateItem : public QObject
{
Q_OBJECT
public:
explicit ErrorCodeStateItem(QObject *parent = 0);
~ErrorCodeStateItem();
public:
ErrorCodeStateItem(const ErrorCodeStateItem & item);
ErrorCodeStateItem & operator= (const ErrorCodeStateItem & item);
public:
void clean();
private:
void copyData(const ErrorCodeStateItem & item);
public:
unsigned int m_code; // 代码
QString m_name; // 代码对应的名称
signals:
public slots:
};
#endif // ERRORCODESTATEITEM_H

63
items/fileitem.cpp Normal file
View File

@ -0,0 +1,63 @@
#include "fileitem.h"
FileItem::FileItem(QObject *parent) :
QObject(parent)
{
clear();
}
FileItem::~FileItem()
{
clear();
}
FileItem::FileItem(const FileItem & item) :
QObject(item.parent())
{
copyData(item);
}
FileItem & FileItem::operator=(const FileItem & item)
{
copyData(item);
return *this;
}
void FileItem::clear()
{
m_filePathName.clear(); // 文件路径
m_showInfo.clear(); // 显示信息
m_imagePath.clear(); // 图片路径
m_previewImage = QImage(); // 图形预览
}
// 拷贝
void FileItem::copyData(const FileItem & item)
{
if (this != &item)
{
this->m_filePathName = item.m_filePathName; // 文件路径
this->m_showInfo = item.m_showInfo; // 显示信息
this->m_imagePath = item.m_imagePath; // 图片路径
this->m_previewImage = item.m_previewImage; // 图形预览
}
}
#if (1)
void FileItem::setFileInfo(QString & path, QString & show, QImage & previewImg)
#else
void FileItem::setFileInfo(QString path, QString show, QImage previewImg)
#endif
{
m_filePathName = path; // 文件路径
m_showInfo = show; // 显示信息
m_previewImage = previewImg; // 预览图形
}
void FileItem::setFileInfo(QString path, QString show, QString imagePath)
{
m_filePathName = path; // 文件路径
m_showInfo = show; // 显示信息
m_imagePath = imagePath; // 图片路径
}

48
items/fileitem.h Normal file
View File

@ -0,0 +1,48 @@
#ifndef FILEITEM_H
#define FILEITEM_H
#include <QObject>
#include <QImage>
#include <QString>
// 文件条目项
class FileItem : public QObject
{
Q_OBJECT
public:
explicit FileItem(QObject *parent = NULL);
FileItem(const FileItem & item);
~FileItem();
public:
FileItem &operator=(const FileItem & item);
public:
void clear();
private:
void copyData(const FileItem & item);
public:
#if (1)
void setFileInfo(QString & path, QString & show, QImage & previewImg);
#else
void setFileInfo(QString path, QString show, QImage previewImg);
#endif
void setFileInfo(QString path, QString show, QString imagePath);
public:
inline const QString & getFilePath() const {return m_filePathName;} // 文件路径
inline const QString & getShowInfo() const {return m_showInfo;} // 显示信息
inline const QString & getImagePath() const {return m_imagePath;} // 图片路径
inline const QImage & getPreviewImage() const {return m_previewImage;} // 图形预览
private:
QImage m_previewImage; // 图形预览
QString m_filePathName; // 文件路径名称
QString m_imagePath; // 图片路径
QString m_showInfo; // 显示信息(文件名称)
signals:
public slots:
};
#endif // FILEITEM_H

1360
items/itemsmanage.cpp Normal file

File diff suppressed because it is too large Load Diff

102
items/itemsmanage.h Normal file
View File

@ -0,0 +1,102 @@
#ifndef ITEMSMANAGE_H
#define ITEMSMANAGE_H
#include "paraitem.h"
#include "outctrlitem.h"
#include "shortcutitem.h"
#include "assistitem.h"
#include "patternsetitem.h"
#include "parasetitem.h"
#include "embfunctionitem.h"
#include "sensoritem.h"
#include "errorcodestateitem.h"
#include "main.h"
#include <QCoreApplication>
#include <QTextCodec>
//添加快捷功能item
ShortCutItem makeAShortCutItem(int macType,int showPriority,
QString name,QString topImageName,
int enumFunction);
//添加辅助功能item
AssistItem makeAAssistItem(int macType,int showPriority,
QString name,QString topImageName,
int enumFunction);
//花样设置功能item
PatternSetItem makeAPatternSetItem(int macType,int showPriority,
QString name,QString topImageName,
int enumFunction);
//参数设置功能item
ParaSetItem makeAParaSetItem(int macType,int showPriority,
QString name,QString topImageName,
int paraType);
//刺绣功能item
EmbFunctionItem makeAEmbFunItem(int macType,int showPriority,
QString name,QString topImageName,
int enumFunction);
//传感器信号item
SensorItem makeASensorItem(int byte,int bit,QString name,int type = -1);
//错误代码/状态item
ErrorCodeStateItem makeAErrorStateItem(int code,QString name);
//添加控制动作item
OutCtrlItem makeAOutCtrlItem(int macType,int showPriority,QString name,int def,
QString btn1Str,bool btn1Visible,
int btn1ClickFun,int btn1PreFun,int btn1RelFun,
QString btn2Str,bool btn2Visible,
int btn2ClickFun,int btn2PreFun,int btn2RelFun,
QString btn3Str,bool btn3Visible,
int btn3ClickFun,int btn3PreFun,int btn3RelFun,
QString btn4Str,bool btn4Visible,
int btn4ClickFun,int btn4PreFun,int btn4RelFun,
QString btn5Str,bool btn5Visible,
int btn5ClickFun,int btn5PreFun,int btn5RelFun);
//添加参数item
ParaItem makeAParaItem(
int64_t mcenSel, /* 机型选择 */
int paraType, /* 参数类型(机器参数、工作参数、花样设置参数...) */
int paraTypeSort, /* 参数类型分类(机器参数的速度参数、机器参数的动作参数...) */
int indexInPara, /* 参数索引,-1提示型显示; >= 0该条目在参数中的位置*/
int bitInWord, /* 参数位索引 */
int readonly, /* 只读标志 */
int valueType, /* 参数值类型 = 0, 无值; = 1, 数字输入型; = 2, 开关选择型; = 3, 列表选择; = 4, 字符输入型*/
QString paraName, /* 参数名称 */
int64_t value, /* int输入型或选择型参数值 */
int64_t minval, /* int输入型参数值范围下限 */
int64_t maxval, /* int输入型参数值范围上限 */
int64_t defvalue, /* int输入型或选择型默认参数值 */
int afterpoint, /* int输入型保留小数位数 */
QString unitstr, /* int输入型单位字符串 */
QString valuestr, /* 字符输入型参数字符串 */
QString selList, /* 列表选择型的参数列表, 通过"\n"来分割 */
int selIdx, /* 当前选择项索引 */
int defIdx, /* 默认选择项索引 */
int showPriority, /* 显示优先级 */
int authority /* 参数权限 */
);
//比较参数优先级
bool comparePriority(const ParaItem & item1, const ParaItem & item2);
//各个机型通用参数
void initSoftwareParasList(QList <ParaItem> & parasList);//软件参数
void initTimeParasList(QList <ParaItem> & parasList);//时间设置参数
void initEmbCommonFunParasList(QList <ParaItem> & parasList);//绣花机常用功能参数
void initNetworkParasList(QList <ParaItem> & parasList);//网络管理参数
void initRootHMIConfigurationList(QList <ParaItem> & parasList);//界面配置参数
void initRootIOTConfigurationList(QList <ParaItem> &parasList); //物联网配置参数
#endif // ITEMSMANAGE_H

101
items/outctrlitem.cpp Normal file
View File

@ -0,0 +1,101 @@
#include "outctrlitem.h"
OutCtrlItem::OutCtrlItem(QObject *parent) : QObject(parent)
{
clean();
}
OutCtrlItem::~OutCtrlItem()
{
clean();
}
OutCtrlItem::OutCtrlItem(const OutCtrlItem & item) : QObject()
{
copyData(item);
}
OutCtrlItem & OutCtrlItem::operator= (const OutCtrlItem & item)
{
copyData(item);
return *this;
}
void OutCtrlItem::clean()
{
m_macType = 0;
m_showPriority = 0;
m_name.clear(); // 名称
m_def = -1;
m_btn1Str.clear();
m_btn1Visible = false;
m_btn1ClickFun = -1;
m_btn1PreFun = -1;
m_btn1RelFun = -1;
m_btn2Str.clear();
m_btn2Visible = false;
m_btn2ClickFun = -1;
m_btn2PreFun = -1;
m_btn2RelFun = -1;
m_btn3Str.clear();
m_btn3Visible = false;
m_btn3ClickFun = -1;
m_btn3PreFun = -1;
m_btn3RelFun = -1;
m_btn4Str.clear();
m_btn4Visible = false;
m_btn4ClickFun = -1;
m_btn4PreFun = -1;
m_btn4RelFun = -1;
m_btn5Str.clear();
m_btn5Visible = false;
m_btn5ClickFun = -1;
m_btn5PreFun = -1;
m_btn5RelFun = -1;
}
void OutCtrlItem::copyData(const OutCtrlItem & item)
{
if (this != &item)
{
this->m_macType = item.m_macType;
this->m_showPriority = item.m_showPriority;
this->m_name = item.m_name; // 名称
this->m_def = item.m_def;
this->m_btn1Str = item.m_btn1Str;
this->m_btn1Visible = item.m_btn1Visible;
this->m_btn1ClickFun = item.m_btn1ClickFun;
this->m_btn1PreFun = item.m_btn1PreFun;
this->m_btn1RelFun = item.m_btn1RelFun;
this->m_btn2Str = item.m_btn2Str;
this->m_btn2Visible = item.m_btn2Visible;
this->m_btn2ClickFun = item.m_btn2ClickFun;
this->m_btn2PreFun = item.m_btn2PreFun;
this->m_btn2RelFun = item.m_btn2RelFun;
this->m_btn3Str = item.m_btn3Str;
this->m_btn3Visible = item.m_btn3Visible;
this->m_btn3ClickFun = item.m_btn3ClickFun;
this->m_btn3PreFun = item.m_btn3PreFun;
this->m_btn3RelFun = item.m_btn3RelFun;
this->m_btn4Str = item.m_btn4Str;
this->m_btn4Visible = item.m_btn4Visible;
this->m_btn4ClickFun = item.m_btn4ClickFun;
this->m_btn4PreFun = item.m_btn4PreFun;
this->m_btn4RelFun = item.m_btn4RelFun;
this->m_btn5Str = item.m_btn5Str;
this->m_btn5Visible = item.m_btn5Visible;
this->m_btn5ClickFun = item.m_btn5ClickFun;
this->m_btn5PreFun = item.m_btn5PreFun;
this->m_btn5RelFun = item.m_btn5RelFun;
}
}

68
items/outctrlitem.h Normal file
View File

@ -0,0 +1,68 @@
#ifndef OUTCTRLITEM_H
#define OUTCTRLITEM_H
#include <QObject>
#include "items/cmdconfig.h"
typedef short int s16;
class OutCtrlItem : public QObject
{
Q_OBJECT
public:
explicit OutCtrlItem(QObject *parent = 0);
~OutCtrlItem();
public:
OutCtrlItem(const OutCtrlItem & item);
OutCtrlItem & operator= (const OutCtrlItem & item);
public:
void clean();
private:
void copyData(const OutCtrlItem & item);
public:
int m_macType; // 机器类型
int m_showPriority; // 显示优先级
QString m_name; // 名称
int m_def; // 对应的事件宏定义
QString m_btn1Str; // 按钮1上的文本
bool m_btn1Visible; // 按钮1是否可见
s16 m_btn1ClickFun; // 按钮1对应的点击事件 -1代表没有
s16 m_btn1PreFun; // 按钮1对应的按下事件 -1代表没有
s16 m_btn1RelFun; // 按钮1对应的抬起事件 -1代表没有
QString m_btn2Str; // 按钮2上的文本
bool m_btn2Visible; // 按钮2是否可见
s16 m_btn2ClickFun; // 按钮2对应的点击事件 -1代表没有
s16 m_btn2PreFun; // 按钮2对应的按下事件 -1代表没有
s16 m_btn2RelFun; // 按钮2对应的抬起事件 -1代表没有
QString m_btn3Str; // 按钮3上的文本
bool m_btn3Visible; // 按钮3是否可见
s16 m_btn3ClickFun; // 按钮3对应的点击事件 -1代表没有
s16 m_btn3PreFun; // 按钮3对应的按下事件 -1代表没有
s16 m_btn3RelFun; // 按钮3对应的抬起事件 -1代表没有
QString m_btn4Str; // 按钮4上的文本
bool m_btn4Visible; // 按钮4是否可见
s16 m_btn4ClickFun; // 按钮4对应的点击事件 -1代表没有
s16 m_btn4PreFun; // 按钮4对应的按下事件 -1代表没有
s16 m_btn4RelFun; // 按钮4对应的抬起事件 -1代表没有
QString m_btn5Str; // 按钮5上的文本
bool m_btn5Visible; // 按钮5是否可见
s16 m_btn5ClickFun; // 按钮5对应的点击事件 -1代表没有
s16 m_btn5PreFun; // 按钮5对应的按下事件 -1代表没有
s16 m_btn5RelFun; // 按钮5对应的抬起事件 -1代表没有
signals:
public slots:
};
#endif // OUTCTRLITEM_H

77
items/paraitem.cpp Normal file
View File

@ -0,0 +1,77 @@
#include "paraitem.h"
ParaItem::ParaItem(QObject *parent) : QObject(parent)
{
clean();
}
ParaItem::~ParaItem()
{
paraName.clear();
selList.clear();
unitStr.clear();
valueStr.clear();
}
ParaItem::ParaItem(const ParaItem & item) : QObject()
{
copyData(item);
}
ParaItem & ParaItem::operator=(const ParaItem & item)
{
copyData(item);
return *this;
}
void ParaItem::clean()
{
mcenSel = 0;
paraType = 0;
paraTypeSort = 0;
indexInPara = -1;
bitInWord = 0;
readonly = 0;
valueType = 0;
paraName = "";
value = 0;
minVal = 0;
maxVal = 0;
defValue = 0;
afterPoint = 0;
unitStr = "";
valueStr = "";
selList = "";
selIdx = -1;
defIdx = -1;
showPriority = 0;
authority = 0;
}
void ParaItem::copyData(const ParaItem & item)
{
if (this != &item)
{
this->mcenSel = item.mcenSel;
this->paraType = item.paraType;
this->paraTypeSort = item.paraTypeSort;
this->indexInPara = item.indexInPara;
this->bitInWord = item.bitInWord;
this->readonly = item.readonly;
this->valueType = item.valueType;
this->paraName = item.paraName;
this->value = item.value;
this->minVal = item.minVal;
this->maxVal = item.maxVal;
this->defValue = item.defValue;
this->afterPoint = item.afterPoint;
this->unitStr = item.unitStr;
this->valueStr = item.valueStr;
this->selList = item.selList;
this->selIdx = item.selIdx;
this->defIdx = item.defIdx;
this->showPriority = item.showPriority;
this->authority = item.authority;
}
}

121
items/paraitem.h Normal file
View File

@ -0,0 +1,121 @@
#ifndef PARAITEM_H
#define PARAITEM_H
#include <QObject>
#include <QString>
#include <QStringList>
#include "items/cmdconfig.h"
class ParaItem : public QObject
{
Q_OBJECT
public:
explicit ParaItem(QObject *parent = 0);
ParaItem(const ParaItem & item);
~ParaItem();
public:
ParaItem &operator=(const ParaItem & item);
public:
void clean();
private:
void copyData(const ParaItem & item);
public:
int64_t mcenSel; // 机型选择
int paraType; // 参数类型(机器参数、工作参数、花样设置参数...)
int paraTypeSort; // 参数类型分类(机器参数的速度参数、机器参数的动作参数...)
int indexInPara; // 参数索引,-1提示型显示; >= 0该条目在参数中的位置
int bitInWord; // 参数位索引
int readonly; // 只读标志
int valueType; // 参数值类型 = 0, 无值; = 1, 数字输入型; = 2, 开关选择型; = 3, 列表选择型; = 4, 字符输入型
public:
QString paraName; // 参数名称
public:
int64_t value; // 数字输入型数值
int64_t minVal; // 输入值范围下限
int64_t maxVal; // 输入值范围上限
int64_t defValue; // 默认值
int afterPoint; // 保留小数位数
QString unitStr; // 单位
QString valueStr; // 字符输入型字符
public:
QString selList; // 列表选择型参数列表,通过"\n"来分割
int selIdx; // 选择项目
int defIdx; // 默认选择
public:
int showPriority; // 显示优先级
int authority; // 参数权限
};
#define PARA_VALUE_TYPE_NONE 0 // 无
#define PARA_VALUE_TYPE_INT 1 // 数值输入型
#define PARA_VALUE_TYPE_SW 2 // 开关型
#define PARA_VALUE_TYPE_LIST 3 // 列表选择型
#define PARA_VALUE_TYPE_STRINPUT 4 // 字符串输入型
#define PARA_VALUE_TYPE_CLICK 5 // 点击触发型
//参数类型(点击触发型的参数种类)
#define PARA_TYPE_MACH 0x00000001 // 主控机器参数
#define PARA_TYPE_WORK 0x00000002 // 主控工作参数
#define PARA_TYPE_DEF_MC 0x00000004 // 出厂默认机器配置参数(读取有效)
#define PARA_TYPE_DEF_WK 0x00000008 // 出厂默认机器工作参数(读取有效)
#define PARA_TYPE_PATTERN 0x00000010 // 花样参数
#define PARA_TYPE_SOFTWARESET 0x00000020 // 软件设置参数
#define PARA_TYPE_TIMESET 0x00000040 // 时间设置参数
#define PARA_TYPE_COMMONFUN 0x00000080 // 常用功能设置参数
#define PARA_TYPE_NETWORKSET 0x00000100 // 网络管理设置参数
#define PARA_TYPE_ROOT 0x00000200 // 超级用户参数
#define PARA_TYPE_ROOTTRAVERSE 0x00000400 // 超级用户遍历参数
#define PARA_TYPE_PATTERNOUTLINE 0x00000800 // 花样轮廓参数
#define PARA_TYPE_PATTERNPATCH_COLOR 0x00001000 // 按色贴布绣参数
#define PARA_TYPE_PATTERNPATCH_NEEDLE 0x00002000 // 按针贴布绣参数
#define PARA_TYPE_SPINDLETEST 0x00004000 //主轴研车参数
#define PARA_TYPE_EMBLOCKTEST 0x00008000 //平绣锁头测试参数
#define PARA_TYPE_EXBUPGRADE 0x00010000 //外围板升级参数
#define PARA_TYPE_HEADPARAMETER 0x00020000 //平绣机头板参数
#define PARA_TYPE_HCPSPARAMETER 0x00040000 //平绣换色板参数
#define PARA_TYPE_HMICONFIGURATION 0x00080000 //界面配置
#define PARA_TYPE_IOTCONFIGURATION 0x00100000 //物联网配置
#define PARA_TYPE_NETWORKSETTINGS 0x00200000 //网络设置
#define PARA_TYPE__ROOT_PATTERN 0x00400000 // 超级用户花样参数(目前用于配置针步补偿)
#define PARA_TYPE_TOWELHEADPARAMETER 0x00800000 //毛巾机头板参数
#define PARA_TYPE_TOWELDEBUG 0x01000000 //毛巾调试参数
#define PARA_TYPE_TOWELHCPSPARAMETER 0x02000000 //毛巾换色板参数
#define PARA_TYPE_COILHEADPARAMETER 0x04000000 //缠绕机头板参数
#define PARA_TYPE_REPEATEMBPARA 0x08000000 //反复绣参数
//参数分类
#define MC_SORT_SPEED 0x00000001 // 速度参数
#define MC_SORT_ACTION 0x00000002 // 动作参数
#define MC_SORT_DETECT 0x00000004 // 检测参数
#define MC_SORT_POSITION 0x00000008 // 位置参数
#define MC_SORT_SETTING 0x00000010 // 设置参数(绣花公用参数)
#define ROOT_SORT_CHENSENSOR 0x00000020 // 缠绕毛巾平绣 机头遍历状态信号参数
#define MC_SORT_DOUBLE_SEQUIN 0x00000040 // 双亮片参数
#define MC_SORT_EMB 0x00000080 // 绣花参数
#define MC_SORT_CHEN 0x00000100 // 毛巾参数
#define MC_SORT_FEED 0x00000200 // 上下料参数
#define MC_SORT_SHUTTLE 0x00000400 // 自动换梭参数
#define MC_SORT_LASER 0x00000800 // 激光参数
#define MC_SORT_CUT 0x00001000 //剪线参数
#define MC_SORT_COIL 0x00002000 //缠绕参数
#define ROOT_SORT_EMBSENSOR 0x00004000 // 平绣机头遍历状态信号参数
#define MC_SORT_BEAD 0x00008000 // 散珠参数
#define MC_SORT_SIMPLETOWEL 0x00010000 // 简易毛巾参数
#define MC_REPEATED 0x00020000 //反复绣参数
#define MC_SORT_EIGHT_SEQUIN 0x00040000 // 八亮片参数//(双亮片和八亮片的配置显示的参数不一样)
#define MC_SORT_TRACKROPR 0x00080000 // 跟踪绳绣参数
#define PATCH_SORT_IDX 0x0001 // 贴布绣针数索引
#define PATCH_SORT_MOVE 0x0002 // 贴布绣针数索引移动距离
#define PATCH_SORT_COLOR 0x0003 // 贴布绣按色
#endif // PARAITEM_H

44
items/parasetitem.cpp Normal file
View File

@ -0,0 +1,44 @@
#include "parasetitem.h"
ParaSetItem::ParaSetItem(QObject *parent) : QObject(parent)
{
clean();
}
ParaSetItem::~ParaSetItem()
{
clean();
}
ParaSetItem::ParaSetItem(const ParaSetItem & item) : QObject()
{
copyData(item);
}
ParaSetItem & ParaSetItem::operator= (const ParaSetItem & item)
{
copyData(item);
return *this;
}
void ParaSetItem::clean()
{
m_macType = 0;
m_showPriority = 0;
m_name.clear();
m_topImageName.clear();
m_paraType = 1;
}
void ParaSetItem::copyData(const ParaSetItem &item)
{
if (this != &item)
{
this->m_macType = item.m_macType;
this->m_showPriority = item.m_showPriority;
this->m_name = item.m_name;
this->m_topImageName = item.m_topImageName;
this->m_paraType = item.m_paraType;
}
}

36
items/parasetitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef PARASETITEM_H
#define PARASETITEM_H
#include <QObject>
class ParaSetItem : public QObject
{
Q_OBJECT
public:
explicit ParaSetItem(QObject *parent = 0);
~ParaSetItem();
public:
ParaSetItem(const ParaSetItem & item);
ParaSetItem & operator= (const ParaSetItem & item);
public:
void clean();
private:
void copyData(const ParaSetItem & item);
public:
int m_macType; // 机器类型
int m_showPriority; // 显示优先级
QString m_name; // label名称
QString m_topImageName; // 顶图图标logo名称
int m_paraType; // 参数类型
signals:
public slots:
};
#endif // PARASETITEM_H

43
items/patternsetitem.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "patternsetitem.h"
PatternSetItem::PatternSetItem(QObject *parent) : QObject(parent)
{
clean();
}
PatternSetItem::~PatternSetItem()
{
clean();
}
PatternSetItem::PatternSetItem(const PatternSetItem & item) : QObject()
{
copyData(item);
}
PatternSetItem & PatternSetItem::operator= (const PatternSetItem & item)
{
copyData(item);
return *this;
}
void PatternSetItem::clean()
{
m_macType = 0;
m_showPriority = 0;
m_name.clear();
m_topImageName.clear();
m_enumFunction = 0;
}
void PatternSetItem::copyData(const PatternSetItem &item)
{
if (this != &item)
{
this->m_macType = item.m_macType;
this->m_showPriority = item.m_showPriority;
this->m_name = item.m_name;
this->m_topImageName = item.m_topImageName;
this->m_enumFunction = item.m_enumFunction;
}
}

36
items/patternsetitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef PATTERNSETITEM_H
#define PATTERNSETITEM_H
#include <QObject>
class PatternSetItem : public QObject
{
Q_OBJECT
public:
explicit PatternSetItem(QObject *parent = 0);
~PatternSetItem();
public:
PatternSetItem(const PatternSetItem & item);
PatternSetItem & operator= (const PatternSetItem & item);
public:
void clean();
private:
void copyData(const PatternSetItem & item);
public:
int m_macType; // 机器类型
int m_showPriority; // 显示优先级
QString m_name; // label名称
QString m_topImageName; // 顶图图标logo名称
int m_enumFunction; // 对应的事件的枚举值
signals:
public slots:
};
#endif // PATTERNSETITEM_H

46
items/sensoritem.cpp Normal file
View File

@ -0,0 +1,46 @@
#include "sensoritem.h"
SensorItem::SensorItem(QObject *parent) : QObject(parent)
{
clean();
}
SensorItem::~SensorItem()
{
clean();
}
SensorItem::SensorItem(const SensorItem & item) : QObject()
{
copyData(item);
}
SensorItem & SensorItem::operator= (const SensorItem & item)
{
copyData(item);
return *this;
}
void SensorItem::clean()
{
m_byte_offset = -1; // 字节偏移值
m_bit_offset = -1; // 字节内位偏移值
m_name.clear(); // 名称
m_type = -1; // 传感器类型
}
void SensorItem::copyData(const SensorItem & item)
{
m_byte_offset = item.m_byte_offset ; // 字节偏移值
m_bit_offset = item.m_bit_offset ; // 字节内位偏移值
m_name = item.m_name ; // 名称
m_type = item.m_type; // 传感器类型
}
void SensorItem::setItemValue(int woffset, int boffset, QString name, int type)
{
m_byte_offset = woffset ; // 字节偏移值
m_bit_offset = boffset ; // 字节内位偏移值
m_name = name ; // 名称
m_type = type; // 传感器类型
}

35
items/sensoritem.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef __SENSORITEM_H__
#define __SENSORITEM_H__
#include <QObject>
#define MAX_SENSOR_NUM (1024*8)
class SensorItem : public QObject
{
Q_OBJECT
public:
explicit SensorItem(QObject *parent = 0);
~SensorItem();
public:
SensorItem(const SensorItem & item);
SensorItem & operator= (const SensorItem & item);
public:
void clean();
private:
void copyData(const SensorItem & item);
public:
void setItemValue(int woffset, int boffset, QString name, int type = -1);
public:
int m_byte_offset; // 字节偏移值
int m_bit_offset; // 字节内的位偏移值
QString m_name; // 名称
int m_type; // 传感器类型
};
#endif // __SENSORITEM_H__

43
items/shortcutitem.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "shortcutitem.h"
ShortCutItem::ShortCutItem(QObject *parent) : QObject(parent)
{
clean();
}
ShortCutItem::~ShortCutItem()
{
clean();
}
ShortCutItem::ShortCutItem(const ShortCutItem & item) : QObject()
{
copyData(item);
}
ShortCutItem & ShortCutItem::operator= (const ShortCutItem & item)
{
copyData(item);
return *this;
}
void ShortCutItem::clean()
{
m_macType = 0;
m_showPriority = 0;
m_name.clear();
m_topImageName.clear();
m_enumFunction = 0;
}
void ShortCutItem::copyData(const ShortCutItem &item)
{
if (this != &item)
{
this->m_macType = item.m_macType;
this->m_showPriority = item.m_showPriority;
this->m_name = item.m_name;
this->m_topImageName = item.m_topImageName;
this->m_enumFunction = item.m_enumFunction;
}
}

35
items/shortcutitem.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef SHORTCUTITEM_H
#define SHORTCUTITEM_H
#include <QObject>
class ShortCutItem : public QObject
{
Q_OBJECT
public:
explicit ShortCutItem(QObject *parent = 0);
~ShortCutItem();
public:
ShortCutItem(const ShortCutItem & item);
ShortCutItem & operator= (const ShortCutItem & item);
public:
void clean();
private:
void copyData(const ShortCutItem & item);
public:
int m_macType; // 机器类型
int m_showPriority; // 显示优先级
QString m_name; // label名称
QString m_topImageName; // 顶图图标logo名称
int m_enumFunction; // 对应的事件的枚举值
signals:
public slots:
};
#endif // SHORTCUTITEM_H

BIN
korean.qm Normal file

Binary file not shown.

13122
korean.ts Normal file

File diff suppressed because it is too large Load Diff

438
machine/comm/comm.cpp Normal file
View File

@ -0,0 +1,438 @@
//-------------------------------------------------------------------------------
// File Name: comm.cpp
// Brief:
// Version: 1.0.0
// Create Date: 2017/05/08
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2017, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2017/05/08
//-------------------------------------------------------------------------------
#define _IN_COMM_CPP
#include "comm.h"
#include "crc16.h"
//--------------------------------------------------------------------------------------------------
// 读空缓冲区
void readBuffEmpty(DataExFuns * funs)
{
int rslt, len;
u8 temp;
len = funs->getRsvLen();
while (len > 0)
{
rslt = funs->getCommData(&temp, 1);
if (rslt != 1)
{
rslt = 0;
break;
}
len--;
}
}
//--------------------------------------------------------------------------------------------------
// 功能: 从通讯口接收缓冲区中得到一个数据包, 如果有附加数据,包括附加数据
// 参数: pPacket, 数据包指针
// 返回: >=0, 成功取得一个数据包,包括定长数据包和可变长度数据包,返回值为数据包长度
// -1, 参数错误
// -2, CRC错误
// -3, 数据不足
// -4, 没有找到同步序列
// -5等待接收数据超时
// -6, 数据包参数错误
// -7, 附加数据CRC错误
// -8, 发生未知错误
// 结果: 如果正确取得数据包,或通讯口没有命令, 循环队列尾指针回向后移动
int getANormalPacket(DataExFuns * funs, DataPacket * pPacket)
{
int rslt, len;
int i;
int phase;
int status;
int exlen;
static int rdstatus = 0;
static u8 odBuf[LEN_NORMAL_PACKET];
u8 temp;
u8 rdBuf[LEN_NORMAL_PACKET];
DataPacket * pDat;
u8 getBuf[LEN_NORMAL_PACKET-DP_SYNC_LEN];
int getBuflen;
int getIdx;
u8 tmpBuf[LEN_NORMAL_PACKET-DP_SYNC_LEN];
int tmpBuflen;
if (funs == NULL || pPacket == NULL)
{
return -1;
}
rslt = 0;
i = 0; // 扫描字节计数器
getBuflen = 0;
getIdx = 0;
tmpBuflen = 0;
pDat = (DataPacket *)rdBuf;
if (rdstatus == 0)
{
do
{
len = funs->getRsvLen(); // 得到接收长度
len += getBuflen; // 加上已经获取的长度
if (len < LEN_NORMAL_PACKET)
{
rslt = -3;
break; // 没有足够数据
}
phase = 0;
status = 0;
rslt = 0;
// 从接收缓冲区中找数据包
while(((len + phase) >= LEN_NORMAL_PACKET) && (phase < LEN_NORMAL_PACKET))
{
if (getBuflen == 0)
{
if (phase == 0 && i > MAX_ONCE_SCAN)
{
rslt = -4;
break; // 查找同步序列超出最大单次扫描字节数
}
rslt = funs->getCommData(&temp, 1);
if (rslt != 1)
{
printf("error at GetCommData rslt\r\n");
rslt = -8;
break;
}
rslt = 0;
i++; // 扫描字数增加
}
else
{
temp = getBuf[getIdx];
getIdx++;
getBuflen--;
}
len--; // 剩余长度减小
pDat->buff.normal[phase] = temp;
if (phase < DP_SYNC_LEN) // 识别同步序列
{
tmpBuflen = 0;
if (phase == 0)
{
if (temp == FLDP_SYNC[0])
{
status = 1;
}
else if (temp == VLDP_SYNC[0])
{
status = 2;
}
else
{
status = 0;
phase = 0;
rslt = 0; // 非同步序列
break;
}
}
else
{
if (status == 1)
{
if (temp != FLDP_SYNC[phase])
{
status = 0;
phase = 0;
rslt = 0;
break;
}
}
else if (status == 2)
{
if (temp != VLDP_SYNC[phase])
{
status = 0;
phase = 0;
rslt = 0;
break;
}
}
else
{
printf("error status in GetANormalPacket\r\n");
rslt = -8;
break;
}
}
}
else
{
tmpBuf[tmpBuflen] = temp;
tmpBuflen++;
}
phase++;
}
if (rslt != 0)
{
break;
}
if (phase >= LEN_NORMAL_PACKET) // 得到数据包
{
u16 crc;
crc = calcCrc16(pDat->normal.content, DP_CONT_LEN);
if (crc == pDat->normal.crc)
{
// 得到正确数据包
memcpy(pPacket, pDat, LEN_NORMAL_PACKET);
// printf("GetANormalPacket ok\r\n");
rslt = LEN_NORMAL_PACKET;
break;
}
else
{
// CRC 不正确
printf("crc error in GetANormalPacket\r\n");
// 拷贝需要再判断的数据
if (tmpBuflen != 0)
{
memcpy(getBuf, tmpBuf, tmpBuflen);
}
getBuflen = tmpBuflen;
getIdx = 0;
// continue;
}
}
else
{
// 没有找到同步序列的情况
getBuflen = 0;
getIdx = 0;
// continue;
}
}while(1);
}
if (rdstatus == 1)
{
memcpy(pPacket, odBuf, LEN_NORMAL_PACKET);
rslt = LEN_NORMAL_PACKET;
}
// 附加数据
if (rslt == LEN_NORMAL_PACKET)
{
if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0) // 是可变长度数据包
{
exlen = pPacket->vldp.exlen;
if (exlen > MAX_EXDP_LEN)
{
printf("data exlen error, len=%d\r\n", exlen);
return -6; // 数据包参数错误
}
memset(pPacket->buff.exData, 0, MAX_EXDP_LEN);
i = 0;
status = 0; // 作为历史计数器
// 读取附加数据
do
{
rslt = funs->getCommData(pPacket->buff.exData, exlen);
if (rslt == exlen)
{
u16 crc;
// 校验CRC
crc = calcCrc16(pPacket->buff.exData, exlen);
if (crc == pPacket->vldp.excrc)
{
// printf("get exdata ok\r\n");
rslt = exlen+LEN_NORMAL_PACKET;
}
else
{
printf("crc error at get exdata\r\n");
rslt = -7; // CRC错误
}
rdstatus = 0;
break; // 得到数据
}
else if (rslt == 0)
{
memcpy(odBuf, pPacket, LEN_NORMAL_PACKET);
rdstatus = 1;
rslt = -3;
break;
/*
// 数据不足
if (funs->delay != NULL)
{
funs->delay(1); // 延时等待
}
len = funs->getRsvLen(); // 得到接收数据长度
qDebug()<<"getRsvLen"<<len;
if (len != status) // 和上次长度比较
{
status = len;
i = 0;
}
else // 如果没有变化,则计数器增加
{
i++;
if (i > GTEX_TIME_OUT) // 如果无变化计数器值大于超时值
{
qDebug()<<"call GetCommData timeout";
rslt = -5;
break;
}
}
*/
}
else
{
qDebug()<<"error after call GetCommData";
break;
}
}while(1);
}
}
return rslt;
}
//--------------------------------------------------------------------------------------------------
// 功能: 添加数据到发送队列中, 通过通讯口发送数据
// 参数: pPacket, 需要发送的数据,已经正确存放在了相应字段。
// 结果:
// 0, 可以发送, 添加到了发送数据队列中
// -1, 参数错误
// -2发送错误
// 1, 队列已满, 不能发送
int sendAPacket(DataExFuns * funs, DataPacket * pPacket)
{
int rslt;
int freelen, sendlen;
if (pPacket == NULL)
{
return -1;
}
if (memcmp(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN) == 0)
{
sendlen = LEN_NORMAL_PACKET;
}
else if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0)
{
sendlen = LEN_NORMAL_PACKET + pPacket->vldp.exlen;
}
else
{
printf("para err, not a corrected packet\r\n");
return -1;
}
freelen = funs->getTrsFreeLen();
if (freelen < sendlen)
{
// printf("buff is full in SendAPacket\r\n");
return 1;
}
rslt = funs->sendCommData(pPacket->datbuff, sendlen);
if (rslt != sendlen)
{
printf("error at call SendCommData, rslt=%d\r\n", rslt);
return -2;
}
return 0;
}
//--------------------------------------------------------------------------------------------------
// 功能: 打包一个固定长度数据包
// 参数:
// pPacket, 需要打包的数据包其中除了sync和crc的部分已经就绪
// 结果:
// 0, 打包好数据
// -1, 参数错误
int packetAFLDP(DataPacket * pPacket)
{
if (pPacket == NULL)
{
return -1;
}
memcpy(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN);
pPacket->normal.crc = calcCrc16(pPacket->normal.content, DP_CONT_LEN);
return 0;
}
//--------------------------------------------------------------------------------------------------
// 功能: 打包一个可变长度数据包
// 参数: pPacket, 需要打包的数据包,需要填充其中的 SYNC EXLEN EXCRC 和 EXDAT 等部分
// pExdat, 附加数据,可以为空
// exlen附加数据长度可以为0
// 结果:
// 0, 打包好数据
// -1, 参数错误
// -2
int packetAVLDP(DataPacket * pPacket, u8 * pExdat, u16 exlen)
{
if (pPacket == NULL)
{
return -1;
}
if (pExdat == NULL)
{
exlen = 0;
}
memcpy(pPacket->vldp.sync, VLDP_SYNC, DP_SYNC_LEN);
pPacket->vldp.exlen = exlen;
pPacket->vldp.excrc = calcCrc16(pExdat, exlen);
pPacket->vldp.crc = calcCrc16(pPacket->normal.content, DP_CONT_LEN);
if (exlen != 0)
{
memcpy(pPacket->vldp.exData, pExdat, exlen);
}
return 0;
}
//--------------------------------------------------------------------------------------------------

205
machine/comm/comm.h Normal file
View File

@ -0,0 +1,205 @@
//-------------------------------------------------------------------------------
// File Name: comm.h
// Brief:
// Version: 1.0.0
// Create Date: 2017/05/08
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2017, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2017/05/08
//-------------------------------------------------------------------------------
#ifndef __COMM_H__
#define __COMM_H__
#include "typedef.h"
#include <string.h>
#include <QDebug>
#include <stdio.h>
//------------------------------------------------------------------------
// 通讯数据包定义
//------------------------------------
/*
1.
|-------------------------------------------------------------------|-----------|
| | | |
|-------------------------------------------------------------------|-----------|
| B0 B1 B2 B3 | B4 B5 | B6 B7 B8 B9 B10 B11 B12 B13 | B14 B15 |
|-------------------------------------------------------------------|-----------|
| | | | B4--B13的 |
| | ID | | |
| 'F','L','D','P' | | | 16CRC |
|-------------------------------------------------------------------|-----------|
2.
|---------------------------------------------------------------------------|-----------|----------------
| | | | |
|---------------------------------------------------------------------------|-----------|---------------|
| B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 B12 B13 | B14 B15 | B16--Bn |
|---------------------------------------------------------------------------|-----------|---------------|
| | | | | | B4--B13的 | |
| | ID | | | | | |
| 'V','L','D','P' | | | | | 16CRC | |
|---------------------------------------------------------------------------|-----------|---------------|
0--1024
*/
//------------------------------------
#define DP_SYNC_LEN 4 // 数据识别序列长度
#define DP_CONT_LEN 10 // 数据内容长度
#define DP_CRC_LEN 2 // 校验字长度
#define MAX_EXDP_LEN 1024 // 最大附加数据长度
#define LEN_NORMAL_PACKET (DP_SYNC_LEN+DP_CONT_LEN+DP_CRC_LEN)
#define MAX_INDP_PARA 8
#ifdef _IN_COMM_CPP
const u8 FLDP_SYNC[DP_SYNC_LEN] =
{
'F','L','D','P',
};
const u8 VLDP_SYNC[DP_SYNC_LEN] =
{
'V','L','D','P',
};
#else
extern const u8 FLDP_SYNC[DP_SYNC_LEN];
extern const u8 VLDP_SYNC[DP_SYNC_LEN];
#endif
//-----------------------------------------------------------------------
typedef union
{
u8 datbuff[LEN_NORMAL_PACKET+MAX_EXDP_LEN]; // dat buff 方式
struct
{
u8 normal[LEN_NORMAL_PACKET];
u8 exData[MAX_EXDP_LEN];
} __attribute__ ((packed)) buff; // buff方式
struct
{
u8 sync[DP_SYNC_LEN];
u8 content[DP_CONT_LEN];
u16 crc;
} __attribute__ ((packed)) normal; // 通用方式
struct
{
u8 sync[DP_SYNC_LEN];
u16 cmd;
u8 para[8];
u16 crc;
} __attribute__ ((packed)) fldp; // fldp方式
struct
{
u8 sync[DP_SYNC_LEN];
u16 cmd;
u16 exlen;
u16 excrc;
u8 para[4];
u16 crc;
u8 exData[MAX_EXDP_LEN];
} __attribute__ ((packed)) vldp; // vldp方式
} DataPacket;
//-----------------------------------------------------------------------
typedef struct
{
int (*sendCommData)(u8 *, int);
int (*getCommData)(u8 *, int);
int (*getRsvLen)(void);
int (*getTrsFreeLen)(void);
void (*delay)(u32);
} DataExFuns;
//-----------------------------------------------------------------------
// 读空缓冲区
void readBuffEmpty(DataExFuns * funs);
//-----------------------------------------------------------------------
// 功能: 从通讯口接收缓冲区中得到一个数据包,
// 只能取得普通数据包结构. 如果数据包还有附加数据, 那么需要用 GetExCommData 函数取得
// 参数: pPacket, 数据包指针
// 返回: >=0, 成功取得一个数据包,包括定长数据包和可变长度数据包,返回值为数据包长度
// -1, 参数错误
// -2, CRC错误
// -3, 数据不足
// -4, 没有找到同步序列
// -5等待接收数据超时
// -6, 数据包参数错误
// -7, 附加数据CRC错误
// -8, 发生未知错误
// 结果: 如果正确取得数据包,或通讯口没有命令, 循环队列尾指针回向后移动
#define MAX_ONCE_SCAN (LEN_NORMAL_PACKET*10) // 一次扫描最大字节数
#define GTEX_TIME_OUT 100 // 得到数据包超时时间单位是ms
int getANormalPacket(DataExFuns * funs, DataPacket * pPacket);
//--------------------------------------------------------------------------------------------------
// 功能: 添加数据到发送队列中, 通过通讯口发送数据
// 参数: pPacket, 需要发送的数据,已经正确存放在了相应字段。
// 结果:
// 0, 可以发送, 添加到了发送数据队列中
// -1, 参数错误
// -2发送错误
// 1, 队列已满, 不能发送
int sendAPacket(DataExFuns * funs, DataPacket * pPacket);
//--------------------------------------------------------------------------------------------------
// 功能: 打包一个固定长度数据包
// 参数:
// pPacket, 需要打包的数据包其中除了sync和crc的部分已经就绪
// 结果:
// 0, 打包好数据
// -1, 参数错误
int packetAFLDP(DataPacket * pPacket);
//--------------------------------------------------------------------------------------------------
// 功能: 打包一个可变长度数据包
// 参数: pPacket, 需要打包的数据包,需要填充其中的 SYNC EXLEN EXCRC 和 EXDAT 等部分
// pExdat, 附加数据,可以为空
// exlen附加数据长度可以为0
// 结果:
// 0, 打包好数据
// -1, 参数错误
// -2
int packetAVLDP(DataPacket * pPacket, u8 * pExdat, u16 exlen);
//--------------------------------------------------------------------------------------------------
#endif

40
machine/comm/config.h Normal file
View File

@ -0,0 +1,40 @@
#ifndef __CONFIG_H__
#define __CONFIG_H__
#include "typedef.h"
#include <QImage>
#define EMBROIDERY
#define EMB_BF_SW_ND 448 // 绣花机最大换色数 原为288,lxs20220803客户有一个花样需要448色序,进行更改
#define MAX_EXDP_LEN 1024 // 最大附加数据长度
#define ANCHOR_POINT 0x00 //定位点
#define START_POINT 0x01 //起绣点
#define FLATEMB 1 //遍历设置的平绣机
#define COIL 4 //遍历设置的缠绕机头
#define TOWEL 5 //遍历设置的毛巾机
#define TOWEL_DOWN_HEAD 0x08 // 毛巾下机头
#define TOWELM 6 //毛巾M轴
#define CHAIN 7 //毛巾链式
#define SAWTOOTH 9 //锯齿
#define RIBBON 10 //盘带
#define COILM 11 //缠绕M轴
#define LASER 12 //激光
//针杆个数
#define COILNEEDLE 9 //缠绕
#define SAWTOOTHNEEDLE 6 //锯齿
#define RIBBONNEEDLE 2 //盘带
#define LASERNEEDLE 10 //激光
#define ELASTICWIRE_COLORCHANGE_POS 1 // 松紧线电机换色位
#define ELASTICWIRE_TRIMMING_POS 2 // 松紧线电机剪线位
#define ELASTICWIRE_CHAIN_POS 3 // 松紧线电机链式位
#define ELASTICWIRE_CHENILLE_POS 4 // 松紧线电机毛巾位
#define IMAGE_TYPE (QImage::Format_ARGB32)
#endif

159
machine/comm/crc16.cpp Normal file
View File

@ -0,0 +1,159 @@

//-------------------------------------------------------------------------------
// File Name: crc16.cpp
// Brief:
// Version: 1.0.0
// Create Date: 2017/05/08
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2017, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2017/05/08
//-------------------------------------------------------------------------------
#include "crc16.h"
//-------------------------------------------------------------------------------
#ifdef USE_CRC_TABLE
// 16 位 crc 列表
u16 CRC16_LIST[256] =
{
0x0000, 0x3096, 0x612C, 0x51BA, 0xC419, 0xF48F, 0xA535, 0x95A3,
0x8832, 0xB8A4, 0xE91E, 0xD988, 0x4C2B, 0x7CBD, 0x2D07, 0x1D91,
0x1064, 0x20F2, 0x7148, 0x41DE, 0xD47D, 0xE4EB, 0xB551, 0x85C7,
0x9856, 0xA8C0, 0xF97A, 0xC9EC, 0x5C4F, 0x6CD9, 0x3D63, 0x0DF5,
0x20C8, 0x105E, 0x41E4, 0x7172, 0xE4D1, 0xD447, 0x85FD, 0xB56B,
0xA8FA, 0x986C, 0xC9D6, 0xF940, 0x6CE3, 0x5C75, 0x0DCF, 0x3D59,
0x30AC, 0x003A, 0x5180, 0x6116, 0xF4B5, 0xC423, 0x9599, 0xA50F,
0xB89E, 0x8808, 0xD9B2, 0xE924, 0x7C87, 0x4C11, 0x1DAB, 0x2D3D,
0x4190, 0x7106, 0x20BC, 0x102A, 0x8589, 0xB51F, 0xE4A5, 0xD433,
0xC9A2, 0xF934, 0xA88E, 0x9818, 0x0DBB, 0x3D2D, 0x6C97, 0x5C01,
0x51F4, 0x6162, 0x30D8, 0x004E, 0x95ED, 0xA57B, 0xF4C1, 0xC457,
0xD9C6, 0xE950, 0xB8EA, 0x887C, 0x1DDF, 0x2D49, 0x7CF3, 0x4C65,
0x6158, 0x51CE, 0x0074, 0x30E2, 0xA541, 0x95D7, 0xC46D, 0xF4FB,
0xE96A, 0xD9FC, 0x8846, 0xB8D0, 0x2D73, 0x1DE5, 0x4C5F, 0x7CC9,
0x713C, 0x41AA, 0x1010, 0x2086, 0xB525, 0x85B3, 0xD409, 0xE49F,
0xF90E, 0xC998, 0x9822, 0xA8B4, 0x3D17, 0x0D81, 0x5C3B, 0x6CAD,
0x8320, 0xB3B6, 0xE20C, 0xD29A, 0x4739, 0x77AF, 0x2615, 0x1683,
0x0B12, 0x3B84, 0x6A3E, 0x5AA8, 0xCF0B, 0xFF9D, 0xAE27, 0x9EB1,
0x9344, 0xA3D2, 0xF268, 0xC2FE, 0x575D, 0x67CB, 0x3671, 0x06E7,
0x1B76, 0x2BE0, 0x7A5A, 0x4ACC, 0xDF6F, 0xEFF9, 0xBE43, 0x8ED5,
0xA3E8, 0x937E, 0xC2C4, 0xF252, 0x67F1, 0x5767, 0x06DD, 0x364B,
0x2BDA, 0x1B4C, 0x4AF6, 0x7A60, 0xEFC3, 0xDF55, 0x8EEF, 0xBE79,
0xB38C, 0x831A, 0xD2A0, 0xE236, 0x7795, 0x4703, 0x16B9, 0x262F,
0x3BBE, 0x0B28, 0x5A92, 0x6A04, 0xFFA7, 0xCF31, 0x9E8B, 0xAE1D,
0xC2B0, 0xF226, 0xA39C, 0x930A, 0x06A9, 0x363F, 0x6785, 0x5713,
0x4A82, 0x7A14, 0x2BAE, 0x1B38, 0x8E9B, 0xBE0D, 0xEFB7, 0xDF21,
0xD2D4, 0xE242, 0xB3F8, 0x836E, 0x16CD, 0x265B, 0x77E1, 0x4777,
0x5AE6, 0x6A70, 0x3BCA, 0x0B5C, 0x9EFF, 0xAE69, 0xFFD3, 0xCF45,
0xE278, 0xD2EE, 0x8354, 0xB3C2, 0x2661, 0x16F7, 0x474D, 0x77DB,
0x6A4A, 0x5ADC, 0x0B66, 0x3BF0, 0xAE53, 0x9EC5, 0xCF7F, 0xFFE9,
0xF21C, 0xC28A, 0x9330, 0xA3A6, 0x3605, 0x0693, 0x5729, 0x67BF,
0x7A2E, 0x4AB8, 0x1B02, 0x2B94, 0xBE37, 0x8EA1, 0xDF1B, 0xEF8D
};
#else
#ifdef SHIFT_RIGHT // 如果是右移
#define CRC_GEN 0xa001 // 使用多项式 0xa001
#else // 如果是左移
#define CRC_GEN 0x8005 // 使用多项式 0x8005
#endif // #ifdef SHIFT_RIGHT
#endif
//-------------------------------------------------------------------------------
u16 addCrc16(u16 crcword, u8 dat)
{
#ifdef USE_CRC_TABLE // 查表法crc
crcword = (crcword >> 8) ^ CRC16_LIST[(crcword ^ dat) & 0xFF];
#else
u8 i;
crcword ^= dat;
for (i = 0; i < 8; i++)
{
#ifdef SHIFT_RIGHT // 右移计算crc
if ((LOBYTE(crcword) & 0x01) != 0)
{
crcword >>= 1;
crcword ^= CRC_GEN;
}
else
{
crcword >>= 1;
}
#else // 左移计算crc
if ((HIBYTE(crcword) & 0x80) != 0)
{
crcword <<= 1;
crcword ^= CRC_GEN;
}
else
{
crcword <<= 1;
}
#endif
}
#endif
return crcword;
}
//-------------------------------------------------------------------------------
u16 calcCrc16(u8 * pBuf, int lenBuf)
{
int i;
u16 crcword = CRC_INIT;
for (i = 0; i < lenBuf; i++)
{
crcword = addCrc16(crcword, pBuf[i]);
}
return crcword;
}
//-------------------------------------------------------------------------------
u8 calcCheckSum8(u8 * pBuf, int lenBuf)
{
int i;
u8 checksum = 0;
for (i = 0; i < lenBuf; i++)
{
checksum += pBuf[i];
}
return checksum;
}
//-------------------------------------------------------------------------------
u32 calcCheckSum32(u8 * pBuf, int lenBuf)
{
int i;
u32 checksum = 0;
for (i = 0; i < lenBuf; i++)
{
checksum += pBuf[i];
}
return checksum;
}

60
machine/comm/crc16.h Normal file
View File

@ -0,0 +1,60 @@
//-------------------------------------------------------------------------------
// File Name: crc16.h
// Brief:
// Version: 1.0.0
// Create Date: 2017/05/08
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2017, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2017/05/08
//-------------------------------------------------------------------------------
#ifndef __CRC16_H__
#define __CRC16_H__
/*
CRC16
CRC16
*/
#include "typedef.h"
#define USE_CRC_TABLE // 用查表法crc, 否则, 用移位法计算
#define SHIFT_RIGHT // 右移位
#ifdef USE_CRC_TABLE
#define CRC_INIT 0x0000 // 并且crc初值为0
#else
#ifdef SHIFT_RIGHT // 如果是右移
#define CRC_INIT 0xFFFF // crc初值为0xFFFF
#else // 如果是左移
#define CRC_INIT 0x0000 // 并且crc初值为0
#endif // #ifdef SHIFT_RIGHT
#endif
u16 calcCrc16(u8 * pBuf, int lenBuf);
u8 calcCheckSum8(u8 * pBuf, int lenBuf);
u32 calcCheckSum32(u8 * pBuf, int lenBuf);
#endif

74
machine/comm/crc32.cpp Normal file
View File

@ -0,0 +1,74 @@

//-------------------------------------------------------------------------------
// File Name: crc32.c
// Brief:
// Version: 1.0.0
// Create Date: 2018/08/13
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2019, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2018/08/13
//-------------------------------------------------------------------------------
#include "crc32.h"
//-------------------------------------------------------------------------------
static const u32 CRC32_LIST[256] =
{
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL,
};
u32 addCrc32(u32 crcword, u8 dat)
{
return (crcword >> 8) ^ CRC32_LIST[((crcword ^ dat) & 0xFF)];
}
u32 calcCrc32(u8 * pBuf, int lenBuf)
{
int i;
u32 crcword = CRC32_INIT;
for (i = 0; i < lenBuf; i++)
{
crcword = addCrc32(crcword, pBuf[i]);
}
return crcword;
}

33
machine/comm/crc32.h Normal file
View File

@ -0,0 +1,33 @@
//-------------------------------------------------------------------------------
// File Name: crc32.h
// Brief:
// Version: 1.0.0
// Create Date: 2018/08/13
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2019, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2018/08/13
//-------------------------------------------------------------------------------
#ifndef __CRC32_H__
#define __CRC32_H__
/*
CRC32
*/
#include "typedef.h"
#define CRC32_INIT 0xffffffff // crc初值
u32 addCrc32(u32 crcword, u8 dat);
u32 calcCrc32(u8 * pBuf, int lenBuf);
#endif

621
machine/comm/datadef.h Normal file
View File

@ -0,0 +1,621 @@
#ifndef __DATADEF_H__
#define __DATADEF_H__
#include "typedef.h"
#include "config.h"
//-------------------------------------------------------------------------
#define PATTERN_LARGE_NEEDLES 1280000
#pragma pack(1)//设定为1字节对齐
// 绝对位置数据
typedef struct
{
u8 ctrl; //控制字节
u8 attr; //属性字节
WORD action;//控制动作
double ax; //X位置
double ay; //Y位置
double ar; //R角度
}__attribute__ ((packed)) DsAbsItem;
// 画图格式数据
typedef struct
{
u8 ctrl;//控制字节
u8 attr;//属性字节
u8 action[2]; //附加动作
s16 bx, by;//绘制起点
s16 ex, ey;//绘制终点
s16 ar;//角度
u32 rgb;
}__attribute__ ((packed)) DispItem;
// 执行数据定义
typedef struct
{
u8 ctrl; // 控制字节
u8 attr; // 属性字节
s16 dx; // X偏移
s16 dy; // Y偏移
s16 dr; // R偏移
u16 len; // xy分量合成长度
u8 action[2]; //附加动作
u8 rev[4]; // 保留
}__attribute__ ((packed)) DataItem, Ds16Item;
// ds8格式
typedef struct
{
u8 ctrl; // 控制字节
u8 attr; // 属性字节
s16 dx; // X偏移
s16 dy; // Y偏移
s16 dr; // R偏移
}__attribute__ ((packed)) Ds8Item;
// 兼容dsr格式
typedef struct
{
u8 ctrl; // 控制字节
u8 attr; // 属性字节
u8 dx; // X偏移
u8 dy; // Y偏移
}__attribute__ ((packed)) DsrItem, Ds4Item;
// 双字节压缩格式
typedef struct
{
s8 cdx; // X数据
s8 cdy; // Y数据
/*
cdx x分量控制数据
cdy y分量控制数据
7
4:
cdx.0 cdy.0
0 0 -128 -- +126, 0.2mm0.1mm
0 1 -128 -- +126, 0.2mm0.1mm
1 0 -128 -- +126, 2mm1mm
1 1 cdx , cdx
*/
}__attribute__ ((packed)) ToBItem, Ds2Item;
#define BEADRADIUS 150 //散珠或亮片半径(用于绘制图形)
#define TOWELRADIUS 200 //毛巾半径(用于绘制图形)
// ctrl 定义
// 控制字节, 作为功能码,定义如下
#define DATA_NULL 0x00 // 文件结束
#define DATA_SEWING 0x01 // 缝纫数据, 该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, YR 偏移运动dx,dy,dr 框步进式运动或连续运动
#define DATA_OFFSET 0x02 // 偏移数据, 该数据只移动 X, YR 偏移 dx,dy,dr连续运动
#define DATA_CUTTING 0x03 // 切刀数据, 该数据需要切刀先运转,同时 X, YR 偏移 dx,dy,dr根据切刀类型选择动框方式
#define DATA_LASER 0x04 // 激光数据, 该数据需要激光出光, 同时X, YR偏移 dx,dy,dr框连续运动激光强度和运动线速度有关系
#define DATA_DRAWING 0x05 // 记号数据, 该数据需要记号笔先放下来, 同时X, YR偏移dx,dy,dr框连续运动
#define DATA_SEWING_R 0x06 // 右机头缝纫,该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, YR 偏移运动dx,dy,dr 框步进式运动或连续运动
#define DATA_SECF_SEW 0x11 // 第二框缝纫
#define DATA_SECF_OFST 0x12 // 第二框偏移
#define DATA_SECF_SEW_R 0x16 // 第二框右机头缝纫,该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, YR 偏移运动dx,dy,dr 框步进式运动或连续运动
// 兼容DSR控制码
#define DATA_SYNCSEW 0x07 // 同步缝纫数据, 该数据需要缝纫机针扎一次, 同时 X, YR 偏移运动 dx,dy,drX2, Y2 也运动 dx,dy框步进式运动或连续运动
#define DATA_PAUSE_OLD 0x08 // 暂停
#define DATA_ANGLE_OLD 0x09 // 拐点
#define DATA_CUT_OLD 0x0A // 剪线
#define DATA_END_OLD 0x10 // 结束码
#define DATA_JUMP 0x0B // 跳针数据,该数据要求缝纫机主轴不动, 但 X, YR 偏移运动 dx,dy,dr 框步进式运动或连续运动
#define DATA_PUNCH 0x0C // 冲孔数据, 该数据需要冲孔主轴运转一圈,同时 X, YR 偏移 dx,dy,dr
#define DATA_EMB 0x0D // 绣花数据,该数据需要平绣针扎一次, 同时 X, Y偏移运动dx,dy 框步进式运动
#define DATA_CHGND_OLD 0x0E // 换色功能码 lxs 20220628添加
#define DATA_SYNCOFST 0x0F // 同步偏移数据
#define DATA_MILLING 0x21 // 铣刀数据
#define DATA_DRILL 0x22 // 钻孔数据
#define DATA_RKNIFE 0x23 // 圆刀数据, 该数据需要震刀先运转,同时 X, YR 偏移 dx,dy,dr
#define DATA_SKNIFE 0x24 // 震刀数据, 该数据需要震刀先运转,同时 X, YR 偏移 dx,dy,dr
#define DATA_CHENILLE 0x41 // 毛巾绣的环式数据
#define DATA_CHAIN 0x42 // 毛巾绣的链式数据
#define DATA_TOWELHIGH 0x43 // 毛巾绣的高度数据
#define DATA_COIL 0x44 // 缠绕数据
#define DATA_SAWTOOTH 0x45 // 锯齿数据
#define DATA_RIBBON 0x46 // 盘带数据
#define DATA_END 0x80 // 结束码
#define DATA_PAUSE 0x81 // 暂停功能码
#define DATA_CHGND 0x82 // 绣花换针杆功能码(换色)
#define DATA_CUTTRD 0x83 // 剪线功能码
#define DATA_ANGLE 0x89 // 拐点
#define DATA_OPEN_SEQUIN 0xFE // 开关亮片功能码(中转数据)
#define DATA_UNKNOW 0xFF // 未定义(中转数据)
// atrr, 属性字节,作为运动属性字节
// 缝纫针步的属性定义:
// dx, x向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm
// dy, y向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm
// dr, r向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.0001 弧度
// len, xy 分量的合成长度,无符号数,范围0--65535, 单位为 0.01mm
#define HEAD_NAME_STR_LEN 0x20
#define HEAD_FIX_INFO_LEN 0x32
#define BEADSEQUINTYPE 0x20 //珠片码的种类31种第一个为预留
// 数据文件头
typedef struct
{
// 0x00
char fileName[32]; // 文件名称
// 0x20
u32 dataSize; // 数据字节数
u32 itemNums; // 数据项个数
u16 bytesPerItem; // 每项占的字节数
u16 bytesPerBlk; // 数据内容划分块大小
u32 dataChecksum; // 数据累加校验和
// 0x30
u16 checkCrc; // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
// 0x32
u8 begHead; //以哪种类型的机头定点 之前是u8
u8 reserved0;
// 0x34 52
u32 fileid; // 文件唯一标识符,识别是否为同一个文件
// 0x38
u8 reserved1[0x40-0x38]; // 保留区
// 0x40 64
s32 anchorX; // 定位点坐标X
s32 anchorY; // 定位点坐标Y
// 0x48
s32 beginX; // 数据起点坐标X
s32 beginY; // 数据起点坐标Y
s32 beginR; // 数据起点坐标Z
// 0x54 //84
s32 minX;
s32 maxX;
s32 minY;
s32 maxY; // 轮廓范围
//用于存储适用于下位机的反复绣设置需要7个字节
//0x64
u8 mcXRepeatNum;//x向反复次数
//0x65
s16 mcXRepeatSpace;//x向反复间距
//0x67
u8 mcYRepeatNum;//y向反复次数
//0x68
s16 mcYRepeatSpace;//y向反复间距
//0x6A
u8 mcPriority;//反复优先级
// 0x6B
u8 reserved2[0x74-0x6B]; // 保留区
// 0x74 116
s32 coloLockrNeedle; //换色锁针针数
// 0x78 120
s32 jumpNeedleChange; // 跳针变越框锁针针数(用于跳针前后加锁针)
// 0x7C 124
s32 minStep; //合并小针步时的针步大小(过滤)
// 0x80 128
s32 rotateStyle; //旋转式样
//132
s32 horizontalStyle; //水平翻转式样
//136
s32 verticalStyle; //垂直翻转式样
//140
s32 rotateAngle; //旋转角度
//144
s32 xZoom; //X向倍率
//148
s32 yZoom; //Y向倍率
//152
s32 repeatStyle; //反复方式
//156
s32 priority; //优先次序
//160
s32 xRepeatNum; //X向反复次数
//164
s32 yRepeatNum; //Y向反复次数
//168
s32 xRepeatSpace; //X向反复间距
//172
s32 yRepeatSpace; //Y向反复间距
//176
s32 stepCompensation; //针步补偿
//180
s32 xCompensate; //X向补偿
//184
s32 yCompensate; //Y向补偿
//188
s32 lockNeedlesNum; //锁针次数
//192
s32 lockNeedlesStepNum; //锁针步数
//196
s32 lockNeedlesStepLength; //锁针针步长度
//200
s32 combineMode; //双头组合模式
//204
s32 breakLineParkNum; //断线停车次数
//绣花机中需要插入跳针的针步大小不用计入参数id
//因为此值变化数据步数会变从而改变了fileid
//208 //0xD0
u16 convertJumpStepSize;
//210 //0xD2
u16 jumpStepSize;
//212 //0xD4
u16 pleatedMode;//是否为褶绣模式
//214 //0xD6
u8 reserved3[0x118-0xD6];//保留
//280 0x118
u32 offsetEn; // bit0,偏移点X向允许 0,不允许 1,允许
// // bit1,偏移点Y向允许 0,不允许 1,允许
// // bit2,平绣数据有无 0,无 1,有
// // bit3,激光数据有无 0,无 1,有
// // bit4,毛巾链式数据有无 0,无 1,有
// // bit5,缠绕锯齿盘带数据有无 0,无 1,有
// 284 //0x11C
s32 offsetX; // 偏移点X
// 288 // 0x120
s32 offsetY;
//292 0x124
s32 threeCombineMode; //三头组合模式
//296 0x128
u8 reserved4[0x1E0-0x128];//保留 //原来是0xD0
//0x1E0
u8 beadSequinTable[BEADSEQUINTYPE]; // 珠片码与散珠/亮片动作码对应表
// 0x200
u8 switchTable[0x400-0x200]; // 色序设定表, 支持512个色序设定
}__attribute__ ((packed)) DataFileHead;//中间数据(fcg)
//ds16头文件
typedef struct
{
// 0x00
char fileName[32]; // 文件名称
// 0x20
u32 dataSize; // 数据字节数
u32 itemNums; // 数据项个数
u16 bytesPerItem; // 每项占的字节数
u16 bytesPerBlk; // 数据内容划分块大小
u32 dataChecksum; // 数据累加校验和
// 0x30
u16 checkCrc; // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
// 0x32
u8 begHead; //以哪种类型的机头定点 之前是u8
u8 reserved0;
// 0x34
u32 fileid; // 文件唯一标识符,识别是否为同一个文件
// 0x38
u32 jumpNeedleNum; // 跳针数(绣花机)
u16 colorNum; // 颜色数(绣花机)
u16 towelHighNum; // 毛巾高度数
// 0x40
s32 anchorX; // 定位点坐标X
s32 anchorY; // 定位点坐标Y
// 0x48
s32 beginX; // 数据起点坐标X
s32 beginY; // 数据起点坐标Y
s32 beginR; // 数据起点坐标Z
// 0x54 //84
s32 minX;
s32 maxX;
s32 minY;
s32 maxY; // 轮廓范围
// 0x64
u32 sizeX;
u32 sizeY; // 裁片大小
// 0x6C
s32 anchorX2; // 定位点坐标X2
s32 anchorY2; // 定位点坐标Y2
s32 beginX2; // 数据起点坐标X2
s32 beginY2; // 数据起点坐标Y2
s32 beginR2; // 数据起点坐标Z2
// 0x80
u32 runAct; // 附加动作,
// bit0: 0:完成后不拍照 1:完成后拍照
// 132//0X84
u32 offsetEn; // bit0,偏移点X向允许 0,不允许 1,允许
// // bit1,偏移点Y向允许 0,不允许 1,允许
// // bit2,平绣数据有无 0,无 1,有
// // bit3,激光数据有无 0,无 1,有
// // bit4,毛巾链式数据有无 0,无 1,有
// // bit5,缠绕锯齿盘带数据有无 0,无 1,有
// // bit6,反复优先级 0,X向优先 1,Y向优先
// 136 //0x88
s32 offsetX; // 偏移点X
// 140 // 0x8C
s32 offsetY;
// 0x90
u8 xRepeatNums; // X向反复次数,范围0-99,默认0
u8 yRepeatNums; // Y向反复次数
s32 xRepeatDistance; // X向反复距离,单位mm,精度0.01,范围-100000-100000,默认0
s32 yRepeatDistance; // Y向反复距离
// 0x9A
u8 reserved3[0x100-0x9A];
// 0x100
u8 reserved4[0x200-0x100];
// 0x200
u8 switchTable[0x400-0x200]; // 色序设定表, 支持512个色序设定
}__attribute__ ((packed)) DataDs16FileHead;//下发给主控的ds16文件头
typedef struct
{
// 0
char HMIVerStr[16]; // 界面版本
// 4
u32 machineNumber; // 机器编号
// 5
u16 motorNum; //电机个数
u16 debugProgress; //调试进度
// 6
char fileName[32]; // 文件名称
#if(0)
// 52
char sensorStartBtn; // 启动按钮1
char sensorStopBtn; // 暂停按钮1
char sensorJogBtn; // 点动按钮1
char sensorMainFrameXZeroPos; // 主框架X零位
char sensorMainFrameYZeroPos; // 主框架Y零位
char sensorMainFrameXNegLimit; // 主框架X负限位
char sensorMainFrameYNegLimit; // 主框架Y负限位
char sensorMainFrameXPosLimit; // 主框架X正限位
char sensorMainFrameYPosLimit; // 主框架Y正限位
char sensorScissorsReturn; // 剪刀回位
#endif
//14
char deliveryTime[32]; //交付日期
//22
u32 workProgress; //机器工作进度(花样执行进度)
//26
u32 workState; //工作状态
//27
u32 startPins; //开始针数
//28
u32 endPins; //结束针数
//29
quint64 startTime; //开始时间
//31
quint64 endTime; //结束时间
//33
u32 outCounter; //产量统计
//34
u32 rev2[256-34];
} __attribute__ ((packed)) HMILotData; // 界面物联网数据
//-------------------------------------------------------------------------
#define HEADBUF 8192 //512x16
#define PATCHCOLORBUF 512 //512(u16)
#define PATCHNEEDLEBUF 10
#define TOWELHIGHBUF 1024
//贴布绣按针参数结构体
struct NeedlePatch
{
u32 needleIdx;
u16 move;
};
// 数据文件头
typedef struct
{
DataFileHead fileHead; // 数据文件头
u8 colorOrderEmbHead[HEADBUF]; // 隔头 每个色序对应的16个机头是否开启
// u8 ifPatch;//是否设置了贴布绣
u16 patchColorEmb[PATCHCOLORBUF]; // 贴布绣 每个色序对应的设置位置
NeedlePatch patchNeedleEmb[PATCHNEEDLEBUF]; // 贴布绣 针数索引对应的设置位置
}__attribute__ ((packed)) cfgDataFileHead;
//开位线绣节点坐标
struct OpenLineNode
{
int nodeX;
int nodeY;
};
typedef struct
{
s32 rotateStyle; //旋转式样
s32 rotateAngle; //旋转角度
s32 xZoom; //X向倍率
s32 yZoom; //Y向倍率
s32 repeatStyle; //反复方式
s32 priority; //优先次序
s32 xRepeatNum; //X向反复次数
s32 yRepeatNum; //Y向反复次数
s32 xRepeatSpace; //X向反复间距
s32 yRepeatSpace; //Y向反复间距
s32 lockNeedlesNum; //锁针次数
s32 lockNeedlesStepNum; //锁针针步
s32 lockNeedlesStepLength; //锁针针步长度
s32 xCompensate; //X向补偿
s32 yCompensate; //Y向补偿
} __attribute__ ((packed)) PatternParaStruct;
//-------------------------------------
// 花样参数类型定义
// 升级文件头
typedef struct
{
// 0x00
char fileName[32]; // 文件名称
// 0x20
u32 dataSize; // 数据字节数
u32 dataChecksum; // 数据累加校验和
// 0x28
u8 reserved1[0x30-0x28]; // 保留区1
// 0x30
u8 reserved2[0x64-0x30]; // 保留区1
// 0x64
u8 reserved3[0x80-0x64]; // 保留区2
// 0x80
u8 reserved4[0x100-0x80];
}__attribute__ ((packed)) AppFileHead;
// 外围板文件头
typedef struct
{
// 0x00
char fileName[32]; // 文件名称
// 0x20
u32 dataSize; // 数据字节数
u32 dataChecksum; // 数据累加校验和
u8 protocol; // 文件要发给的协议类型
u8 nodeid; // 文件要发给的节点ID,0为广播
u8 fileType; // 文件类型
u8 nodeType; // 文件要发给的节点类型 -rq
// 0x2C
u8 reserved1[0x30-0x2C]; // 保留区1
// 0x30
u8 reserved2[0x64-0x30]; // 保留区2
// 0x64
u8 reserved3[0x80-0x64]; // 保留区3
// 0x80
u8 reserved4[0x100-0x80]; // 保留区4
}__attribute__ ((packed)) BoardFileHead;
// 文件参数结构
typedef struct
{
// 0x00
u8 hdIdenti[0x40];
// 0x40
s32 anchorX; // 定位点坐标X
s32 anchorY; // 定位点坐标Y
// 0x48
s32 beginX; // 数据起点坐标X
s32 beginY; // 数据起点坐标Y
s32 beginR; // 数据起点坐标Z
// 0x54
s32 minX;
s32 maxX;
s32 minY;
s32 maxY; // 轮廓范围
// 0x64
u32 sizeX;
u32 sizeY; // 裁片大小
// 0x6C
s32 anchorX2; // 定位点坐标X2
s32 anchorY2; // 定位点坐标Y2
s32 beginX2; // 数据起点坐标X2
s32 beginY2; // 数据起点坐标Y2
s32 beginR2; // 数据起点坐标Z2
// 0x80
u8 reserved3[0x200-0x80];
// 0x200
u8 switchNeedleTable[0x400-0x200]; // 色序设定表, 支持512个色序设定
}__attribute__ ((packed)) DataFilePara;
typedef struct
{
s32 anchorX; // 定位点坐标X
s32 anchorY; // 定位点坐标Y
s32 beginX; // 数据起点坐标X
s32 beginY; // 数据起点坐标Y
}__attribute__ ((packed)) DataFilePos;
//-------------------------------------------------------------------------
// 文件执行参数结构
typedef struct
{
u32 newIdx;
s32 newXPos;
s32 newYPos;
s32 newRPos;
u32 newColorIdx; // 新针位
u32 newHighIdx; // 新高度(绣花机毛巾高度)
u32 mvFrameFlag; // 移框标志
u32 rev[256-7];
}__attribute__ ((packed)) FileExecPara;
//-------------------------------------------------------------------------
//参数文件头
struct ParaFile
{
unsigned char s_head[4] ; // 默认 PARA
int s_type ; // 默认 0
int s_len ; // 数据 默认 4096
unsigned int s_para_buff[1024] ; //工作 参数体
unsigned short s_crc ; //参数体的CRC
unsigned short rev ; //预留 保持 结构体四字节对齐
};
// 组合文件的文件头
typedef struct strCombHead
{
// 0x00 - 0x03
u32 totalFilesNum; //组合的总的文件数
// 0x04
u32 fileByte[0x100-0x04]; //用于保存每个文件的字节数
}__attribute__ ((packed)) CombHead;
//-------------------------------------------------------------------------
//#pragma pack(1)//设定为1字节对齐
//-------------------------------------------------------------------------
#endif

1910
machine/comm/protocol.h Normal file

File diff suppressed because it is too large Load Diff

107
machine/comm/typedef.h Normal file
View File

@ -0,0 +1,107 @@
#ifndef TYPEDEF_H
#define TYPEDEF_H
//---------------------------------------------------------------
#ifndef NULL
#define NULL ((void *) 0)
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
//---------------------------------------------------------------
#define DATA_VALID 0x55AA
//---------------------------------------------------------------
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short int WORD;
typedef unsigned long int DWORD;
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
typedef char s8;
typedef short int s16;
typedef int s32;
//---------------------------------------------------------------
#define U8_MAX ((u8)255)
#define S8_MAX ((s8)127)
#define S8_MIN ((s8)(-128))
#define U16_MAX ((u16)65535u)
#define S16_MAX ((s16)32767)
#define S16_MIN ((s16)(-32768))
#define U32_MAX ((u32)4294967295uL)
#define S32_MAX ((s32)2147483647uL)
#define S32_MIN ((s32)(-2147483648uL))
//---------------------------------------------------------------
#ifndef LOBYTE
#define LOBYTE(w) ((BYTE)(((WORD)(w)) & 0xff))
#endif
#ifndef HIBYTE
#define HIBYTE(w) ((BYTE)((((WORD)(w)) >> 8) & 0xff))
#endif
#ifndef LOWORD
#define LOWORD(l) ((WORD)(((DWORD)(l)) & 0xffff))
#endif
#ifndef HIWORD
#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xffff))
#endif
#ifndef MAKEWORD
#define MAKEWORD(a, b) ((WORD)((BYTE)(a)) | (((WORD)((BYTE)(b))) << 8))
#endif
#ifndef MAKEDWORD
#define MAKEDWORD(a, b) ((DWORD)((WORD)(a)) | (((DWORD)((WORD)(b))) << 16))
#endif
#ifndef LOHFBYTE
#define LOHFBYTE(b) ((BYTE)((b) & 0x0f))
#endif
#ifndef HIHFBYTE
#define HIHFBYTE(b) ((BYTE)(((b) >> 4) & 0x0f))
#endif
#ifndef MAKEBYTE
#define MAKEBYTE(a, b) ((BYTE)((BYTE)((a) & 0x0f)) | ((BYTE)(((BYTE)((b) & 0x0f)) << 4)))
#endif
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
//---------------------------------------------------------------
#ifndef PI
#define PI 3.1415926535897932
#endif
#endif // TYPEDEF_H

153
machine/comport.cpp Normal file
View File

@ -0,0 +1,153 @@
#include "comport.h"
#include <QDebug>
#include <QThread>
//-----------------------------------------------------------------------------------------------------
ComPort::ComPort(QObject *parent) :
QObject(parent),
m_pSerialport(NULL),
m_running(0),
m_pReadTimer(NULL)
{
m_pReadTimer = new QTimer(this);
m_pReadTimer->setInterval(20);
connect(m_pReadTimer, SIGNAL(timeout()), this, SLOT(getDataFromPort()));
}
ComPort::~ComPort()
{
m_pReadTimer->stop();
delete m_pReadTimer;
if (m_pSerialport != NULL)
{
m_pSerialport->close();
delete m_pSerialport;
m_pSerialport = NULL;
}
}
void ComPort::setComPortName(QString portName)
{
m_portName.clear();
if(portName.length() > 0)//串口名称不为空
{
m_portName = portName;
return;
}
//windows平台下
#ifdef Q_OS_WIN
//得到串口设备
QString path = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
QSettings *settings = new QSettings(path,QSettings::NativeFormat);
QStringList key = settings->allKeys();
int num = (int)key.size();
//打开注册表
unsigned long keysize,type,valuesize;
wchar_t keyname[256]; //键名数组
char keyvalue[256]; //键值数组
keysize = sizeof(keyname);
valuesize = sizeof(keyvalue);
int indexnum;
HKEY hKey;
QString commresult = "";
QString valuemessage = "";//键值
QString strkey = "HARDWARE\\DEVICEMAP\\SERIALCOMM";//子键路径
LPCWSTR subkey = reinterpret_cast<const wchar_t *>(strkey.utf16());
if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
{
return;
}
//循环得到串口设备的名称
for(int i = 0; i < num; i++)
{
valuemessage.clear();
commresult.clear();
keysize=sizeof(keyname);
valuesize=sizeof(keyvalue);
indexnum=i;//要读取键值的索引号
if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize) == 0)//列举键名和值
{
for(unsigned int j = 0; j < valuesize; j++)
{
if(keyvalue[j]!=0x00)
{
valuemessage.append(keyvalue[j]);
}
}
if(m_portName.length() <= 0)
{
m_portName = valuemessage;
}
}
else
{
commresult="nokey";
}
}
::RegCloseKey(hKey);//关闭注册表
#endif
#ifdef Q_OS_LINUX
m_portName = COMNAME;
#endif
return;
}
void ComPort::initComm()
{
if (m_running == 0)
{
qDebug() << "InitComm ComPort at thread" << QThread::currentThread() << "name" << m_portName;
struct PortSettings myComSetting = {BAUD115200, DATA_8, PAR_NONE, STOP_1, FLOW_OFF, 0, 20};
m_pSerialport = new QextSerialPort(m_portName, myComSetting);
bool bOpen = m_pSerialport->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
if(bOpen == false)
{
emit siSerialPortOpenState(m_running);
return;
}
qDebug() << "Start timer";
m_pReadTimer->start();
m_running = 1;
emit siSerialPortOpenState(m_running);
}
}
void ComPort::getDataFromPort()
{
// qDebug("GetDataFromPort");
// qDebug() << "ComPort GetDataFromPort" << QThread::currentThread();
if (m_running != 0 && m_pSerialport != NULL)
{
QByteArray dat = m_pSerialport->readAll();
if (dat.size() != 0)
{
//qDebug()<<"dat.size()="<<dat.size();
//qDebug("SiReceiveData");
emit (siReceiveData(dat));
}
}
}
void ComPort::slotSendData(QByteArray dat)
{
// qDebug() << "ComPort SlotSendData" << QThread::currentThread();
if (m_running != 0 && m_pSerialport != NULL && dat.size() != 0)
{
// qDebug("send data");
m_pSerialport->write(dat.data(), dat.size());
}
}

43
machine/comport.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef COMPORT_H
#define COMPORT_H
#include <QObject>
#include <QTimer>
#include <QSettings>
#include "qextserial/qextserialport.h"
#ifdef Q_OS_LINUX
#define COMNAME "/dev/ttyS1"
#define COMNAME485 "/dev/ttyS2"
#endif
class ComPort : public QObject
{
Q_OBJECT
public:
explicit ComPort(QObject *parent = 0);
~ComPort();
private:
QextSerialPort * m_pSerialport;
int m_running;
QTimer * m_pReadTimer;
QString m_portName;
public:
void setComPortName(QString portName);//获取所有串口名称
private slots:
void getDataFromPort();
signals:
void siReceiveData(QByteArray dat);
void siSerialPortOpenState(int val);
public slots:
void initComm();
void slotSendData(QByteArray dat);
};
#endif // COMTHREAD_H

108
machine/error.cpp Normal file
View File

@ -0,0 +1,108 @@

#include "error.h"
#include "comm/protocol.h"
#include <QObject>
#define CASE_OP(cd, str) \
{\
case cd:\
errinfo = str;\
break;\
}
QString getErrStr(u32 code)
{
QString errinfo;
errinfo.clear();
QString errorCode;
errorCode.clear();
switch (code)
{
//通用的错误代码
CASE_OP(ERR_NONE, QObject::tr("")); // 没有错误
CASE_OP(ERR_NO_AIR, QObject::tr("Insufficient air pressure")); // 气压不足
CASE_OP(ERR_NOT_SAFE, QObject::tr("safe area error")); // 安全区域介入
CASE_OP(ERR_EXPIRATION, QObject::tr("Expiration of use")); // 使用时限已到
CASE_OP(ERR_DRIVER, QObject::tr("Driver alarm")); // 驱动器报警
CASE_OP(ERR_FILL_DATA, QObject::tr("Fill data error")); // 填充数据错误
CASE_OP(ERR_NOT_ALLOWED, QObject::tr("Not allowed to work")); // 不允许工作状态
CASE_OP(ERR_CTRL_ERR, QObject::tr("Control error")); // 控制错误
CASE_OP(ERR_FPGA_ERR, QObject::tr("Motion control chip version error")); // 运动控制芯片版本错误
CASE_OP(ERR_BUTTON_NOUP, QObject::tr("Waiting for button to lift timeout")); // 等待按钮抬起超时
CASE_OP(ERR_FPGA_RESET, QObject::tr("FPGA Reset")); // FPGA复位
CASE_OP(ERR_NO_READY, QObject::tr("Peripheral Device not ready")); // 外设未就绪
CASE_OP(ERR_NO_SEND_ERR, QObject::tr("Transmission data error")); // 传输数据错误
CASE_OP(ERR_EDTION_ERR, QObject::tr("Program version error")); // 程序版本错误
CASE_OP(ERR_WORK_DONE, QObject::tr("Complete output")); // 完成产量
CASE_OP(ERR_LMT_POSITIVE, QObject::tr("Positive limit")); // 正向限位
CASE_OP(ERR_LMT_NEGATIVE, QObject::tr("Negative limit")); // 反向限位
CASE_OP(ERR_RUN_ALM, QObject::tr("Motion alarm")); // 运动报警
CASE_OP(ERR_RUN_LIMIT, QObject::tr("Motion limit")); // 运动限位
CASE_OP(ERR_RUN_EMS, QObject::tr("Emergency stop")); // 运动急停
CASE_OP(ERR_MV_PARA, QObject::tr("Motion parameters error")); // 运动参数错误
CASE_OP(ERR_MC_PARA, QObject::tr("Machine parameters error")); // 机器参数错误
CASE_OP(ERR_IN_PARA, QObject::tr("Input parameters error")); // 输入参数错误
CASE_OP(ERR_NOT_WORKSTA, QObject::tr("Not in work status error")); // 不能工作状态
CASE_OP(ERR_NOT_MOVESTA, QObject::tr("Prohibited frame moving state")); // 禁止移框状态
CASE_OP(ERR_MTZ_RIGHT, QObject::tr("Zero success")); // 归零成功
CASE_OP(ERR_MTZ_ERROR, QObject::tr("Return to zero error")); // 归零错误
CASE_OP(ERR_COOR_SYSTM, QObject::tr("Coordinate system error")); // 坐标系统错误
CASE_OP(ERR_OUT_RANGE, QObject::tr("Target position out of bounds")); // 目标位置越界
CASE_OP(ERR_X_LIT_POSI, QObject::tr("X Positive limit")); // X正向限位
CASE_OP(ERR_X_LIT_NEGA, QObject::tr("X Negative limit")); // X反向限位
CASE_OP(ERR_Y_LIT_POSI, QObject::tr("Y Positive limit")); // Y正向限位
CASE_OP(ERR_Y_LIT_NEGA, QObject::tr("Y Negative limit")); // Y反向限位
CASE_OP(ERR_MC_MANUAL, QObject::tr("Machine is in manual state")); // 机器处于手动状态
CASE_OP(ERR_KEY_SW_OFF, QObject::tr("Machine key off")); // 机器钥匙开关关闭
CASE_OP(ERR_NO_DATA, QObject::tr("None data")); // 无数据
CASE_OP(ERR_DATA_ERROR, QObject::tr("Data error")); // 数据错误
CASE_OP(ERR_GRAPH_OUT_RANGE, QObject::tr("Graphics out of range")); // 图形超出范围
CASE_OP(ERR_MS_NOT_ZERO, QObject::tr("Spindle is not in zero position")); // 主轴不在零位
CASE_OP(ERR_CUTTER_NOT_POS, QObject::tr("Scissors are not in position")); // 剪刀不在回位
CASE_OP(ERR_UPER_TBREAK, QObject::tr("Thread is broken"));// 断线
CASE_OP(ERR_BOBBIN_TBREAK, QObject::tr("Bottom thread disconnected")); // 底线断线
CASE_OP(ERR_TRANS_TIMEOUT, QObject::tr("Execution command timed out")); // 执行命令超时
CASE_OP(ERR_LIFT_TIMEOUT, QObject::tr("Head lifting timeout")); // 机头升降超时
CASE_OP(ERR_CHANGE_BOBBIN, QObject::tr("Change the bobbin")); // 更换梭芯
CASE_OP(ERR_CHANGE_BOBBIN_A, QObject::tr("Replace bobbin A")); // 更换梭芯A
CASE_OP(ERR_CHANGE_BOBBIN_B, QObject::tr("Replace bobbin B")); // 更换梭芯B
CASE_OP(ERR_CHANGE_BOBBIN_STA, QObject::tr("The machine is in the state of replacing the bobbin")); // 机器处于更换梭芯状态
CASE_OP(ERR_AIR_POWER, QObject::tr("Insufficient air pressure")); // 气压不足
CASE_OP(ERR_MC_AUTO, QObject::tr("Machine is in auto state")); // 机器处于自动状态
CASE_OP(ERR_INSTALLMENT_OK, QObject::tr("Password set finished")); // 密码设置成功
CASE_OP(ERR_INSTALLMENT_FAIL, QObject::tr("Password set failed")); // 密码设置失败
CASE_OP(ERR_FOOT_POS, QObject::tr("Presser foot position error")); // 压脚位置错误
//通用的状态信息
CASE_OP(STA_NORMAL_STOP, QObject::tr("Normal stop")); // 正常停止
CASE_OP(STA_MTZ_SUCCESS, QObject::tr("Find zero success")); // 归零成功
CASE_OP(STA_WORK_PAUSE, QObject::tr("work pause")); // 工作暂停
CASE_OP(STA_WORK_OVER, QObject::tr("End of work")); // 工作结束
CASE_OP(STA_WORK_FINISH, QObject::tr("Work done")); // 工作完成
CASE_OP(STA_WORK_DONE, QObject::tr("Complete production")); // 完成产量
CASE_OP(STA_EXEC_SUCCESS, QObject::tr("Execute success")); // 执行成功
CASE_OP(STA_EXEC_FAILED, QObject::tr("Execute false")); // 执行失败
CASE_OP(STA_WAIT_FILE, QObject::tr("wait file")); // 等待文件
CASE_OP(STA_CHANGE_BOBBIN, QObject::tr("change the bobbin")); // 更换梭芯
CASE_OP(STA_PROCESS_FINISH, QObject::tr("Execute finish")); // 执行完成
CASE_OP(STA_PROCESS_RUNNING, QObject::tr("Execute runnibng")); // 执行过程中
default:
//errorCode.sprintf("CODE 0x%x", code);
//errinfo.append(QObject::tr("Undefined error,") + errorCode);
break;
}
return errinfo;
}
QString getPromptStr(u32 code)
{
QString errinfo;
switch (code)
{
CASE_OP(ERR_NO_MATERIEL, QObject::tr("Please feed")); // 请上料
CASE_OP(ERR_CMK_SAFE, QObject::tr("Safety input alarm")); // 安全输入报警
}
return errinfo;
}

12
machine/error.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef ERROR_H
#define ERROR_H
#include <QString>
#include "comm/typedef.h"
QString getErrStr(u32 code);
QString getPromptStr(u32 code);
#endif // ERROR_H

View File

@ -0,0 +1,335 @@
#include "gatewaytcpclient.h"
#include <QSettings>
#include <QApplication>
#include <QAbstractSocket>
GatewayTcpClient::GatewayTcpClient(QObject *parent) :
QObject(parent),
m_pClientSocket(NULL),
m_pConnectCheckTimer(NULL),
m_connected(0),
m_pConnectDetectThread(NULL),
m_pConnectDetect(NULL),
m_detect(0),
m_localip(DEF_LOCAL_IP),
m_localport(DEF_LOCAL_PORT),
m_serverip(DEF_SERVER_IP),
m_serverport(DEF_SERVER_PORT)
{
m_pClientSocket = new QBindTcpSocket(this);
m_pClientSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
connect(m_pClientSocket, SIGNAL(readyRead()), this, SLOT(receiveServerData()));
connect(m_pClientSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displaySocketError(QAbstractSocket::SocketError)));
// connect(m_pClientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(netStateChanged(QAbstractSocket::SocketState)));
m_pConnectCheckTimer = new QTimer(this);
connect(m_pConnectCheckTimer, SIGNAL(timeout()), this, SLOT(connectCheck()));
m_pConnectDetectThread = new QThread();
}
GatewayTcpClient::~GatewayTcpClient()
{
m_pConnectCheckTimer->stop();
delete m_pConnectCheckTimer;
m_pClientSocket->disconnectFromHost();
m_pClientSocket->waitForDisconnected();
m_pClientSocket->close();
delete m_pClientSocket;
if (m_connected != 0)
{
m_pConnectDetectThread->quit();
m_pConnectDetectThread->wait();
}
delete m_pConnectDetectThread;
}
void GatewayTcpClient::setConfigFileName(QString configfilename)
{
m_configFileName = configfilename;
}
void GatewayTcpClient::connectToServer()
{
if (m_pClientSocket == NULL)
{
qDebug() << "m_pClientSocket not alloc";
return;
}
if (m_connected == 0)
{
loadIpAndPort();
if (m_pConnectDetect == NULL)
{
m_pConnectDetect = new TcpConnectDetect;
}
qDebug() << "ConnectToServer";
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
m_pConnectDetect->setIpAndPort(m_localip, m_localport, m_serverip, m_serverport);
m_pConnectDetect->moveToThread(m_pConnectDetectThread);
connect(this, SIGNAL(siDetectHost()), m_pConnectDetect, SLOT(connectDetect()), Qt::QueuedConnection);
connect(m_pConnectDetect, SIGNAL(siConnectSta(int)), this, SLOT(detectStatus(int)), Qt::QueuedConnection);
// 20191226由于检测线程会造成网络重连所以将检测线程注释 lft
/*
connect(m_pConnectDetectThread, SIGNAL(started()), m_pConnectDetect, SLOT(detectStart()) );
connect(m_pConnectDetectThread, SIGNAL(finished()), m_pConnectDetect, SLOT(deleteLater()) ); // 退出删除对象
m_pConnectDetectThread->start(); // 启动线程
*/
m_pConnectCheckTimer->start(1000);
m_connected = 1;
m_detect = 1;
}
}
void GatewayTcpClient::disConnectFromServer()
{
if (m_connected != 0)
{
m_pConnectCheckTimer->stop();
if (m_pClientSocket != NULL)
{
m_pClientSocket->disconnectFromHost();
m_pClientSocket->waitForDisconnected();
m_pClientSocket->close();
}
m_pConnectDetectThread->quit();
m_pConnectDetectThread->wait();
m_connected = 0;
m_detect = 0;
}
}
void GatewayTcpClient::loadIpAndPort()
{
if (!m_configFileName.isEmpty())
{
// 机器的IP和端口 和 连接机器的本地IP和端口
QSettings configIni(m_configFileName, QSettings::IniFormat);
QString serverip, localip;
quint16 serverport, localport;
//网关IP不固定但是不能与主板连接IP相同
serverip = configIni.value("server/ip", QVariant("192.168.2.95")).toString();
serverport = configIni.value("server/port", QVariant(8080)).toInt();
localip = configIni.value("local/ip", QVariant("192.168.2.100")).toString();
localport = configIni.value("local/port", 5001).toInt();
// 回写参数
configIni.setValue("server/ip", serverip);
configIni.setValue("server/port", serverport);
configIni.setValue("local/ip", localip);
configIni.setValue("local/port", localport);
m_localip = localip;
m_localport = localport;
m_serverip = serverip;
m_serverport = serverport;
}
}
// 发送数据的槽
void GatewayTcpClient::slotSendData(QByteArray dat)
{
if (m_pClientSocket != NULL)
{
m_pClientSocket->write(dat);
}
}
// 自动检测连接
void GatewayTcpClient::connectCheck()
{
if (m_pClientSocket == NULL)
{
qDebug() << "Socket is not alloced";
return;
}
// qDebug() << "check client connect";
if (m_connected == 1)
{
if (m_localip.isEmpty() == false)
{
m_pClientSocket->bindAddrAndPort(m_localip, m_localport);
}
m_pClientSocket->abort();
m_pClientSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
m_pClientSocket->connectToHost(m_serverip, m_serverport);
int rslt = m_pClientSocket->waitForConnected(2000);
if (rslt == 0)
{
}
/*
qDebug("bind connect and waitForConnected 2000, rslt=%d", rslt);
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
*/
m_connected = 2;
}
else if (m_connected != 0)
{
switch(m_pClientSocket->state())
{
case QAbstractSocket::ConnectedState:
{
if (m_connected != 3)
{
/*
qDebug() << "net State is Connected";
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
*/
m_connected = 3; // 检测连接状态
}
break;
}
case QAbstractSocket::ConnectingState:
{
if (m_connected != 2)
{
qDebug() << "net State is Connecting";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
}
m_connected = 2;
break;
}
case QAbstractSocket::UnconnectedState:
{
if (m_connected != 1)
{
// qDebug() << "net State is unconnected";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
}
m_connected = 1;
break;
}
default:
{
/*
QAbstractSocket::HostLookupState
QAbstractSocket::BoundState
QAbstractSocket::ListeningState
QAbstractSocket::ClosingState
*/
{
qDebug("net State is %d\r\n", m_pClientSocket->state());
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
}
m_connected = 1;
}
}
}
else
{
}
if (m_connected == 3) // 已连接
{
if (m_detect == 1)
{
// qDebug() << "Machine " << QThread::currentThread();
m_detect = 0;
emit(siDetectHost());
// qDebug() << "after send SiDetectHost ";
}
}
emit (siConnectSta(m_connected)); // 网络连接信号
}
void GatewayTcpClient::detectStatus(int sta)
{
qDebug("gateway host detect sta=%d", sta);
m_detect = 1;
if (sta == 1) // 网络已断开
{
qDebug("disconnect ClientSocket by detect");
m_pClientSocket->disconnectFromHost();
// m_pClientSocket->waitForDisconnected();
m_pClientSocket->close();
m_connected = 1;
}
else if (sta == 2) // 网络连接还在
{
}
else
{
}
}
void GatewayTcpClient::receiveServerData()
{
if (m_pClientSocket != NULL)
{
QByteArray tmpDat;
tmpDat = m_pClientSocket->readAll(); // 读取
// qDebug("ReceiveServerData, size = %d", tmpDat.size());
// PrintAsHex(&tmpDat);
emit(siReceiveData(tmpDat)); // 发送收到数据信号
}
}
void GatewayTcpClient::displaySocketError(QAbstractSocket::SocketError err)
{
QString errinfo;
errinfo.sprintf("Err: code=%d, errorString=", err);
errinfo += m_pClientSocket->errorString();
// qDebug() << errinfo;
emit(siConnectErr(errinfo)); // 网络错误信息
}
void GatewayTcpClient::netStateChanged(QAbstractSocket::SocketState sta)
{
switch (sta)
{
/*
case UnconnectedState:
case HostLookupState:
case ConnectingState:
case ConnectedState:
case BoundState:
case ListeningState:
case ClosingStat:
*/
default:
break;
}
}
void GatewayTcpClient::hostFound()
{
qDebug("found host");
}

View File

@ -0,0 +1,72 @@
#ifndef GATEWAYTCPCLIENT_H
#define GATEWAYTCPCLIENT_H
#include <QObject>
#include <QTimer>
#include <QHostAddress>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QTcpServer>
#include <QThread>
#include "qbindtcpsocket.h"
class ConnectDetectThread;
class GatewayTcpClient : public QObject
{
Q_OBJECT
public:
explicit GatewayTcpClient(QObject *parent = NULL);
virtual ~GatewayTcpClient();
public:
void setConfigFileName(QString configfilename);
signals:
void siConnectSta(int sta); // 网络连接信号
void siConnectErr(QString errinfo); // 网络错误信息
void siReceiveData(QByteArray dat); // 收到数据包信号
signals:
void siDetectHost(void);
public:
public slots:
void slotSendData(QByteArray dat); // 发送数据的槽
void connectToServer();//连接到服务器
void disConnectFromServer();
void detectStatus(int);
public:
private slots:
void connectCheck();
void receiveServerData();
void displaySocketError(QAbstractSocket::SocketError err);
void netStateChanged(QAbstractSocket::SocketState sta);
void hostFound();
private:
void loadIpAndPort();
private:
QBindTcpSocket * m_pClientSocket;
QTimer * m_pConnectCheckTimer;
public:
int m_connected; // 连接状态; 0, 初始化; 1, 未连接; 2, 连接中; 3, 已连接
private:
QThread * m_pConnectDetectThread;
TcpConnectDetect * m_pConnectDetect;
int m_detect; // 连接测试状态
private:
QString m_configFileName;
private:
QString m_localip;
quint16 m_localport;
QString m_serverip;
quint16 m_serverport;
};
#endif // GATEWAYTCPCLIENT_H

290
machine/lotmachine.cpp Normal file
View File

@ -0,0 +1,290 @@
#include "lotmachine.h"
#include <QTime>
#include <QApplication>
LotMachine::LotMachine(QObject *parent) :
QObject(parent),
m_pTcpThread(NULL),
m_pTcpClient(NULL),
m_pComThread(NULL),
m_pComPort(NULL),
m_startComm(0)
{
m_receiveBuff.clear();
m_keyBuff.clear();
m_reFlag = 0;
m_connected = 0;
}
LotMachine::~LotMachine()
{
if (m_startComm != 0)
{
if(m_connectMode == USE_TCP_COMM)
{
m_pTcpThread->quit();
m_pTcpThread->wait();
}
else if(m_connectMode == USE_SERIAL_COMM)
{
m_pComThread->quit();
m_pComThread->wait();
}
}
if(m_connectMode == USE_TCP_COMM)
{
if(m_pTcpThread != NULL)
{
delete m_pTcpThread;
}
}
else if(m_connectMode == USE_SERIAL_COMM)
{
if(m_pComThread != NULL)
{
delete m_pComThread;
}
}
}
//初始化通讯连接方式
void LotMachine::initConnectMode(s16 val)
{
m_connectMode = val;
if(m_connectMode == USE_TCP_COMM)//网口
{
m_pTcpThread = new QThread();
m_pTcpClient = new GatewayTcpClient();
}
else if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComThread = new QThread();
m_pComPort = new ComPort();
connect(m_pComPort, SIGNAL(siSerialPortOpenState(int)), this, SLOT(slotIfOpenSerialPort(int)) );
}
}
void LotMachine::setConfigFileName(QString configfilename)
{
m_configFileName = configfilename;
if(m_connectMode == USE_TCP_COMM)//网口
{
m_pTcpClient->setConfigFileName(m_configFileName);
}
}
//设置串口名称
void LotMachine::setComportName(QString portName)
{
if(m_pComPort == NULL)
{
return;
}
if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComPort->setComPortName(portName);
}
}
QString LotMachine::getConfigFileName()
{
return m_configFileName;
}
int LotMachine::startCommunication()
{
if (m_startComm == 0)
{
// qDebug() << "Machine " << QThread::currentThread();
if(m_connectMode == USE_TCP_COMM)//网口
{
if (m_configFileName.isEmpty())
{
qDebug() << "mast call SetConfigFileName first ";
}
m_pTcpClient->moveToThread(m_pTcpThread); // 移动对象到线程中
// connect(qApp, SIGNAL(finished()), m_pTcpThread, SLOT(finished()));
connect(m_pTcpThread, SIGNAL(started()), m_pTcpClient, SLOT(connectToServer()) );
connect(m_pTcpThread, SIGNAL(finished()), m_pTcpClient, SLOT(deleteLater()) ); // 退出删除对象
connect(m_pTcpClient, SIGNAL(siConnectSta(int)),
this, SLOT(slotConnectSta(int)), Qt::AutoConnection); // 连接状态改变
connect(m_pTcpClient, SIGNAL(siConnectErr(QString)),
this, SLOT(slotConnectErr(QString)), Qt::AutoConnection); // 接收到通讯错误
connect(m_pTcpClient, SIGNAL(siReceiveData(QByteArray)),
this, SLOT(slotReceiveData(QByteArray)), Qt::AutoConnection); // 接收到数据
connect(this, SIGNAL(siSendData(QByteArray)),
m_pTcpClient, SLOT(slotSendData(QByteArray)), Qt::AutoConnection); // 发送数据的槽
m_pTcpThread->start(); // 启动线程
}
if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComPort->moveToThread(m_pComThread);
connect(m_pComThread, SIGNAL(started()), m_pComPort, SLOT(initComm()) );
connect(m_pComThread, SIGNAL(finished()), m_pComPort, SLOT(deleteLater()) ); // 退出删除对象
connect(m_pComPort, SIGNAL(siReceiveData(QByteArray)),
this, SLOT(slotReceiveData(QByteArray)), Qt::QueuedConnection); // 接收到数据
connect(this, SIGNAL(siSendData(QByteArray)),
m_pComPort, SLOT(slotSendData(QByteArray)), Qt::QueuedConnection); // 发送数据的槽
m_pComThread->start(); // 启动线程
}
m_startComm = 1;
}
return m_startComm;
}
// 连接状态改变的槽函数
void LotMachine::slotConnectSta(int sta)
{
// qDebug() << "SlotConnectSta" << sta;
if(m_connected != sta)
{
m_connected = sta;
if(m_connected == 3)//已连接
{
emit siConnectToMqtt();
}
}
}
// 接收到通讯错误槽函数
void LotMachine::slotConnectErr(QString errinfo)
{
if(errinfo.length() <= 0){}
//qDebug() << "SlotConnectErr" << errinfo;
}
// 接收到数据的槽函数
void LotMachine::slotReceiveData(QByteArray dat)
{
m_receiveBuff.append(dat);
int size = m_receiveBuff.length();
QString str = m_receiveBuff;
if(str == "success")
{
m_receiveBuff.remove(0, size);
return;
}
//QString rackNumStr = getJsonValue("device");//机架号
QString bootCmd = getJsonValue("data","boot");//执行命令
if(bootCmd.length() > 0)
{
emit siRunLotDataAction(bootCmd);
}
m_receiveBuff.remove(0, size);
}
//串口是否打开
void LotMachine::slotIfOpenSerialPort(int val)
{
if(val != 0)
{
if(m_connectMode == USE_SERIAL_COMM)
{
m_connected = 3;//串口已打开
}
}
}
//获取键值对属性值
QString LotMachine::getJsonValue(QString name1, QString name2)
{
QString rstr;
rstr.clear();
if(name1.length() <= 0 && name2.length() <= 0)
{
return rstr;
}
//QString str = "{\"device\":\"xiuhuaji133\",\"data\":{\"boot\":9}}";
QString str = m_receiveBuff;
QStringList vallist;
if(str.indexOf(",") == -1)
{
return rstr;
}
else
{
vallist = str.split(",", QString::SkipEmptyParts);
}
if(name2.length() <= 0)
{
if(vallist.size() >= 1)
{
QStringList vallist1;
if(QString(vallist[0]).indexOf(":") == -1)
{
return rstr;
}
else
{
vallist1 = QString(vallist[0]).split(":", QString::SkipEmptyParts);
}
if(QString(vallist1[0]).indexOf(name1) == -1)
{
return rstr;
}
else
{
rstr = QString(vallist1[1]).remove("\"");
}
}
}
else
{
if(vallist.size() >= 2)
{
QStringList vallist1;
if(QString(vallist[1]).indexOf(":") == -1)
{
return rstr;
}
else
{
vallist1 = QString(vallist[1]).split(":", QString::SkipEmptyParts);
}
for(int i = 0; i < vallist1.size(); i++)
{
if(QString(vallist1[i]).indexOf(name2) != -1)
{
if(i+1 < vallist1.size())
{
rstr = QString(vallist1[i+1]).remove("\"").remove("}");
}
}
}
}
}
return rstr;
}
//发送物联数据到网关
void LotMachine::sendLotDataToGateway(QString str)
{
QByteArray dat;
dat.clear();
dat = str.toLatin1();
emit(siSendData(dat));
}

73
machine/lotmachine.h Normal file
View File

@ -0,0 +1,73 @@
#ifndef LOTMACHINE_H
#define LOTMACHINE_H
#include "gatewaytcpclient.h"
#include "comport.h"
#include "comm/typedef.h"
#include <QThread>
#include <QTimer>
#include <QDebug>
#include <QStringList>
#define USE_TCP_COMM 0
#define USE_SERIAL_COMM 1
class LotMachine: public QObject
{
Q_OBJECT
public:
explicit LotMachine(QObject *parent = NULL);
virtual ~LotMachine();
public:
void initConnectMode(s16 val = 0);//初始化通讯连接方式
void setConfigFileName(QString configfilename);
void setComportName(QString portName);//设置串口名称
QString getConfigFileName();
int startCommunication();
private:
QString m_configFileName;
QByteArray m_receiveBuff;//接收到的buf
QByteArray m_keyBuff;//键值对buf
s16 m_reFlag;
private:
s16 m_connectMode; //通讯连接方式 0:网口1:串口
// 通讯线程和网络连接
QThread * m_pTcpThread;
GatewayTcpClient * m_pTcpClient;
QThread * m_pComThread;
ComPort * m_pComPort;
// 连接
public:
inline int isConnected() const { return m_connected; }
private:
int m_startComm;
int m_connected; // 机器连接状态. 0, 未连接; 1, 连接中; 2,
signals: // 发送数据到机器的信号
void siSendData(QByteArray dat);
void siRunLotDataAction(QString cmd);//执行物联网数据动作
void siConnectToMqtt();//与网关已连接
private slots: // 和线程通讯的槽
void slotConnectSta(int sta); // 连接状态改变的槽函数
void slotConnectErr(QString errinfo); // 接收到通讯错误槽函数
void slotReceiveData(QByteArray dat); // 接收到数据的槽函数
void slotIfOpenSerialPort(int val);//串口是否打开
private:
QString getJsonValue(QString name1,QString name2 = NULL);//获取键值对属性值
public:
void sendLotDataToGateway(QString str);//发送物联数据到网关
};
#endif // LOTMACHINE_H

2703
machine/machine.cpp Normal file

File diff suppressed because it is too large Load Diff

374
machine/machine.h Normal file
View File

@ -0,0 +1,374 @@
#ifndef MACHINE_H
#define MACHINE_H
#define BN_PROTOCOL_HEAD 0x05 // 机头板通讯协议N5N5A
#define BN_PROTOCOL_HCPS 0x06 // 勾剪扣换等N6N6A
#define BN_PROTOCOL_DCUT 0x10 // 剪线控制协议(D86)
#include "tcpclient.h"
#include "comport.h"
#include <QThread>
#include <QTimer>
#include <QDebug>
#include "comm/datadef.h"
#include "comm/protocol.h"
#define USE_TCP_COMM 0
#define USE_SERIAL_COMM 1
class Machine: public QObject
{
Q_OBJECT
public:
explicit Machine(QObject *parent = NULL);
virtual ~Machine();
public:
void initConnectMode(s16 val = 0);//初始化通讯连接方式
void setConfigFileName(QString configfilename);
void setComportName(QString portName);//设置串口名称
QString getConfigFileName();
int startCommunication();
private:
QString m_configFileName;
private:
s16 m_connectMode; //通讯连接方式 0:网口1:串口
// 通讯线程和网络连接
QThread * m_pTcpThread;
TcpClient * m_pTcpClient;
QThread * m_pComThread;
ComPort * m_pComPort;
// 连接
public:
inline int isConnected() const { return m_connected; }
private:
int m_startComm;
int m_connected; // 机器连接状态. 0, 未连接; 1, 连接中; 2,
signals: // 发送数据到机器的信号
void siSendData(QByteArray dat);
void siSendDataDone();
private slots: // 和线程通讯的槽
void slotConnectSta(int sta); // 连接状态改变的槽函数
void slotConnectErr(QString errinfo); // 接收到通讯错误槽函数
void slotReceiveData(QByteArray dat); // 接收到数据的槽函数
//----------------------------------------
// 通讯命令
// 机器信息
public:
private:
// 机器状态
public:
inline int isStatusEn() const { return m_statusEn; }
inline const MCStatus & getMcStatus() {m_statusEn = 0; return m_mcStatus; }
void setMcStatusAsMc(u8 * buff, u16 len, int toggle);
//机器信息
inline const MCInfo &getMcInfo(){return m_mcInfo;}
//调试信息
inline const DebugInfo &getDebugInfo(){return m_debugInfo;}
//外围板版本信息
inline const ExBoardInfo &getEXBInfo(){return m_exboardInfo;}
//物联数据
inline const McLotData &getMcLotData(){return m_lotData;}
//文件头
inline const DataDs16FileHead &getFileInfo(){return m_ds16Head;}
private:
int m_statusEn; // 状态有效标志
int m_statusToggle;
MCStatus m_mcStatus; // 机器状态
MCInfo m_mcInfo; // 机器信息
DebugInfo m_debugInfo;//调试信息
ExBoardInfo m_exboardInfo; // 外围板信息
McLotData m_lotData; // 物联数据
DataDs16FileHead m_ds16Head; //文件头
// 机器参数
public:
inline const ParaStruct & getMcPara() {/*m_mcParaEn = 0; */ return m_mcPara; }
inline const ParaStruct & getWkPara() {/*m_wkParaEn = 0; */ return m_wkPara; }
inline const ParaStruct & getPreMcPara() {/*m_mcParaEn = 0; */ return m_mcPrePara; }
inline const ParaStruct & getPreWkPara() {/*m_wkParaEn = 0; */ return m_wkPrePara; }
inline const EmbMvAng & getFrameAnglePara() {/*m_wkParaEn = 0; */ return m_frameAnglePara; }
//获取索引外围板的参数,目前读取的是第一块的(所有外围板参数都和第一块的相同)
//inline const HeadInfo & getHeadPara(int idx = 0) {/*m_mcParaEn = 0; */ return m_exboardInfo.headInfo[idx]; }
inline const HcpsInfo & getHcpsPara(int idx) {/*m_wkParaEn = 0; */ return m_exboardInfo.hcpsInfo[idx]; }//毛巾的idx是1平绣是0
private:
ParaStruct m_mcPara; // 机器参数信息 配置信息
ParaStruct m_wkPara; // 工作参数信息
ParaStruct m_mcPrePara; // 机器预留参数
ParaStruct m_wkPrePara; // 工作预留参数
EmbMvAng m_frameAnglePara; // 动框角度参数
int m_mcParaEn;
int m_wkParaEn;
int m_mcPreParaEn;
int m_wkPreParaEn;
int m_frameAngleParaEn;
public:
inline int isSensorBmpEn() const { return m_sensorBmpEn; }
inline const SensorsBitmap & getSensorDat() {/* m_sensorStaEn = 0; */ return m_sensorsStaDat; }
inline const SensorsBitmap & getSensorBmp() {/* m_sensorBmpEn = 0; */ return m_sensorEnBmp; }
inline int getTotalSendNum() { return m_totalSendNum; }
inline int getTotalPacketNum() { return m_totalPacketNum; }
private:
SensorsBitmap m_sensorsStaDat; // 传感器信号状态位图
SensorsBitmap m_sensorEnBmp; // 传感器信号有效位图
int m_sensorStaEn;
int m_sensorBmpEn;
public:
void setTcpConnectState(int state);
void setMacKey(unsigned char * p_dat , int i_size); // 设置机器的密钥
HeadInfo* getHeadPara(int idx ,int nTpye);//得到毛巾和平绣的机头板参数 -rq
// 文件传输结果
public:
private:
QTimer * m_pSendTimer;
FileTransCtrl m_transCtrl;
int m_fileTransEn;
int m_transBreak;
int m_totalSendNum;//传输文件时总共发送的包数
int m_totalPacketNum;//传输文件时总的包数
private slots:
void onSendTimer(void);
void slIfOpenSerialPort(int val);//串口是否打开
signals: // 发送给UI的信号
void siMcInfoChange(); // 机器信息改变信号
void siDebugInfo(); //调试信息改变信号
void siReceiveLotData(); // 接收物联数据信号
void siEXBInfoChange(); // 外围板版本信息改变信号
void siStatusChange(int); // 状态改变信号
void siParaChange(int type, int id); // 参数更新信号
void siEXBParaChange(); // 机头板参数更新信号
void siMemDataChange(int beginAddr); // 内存数据更新信号
void siSensorChange(SensorsBitmap map); // 传感信号更新信号
void siFileInfoChange(); // 文件信息更新信号
void siTransResultChange(); // 文件传输结果信号
void siTransProgress(u8 fileType, int send, int total); // 文件传输结果信号
void siSensorEnBitmap(SensorsBitmap map); // 传感信号有效位图更新信号
void siDataFilePos(DataFilePos pos); // 边框检查时起绣点超出范围后下位机自动定新的起绣点后发给上位机
public slots:
void breakFileTrans(); // 打断文件传输
public: // 机器执行命令,读取下位机数据
void getInfoFromMachine();
void getFileInfoFromMachine();//读取文件信息
void getExboardInfoFromMachine();
int getStatusFromMachine();
void getNetDataFromMachine(); // 读取机器物联数据
void getParasFromMachine(int type = -1, int id = 0); // 读取机器参数
void getHeadParasFromMachine(int id ,int nodeType); // 读取机头板参数
void getHcpsParasFromMachine(int nodeType = 0); // 读取换色板参数
void restoreFactorySetting(int type = -1); // 恢复出厂设置
void getSensorsFromMachine(int backtype = 0);
void getTransResultFromMachine(int fileid);
void getSensorEnBmpFromMachine(); // 获取传感器有效标志位图
void sleep(int sec);
//void getHeadPara();
public: // 设置机器配置
// #define UCMD_SET_MC_CONFIG 0x0101 VLDP 无 设置机器的配置,包括信号使用的端口等信息
public: // 设置机器状态
void setMcStatus(int stacode, int para = 0);
void cleanError(); // 清除错误
void setEnableWorkSta(); // 设置允许工作状态
void setDisableWorkSta(); // 设置禁止工作状态
void setEnableWorkTime(); // 设置允许工作时间状态
void setDisableWorkTime(); // 设置禁止工作时间状态
void resetOutput(); // 重置产量
void setToManualWork(); // 手动工作状态
void setToAutoWork(); // 自动工作状态
void switchWorkFile(int idx = 0); // 文件切换
void invalidateWorkFile(int idx = 0); // 文件失效
void cleanNewParaFlag(); // 清除新参数标志
void setSimulateWork(); // 模拟工作状态
void setNormalWork(); // 正常工作状态
void exitTraverStates(); //退出遍历状态
void exitDetectTest(); //退出断线测试
void resetBobbinCounter(); // 底线计数复位
void entrySensorScan(); // 进入扫描传感器状态
void exitSensorScan(); // 退出扫描传感器状态
void setElapsed(unsigned char i_type , unsigned char i_time); // 设置经过的时间
void testThreadBK(int type,int needle,int headType); // 测试断线检测,1是面线2是底线 //headType 1是平绣 4是缠绕
void lockTest(int type,int para); // 测试锁头
public: // 设置机器参数
void setParasToMachine(int type, ParaStruct & para);
void setFrameAngleParasToMachine(int type, EmbMvAng & para);
void setAParasToMachine(int type, int idx, u32 value);
void setEXBHeadParasToMachine(HeadInfo & para,int id = 0);//设置机头板板参数
void setEXBHcpsParasToMachine(HcpsInfo & para ,int idx);//设置换色板参数
void setHeadPatchParasToMachine(int type, ParaStruct & para, u16 packID);
void setTowelHighParasToMachine(int type, ParaStruct & para, u16 packID);
void setShutDownTime(u8 type, u32 time);
void setMcPara(ParaStruct * pPara);
void setWkPara(ParaStruct * pPara);
void setMcPrePara(ParaStruct * pPara);//预留参数
void setWkPrePara(ParaStruct * pPara);//预留参数
void setFrameAnglePara(EmbMvAng * pPara);//动框角度参数设置
void setAMcPara(int id, u32 value);
void setAWkPara(int id, u32 value);
void setAMcPrePara(int id, u32 value);//预留参数
void setAWkPrePara(int id, u32 value);//预留参数
void setHeadBoardPara(HeadInfo * pPara, int id = 0);//设置机头板参数
void setHcpsBoardPara(HcpsInfo * pPara, int idx = 0);//设置换色板参数
void setHeadPara(ParaStruct * pPara,u16 ID);//设置机头参数
void setPatchColorPara(ParaStruct * pPara);
void setPatchNeedlePara(ParaStruct * pPara);
void setTowelHeightPara(ParaStruct * pPara);//设置毛巾高度
public: // 设置内存数据
// #define UCMD_SET_MEM_DATA 0x0104 // 设置内存数据
public: // 设置文件参数
void setFilePara(int fileidx, int fileid, DataFilePara & filePara);
public: // 设置执行进度
void setFileExecProgress(int fileidx, int fileid, FileExecPara & fileExecPara);
void setToDefaultParas(int type, u8 id = 0, u8 nodeType = 0);
public slots: // 手动控制命令
void actionByhand(int actcode, int para1, int para2 = 0, int para3 = 0);
void motoToZero(int obj); // 电机归零(辅助调试的功能,无安全保护和逻辑关系)
void motoMove(int obj, int dir, int spd); // 电机移动(辅助调试的功能,无安全保护和逻辑关系)
void outputCtrl(int obj, int act, int para); // 输出控制(辅助调试的功能,无安全保护和逻辑关系)
void motoServoCtrl(int obj, int onoff); // 电机使能控制(辅助调试的功能,无安全保护和逻辑关系)
void embMsServoOn();
void embMsServoOff(); // 平绣主轴使能控制
void towelMsServoOn();
void towelMsServoOff(); // 毛巾主轴使能控制
void towelMMsServoOn();
void towelMMsServoOff(); // 毛巾M轴使能控制
void towelRMMsServoOn();
void towelRMMsServoOff(); // 毛巾打环轴使能控制
void coilMsServoOn();
void coilMsServoOff(); // 缠绕主轴使能控制
void coilMMsServoOn();
void coilMMsServoOff(); // 缠绕M轴使能控制
void manualAction(int obj, int para2 = 0, int para3 = 0); // 手动动作功能(日常使用功能,有安全保护和逻辑时序关系)
void setWorkRange(); // 定工作范围
void manualOil(int nNum); // 手动加油
void resetRepeatNum();// 重置反复次数
void shuttleCounter();//自动换梭
void changeOneShuttle();//自动换一个梭
void looseOnOff(); // 松紧线
void quantityMoveFrame(s32 x,s32 y); // 定量移框
void moveFrameByHand(char xy, char dir, int spd); // 手动移框
void embJog(); // 平绣点动
void testLockMoto(int para); //平绣锁头电机测试
void chenilleJog(); //毛巾点动
void hoistCtrl(int gearValue); //提升电机控制
void elasticCtrl(int posValue); //松紧线控制
void testADC(int para ,int headNum = 0); //测试电位器
void embSwitchNeedle(int nNum); // 平绣换色
void chenilleSwitchNeedle(int nNum); //毛巾换色
void chenilleColorDebug(int nNum);//毛巾换色调试
void sequinSwitchNeedle(int nNum, s16 sq); // 亮片换色
void embSpindleTest(s32 para1, s32 para2); // 平绣主轴研车
void embCutThread(); // 平绣剪线
void chenilleCutThread(); //毛巾剪线
void headSwitch(int para); //机头切换,para是切换的机头
//进入或退出状态(遍历设置、断线检测、退出勾刀测试)
void enterOrExitStates(int obj, int para1 = 0, int para2 = 0, int para3 = 0, int para4 = 0);
public: // 机器工作命令
void mcWorkCmd(int workcode, int para1 = 0 , int para2 = 0);
void startWork(); // 启动工作
void pauseWork(); // 暂停工作
void allToReset(); // 流程复位
void allToZero(); // 全部归零
void gotoStartPos(); // 回起针点
void setOffsetPos(); // 定偏移点
void gotoOffsetPos(); // 回偏移点
void setFeedPos(); // 定上料点
void gotoFeedPos(); // 回上料点
void checkFrame(); // 边框检查
void simulateFrame(); // 空走边框
void enterClothEmbroidery();//进入匹绣
void exitClothEmbroidery();//退出匹绣
void autoSetSoftLimit();//自动定软限位
void embSpindleTest();//平绣主轴齿轮比测试
void chenSpindleTest();//毛巾主轴齿轮比测试
void ecdWidthTest();//测试平绣主轴编码器宽度
void footTest(); // 独立压脚测试
void headBoardBusDetect();//机头板总线检测
void traceOffset();//线迹偏移
void resetTraceOffset();//线迹偏移数据复位
void clearCurTraceOffset();//清除当前索引的线迹偏移数据
// 边框切割
// 手动断布
void fastJump(int idx); // 前进回退
void gotoWorkPos(); // 回工作点
void gotoFixPos(); // 回穿线点
// 回换梭位
// 进料退料
// 画格子图
// 回结束点
void gotoZeroPos(); // 回零点
void msRpmChange(int chgram,int flag); // 速度改变
void mainShaftJog();// 主轴点动
public: // 移动到XY坐标命令
void moveFrameTo(int x, int y);
public: // 文件传输命令
int sendFileProc(int type, int idx, int id, DataDs16FileHead * pfileHead, u8 * pDatBuff);
int sendFileProc(int type, int idx, int id, DataDs16FileHead & fileHead, u8 * pDatBuff);
int dySendFileProc(int type, int idx, int id, DataDs16FileHead * pfileHead, u8 * pDatBuff); //动态传输文件
int sendAPPFileProc(int type, int idx, int id, AppFileHead &fileHead, u8 *pDatBuff);
int sendBoardFileProc(int type, int idx, int id, BoardFileHead &fileHead, u8 *pDatBuff);
private:
void startFileTrans(FileTransCtrl & transCtrl);
void startFileDyTrans(FileTransCtrl & transCtrl);//开始动态传输文件
void transFileData(FileTransCtrl & transCtrl, int pktidx);
public: // 下位机系统升级命令
void updateFirmware(); // 下位机升级
void updateExBoard(u8 protocolType, u8 nodeId, u8 nodeType); // 外围板升级
};
#endif // MACHINE_H

186
machine/qbindtcpsocket.cpp Normal file
View File

@ -0,0 +1,186 @@
#include "qbindtcpsocket.h"
#include <QHostAddress>
QBindTcpSocket::QBindTcpSocket(QObject *parent):
QTcpSocket(parent)
{
}
QBindTcpSocket::~QBindTcpSocket()
{
}
int QBindTcpSocket::bindAddrAndPort(QString localAddr, quint16 localPort)
{
QString str = localAddr;
QHostAddress addr(str);
setLocalAddress(addr);
setLocalPort(localPort);
return 0;
}
//-------------------------------
TcpConnectDetect::TcpConnectDetect(QObject *parent) :
QObject(parent),
m_pDetectSocket(NULL),
m_localip(DEF_LOCAL_IP),
m_localport(DEF_LOCAL_PORT),
m_serverip(DEF_SERVER_IP),
m_serverport(DEF_SERVER_PORT)
{
}
TcpConnectDetect::~TcpConnectDetect()
{
if (m_pDetectSocket == NULL)
{
m_pDetectSocket->disconnectFromHost();
m_pDetectSocket->waitForDisconnected();
m_pDetectSocket->close();
delete m_pDetectSocket;
}
}
void TcpConnectDetect::detectStart()
{
qDebug("TcpConnectDetect start");
if (m_pDetectSocket == NULL)
{
m_pDetectSocket = new QBindTcpSocket;
}
}
int TcpConnectDetect::connectDetect()
{
int connectsta = 0;
int rslt;
// qDebug() << "TcpConnectDetect " << QThread::currentThread();
if (m_pDetectSocket == NULL)
{
return 0;
}
if (m_localip.isEmpty() == false)
{
m_pDetectSocket->bindAddrAndPort(m_localip, m_localport);
}
m_pDetectSocket->abort();
m_pDetectSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
m_pDetectSocket->connectToHost(m_serverip, m_serverport);
do
{
rslt = m_pDetectSocket->waitForConnected(4000); // 等待连接
qDebug("bind Detect connect rslt=%d", rslt);
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
switch(m_pDetectSocket->state())
{
case QAbstractSocket::ConnectedState:
{
// 如果连接上,说明 m_pClientSocket 连接已经无效, 需要断开重新连接
// 先断开测试连接
m_pDetectSocket->disconnectFromHost();
m_pDetectSocket->waitForDisconnected();
connectsta = 1;
// 发送断开主连接的信号
qDebug() << "detect is Connected, disconnect all";
break;
}
case QAbstractSocket::UnconnectedState:
{
// qDebug() << "detect is Unconnected err=" << m_pDetectSocket->error() << ", info:" << m_pDetectSocket->errorString();
switch (m_pDetectSocket->error())
{
case QAbstractSocket::SocketTimeoutError: // 连接超时,说明已经断开
case QAbstractSocket::NetworkError: // 网络错误, 主机不可连接, 可能已经断开
{
qDebug() << "detect is timout, disconnect all";
connectsta = 1;
// 发送断开主连接的信号
break;
}
case QAbstractSocket::ConnectionRefusedError: // 拒绝连接, 说明连接还在
{
connectsta = 2;
// qDebug() << "Connection Refused, old connect is alive";
break;
}
/*
case QAbstractSocket::RemoteHostClosedError:
case QAbstractSocket::HostNotFoundError:
case QAbstractSocket::SocketAccessError:
case QAbstractSocket::SocketResourceError:
case QAbstractSocket::SocketTimeoutError:
case QAbstractSocket::DatagramTooLargeError:
case QAbstractSocket::AddressInUseError:
case QAbstractSocket::SocketAddressNotAvailableError:
case QAbstractSocket::UnsupportedSocketOperationError:
case QAbstractSocket::UnfinishedSocketOperationError:
case QAbstractSocket::ProxyAuthenticationRequiredError:
case QAbstractSocket::SslHandshakeFailedError:
case QAbstractSocket::ProxyConnectionRefusedError:
case QAbstractSocket::ProxyConnectionClosedError:
case QAbstractSocket::ProxyConnectionTimeoutError:
case QAbstractSocket::ProxyNotFoundError:
case QAbstractSocket::ProxyProtocolError:
case QAbstractSocket::UnknownSocketError:
*/
default:
{
// 继续检测
connectsta = 2;
qDebug() << " retry";
break;
}
} // 错误处理结束
}
case QAbstractSocket::ConnectingState:
{
// qDebug() << "detect is Connecting";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
// 继续等待
break;
}
case QAbstractSocket::HostLookupState:
case QAbstractSocket::BoundState:
case QAbstractSocket::ListeningState:
case QAbstractSocket::ClosingState:
default:
{
// 继续等待
qDebug("detect sta is %d\r\n", m_pDetectSocket->state());
break;
}
}
if (connectsta != 0)
{
break;
}
}while(1);
m_pDetectSocket->close();
// 发送本次测试连接的状态信号
emit(siConnectSta(connectsta));
return connectsta;
}
void TcpConnectDetect::setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport)
{
m_localip = localip;
m_localport = localport;
m_serverip = serverip;
m_serverport = serverport;
}

53
machine/qbindtcpsocket.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef QBINDTCPSOCKET_H
#define QBINDTCPSOCKET_H
#define DEF_SERVER_IP "192.168.16.253"
#define DEF_SERVER_PORT 5000
#define DEF_LOCAL_IP ""
#define DEF_LOCAL_PORT 5001
#include <QTcpSocket>
class QBindTcpSocket : public QTcpSocket
{
public:
QBindTcpSocket(QObject *parent = 0);
virtual ~QBindTcpSocket();
public:
int bindAddrAndPort(QString localAddr, quint16 localPort);
};
#if(1)
class TcpConnectDetect : public QObject
{
Q_OBJECT
public:
explicit TcpConnectDetect(QObject *parent = NULL);
virtual ~TcpConnectDetect();
signals:
void siConnectSta(int sta); // 网络连接信号
public:
public slots:
void detectStart();
int connectDetect();
private:
QBindTcpSocket * m_pDetectSocket;
public:
void setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport);
private:
QString m_localip;
quint16 m_localport;
QString m_serverip;
quint16 m_serverport;
};
#endif
#endif // QBINDTCPSOCKET_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,57 @@
#ifndef _POSIX_QEXTSERIALPORT_H_
#define _POSIX_QEXTSERIALPORT_H_
#include <stdio.h>
#include <termios.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include "qextserialbase.h"
class Posix_QextSerialPort:public QextSerialBase {
public:
Posix_QextSerialPort();
Posix_QextSerialPort(const Posix_QextSerialPort& s);
Posix_QextSerialPort(const QString & name);
Posix_QextSerialPort(const PortSettings& settings);
Posix_QextSerialPort(const QString & name, const PortSettings& settings);
Posix_QextSerialPort& operator=(const Posix_QextSerialPort& s);
virtual ~Posix_QextSerialPort();
virtual void setBaudRate(BaudRateType);
virtual void setDataBits(DataBitsType);
virtual void setParity(ParityType);
virtual void setStopBits(StopBitsType);
virtual void setFlowControl(FlowType);
virtual void setTimeout(ulong, ulong);
virtual bool open(OpenMode mode=0);
virtual void close();
virtual void flush();
virtual qint64 size() const;
virtual qint64 bytesAvailable();
virtual void ungetChar(char c);
virtual void translateError(ulong error);
virtual void setDtr(bool set=true);
virtual void setRts(bool set=true);
virtual ulong lineStatus();
QFile* Posix_File;
protected:
//QFile* Posix_File;
struct termios Posix_CommConfig;
struct timeval Posix_Timeout;
struct timeval Posix_Copy_Timeout;
virtual qint64 readData(char * data, qint64 maxSize);
virtual qint64 writeData(const char * data, qint64 maxSize);
};
#endif

View File

@ -0,0 +1,250 @@
#include "qextserialbase.h"
/*!
\class QextSerialBase
\version 1.0.0
\author Stefan Sander
A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort.
*/
#ifdef QT_THREAD_SUPPORT
QMutex* QextSerialBase::mutex=NULL;
unsigned long QextSerialBase::refCount=0;
#endif
/*!
\fn QextSerialBase::QextSerialBase()
Default constructor.
*/
QextSerialBase::QextSerialBase()
: QIODevice()
{
#ifdef _TTY_WIN_
setPortName("COM1");
#elif defined(_TTY_IRIX_)
setPortName("/dev/ttyf1");
#elif defined(_TTY_HPUX_)
setPortName("/dev/tty1p0");
#elif defined(_TTY_SUN_)
setPortName("/dev/ttya");
#elif defined(_TTY_DIGITAL_)
setPortName("/dev/tty01");
#elif defined(_TTY_FREEBSD_)
setPortName("/dev/ttyd1");
#else
setPortName("/dev/ttyS0");
#endif
construct();
}
/*!
\fn QextSerialBase::QextSerialBase(const QString & name)
Construct a port and assign it to the device specified by the name parameter.
*/
QextSerialBase::QextSerialBase(const QString & name)
: QIODevice()
{
setPortName(name);
construct();
}
/*!
\fn QextSerialBase::~QextSerialBase()
Standard destructor.
*/
QextSerialBase::~QextSerialBase()
{
#ifdef QT_THREAD_SUPPORT
refCount--;
if (mutex && refCount==0) {
delete mutex;
mutex=NULL;
}
#endif
}
/*!
\fn void QextSerialBase::construct()
Common constructor function for setting up default port settings.
(115200 Baud, 8N1, Hardware flow control where supported, otherwise no flow control, and 500 ms timeout).
*/
void QextSerialBase::construct()
{
Settings.BaudRate=BAUD115200;
Settings.DataBits=DATA_8;
Settings.Parity=PAR_NONE;
Settings.StopBits=STOP_1;
Settings.FlowControl=FLOW_HARDWARE;
Settings.Timeout_Sec=0;
Settings.Timeout_Millisec=500;
#ifdef QT_THREAD_SUPPORT
if (!mutex) {
mutex=new QMutex( QMutex::Recursive );
}
refCount++;
#endif
setOpenMode(QIODevice::NotOpen);
}
/*!
\fn void QextSerialBase::setPortName(const QString & name)
Sets the name of the device associated with the object, e.g. "COM1", or "/dev/ttyS0".
*/
void QextSerialBase::setPortName(const QString & name)
{
port = name;
}
/*!
\fn QString QextSerialBase::portName() const
Returns the name set by setPortName().
*/
QString QextSerialBase::portName() const
{
return port;
}
/*!
\fn BaudRateType QextSerialBase::baudRate(void) const
Returns the baud rate of the serial port. For a list of possible return values see
the definition of the enum BaudRateType.
*/
BaudRateType QextSerialBase::baudRate(void) const
{
return Settings.BaudRate;
}
/*!
\fn DataBitsType QextSerialBase::dataBits() const
Returns the number of data bits used by the port. For a list of possible values returned by
this function, see the definition of the enum DataBitsType.
*/
DataBitsType QextSerialBase::dataBits() const
{
return Settings.DataBits;
}
/*!
\fn ParityType QextSerialBase::parity() const
Returns the type of parity used by the port. For a list of possible values returned by
this function, see the definition of the enum ParityType.
*/
ParityType QextSerialBase::parity() const
{
return Settings.Parity;
}
/*!
\fn StopBitsType QextSerialBase::stopBits() const
Returns the number of stop bits used by the port. For a list of possible return values, see
the definition of the enum StopBitsType.
*/
StopBitsType QextSerialBase::stopBits() const
{
return Settings.StopBits;
}
/*!
\fn FlowType QextSerialBase::flowControl() const
Returns the type of flow control used by the port. For a list of possible values returned
by this function, see the definition of the enum FlowType.
*/
FlowType QextSerialBase::flowControl() const
{
return Settings.FlowControl;
}
/*!
\fn bool QextSerialBase::isSequential() const
Returns true if device is sequential, otherwise returns false. Serial port is sequential device
so this function always returns true. Check QIODevice::isSequential() documentation for more
information.
*/
bool QextSerialBase::isSequential() const
{
return true;
}
/*!
\fn bool QextSerialBase::atEnd() const
This function will return true if the input buffer is empty (or on error), and false otherwise.
Call QextSerialBase::lastError() for error information.
*/
bool QextSerialBase::atEnd() const
{
if (size()) {
return true;
}
return false;
}
/*!
\fn qint64 QextSerialBase::readLine(char * data, qint64 maxSize)
This function will read a line of buffered input from the port, stopping when either maxSize bytes
have been read, the port has no more data available, or a newline is encountered.
The value returned is the length of the string that was read.
*/
qint64 QextSerialBase::readLine(char * data, qint64 maxSize)
{
qint64 numBytes = bytesAvailable();
char* pData = data;
if (maxSize < 2) //maxSize must be larger than 1
return -1;
/*read a byte at a time for MIN(bytesAvail, maxSize - 1) iterations, or until a newline*/
while (pData<(data+numBytes) && --maxSize) {
readData(pData, 1);
if (*pData++ == '\n') {
break;
}
}
*pData='\0';
/*return size of data read*/
return (pData-data);
}
/*!
\fn ulong QextSerialBase::lastError() const
Returns the code for the last error encountered by the port, or E_NO_ERROR if the last port
operation was successful. Possible error codes are:
\verbatim
Error Explanation
--------------------------- -------------------------------------------------------------
E_NO_ERROR No Error has occured
E_INVALID_FD Invalid file descriptor (port was not opened correctly)
E_NO_MEMORY Unable to allocate memory tables (POSIX)
E_CAUGHT_NON_BLOCKED_SIGNAL Caught a non-blocked signal (POSIX)
E_PORT_TIMEOUT Operation timed out (POSIX)
E_INVALID_DEVICE The file opened by the port is not a character device (POSIX)
E_BREAK_CONDITION The port detected a break condition
E_FRAMING_ERROR The port detected a framing error
(usually caused by incorrect baud rate settings)
E_IO_ERROR There was an I/O error while communicating with the port
E_BUFFER_OVERRUN Character buffer overrun
E_RECEIVE_OVERFLOW Receive buffer overflow
E_RECEIVE_PARITY_ERROR The port detected a parity error in the received data
E_TRANSMIT_OVERFLOW Transmit buffer overflow
E_READ_FAILED General read operation failure
E_WRITE_FAILED General write operation failure
\endverbatim
*/
ulong QextSerialBase::lastError() const
{
return lastErr;
}

View File

@ -0,0 +1,196 @@
#ifndef _QEXTSERIALBASE_H_
#define _QEXTSERIALBASE_H_
#include <QIODevice>
#include <QFile>
#ifdef QT_THREAD_SUPPORT
#include <QThread>
#include <QMutex>
#endif
/*if all warning messages are turned off, flag portability warnings to be turned off as well*/
#ifdef _TTY_NOWARN_
#define _TTY_NOWARN_PORT_
#endif
/*macros for thread support*/
#ifdef QT_THREAD_SUPPORT
#define LOCK_MUTEX() mutex->lock()
#define UNLOCK_MUTEX() mutex->unlock()
#else
#define LOCK_MUTEX()
#define UNLOCK_MUTEX()
#endif
/*macros for warning messages*/
#ifdef _TTY_NOWARN_PORT_
#define TTY_PORTABILITY_WARNING(s)
#else
#define TTY_PORTABILITY_WARNING(s) qWarning(s)
#endif
#ifdef _TTY_NOWARN_
#define TTY_WARNING(s)
#else
#define TTY_WARNING(s) qWarning(s)
#endif
/*line status constants*/
#define LS_CTS 0x01
#define LS_DSR 0x02
#define LS_DCD 0x04
#define LS_RI 0x08
#define LS_RTS 0x10
#define LS_DTR 0x20
#define LS_ST 0x40
#define LS_SR 0x80
/*error constants*/
#define E_NO_ERROR 0
#define E_INVALID_FD 1
#define E_NO_MEMORY 2
#define E_CAUGHT_NON_BLOCKED_SIGNAL 3
#define E_PORT_TIMEOUT 4
#define E_INVALID_DEVICE 5
#define E_BREAK_CONDITION 6
#define E_FRAMING_ERROR 7
#define E_IO_ERROR 8
#define E_BUFFER_OVERRUN 9
#define E_RECEIVE_OVERFLOW 10
#define E_RECEIVE_PARITY_ERROR 11
#define E_TRANSMIT_OVERFLOW 12
#define E_READ_FAILED 13
#define E_WRITE_FAILED 14
/*enums for port settings*/
enum NamingConvention {
WIN_NAMES,
IRIX_NAMES,
HPUX_NAMES,
SUN_NAMES,
DIGITAL_NAMES,
FREEBSD_NAMES,
LINUX_NAMES
};
enum BaudRateType {
BAUD50, //POSIX ONLY
BAUD75, //POSIX ONLY
BAUD110,
BAUD134, //POSIX ONLY
BAUD150, //POSIX ONLY
BAUD200, //POSIX ONLY
BAUD300,
BAUD600,
BAUD1200,
BAUD1800, //POSIX ONLY
BAUD2400,
BAUD4800,
BAUD9600,
BAUD14400, //WINDOWS ONLY
BAUD19200,
BAUD38400,
BAUD56000, //WINDOWS ONLY
BAUD57600,
BAUD76800, //POSIX ONLY
BAUD115200,
BAUD128000, //WINDOWS ONLY
BAUD256000 //WINDOWS ONLY
};
enum DataBitsType {
DATA_5,
DATA_6,
DATA_7,
DATA_8
};
enum ParityType {
PAR_NONE,
PAR_ODD,
PAR_EVEN,
PAR_MARK, //WINDOWS ONLY
PAR_SPACE
};
enum StopBitsType {
STOP_1,
STOP_1_5, //WINDOWS ONLY
STOP_2
};
enum FlowType {
FLOW_OFF,
FLOW_HARDWARE,
FLOW_XONXOFF
};
/*structure to contain port settings*/
struct PortSettings {
BaudRateType BaudRate;
DataBitsType DataBits;
ParityType Parity;
StopBitsType StopBits;
FlowType FlowControl;
ulong Timeout_Sec;
ulong Timeout_Millisec;
};
class QextSerialBase : public QIODevice {
public:
QextSerialBase();
QextSerialBase(const QString & name);
virtual ~QextSerialBase();
virtual void construct();
virtual void setPortName(const QString & name);
virtual QString portName() const;
virtual void setBaudRate(BaudRateType)=0;
virtual BaudRateType baudRate() const;
virtual void setDataBits(DataBitsType)=0;
virtual DataBitsType dataBits() const;
virtual void setParity(ParityType)=0;
virtual ParityType parity() const;
virtual void setStopBits(StopBitsType)=0;
virtual StopBitsType stopBits() const;
virtual void setFlowControl(FlowType)=0;
virtual FlowType flowControl() const;
virtual void setTimeout(ulong, ulong)=0;
virtual bool open(OpenMode mode=0)=0;
virtual bool isSequential() const;
virtual void close()=0;
virtual void flush()=0;
virtual qint64 size() const=0;
virtual qint64 bytesAvailable()=0;
virtual bool atEnd() const;
virtual void ungetChar(char c)=0;
virtual qint64 readLine(char * data, qint64 maxSize);
virtual ulong lastError() const;
virtual void translateError(ulong error)=0;
virtual void setDtr(bool set=true)=0;
virtual void setRts(bool set=true)=0;
virtual ulong lineStatus()=0;
protected:
QString port;
PortSettings Settings;
ulong lastErr;
#ifdef QT_THREAD_SUPPORT
static QMutex* mutex;
static ulong refCount;
#endif
virtual qint64 readData(char * data, qint64 maxSize)=0;
virtual qint64 writeData(const char * data, qint64 maxSize)=0;
};
#endif

View File

@ -0,0 +1,98 @@
/*!
\class QextSerialPort
\version 1.0.0
\author Stefan Sander
A cross-platform serial port class.
This class encapsulates a serial port on both POSIX and Windows systems. The user will be
notified of errors and possible portability conflicts at run-time by default - this behavior can
be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn
off portability warnings) in the project.
\note
On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may
select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can
make no guarantees as to the quality of POSIX support under NT/2000 however.
*/
#include <stdio.h>
#include "qextserialport.h"
/*!
\fn QextSerialPort::QextSerialPort()
Default constructor. Note that the naming convention used by a QextSerialPort constructed with
this constructor will be determined by #defined constants, or lack thereof - the default behavior
is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are:
\verbatim
Constant Used By Naming Convention
---------- ------------- ------------------------
_TTY_WIN_ Windows COM1, COM2
_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2
_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0
_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb
_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02
_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1
_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1
<none> Linux /dev/ttyS0, /dev/ttyS1
\endverbatim
The object will be associated with the first port in the system, e.g. COM1 on Windows systems.
See the other constructors if you need to use a port other than the first.
*/
QextSerialPort::QextSerialPort()
: QextBaseType()
{}
/*!
\fn QextSerialPort::QextSerialPort(const QString & name)
Constructs a serial port attached to the port specified by name.
name is the name of the device, which is windowsystem-specific,
e.g."COM1" or "/dev/ttyS0".
*/
QextSerialPort::QextSerialPort(const QString & name)
: QextBaseType(name)
{}
/*!
\fn QextSerialPort::QextSerialPort(PortSettings const& settings)
Constructs a port with default name and settings specified by the settings parameter.
*/
QextSerialPort::QextSerialPort(PortSettings const& settings)
: QextBaseType(settings)
{}
/*!
\fn QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings)
Constructs a port with the name and settings specified.
*/
QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings)
: QextBaseType(name, settings)
{}
/*!
\fn QextSerialPort::QextSerialPort(const QextSerialPort& s)
Copy constructor.
*/
QextSerialPort::QextSerialPort(const QextSerialPort& s)
: QextBaseType(s)
{}
/*!
\fn QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s)
Overrides the = operator.
*/
QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s)
{
return (QextSerialPort&)QextBaseType::operator=(s);
}
/*!
\fn QextSerialPort::~QextSerialPort()
Standard destructor.
*/
QextSerialPort::~QextSerialPort()
{}

View File

@ -0,0 +1,27 @@
#ifndef _QEXTSERIALPORT_H_
#define _QEXTSERIALPORT_H_
/*POSIX CODE*/
#ifdef _TTY_POSIX_
#include "posix_qextserialport.h"
#define QextBaseType Posix_QextSerialPort
/*MS WINDOWS CODE*/
#else
#include "win_qextserialport.h"
#define QextBaseType Win_QextSerialPort
#endif
class QextSerialPort: public QextBaseType {
public:
QextSerialPort();
QextSerialPort(const QString & name);
QextSerialPort(PortSettings const& s);
QextSerialPort(const QString & name, PortSettings const& s);
QextSerialPort(const QextSerialPort& s);
QextSerialPort& operator=(const QextSerialPort&);
virtual ~QextSerialPort();
};
#endif

View File

@ -0,0 +1,880 @@
/*!
\class Win_QextSerialPort
\version 1.0.0
\author Stefan Sander
A cross-platform serial port class.
This class encapsulates the Windows portion of QextSerialPort. The user will be notified of
errors and possible portability conflicts at run-time by default - this behavior can be turned
off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off
portability warnings) in the project. Note that defining _TTY_NOWARN_ also defines
_TTY_NOWARN_PORT_.
\note
On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may
select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can
make no guarantees as to the quality of POSIX support under NT/2000 however.
*/
#include <stdio.h>
#include "win_qextserialport.h"
/*!
\fn Win_QextSerialPort::Win_QextSerialPort()
Default constructor. Note that the name of the device used by a Win_QextSerialPort constructed
with this constructor will be determined by #defined constants, or lack thereof - the default
behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants
are:
\verbatim
Constant Used By Naming Convention
---------- ------------- ------------------------
_TTY_WIN_ Windows COM1, COM2
_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2
_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0
_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb
_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02
_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1
_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1
<none> Linux /dev/ttyS0, /dev/ttyS1
\endverbatim
This constructor associates the object with the first port on the system, e.g. COM1 for Windows
platforms. See the other constructor if you need a port other than the first.
*/
Win_QextSerialPort::Win_QextSerialPort():QextSerialBase() {
Win_Handle=INVALID_HANDLE_VALUE;
}
/*!Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort&)
Copy constructor.
*/
Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort& s):QextSerialBase(s.port) {
Win_Handle=INVALID_HANDLE_VALUE;
setOpenMode(s.openMode());
lastErr=s.lastErr;
port = s.port;
Settings.FlowControl=s.Settings.FlowControl;
Settings.Parity=s.Settings.Parity;
Settings.DataBits=s.Settings.DataBits;
Settings.StopBits=s.Settings.StopBits;
Settings.BaudRate=s.Settings.BaudRate;
Win_Handle=s.Win_Handle;
memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG));
memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS));
}
/*!
\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name)
Constructs a serial port attached to the port specified by devName.
devName is the name of the device, which is windowsystem-specific,
e.g."COM2" or "/dev/ttyS0".
*/
Win_QextSerialPort::Win_QextSerialPort(const QString & name):QextSerialBase(name) {
Win_Handle=INVALID_HANDLE_VALUE;
}
/*!
\fn Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings)
Constructs a port with default name and specified settings.
*/
Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) {
Win_Handle=INVALID_HANDLE_VALUE;
setBaudRate(settings.BaudRate);
setDataBits(settings.DataBits);
setStopBits(settings.StopBits);
setParity(settings.Parity);
setFlowControl(settings.FlowControl);
setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec);
}
/*!
\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings)
Constructs a port with specified name and settings.
*/
Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) {
Win_Handle=INVALID_HANDLE_VALUE;
setPortName(name);
setBaudRate(settings.BaudRate);
setDataBits(settings.DataBits);
setStopBits(settings.StopBits);
setParity(settings.Parity);
setFlowControl(settings.FlowControl);
setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec);
}
/*!
\fn Win_QextSerialPort::~Win_QextSerialPort()
Standard destructor.
*/
Win_QextSerialPort::~Win_QextSerialPort() {
if (isOpen()) {
close();
}
}
/*!
\fn Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s)
overrides the = operator
*/
Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) {
setOpenMode(s.openMode());
lastErr=s.lastErr;
port = s.port;
Settings.FlowControl=s.Settings.FlowControl;
Settings.Parity=s.Settings.Parity;
Settings.DataBits=s.Settings.DataBits;
Settings.StopBits=s.Settings.StopBits;
Settings.BaudRate=s.Settings.BaudRate;
Win_Handle=s.Win_Handle;
memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG));
memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS));
return *this;
}
/*!
\fn bool Win_QextSerialPort::open(OpenMode mode)
Opens a serial port. Note that this function does not specify which device to open. If you need
to open a device by name, see Win_QextSerialPort::open(const char*). This function has no effect
if the port associated with the class is already open. The port is also configured to the current
settings, as stored in the Settings structure.
*/
bool Win_QextSerialPort::open(OpenMode mode) {
unsigned long confSize = sizeof(COMMCONFIG);
Win_CommConfig.dwSize = confSize;
LOCK_MUTEX();
if (mode == QIODevice::NotOpen)
return isOpen();
if (!isOpen()) {
/*open the port*/
Win_Handle=CreateFileA(port.toLatin1(), GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (Win_Handle!=INVALID_HANDLE_VALUE) {
/*set open mode*/
QIODevice::open(mode);
/*configure port settings*/
GetCommConfig(Win_Handle, &Win_CommConfig, &confSize);
GetCommState(Win_Handle, &(Win_CommConfig.dcb));
/*set up parameters*/
Win_CommConfig.dcb.fBinary=TRUE;
Win_CommConfig.dcb.fInX=FALSE;
Win_CommConfig.dcb.fOutX=FALSE;
Win_CommConfig.dcb.fAbortOnError=FALSE;
Win_CommConfig.dcb.fNull=FALSE;
setBaudRate(Settings.BaudRate);
setDataBits(Settings.DataBits);
setStopBits(Settings.StopBits);
setParity(Settings.Parity);
setFlowControl(Settings.FlowControl);
setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec);
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
}
UNLOCK_MUTEX();
return isOpen();
}
/*!
\fn void Win_QextSerialPort::close()
Closes a serial port. This function has no effect if the serial port associated with the class
is not currently open.
*/
void Win_QextSerialPort::close() {
LOCK_MUTEX();
CloseHandle(Win_Handle);
QIODevice::close();
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::flush()
Flushes all pending I/O to the serial port. This function has no effect if the serial port
associated with the class is not currently open.
*/
void Win_QextSerialPort::flush() {
LOCK_MUTEX();
if (isOpen()) {
FlushFileBuffers(Win_Handle);
}
UNLOCK_MUTEX();
}
/*!
\fn qint64 Win_QextSerialPort::size() const
This function will return the number of bytes waiting in the receive queue of the serial port.
It is included primarily to provide a complete QIODevice interface, and will not record errors
in the lastErr member (because it is const). This function is also not thread-safe - in
multithreading situations, use Win_QextSerialPort::bytesAvailable() instead.
*/
qint64 Win_QextSerialPort::size() const {
int availBytes;
COMSTAT Win_ComStat;
DWORD Win_ErrorMask=0;
ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat);
availBytes = Win_ComStat.cbInQue;
return (qint64)availBytes;
}
/*!
\fn qint64 Win_QextSerialPort::bytesAvailable()
Returns the number of bytes waiting in the port's receive queue. This function will return 0 if
the port is not currently open, or -1 on error. Error information can be retrieved by calling
Win_QextSerialPort::getLastError().
*/
qint64 Win_QextSerialPort::bytesAvailable() {
LOCK_MUTEX();
if (isOpen()) {
DWORD Errors;
COMSTAT Status;
bool success=ClearCommError(Win_Handle, &Errors, &Status);
translateError(Errors);
if (success) {
lastErr=E_NO_ERROR;
UNLOCK_MUTEX();
return Status.cbInQue + QIODevice::bytesAvailable();
}
UNLOCK_MUTEX();
return (unsigned int)-1;
}
UNLOCK_MUTEX();
return 0;
}
/*!
\fn void Win_QextSerialPort::translateError(ulong error)
Translates a system-specific error code to a QextSerialPort error code. Used internally.
*/
void Win_QextSerialPort::translateError(ulong error) {
if (error&CE_BREAK) {
lastErr=E_BREAK_CONDITION;
}
else if (error&CE_FRAME) {
lastErr=E_FRAMING_ERROR;
}
else if (error&CE_IOE) {
lastErr=E_IO_ERROR;
}
else if (error&CE_MODE) {
lastErr=E_INVALID_FD;
}
else if (error&CE_OVERRUN) {
lastErr=E_BUFFER_OVERRUN;
}
else if (error&CE_RXPARITY) {
lastErr=E_RECEIVE_PARITY_ERROR;
}
else if (error&CE_RXOVER) {
lastErr=E_RECEIVE_OVERFLOW;
}
else if (error&CE_TXFULL) {
lastErr=E_TRANSMIT_OVERFLOW;
}
}
/*!
\fn qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize)
Reads a block of data from the serial port. This function will read at most maxlen bytes from
the serial port and place them in the buffer pointed to by data. Return value is the number of
bytes actually read, or -1 on error.
\warning before calling this function ensure that serial port associated with this class
is currently open (use isOpen() function to check if port is open).
*/
qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize)
{
LOCK_MUTEX();
int retVal=0;
COMSTAT Win_ComStat;
DWORD Win_BytesRead=0;
DWORD Win_ErrorMask=0;
ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat);
if (Win_ComStat.cbInQue &&
(!ReadFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesRead, NULL)
|| Win_BytesRead==0)) {
lastErr=E_READ_FAILED;
retVal=-1;
}
else {
retVal=((int)Win_BytesRead);
}
UNLOCK_MUTEX();
return retVal;
}
/*!
\fn qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize)
Writes a block of data to the serial port. This function will write len bytes
from the buffer pointed to by data to the serial port. Return value is the number
of bytes actually written, or -1 on error.
\warning before calling this function ensure that serial port associated with this class
is currently open (use isOpen() function to check if port is open).
*/
qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize)
{
LOCK_MUTEX();
int retVal=0;
DWORD Win_BytesWritten;
if (!WriteFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesWritten, NULL)) {
lastErr=E_WRITE_FAILED;
retVal=-1;
}
else {
retVal=((int)Win_BytesWritten);
}
UNLOCK_MUTEX();
flush();
return retVal;
}
/*!
\fn void Win_QextSerialPort::ungetChar(char c)
This function is included to implement the full QIODevice interface, and currently has no
purpose within this class. This function is meaningless on an unbuffered device and currently
only prints a warning message to that effect.
*/
void Win_QextSerialPort::ungetChar(char c) {
if (c == c)
{
}
/*meaningless on unbuffered sequential device - return error and print a warning*/
TTY_WARNING("Win_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless");
}
/*!
\fn void Win_QextSerialPort::setFlowControl(FlowType flow)
Sets the flow control used by the port. Possible values of flow are:
\verbatim
FLOW_OFF No flow control
FLOW_HARDWARE Hardware (RTS/CTS) flow control
FLOW_XONXOFF Software (XON/XOFF) flow control
\endverbatim
*/
void Win_QextSerialPort::setFlowControl(FlowType flow) {
LOCK_MUTEX();
if (Settings.FlowControl!=flow) {
Settings.FlowControl=flow;
}
if (isOpen()) {
switch(flow) {
/*no flow control*/
case FLOW_OFF:
Win_CommConfig.dcb.fOutxCtsFlow=FALSE;
Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE;
Win_CommConfig.dcb.fInX=FALSE;
Win_CommConfig.dcb.fOutX=FALSE;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
break;
/*software (XON/XOFF) flow control*/
case FLOW_XONXOFF:
Win_CommConfig.dcb.fOutxCtsFlow=FALSE;
Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE;
Win_CommConfig.dcb.fInX=TRUE;
Win_CommConfig.dcb.fOutX=TRUE;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
break;
case FLOW_HARDWARE:
Win_CommConfig.dcb.fOutxCtsFlow=TRUE;
Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_HANDSHAKE;
Win_CommConfig.dcb.fInX=FALSE;
Win_CommConfig.dcb.fOutX=FALSE;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
break;
}
}
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::setParity(ParityType parity)
Sets the parity associated with the serial port. The possible values of parity are:
\verbatim
PAR_SPACE Space Parity
PAR_MARK Mark Parity
PAR_NONE No Parity
PAR_EVEN Even Parity
PAR_ODD Odd Parity
\endverbatim
*/
void Win_QextSerialPort::setParity(ParityType parity) {
LOCK_MUTEX();
if (Settings.Parity!=parity) {
Settings.Parity=parity;
}
if (isOpen()) {
Win_CommConfig.dcb.Parity=(unsigned char)parity;
switch (parity) {
/*space parity*/
case PAR_SPACE:
if (Settings.DataBits==DATA_8) {
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Space parity with 8 data bits is not supported by POSIX systems.");
}
Win_CommConfig.dcb.fParity=TRUE;
break;
/*mark parity - WINDOWS ONLY*/
case PAR_MARK:
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Mark parity is not supported by POSIX systems");
Win_CommConfig.dcb.fParity=TRUE;
break;
/*no parity*/
case PAR_NONE:
Win_CommConfig.dcb.fParity=FALSE;
break;
/*even parity*/
case PAR_EVEN:
Win_CommConfig.dcb.fParity=TRUE;
break;
/*odd parity*/
case PAR_ODD:
Win_CommConfig.dcb.fParity=TRUE;
break;
}
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::setDataBits(DataBitsType dataBits)
Sets the number of data bits used by the serial port. Possible values of dataBits are:
\verbatim
DATA_5 5 data bits
DATA_6 6 data bits
DATA_7 7 data bits
DATA_8 8 data bits
\endverbatim
\note
This function is subject to the following restrictions:
\par
5 data bits cannot be used with 2 stop bits.
\par
1.5 stop bits can only be used with 5 data bits.
\par
8 data bits cannot be used with space parity on POSIX systems.
*/
void Win_QextSerialPort::setDataBits(DataBitsType dataBits) {
LOCK_MUTEX();
if (Settings.DataBits!=dataBits) {
if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) ||
(Settings.StopBits==STOP_1_5 && dataBits!=DATA_5)) {
}
else {
Settings.DataBits=dataBits;
}
}
if (isOpen()) {
switch(dataBits) {
/*5 data bits*/
case DATA_5:
if (Settings.StopBits==STOP_2) {
TTY_WARNING("Win_QextSerialPort: 5 Data bits cannot be used with 2 stop bits.");
}
else {
Win_CommConfig.dcb.ByteSize=5;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
break;
/*6 data bits*/
case DATA_6:
if (Settings.StopBits==STOP_1_5) {
TTY_WARNING("Win_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits.");
}
else {
Win_CommConfig.dcb.ByteSize=6;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
break;
/*7 data bits*/
case DATA_7:
if (Settings.StopBits==STOP_1_5) {
TTY_WARNING("Win_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits.");
}
else {
Win_CommConfig.dcb.ByteSize=7;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
break;
/*8 data bits*/
case DATA_8:
if (Settings.StopBits==STOP_1_5) {
TTY_WARNING("Win_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits.");
}
else {
Win_CommConfig.dcb.ByteSize=8;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
break;
}
}
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::setStopBits(StopBitsType stopBits)
Sets the number of stop bits used by the serial port. Possible values of stopBits are:
\verbatim
STOP_1 1 stop bit
STOP_1_5 1.5 stop bits
STOP_2 2 stop bits
\endverbatim
\note
This function is subject to the following restrictions:
\par
2 stop bits cannot be used with 5 data bits.
\par
1.5 stop bits cannot be used with 6 or more data bits.
\par
POSIX does not support 1.5 stop bits.
*/
void Win_QextSerialPort::setStopBits(StopBitsType stopBits) {
LOCK_MUTEX();
if (Settings.StopBits!=stopBits) {
if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) ||
(stopBits==STOP_1_5 && Settings.DataBits!=DATA_5)) {
}
else {
Settings.StopBits=stopBits;
}
}
if (isOpen()) {
switch (stopBits) {
/*one stop bit*/
case STOP_1:
Win_CommConfig.dcb.StopBits=ONESTOPBIT;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
break;
/*1.5 stop bits*/
case STOP_1_5:
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: 1.5 stop bit operation is not supported by POSIX.");
if (Settings.DataBits!=DATA_5) {
TTY_WARNING("Win_QextSerialPort: 1.5 stop bits can only be used with 5 data bits");
}
else {
Win_CommConfig.dcb.StopBits=ONE5STOPBITS;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
break;
/*two stop bits*/
case STOP_2:
if (Settings.DataBits==DATA_5) {
TTY_WARNING("Win_QextSerialPort: 2 stop bits cannot be used with 5 data bits");
}
else {
Win_CommConfig.dcb.StopBits=TWOSTOPBITS;
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
break;
}
}
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::setBaudRate(BaudRateType baudRate)
Sets the baud rate of the serial port. Note that not all rates are applicable on
all platforms. The following table shows translations of the various baud rate
constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an *
are speeds that are usable on both Windows and POSIX.
\verbatim
RATE Windows Speed POSIX Speed
----------- ------------- -----------
BAUD50 110 50
BAUD75 110 75
*BAUD110 110 110
BAUD134 110 134.5
BAUD150 110 150
BAUD200 110 200
*BAUD300 300 300
*BAUD600 600 600
*BAUD1200 1200 1200
BAUD1800 1200 1800
*BAUD2400 2400 2400
*BAUD4800 4800 4800
*BAUD9600 9600 9600
BAUD14400 14400 9600
*BAUD19200 19200 19200
*BAUD38400 38400 38400
BAUD56000 56000 38400
*BAUD57600 57600 57600
BAUD76800 57600 76800
*BAUD115200 115200 115200
BAUD128000 128000 115200
BAUD256000 256000 115200
\endverbatim
*/
void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) {
LOCK_MUTEX();
if (Settings.BaudRate!=baudRate) {
switch (baudRate) {
case BAUD50:
case BAUD75:
case BAUD134:
case BAUD150:
case BAUD200:
Settings.BaudRate=BAUD110;
break;
case BAUD1800:
Settings.BaudRate=BAUD1200;
break;
case BAUD76800:
Settings.BaudRate=BAUD57600;
break;
default:
Settings.BaudRate=baudRate;
break;
}
}
if (isOpen()) {
switch (baudRate) {
/*50 baud*/
case BAUD50:
TTY_WARNING("Win_QextSerialPort: Windows does not support 50 baud operation. Switching to 110 baud.");
Win_CommConfig.dcb.BaudRate=CBR_110;
break;
/*75 baud*/
case BAUD75:
TTY_WARNING("Win_QextSerialPort: Windows does not support 75 baud operation. Switching to 110 baud.");
Win_CommConfig.dcb.BaudRate=CBR_110;
break;
/*110 baud*/
case BAUD110:
Win_CommConfig.dcb.BaudRate=CBR_110;
break;
/*134.5 baud*/
case BAUD134:
TTY_WARNING("Win_QextSerialPort: Windows does not support 134.5 baud operation. Switching to 110 baud.");
Win_CommConfig.dcb.BaudRate=CBR_110;
break;
/*150 baud*/
case BAUD150:
TTY_WARNING("Win_QextSerialPort: Windows does not support 150 baud operation. Switching to 110 baud.");
Win_CommConfig.dcb.BaudRate=CBR_110;
break;
/*200 baud*/
case BAUD200:
TTY_WARNING("Win_QextSerialPort: Windows does not support 200 baud operation. Switching to 110 baud.");
Win_CommConfig.dcb.BaudRate=CBR_110;
break;
/*300 baud*/
case BAUD300:
Win_CommConfig.dcb.BaudRate=CBR_300;
break;
/*600 baud*/
case BAUD600:
Win_CommConfig.dcb.BaudRate=CBR_600;
break;
/*1200 baud*/
case BAUD1200:
Win_CommConfig.dcb.BaudRate=CBR_1200;
break;
/*1800 baud*/
case BAUD1800:
TTY_WARNING("Win_QextSerialPort: Windows does not support 1800 baud operation. Switching to 1200 baud.");
Win_CommConfig.dcb.BaudRate=CBR_1200;
break;
/*2400 baud*/
case BAUD2400:
Win_CommConfig.dcb.BaudRate=CBR_2400;
break;
/*4800 baud*/
case BAUD4800:
Win_CommConfig.dcb.BaudRate=CBR_4800;
break;
/*9600 baud*/
case BAUD9600:
Win_CommConfig.dcb.BaudRate=CBR_9600;
break;
/*14400 baud*/
case BAUD14400:
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 14400 baud operation.");
Win_CommConfig.dcb.BaudRate=CBR_14400;
break;
/*19200 baud*/
case BAUD19200:
Win_CommConfig.dcb.BaudRate=CBR_19200;
break;
/*38400 baud*/
case BAUD38400:
Win_CommConfig.dcb.BaudRate=CBR_38400;
break;
/*56000 baud*/
case BAUD56000:
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 56000 baud operation.");
Win_CommConfig.dcb.BaudRate=CBR_56000;
break;
/*57600 baud*/
case BAUD57600:
Win_CommConfig.dcb.BaudRate=CBR_57600;
break;
/*76800 baud*/
case BAUD76800:
TTY_WARNING("Win_QextSerialPort: Windows does not support 76800 baud operation. Switching to 57600 baud.");
Win_CommConfig.dcb.BaudRate=CBR_57600;
break;
/*115200 baud*/
case BAUD115200:
Win_CommConfig.dcb.BaudRate=CBR_115200;
break;
/*128000 baud*/
case BAUD128000:
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 128000 baud operation.");
Win_CommConfig.dcb.BaudRate=CBR_128000;
break;
/*256000 baud*/
case BAUD256000:
TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 256000 baud operation.");
Win_CommConfig.dcb.BaudRate=CBR_256000;
break;
}
SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG));
}
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::setDtr(bool set)
Sets DTR line to the requested state (high by default). This function will have no effect if
the port associated with the class is not currently open.
*/
void Win_QextSerialPort::setDtr(bool set) {
LOCK_MUTEX();
if (isOpen()) {
if (set) {
EscapeCommFunction(Win_Handle, SETDTR);
}
else {
EscapeCommFunction(Win_Handle, CLRDTR);
}
}
UNLOCK_MUTEX();
}
/*!
\fn void Win_QextSerialPort::setRts(bool set)
Sets RTS line to the requested state (high by default). This function will have no effect if
the port associated with the class is not currently open.
*/
void Win_QextSerialPort::setRts(bool set) {
LOCK_MUTEX();
if (isOpen()) {
if (set) {
EscapeCommFunction(Win_Handle, SETRTS);
}
else {
EscapeCommFunction(Win_Handle, CLRRTS);
}
}
UNLOCK_MUTEX();
}
/*!
\fn ulong Win_QextSerialPort::lineStatus(void)
returns the line status as stored by the port function. This function will retrieve the states
of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines
can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned
long with specific bits indicating which lines are high. The following constants should be used
to examine the states of individual lines:
\verbatim
Mask Line
------ ----
LS_CTS CTS
LS_DSR DSR
LS_DCD DCD
LS_RI RI
\endverbatim
This function will return 0 if the port associated with the class is not currently open.
*/
ulong Win_QextSerialPort::lineStatus(void) {
unsigned long Status=0, Temp=0;
LOCK_MUTEX();
if (isOpen()) {
GetCommModemStatus(Win_Handle, &Temp);
if (Temp&MS_CTS_ON) {
Status|=LS_CTS;
}
if (Temp&MS_DSR_ON) {
Status|=LS_DSR;
}
if (Temp&MS_RING_ON) {
Status|=LS_RI;
}
if (Temp&MS_RLSD_ON) {
Status|=LS_DCD;
}
}
UNLOCK_MUTEX();
return Status;
}
/*!
\fn void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec);
Sets the read and write timeouts for the port to sec seconds and millisec milliseconds.
*/
void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec) {
LOCK_MUTEX();
Settings.Timeout_Sec=sec;
Settings.Timeout_Millisec=millisec;
if(isOpen()) {
Win_CommTimeouts.ReadIntervalTimeout = sec*1000+millisec;
Win_CommTimeouts.ReadTotalTimeoutMultiplier = sec*1000+millisec;
Win_CommTimeouts.ReadTotalTimeoutConstant = 0;
Win_CommTimeouts.WriteTotalTimeoutMultiplier = sec*1000+millisec;
Win_CommTimeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(Win_Handle, &Win_CommTimeouts);
}
UNLOCK_MUTEX();
}

View File

@ -0,0 +1,48 @@
#ifndef _WIN_QEXTSERIALPORT_H_
#define _WIN_QEXTSERIALPORT_H_
#include "qextserialbase.h"
/*if all warning messages are turned off, flag portability warnings to be turned off as well*/
#ifdef _TTY_NOWARN_
#define _TTY_NOWARN_PORT_
#endif
#include <windows.h>
class Win_QextSerialPort:public QextSerialBase {
public:
Win_QextSerialPort();
Win_QextSerialPort(Win_QextSerialPort const& s);
Win_QextSerialPort(const QString & name);
Win_QextSerialPort(const PortSettings& settings);
Win_QextSerialPort(const QString & name, const PortSettings& settings);
Win_QextSerialPort& operator=(const Win_QextSerialPort& s);
virtual ~Win_QextSerialPort();
virtual bool open(OpenMode mode=0);
virtual void close();
virtual void flush();
virtual qint64 size() const;
virtual void ungetChar(char c);
virtual void setFlowControl(FlowType);
virtual void setParity(ParityType);
virtual void setDataBits(DataBitsType);
virtual void setStopBits(StopBitsType);
virtual void setBaudRate(BaudRateType);
virtual void setDtr(bool set=true);
virtual void setRts(bool set=true);
virtual ulong lineStatus(void);
virtual qint64 bytesAvailable();
virtual void translateError(ulong);
virtual void setTimeout(ulong, ulong);
protected:
HANDLE Win_Handle;
COMMCONFIG Win_CommConfig;
COMMTIMEOUTS Win_CommTimeouts;
virtual qint64 readData(char *data, qint64 maxSize);
virtual qint64 writeData(const char *data, qint64 maxSize);
};
#endif

501
machine/tcpclient.cpp Normal file
View File

@ -0,0 +1,501 @@
#include "tcpclient.h"
#include <QSettings>
#include <QApplication>
#include <QAbstractSocket>
TcpClient::TcpClient(QObject *parent) :
QObject(parent),
m_pClientSocket(NULL),
m_pConnectCheckTimer(NULL),
m_connected(0),
m_pConnectDetectThread(NULL),
m_pConnectDetect(NULL),
m_detect(0),
m_localip(DEF_LOCAL_IP),
m_localport(DEF_LOCAL_PORT),
m_serverip(DEF_SERVER_IP),
m_serverport(DEF_SERVER_PORT)
{
m_pClientSocket = new QBindTcpSocket(this);
m_pClientSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
connect(m_pClientSocket, SIGNAL(readyRead()), this, SLOT(receiveServerData()));
connect(m_pClientSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displaySocketError(QAbstractSocket::SocketError)));
// connect(m_pClientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(netStateChanged(QAbstractSocket::SocketState)));
m_pConnectCheckTimer = new QTimer(this);
connect(m_pConnectCheckTimer, SIGNAL(timeout()), this, SLOT(connectCheck()));
m_pConnectDetectThread = new QThread();
}
TcpClient::~TcpClient()
{
m_pConnectCheckTimer->stop();
delete m_pConnectCheckTimer;
m_pClientSocket->disconnectFromHost();
m_pClientSocket->waitForDisconnected();
m_pClientSocket->close();
delete m_pClientSocket;
if (m_connected != 0)
{
m_pConnectDetectThread->quit();
m_pConnectDetectThread->wait();
}
delete m_pConnectDetectThread;
}
void TcpClient::setConfigFileName(QString configfilename)
{
m_configFileName = configfilename;
}
void TcpClient::connectToServer()
{
if (m_pClientSocket == NULL)
{
qDebug() << "m_pClientSocket not alloc";
return;
}
if (m_connected == 0)
{
loadIpAndPort();
if (m_pConnectDetect == NULL)
{
m_pConnectDetect = new TcpConnectDetect;
}
qDebug() << "ConnectToServer";
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
m_pConnectDetect->setIpAndPort(m_localip, m_localport, m_serverip, m_serverport);
m_pConnectDetect->moveToThread(m_pConnectDetectThread);
connect(this, SIGNAL(siDetectHost()), m_pConnectDetect, SLOT(connectDetect()), Qt::QueuedConnection);
connect(m_pConnectDetect, SIGNAL(siConnectSta(int)), this, SLOT(detectStatus(int)), Qt::QueuedConnection);
// 20191226由于检测线程会造成网络重连所以将检测线程注释 lft
/*
connect(m_pConnectDetectThread, SIGNAL(started()), m_pConnectDetect, SLOT(detectStart()) );
connect(m_pConnectDetectThread, SIGNAL(finished()), m_pConnectDetect, SLOT(deleteLater()) ); // 退出删除对象
m_pConnectDetectThread->start(); // 启动线程
*/
m_pConnectCheckTimer->start(1000);
m_connected = 1;
m_detect = 1;
}
}
void TcpClient::disConnectFromServer()
{
if (m_connected != 0)
{
m_pConnectCheckTimer->stop();
if (m_pClientSocket != NULL)
{
m_pClientSocket->disconnectFromHost();
m_pClientSocket->waitForDisconnected();
m_pClientSocket->close();
}
m_pConnectDetectThread->quit();
m_pConnectDetectThread->wait();
m_connected = 0;
m_detect = 0;
}
}
void TcpClient::loadIpAndPort()
{
if (!m_configFileName.isEmpty())
{
// 机器的IP和端口 和 连接机器的本地IP和端口
QSettings configIni(m_configFileName, QSettings::IniFormat);
QString serverip, localip;
quint16 serverport, localport;
serverip = configIni.value("server/ip", QVariant("192.168.16.253")).toString();
serverport = configIni.value("server/port", QVariant(5000)).toInt();
localip = configIni.value("local/ip", QVariant("192.168.16.41")).toString();
localport = configIni.value("local/port", 5001).toInt();
// 回写参数
configIni.setValue("server/ip", serverip);
configIni.setValue("server/port", serverport);
configIni.setValue("local/ip", localip);
configIni.setValue("local/port", localport);
m_localip = localip;
m_localport = localport;
m_serverip = serverip;
m_serverport = serverport;
}
}
// 发送数据的槽
void TcpClient::slotSendData(QByteArray dat)
{
if (m_pClientSocket != NULL)
{
m_pClientSocket->write(dat);
}
}
// 自动检测连接
void TcpClient::connectCheck()
{
if (m_pClientSocket == NULL)
{
qDebug() << "Socket is not alloced";
return;
}
// qDebug() << "check client connect";
if (m_connected == 1)
{
if (m_localip.isEmpty() == false)
{
m_pClientSocket->bindAddrAndPort(m_localip, m_localport);
}
m_pClientSocket->abort();
m_pClientSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
m_pClientSocket->connectToHost(m_serverip, m_serverport);
int rslt = m_pClientSocket->waitForConnected(2000);
if (rslt == 0)
{
}
/*
qDebug("bind connect and waitForConnected 2000, rslt=%d", rslt);
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
*/
m_connected = 2;
}
else if (m_connected != 0)
{
switch(m_pClientSocket->state())
{
case QAbstractSocket::ConnectedState:
{
if (m_connected != 3)
{
/*
qDebug() << "net State is Connected";
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
*/
m_connected = 3; // 检测连接状态
}
break;
}
case QAbstractSocket::ConnectingState:
{
if (m_connected != 2)
{
qDebug() << "net State is Connecting";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
}
m_connected = 2;
break;
}
case QAbstractSocket::UnconnectedState:
{
if (m_connected != 1)
{
// qDebug() << "net State is unconnected";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
}
m_connected = 1;
break;
}
default:
{
/*
QAbstractSocket::HostLookupState
QAbstractSocket::BoundState
QAbstractSocket::ListeningState
QAbstractSocket::ClosingState
*/
{
qDebug("net State is %d\r\n", m_pClientSocket->state());
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
}
m_connected = 1;
}
}
}
else
{
}
if (m_connected == 3) // 已连接
{
if (m_detect == 1)
{
// qDebug() << "Machine " << QThread::currentThread();
m_detect = 0;
emit(siDetectHost());
// qDebug() << "after send SiDetectHost ";
}
}
emit (siConnectSta(m_connected)); // 网络连接信号
}
void TcpClient::detectStatus(int sta)
{
// qDebug("host detect sta=%d", sta);
m_detect = 1;
if (sta == 1) // 网络已断开
{
qDebug("disconnect ClientSocket by detect");
m_pClientSocket->disconnectFromHost();
// m_pClientSocket->waitForDisconnected();
m_pClientSocket->close();
m_connected = 1;
}
else if (sta == 2) // 网络连接还在
{
}
else
{
}
}
void TcpClient::receiveServerData()
{
if (m_pClientSocket != NULL)
{
QByteArray tmpDat;
tmpDat = m_pClientSocket->readAll(); // 读取
// qDebug("ReceiveServerData, size = %d", tmpDat.size());
// PrintAsHex(&tmpDat);
emit(siReceiveData(tmpDat)); // 发送收到数据信号
}
}
void TcpClient::displaySocketError(QAbstractSocket::SocketError err)
{
QString errinfo;
errinfo.sprintf("Err: code=%d, errorString=", err);
errinfo += m_pClientSocket->errorString();
// qDebug() << errinfo;
emit(siConnectErr(errinfo)); // 网络错误信息
}
void TcpClient::netStateChanged(QAbstractSocket::SocketState sta)
{
switch (sta)
{
/*
case UnconnectedState:
case HostLookupState:
case ConnectingState:
case ConnectedState:
case BoundState:
case ListeningState:
case ClosingStat:
*/
default:
break;
}
}
void TcpClient::hostFound()
{
qDebug("found host");
}
#if(0)
//-------------------------------------------------------
TcpConnectDetect::TcpConnectDetect(QObject *parent) :
QObject(parent),
m_pDetectSocket(NULL),
m_localip(DEF_LOCAL_IP),
m_localport(DEF_LOCAL_PORT),
m_serverip(DEF_SERVER_IP),
m_serverport(DEF_SERVER_PORT)
{
}
TcpConnectDetect::~TcpConnectDetect()
{
if (m_pDetectSocket == NULL)
{
m_pDetectSocket->disconnectFromHost();
m_pDetectSocket->waitForDisconnected();
m_pDetectSocket->close();
delete m_pDetectSocket;
}
}
void TcpConnectDetect::detectStart()
{
qDebug("TcpConnectDetect start");
if (m_pDetectSocket == NULL)
{
m_pDetectSocket = new QBindTcpSocket;
}
}
int TcpConnectDetect::connectDetect()
{
int connectsta = 0;
int rslt;
// qDebug() << "TcpConnectDetect " << QThread::currentThread();
if (m_pDetectSocket == NULL)
{
return 0;
}
if (m_localip.isEmpty() == false)
{
m_pDetectSocket->bindAddrAndPort(m_localip, m_localport);
}
m_pDetectSocket->abort();
m_pDetectSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
m_pDetectSocket->connectToHost(m_serverip, m_serverport);
do
{
rslt = m_pDetectSocket->waitForConnected(4000); // 等待连接
qDebug("bind Detect connect rslt=%d", rslt);
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
switch(m_pDetectSocket->state())
{
case QAbstractSocket::ConnectedState:
{
// 如果连接上,说明 m_pClientSocket 连接已经无效, 需要断开重新连接
// 先断开测试连接
m_pDetectSocket->disconnectFromHost();
m_pDetectSocket->waitForDisconnected();
connectsta = 1;
// 发送断开主连接的信号
qDebug() << "detect is Connected, disconnect all";
break;
}
case QAbstractSocket::UnconnectedState:
{
// qDebug() << "detect is Unconnected err=" << m_pDetectSocket->error() << ", info:" << m_pDetectSocket->errorString();
switch (m_pDetectSocket->error())
{
case QAbstractSocket::SocketTimeoutError: // 连接超时,说明已经断开
case QAbstractSocket::NetworkError: // 网络错误, 主机不可连接, 可能已经断开
{
qDebug() << "detect is timout, disconnect all";
connectsta = 1;
// 发送断开主连接的信号
break;
}
case QAbstractSocket::ConnectionRefusedError: // 拒绝连接, 说明连接还在
{
connectsta = 2;
// qDebug() << "Connection Refused, old connect is alive";
break;
}
/*
case QAbstractSocket::RemoteHostClosedError:
case QAbstractSocket::HostNotFoundError:
case QAbstractSocket::SocketAccessError:
case QAbstractSocket::SocketResourceError:
case QAbstractSocket::SocketTimeoutError:
case QAbstractSocket::DatagramTooLargeError:
case QAbstractSocket::AddressInUseError:
case QAbstractSocket::SocketAddressNotAvailableError:
case QAbstractSocket::UnsupportedSocketOperationError:
case QAbstractSocket::UnfinishedSocketOperationError:
case QAbstractSocket::ProxyAuthenticationRequiredError:
case QAbstractSocket::SslHandshakeFailedError:
case QAbstractSocket::ProxyConnectionRefusedError:
case QAbstractSocket::ProxyConnectionClosedError:
case QAbstractSocket::ProxyConnectionTimeoutError:
case QAbstractSocket::ProxyNotFoundError:
case QAbstractSocket::ProxyProtocolError:
case QAbstractSocket::UnknownSocketError:
*/
default:
{
// 继续检测
connectsta = 2;
qDebug() << " retry";
break;
}
} // 错误处理结束
}
case QAbstractSocket::ConnectingState:
{
// qDebug() << "detect is Connecting";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
// 继续等待
break;
}
case QAbstractSocket::HostLookupState:
case QAbstractSocket::BoundState:
case QAbstractSocket::ListeningState:
case QAbstractSocket::ClosingState:
default:
{
// 继续等待
qDebug("detect sta is %d\r\n", m_pDetectSocket->state());
break;
}
}
if (connectsta != 0)
{
break;
}
}while(1);
m_pDetectSocket->close();
// 发送本次测试连接的状态信号
emit(siConnectSta(connectsta));
return connectsta;
}
void TcpConnectDetect::setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport)
{
m_localip = localip;
m_localport = localport;
m_serverip = serverip;
m_serverport = serverport;
}
#endif

102
machine/tcpclient.h Normal file
View File

@ -0,0 +1,102 @@
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QObject>
#include <QTimer>
#include <QHostAddress>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QTcpServer>
#include <QThread>
#include "qbindtcpsocket.h"
class ConnectDetectThread;
class TcpClient : public QObject
{
Q_OBJECT
public:
explicit TcpClient(QObject *parent = NULL);
virtual ~TcpClient();
public:
void setConfigFileName(QString configfilename);
signals:
void siConnectSta(int sta); // 网络连接信号
void siConnectErr(QString errinfo); // 网络错误信息
void siReceiveData(QByteArray dat); // 收到数据包信号
signals:
void siDetectHost(void);
public:
public slots:
void slotSendData(QByteArray dat); // 发送数据的槽
void connectToServer();//连接到服务器
void disConnectFromServer();
void detectStatus(int);
public:
private slots:
void connectCheck();
void receiveServerData();
void displaySocketError(QAbstractSocket::SocketError err);
void netStateChanged(QAbstractSocket::SocketState sta);
void hostFound();
private:
void loadIpAndPort();
private:
QBindTcpSocket * m_pClientSocket;//客户端
QTimer * m_pConnectCheckTimer;
public:
int m_connected; // 连接状态; 0, 初始化; 1, 未连接; 2, 连接中; 3, 已连接
private:
QThread * m_pConnectDetectThread;
TcpConnectDetect * m_pConnectDetect;
int m_detect; // 连接测试状态
private:
QString m_configFileName;
private:
QString m_localip;
quint16 m_localport;
QString m_serverip;
quint16 m_serverport;
};
#if(0)
class TcpConnectDetect : public QObject
{
Q_OBJECT
public:
explicit TcpConnectDetect(QObject *parent = NULL);
virtual ~TcpConnectDetect();
signals:
void siConnectSta(int sta); // 网络连接信号
public:
public slots:
void detectStart();
int connectDetect();
private:
QBindTcpSocket * m_pDetectSocket;
public:
void setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport);
private:
QString m_localip;
quint16 m_localport;
QString m_serverip;
quint16 m_serverport;
};
#endif
#endif // TCPCLIENT_H

630
main.cpp Normal file
View File

@ -0,0 +1,630 @@
#include <QApplication>
#include <QFontDatabase>
#include <QTranslator>
#include <QTextCodec>
#include <QSplashScreen>
#include <QResource>
#include <QDir>
#include <QSharedMemory>
#define _IN_MAIN_CPP
#include "main.h"
#include "mctype/patternsingleboard/mainUI/mainwidget.h"
QString switchLanguage(int language,QDir appPath)
{
QString sourcePath,targetPath;
targetPath = appPath.path() + appPath.separator() + "language.qm";
switch (language)
{
case chinese://中文
sourcePath = appPath.path() + appPath.separator() + "chinese.qm";
break;
case english://英文
sourcePath = appPath.path() + appPath.separator() + "english.qm";
break;
case spanish://西班牙文
sourcePath = appPath.path() + appPath.separator() + "spanish.qm";
break;
case bengal://孟加拉文
sourcePath = appPath.path() + appPath.separator() + "bengal.qm";
break;
// case 4://土耳其文
// sourcePath = appPath.path() + appPath.separator() + "turkey.qm";
// break;
case portugal://葡萄牙语
sourcePath = appPath.path() + appPath.separator() + "portugal.qm";
break;
case french://法语
sourcePath = appPath.path() + appPath.separator() + "french.qm";
break;
case arabic://阿拉伯语
sourcePath = appPath.path() + appPath.separator() + "arabic.qm";
break;
case ukrainian://乌克兰语
sourcePath = appPath.path() + appPath.separator() + "ukrainian.qm";
break;
case korean://韩语
sourcePath = appPath.path() + appPath.separator() + "korean.qm";
break;
case russian://俄语
sourcePath = appPath.path() + appPath.separator() + "russian.qm";
break;
case uzbek://乌兹别克语
sourcePath = appPath.path() + appPath.separator() + "uzbek.qm";
break;
default://中文
sourcePath = appPath.path() + appPath.separator() + "chinese.qm";
break;
}
QFile::remove(targetPath);
QFile::copy(sourcePath,targetPath);
#ifdef Q_OS_LINUX
system("sync");
#endif
return targetPath;
}
void setMcMainWindow(QApplication &app, QSplashScreen *splash, s16 HMIDecrypt, s16 connectMode)
{
//创建主窗口
if (g_emMacType == MACHINE_EMB || //绣花机
g_emMacType == QUIMACHINE_EMB ) //绗绣机
{
MainWidget mainwindow;
//初始化主窗口
mainwindow.initMcTypeWindows();
mainwindow.initAllWindows(HMIDecrypt,connectMode);
mainwindow.show();//显示窗口
mainwindow.setWindowIcon(QIcon(":/images/1024x600/rp.png"));
splash->finish(NULL);
app.exec();//开始执行应用程序
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);//此处必须用QApplication否则QSplashScreen不能使用
QSharedMemory shared_memory;
shared_memory.setKey(QString("main_window"));//设置固定共享内存段的key值
if(shared_memory.attach()) //尝试将进程附加到该共享内存段,避免windows下重开程序
{
return 0;
}
#ifdef Q_OS_LINUX
QApplication::setOverrideCursor(Qt::BlankCursor);
#endif
//支持中文编码
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
//文件路径
QDir apppath(qApp->applicationDirPath());
g_pSettings = new Settings();
//日志文件记录
for(s16 i = TYPE_ERROR; i <= TYPE_BREAK; i++)
{
QString csvfile;
if(i == TYPE_ERROR)
{
csvfile = apppath.path() + apppath.separator() + CSV_ERROR;
}
else if(i == TYPE_BREAK)
{
csvfile = apppath.path() + apppath.separator() + CSV_BREAK;
}
// 使用时间格式进行csv文件命名
//m_strFilePath = strDir + "/" + QString("csv%1.csv").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd"));
// 判断文件是否不存在
QFile fileCSV(csvfile);
if (!fileCSV.exists())
{
QFile file(csvfile);
if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
QTextStream in(&file);
QString strText("");
// 文件不存在第一次给他写个列表名字这样csv文件打开时候查看的时候就比较清晰
strText = QString("DateTime,") + QString("Info");
in << strText << '\n';
file.close();
}
}
g_pSettings->clearToCsv(i);
}
//配置文件路径
QString configfile;
configfile = apppath.path() + apppath.separator() + "config.ini";
//读入配置
//g_pSettings = new Settings();
g_pSettings->loadSetting(configfile);
QFile iniFile(configfile);
int language = 0;
int fontsize = 0;
s16 connectMode = 0;
s16 gatewayConnectMode = 0;
if(!iniFile.exists())//配置文件不存在
{
if(RESOLUTIO_TYPE == 1)
{
g_pSettings->writeToIniFile("HMI/resolution",resolution1910);
}
else if (RESOLUTIO_TYPE == 2)
{
g_pSettings->writeToIniFile("HMI/resolution",resolution1006);
}
g_pSettings->writeToIniFile("HMI/theme",theme1);
g_pSettings->writeToIniFile("HMI/machineType",MACHINE_EMB);
g_pSettings->writeToIniFile("HMI/productType",PRODUCT_EMB_EMB);
g_pSettings->writeToIniFile("HMI/connectMode",0);//连接方式(通讯方式,网口或串口)
g_pSettings->writeToIniFile("HMI/passwordOne",PASSWORD_ONE);
g_pSettings->writeToIniFile("HMI/commonbtn1",FUN_PATTERNSELECT);//快捷按钮1的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn2",FUN_SETSTARTEMBPOINT);//快捷按钮2的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn3",FUN_BACKSTARTEMBPOINT);//快捷按钮3的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn4",FUN_CHECKFRAME);//快捷按钮4的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn5",FUN_BACKWORKPOINT);//快捷按钮5的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn6",FUN_NEEDLERODPOSITION);//快捷按钮6的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn7",FUN_BACKOFFSETPOINT);//快捷按钮7的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn8",FUN_SPINDLEJOG);//快捷按钮8的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn9",FUN_MANUALTRIM);//快捷按钮9的功能索引
g_pSettings->writeToIniFile("HMI/commonbtn10",FUN_MANUALCHANGECOLOR);//快捷按钮10的功能索引
//绣花针杆
g_pSettings->writeToIniFile("EmbNeedle/number",9);
g_pSettings->writeToIniFile("EmbNeedle/1_coloridx",0);
//亮片颜色设置
g_pSettings->writeToIniFile("SequinColor/number",2);
g_pSettings->writeToIniFile("SequinColor/1_coloridx",0);
//散珠颜色设置
g_pSettings->writeToIniFile("BeadColor/number",1);
g_pSettings->writeToIniFile("BeadColor/1_coloridx",0);
//毛巾针杆设置
g_pSettings->writeToIniFile("TowelNeedle/number",6);
g_pSettings->writeToIniFile("TowelNeedle/1_coloridx",0);
//缠绕针杆设置 //默认是9个针杆
g_pSettings->writeToIniFile("CoilNeedle/number",9);
g_pSettings->writeToIniFile("CoilNeedle/1_coloridx",0);
//锯齿针杆设置 //默认是6个针杆
g_pSettings->writeToIniFile("SawtoothNeedle/number",6);
g_pSettings->writeToIniFile("SawtoothNeedle/1_coloridx",0);
//盘带针杆设置 //默认是2个针杆
g_pSettings->writeToIniFile("RibbonNeedle/number",2);
g_pSettings->writeToIniFile("RibbonNeedle/1_coloridx",0);
//激光针杆设置 //默认是1个针杆
g_pSettings->writeToIniFile("LaserNeedle/number",10);
g_pSettings->writeToIniFile("LaserNeedle/1_coloridx",0);
//上次关机时间
g_pSettings->writeToIniFile("DateTime/second",0);
if(RESOLUTIO_TYPE == 1)
{
g_emResolut = resolution1910;
}
else if (RESOLUTIO_TYPE == 2)
{
g_emResolut = resolution1006;
}
g_emTheme = theme1;
g_emMacType = MACHINE_EMB;
g_emProductType = PRODUCT_EMB_EMB;
g_passwordOne = PASSWORD_ONE;
}
else//存在配置文件很可能是只有DateTime/second
{
int date = g_pSettings->readFromIniFile("DateTime/second").toInt();
if(date == 0)
{
// 获取系统当前时间
QDateTime dateTime = QDateTime::currentDateTime();
g_pSettings->writeToIniFile(("DateTime/second"),dateTime.toTime_t());//单位为秒
}
g_passwordOne = g_pSettings->readFromIniFile("HMI/passwordOne").toString();//先从配置文件里读290810
if(g_passwordOne == 0)//如果是0
{
g_passwordOne = PASSWORD_ONE;//就等于290810
g_pSettings->writeToIniFile("HMI/passwordOne",g_passwordOne);//然后写入配置文件
}
else//如果不是0
{
g_passwordOne = g_pSettings->readFromIniFile("HMI/passwordOne").toString();//就等于配置文件里的
}
g_emTheme = (Theme)(g_pSettings->readFromIniFile("HMI/theme").toInt());
if(g_emTheme == 0 )// 不存在主题 就写成主题1为了防止灰屏
{
g_pSettings->writeToIniFile("HMI/theme",theme1);
g_emTheme = theme1;
}
QString g_emResolutStr = "HMI/resolution";
if(g_pSettings->ifKeyExists(g_emResolutStr) == true)
{
g_emResolut = (Resolution)(g_pSettings->readFromIniFile("HMI/resolution").toInt());
}
else
{
if(RESOLUTIO_TYPE == 1)
{
g_pSettings->writeToIniFile("HMI/resolution",resolution1910);
g_emResolut = resolution1910;
}
else if (RESOLUTIO_TYPE == 2)
{
g_pSettings->writeToIniFile("HMI/resolution",resolution1006);
g_emResolut = resolution1006;
}
}
g_emMacType = (MachineType)(g_pSettings->readFromIniFile("HMI/machineType").toInt());
g_emProductType = (ProductType)(g_pSettings->readFromIniFile("HMI/productType").toInt());
connectMode = g_pSettings->readFromIniFile("HMI/connectMode").toInt();
}
//各机头针杆断线信息
QString breakFilePath = apppath.path() + apppath.separator() + BREAKINFOFILE;
QFile breakFile(breakFilePath);
if(!breakFile.exists())
{
if(!breakFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open breakFile fail when wirte";
}
else
{
QByteArray arr;
arr.clear();
arr.resize(HEADNUM*NEEDLENUM*sizeof(s32)*3);//乘3是包括平绣、毛巾、缠绕三种
memset(arr.data(),0,arr.length());
breakFile.write(arr);
breakFile.close();
}
}
//自动获取屏幕分辨率
#ifdef Q_OS_LINUX
QDesktopWidget * desktop = QApplication::desktop();
QRect screenRect = desktop->screenGeometry();
int width = screenRect.width();
int height = screenRect.height();
if(width == 1920 && height == 1080)
{
g_emResolut = resolution1910;
}
else if(width == 1024 && height == 600)
{
g_emResolut = resolution1006;
}
#endif
QString HMIConfigfile;
HMIConfigfile = apppath.path() + apppath.separator() + "HMIConfig.ini";
//读入配置
// g_pSettings = new Settings();
g_pSettings->loadHMISetting(HMIConfigfile);
QFile HMIFile(HMIConfigfile);
if(!HMIFile.exists())//不存在
{
g_pSettings->writeToInHMIiFile("Pattern/name","");
g_pSettings->writeToInHMIiFile("HMI/language",chinese);
g_pSettings->writeToInHMIiFile("HMI/fontsize",normal);//字体大小
g_pSettings->writeToInHMIiFile("HMI/debugMode",nodebugMode);//界面调试模式
g_pSettings->writeToInHMIiFile("HMI/combineEmb",0);//0:无双头组合绣功能 1:有双头组合绣功能
g_pSettings->writeToInHMIiFile("HMI/threeCombineEmb",0);//0:无三头组合绣功能 1:有三头组合绣功能
g_pSettings->writeToInHMIiFile("HMI/headEmb",0);//0:无隔头绣功能 1:有隔头绣功能
g_pSettings->writeToInHMIiFile("HMI/laser",0);//0:无激光功能 1:有激光功能 -rq
g_pSettings->writeToInHMIiFile("HMI/shuttleChange",0);//0:无自动换梭功能 1:有自动换梭功能 -rq
g_pSettings->writeToInHMIiFile("HMI/trackropeEmb",0);//0:无跟踪绳绣功能 1:有跟踪绳绣功能
g_pSettings->writeToInHMIiFile("HMI/stepDrive",0);//0:无步进驱动功能 1:有步进驱动功能
g_pSettings->writeToInHMIiFile("HMI/camColorChange",0);//0:无凸轮换色功能 1:有凸轮换色功能
g_pSettings->writeToInHMIiFile("HMI/bead",0);//0:无散珠功能 1:有散珠功能
g_pSettings->writeToInHMIiFile("HMI/sequin",0);//0:无亮片功能 1:有亮片功能
g_pSettings->writeToInHMIiFile("HMI/towel",0);//0:无毛巾功能 1:有毛巾功能
g_pSettings->writeToInHMIiFile("HMI/coil",0);//0:无缠绕功能 1:有缠绕功能
g_pSettings->writeToInHMIiFile("HMI/simpleTowel",0);//0:无简易毛巾功能 1:有简易毛巾功能
g_pSettings->writeToInHMIiFile("HMI/foot",0);//0:无独立压脚 1:有独立压脚
g_pSettings->writeToInHMIiFile("HMI/waterMark",1);//0:主背景图不带水印 1:主背景图带水印
g_pSettings->writeToInHMIiFile("HMI/paraSort",1);//0:参数不分类显示 1:参数分类显示
g_pSettings->writeToInHMIiFile("HMI/wifi",0);//0:不带wifi 1:带wifi
g_pSettings->writeToInHMIiFile("HMI/gradient",0);//0:3D显示 1:2D显示
g_pSettings->writeToInHMIiFile("HMI/fileMode",0);//0:ds16 1:ds8
//针步补偿默认值是0.2mm
//g_pSettings->writeToIniFile("PatternPara/stepCompensation",20);
g_pSettings->writeToInHMIiFile("PatternPara/xCompensation",20);
g_pSettings->writeToInHMIiFile("PatternPara/yCompensation",20);
g_pSettings->writeToInHMIiFile("PatternPara/lockNeedlesNum",2); // 锁针次数
g_pSettings->writeToInHMIiFile("PatternPara/lockNeedlesStepNum",1); // 锁针步数
g_pSettings->writeToInHMIiFile("PatternPara/lockNeedlesStepLength",100); // 锁针针步长度
g_pSettings->writeToInHMIiFile("PatternPara/minStep",0); // 过滤针步长度
g_pSettings->writeToInHMIiFile("IOT/gatewayConnectMode",0);//网关连接方式(连接方式,网口或串口)
//g_pSettings->writeToInHMIiFile("IOT/rackNumber",0);//机架号
language = chinese;
fontsize = normal;
g_emDebugMode = nodebugMode;
}
else
{
//为了防止配置文件里没有debugMode时升级黑屏因为界面调试模式是后来新加的之前版本的配置文件里没有兼容之前的版本 -rq
QString debugModeStr = "HMI/debugMode";
if(g_pSettings->ifHMIKeyExists(debugModeStr) == true)
{
g_emDebugMode =(DebugMode)(g_pSettings->readFromInHMIiFile("HMI/debugMode").toInt());//如果存在配置文件并且有这个key就读配置文件里的调试模式的值
}
else
{
g_pSettings->writeToIniFile("HMI/debugMode",nodebugMode);//界面调试模式
g_emDebugMode = nodebugMode;
}
QString stepDriveStr = "HMI/stepDrive";
if(g_pSettings->ifHMIKeyExists(stepDriveStr) == true)
{
int stepDrive = g_pSettings->readFromInHMIiFile("HMI/stepDrive").toInt();//如果存在配置文件并且有这个key就读配置文件里的值
g_pSettings->writeToInHMIiFile("HMI/stepDrive",stepDrive);
}
else
{
g_pSettings->writeToInHMIiFile("HMI/stepDrive",0);
}
language = g_pSettings->readFromInHMIiFile("HMI/language").toInt();
fontsize = g_pSettings->readFromInHMIiFile("HMI/fontsize").toInt();
gatewayConnectMode = g_pSettings->readFromInHMIiFile("IOT/gatewayConnectMode").toInt();
}
//多语言翻译
QString languageFile = switchLanguage(language,apppath);
QTranslator translator;
translator.load(languageFile);
app.installTranslator(&translator);
//资源文件
QString resourcefile = apppath.path() + apppath.separator() + "nxcui.rcc";
QResource::registerResource(resourcefile);
//启动画面
QSplashScreen *splash = new QSplashScreen;
if(g_emResolut == resolution1006)
{
splash->setPixmap(QPixmap(":/images/startlogo1006.png"));
}
else if(g_emResolut == resolution1910)
{
splash->setPixmap(QPixmap(":/images/startlogo1910.png"));
}
QFont font;
font.setPixelSize(20);
splash->setFont(font);
splash->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y());
int waterMark = g_pSettings->readFromInHMIiFile("HMI/waterMark").toInt();//是否带水印
if(waterMark==1)//带logo
{
splash->show();//显示启动画面
}
//检测界面解密的配置文件是否存在
//界面解密配置文件路径
s16 HMIDecrypt = 1;//1代表已授权解密过0代表未授权解密过
QString HMIDecryptConfigfile;
HMIDecryptConfigfile = apppath.path() + apppath.separator() + "HMIDecryptConfig.ini";
QFile HMIDecryptIniFile(HMIDecryptConfigfile);
if(!HMIDecryptIniFile.exists())//不存在界面解密的文件(已发机器),可与主板建立连接
{
HMIDecrypt = 1;
}
else//存在界面解密的文件,判断是否解密过来决定是否与主板建立连接
{
QSettings iniSetting(HMIDecryptConfigfile, QSettings::IniFormat);
HMIDecrypt = iniSetting.value("HMIDecrypt/ifdecrypt").toInt();
}
//下位机通讯
QString mcConfigfile;
mcConfigfile = apppath.path() + apppath.separator() + "mcconfig.ini";
g_pMachine = new Machine(); //创建下位机通讯
g_pMachine->initConnectMode(connectMode);//初始化通讯连接方式
g_pMachine->setComportName("");
g_pMachine->setConfigFileName(mcConfigfile);//配置文件
if(HMIDecrypt != 0)
{
g_pMachine->startCommunication();//启动线程
}
//物联网客户端与mqtt网关服务器建立连接
g_pLotMachine = NULL;
QString lotConfigfile;
lotConfigfile = apppath.path() + apppath.separator() + "lotconfig.ini";
g_pLotMachine = new LotMachine(); //创建网关通讯
g_pLotMachine->initConnectMode(gatewayConnectMode);//初始化通讯连接方式
g_pLotMachine->setComportName("");
g_pLotMachine->setConfigFileName(lotConfigfile);
g_pLotMachine->startCommunication();
g_pCurEmbData = new EmbData();
//初始化颜色
g_pCurEmbData->initColor(g_pSettings->getColorRgbArray().size(),(QRgb*)g_pSettings->getColorRgbArray().data());
//设置颜色列表(针杆色序表)
for(int i = 0; i < TOTAL_NEEDLE_NUM; i++)
{
QString idxStr;
idxStr.clear();
//绣花针杆
if(i >= 0 && i <= EMB_NEEDLE_NUM - 1)
{
idxStr = "EmbNeedle/"+QString::number(i+1)+"_coloridx";
}
//盘带针杆
else if(i >= (EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM - 1) && i <=(EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM + RIBBON_NEEDLE_NUM- 1))
{
idxStr = "RibbonNeedle/"+QString::number(i+1)+"_coloridx";
}
//毛巾针杆
else if(i >= (EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM + RIBBON_NEEDLE_NUM - 1) && i <=(EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM - 1))
{
idxStr = "TowelNeedle/"+QString::number(i+1)+"_coloridx";
}
//链式针杆
else if(i >= (EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM + RIBBON_NEEDLE_NUM +TOWEL_NEEDLE_NUM - 1) && i <=(EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+ CHAIN_NEEDLE_NUM - 1))
{
idxStr = "TowelNeedle/"+QString::number(i+1)+"_coloridx";
}
//缠绕针杆
else if(i >= (EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM + RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+CHAIN_NEEDLE_NUM - 1) && i <=(EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+ CHAIN_NEEDLE_NUM +COIL_NEEDLE_NUM - 1))
{
idxStr = "CoilNeedle/"+QString::number(i+1)+"_coloridx";
}
//锯齿针杆
else if(i >= (EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+ CHAIN_NEEDLE_NUM +COIL_NEEDLE_NUM - 1) && i <=(EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+ CHAIN_NEEDLE_NUM +COIL_NEEDLE_NUM+REV2_NEEDLE_NUM+SAWTOOTH_NEEDLE_NUM - 1))
{
idxStr = "SawtoothNeedle/"+QString::number(i+1)+"_coloridx";
}
//激光针杆
else if(i >= (EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+ CHAIN_NEEDLE_NUM +COIL_NEEDLE_NUM+REV2_NEEDLE_NUM+SAWTOOTH_NEEDLE_NUM - 1) && i <=(EMB_NEEDLE_NUM + PUNCH_NEEDLE_NUM + SEW_NEEDLE_NUM+RIBBON_NEEDLE_NUM+TOWEL_NEEDLE_NUM+ CHAIN_NEEDLE_NUM +COIL_NEEDLE_NUM+REV2_NEEDLE_NUM+SAWTOOTH_NEEDLE_NUM+REV3_NEEDLE_NUM+LASER_NEEDLE_NUM - 1))
{
idxStr = "LaserNeedle/"+QString::number(i+1)+"_coloridx";
}
if(g_pSettings->ifKeyExists(idxStr) == true)
{
int idx = g_pSettings->readFromIniFile(idxStr).toInt();
g_pCurEmbData->setNeedleColorTable(i,idx);
}
else
{
g_pCurEmbData->setNeedleColorTable(i,i);
}
}
//设置亮片颜色列表
for(int i = 0; i < SEQUIN_NUM; i++)
{
QString idxStr = "SequinColor/"+QString::number(i+1)+"_coloridx";
if(g_pSettings->ifKeyExists(idxStr) == true)
{
int idx = g_pSettings->readFromIniFile(idxStr).toInt();
g_pCurEmbData->setSequinColorTable(i,idx);
}
else
{
g_pCurEmbData->setSequinColorTable(i,i);
}
}
//设置散珠颜色列表
for(int i = 0; i < BEAD_NUM; i++)
{
QString idxStr = "BeadColor/"+QString::number(i+1)+"_coloridx";
if(g_pSettings->ifKeyExists(idxStr) == true)
{
int idx = g_pSettings->readFromIniFile(idxStr).toInt();
g_pCurEmbData->setBeadColorTable(i,idx);
}
else
{
g_pCurEmbData->setBeadColorTable(i,i);
}
}
Qt::Alignment alignment = Qt::AlignHCenter|Qt::AlignBottom; //设置一个格式
QString str = QCoreApplication::translate("GLOBAL", "Init windows...");//初始化窗体...
splash->showMessage(str,alignment,Qt::red);
if (fontsize == 1)//如果是加大字体
{
if(g_emResolut == resolution1006)
{
fontBold_1 = fontBold_4;//二级界面主标题字体
fontNormal_1 = fontNormal_4;//1024x600常规字体加大
fontNormal_6 = fontNormal_7;//显示花样信息的字体
fontNormal_10 = fontNormal_11;//断线机头字体
fontNormal_12 = fontNormal_12;//1024x600分辨率 花样选择界面花样名称
fontNormal_3 = fontNormal_3;//调试信息
fontNormal_4 = fontNormal_4;
}
else
{
fontBold_1 = fontBold_1;
fontNormal_1 = fontNormal_9;
fontNormal_6 = fontNormal_9; //1920x1080分辨率 的所有字体
fontNormal_10 = fontNormal_10;
fontNormal_12 = fontNormal_1;
fontNormal_3 = fontNormal_6;//调试信息
fontNormal_4 = fontNormal_9;
}
}
else if (fontsize == 0)//如果是正常字体
{
if(g_emResolut == resolution1006)
{
fontBold_1 = fontBold_5;
fontNormal_1 = fontNormal_8;//1024x600常规字体和显示花样字体一样大,都是fontNormal_8(正常)
fontNormal_6 = fontNormal_8;
fontNormal_10 = fontNormal_11;//绣花机断线机头字体
fontNormal_9 = fontNormal_9;//绗绣机断线机头字体
fontNormal_12 = fontNormal_12;//1024x600分辨率 花样选择界面花样名称
fontNormal_3 = fontNormal_8;//调试信息
fontNormal_4 = fontNormal_12;
}
else
{
fontBold_1 = fontBold_1;
fontNormal_1 = fontNormal_1;
fontNormal_6 = fontNormal_1; //1920x1080分辨率 的所有字体
fontNormal_10 = fontNormal_10;
fontNormal_9 = fontNormal_11;//绗绣机断线机头字体
fontNormal_12 = fontNormal_1;
fontNormal_3 = fontNormal_3;//调试信息
fontNormal_4 = fontNormal_4;
}
}
#ifdef Q_OS_WIN
//win下防止多个程序打开
if(shared_memory.create(1)) //创建1byte的共享内存段
{
setMcMainWindow(app,splash,HMIDecrypt,connectMode);
}
#endif
#ifdef Q_OS_LINUX
setMcMainWindow(app,splash,HMIDecrypt,connectMode);
#endif
delete splash;
delete g_pSettings;
if(g_pMachine != NULL)
{
delete g_pMachine;
}
delete g_pCurEmbData;
return 0;
}

286
main.h Normal file
View File

@ -0,0 +1,286 @@
#ifndef MAIN_H
#define MAIN_H
#include <QImage>
#include <QDesktopWidget>
#include "settings/settings.h"
//#include "Include/machine.h"
#include "machine/machine.h"
#include "machine/lotmachine.h"
//#include "Include/embdata.h"
#include "datafile/embdata.h"
#define VER_CODE_Y 21
#define VER_CODE_M 11
#define VER_CODE_D 12
#define RESOLUTIO_TYPE 2 //屏幕分辨率 1: 1920x1080 2: 1024x600
#define STYPE1 0x00000001
#define STYPE2 0x00000002
#define STYPE3 0x00000004
#define STYPE4 0x00000008
#define STYPE5 0x00000010
#define STYPE6 0x00000020
#define STYPE7 0x00000040
#define STYPE8 0x00000080
#define STYPE9 0x00000100
#define STYPE10 0x00000200
#define NAMEMAXLENGTH 8 // 字体最大长度
#define LINUXUSBPATH "/media/usb0/"
#define LINUXFONTPATH "/usr/lib/fonts/" //字体目录
#define PATTERNPATH "datafiles"
#define IMAGE_TYPE (QImage::Format_ARGB32)
#define PEN_WIDTH 1
//透明背景色,白色前景色
#define LABELWHITESTYLE "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);"
//透明背景色,白色前景色,带边框(色序设定针杆按钮)
#define BUTTONWHITESTYLE "QPushButton{outline: none;border:1px solid rgb(235,235,235);border-style:inset;border-radius:5px;color: rgb(255, 255, 255);} QPushButton:pressed{background-color: rgba(105, 105, 127);}"
//白色背景色,黑色前景色,带边框(列表界面按钮-动框角度调节)
#define BUTTONSHEETSTYLE "QPushButton{background-color: rgba(245, 245, 245);border:0.5px solid rgb(120,120,120);color: rgb(10, 10, 10);} QPushButton:pressed{background-color: rgba(199, 226, 255);}"
//透明背景色,灰色前景色
#define LABELGREYSTYLE "background-color: rgba(245, 245, 245, 0);color: rgb(78, 78, 78);"
//透明背景色,黑色前景色
#define LABELBLACKSTYLE "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"
//透明背景色,红色前景色
#define LABELREDSTYLE "background-color: rgba(245, 245, 245, 0);color: rgb(220, 0, 0);"
//透明背景色,红色前景色 字体很大 font-size:700px;
#define LABELREDSTYLEBROKEN "background-color: rgba(245, 245, 245, 0);color: rgb(220, 0, 0);"
//透明背景色,蓝色前景色 字体很大
#define LABELREDSTYLEBROKENBLUE "background-color: rgba(245, 245, 245, 0);color: rgb(57, 95, 140);"
//透明背景色,深蓝色前景色
#define LABELNAVYBLUESTYLE "background-color: rgba(245, 245, 245, 0);color: rgb(57, 95, 140);"
//透明色、无焦点、无边框
#define TRANSPARENTSTYLE "outline:none;border:0px;background-color: rgba(255, 255, 255, 0);"
//进度条样式表
#define PROGRESSBARSTYLE "QProgressBar{border-radius: 5px;border:0px;}QProgressBar::chunk{background-color: rgb(255, 255, 255);}"
#define PROGRESSBARSTYLE2 "QProgressBar::chunk {background-color: #3a8fbc;border-radius: 5px;}QProgressBar {border:1px solid #d4d4d4;background-color: #bab0b6;border-radius: 5px;}QProgressBar {color: #efefef}"
#ifdef Q_OS_WIN
#define FONTSIZE1_1 18 //1920x1080分辨率 常规字体字体(正常)
#define FONTSIZE1_2 26 //速度显示
#define FONTSIZE1_3 16 //1920x1080分辨率色序设定界面
#define FONTSIZE1_4 11 //1024x600分辨率 常规字体字体(加大)
#define FONTSIZE1_6 18 //1920x1080分辨率 显示花样信息的字体(正常)
#define FONTSIZE1_7 10 //1024x600分辨率 显示花样信息的字体(加大)
#define FONTSIZE1_8 9 //1024x600分辨率 常规字体字体(正常)
#define FONTSIZE1_9 20 //1920x1080分辨率 的字体(加大)
#define FONTSIZE1_10 200 //1920x1080分辨率 机头断线字体34
#define FONTSIZE1_11 100 //1024x600分辨率 机头断线字体
#define FONTSIZE1_12 8 //1024x600分辨率 花样选择界面花样名称 1920x1080的字体大小不变
#endif
#ifdef Q_OS_LINUX
#define FONTSIZE1_1 14
#define FONTSIZE1_2 20
#define FONTSIZE1_3 12
#define FONTSIZE1_4 17 //1024x600分辨率 常规字体字体(加大)
#define FONTSIZE1_5 15
#define FONTSIZE1_6 16
#define FONTSIZE1_7 13 //LINUX 1024x600分辨率 显示花样信息的字体
#define FONTSIZE1_8 11 //1024x600分辨率 常规字体字体(正常)
#define FONTSIZE1_9 22 //1920x1080分辨率 的字体(加大)
#define FONTSIZE1_10 220 //1920x1080分辨率 机头断线字体
#define FONTSIZE1_11 120 //1024x600分辨率 机头断线字体
#define FONTSIZE1_12 10 //1024x600分辨率 花样选择界面花样名称
#endif
#define BORDER_RADIUS1 "10"
#define BORDER_RADIUS2 "5"
#define FONTTYPE "Microsoft YaHei"
#define FONTBOLD QFont::Bold //加粗
#define FONTNORMAL QFont::Normal //正常
#define LINUX_APPNAME "OPRT_CP"
#define WIN_APPNAME "oprt_up.exe"
#define APPNAME "XPLATFORM"
#define PASSWORD_ONE "290810" //一级密码
#define PASSWORD_TWO "262574" //二级密码
#define PASSWORD_THREE "951103" //三级密码
#define PASSWORD_RESETPARA "123456" //重置参数密码
#define HMI_UPDATA 1 // 界面升级
#define MC_UPDATA 2 // 主控升级
#define PARA_IMPORT 3 // 参数导入
#define PARA_EXPORT 4 // 参数导出
#define EXBOARD_UPDATA 5 // 外围板升级
#define PRODUCTSTATIS 6 // 生产统计
#define BOARD_LIST 7 // 显示板卡列表
#define WKPARA_IMPORT 8 // 工作参数导入
#define FRAMEPARA_IMPORT 9 // 动框参数导入
#define FRAMEPARA_EXPORT 10 // 动框参数导出
#define JOURNAL 11 // 日志文件
enum ConnectState
{
NoConnect = 1, //未连接
Connectting = 2, //连接中
Connected = 3 //已连接
};
//用户权限
enum UserRoles
{
operate = 0,//不需要密码
repair = 1,//290810
factory = 2,//262574
root = 3,//951103
resetpara = 4//123456
};
//分辨率
enum Resolution
{
resolution1910 = 0, //1920x1080
resolution1006 = 1 //1024x600
};
//主题
enum Theme
{
theme1 = 1, //主题1
theme2 = 2, //主题2
theme3 = 3 //主题3
};
//语言
enum Language
{
chinese = 0, //中文
english = 1 , //英文
spanish = 2, //西班牙文
bengal = 3, //孟加拉文
//turkey = 4, //土耳其文
portugal = 4, //葡萄牙文
french = 5, //法语
arabic = 6, //阿拉伯语
ukrainian = 7, //乌克兰语
korean = 8, //韩语
russian=9, //俄语
uzbek = 10 //乌兹别克语
};
//字体大小
enum FontSize
{
normal = 0, //标准
larger = 1 //加大
};
enum DebugMode
{
debugMode = 0, //是调试模式
nodebugMode = 1 //不是调试模式
};
//机器类型
enum MachineType
{
MACHINE_EMB = 0, //绣花机
QUIMACHINE_EMB // 绗绣机
};
//机器的附带功能
enum IncidentalFunction
{
PRODUCT_EMB = 0, //纯平绣
RODUCT_SEQUIN , //亮片
PRODUCT_TOWEL, //毛巾
PRODUCT_COIL //缠绕
};
//产品类型
enum ProductType
{
//绣花机
PRODUCT_EMB_EMB = 0, //纯平绣
PRODUCT_CHEN, //纯毛巾
PRODUCT_EMB_FEED, //带上下料机构
PRODUCT_QUI_SINGLE, //绗绣机单排
PRODUCT_QUI_DOUBLE, //绗绣机双排
PRODUCT_NULL //无产品类型
};
#ifdef _IN_MAIN_CPP
LotMachine * g_pLotMachine;//物联网Machine,作为客户端发送数据给mqtt网关
Machine * g_pMachine;
EmbData * g_pCurEmbData = NULL;
UserRoles g_emUser = operate;
QString g_passwordOne = PASSWORD_ONE;
Settings * g_pSettings = NULL;
Resolution g_emResolut = resolution1910;
Theme g_emTheme = theme1;
MachineType g_emMacType = MACHINE_EMB;
ProductType g_emProductType = PRODUCT_EMB_EMB;
DebugMode g_emDebugMode = nodebugMode;
QPoint g_mainWidgetPos;
QFont fontNormal_1(FONTTYPE,FONTSIZE1_1,FONTNORMAL);//微软雅黑常规
QFont fontNormal_2(FONTTYPE,FONTSIZE1_2,FONTNORMAL);//微软雅黑常规
QFont fontNormal_3(FONTTYPE,FONTSIZE1_3,FONTNORMAL);//微软雅黑常规
QFont fontNormal_4(FONTTYPE,FONTSIZE1_4,FONTNORMAL);//微软雅黑常规
QFont fontNormal_6(FONTTYPE,FONTSIZE1_6,FONTNORMAL);//微软雅黑常规
QFont fontNormal_7(FONTTYPE,FONTSIZE1_7,FONTNORMAL);//微软雅黑常规
QFont fontNormal_8(FONTTYPE,FONTSIZE1_8,FONTNORMAL);//微软雅黑常规
QFont fontNormal_9(FONTTYPE,FONTSIZE1_9,FONTNORMAL);//微软雅黑常规
QFont fontNormal_10(FONTTYPE,FONTSIZE1_10,FONTNORMAL);//微软雅黑常规
QFont fontNormal_11(FONTTYPE,FONTSIZE1_11,FONTNORMAL);//微软雅黑常规
QFont fontNormal_12(FONTTYPE,FONTSIZE1_12,FONTNORMAL);//微软雅黑常规
QFont fontBold_1(FONTTYPE,FONTSIZE1_2,FONTBOLD);//微软雅黑26加粗
QFont fontBold_2(FONTTYPE,FONTSIZE1_3,FONTBOLD);//微软雅黑16加粗
QFont fontBold_3(FONTTYPE,FONTSIZE1_1,FONTBOLD);//微软雅黑20加粗
QFont fontBold_4(FONTTYPE,FONTSIZE1_4,FONTBOLD);//微软雅黑14加粗
QFont fontBold_5(FONTTYPE,FONTSIZE1_8,FONTBOLD);//微软雅黑14加粗
#else
extern Machine * g_pMachine;
extern LotMachine * g_pLotMachine;//物联网Machine,作为客户端发送数据给mqtt网关
extern EmbData * g_pCurEmbData;//绣花数据(库)
extern UserRoles g_emUser;
extern QString g_passwordOne;//一级密码
extern Settings * g_pSettings;
extern Resolution g_emResolut;
extern Theme g_emTheme;
extern MachineType g_emMacType;
extern ProductType g_emProductType;
//extern IncidentalFunction g_emIncidentalFunction; //附加功能
extern DebugMode g_emDebugMode;
extern QPoint g_mainWidgetPos;
//1920x1080字体
extern QFont fontNormal_1;//微软雅黑常规14
extern QFont fontNormal_2;//微软雅黑常规22
extern QFont fontNormal_3;//微软雅黑常规12
extern QFont fontNormal_6;//微软雅黑常规16
extern QFont fontNormal_9;//微软雅黑常规16
extern QFont fontNormal_10;//微软雅黑常规35
extern QFont fontNormal_11;//微软雅黑常规28
extern QFont fontNormal_12;//微软雅黑常规28
extern QFont fontBold_1;//微软雅黑26加粗
extern QFont fontBold_2;//微软雅黑18加粗
extern QFont fontBold_3;//微软雅黑20加粗
///1024x600字体
extern QFont fontNormal_4;//微软雅黑常规9
extern QFont fontNormal_7;//微软雅黑常规16
extern QFont fontNormal_8;//微软雅黑常规16
extern QFont fontBold_4;//微软雅黑14加粗
extern QFont fontBold_5;//微软雅黑8加粗
#endif
#endif // MAIN_H

109
mctype/machinetypefun.cpp Normal file
View File

@ -0,0 +1,109 @@
#include "machinetypefun.h"
MachineTypeFun::MachineTypeFun(QObject *parent) : QObject(parent)
{
m_allParasList.clear();
m_allOutCtrlList.clear();
m_allShortCutList.clear();
m_allAssistList.clear();
m_allPatternSetList.clear();
m_allParaSetList.clear();
m_allEmbFunctionList.clear();
m_allSensorList.clear();
m_allErrorCodeAndStateList.clear();
initAllSensorList();
}
MachineTypeFun::~MachineTypeFun()
{
m_allParasList.clear();
m_allOutCtrlList.clear();
m_allShortCutList.clear();
m_allAssistList.clear();
m_allPatternSetList.clear();
m_allParaSetList.clear();
m_allEmbFunctionList.clear();
m_allSensorList.clear();
m_allErrorCodeAndStateList.clear();
}
//获取传感器列表
QList<SensorItem> MachineTypeFun::getSensorList()
{
return m_allSensorList;
}
//获取错误代码列表
QList<ErrorCodeStateItem> MachineTypeFun::getErrorCodeAndStateList()
{
return m_allErrorCodeAndStateList;
}
void MachineTypeFun::initAllSensorList()
{
//所有传感器列表,字符为空
m_allSensorList.clear();
int addr, byteaddr, bitaddr;
SensorItem item;
for (addr = 0; addr < MAX_SENSOR_NUM; addr++)
{
byteaddr = addr / 8;
bitaddr = addr % 8; //(0-7)
item.setItemValue(byteaddr, bitaddr, "");
m_allSensorList.append(item);
}
}
QList<EmbFunctionItem> MachineTypeFun::getEmbFunctionListByFilter()
{
return m_allEmbFunctionList;
}
QList<ParaSetItem> MachineTypeFun::getParaSetListByFilter()
{
return m_allParaSetList;
}
QList<PatternSetItem> MachineTypeFun::getPatternSetListByFilter()
{
return m_allPatternSetList;
}
QList<AssistItem> MachineTypeFun::getAssistListByFilter()
{
return m_allAssistList;
}
QList<ShortCutItem> MachineTypeFun::getShortCutListByFilter()
{
return m_allShortCutList;
}
QList<OutCtrlItem> MachineTypeFun::getOutCtrlListByFilter()
{
return m_allOutCtrlList;
}
QList<ParaItem> MachineTypeFun::getParasListByMcSel()
{
QList <ParaItem> paralist;
int size = m_allParasList.size();
for (int i = 0; i < size; i++)
{
const ParaItem & item = m_allParasList.at(i);
paralist.append(item);
#if(0)
if ((item.mcenSel & mcensel) != 0)
{
paralist.append(item);
}
#endif
}
qStableSort(paralist.begin(), paralist.end(), comparePriority);
return paralist;
}

45
mctype/machinetypefun.h Normal file
View File

@ -0,0 +1,45 @@
#ifndef MACHINETYPEFUN_H
#define MACHINETYPEFUN_H
#include <QObject>
#include <QTextCodec>
#include "items/itemsmanage.h"
#include "main.h"
class MachineTypeFun : public QObject
{
Q_OBJECT
public:
explicit MachineTypeFun(QObject *parent = 0);
public:
virtual ~MachineTypeFun();
public:
virtual QList <ParaItem> getParasListByMcSel();
virtual QList <OutCtrlItem> getOutCtrlListByFilter();
virtual QList <ShortCutItem> getShortCutListByFilter();
virtual QList <AssistItem> getAssistListByFilter();
virtual QList <PatternSetItem> getPatternSetListByFilter();
virtual QList <ParaSetItem> getParaSetListByFilter();
virtual QList <EmbFunctionItem> getEmbFunctionListByFilter();
virtual QList <SensorItem> getSensorList();
virtual QList <ErrorCodeStateItem> getErrorCodeAndStateList();
public:
QList <ParaItem> m_allParasList;
QList <OutCtrlItem> m_allOutCtrlList;
QList <ShortCutItem> m_allShortCutList;
QList <AssistItem> m_allAssistList;
QList <PatternSetItem> m_allPatternSetList;
QList <ParaSetItem> m_allParaSetList;
QList <EmbFunctionItem> m_allEmbFunctionList;
QList <SensorItem> m_allSensorList;
QList <ErrorCodeStateItem> m_allErrorCodeAndStateList;
private:
void initAllSensorList();//初始化全部传感器列表
};
#endif // MACHINETYPEFUN_H

File diff suppressed because it is too large Load Diff

322
mctype/mainwidgetfunction.h Normal file
View File

@ -0,0 +1,322 @@
#ifndef MAINWIDGETFUNCTION_H
#define MAINWIDGETFUNCTION_H
#include <QObject>
#include <QWidget>
#include <QApplication>
#include <stdio.h>
#include <QDateTime>
#include <QProcess>
#include "main.h"
#include "machine/error.h"
#include "sharedviews/promptdialog.h"
#include "sharedviews/passworddialog.h"
#include "sharedviews/systemmanagedialog.h"
#include "sharedviews/brokenlinedialog.h"
#include "sharedviews/debuginfodialog.h"
#include "datafile/datafiledst.h"
#include "datafile/datafiledsr.h"
#include "settings/lotsettings.h"
#include "items/errorcodestateitem.h"
#include "Lot/csvcode.h"
#include "items/paraitem.h"
#ifdef Q_OS_WIN
#include <windows.h>
#endif
//是否打开物联功能
#define IFOPENGATEWAY 1
//是否动态传输文件模式
#define IFDYSENDMODE 0
#define DATA_DS8 1
#define DATA_DS16 0
#define DATA_FORMATE DATA_DS16
#define COLUMN_CODE 0 //信息代码(第一列)
#define COLUMN_INFO 1 //映射信息(第二列)
#define COLUMN_SCORE 2 //分值(第三列)
#define COLUMN_PRESSNUM 3 //是否被点击过(第四列)
#define HEADNUM 160 //160个机头为了适用于绗绣机
#define NEEDLENUM 15
#define WIFIINIPATH "/etc/iot_cfg/mcgs_box_conf.ini"
//机头断线次数结构体
struct EmbHeadBreakLine
{
s32 headNeedleBreakNum[HEADNUM][NEEDLENUM];//机头针位断线次数
};
struct CoilHeadBreakLine
{
s32 headNeedleBreakNum[HEADNUM][NEEDLENUM];//机头针位断线次数
};
struct ChenHeadBreakLine
{
s32 headNeedleBreakNum[HEADNUM][NEEDLENUM];//机头针位断线次数
};
struct HMIFileHead
{
int fileNum;
};
struct HMIItemFileHead
{
char filePath[64];
char fileName[64];
int dataCheck;
int fileSize;
};
class MainWidgetFunction : public QObject
{
Q_OBJECT
public:
explicit MainWidgetFunction(QObject *parent = 0);
~MainWidgetFunction();
private:
PromptDialog *m_pPromptDlg;
SystemManageDialog *m_pSystemManageDlg;
BrokenLineDialog *m_pBrokenLineDialog;
DebugInfoDialog *m_pDebugInfoDlg;
MCStatus m_mcStatus;
EmbHeadBreakLine m_embHeadBreakLine;
CoilHeadBreakLine m_coilHeadBreakLine;
ChenHeadBreakLine m_chenHeadBreakLine;
int m_curFileID;
int m_beginX;
int m_beginY;
QString m_filePath;
QString m_fileName;
McLotData m_mcLotData;//下位机物联数据
HMILotData m_HMILotData;//上位机物联数据
int m_sensorBitmapNum;//传感器位图个数
QList<ErrorCodeStateItem> m_errorCodeAndStateItemList;//错误代码和状态列表
QTimer * m_pTipsTimer; //4小时定时器提示用户使用时长不足5天
QTimer *m_pLotTimer; //物联网定时器
int m_noseHead;
u32 m_potValue;//电位器值
u32 m_gearValue;//当前档位值
u32 m_workNoseHead;//当前工作机头
int m_adcFlag;//是否进入电位器测试的标志
int m_getScore;//安装进度调试得分
int m_totalScore;//总分值
int m_camColorChange;//凸轮换色
QStringList m_csvFileStrList;
private:
void initialize();//初始化
void initializeLotInfo();//初始化物联网所需要的机器信息
void initializeLotData();//初始化物联网数据
void systemUpgrade(int type, int paraType = 0, u8 protocol = 0, u8 nodeid = 0, u8 nodeType = 0);
s16 refreshWifiList(QStringList &wifiStrList,s16 scan = 0);//刷新wifi列表
QString getIpSegment(bool bl);//获取已连接wifi分配的IP
void writePonitToFile(QString filePath,u8 type, int x, int y, int st = 0 ,u8 workHead = 1);//将起绣点写回到文件中(以及工作机头)
void sendDs16PatternData(int type = FILE_TYPE_DAT);//发送ds16花样数据
void convertDs16ToDs8AndSend(QString filePath,int type = FILE_TYPE_DAT);//将ds16数据转换为ds8数据并发送
void addProductStatisInfo(int patternBreakLineNum);//添加生产统计信息
void addJournalInfoError();//添加错误日志信息
void addJournalInfoBreakage();//添加断线日志信息
void addJournalInfoDebug();//添加调试信息
QString getCompileDateTime();
QString compositionJson(QString key,QString value);//组成json键值对
HMILotData getHMILotData();//获取界面物联数据
void writeBreakageInfoToFile();//将断线信息重新写回文件
void sendDataToGateway(s16 code,s16 type = 0);//发送数据到物联网
public:
void setErrorCodeAndStateList(QList<ErrorCodeStateItem> list);//设置错误代码和状态的列表
void setShutDownTime();//上电计算关机时间并发送给主控
void setMcStates(MCStatus mcStatus);//设置机器状态
QString getVersionStr();
QString detectUsb();//优盘检测
s16 detectWifiConnect();
void funImportParameter(QString tStyle);//参数导入
void funImportWkParameter(QString tStyle);//工作参数导入
void funExportParameter(int type = 0);//参数导出
void funExportFrameParameter();//动框参数导出
void funMCUpgrade(QString tStyle);//主控升级
void funHMIUpgrade(QString tStyle);//界面升级
void funEXBUpgrade(QString tStyle,u8 protocol,u8 nodeid ,u8 nodeType);//外围板升级
void funWIFI(QString tStyle);//WIFI管理
void funAllToZero();//全部归零
void funResetOutput();//产量清零(产线左下角)
void funAllToReset();//流程复位
void funFlatEmbHook();//平绣勾线
void funSpindleJog();//主轴点动
void funSpindleRotate();//主轴旋转
void funBackWorkPoint();//回工作点
void funBackToOrigin();//回原点
void funResetStartPoint(QString filePath,DataFilePos pos);//边框检查超限后重新自动设置起绣点
void funSetOffsetPoint();//设置偏移点
void funBackOffsetPoint();//回偏移点
void funSetStartPoint(QString filePath);//设置起始点
void funBackStartPoint();//回起始点
void funBorderCheck();//边框检查
void funWorkState();//切换工作状态
void funManualTrim();//手动剪线
void funTowelTrim();//毛巾剪线
void funCutterOpenAndClose();//剪刀开合
void funSwitchHead(); //切换机头
void funMSpindleRotate(); //M轴旋转
void funChenWorkArea();// 设置可工作区域
void funEmbWorkArea();// 设置可工作区域
void funManualChangeColor();//手动换色
void funTowelChangeColor();//毛巾换色
void funTraceOffset();//线迹偏移
void funWorkPause();//工作暂停
void funSequinChangeColor(s16 sq = 0);//亮片换色0代表左亮片1代表右亮片
void funQuantityMoveFrame();//定量移框
void funNeedleRodPosition();//针杆定位
void funSimulateFrame();//空走边框
void funProcessReset();//流程复位
void funSetFeedPoint();//定上料点
void funBackFeedPoint();//回上料点
void funManualOil();//手动加油
void funResetRepeatNum();//重置反复次数
void funShuttleChange();//梭盘计数复位
void funGotoZeroPos();//框架归零
void funSetWorkRange();//定工作范围
void sendPatternHead(QString filePath);//发送花样文件头
void sendPatternPatchHeadData(QString filePath,int type = FILE_TYPE_DAT);//发送贴布绣或隔头绣数据
void sendPatternTowelHeightData(QString filePath);//发送毛巾高度数据
void sendPatternData(QString filePath,int type = FILE_TYPE_DAT);//发送花样数据
void funBottomDetect(int headType);//底线检测 //headType 用于区分是平绣还是缠绕
void funFaceDetect(int headType);//面线检测
void funExitRoot();//退出登录
void funAgingTest();//老化测试
void funGetMCVersionInfo();//获取主控主板版本信息
void funGetEXBVersionInfo(QString tStyle);//获取主控外围板版本信息
void funProductStatistics(QString tStyle,QString filePath,int patternBreakLineNum);//生产统计
// void funJournal(QString bStyle,QString tStyle);//文件日志
void funJournalError(QString tStyle);//错误日志
// void funJournalBreakage(QString bStyle,QString tStyle);//断线日志
void funDebugInfo();
void funSoftwareAuthor();//软件授权
void funChangeOneShuttle();//自动换一个梭
void funShutDown();//win下关闭计算机
void funHeadEmb(QString filePath);//隔头绣
void funQuiHeadEmb(QString filePath);//绗缝机隔头绣
void funSendPatchEmb(QString filePath,u16* patchColorBuf,NeedlePatch* patchNeedleBuf);//发送贴布绣数据
void funColorOrderChange(QString filePath,u8* buf,s16 combineMode = 0);//色序改变后
int funErrorPrompt(u32 errcode,QString info);//错误信息提示
int funDetectBreakLineStatus();//检测断线状态
int funDetectBreakHeadStatusBit(int type);//平绣剪刀不在回位,检测 机头 按位
int funDetectBreakHeadStatus(int type);
int funDetectSignalStatus(int type);//ZP MP信号异常
void funSetPromptDlgVisibleFalse();//错误信息提示窗体隐藏
void funBottomLineCountReset();//底线计数复位
void funManualOrAutoSwitch(s16 val = 0);//手自动工作状态切换 0:手动 1:自动
void getPatternHeadConfig(QString path,DataFileHead & head);
void setPatternHeadConfig(QString path,DataFileHead head);
void getPatternTowelHeightFcg(QString path,QByteArray & datBuf);
void setPatternTowelHeightFcg(QString path,QByteArray datBuf);//fcg文件写入花样毛巾高度
//缠绕
void funCoilCutterOpenAndClose();//缠绕下剪线
void funCoilManualTrim();//缠绕剪线
void funCoilSpindleJog();//缠绕点动
void funCoilSpindleRotate();//缠绕主轴旋转
void funCoilMSpindleRotate();//缠绕M主轴旋转
void deleteDir(QString path);//删除文件夹
public:
inline int getBeginX(){return m_beginX;}
inline int getBeginY(){return m_beginY;}
inline void setLotDatStartPins(int pins){m_HMILotData.startPins = pins; return;}
inline void setLotDatEndPins(int pins){m_HMILotData.endPins = pins; return;}
inline int getCurFileID(){return m_curFileID;}
private slots:
void slotMCInfoChange();//机器信息改变
void slotFileInfoChange();//接收文件信息
void slotSendLotData();//发送物联数据
void slotRunLotDataAction(QString str);//执行网关数据动作
//void slotSendJsonToMqtt();//当界面与网关建立连接时需要向网关发送固定的键值对
void slotTransProgress(u8 fileType, int send, int total); // 发送文件进度条
void slotClearProductStatis();//清空产量统计
void slotCsvExport(int logType);//导出csv文件
void slotClearJournal();//清空文件日志
void slotRefreshWifiList();//刷新wifi列表
void slotEmbSpindleAction(int action);//平绣主轴动作
void slotEmbSpindleRotate(int angle);//主轴旋转
void slotElasticCtrlPos(int elasticPos);//松紧线控制
void slotLiftMotorCtrl(int gearValue);//当前档位值
void onTipsTimer();//4小时定时器
void slotSetDynamicIP(QString ssid);//设置动态IP
void slotSetStaticIP(QString ssid,QString psd,QString dnip);//设置静态IP
void slotSetQuiHeadBuf(u8* buf);
signals:
void siSetButtonUserLogo(int level);
void siHeadBuf(u8* buf);
void siClearPatternBreakLineNum();
void siDebugState();
void siCloseRootPara();
void siClearPattern();
void siClearPatternFcg();
void siShowPercentage(int val);
//void siTestADC(int m_adcFlag);//测试电位器的标志
void siAfterDeleteFileid();//xcy 0314 删掉影响fileid的数据后需要将m_fileHead置为0
void siWifiState(bool bl);//wifi连接状态
void siHeadParaImportFinish(int type);
public slots:
void slotUserLogin(s16 user);//用户登录
void slotHMIDecrypt(QString id);//界面解密
void slotHookTest();//平绣勾刀测试
void slotFootTest();//独立压脚测试
void slotAutoSetSoftLimit();//自动定软限位
void slotEMBSpindleTest();//平绣主轴齿轮比测试
void slotChenSpindleTest();//毛巾主轴齿轮比测试
void slotEcdWidthTest();
void slotFrameParaImport();//动框参数导入
void slotFrameParaExport();//动框参数导出
void slotHeadBoardBusDetect();//机头板总线检测
void slotExitApp();//超级用户退出程序
void slotVerRecovery();//超级用户下版本恢复
void slotChangePassword();//超级用户下修改一级密码
void slotDeleteIni();//删除执行目录下的config.ini
void slotImportCSV();//导入csv文件
void slotDeleteCSV();//删除csv文件
void slotResetCSV();//重置安装调试进度
void slotDebugMode();//界面调试模式
void slotLiftMotor();//提升电机控制
void slotLElasticCtrl();//松紧线控制
void slotChenilleColorDebug();//毛巾换色调试
void slotPatternClear();//超级用户下花样总清
void slotPatternFcgClear();//超级用户花样fcg文件删除
void slotPatternFcgClearFileid();//清除影响fileid的数据
void slotCalMachineProgress(s16 csvCode,s16 type = 0);//计算安装调试进度
void slotHeadParaImport(QString tStyle,int type);
void slotHeadParaExport(int type);
void slotJournalError();//错误日志
void slotJournalBreakage();//断线日志
void slotCsvChangeDebug();//调试信息
void slotCounterPrompt(s16 flag);
//以下为测试记录断线次数精准到针位
//void testBreakLineNeedle();
public:
//QTimer *m_testNeedle;
void moveDlgPos(void); // 移动窗体位置
};
#endif // MAINWIDGETFUNCTION_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
#ifndef FLATEMBROIDERY_H
#define FLATEMBROIDERY_H
#include "mctype/machinetypefun.h"
//绣花机
class FlatEmbroidery : public MachineTypeFun
{
Q_OBJECT
public:
FlatEmbroidery();
~FlatEmbroidery();
private:
void initSpindleTestParasList();//主轴研车(试机)参数
void initRootParasList();//超级用户参数(包括机器参数、工作参数和遍历设置)
void initRootTraverseSetParasList();//超级用户遍历设置参数
void initLockTestParasList();//锁头测试参数
void initColorPatternPatchParasList();//花样按色贴布绣参数
void initNeedlePatternPatchParasList();//花样按针贴布绣参数
void initPatternsParasList();//花样参数
void initPatternOutlineParasList();//花样轮廓参数
void initMcParasList();//主控机器参数
void initWkParasList();//主控工作参数
void addBeadMcParas();//增加散珠机器参数
void addBeadWkParas();//增加散珠工作参数
void addSequinMcParas();//增加亮片机器参数
void addSequinWkParas();//增加亮片工作参数
void addTowelMcParas();//增加毛巾机器参数
void addTowelWkParas();//增加毛巾工作参数
//void addIndeFootWkParas();//增加独立压脚工作参数
void addCoilMcParas();//增加缠绕机器参数
void addCoilWkParas();//增加缠绕工作参数
void addFeedMcParas();//增加上下料机构机器参数
void addFeedWkParas();//增加上下料机构工作参数
void addLaserMcParas();//增加激光机器参数
void addShuttleChangeMcParas();//增加自动换梭机器参数
void initHeadParasList();//平绣机头板参数
void initTowelHeadParasList();//毛巾机头板参数 -rq
void initTowelColorParasList();//毛巾换色板板参数 -rq
void initTowelDebugParasList();//毛巾调试参数 -rq
void addSequinHeadParasList();//增加亮片机头板参数
void addIndeFootHeadParasList();//增加独立压脚机头板参数
void initEXBUpgradeParaList();//外围板升级参数
void initCoilHeadParasList();//缠绕机头板参数 -rq
private:
void initOutCtrlList();//控制动作
void initShortCutList();//快捷动作
void initAssistList();//辅助功能
void initPatternSetList();//花样设置
void initParaSetList();//参数设置
void initEmbFunctionList();//刺绣功能
private:
void initSensorList();//初始化传感器列表
void initErrorCodeAndStateList();//初始化错误代码和状态列表
};
#endif // FLATEMBROIDERY_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
#ifndef QUIEMBROIDERY_H
#define QUIEMBROIDERY_H
#include "mctype/machinetypefun.h"
//绗绣机
class Quiembroidery : public MachineTypeFun
{
Q_OBJECT
public:
Quiembroidery();
~Quiembroidery();
private:
void initSpindleTestParasList();//主轴研车(试机)参数
void initRootParasList();//超级用户参数(包括机器参数、工作参数和遍历设置)
void initRootTraverseSetParasList();//超级用户遍历设置参数
void initLockTestParasList();//锁头测试参数
void initColorPatternPatchParasList();//花样按色贴布绣参数
void initNeedlePatternPatchParasList();//花样按针贴布绣参数
void initPatternsParasList();//花样参数
void initPatternOutlineParasList();//花样轮廓参数
void initMcParasList();//主控机器参数
void initWkParasList();//主控工作参数
void initHeadParasList();//平绣机头板参数
void initEXBUpgradeParaList();//外围板升级参数
private:
void initOutCtrlList();//控制动作
void initShortCutList();//快捷动作
void initAssistList();//辅助功能
void initPatternSetList();//花样设置
void initParaSetList();//参数设置
void initEmbFunctionList();//刺绣功能
private:
void initSensorList();//初始化传感器列表
void initErrorCodeAndStateList();//初始化错误代码和状态列表
};
#endif // QUIEMBROIDERY_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,359 @@
#ifndef MainWidget_H
#define MainWidget_H
#include <QDebug>
#include <QWidget>
#include <QDateTime>
#include <QResource>
#include <QMouseEvent>
#include "main.h"
#include "mctype/mainwidgetfunction.h"
#include "sharedviews/promptdialog.h"
#include "sharedviews/patternselectwidget.h"
#include "sharedviews/parametersetdialog.h"
#include "sharedviews/patternmanagewidget.h"
#include "sharedviews/sensorinputwidget.h"
#include "sharedviews/controlactionwidget.h"
#include "sharedviews/colorordersetwidget.h"
#include "sharedviews/needlebarsetwidget.h"
#include "sharedviews/sheetwidget.h"
#include "sharedviews/setworkarea.h"
#include "mctype/patternsingleboard/function/flatembroidery.h"
#include "mctype/patternsingleboard/function/quiembroidery.h"
#include "machine/error.h"
#define NODENUMBER 20 //开位线节点数
#define INTERFACE_SHORTCUT 1 //快捷功能界面
#define INTERFACE_ACCESS 2 //辅助功能界面
namespace Ui {
class MainWidget;
}
class MainWidget : public QWidget
{
Q_OBJECT
public:
explicit MainWidget(QWidget *parent = 0);
~MainWidget();
private:
Ui::MainWidget *ui;
PatternSelectWidget *m_pPatternSelectWi;//花样选择窗体
ParameterSetDialog *m_pParameterSetDlg;//参数设定窗体
PatternManageWidget *m_pPatternManageWi;//花样管理窗体(花样导入、导出...)
SensorInputWidget *m_pSensorInputWi;
ControlActionWidget *m_pControlActionWi;
ColorOrderSetWidget *m_pColorOrderSetWi;//色序设定
NeedleBarSetWidget *m_pNeedleBarSetWi;//针杆设定
MainWidgetFunction *m_pMainWidgetFunction;//快捷功能函数结构体
SheetWidget *m_pSheetWi;
SetWorkArea *m_pSetWorkAreaWi;
QList<MyButton*> m_quickBtnList;//快捷功能中的快捷按钮列表
QList<QLabel*> m_quickLabelList;//快捷功能中的label显示列表
QList<MyButton*> m_shortCutBtnList;//窗体下方的快捷按钮列表
QList<MyButton*> m_assistBtnList;//辅助功能中的辅助按钮列表
QList<QLabel*> m_assistLabelList;//辅助功能中的label显示列表
QList<MyButton*> m_patternSetBtnList;//花样设置中的花样设置按钮列表
QList<QLabel*> m_patternSetLabelList;//花样设置中的label显示列表
QList<MyButton*> m_paraSetBtnList;//参数设置中的参数设置按钮列表
QList<QLabel*> m_paraSetLabelList;//参数设置中的label显示列表
QList<MyButton*> m_embFunctionBtnList;//刺绣功能中的刺绣功能按钮列表
QList<QLabel*> m_embFunctionLabelList;//刺绣功能中的label显示列表
QString m_usbPath;//优盘路径
QString m_rootPath;//操作屏根路径
QString m_curPath;//当前路径
int m_pageNums;//总页数
int m_curPages;//快捷界面当前页数
int m_borderEmb;//边框刺绣的标志
private:
void initialize();//初始化
void initArabControlPos();//设置阿拉伯语时控件对齐方式
public:
void initAllWindows(s16 ifHMIDecrypt = 1, s16 connectMode = 0);//初始化窗体
void initMcTypeWindows();//不同机型不同的窗体设置
private:
void initQuickFunBtn();//初始化快捷功能中的快捷按钮
QList<ShortCutItem> m_quickItemList;//快捷功能中的快捷条目列表
void initAssisitBtn();//初始化辅助功能中的辅助按钮
QList<AssistItem> m_assistItemList;//辅助功能中的辅助按钮列表
void initPatternSetBtn();//初始化花样设置功能中的花样设置按钮
QList<PatternSetItem> m_patternSetItemList;//花样设置功能中的花样设置条目列表
void initParaSetBtn();//初始化参数设置功能中的参数设置按钮
QList<ParaSetItem> m_paraSetItemList;//参数设置功能中的参数设置条目列表
void initEmbFunctionBtn();//初始化刺绣功能中的刺绣功能按钮
QList<EmbFunctionItem> m_embFunctionItemList;//刺绣功能中的刺绣功能按钮列表
QList<ErrorCodeStateItem> m_errorCodeAndStateItemList;//错误代码和状态列表
private:
u32 m_workStatus;//工作状态
int m_curRpm;
int m_curDatIdx;//当前针数索引
int m_curColorIdx;//当前色序
int m_forwardBackNeedleIdx;//前进回退时的针数索引
int m_forwardBackColorIdx;//前进回退时的颜色索引
s16 m_ifHMIDecrypt;//界面是否授权1代表已授权解密过0代表未授权解密过
s16 m_connectMode;//通讯连接方式 0:网口1:串口
int m_stepDrive;//写在配置文件里的步进驱动配置
private:
MCStatus m_mcStatus;
u32 m_errorCode;//记录报错代码
int m_initflag;//初始化标志
int m_timoutflag;//超时标志
QTimer * m_pTimer;//建立连接的定时器
QTimer * m_pConTimer;//检测上下位机心跳包的定时器
QTimer * m_pMinTimer;//记录当前时间的定时器
QTimer * m_pRefreshVer; //刷新版本信息
QTimer * m_pWifiConTimer;//检测wifi是否连接的定时器
SetControlStyle m_setControlStyle;
QTimer * m_pRefreshPatternTimer;//更新花样显示的定时器(测试用)
int m_conFlag;//连接标志
int m_linkSta;//连接状态
int m_itemPerPage;//快捷界面每页按钮数
EmbData::DISP_MODE m_dispMode;
QPixmap *m_previewImage;
QString m_curFilePath;//当前选择的花样路径
QString m_preFilePath;//边框刺绣前的花样路径
int m_imageZoom;//花样图片缩放值
int m_imageMoveX;//花样图片平移值X
int m_imageMoveY;//花样图片平移值Y
int m_workNoseHead;//当前工作机头
DataFileHead m_fileHead;//fcg
QPixmap m_embBackPix;//绘制预览图的背景图
FileExecPara m_expara;
int m_gradientFlag; //是否使用3D显示模式,0:3D,!0=2D
private:
int m_speedLevel;//速度等级
int m_showColorIdxBegin;
QList<QPushButton*> m_colorBtnList;
QList<OpenLineNode> m_nodeList;//开位线节点
int m_nodeIdx;
int m_lastNodeIdx;
private:
void setFrameNineBtnStyle();
private:
void clearFileInfo();//清除文件信息
void initControl();//初始化窗体控件,包括位置、尺寸、样式
void initResolution1910();//初始化窗体控件为1920x1080分辨率
void initResolution1006();//初始化窗体控件为1024x600分辨率
void initControlStyle();//初始化窗体控件样式
QString getBackImagePath(s16 waterMark);//获取背景图的加载路径
void refreshPageUi(s16 type);//刷新界面显示
//鼠标事件
protected:
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
private:
int m_mousePressX;
int m_mousePressY;
int m_mouseReleaseX;
int m_mouseReleaseY;
int m_mainWidgetX;
int m_mainWidgetY;
public:
QByteArray m_towelHeightTable;//dsr6.3毛巾高度
private:
void sendInitString(QString str);//发送初始化字符串
void refConnectUi(int alive);//刷新连接状态(1秒)
//刷新连接状态
void refConnectUi(Machine * pMachine,int & linkSta, int alive);
void hideMenuFrame();//隐藏菜单栏(frame)
void setZoomMoveBtnVisible(bool bVal);//隐藏放大、缩小、平移按钮
bool resetAllData();//重置所有数据
void refreshShowColorUi();
//void switchActiveFile(int newActive, int force = 0);
int refreshOpenLineInfo();//刷新开位线绣节点信息
void patternSelect();//花样选择
void patternColorSet();//色序设定
void patternTowelHeightSet();//毛巾高度设定
void patternRepeatEmbSet(QString style);//花样反复绣功能-用于下位机
void reSetPatternData();//刷新花样(色序改变后)
private:
void showExecInfo();//显示机器运行状态中的信息
void showPatternPreview();//显示花样显示页面
private:
void setCommonBtn();//设置常用按钮
QString getCommonBtnStyle(int idx);//获取常用按钮样式
void runCommonBtnFunction(int idx);//执行常用按钮功能
void runAssistBtnFunction(int funEnum,int idx);//执行辅助按钮功能
void runPatternSetBtnFunction(int funEnum,int idx);//执行花样设置按钮功能
void runEmbFunctionBtnFunction(int funEnum,int idx);//执行刺绣功能按钮功能
void setUiBtnEnable(bool bValue);//设置UI界面按钮的使能
void setPatternSetBtnEnable(bool bValue);//设置花样操作按钮的使能,如快进快退等
private:
void reSetDatIdx(int newidx);
void funForwardOrBack();//前进回退
void addOrDecNeedleIdx(int &idx); //加减针
void addOrDecColorIdx(int &idx,s16 flag); //按颜色数前进回退
signals:
void siSendLoadingMessage(QString info, int alignment, QColor color);//接受加载信息
void siSpeed(int speed);//手动换挡
void siCounterPrompt(s16 flag);
private slots:
void slotWaitTimout();//等待超时
void slotMachineStatus(int toggle);//机器状态
void slotShowPercentage(int val);
void slotRefreshWifiIcon(bool bl);
//void slotLotDat(); //测试物联网用
private slots:
void onRefreshVer();//刷新版本信息定时器
void slotChangeColorTable(int selColor,int colorIdx);//改变色序
void slotChangeTowelHighTable(int selColor,int colorIdx);//改变毛巾高度
//选择花样后是否弹出花样参数设置窗体并设置花样参数(默认显示花样参数设置窗体)
void slotShowPatternPara(QString filePath,s16 showFlag = 0);
void slotIfFileExist();//删除文件后判断当前文件是否被删除
void slotClearPatternFcg();//删除fcg后重新选择花版
void slotReplacePattrn(QString path);//花样导入替换文件
void slotSetPatternData();//设置花样数据
void slotRefreshPattern();//针杆设置后重新刷新花样
void slotColorOrderChange(s16 combineMode,s16 threeCombineMode);//色序设定之后重新刷新花样并发送文件头
void slotTowelHighChange();//毛巾高度改变后重新发送毛巾高度数据
void slotSetHeadEmbBtnEnable(bool bl);//设置隔头绣按钮是否可按
//重新重置ds16数据(换色点击取消后数据会变为单个图元的原数据,
//若图形经过变换数据会不对,主界面保存了最后的数据,
//若点击换色并取消后恢复为主界面最后保存的数据即可)
void slotReSetEmbData(QByteArray table);
void slotReSetTowelHigh(QByteArray table);//高度设置界面点击取消后返回设置之前的
void slotHeadEmb();//隔头绣
void slotShowFrameAngleWi();//显示动框角度设置界面
void slotEmbWorkArea();//设置平绣可工作区域界面
void slotChenWorkArea();
void slotCoilWorkArea();
void slotDebugInfo();
public slots:
void slotChangeProgressBar(int value);
private slots:
void slotQuickBtnClick();//快捷功能中的快捷按钮被点击
void slotShortCutBtnClick();//界面下方的快捷按钮被点击
void slotAssistBtnClick();//辅助功能中的辅助功能按钮被点击
void slotPatternSetBtnClick();//花样设置中的花样设置按钮被点击
void slotParaTypeBtnClick();//参数设置中的参数功能按钮被点击
void slotEmbFunctionBtnClick();//刺绣功能中的刺绣功能按钮被点击
void slotSetButtonRootLogo(int level);//设置超级用户图标
void slotEXBUpgrade(u8 protocol, u8 nodeid ,u8 nodeType);//外围板升级
void slotClearPatternBreakLineNum();//清空花版断线次数
void slotResetStartPos(DataFilePos pos);//边框检查超限后重新定起始点(起绣点)
void slotDebugState();//界面调试模式
void slotCloseRootPara();//关闭超级用户参数窗体
private slots:
void onRefreshPatternTimer();//1秒定时器(刷新花样测试用)
void onOneSecondTimer();//1秒定时器
void onFiveSecondTimer();//5秒定时器
void onTenMiniteTimer();//10分钟定时器
void onOneMinTimer();//1分钟定时器
void on_buttonMainMenu_clicked();//主界面按钮
void on_buttonPatternSet_clicked();//花样设置按钮
void on_buttonParaSet_clicked();//参数设定按钮
void on_buttonEmbFunction_clicked();//刺绣功能按钮
void on_buttonShortcutFunction_clicked();//快捷功能按钮
void on_buttonAccessFunction_clicked();//辅助功能按钮
void on_buttonUp_clicked();
void on_buttonDown_clicked();
void on_buttonLeft_clicked();
void on_buttonRight_clicked();
void on_buttonAuto_clicked();
void on_buttonZoom_clicked();
void on_buttonNarrow_clicked();
void on_buttonMiddle_clicked();
void on_buttonPreNode_clicked();
void on_buttonNextNode_clicked();
void on_buttonSetNode_clicked();
void on_buttonNodeDelete_clicked();
void on_buttonOpenLineOk_clicked();
void on_buttonOpenLineClose_clicked();
void on_buttonSpeedAdd_clicked();
void on_buttonSpeedDec_clicked();
void on_buttonNineBtnUp_pressed();
void on_buttonNineBtnUp_released();
void on_buttonNineBtnDown_pressed();
void on_buttonNineBtnDown_released();
void on_buttonNineBtnLeft_pressed();
void on_buttonNineBtnLeft_released();
void on_buttonNineBtnRight_pressed();
void on_buttonNineBtnRight_released();
void on_buttonNineBtnMiddle_pressed();//九宫格中间键按下
void on_buttonNineBtnMiddle_released();//九宫格中间键抬起
void on_buttonNineBtn1_clicked();
void on_buttonNineBtn2_clicked();
void on_buttonNineBtn3_clicked();
void on_buttonNineBtn4_clicked();
void on_buttonNeedle_clicked();//色序设定快捷按钮
void on_buttonPatternInfo_clicked();//花样参数快捷按钮
void on_buttonNeedleBegin_clicked();
void on_buttonNeedleEnd_clicked();
void on_buttonNeedleDec1_clicked();
void on_buttonNeedleAdd1_clicked();
void on_buttonNeedleDec10_clicked();
void on_buttonNeedleAdd10_clicked();
void on_buttonNeedleDec100_clicked();
void on_buttonNeedleAdd100_clicked();
void on_buttonNeedleDec1000_clicked();
void on_buttonNeedleAdd1000_clicked();
void on_buttonNeedleDec10000_clicked();
void on_buttonNeedleAdd10000_clicked();
void on_buttonColorDec_clicked();
void on_buttonColorAdd_clicked();
void on_buttonForwardBackOk_clicked();
void on_buttonForwardBackCancel_clicked();
void on_buttonUser_clicked();
void on_buttonNeedleDown_clicked();
void on_buttonNeedleUp_clicked();
void on_buttonExitMateEmb_clicked();
void on_buttonShortCutPgUp_clicked();
void on_buttonShortCutPgDn_clicked();
void on_buttonAssistPgUp_clicked();
void on_buttonAssistPgDn_clicked();
void on_buttonMove_pressed();
void on_buttonMove_released();
};
#endif // MainWidget_H

File diff suppressed because it is too large Load Diff

1
portuga.qm Normal file
View File

@ -0,0 +1 @@
<クd<>箆!ソ`。スン

BIN
portugal.qm Normal file

Binary file not shown.

11695
portugal.ts Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Some files were not shown because too many files have changed in this diff Show More