diff --git a/Aes/TAesClass.cpp b/Aes/TAesClass.cpp index 7788e35..e2133c1 100644 --- a/Aes/TAesClass.cpp +++ b/Aes/TAesClass.cpp @@ -1,529 +1,529 @@ -#include "TAesClass.h" -#if 1 -unsigned char AesSbox[16*16]= -{// populate the Sbox matrix - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 -}; - -unsigned char AesiSbox[16*16]= -{ - // populate the iSbox matrix - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -}; -unsigned char AesRcon[11*4]= -{ - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x00 -}; -#endif -Aes::~Aes() -{ - -} -Aes::Aes() -{ - -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//构造函数 -Aes::Aes(int keysize,unsigned char* keyBytes) -{ - SetNbNkNr(keysize); //设置密钥块数,轮数 - memcpy(key,keyBytes,keysize); //字符串拷贝函数,把keyBytes的keysize个字符复制到key中 - KeyExpansion(); //密钥扩展,必须提前做的初始化 -} -//////////////////////////////////////////////////////////////////////////////////////////////// -void Aes::SetNbNkNr(int keySize) -{ - Nb=4; - if(keySize==Bits128) - { - Nk=4; //4*4字节,128位密钥,10轮加密 - Nr=10; - } - else if(keySize==Bits192) - { - Nk=6; //6*4字节,192位密钥,12轮加密 - Nr=12; - } - else if(keySize==Bits256) - { - Nk=8; //8*4字节,256位密钥,14轮加密 - Nr=14; - } -} -//////////////////////////////////////////////////////////////////////////////////////////////// -void Aes::KeyExpansion() -{ - - memset(w,0,16*15); - for(int row=0;row 6 && (row % Nk == 4) ) //这个还没有搞清楚 - { - temp = SubWord(temp); - } - - // w[row] = w[row-Nk] xor temp - w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] ); - w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] ); - w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] ); - w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] ); - } // for loop - -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//密钥移位函数 -unsigned char* Aes::RotWord(unsigned char* word) -{ - byte* temp = new byte[4]; - temp[0] = word[1]; - temp[1] = word[2]; - temp[2] = word[3]; - temp[3] = word[0]; - return temp; -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//密钥字代换函数 -unsigned char* Aes::SubWord(unsigned char* word) -{ - byte* temp = new byte[4]; - for(int j=0;j<4;j++) - { - temp[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等 - } - return temp; - -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//Aes加密函数 -void Aes::Cipher(unsigned char* input, unsigned char* output) -{ - memset(&State[0][0],0,16); - for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的 - { - State[i%4][i/4]=input[i]; //换成先写行后写列也是可以的,只要在输出时也是这样就可以了 - } - AddRoundKey(0); //轮密钥加 - - for (int round = 1; round <= (Nr - 1); round++) // main round loop - { - SubBytes(); //字节代换 - ShiftRows(); //行移位 - MixColumns(); //列混淆 - AddRoundKey(round); //轮密钥加 - } // main round loop - - SubBytes(); //字节代换 - ShiftRows(); //行移位 - AddRoundKey(Nr); //轮密钥加 - - // output = state - for (int i = 0; i < (4 * Nb); i++) - { - output[i] = State[i % 4][ i / 4]; - } - -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//Aes解密函数 -void Aes::InvCipher(unsigned char* input,unsigned char* output) -{ - memset(&State[0][0],0,16); - for (int i = 0; i < (4 * Nb); i++) - { - State[i % 4][ i / 4] = input[i]; - } - - AddRoundKey(Nr); - - for (int round = Nr-1; round >= 1; round--) // main round loop - { - InvShiftRows(); - InvSubBytes(); - AddRoundKey(round); - InvMixColumns(); - } // end main round loop for InvCipher - - InvShiftRows(); - InvSubBytes(); - AddRoundKey(0); - - // output = state - for (int i = 0; i < (4 * Nb); i++) - { - output[i] = State[i % 4][ i / 4]; - } -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//轮密钥加 -void Aes::AddRoundKey(int round) -{ - int i,j; //i行 j列 //因为密钥w是一列一列排列的,即 k0 k4 k8 k12 - for(j=0;j<4;j++) // k1 k5 k9 k13 - { // k2 k6 k10k14 - for(i=0;i<4;i++) // k3 k7 k11k15 - { // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i - State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); - } - } -} -//////////////////////////////////////////////////////////////////////////////////////////////// -//字节代换函数 -void Aes::SubBytes() //Page 103 -{ - int i,j; - for(j=0;j<4;j++) - { - for(i=0;i<4;i++) - { - State[i][j]=AesSbox[State[i][j]]; - //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j] - - - } - } -} - -void Aes::InvSubBytes() -{ - int i,j; - for(j=0;j<4;j++) - { - for(i=0;i<4;i++) - { - State[i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j] - } - } - -} -//////////////////////////////////////////////////////////////////////////////////////////////// -void Aes::ShiftRows() -{ - unsigned char temp[4*4]; //Page105 - int i,j; - for(j=0;j<4;j++) - { - for(i=0;i<4;i++) - { - temp[4*i+j]=State[i][j]; - } - } - for(i=1;i<4;i++) - { - for(j=0;j<4;j++) - { - if(i==1)State[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位 - else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位 - else if(i==3)State[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位 - } - } - -} -void Aes::InvShiftRows() -{ - unsigned char temp[4*4]; - int i,j; - for(j=0;j<4;j++) - { - for(i=0;i<4;i++) - { - temp[4*i+j]=State[i][j]; - } - } - for(i=1;i<4;i++) - { - for(j=0;j<4;j++) - { - //if(i==1)State[i][j]=temp[4*i+(j-1)%4]; 在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法 - if(i==1)State[i][j]=temp[4*i+(j+3)%4]; //第一行右移1位 j-1+4=j+3 - else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行右移2位 j-2+4=j+2 - else if(i==3)State[i][j]=temp[4*i+(j+1)%4]; //第三行右移3位 j-3+4=j+2 - } - } - -} -//////////////////////////////////////////////////////////////////////////////////////////////// -void Aes::MixColumns() -{ - unsigned char temp[4*4]; - int i,j; - for(j=0;j<4;j++) //2 3 1 1 列混淆矩阵 Page107 - { //1 2 3 1 - for(i=0;i<4;i++) //1 1 2 3 - { //3 1 1 2 - temp[4*i+j]=State[i][j]; - } - } - for(j=0;j<4;j++) - { - State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^ - (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); - State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^ - (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); - State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ - (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) ); - State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ - (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) ); - } - -} -void Aes::InvMixColumns() -{ - unsigned char temp[4*4]; - int i,j; - for (i = 0; i < 4; i++) // copy State into temp[] - { - for (j = 0; j < 4; j++) //0e 0b 0d 09 逆变换矩阵 Page108 - { //09 0e 0b 0d - temp[4*i+j] = State[i][j]; //0d 09 0e 0b - } //0b 0d 09 0e - } - - for (j = 0; j < 4; j++) - { - State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^ - (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) ); - State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^ - (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) ); - State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^ - (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) ); - State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^ - (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) ); - } -} -//////////////////////////////////////////////////////////////////////////////////////////////// -unsigned char Aes::gfmultby01(unsigned char b) -{ - return b; -} -unsigned char Aes::gfmultby02(unsigned char b) -{ - if (b < 0x80) - return (unsigned char)(int)(b <<1); - else - return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) ); -} - -unsigned char Aes::gfmultby03(unsigned char b) -{ - return (unsigned char) ( (int)gfmultby02(b) ^ (int)b ); -} - -unsigned char Aes::gfmultby09(unsigned char b) -{ - return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b ); -} - -unsigned char Aes::gfmultby0b(unsigned char b) -{ - return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ - (int)gfmultby02(b) ^ (int)b ); -} - -unsigned char Aes::gfmultby0d(unsigned char b) -{ - return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ - (int)gfmultby02(gfmultby02(b)) ^ (int)(b) ); -} - -unsigned char Aes::gfmultby0e(unsigned char b) -{ - return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ - (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) ); -} - -TAesClass::TAesClass() -{ - m_lpAes=NULL; - InitializePrivateKey(16,(unsigned char*)"\x49\x76\x48\x6B\x27\x66\x7E\x65\x72\x35\x73\x15\x8C\x3B\x80\x40"); -} - -TAesClass::~TAesClass() -{ - if (m_lpAes!=NULL) - { - delete m_lpAes; - } -} -//------------------------------------------------------------------------------------------------------------ -// 编写人员:wfnhddd -// -// 函数名称:InitializeAes -// -// 函数描述:初始化AES 密钥,密钥用于加密解密 -// -// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 -// -// 返回数值:无 -// -// 最近修改:2009 年 08 月 07 日 -//------------------------------------------------------------------------------------------------------------ - - -VOID TAesClass::InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes) -{ - if (m_lpAes) - { - delete m_lpAes; - m_lpAes=NULL; - } - m_lpAes=new Aes(KeySize,KeyBytes); - -} - -//------------------------------------------------------------------------------------------------------------ -// 编写人员:wfnhddd -// -// 函数名称:OnAesEncrypt -// -// 函数描述:用AES加密算法加密数据 -// -// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 -// -// 返回数值:加密后的数据大小 ,错误返回值 0 -// -// 最近修改:2009 年 08 月 07 日 -//------------------------------------------------------------------------------------------------------------ - -DWORD TAesClass::OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer) -{ - DWORD OutLength=0; - if (m_lpAes==NULL||OutBuffer==NULL) - { - return 0; - } - - UCHAR *lpCurInBuff=(UCHAR *)InBuffer; - UCHAR *lpCurOutBuff=(UCHAR *)OutBuffer; - long blocknum=InLength/16; - long leftnum=InLength%16; - for(long i=0;iCipher(lpCurInBuff,lpCurOutBuff); - lpCurInBuff+=16; - lpCurOutBuff+=16; - OutLength+=16; - } - if(leftnum) //多余出leftnum 字节 则加密时 多出16-leftnum 个字节 - { - UCHAR inbuff[16]; - memset(inbuff,0,16); - memcpy(inbuff,lpCurInBuff,leftnum); - m_lpAes->Cipher(inbuff,lpCurOutBuff); - lpCurOutBuff+=16; - OutLength+=16; - } - //新增16个字节,用以确定增加的字节数 - UCHAR extrabuff[16]; - memset(extrabuff,0,16); - *((LPDWORD)extrabuff)=16+(16-leftnum)%16; //多出16+(16-leftnum)%16个字节 - m_lpAes->Cipher(extrabuff,lpCurOutBuff); - OutLength+=16; - return OutLength; - -} - - -//------------------------------------------------------------------------------------------------------------ -// 编写人员:wfnhddd -// -// 函数名称:OnAesUncrypt -// -// 函数描述:用AES加密算法解密数据 -// -// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 -// -// 返回数值:解密后的数据大小 ,错误返回值 0 -// -// 最近修改:2009 年 08 月 07 日 -//------------------------------------------------------------------------------------------------------------ -DWORD TAesClass::OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer) -{ - DWORD OutLength=0; - if (m_lpAes==NULL||OutBuffer==NULL) - { - return 0; - } - UCHAR *lpCurInBuff=(UCHAR *)InBuffer; - UCHAR *lpCurOutBuff=(UCHAR *)OutBuffer; - long blocknum=InLength/16; - long leftnum=InLength%16; - if(leftnum) - { - return 0; - } - for(long i=0;iInvCipher(lpCurInBuff,lpCurOutBuff); - lpCurInBuff+=16; - lpCurOutBuff+=16; - OutLength+=16; - } - - UCHAR *lpExtraInBuff=lpCurOutBuff-16; - DWORD dwExtraBytes=*((LPDWORD)lpExtraInBuff); - return (OutLength-dwExtraBytes); - -} +#include "TAesClass.h" +#if 1 +unsigned char AesSbox[16*16]= +{// populate the Sbox matrix + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +unsigned char AesiSbox[16*16]= +{ + // populate the iSbox matrix + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; +unsigned char AesRcon[11*4]= +{ + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00 +}; +#endif +Aes::~Aes() +{ + +} +Aes::Aes() +{ + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//构造函数 +Aes::Aes(int keysize,unsigned char* keyBytes) +{ + SetNbNkNr(keysize); //设置密钥块数,轮数 + memcpy(key,keyBytes,keysize); //字符串拷贝函数,把keyBytes的keysize个字符复制到key中 + KeyExpansion(); //密钥扩展,必须提前做的初始化 +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::SetNbNkNr(int keySize) +{ + Nb=4; + if(keySize==Bits128) + { + Nk=4; //4*4字节,128位密钥,10轮加密 + Nr=10; + } + else if(keySize==Bits192) + { + Nk=6; //6*4字节,192位密钥,12轮加密 + Nr=12; + } + else if(keySize==Bits256) + { + Nk=8; //8*4字节,256位密钥,14轮加密 + Nr=14; + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::KeyExpansion() +{ + + memset(w,0,16*15); + for(int row=0;row 6 && (row % Nk == 4) ) //这个还没有搞清楚 + { + temp = SubWord(temp); + } + + // w[row] = w[row-Nk] xor temp + w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] ); + w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] ); + w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] ); + w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] ); + } // for loop + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//密钥移位函数 +unsigned char* Aes::RotWord(unsigned char* word) +{ + byte* temp = new byte[4]; + temp[0] = word[1]; + temp[1] = word[2]; + temp[2] = word[3]; + temp[3] = word[0]; + return temp; +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//密钥字代换函数 +unsigned char* Aes::SubWord(unsigned char* word) +{ + byte* temp = new byte[4]; + for(int j=0;j<4;j++) + { + temp[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等 + } + return temp; + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//Aes加密函数 +void Aes::Cipher(unsigned char* input, unsigned char* output) +{ + memset(&State[0][0],0,16); + for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的 + { + State[i%4][i/4]=input[i]; //换成先写行后写列也是可以的,只要在输出时也是这样就可以了 + } + AddRoundKey(0); //轮密钥加 + + for (int round = 1; round <= (Nr - 1); round++) // main round loop + { + SubBytes(); //字节代换 + ShiftRows(); //行移位 + MixColumns(); //列混淆 + AddRoundKey(round); //轮密钥加 + } // main round loop + + SubBytes(); //字节代换 + ShiftRows(); //行移位 + AddRoundKey(Nr); //轮密钥加 + + // output = state + for (int i = 0; i < (4 * Nb); i++) + { + output[i] = State[i % 4][ i / 4]; + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//Aes解密函数 +void Aes::InvCipher(unsigned char* input,unsigned char* output) +{ + memset(&State[0][0],0,16); + for (int i = 0; i < (4 * Nb); i++) + { + State[i % 4][ i / 4] = input[i]; + } + + AddRoundKey(Nr); + + for (int round = Nr-1; round >= 1; round--) // main round loop + { + InvShiftRows(); + InvSubBytes(); + AddRoundKey(round); + InvMixColumns(); + } // end main round loop for InvCipher + + InvShiftRows(); + InvSubBytes(); + AddRoundKey(0); + + // output = state + for (int i = 0; i < (4 * Nb); i++) + { + output[i] = State[i % 4][ i / 4]; + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//轮密钥加 +void Aes::AddRoundKey(int round) +{ + int i,j; //i行 j列 //因为密钥w是一列一列排列的,即 k0 k4 k8 k12 + for(j=0;j<4;j++) // k1 k5 k9 k13 + { // k2 k6 k10k14 + for(i=0;i<4;i++) // k3 k7 k11k15 + { // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i + State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); + } + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//字节代换函数 +void Aes::SubBytes() //Page 103 +{ + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + State[i][j]=AesSbox[State[i][j]]; + //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j] + + + } + } +} + +void Aes::InvSubBytes() +{ + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + State[i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j] + } + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::ShiftRows() +{ + unsigned char temp[4*4]; //Page105 + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + temp[4*i+j]=State[i][j]; + } + } + for(i=1;i<4;i++) + { + for(j=0;j<4;j++) + { + if(i==1)State[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位 + else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位 + else if(i==3)State[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位 + } + } + +} +void Aes::InvShiftRows() +{ + unsigned char temp[4*4]; + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + temp[4*i+j]=State[i][j]; + } + } + for(i=1;i<4;i++) + { + for(j=0;j<4;j++) + { + //if(i==1)State[i][j]=temp[4*i+(j-1)%4]; 在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法 + if(i==1)State[i][j]=temp[4*i+(j+3)%4]; //第一行右移1位 j-1+4=j+3 + else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行右移2位 j-2+4=j+2 + else if(i==3)State[i][j]=temp[4*i+(j+1)%4]; //第三行右移3位 j-3+4=j+2 + } + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::MixColumns() +{ + unsigned char temp[4*4]; + int i,j; + for(j=0;j<4;j++) //2 3 1 1 列混淆矩阵 Page107 + { //1 2 3 1 + for(i=0;i<4;i++) //1 1 2 3 + { //3 1 1 2 + temp[4*i+j]=State[i][j]; + } + } + for(j=0;j<4;j++) + { + State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^ + (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); + State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^ + (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); + State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ + (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) ); + State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ + (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) ); + } + +} +void Aes::InvMixColumns() +{ + unsigned char temp[4*4]; + int i,j; + for (i = 0; i < 4; i++) // copy State into temp[] + { + for (j = 0; j < 4; j++) //0e 0b 0d 09 逆变换矩阵 Page108 + { //09 0e 0b 0d + temp[4*i+j] = State[i][j]; //0d 09 0e 0b + } //0b 0d 09 0e + } + + for (j = 0; j < 4; j++) + { + State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^ + (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) ); + State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^ + (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) ); + State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^ + (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) ); + State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^ + (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) ); + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +unsigned char Aes::gfmultby01(unsigned char b) +{ + return b; +} +unsigned char Aes::gfmultby02(unsigned char b) +{ + if (b < 0x80) + return (unsigned char)(int)(b <<1); + else + return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) ); +} + +unsigned char Aes::gfmultby03(unsigned char b) +{ + return (unsigned char) ( (int)gfmultby02(b) ^ (int)b ); +} + +unsigned char Aes::gfmultby09(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b ); +} + +unsigned char Aes::gfmultby0b(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ + (int)gfmultby02(b) ^ (int)b ); +} + +unsigned char Aes::gfmultby0d(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ + (int)gfmultby02(gfmultby02(b)) ^ (int)(b) ); +} + +unsigned char Aes::gfmultby0e(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ + (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) ); +} + +TAesClass::TAesClass() +{ + m_lpAes=NULL; + InitializePrivateKey(16,(unsigned char*)"\x49\x76\x48\x6B\x27\x66\x7E\x65\x72\x35\x73\x15\x8C\x3B\x80\x40"); +} + +TAesClass::~TAesClass() +{ + if (m_lpAes!=NULL) + { + delete m_lpAes; + } +} +//------------------------------------------------------------------------------------------------------------ +// 编写人员:wfnhddd +// +// 函数名称:InitializeAes +// +// 函数描述:初始化AES 密钥,密钥用于加密解密 +// +// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 +// +// 返回数值:无 +// +// 最近修改:2009 年 08 月 07 日 +//------------------------------------------------------------------------------------------------------------ + + +VOID TAesClass::InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes) +{ + if (m_lpAes) + { + delete m_lpAes; + m_lpAes=NULL; + } + m_lpAes=new Aes(KeySize,KeyBytes); + +} + +//------------------------------------------------------------------------------------------------------------ +// 编写人员:wfnhddd +// +// 函数名称:OnAesEncrypt +// +// 函数描述:用AES加密算法加密数据 +// +// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 +// +// 返回数值:加密后的数据大小 ,错误返回值 0 +// +// 最近修改:2009 年 08 月 07 日 +//------------------------------------------------------------------------------------------------------------ + +DWORD TAesClass::OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer) +{ + DWORD OutLength=0; + if (m_lpAes==NULL||OutBuffer==NULL) + { + return 0; + } + + UCHAR *lpCurInBuff=(UCHAR *)InBuffer; + UCHAR *lpCurOutBuff=(UCHAR *)OutBuffer; + long blocknum=InLength/16; + long leftnum=InLength%16; + for(long i=0;iCipher(lpCurInBuff,lpCurOutBuff); + lpCurInBuff+=16; + lpCurOutBuff+=16; + OutLength+=16; + } + if(leftnum) //多余出leftnum 字节 则加密时 多出16-leftnum 个字节 + { + UCHAR inbuff[16]; + memset(inbuff,0,16); + memcpy(inbuff,lpCurInBuff,leftnum); + m_lpAes->Cipher(inbuff,lpCurOutBuff); + lpCurOutBuff+=16; + OutLength+=16; + } + //新增16个字节,用以确定增加的字节数 + UCHAR extrabuff[16]; + memset(extrabuff,0,16); + *((LPDWORD)extrabuff)=16+(16-leftnum)%16; //多出16+(16-leftnum)%16个字节 + m_lpAes->Cipher(extrabuff,lpCurOutBuff); + OutLength+=16; + return OutLength; + +} + + +//------------------------------------------------------------------------------------------------------------ +// 编写人员:wfnhddd +// +// 函数名称:OnAesUncrypt +// +// 函数描述:用AES加密算法解密数据 +// +// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 +// +// 返回数值:解密后的数据大小 ,错误返回值 0 +// +// 最近修改:2009 年 08 月 07 日 +//------------------------------------------------------------------------------------------------------------ +DWORD TAesClass::OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer) +{ + DWORD OutLength=0; + if (m_lpAes==NULL||OutBuffer==NULL) + { + return 0; + } + UCHAR *lpCurInBuff=(UCHAR *)InBuffer; + UCHAR *lpCurOutBuff=(UCHAR *)OutBuffer; + long blocknum=InLength/16; + long leftnum=InLength%16; + if(leftnum) + { + return 0; + } + for(long i=0;iInvCipher(lpCurInBuff,lpCurOutBuff); + lpCurInBuff+=16; + lpCurOutBuff+=16; + OutLength+=16; + } + + UCHAR *lpExtraInBuff=lpCurOutBuff-16; + DWORD dwExtraBytes=*((LPDWORD)lpExtraInBuff); + return (OutLength-dwExtraBytes); + +} diff --git a/Aes/TAesClass.h b/Aes/TAesClass.h index f846f8f..8e5ae9a 100644 --- a/Aes/TAesClass.h +++ b/Aes/TAesClass.h @@ -1,134 +1,134 @@ -#ifndef __TAESCLASS_H__ -#define __TAESCLASS_H__ -#include -#include -#include -#include - -typedef unsigned long DWORD; -typedef unsigned char UCHAR,*PUCHAR; -typedef void *PVOID,*LPVOID; -typedef unsigned char byte; -typedef DWORD *PDWORD,*LPDWORD; - -#ifndef VOID -#define VOID void -#endif - -//#pragma once - -//enum KeySize { Bits128, Bits192, Bits256 }; // key size, in bits, for construtor -#define Bits128 16 -#define Bits192 24 -#define Bits256 32 -#if 0 -static unsigned char AesSbox[16*16]= -{// populate the Sbox matrix - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 -}; - -static unsigned char AesiSbox[16*16]= -{ - // populate the iSbox matrix - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -}; -static unsigned char AesRcon[11*4]= -{ - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x00 -}; -#endif -extern unsigned char AesSbox[16*16]; -extern unsigned char AesiSbox[16*16]; -extern unsigned char AesRcon[11*4]; -class Aes // Advanced Encryption Standard -{ -public: - ~Aes(); - Aes(); - Aes(int keySize, unsigned char* keyBytes); - unsigned char State[4][4]; - void Cipher(unsigned char* input, unsigned char* output); // encipher 16-bit input - void InvCipher(unsigned char* input, unsigned char* output); // decipher 16-bit input -private: - int Nb; // block size in 32-bit words. Always 4 for AES. (128 bits). - int Nk; // key size in 32-bit words. 4, 6, 8. (128, 192, 256 bits). - int Nr; // number of rounds. 10, 12, 14. - - unsigned char key[32]; - unsigned char w[16*15]; - - void SetNbNkNr(int keySize); - void AddRoundKey(int round); //轮密钥加 - void SubBytes(); //S盒字节代换 - void InvSubBytes(); //逆S盒字节代换 - void ShiftRows(); //行移位 - void InvShiftRows(); - void MixColumns(); //列混淆 - void InvMixColumns(); - unsigned char gfmultby01(unsigned char b); - unsigned char gfmultby02(unsigned char b); - unsigned char gfmultby03(unsigned char b); - unsigned char gfmultby09(unsigned char b); - unsigned char gfmultby0b(unsigned char b); - unsigned char gfmultby0d(unsigned char b); - unsigned char gfmultby0e(unsigned char b); - void KeyExpansion(); //密钥扩展 - unsigned char* SubWord(unsigned char* word); //密钥S盒字代换 - unsigned char* RotWord(unsigned char* word); //密钥移位 - -}; - -class TAesClass -{ -public: - TAesClass(); - ~TAesClass(); - void InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes); //AES 密钥初始化 - DWORD OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer); //AES 加密数据 - DWORD OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer); //AES 解密数据 -private: - Aes * m_lpAes; -}; -#endif +#ifndef __TAESCLASS_H__ +#define __TAESCLASS_H__ +#include +#include +#include +#include + +typedef unsigned long DWORD; +typedef unsigned char UCHAR,*PUCHAR; +typedef void *PVOID,*LPVOID; +typedef unsigned char byte; +typedef DWORD *PDWORD,*LPDWORD; + +#ifndef VOID +#define VOID void +#endif + +//#pragma once + +//enum KeySize { Bits128, Bits192, Bits256 }; // key size, in bits, for construtor +#define Bits128 16 +#define Bits192 24 +#define Bits256 32 +#if 0 +static unsigned char AesSbox[16*16]= +{// populate the Sbox matrix + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +static unsigned char AesiSbox[16*16]= +{ + // populate the iSbox matrix + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; +static unsigned char AesRcon[11*4]= +{ + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00 +}; +#endif +extern unsigned char AesSbox[16*16]; +extern unsigned char AesiSbox[16*16]; +extern unsigned char AesRcon[11*4]; +class Aes // Advanced Encryption Standard +{ +public: + ~Aes(); + Aes(); + Aes(int keySize, unsigned char* keyBytes); + unsigned char State[4][4]; + void Cipher(unsigned char* input, unsigned char* output); // encipher 16-bit input + void InvCipher(unsigned char* input, unsigned char* output); // decipher 16-bit input +private: + int Nb; // block size in 32-bit words. Always 4 for AES. (128 bits). + int Nk; // key size in 32-bit words. 4, 6, 8. (128, 192, 256 bits). + int Nr; // number of rounds. 10, 12, 14. + + unsigned char key[32]; + unsigned char w[16*15]; + + void SetNbNkNr(int keySize); + void AddRoundKey(int round); //轮密钥加 + void SubBytes(); //S盒字节代换 + void InvSubBytes(); //逆S盒字节代换 + void ShiftRows(); //行移位 + void InvShiftRows(); + void MixColumns(); //列混淆 + void InvMixColumns(); + unsigned char gfmultby01(unsigned char b); + unsigned char gfmultby02(unsigned char b); + unsigned char gfmultby03(unsigned char b); + unsigned char gfmultby09(unsigned char b); + unsigned char gfmultby0b(unsigned char b); + unsigned char gfmultby0d(unsigned char b); + unsigned char gfmultby0e(unsigned char b); + void KeyExpansion(); //密钥扩展 + unsigned char* SubWord(unsigned char* word); //密钥S盒字代换 + unsigned char* RotWord(unsigned char* word); //密钥移位 + +}; + +class TAesClass +{ +public: + TAesClass(); + ~TAesClass(); + void InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes); //AES 密钥初始化 + DWORD OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer); //AES 加密数据 + DWORD OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer); //AES 解密数据 +private: + Aes * m_lpAes; +}; +#endif diff --git a/Binarization/Binarization.cpp b/Binarization/Binarization.cpp index 0eff500..b506c55 100644 --- a/Binarization/Binarization.cpp +++ b/Binarization/Binarization.cpp @@ -1,141 +1,141 @@ -#include "Binarization.h" - -CBinarization::CBinarization( QString imgPath ) - : threshold(0) -{ - // ¼ÓÔØͼƬ - _img = new QImage(); - if (NULL != _img) - { - _img->load(imgPath); - } -} - -// Éú³ɻҶÈͼÏñ -QImage* CBinarization::grayScaleImg() -{ - if (NULL == _img) - { - return NULL; - } - int nWidth = _img->width(); - int nHeight = _img->height(); - - // ÕâÀïÁôÒ⣬ÎÒʹÓÃÁËQImage::Format_Grayscale8¸ñʽµÄͼƬ£¬ÕâÖÖͼƬÿ¸öÏñËØֻÓÃÁË8bit´洢»ҶÈÑÕɫֵ - QImage* grayImg = new QImage(nWidth, nHeight, QImage::Format_RGB888); - QRgb rgbVal = 0; - int grayVal = 0; - - for (int x = 0; x < nWidth; ++x) - { - for (int y = 0; y < nHeight; ++y) - { - rgbVal = _img->pixel(x, y); - - grayVal = qGray(rgbVal); // ÕâÀïµ÷ÓÃQtµĺ¯Êý£¬ʹÓÃ(R * 11 + G * 16 + B * 5)/32µķ½·¨¼ÆËã - - grayImg->setPixel(x, y, QColor(grayVal, grayVal, grayVal).rgb()); - } - } - - return grayImg; -} - -int CBinarization::Otsu(QImage* img) -{ - if (NULL == img) - { - return -1; - } - vector histogram = Histogram(img); - int total = 0; - for (int i = 0; i != histogram.size(); ++i) - { - total += histogram[i]; - } - - double sum = 0.0; - for (unsigned int i = 1; i < histogram.size(); ++i) - sum += i * histogram[i]; - double sumB = 0.0; - double wB = 0.0; - double wF = 0.0; - double mB = 0.0; - double mF = 0.0; - double max = 0.0; - double between = 0.0; - double threshold = 0.0; - for (int i = 0; i != 256; ++i) - { - wB += histogram[i]; - if (wB == 0) - continue; - wF = total - wB; - if (wF == 0) - break; - sumB += i * histogram[i]; - mB = sumB / wB; - mF = (sum - sumB) / wF; - between = wB * wF * (mB - mF) * (mB - mF); - if ( between > max ) - { - threshold = i; - max = between; - } - } - return threshold; -} - -QImage* CBinarization::process(QImage* img) -{ - if (NULL == img) - { - return NULL; - } - int width = img->width(); - int height = img->height(); - int bytePerLine = img->bytesPerLine(); // ÿһÐеÄ×ֽÚÊý - unsigned char *data = img->bits(); - unsigned char *binarydata = new unsigned char[bytePerLine * height]; - - unsigned char g = 0; - for (int i = 0; i < height; ++i) - { - for (int j = 0; j < width; ++j) - { - g = *(data + i * bytePerLine + j * 3); // ÕâÀïj ³ËÒÔ 3 - if(int(g) >= threshold) - { - binarydata[ i * bytePerLine + j * 3] = 0xFF; // ÿ¸öɫֵÐèҪ¶Ô3¸ö×ֽڸ³ֵ - binarydata[ i * bytePerLine + j * 3 + 1] = 0xFF; - binarydata[ i * bytePerLine + j * 3 + 2] = 0xFF; - } - else - { - binarydata[ i * bytePerLine + j * 3] = 0x00; - binarydata[ i * bytePerLine + j * 3 + 1] = 0x00; - binarydata[ i * bytePerLine + j * 3 + 2] = 0x00; - } - } - } - - QImage *ret = new QImage(binarydata, width, height, bytePerLine, QImage::Format_RGB888); - return ret; -} - -std::vector CBinarization::Histogram( QImage* img ) -{ - unsigned char* graydata = img->bits(); - vector hist(256); // 256ɫ - for (int i = 0; i != img->width(); ++i) - { - for (int j = 0; j != img->height(); ++j) - { - int index = int(*graydata); - hist[index] += 1; - graydata += 1; // step - } - } - graydata = NULL; - return hist; -} +#include "Binarization.h" + +CBinarization::CBinarization( QString imgPath ) + : threshold(0) +{ + // ¼ÓÔØͼƬ + _img = new QImage(); + if (NULL != _img) + { + _img->load(imgPath); + } +} + +// Éú³ɻҶÈͼÏñ +QImage* CBinarization::grayScaleImg() +{ + if (NULL == _img) + { + return NULL; + } + int nWidth = _img->width(); + int nHeight = _img->height(); + + // ÕâÀïÁôÒ⣬ÎÒʹÓÃÁËQImage::Format_Grayscale8¸ñʽµÄͼƬ£¬ÕâÖÖͼƬÿ¸öÏñËØֻÓÃÁË8bit´洢»ҶÈÑÕɫֵ + QImage* grayImg = new QImage(nWidth, nHeight, QImage::Format_RGB888); + QRgb rgbVal = 0; + int grayVal = 0; + + for (int x = 0; x < nWidth; ++x) + { + for (int y = 0; y < nHeight; ++y) + { + rgbVal = _img->pixel(x, y); + + grayVal = qGray(rgbVal); // ÕâÀïµ÷ÓÃQtµĺ¯Êý£¬ʹÓÃ(R * 11 + G * 16 + B * 5)/32µķ½·¨¼ÆËã + + grayImg->setPixel(x, y, QColor(grayVal, grayVal, grayVal).rgb()); + } + } + + return grayImg; +} + +int CBinarization::Otsu(QImage* img) +{ + if (NULL == img) + { + return -1; + } + vector histogram = Histogram(img); + int total = 0; + for (int i = 0; i != histogram.size(); ++i) + { + total += histogram[i]; + } + + double sum = 0.0; + for (unsigned int i = 1; i < histogram.size(); ++i) + sum += i * histogram[i]; + double sumB = 0.0; + double wB = 0.0; + double wF = 0.0; + double mB = 0.0; + double mF = 0.0; + double max = 0.0; + double between = 0.0; + double threshold = 0.0; + for (int i = 0; i != 256; ++i) + { + wB += histogram[i]; + if (wB == 0) + continue; + wF = total - wB; + if (wF == 0) + break; + sumB += i * histogram[i]; + mB = sumB / wB; + mF = (sum - sumB) / wF; + between = wB * wF * (mB - mF) * (mB - mF); + if ( between > max ) + { + threshold = i; + max = between; + } + } + return threshold; +} + +QImage* CBinarization::process(QImage* img) +{ + if (NULL == img) + { + return NULL; + } + int width = img->width(); + int height = img->height(); + int bytePerLine = img->bytesPerLine(); // ÿһÐеÄ×ֽÚÊý + unsigned char *data = img->bits(); + unsigned char *binarydata = new unsigned char[bytePerLine * height]; + + unsigned char g = 0; + for (int i = 0; i < height; ++i) + { + for (int j = 0; j < width; ++j) + { + g = *(data + i * bytePerLine + j * 3); // ÕâÀïj ³ËÒÔ 3 + if(int(g) >= threshold) + { + binarydata[ i * bytePerLine + j * 3] = 0xFF; // ÿ¸öɫֵÐèҪ¶Ô3¸ö×ֽڸ³ֵ + binarydata[ i * bytePerLine + j * 3 + 1] = 0xFF; + binarydata[ i * bytePerLine + j * 3 + 2] = 0xFF; + } + else + { + binarydata[ i * bytePerLine + j * 3] = 0x00; + binarydata[ i * bytePerLine + j * 3 + 1] = 0x00; + binarydata[ i * bytePerLine + j * 3 + 2] = 0x00; + } + } + } + + QImage *ret = new QImage(binarydata, width, height, bytePerLine, QImage::Format_RGB888); + return ret; +} + +std::vector CBinarization::Histogram( QImage* img ) +{ + unsigned char* graydata = img->bits(); + vector hist(256); // 256ɫ + for (int i = 0; i != img->width(); ++i) + { + for (int j = 0; j != img->height(); ++j) + { + int index = int(*graydata); + hist[index] += 1; + graydata += 1; // step + } + } + graydata = NULL; + return hist; +} diff --git a/Binarization/Binarization.h b/Binarization/Binarization.h index 32a958d..e342802 100644 --- a/Binarization/Binarization.h +++ b/Binarization/Binarization.h @@ -1,24 +1,24 @@ -#ifndef CBINARIZATION_H -#define CBINARIZATION_H - -#include -#include - -using namespace std; - -class CBinarization -{ -public: - CBinarization(QString imgPath); - - QImage* grayScaleImg(); - int Otsu(QImage* img); - QImage* process(QImage* img); - int threshold; - -private: - QImage* _img; - - vector Histogram(QImage* img); -}; -#endif +#ifndef CBINARIZATION_H +#define CBINARIZATION_H + +#include +#include + +using namespace std; + +class CBinarization +{ +public: + CBinarization(QString imgPath); + + QImage* grayScaleImg(); + int Otsu(QImage* img); + QImage* process(QImage* img); + int threshold; + +private: + QImage* _img; + + vector Histogram(QImage* img); +}; +#endif diff --git a/Dbredis/dbredis.cpp b/Dbredis/dbredis.cpp index 494d54e..3b6ce8d 100644 --- a/Dbredis/dbredis.cpp +++ b/Dbredis/dbredis.cpp @@ -1,158 +1,158 @@ -#include "dbredis.h" -#include - -QSqlDatabase DBRedis::m_DataBase; -QString DBRedis::m_ConnectName = "dbredis"; -bool DBRedis::m_HasInit = false; - - -DBRedis::DBRedis() -{ - -} - -DBRedis::~DBRedis() -{ - if (m_DataBase.isOpen()) - { - m_DataBase.close(); - } -} - -int DBRedis::deleteExpiredEntries() -{ - int res = init(); - if (res) - { - return res; - } - - qint64 currentTimestamp = QDateTime::currentDateTime().toSecsSinceEpoch(); - QSqlQuery query(m_DataBase); - query.prepare("DELETE FROM data_store WHERE expiry > 0 AND expiry < :currentTimestamp"); - query.bindValue(":currentTimestamp", currentTimestamp); - - if (!query.exec()) - { - qDebug() << "Error deleting expired entries:" << query.lastError().text(); - return 1; - } - return 0; -} - - - -int DBRedis::setData(const QString & key, const QString & value, uint32_t expiry) -{ - int res = deleteExpiredEntries(); - if (res) - { - return res; - } - - QSqlQuery query(m_DataBase); - query.prepare("SELECT COUNT(*) FROM data_store WHERE key = :key"); - query.bindValue(":key", key); - if (!query.exec()) - { - qDebug() << "Error checking existing key"; - return 1; - } - int count = 0; - while (query.next()) - { - count += query.value(0).toInt(); - } - if (count > 0) - { - query.prepare("UPDATE data_store SET value = :value, expiry = :expiry WHERE key = :key"); - query.bindValue(":value", value); - query.bindValue(":expiry", expiry > 0 ? QDateTime::currentDateTime().toSecsSinceEpoch() + expiry : 0); - query.bindValue(":key", key); - } - else - { - query.prepare("INSERT INTO data_store (key, value, expiry) VALUES (:key, :value, :expiry)"); - query.bindValue(":key", key); - query.bindValue(":value", value); - query.bindValue(":expiry", expiry > 0 ? QDateTime::currentDateTime().toSecsSinceEpoch() + expiry : 0); - } - if (!query.exec()) - { - qDebug() << "Error setting value:" << query.lastError().text(); - return 1; - } - return 0; -} - -int DBRedis::getData(const QString & key, QString & value) -{ - value.clear(); - int res = deleteExpiredEntries(); - if (res) - { - return res; - } - - QSqlQuery query(m_DataBase); - query.prepare("SELECT value FROM data_store WHERE key = :key"); - query.bindValue(":key", key); - if (!query.exec()) - { - qDebug() << "Error getting value:" << query.lastError().text(); - return 1; - } - if (!query.next()) - { - qDebug() << "Error getting value:" << query.lastError().text(); - return 2; - } - value = query.value(0).toString(); - return 0; -} - -int DBRedis::deleteData(const QString & key) -{ - int res = deleteExpiredEntries(); - if (res) - { - return res; - } - - QSqlQuery query(m_DataBase); - query.prepare("DELETE FROM data_store WHERE key = :key"); - query.bindValue(":key", key); - if (!query.exec()) - { - qDebug() << "Error deleting value:" << query.lastError().text(); - return 1; - } - return 0; -} - -int DBRedis::init() -{ - if (m_HasInit) - { - return 0; - } - m_DataBase = QSqlDatabase::addDatabase("QSQLITE", m_ConnectName); - m_DataBase.setDatabaseName("dbredis.db"); - if (m_DataBase.open()) - { - QString table = "CREATE TABLE IF NOT EXISTS data_store(key TEXT, value TEXT, expiry INTEGER)"; - QSqlQuery query(QSqlDatabase::database(m_ConnectName)); - if (!query.exec(table.toUtf8())) - { - qDebug() << "Error deleting value:" << query.lastError().text(); - return 1; - } - } - else - { - qDebug() << "Error db open fail"; - return 3; - } - m_HasInit = true; - return 0; -} +#include "dbredis.h" +#include + +QSqlDatabase DBRedis::m_DataBase; +QString DBRedis::m_ConnectName = "dbredis"; +bool DBRedis::m_HasInit = false; + + +DBRedis::DBRedis() +{ + +} + +DBRedis::~DBRedis() +{ + if (m_DataBase.isOpen()) + { + m_DataBase.close(); + } +} + +int DBRedis::deleteExpiredEntries() +{ + int res = init(); + if (res) + { + return res; + } + + qint64 currentTimestamp = QDateTime::currentDateTime().toSecsSinceEpoch(); + QSqlQuery query(m_DataBase); + query.prepare("DELETE FROM data_store WHERE expiry > 0 AND expiry < :currentTimestamp"); + query.bindValue(":currentTimestamp", currentTimestamp); + + if (!query.exec()) + { + qDebug() << "Error deleting expired entries:" << query.lastError().text(); + return 1; + } + return 0; +} + + + +int DBRedis::setData(const QString & key, const QString & value, uint32_t expiry) +{ + int res = deleteExpiredEntries(); + if (res) + { + return res; + } + + QSqlQuery query(m_DataBase); + query.prepare("SELECT COUNT(*) FROM data_store WHERE key = :key"); + query.bindValue(":key", key); + if (!query.exec()) + { + qDebug() << "Error checking existing key"; + return 1; + } + int count = 0; + while (query.next()) + { + count += query.value(0).toInt(); + } + if (count > 0) + { + query.prepare("UPDATE data_store SET value = :value, expiry = :expiry WHERE key = :key"); + query.bindValue(":value", value); + query.bindValue(":expiry", expiry > 0 ? QDateTime::currentDateTime().toSecsSinceEpoch() + expiry : 0); + query.bindValue(":key", key); + } + else + { + query.prepare("INSERT INTO data_store (key, value, expiry) VALUES (:key, :value, :expiry)"); + query.bindValue(":key", key); + query.bindValue(":value", value); + query.bindValue(":expiry", expiry > 0 ? QDateTime::currentDateTime().toSecsSinceEpoch() + expiry : 0); + } + if (!query.exec()) + { + qDebug() << "Error setting value:" << query.lastError().text(); + return 1; + } + return 0; +} + +int DBRedis::getData(const QString & key, QString & value) +{ + value.clear(); + int res = deleteExpiredEntries(); + if (res) + { + return res; + } + + QSqlQuery query(m_DataBase); + query.prepare("SELECT value FROM data_store WHERE key = :key"); + query.bindValue(":key", key); + if (!query.exec()) + { + qDebug() << "Error getting value:" << query.lastError().text(); + return 1; + } + if (!query.next()) + { + qDebug() << "Error getting value:" << query.lastError().text(); + return 2; + } + value = query.value(0).toString(); + return 0; +} + +int DBRedis::deleteData(const QString & key) +{ + int res = deleteExpiredEntries(); + if (res) + { + return res; + } + + QSqlQuery query(m_DataBase); + query.prepare("DELETE FROM data_store WHERE key = :key"); + query.bindValue(":key", key); + if (!query.exec()) + { + qDebug() << "Error deleting value:" << query.lastError().text(); + return 1; + } + return 0; +} + +int DBRedis::init() +{ + if (m_HasInit) + { + return 0; + } + m_DataBase = QSqlDatabase::addDatabase("QSQLITE", m_ConnectName); + m_DataBase.setDatabaseName("dbredis.db"); + if (m_DataBase.open()) + { + QString table = "CREATE TABLE IF NOT EXISTS data_store(key TEXT, value TEXT, expiry INTEGER)"; + QSqlQuery query(QSqlDatabase::database(m_ConnectName)); + if (!query.exec(table.toUtf8())) + { + qDebug() << "Error deleting value:" << query.lastError().text(); + return 1; + } + } + else + { + qDebug() << "Error db open fail"; + return 3; + } + m_HasInit = true; + return 0; +} diff --git a/Dbredis/dbredis.h b/Dbredis/dbredis.h index adf79d8..f56ad43 100644 --- a/Dbredis/dbredis.h +++ b/Dbredis/dbredis.h @@ -1,80 +1,80 @@ -#ifndef __DBREDIS_H -#define __DBREDIS_H - -#include - - -class DBRedis -{ -public: - DBRedis(); - ~DBRedis(); - /*** - * @描述 : 设定值 - * @入参 : key 键 - value 值 - expiry 单位为秒 默认为 0 - 0 为永不过期 - 其他值必须大于0 - * @输出 : 无 - * @返回 : 0 成功 - 1 数据库错误 - 3 数据库错误 - */ - static int setData(const QString&key, const QString&value, uint32_t expiry = 0); - - - - /*** - * @描述 : 获取值 - * @入参 : key 键 - * @输出 : value 值 - * @返回 : 0 成功 - 1 数据库错误 - 2 不存在该数据或已过期 - 3 数据库错误 - */ - static int getData(const QString&key, QString&value); - - - /*** - * @描述 : 删除值 - * @入参 : key 键 - * @输出 : 无 - * @返回 : 0 成功 - 1 数据库错误 - 3 数据库错误 - */ - static int deleteData(const QString&key); -private: - static QSqlDatabase m_DataBase; - static QString m_ConnectName; - static bool m_HasInit; -private: - /*** - * @描述 : 初始化 - * @入参 : 无 - * @输出 : 无 - * @返回 : 0 成功 - 1 数据库错误 - 3 数据库错误 - */ - static int init(); - - - /*** - * @描述 : 删除过期的条目 - * @入参 : 无 - * @输出 : 无 - * @返回 : 0 成功 - 1 数据库错误 - 3 数据库错误 - */ - static int deleteExpiredEntries(); -}; - - - -#endif // !__DBREDIS_H - - +#ifndef __DBREDIS_H +#define __DBREDIS_H + +#include + + +class DBRedis +{ +public: + DBRedis(); + ~DBRedis(); + /*** + * @描述 : 设定值 + * @入参 : key 键 + value 值 + expiry 单位为秒 默认为 0 + 0 为永不过期 + 其他值必须大于0 + * @输出 : 无 + * @返回 : 0 成功 + 1 数据库错误 + 3 数据库错误 + */ + static int setData(const QString&key, const QString&value, uint32_t expiry = 0); + + + + /*** + * @描述 : 获取值 + * @入参 : key 键 + * @输出 : value 值 + * @返回 : 0 成功 + 1 数据库错误 + 2 不存在该数据或已过期 + 3 数据库错误 + */ + static int getData(const QString&key, QString&value); + + + /*** + * @描述 : 删除值 + * @入参 : key 键 + * @输出 : 无 + * @返回 : 0 成功 + 1 数据库错误 + 3 数据库错误 + */ + static int deleteData(const QString&key); +private: + static QSqlDatabase m_DataBase; + static QString m_ConnectName; + static bool m_HasInit; +private: + /*** + * @描述 : 初始化 + * @入参 : 无 + * @输出 : 无 + * @返回 : 0 成功 + 1 数据库错误 + 3 数据库错误 + */ + static int init(); + + + /*** + * @描述 : 删除过期的条目 + * @入参 : 无 + * @输出 : 无 + * @返回 : 0 成功 + 1 数据库错误 + 3 数据库错误 + */ + static int deleteExpiredEntries(); +}; + + + +#endif // !__DBREDIS_H + + diff --git a/DlgCanvasHeightEditor.cpp b/DlgCanvasHeightEditor.cpp index 61365f7..a059f5f 100644 --- a/DlgCanvasHeightEditor.cpp +++ b/DlgCanvasHeightEditor.cpp @@ -1,26 +1,26 @@ -#include "DlgCanvasHeightEditor.h" -#include "ui_DlgCanvasHeightEditor.h" - -DlgCanvasHeightEditor::DlgCanvasHeightEditor(QWidget *parent) : - QDialog(parent), - ui(new Ui::DlgCanvasHeightEditor) -{ - ui->setupUi(this); -} - -DlgCanvasHeightEditor::~DlgCanvasHeightEditor() -{ - delete ui; -} - -void DlgCanvasHeightEditor::setCanvsHeight(unsigned h) -{ - ui->sbCanvasHeight->setValue(h); -} - -unsigned DlgCanvasHeightEditor::canvasHeight() const -{ - return ui->sbCanvasHeight->value(); -} - - +#include "DlgCanvasHeightEditor.h" +#include "ui_DlgCanvasHeightEditor.h" + +DlgCanvasHeightEditor::DlgCanvasHeightEditor(QWidget *parent) : + QDialog(parent), + ui(new Ui::DlgCanvasHeightEditor) +{ + ui->setupUi(this); +} + +DlgCanvasHeightEditor::~DlgCanvasHeightEditor() +{ + delete ui; +} + +void DlgCanvasHeightEditor::setCanvsHeight(unsigned h) +{ + ui->sbCanvasHeight->setValue(h); +} + +unsigned DlgCanvasHeightEditor::canvasHeight() const +{ + return ui->sbCanvasHeight->value(); +} + + diff --git a/DlgCanvasHeightEditor.h b/DlgCanvasHeightEditor.h index 6bf19b1..ab7baed 100644 --- a/DlgCanvasHeightEditor.h +++ b/DlgCanvasHeightEditor.h @@ -1,26 +1,26 @@ -#ifndef DLGCANVASHEIGHTEDITOR_H -#define DLGCANVASHEIGHTEDITOR_H - -#include - -namespace Ui { -class DlgCanvasHeightEditor; -} - -class DlgCanvasHeightEditor : public QDialog -{ - Q_OBJECT - -public: - explicit DlgCanvasHeightEditor(QWidget *parent = nullptr); - ~DlgCanvasHeightEditor(); - - void setCanvsHeight(unsigned h); - - unsigned canvasHeight() const; - -private: - Ui::DlgCanvasHeightEditor *ui; -}; - -#endif // DLGCANVASHEIGHTEDITOR_H +#ifndef DLGCANVASHEIGHTEDITOR_H +#define DLGCANVASHEIGHTEDITOR_H + +#include + +namespace Ui { +class DlgCanvasHeightEditor; +} + +class DlgCanvasHeightEditor : public QDialog +{ + Q_OBJECT + +public: + explicit DlgCanvasHeightEditor(QWidget *parent = nullptr); + ~DlgCanvasHeightEditor(); + + void setCanvsHeight(unsigned h); + + unsigned canvasHeight() const; + +private: + Ui::DlgCanvasHeightEditor *ui; +}; + +#endif // DLGCANVASHEIGHTEDITOR_H diff --git a/DlgCanvasHeightEditor.ui b/DlgCanvasHeightEditor.ui index 91f963e..9e60a1f 100644 --- a/DlgCanvasHeightEditor.ui +++ b/DlgCanvasHeightEditor.ui @@ -1,172 +1,172 @@ - - - DlgCanvasHeightEditor - - - - 0 - 0 - 340 - 226 - - - - 窗口点阵设置 - - - QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - - - - - - 220 - 170 - 100 - 40 - - - - - 100 - 40 - - - - ✕ - - - - 80 - 80 - - - - - - - 100 - 170 - 101 - 40 - - - - - 100 - 40 - - - - ✓ - - - - - - 30 - 70 - 221 - 31 - - - - QAbstractSpinBox::NoButtons - - - 24 - - - 32 - - - 32 - - - - - - 30 - 30 - 211 - 31 - - - - 点阵高度 - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - - checkBtn - clicked() - DlgCanvasHeightEditor - accept() - - - 141 - 196 - - - 141 - 281 - - - - - closeBtn - clicked() - DlgCanvasHeightEditor - reject() - - - 275 - 189 - - - 297 - 304 - - - - - + + + DlgCanvasHeightEditor + + + + 0 + 0 + 340 + 226 + + + + 窗口点阵设置 + + + QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + + + + + + 220 + 170 + 100 + 40 + + + + + 100 + 40 + + + + ✕ + + + + 80 + 80 + + + + + + + 100 + 170 + 101 + 40 + + + + + 100 + 40 + + + + ✓ + + + + + + 30 + 70 + 221 + 31 + + + + QAbstractSpinBox::NoButtons + + + 24 + + + 32 + + + 32 + + + + + + 30 + 30 + 211 + 31 + + + + 点阵高度 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + checkBtn + clicked() + DlgCanvasHeightEditor + accept() + + + 141 + 196 + + + 141 + 281 + + + + + closeBtn + clicked() + DlgCanvasHeightEditor + reject() + + + 275 + 189 + + + 297 + 304 + + + + + diff --git a/DlgRFIDConfig.cpp b/DlgRFIDConfig.cpp index a4bfc14..1ccac13 100644 --- a/DlgRFIDConfig.cpp +++ b/DlgRFIDConfig.cpp @@ -1,39 +1,39 @@ -#include "DlgRFIDConfig.h" -#include "ui_DlgRFIDConfig.h" - -DlgRFIDConfig::DlgRFIDConfig(QWidget *parent) : - QDialog(parent), - ui(new Ui::DlgRFIDConfig) -{ - ui->setupUi(this); -} - -DlgRFIDConfig::~DlgRFIDConfig() -{ - delete ui; -} - -void DlgRFIDConfig::setAutoConfirmTimeout(int seconds) -{ - if(seconds == m_autoConfirmTimeout || seconds < 0 || seconds > ui->spinBox->maximum()) { - return; - } - - m_autoConfirmTimeout = seconds; - ui->spinBox->setValue(seconds); -} - -int DlgRFIDConfig::autoConfirmTimeout() -{ - m_autoConfirmTimeout = ui->spinBox->value(); - return m_autoConfirmTimeout; -} - -void DlgRFIDConfig::onExpirySpinBoxChanged(int val) -{ - if(val == 0) { - ui->labExplain->setText(tr(u8"卡片接触后需要手动确认。")); - } - else - ui->labExplain->setText(tr(u8"卡片接触 %1 秒后自动激活。").arg(val)); -} +#include "DlgRFIDConfig.h" +#include "ui_DlgRFIDConfig.h" + +DlgRFIDConfig::DlgRFIDConfig(QWidget *parent) : + QDialog(parent), + ui(new Ui::DlgRFIDConfig) +{ + ui->setupUi(this); +} + +DlgRFIDConfig::~DlgRFIDConfig() +{ + delete ui; +} + +void DlgRFIDConfig::setAutoConfirmTimeout(int seconds) +{ + if(seconds == m_autoConfirmTimeout || seconds < 0 || seconds > ui->spinBox->maximum()) { + return; + } + + m_autoConfirmTimeout = seconds; + ui->spinBox->setValue(seconds); +} + +int DlgRFIDConfig::autoConfirmTimeout() +{ + m_autoConfirmTimeout = ui->spinBox->value(); + return m_autoConfirmTimeout; +} + +void DlgRFIDConfig::onExpirySpinBoxChanged(int val) +{ + if(val == 0) { + ui->labExplain->setText(tr(u8"卡片接触后需要手动确认。")); + } + else + ui->labExplain->setText(tr(u8"卡片接触 %1 秒后自动激活。").arg(val)); +} diff --git a/DlgRFIDConfig.h b/DlgRFIDConfig.h index 8edb664..aef6213 100644 --- a/DlgRFIDConfig.h +++ b/DlgRFIDConfig.h @@ -1,34 +1,34 @@ -#ifndef DLGRFIDCONFIG_H -#define DLGRFIDCONFIG_H - -#include - -namespace Ui { -class DlgRFIDConfig; -} - -class DlgRFIDConfig : public QDialog -{ - Q_OBJECT - -public: - explicit DlgRFIDConfig(QWidget *parent = nullptr); - ~DlgRFIDConfig(); - - void setAutoConfirmTimeout(int seconds); - - int autoConfirmTimeout(); - -private slots: - void onExpirySpinBoxChanged(int val); - -signals: - void autoConfirmTimeoutChanged(); - -private: - Ui::DlgRFIDConfig *ui; - - int m_autoConfirmTimeout; -}; - -#endif // DLGRFIDCONFIG_H +#ifndef DLGRFIDCONFIG_H +#define DLGRFIDCONFIG_H + +#include + +namespace Ui { +class DlgRFIDConfig; +} + +class DlgRFIDConfig : public QDialog +{ + Q_OBJECT + +public: + explicit DlgRFIDConfig(QWidget *parent = nullptr); + ~DlgRFIDConfig(); + + void setAutoConfirmTimeout(int seconds); + + int autoConfirmTimeout(); + +private slots: + void onExpirySpinBoxChanged(int val); + +signals: + void autoConfirmTimeoutChanged(); + +private: + Ui::DlgRFIDConfig *ui; + + int m_autoConfirmTimeout; +}; + +#endif // DLGRFIDCONFIG_H diff --git a/DlgRFIDConfig.ui b/DlgRFIDConfig.ui index ca7742b..4bbb21f 100644 --- a/DlgRFIDConfig.ui +++ b/DlgRFIDConfig.ui @@ -1,153 +1,153 @@ - - - DlgRFIDConfig - - - - 0 - 0 - 340 - 222 - - - - Dialog - - - QWidget{ - font-size: 16px; -} - - - - - 230 - 170 - 81 - 31 - - - - 确定 - - - - - - 40 - 60 - 81 - 31 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - QAbstractSpinBox::NoButtons - - - - - - 40 - 30 - 221 - 31 - - - - 自动激活超时 - - - - - - 130 - 60 - 41 - 31 - - - - 秒 - - - - - - 40 - 100 - 271 - 61 - - - - 卡片接触 %1 秒后自动激活。 - - - Qt::AutoText - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - - - - - btnOk - clicked() - DlgRFIDConfig - accept() - - - 414 - 181 - - - 340 - 221 - - - - - btnOk - clicked() - DlgRFIDConfig - hide() - - - 396 - 184 - - - 301 - 221 - - - - - spinBox - valueChanged(int) - DlgRFIDConfig - onExpirySpinBoxChanged(int) - - - 78 - 81 - - - -81 - 81 - - - - - - onExpirySpinBoxChanged(int) - - + + + DlgRFIDConfig + + + + 0 + 0 + 340 + 222 + + + + Dialog + + + QWidget{ + font-size: 16px; +} + + + + + 230 + 170 + 81 + 31 + + + + 确定 + + + + + + 40 + 60 + 81 + 31 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::NoButtons + + + + + + 40 + 30 + 221 + 31 + + + + 自动激活超时 + + + + + + 130 + 60 + 41 + 31 + + + + 秒 + + + + + + 40 + 100 + 271 + 61 + + + + 卡片接触 %1 秒后自动激活。 + + + Qt::AutoText + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + btnOk + clicked() + DlgRFIDConfig + accept() + + + 414 + 181 + + + 340 + 221 + + + + + btnOk + clicked() + DlgRFIDConfig + hide() + + + 396 + 184 + + + 301 + 221 + + + + + spinBox + valueChanged(int) + DlgRFIDConfig + onExpirySpinBoxChanged(int) + + + 78 + 81 + + + -81 + 81 + + + + + + onExpirySpinBoxChanged(int) + + diff --git a/DlgVoltePara25Dots.cpp b/DlgVoltePara25Dots.cpp index 8db892d..13aea68 100644 --- a/DlgVoltePara25Dots.cpp +++ b/DlgVoltePara25Dots.cpp @@ -1,423 +1,423 @@ -#include "DlgVoltePara25Dots.h" -#include "DevOp.h" -#include -#include -#include -#include - -DlgVoltePara25Dots::DlgVoltePara25Dots(DevOp *devOp, QWidget *parent) - : QDialog(parent) - , m_devOp(devOp) - , tableSingleDot1(nullptr) - , tableSingleDotFirst1(nullptr) - , table2Dots(nullptr) - , table3Dots(nullptr) - , table4Dots(nullptr) - , table5Dots(nullptr) - , tableContinuous(nullptr) - , tableDiffVoltage(nullptr) - , tableExtraLine(nullptr) - , tableFirstOnePointExtra(nullptr) - , tableAdjustPara(nullptr) - , tableGiantPoint(nullptr) -{ - setupUI(); -} - -DlgVoltePara25Dots::~DlgVoltePara25Dots() -{ -} - -// 创建通用表格 -QTableWidget* DlgVoltePara25Dots::createTable(int rows, int cols, int minVal, int maxVal) -{ - QTableWidget *table = new QTableWidget(rows, cols, this); - table->setMinimumHeight(200); - - // 设置行头(通道编号) - QStringList rowHeaders; - for (int i = 0; i < rows; i++) { - rowHeaders << QString::number(i); - } - table->setVerticalHeaderLabels(rowHeaders); - - // 设置列头(点序号) - QStringList colHeaders; - for (int i = 0; i < cols; i++) { - if (cols == 1) - colHeaders << QString("值"); - else - colHeaders << QString("点%1").arg(i + 1); - } - table->setHorizontalHeaderLabels(colHeaders); - - // 初始化所有单元格为 0 - for (int r = 0; r < rows; r++) { - for (int c = 0; c < cols; c++) { - QTableWidgetItem *item = new QTableWidgetItem("0"); - item->setTextAlignment(Qt::AlignCenter); - table->setItem(r, c, item); - } - } - - // 设置行高适配触屏 - table->verticalHeader()->setDefaultSectionSize(30); - table->horizontalHeader()->setDefaultSectionSize(60); - - Q_UNUSED(minVal); - Q_UNUSED(maxVal); - - return table; -} - -void DlgVoltePara25Dots::setupUI() -{ - setWindowTitle(QString("25点阵充电参数编辑")); - resize(800, 600); - - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(4, 4, 4, 4); - mainLayout->setSpacing(4); - - // 选项卡 - tabWidget = new QTabWidget(this); - tabWidget->addTab(createTab_SingleDot(), QString("单点")); - tabWidget->addTab(createTab_2Dots(), QString("2点连续")); - tabWidget->addTab(createTab_3Dots(), QString("3点连续")); - tabWidget->addTab(createTab_4Dots(), QString("4点连续")); - tabWidget->addTab(createTab_5Dots(), QString("5点连续")); - tabWidget->addTab(createTab_Continuous(), QString("连续点")); - tabWidget->addTab(createTab_DiffVoltage(), QString("差分补偿")); - tabWidget->addTab(createTab_ExtraLine(), QString("行补偿")); - tabWidget->addTab(createTab_GiantPoint(), QString("巨点补偿")); - mainLayout->addWidget(tabWidget); - - // 底部按钮栏 - QHBoxLayout *btnLayout = new QHBoxLayout(); - btnLoad = new QPushButton(QString("读取当前值"), this); - btnSave = new QPushButton(QString("保存并推送FPGA"), this); - btnLoad->setMinimumHeight(40); - btnSave->setMinimumHeight(40); - btnLayout->addWidget(btnLoad); - btnLayout->addStretch(); - btnLayout->addWidget(btnSave); - mainLayout->addLayout(btnLayout); - - connect(btnLoad, SIGNAL(clicked()), this, SLOT(onBtnLoadClicked())); - connect(btnSave, SIGNAL(clicked()), this, SLOT(onBtnSaveClicked())); -} - -// ========== 选项卡创建 ========== - -QWidget* DlgVoltePara25Dots::createTab_SingleDot() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - QLabel *label1 = new QLabel(QString("单点 DAC (matchTotalTableDACArray1)"), page); - tableSingleDot1 = createTable(64, 1, 0, 65535); - layout->addWidget(label1); - layout->addWidget(tableSingleDot1); - - QLabel *label2 = new QLabel(QString("首单点 DAC (matchTotalTableDACArrayFirst1)"), page); - tableSingleDotFirst1 = createTable(64, 1, 0, 65535); - layout->addWidget(label2); - layout->addWidget(tableSingleDotFirst1); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_2Dots() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - table2Dots = createTable(64, 2, 0, 65535); - layout->addWidget(table2Dots); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_3Dots() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - table3Dots = createTable(64, 3, 0, 65535); - layout->addWidget(table3Dots); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_4Dots() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - table4Dots = createTable(64, 4, 0, 65535); - layout->addWidget(table4Dots); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_5Dots() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - table5Dots = createTable(64, 5, 0, 65535); - layout->addWidget(table5Dots); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_Continuous() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - QLabel *label = new QLabel(QString("连续点 DAC (matchContinousDACArray)"), page); - tableContinuous = createTable(64, 1, 0, 65535); - layout->addWidget(label); - layout->addWidget(tableContinuous); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_DiffVoltage() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - QLabel *label = new QLabel(QString("差分电压补偿 (matchTotalDiffVoltageValue) [50×64]"), page); - tableDiffVoltage = createTable(50, 64, -128, 127); - layout->addWidget(label); - layout->addWidget(tableDiffVoltage); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_ExtraLine() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - QLabel *label1 = new QLabel(QString("额外行补偿 (matchExtraLineDACArray)"), page); - tableExtraLine = createTable(64, 1, 0, 255); - layout->addWidget(label1); - layout->addWidget(tableExtraLine); - - QLabel *label2 = new QLabel(QString("首单点行补偿 (matchFirstOnePointExtraLineDACArray)"), page); - tableFirstOnePointExtra = createTable(64, 1, -128, 127); - layout->addWidget(label2); - layout->addWidget(tableFirstOnePointExtra); - - return page; -} - -QWidget* DlgVoltePara25Dots::createTab_GiantPoint() -{ - QWidget *page = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(page); - - QLabel *label1 = new QLabel(QString("巨点调整参数 (matchAdjustParaDACArray) [8]"), page); - tableAdjustPara = createTable(8, 1, -128, 127); - layout->addWidget(label1); - layout->addWidget(tableAdjustPara); - - QLabel *label2 = new QLabel(QString("巨点电压补偿 (matchGiantPointVoltageValue) [16×64]"), page); - tableGiantPoint = createTable(16, 64, -128, 127); - layout->addWidget(label2); - layout->addWidget(tableGiantPoint); - - return page; -} - -// ========== 数据加载:结构体 → UI ========== - -void DlgVoltePara25Dots::loadDataToUI() -{ - if (!sysPara) return; - - voltePara_t_25Dots &data = sysPara->voltePara_25Dots; - - // matchTotalTableDACArray1[64] - for (int i = 0; i < 64; i++) { - tableSingleDot1->item(i, 0)->setText(QString::number(data.matchTotalTableDACArray1[i])); - } - - // matchTotalTableDACArrayFirst1[64] - for (int i = 0; i < 64; i++) { - tableSingleDotFirst1->item(i, 0)->setText(QString::number(data.matchTotalTableDACArrayFirst1[i])); - } - - // matchTotalTableDACArray2[64][2] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 2; j++) { - table2Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray2[i][j])); - } - } - - // matchTotalTableDACArray3[64][3] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 3; j++) { - table3Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray3[i][j])); - } - } - - // matchTotalTableDACArray4[64][4] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 4; j++) { - table4Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray4[i][j])); - } - } - - // matchTotalTableDACArray5[64][5] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 5; j++) { - table5Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray5[i][j])); - } - } - - // matchContinousDACArray[64] - for (int i = 0; i < 64; i++) { - tableContinuous->item(i, 0)->setText(QString::number(data.matchContinousDACArray[i])); - } - - // matchTotalDiffVoltageValue[50][64] - for (int i = 0; i < 50; i++) { - for (int j = 0; j < 64; j++) { - tableDiffVoltage->item(i, j)->setText(QString::number((qint8)data.matchTotalDiffVoltageValue[i][j])); - } - } - - // matchExtraLineDACArray[64] - for (int i = 0; i < 64; i++) { - tableExtraLine->item(i, 0)->setText(QString::number(data.matchExtraLineDACArray[i])); - } - - // matchFirstOnePointExtraLineDACArray[64] - for (int i = 0; i < 64; i++) { - tableFirstOnePointExtra->item(i, 0)->setText(QString::number((qint8)data.matchFirstOnePointExtraLineDACArray[i])); - } - - // matchAdjustParaDACArray[8] - for (int i = 0; i < 8; i++) { - tableAdjustPara->item(i, 0)->setText(QString::number((qint8)data.matchAdjustParaDACArray[i])); - } - - // matchGiantPointVoltageValue[16][64] - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 64; j++) { - tableGiantPoint->item(i, j)->setText(QString::number((qint8)data.matchGiantPointVoltageValue[i][j])); - } - } -} - -// ========== 数据保存:UI → 结构体 ========== - -void DlgVoltePara25Dots::saveDataFromUI() -{ - if (!sysPara) return; - - voltePara_t_25Dots &data = sysPara->voltePara_25Dots; - - // matchTotalTableDACArray1[64] - for (int i = 0; i < 64; i++) { - data.matchTotalTableDACArray1[i] = (quint16)tableSingleDot1->item(i, 0)->text().toUInt(); - } - - // matchTotalTableDACArrayFirst1[64] - for (int i = 0; i < 64; i++) { - data.matchTotalTableDACArrayFirst1[i] = (quint16)tableSingleDotFirst1->item(i, 0)->text().toUInt(); - } - - // matchTotalTableDACArray2[64][2] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 2; j++) { - data.matchTotalTableDACArray2[i][j] = (quint16)table2Dots->item(i, j)->text().toUInt(); - } - } - - // matchTotalTableDACArray3[64][3] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 3; j++) { - data.matchTotalTableDACArray3[i][j] = (quint16)table3Dots->item(i, j)->text().toUInt(); - } - } - - // matchTotalTableDACArray4[64][4] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 4; j++) { - data.matchTotalTableDACArray4[i][j] = (quint16)table4Dots->item(i, j)->text().toUInt(); - } - } - - // matchTotalTableDACArray5[64][5] - for (int i = 0; i < 64; i++) { - for (int j = 0; j < 5; j++) { - data.matchTotalTableDACArray5[i][j] = (quint16)table5Dots->item(i, j)->text().toUInt(); - } - } - - // matchContinousDACArray[64] - for (int i = 0; i < 64; i++) { - data.matchContinousDACArray[i] = (quint16)tableContinuous->item(i, 0)->text().toUInt(); - } - - // matchTotalDiffVoltageValue[50][64] - for (int i = 0; i < 50; i++) { - for (int j = 0; j < 64; j++) { - data.matchTotalDiffVoltageValue[i][j] = (qint8)tableDiffVoltage->item(i, j)->text().toInt(); - } - } - - // matchExtraLineDACArray[64] - for (int i = 0; i < 64; i++) { - data.matchExtraLineDACArray[i] = (quint8)tableExtraLine->item(i, 0)->text().toUInt(); - } - - // matchFirstOnePointExtraLineDACArray[64] - for (int i = 0; i < 64; i++) { - data.matchFirstOnePointExtraLineDACArray[i] = (qint8)tableFirstOnePointExtra->item(i, 0)->text().toInt(); - } - - // matchAdjustParaDACArray[8] - for (int i = 0; i < 8; i++) { - data.matchAdjustParaDACArray[i] = (qint8)tableAdjustPara->item(i, 0)->text().toInt(); - } - - // matchGiantPointVoltageValue[16][64] - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 64; j++) { - data.matchGiantPointVoltageValue[i][j] = (qint8)tableGiantPoint->item(i, j)->text().toInt(); - } - } -} - -// ========== 按钮槽函数 ========== - -void DlgVoltePara25Dots::onBtnLoadClicked() -{ - loadDataToUI(); -} - -void DlgVoltePara25Dots::onBtnSaveClicked() -{ - int ret = QMessageBox::question(this, - QString("确认"), - QString("确定要将修改后的充电参数写入FPGA吗?"), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No); - - if (ret != QMessageBox::Yes) - return; - - saveDataFromUI(); - - if (m_devOp) { - m_devOp->writeDacValue2Fpga_No72NewVoltData(); - } - - QMessageBox::information(this, QString("完成"), QString("充电参数已保存并推送至FPGA。")); -} +#include "DlgVoltePara25Dots.h" +#include "DevOp.h" +#include +#include +#include +#include + +DlgVoltePara25Dots::DlgVoltePara25Dots(DevOp *devOp, QWidget *parent) + : QDialog(parent) + , m_devOp(devOp) + , tableSingleDot1(nullptr) + , tableSingleDotFirst1(nullptr) + , table2Dots(nullptr) + , table3Dots(nullptr) + , table4Dots(nullptr) + , table5Dots(nullptr) + , tableContinuous(nullptr) + , tableDiffVoltage(nullptr) + , tableExtraLine(nullptr) + , tableFirstOnePointExtra(nullptr) + , tableAdjustPara(nullptr) + , tableGiantPoint(nullptr) +{ + setupUI(); +} + +DlgVoltePara25Dots::~DlgVoltePara25Dots() +{ +} + +// 创建通用表格 +QTableWidget* DlgVoltePara25Dots::createTable(int rows, int cols, int minVal, int maxVal) +{ + QTableWidget *table = new QTableWidget(rows, cols, this); + table->setMinimumHeight(200); + + // 设置行头(通道编号) + QStringList rowHeaders; + for (int i = 0; i < rows; i++) { + rowHeaders << QString::number(i); + } + table->setVerticalHeaderLabels(rowHeaders); + + // 设置列头(点序号) + QStringList colHeaders; + for (int i = 0; i < cols; i++) { + if (cols == 1) + colHeaders << QString("值"); + else + colHeaders << QString("点%1").arg(i + 1); + } + table->setHorizontalHeaderLabels(colHeaders); + + // 初始化所有单元格为 0 + for (int r = 0; r < rows; r++) { + for (int c = 0; c < cols; c++) { + QTableWidgetItem *item = new QTableWidgetItem("0"); + item->setTextAlignment(Qt::AlignCenter); + table->setItem(r, c, item); + } + } + + // 设置行高适配触屏 + table->verticalHeader()->setDefaultSectionSize(30); + table->horizontalHeader()->setDefaultSectionSize(60); + + Q_UNUSED(minVal); + Q_UNUSED(maxVal); + + return table; +} + +void DlgVoltePara25Dots::setupUI() +{ + setWindowTitle(QString("25点阵充电参数编辑")); + resize(800, 600); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(4, 4, 4, 4); + mainLayout->setSpacing(4); + + // 选项卡 + tabWidget = new QTabWidget(this); + tabWidget->addTab(createTab_SingleDot(), QString("单点")); + tabWidget->addTab(createTab_2Dots(), QString("2点连续")); + tabWidget->addTab(createTab_3Dots(), QString("3点连续")); + tabWidget->addTab(createTab_4Dots(), QString("4点连续")); + tabWidget->addTab(createTab_5Dots(), QString("5点连续")); + tabWidget->addTab(createTab_Continuous(), QString("连续点")); + tabWidget->addTab(createTab_DiffVoltage(), QString("差分补偿")); + tabWidget->addTab(createTab_ExtraLine(), QString("行补偿")); + tabWidget->addTab(createTab_GiantPoint(), QString("巨点补偿")); + mainLayout->addWidget(tabWidget); + + // 底部按钮栏 + QHBoxLayout *btnLayout = new QHBoxLayout(); + btnLoad = new QPushButton(QString("读取当前值"), this); + btnSave = new QPushButton(QString("保存并推送FPGA"), this); + btnLoad->setMinimumHeight(40); + btnSave->setMinimumHeight(40); + btnLayout->addWidget(btnLoad); + btnLayout->addStretch(); + btnLayout->addWidget(btnSave); + mainLayout->addLayout(btnLayout); + + connect(btnLoad, SIGNAL(clicked()), this, SLOT(onBtnLoadClicked())); + connect(btnSave, SIGNAL(clicked()), this, SLOT(onBtnSaveClicked())); +} + +// ========== 选项卡创建 ========== + +QWidget* DlgVoltePara25Dots::createTab_SingleDot() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label1 = new QLabel(QString("单点 DAC (matchTotalTableDACArray1)"), page); + tableSingleDot1 = createTable(64, 1, 0, 65535); + layout->addWidget(label1); + layout->addWidget(tableSingleDot1); + + QLabel *label2 = new QLabel(QString("首单点 DAC (matchTotalTableDACArrayFirst1)"), page); + tableSingleDotFirst1 = createTable(64, 1, 0, 65535); + layout->addWidget(label2); + layout->addWidget(tableSingleDotFirst1); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_2Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table2Dots = createTable(64, 2, 0, 65535); + layout->addWidget(table2Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_3Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table3Dots = createTable(64, 3, 0, 65535); + layout->addWidget(table3Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_4Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table4Dots = createTable(64, 4, 0, 65535); + layout->addWidget(table4Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_5Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table5Dots = createTable(64, 5, 0, 65535); + layout->addWidget(table5Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_Continuous() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label = new QLabel(QString("连续点 DAC (matchContinousDACArray)"), page); + tableContinuous = createTable(64, 1, 0, 65535); + layout->addWidget(label); + layout->addWidget(tableContinuous); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_DiffVoltage() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label = new QLabel(QString("差分电压补偿 (matchTotalDiffVoltageValue) [50×64]"), page); + tableDiffVoltage = createTable(50, 64, -128, 127); + layout->addWidget(label); + layout->addWidget(tableDiffVoltage); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_ExtraLine() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label1 = new QLabel(QString("额外行补偿 (matchExtraLineDACArray)"), page); + tableExtraLine = createTable(64, 1, 0, 255); + layout->addWidget(label1); + layout->addWidget(tableExtraLine); + + QLabel *label2 = new QLabel(QString("首单点行补偿 (matchFirstOnePointExtraLineDACArray)"), page); + tableFirstOnePointExtra = createTable(64, 1, -128, 127); + layout->addWidget(label2); + layout->addWidget(tableFirstOnePointExtra); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_GiantPoint() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label1 = new QLabel(QString("巨点调整参数 (matchAdjustParaDACArray) [8]"), page); + tableAdjustPara = createTable(8, 1, -128, 127); + layout->addWidget(label1); + layout->addWidget(tableAdjustPara); + + QLabel *label2 = new QLabel(QString("巨点电压补偿 (matchGiantPointVoltageValue) [16×64]"), page); + tableGiantPoint = createTable(16, 64, -128, 127); + layout->addWidget(label2); + layout->addWidget(tableGiantPoint); + + return page; +} + +// ========== 数据加载:结构体 → UI ========== + +void DlgVoltePara25Dots::loadDataToUI() +{ + if (!sysPara) return; + + voltePara_t_25Dots &data = sysPara->voltePara_25Dots; + + // matchTotalTableDACArray1[64] + for (int i = 0; i < 64; i++) { + tableSingleDot1->item(i, 0)->setText(QString::number(data.matchTotalTableDACArray1[i])); + } + + // matchTotalTableDACArrayFirst1[64] + for (int i = 0; i < 64; i++) { + tableSingleDotFirst1->item(i, 0)->setText(QString::number(data.matchTotalTableDACArrayFirst1[i])); + } + + // matchTotalTableDACArray2[64][2] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 2; j++) { + table2Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray2[i][j])); + } + } + + // matchTotalTableDACArray3[64][3] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 3; j++) { + table3Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray3[i][j])); + } + } + + // matchTotalTableDACArray4[64][4] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 4; j++) { + table4Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray4[i][j])); + } + } + + // matchTotalTableDACArray5[64][5] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 5; j++) { + table5Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray5[i][j])); + } + } + + // matchContinousDACArray[64] + for (int i = 0; i < 64; i++) { + tableContinuous->item(i, 0)->setText(QString::number(data.matchContinousDACArray[i])); + } + + // matchTotalDiffVoltageValue[50][64] + for (int i = 0; i < 50; i++) { + for (int j = 0; j < 64; j++) { + tableDiffVoltage->item(i, j)->setText(QString::number((qint8)data.matchTotalDiffVoltageValue[i][j])); + } + } + + // matchExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + tableExtraLine->item(i, 0)->setText(QString::number(data.matchExtraLineDACArray[i])); + } + + // matchFirstOnePointExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + tableFirstOnePointExtra->item(i, 0)->setText(QString::number((qint8)data.matchFirstOnePointExtraLineDACArray[i])); + } + + // matchAdjustParaDACArray[8] + for (int i = 0; i < 8; i++) { + tableAdjustPara->item(i, 0)->setText(QString::number((qint8)data.matchAdjustParaDACArray[i])); + } + + // matchGiantPointVoltageValue[16][64] + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 64; j++) { + tableGiantPoint->item(i, j)->setText(QString::number((qint8)data.matchGiantPointVoltageValue[i][j])); + } + } +} + +// ========== 数据保存:UI → 结构体 ========== + +void DlgVoltePara25Dots::saveDataFromUI() +{ + if (!sysPara) return; + + voltePara_t_25Dots &data = sysPara->voltePara_25Dots; + + // matchTotalTableDACArray1[64] + for (int i = 0; i < 64; i++) { + data.matchTotalTableDACArray1[i] = (quint16)tableSingleDot1->item(i, 0)->text().toUInt(); + } + + // matchTotalTableDACArrayFirst1[64] + for (int i = 0; i < 64; i++) { + data.matchTotalTableDACArrayFirst1[i] = (quint16)tableSingleDotFirst1->item(i, 0)->text().toUInt(); + } + + // matchTotalTableDACArray2[64][2] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 2; j++) { + data.matchTotalTableDACArray2[i][j] = (quint16)table2Dots->item(i, j)->text().toUInt(); + } + } + + // matchTotalTableDACArray3[64][3] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 3; j++) { + data.matchTotalTableDACArray3[i][j] = (quint16)table3Dots->item(i, j)->text().toUInt(); + } + } + + // matchTotalTableDACArray4[64][4] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 4; j++) { + data.matchTotalTableDACArray4[i][j] = (quint16)table4Dots->item(i, j)->text().toUInt(); + } + } + + // matchTotalTableDACArray5[64][5] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 5; j++) { + data.matchTotalTableDACArray5[i][j] = (quint16)table5Dots->item(i, j)->text().toUInt(); + } + } + + // matchContinousDACArray[64] + for (int i = 0; i < 64; i++) { + data.matchContinousDACArray[i] = (quint16)tableContinuous->item(i, 0)->text().toUInt(); + } + + // matchTotalDiffVoltageValue[50][64] + for (int i = 0; i < 50; i++) { + for (int j = 0; j < 64; j++) { + data.matchTotalDiffVoltageValue[i][j] = (qint8)tableDiffVoltage->item(i, j)->text().toInt(); + } + } + + // matchExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + data.matchExtraLineDACArray[i] = (quint8)tableExtraLine->item(i, 0)->text().toUInt(); + } + + // matchFirstOnePointExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + data.matchFirstOnePointExtraLineDACArray[i] = (qint8)tableFirstOnePointExtra->item(i, 0)->text().toInt(); + } + + // matchAdjustParaDACArray[8] + for (int i = 0; i < 8; i++) { + data.matchAdjustParaDACArray[i] = (qint8)tableAdjustPara->item(i, 0)->text().toInt(); + } + + // matchGiantPointVoltageValue[16][64] + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 64; j++) { + data.matchGiantPointVoltageValue[i][j] = (qint8)tableGiantPoint->item(i, j)->text().toInt(); + } + } +} + +// ========== 按钮槽函数 ========== + +void DlgVoltePara25Dots::onBtnLoadClicked() +{ + loadDataToUI(); +} + +void DlgVoltePara25Dots::onBtnSaveClicked() +{ + int ret = QMessageBox::question(this, + QString("确认"), + QString("确定要将修改后的充电参数写入FPGA吗?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + + if (ret != QMessageBox::Yes) + return; + + saveDataFromUI(); + + if (m_devOp) { + m_devOp->writeDacValue2Fpga_No72NewVoltData(); + } + + QMessageBox::information(this, QString("完成"), QString("充电参数已保存并推送至FPGA。")); +} diff --git a/DlgVoltePara25Dots.h b/DlgVoltePara25Dots.h index 5d20305..3b40c9c 100644 --- a/DlgVoltePara25Dots.h +++ b/DlgVoltePara25Dots.h @@ -1,70 +1,70 @@ -#ifndef DLGVOLTEPARA25DOTS_H -#define DLGVOLTEPARA25DOTS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include "ParaSettingUI.h" - -class DevOp; - -class DlgVoltePara25Dots : public QDialog, public ParaSettingUI -{ - Q_OBJECT - -public: - explicit DlgVoltePara25Dots(DevOp *devOp, QWidget *parent = nullptr); - ~DlgVoltePara25Dots(); - -public slots: - void onBtnLoadClicked(); - void onBtnSaveClicked(); - -private: - void setupUI(); - - // 创建各选项卡 - QWidget* createTab_SingleDot(); - QWidget* createTab_2Dots(); - QWidget* createTab_3Dots(); - QWidget* createTab_4Dots(); - QWidget* createTab_5Dots(); - QWidget* createTab_Continuous(); - QWidget* createTab_DiffVoltage(); - QWidget* createTab_ExtraLine(); - QWidget* createTab_GiantPoint(); - - // 辅助方法 - QTableWidget* createTable(int rows, int cols, int minVal, int maxVal); - void loadDataToUI(); - void saveDataFromUI(); - - // UI 控件 - QTabWidget *tabWidget; - QPushButton *btnLoad; - QPushButton *btnSave; - - // DevOp 指针,用于调用 writeDacValue2Fpga_No72NewVoltData - DevOp *m_devOp; - - // 各选项卡的表格指针 - QTableWidget *tableSingleDot1; // matchTotalTableDACArray1[64] - QTableWidget *tableSingleDotFirst1; // matchTotalTableDACArrayFirst1[64] - QTableWidget *table2Dots; // matchTotalTableDACArray2[64][2] - QTableWidget *table3Dots; // matchTotalTableDACArray3[64][3] - QTableWidget *table4Dots; // matchTotalTableDACArray4[64][4] - QTableWidget *table5Dots; // matchTotalTableDACArray5[64][5] - QTableWidget *tableContinuous; // matchContinousDACArray[64] - QTableWidget *tableDiffVoltage; // matchTotalDiffVoltageValue[50][64] - QTableWidget *tableExtraLine; // matchExtraLineDACArray[64] - QTableWidget *tableFirstOnePointExtra; // matchFirstOnePointExtraLineDACArray[64] - QTableWidget *tableAdjustPara; // matchAdjustParaDACArray[8] - QTableWidget *tableGiantPoint; // matchGiantPointVoltageValue[16][64] -}; - -#endif // DLGVOLTEPARA25DOTS_H +#ifndef DLGVOLTEPARA25DOTS_H +#define DLGVOLTEPARA25DOTS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ParaSettingUI.h" + +class DevOp; + +class DlgVoltePara25Dots : public QDialog, public ParaSettingUI +{ + Q_OBJECT + +public: + explicit DlgVoltePara25Dots(DevOp *devOp, QWidget *parent = nullptr); + ~DlgVoltePara25Dots(); + +public slots: + void onBtnLoadClicked(); + void onBtnSaveClicked(); + +private: + void setupUI(); + + // 创建各选项卡 + QWidget* createTab_SingleDot(); + QWidget* createTab_2Dots(); + QWidget* createTab_3Dots(); + QWidget* createTab_4Dots(); + QWidget* createTab_5Dots(); + QWidget* createTab_Continuous(); + QWidget* createTab_DiffVoltage(); + QWidget* createTab_ExtraLine(); + QWidget* createTab_GiantPoint(); + + // 辅助方法 + QTableWidget* createTable(int rows, int cols, int minVal, int maxVal); + void loadDataToUI(); + void saveDataFromUI(); + + // UI 控件 + QTabWidget *tabWidget; + QPushButton *btnLoad; + QPushButton *btnSave; + + // DevOp 指针,用于调用 writeDacValue2Fpga_No72NewVoltData + DevOp *m_devOp; + + // 各选项卡的表格指针 + QTableWidget *tableSingleDot1; // matchTotalTableDACArray1[64] + QTableWidget *tableSingleDotFirst1; // matchTotalTableDACArrayFirst1[64] + QTableWidget *table2Dots; // matchTotalTableDACArray2[64][2] + QTableWidget *table3Dots; // matchTotalTableDACArray3[64][3] + QTableWidget *table4Dots; // matchTotalTableDACArray4[64][4] + QTableWidget *table5Dots; // matchTotalTableDACArray5[64][5] + QTableWidget *tableContinuous; // matchContinousDACArray[64] + QTableWidget *tableDiffVoltage; // matchTotalDiffVoltageValue[50][64] + QTableWidget *tableExtraLine; // matchExtraLineDACArray[64] + QTableWidget *tableFirstOnePointExtra; // matchFirstOnePointExtraLineDACArray[64] + QTableWidget *tableAdjustPara; // matchAdjustParaDACArray[8] + QTableWidget *tableGiantPoint; // matchGiantPointVoltageValue[16][64] +}; + +#endif // DLGVOLTEPARA25DOTS_H diff --git a/InkJetPrinter.cpp b/InkJetPrinter.cpp index cd612d9..35618b3 100644 --- a/InkJetPrinter.cpp +++ b/InkJetPrinter.cpp @@ -1,3435 +1,3435 @@ -#include "InkJetPrinter.h" - -#include -//#include -#include -#include "VerBVersion.h" -#include -#include "DialogFileOperation.h" - -#ifdef __RFID_CARD -#define DETECT_WARNING_TIME 10 //Seconds -#define RFID_WARNING_INTERVAL 5 //Minutes -#endif - -#pragma execution_character_set("utf-8") - -extern MyInputMethod *myInputMethod; -extern unsigned char vartypeR; -static unsigned int PulseCnt = 0; //时间间隔内的脉冲累计数 -InkJetPrinter::InkJetPrinter(QWidget* parent) - : QWidget(parent) -{ - // 加载.ui文件生成的UI界面 - ui.setupUi(this); - - // 关联原有成员变量到UI控件(保持变量名和原代码一致) - m_LabelTimer = ui.m_LabelTimer; - m_StackedWidget = ui.m_StackedWidget; - - // 初始化业务逻辑(仅保留原init中的非UI创建部分) - init(); - initRunTimeCtrl(); -#ifdef __RFID_CARD - initRFIDManager(); -#endif - - QThread::sleep(3); - qApp->installEventFilter(this); - - // QString ARM_Version; - // ARM_Version.sprintf("%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); - // ui.label_version->setText(QString("A%1/F%2.%3.%4").arg(ARM_Version).arg(sysPara->status.fpgaVersionNum >> 12) - // .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff) ); - - -#ifdef ARCH_X86 - setFixedSize(800, 600); -#endif -} - -InkJetPrinter::~InkJetPrinter() -{ - if(m_serialThreadFPGA->isRunning()){ - m_serialThreadFPGA->requestInterruption(); - m_serialThreadFPGA->quit(); - m_serialThreadFPGA->wait(); - } - if(m_serialThreadSTM32->isRunning()){ - m_serialThreadSTM32->requestInterruption(); - m_serialThreadSTM32->quit(); - m_serialThreadSTM32->wait(); - } - if(serialFPGA){ - delete serialFPGA; - serialFPGA = nullptr; - } - if(serialSTM32){ - delete serialSTM32; - serialSTM32 = nullptr; - } -} - -void InkJetPrinter::init() -{ - // 创建自定义子控件(原逻辑不变) - m_MainWidget = new MainWidget(this); - m_TestPrintWidget = new TestPrintWidget(this); -// m_ErCodeSettingsWidget = new ErCodeSettingsWidget(this); -// m_MainInterfaceWidget = new MainInterfaceWidget(this); - - m_FontSetWidget = new FontSetWidget(this); - m_PrintSetting = new PrintSetting(this); - - m_BarCodeDlg = new QBarCode(this); - m_QRCodeDlg = new dlgQrCode(this); - - m_MainInstruction = new MainInstruction(this); - m_SystemManage = new SystemManage(this); - m_SystemUpdate = new SystemUpdate(this); - m_SystemSetting = new SystemSetting(this); - m_OtherInfo = new OtherInfo(this); - m_LogInfo = new LogInfo(this); - m_scheduleShiftsEditor = new ScheduleShiftsEditor(this); - m_DateVarSet = new DateVarSet(this); - m_CounterVarSet = new CounterVarSet(this); - m_dlgFileOperation = new DialogFileOperation(this); - - connect(m_dlgFileOperation, &DialogFileOperation::openFile, this, &InkJetPrinter::onDlgFileOpen); - - viscosity_timer = new QTimer(); - connect(viscosity_timer, SIGNAL(timeout()), this, SLOT(viscosity_timerHandler())); - - msgtest = new QMessageBox(this); - msgtest->setWindowTitle(tr("提示")); - connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int))); - - // 我真的不想拉,但是今天状态燃尽了,以后再改了 - m_TestPrintWidget->setPrintSettingWidget(m_PrintSetting); - - // 初始文件名为 空 - ui.label_currWorkFile->setText(""); - ui.label_currEditFile->setText(""); - - // 信号槽连接(原逻辑完全不变) - connect(m_MainWidget, &MainWidget::sendButtonClickedSignal, this, &InkJetPrinter::getMainWidgetButtonClickedSlot); - connect(m_MainWidget,SIGNAL(setDisableAll()),this,SLOT(disableTabClick())); - connect (m_MainWidget,SIGNAL(CloseJd()),this,SLOT(close_jd_timer())); - connect(m_MainWidget, &MainWidget::newFileAcquired, this, &InkJetPrinter::createNewJobFile); - connect(m_TestPrintWidget, &TestPrintWidget::sendButtonClickedSignal, this, &InkJetPrinter::getTestPrintWidgetButtonClickedSlot); - - // TestPrintWidget::sendButtonClickedSignal(16) 转由 openDatetimeEditor 处理 - connect(m_TestPrintWidget, &TestPrintWidget::sig_showEditDateTime, this, &InkJetPrinter::openDatetimeEditor); - connect(m_TestPrintWidget, &TestPrintWidget::sig_switchWorkFileRequested, this, &InkJetPrinter::slt_updatePrintContent); - - #ifndef FPGA_TEST - // 调入文件喷印时,主动重启打印 - // connect(m_TestPrintWidget, &TestPrintWidget::sig_currentFileChanged, this, [this](){ - - // ui.label_currWorkFile->setText(m_TestPrintWidget->currentFile()); - - // auto isPrinting = sysPara->status.isPrinting; - // if(isPrinting) { - // m_MainWidget->on_m_StopBtn_clicked(); - - // QTimer::singleShot(500, [this](){ - - // m_PrintSetting->applyPrintSettingsToSysPara(false); - - // m_MainWidget->on_m_StartBtn_clicked(); - // LogInfo::setRunStatusText("Restarting the print because the work file was switched."); - // }); - // } - // else { - // QTimer::singleShot(300, [this](){ - // m_PrintSetting->applyPrintSettingsToSysPara(false); - // }); - // } - // }); - #endif - - // 班时元素与编辑 连接 - connect(m_TestPrintWidget, &TestPrintWidget::sig_showScheduleShiftsEditor, this, &InkJetPrinter::showScheduleShiftsEditor); - connect(m_scheduleShiftsEditor, &ScheduleShiftsEditor::accepted, this, &InkJetPrinter::onScheduleShiftsEditDone); - connect(m_scheduleShiftsEditor, &ScheduleShiftsEditor::rejected, [this](){ - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - }); - -// connect(m_ErCodeSettingsWidget, &ErCodeSettingsWidget::sendButtonClickedSignal, this, &InkJetPrinter::getErCodeSettingsWidgetButtonClickedSlot); -// connect(m_MainInterfaceWidget, &MainInterfaceWidget::sendButtonClickedSignal, this, &InkJetPrinter::getErCodeSettingsWidgetButtonClickedSlot); - connect(m_MainWidget,&MainWidget::showVserionInfo,this,&InkJetPrinter::setShowVserionInfo); - - connect(m_FontSetWidget,&FontSetWidget::sendButtonClickedSignal,this,&InkJetPrinter::getFontSetWidgetButtonClickedSlot); - connect(m_PrintSetting,&PrintSetting::sendButtonClickedSignal,this,&InkJetPrinter::getPrintSettingButtonClickedSlot); - connect(m_MainInstruction,&MainInstruction::sendButtonClickedSignal,this,&InkJetPrinter::getMainInstructWidgetButtonClickedSlot); - connect(m_SystemManage,&SystemManage::sendButtonClickedSignal,this,&InkJetPrinter::getSystemManageWidgetButtonClickSlot); - connect(m_SystemSetting,&SystemSetting::sendButtonClickedSignal,this,&InkJetPrinter::getSystemSettingWidgetButtonClickSlot); - connect(m_OtherInfo,&OtherInfo::sendButtonClickedSignal,this,&InkJetPrinter::getOtherInfoWidgetButtonClickSlot); - connect(m_LogInfo,&LogInfo::sendButtonClickedSignal,this,&InkJetPrinter::getLogInfoWidgetButtonClickSlot); - - connect(m_DateVarSet,&DateVarSet::sendButtonClickedSignal,this,&InkJetPrinter::getDateSetWidgetButtonClickSlot); - //添加计数器,修改计数器 - connect(m_CounterVarSet,&CounterVarSet::sendButtonClickedSignal,this,&InkJetPrinter::getCounterVarSetWidgetButtonClickSlot); - connect(m_CounterVarSet,&CounterVarSet::sig_updateSelectedCounter,this,&InkJetPrinter::slt_counterVarUpdate); - - connect(m_MainInstruction,&MainInstruction::newFileBtnClick,m_TestPrintWidget,&TestPrintWidget::on_newfileButton_pressed); - - connect(m_MainInstruction, &MainInstruction::superJmAccepted, this, &InkJetPrinter::resetRFIDStatus); - -// connect(myInputMethod,&MyInputMethod::sendEnterClickedSignal,&TestPrintWidget::onEditItemDone); - // connect(myInputMethod,SIGNAL(sendEnterClickedSignal()),m_TestPrintWidget,SLOT(onEditItemDone())); - connect(m_DateVarSet,SIGNAL(backSpaceBtn()),myInputMethod,SLOT(backSapceButtonDel())); - - connect (m_MainWidget,SIGNAL(repeatInitedPid()),this,SLOT(handleInitedPID())); - connect(m_MainWidget,SIGNAL(clearPressureFault()),this,SLOT(resetPressureCnt())); - connect(m_LogInfo,SIGNAL(faultTesumePress()),m_MainWidget,SLOT(onLabelFaultRusumePressed())); - - // 信号槽:用于修改计数器 - connect(m_TestPrintWidget, &TestPrintWidget::sig_showEditCounter, - this, &InkJetPrinter::slt_editCounter); - - // 状态界面 - if (ctrl_loginfo == nullptr) ctrl_loginfo = LogInfoCtrl::instance(); - connect(ctrl_loginfo, &LogInfoCtrl::sig_show, this, [=](){ - getMainWidgetButtonClickedSlot(5); - m_LogInfo->checkState(); - }); - - SysPara *para = new SysPara(); - sysPara = para; - m_MainWidget->bindSysPara(para); - m_FontSetWidget->bindSysPara(para); - m_PrintSetting->bindSysPara(para); - m_SystemManage->bindSysPara(para); - m_SystemSetting->bindSysPara(para); - m_OtherInfo->bindSysPara(para); - m_TestPrintWidget->bindSysPara(para); - m_DateVarSet->bindSysPara(para); - m_MainInstruction->bindSysPara(para); - m_BarCodeDlg->bindSysPara(para); - m_QRCodeDlg->bindSysPara(para); - m_LogInfo->bindSysPara(para); - - if(sysPara->para.gearPumpEnable) - pushButtonStartFlag = true; - - m_PrintSetting->updateModelToUI(); - m_SystemSetting->updateSysParaToUI(); - m_OtherInfo->updateSysParaToUI(); - m_CounterVarSet->updateSysParaToUI(); - - m_SystemManage->loadKeyBoardType(); - - m_FontSetWidget->bindTxTEdit(m_TestPrintWidget->getQTextEdit()); - m_BarCodeDlg->bindTxTEdit(m_TestPrintWidget->getQTextEdit()); - m_QRCodeDlg->bindTxTEdit(m_TestPrintWidget->getQTextEdit()); - m_textEdit = m_TestPrintWidget->getQTextEdit(); - - // 添加子控件到StackedWidget(原逻辑不变) - m_StackedWidget->addWidget(m_MainWidget); - m_StackedWidget->addWidget(m_TestPrintWidget); -// m_StackedWidget->addWidget(m_ErCodeSettingsWidget); -// m_StackedWidget->addWidget(m_MainInterfaceWidget); - - m_StackedWidget->addWidget(m_FontSetWidget); - m_StackedWidget->addWidget(m_BarCodeDlg); - m_StackedWidget->addWidget(m_QRCodeDlg); - - m_StackedWidget->addWidget(m_PrintSetting); - m_StackedWidget->addWidget(m_MainInstruction); - m_StackedWidget->addWidget(m_SystemManage); - m_StackedWidget->addWidget(m_SystemUpdate); - m_StackedWidget->addWidget(m_SystemSetting); - m_StackedWidget->addWidget(m_OtherInfo); - m_StackedWidget->addWidget(m_LogInfo); - m_StackedWidget->addWidget(m_scheduleShiftsEditor); - m_StackedWidget->addWidget(m_DateVarSet); - m_StackedWidget->addWidget(m_CounterVarSet); - - - // 创建 32 线程和 FPGA 线程,并初始化串口 - m_serialThreadFPGA = new QThread; - m_serialThreadSTM32 = new QThread(); - initSerialPorts(); - - connect(m_SystemManage,SIGNAL(sigToCloseSerialFPGA()),this,SLOT(closeSerialFPGA())); - connect(m_SystemManage,SIGNAL(sigToCloseSerialSTM32()),this,SLOT(closeSerialSTM32())); - connect(m_SystemManage,SIGNAL(restartSerial()),this,SLOT(restartSerialPort())); - connect(m_SystemManage, &SystemManage::rebootAppAcquired, this, &InkJetPrinter::rebootApp); - - connect(m_SystemManage,SIGNAL(enableClick(bool)),this,SLOT(enableInkJetTabClick(bool))); - connect(m_SystemManage,SIGNAL(upgradeSTM32(QString)),serialSTM32,SLOT(upgradeSTM32File(QString))); - connect(serialSTM32,SIGNAL(progress(int,int)),m_SystemManage,SLOT(progressBarControl(int,int))); - - /*系统更新的信号和槽*/ - connect(m_SystemUpdate,&SystemUpdate::sendProgramSTM32Signal,m_SystemManage,&SystemManage::on_pushButtonProgamSTM32_clicked); - connect(m_SystemUpdate,&SystemUpdate::sendProgramFPGASignal,m_SystemManage,&SystemManage::on_pushButtonProgamFPGA_clicked); - connect(m_SystemUpdate,&SystemUpdate::sendUpDateSOFTSignal,m_SystemManage,&SystemManage::on_pushButtonUpdateSoftware_pressed); - connect(m_SystemUpdate,&SystemUpdate::sendUpDateChARLIBSignal,m_SystemManage,&SystemManage::on_pushButtonUpdateCharLib_pressed); - connect(m_SystemUpdate,&SystemUpdate::sendButtonClickedSignal,this,&InkJetPrinter::getSystemManageWidgetButtonClickSlot); - connect(m_SystemUpdate,&SystemUpdate::sig_reboot,this,&InkJetPrinter::rebootApp); - - // 原注释的默认页面设置(按需启用) - sysPara->status.machineMac = m_MainInstruction->dlgInputAddr->jd.addr; - sysPara->para.rfidCountDown = 5; - - connect(this, &InkJetPrinter::pipingStatusChanged, this, &InkJetPrinter::checkStatusAndStartGearPump, Qt::QueuedConnection); - - timer = new QTimer(); - connect(timer, SIGNAL(timeout()), this, SLOT(timerHandler())); - timer->start(10); -} - -// type 1,2: 分别显示计数器1或2的界面 -void InkJetPrinter::slt_editCounter(CounterViewModel vm) -{ - if (m_CounterVarSet) { - m_CounterVarSet->updateSysParaToUI(); - m_CounterVarSet->setCounterConfig(vm); - m_StackedWidget->setCurrentWidget(m_CounterVarSet); - } -} - -void InkJetPrinter::slt_warningMaintenance() -{ - // 距离维护时间结束大于30天,判断运行时间的检测 - if (timeoutDay >= 30) { - double runHours = sysPara->RFIDPara.runtimeMs / 1000.0 / 60.0 / 60.0; - double hours = sysPara->RFIDPara.maintenanceHours - runHours; - QString str; - if (hours >= 0) { - str = tr("保养期还有%1小时到期,请及时保养,否则喷码机容易损坏") - .arg(QString::number(hours, 'f', 2)); - } else { - hours = hours * (-1); - str = tr("保养期已超过%1小时,请及时保养,否则喷码机容易损坏") - .arg(QString::number(hours, 'f', 2)); - } - msgtest->setText(str); - msgtest->show(); - LogInfo::setRunStatusText(str); - return; - } else { - warningHandler(CARD_TYPE::MAINTENANCE); // 距离维护时间结束大于30天,判断运行时间的检测 - return; - } - -} - -void InkJetPrinter::showEvent(QShowEvent *e) -{ - static bool firstShow = true; - - QWidget::showEvent(e); - - if(firstShow) { - loadLastWorkAndPreparePrint(); - firstShow = false; - } -} - -void InkJetPrinter::enableInkJetTabClick(bool flag) -{ - this->setEnabled(flag); -} - -void InkJetPrinter::close_jd_timer() -{ - timer->stop(); -} - -float PID_realize(float speed); - -struct _pid{ - float SetSpeed;//定义设定值 - float ActualSpeed;//定义实际值 - float err;//定义偏差值 - float err_last;//定义上一个偏差值 - float Kp,Ki,Kd;//定义比例、积分、微分系数 - float voltage;//定义电压值(控制执行器的变量) - float integral;//定义积分值 - float integral_max; //积分限幅(根据实际调整) -}pid; - - -void PID_init(){ - pid.SetSpeed=0.0; - pid.ActualSpeed=0.0; - pid.err=0.0; - pid.err_last=0.0; - pid.voltage=0.0; - pid.integral=0.0; - pid.Kp=0.21; //0.25 - pid.Ki=0.006; //0.015 - pid.Kd=0.0; -} - -static float u = 1.0; -float PID_realize(float speed, float act){ - unsigned char index = 1; - pid.SetSpeed=speed; - pid.ActualSpeed = act; - pid.err=pid.SetSpeed-pid.ActualSpeed; - if(u < 900) - { - pid.integral+=pid.err; - } - - pid.voltage=pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err-pid.err_last); - pid.err_last=pid.err; - pid.ActualSpeed =pid.voltage*1.0; - return pid.ActualSpeed; -} - -float PID_realize2(float speed, float act){ - // 增量式 PID:Δu = Kp*(e[k]-e[k-1]) + Ki*e[k] - pid.Kp = 0.15f; - pid.Ki = 0.02f; - pid.Kd = 0.0f; - pid.SetSpeed = speed; - pid.ActualSpeed = act; - pid.err = pid.SetSpeed - pid.ActualSpeed; - - float delta_u = pid.Kp * (pid.err - pid.err_last) - + pid.Ki * pid.err; - - // 自适应非对称限幅: - // 压力严重偏高(err < -30):允许快速减速,限制慢速加速 - // 压力严重偏低(err > 50):允许正常加速,限制减速(避免过度降速) - // 接近目标:小步长,平稳调节 - if(pid.err < -30.0f) { - if(delta_u > 1.0f) delta_u = 1.0f; - if(delta_u < -6.0f) delta_u = -6.0f; - } else if(pid.err > 50.0f) { - if(delta_u > 3.0f) delta_u = 3.0f; - if(delta_u < -2.0f) delta_u = -2.0f; - } else { - if(delta_u > 3.0f) delta_u = 3.0f; - if(delta_u < -3.0f) delta_u = -3.0f; - } - - pid.err_last = pid.err; - return delta_u; -} - -void InkJetPrinter::pressureAdj() -{ - if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm) - { - sysPara->para.gearPumpValue = 0; - u = 0.0f; - m_rampDone = false; - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - sysPara->devOp->WriteMoterPump(); - return; - } - - if(!sysPara->para.gearPumpEnable) - { - if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0)) - u = PID_realize((float)sysPara->para.pressure, (float)sysPara->status.PRESSURE); - sysPara->para.gearPumpValue = (u > 0) ? (unsigned short)u : 0; - if(sysPara->para.gearPumpValue > 800) - sysPara->para.gearPumpValue = 800; - sysPara->devOp->WriteMoterPump(); - return; - } - - int maxValue = sysPara->para.flagOfReclaimPumEnable ? 420 : 800; - if(maxValue < 60) maxValue = 60; - - int maxSpeed = (int)sysPara->para.gearPumpSpeedAlarm; - - auto clampU = [&]() { - if(u < 60.0f) u = 60.0f; - if(u > (float)maxValue) u = (float)maxValue; - }; - - int actual = sysPara->status.PRESSURE; - int target = (int)sysPara->para.pressure; - int cur; - - // 每次进入都更新滑动平均缓冲(软启动用瞬时值,闭环用平均值) - m_pressureBuf[m_bufIdx] = actual; - m_bufIdx = (m_bufIdx + 1) % 10; - int avgPressure = 0; - for(int i = 0; i < 10; i++) avgPressure += m_pressureBuf[i]; - avgPressure /= 10; - - // --------------------------------------------------------------- - // 硬保护:压力超过目标+50,立即强制减速,优先级最高 - // 覆盖自检、软启动、闭环所有阶段 - // --------------------------------------------------------------- - if(actual > target + 50) - { - float overErr = (float)(actual - (target + 50)); - float delta = -0.1f * overErr; - if(delta < -15.0f) delta = -15.0f; - u += delta; - clampU(); - m_lastPressure = actual; - sysPara->para.gearPumpValue = (unsigned short)(int)u; - sysPara->devOp->WriteMoterPump(); - return; - } - - // --------------------------------------------------------------- - // 软启动:自适应步长,每 800ms 一次 - // 自检期间也走此逻辑(硬保护兜底),自检完成后重置重新收敛 - // 软启动阶段不做压力稳定检测,优先快速收敛 - // --------------------------------------------------------------- - if(!m_rampDone) - { - if(++m_adjSkip < 8) - { - sysPara->para.gearPumpValue = (unsigned short)(int)u; - sysPara->devOp->WriteMoterPump(); - return; - } - m_adjSkip = 0; - - int err = target - actual; - - if(err < 0) - { - // 超压:小步减速 - u -= 1.0f; - } - else - { - // 自适应步长:差得远步子大,差得近步子小 - float step; - if (err > 200) step = 5.0f; - else if(err > 100) step = 3.0f; - else if(err > 50) step = 2.0f; - else step = 1.0f; - u += step; - } - - clampU(); - - // 转速上限保护 - if(sysPara->para.flagOfReclaimPumEnable && - sysPara->status.gearPumpRunSpeed >= maxSpeed) - { - u -= 3.0f; - clampU(); - } - - cur = (int)u; - - // 进入闭环条件:压力已稳定在目标±50以内 - if(sysPara->status.selfCheckDone && err >= -50 && err <= 50) - { - m_rampDone = true; - m_adjSkip = 0; - } - - sysPara->para.gearPumpValue = (unsigned short)cur; - sysPara->devOp->WriteMoterPump(); - return; - } - - // --------------------------------------------------------------- - // 闭环:等压力稳定后再调速,自适应管路响应时间 - // - // 每100ms采样一次,连续3次压力变化<15认为稳定,才执行调速 - // 最长等待5s(50次)兜底,防止管路持续抖动导致永远不调 - // - // 调速后立即重置稳定计数,重新等待下一次稳定 - // - // 分区Kp:误差大步子大,误差小步子小 - // |err| > 100 → Kp=0.05,限幅±5 - // |err| 50~100→ Kp=0.04,限幅±4 - // |err| < 50 → Kp=0.03,限幅±3 - // --------------------------------------------------------------- - { - // 稳定检测用平均值,滤掉传感器噪声 - int pressureChange = avgPressure - m_lastPressure; - if(pressureChange < 0) pressureChange = -pressureChange; - m_lastPressure = avgPressure; - m_adjSkip++; // 复用为超时计数 - - bool stable = (pressureChange < 10); - bool timeout = (m_adjSkip >= 50); // 5s兜底 - - if(stable) - m_stableCount++; - else - m_stableCount = 0; - - bool readyToAdj = (m_stableCount >= 15) || timeout; - - if(!readyToAdj) - { - sysPara->para.gearPumpValue = (unsigned short)(int)u; - sysPara->devOp->WriteMoterPump(); - return; - } - - // 平均压力已稳定(或超时兜底),执行调速,重置计数 - m_adjSkip = 0; - m_stableCount = 0; - - // 误差用平均值计算,避免瞬时噪声影响调速幅度 - float absErr = (float)(target - avgPressure); - if(absErr < 0.0f) absErr = -absErr; - - float kp, capDelta; - if(absErr > 100.0f) { kp = 0.05f; capDelta = 5.0f; } - else if(absErr > 50.0f) { kp = 0.04f; capDelta = 4.0f; } - else { kp = 0.03f; capDelta = 3.0f; } - - float err = (float)(target - avgPressure); - float delta_u = kp * err; - - if(delta_u > capDelta) delta_u = capDelta; - if(delta_u < -capDelta) delta_u = -capDelta; - - // 转速上限软限制:转速已达上限时禁止继续加速 - if(sysPara->para.flagOfReclaimPumEnable && - sysPara->status.gearPumpRunSpeed >= maxSpeed) - { - if(delta_u > 0.0f) delta_u = 0.0f; - } - - u += delta_u; - clampU(); - cur = (int)u; - - sysPara->para.gearPumpValue = (unsigned short)cur; - sysPara->devOp->WriteMoterPump(); - } -} - - -static bool firstTime = true; -extern void MySleep(unsigned int msec); -extern unsigned char test_flag; -bool gearPumpRunNormalFlag = false; -unsigned char isPrintingFlag[1]={0}; -void InkJetPrinter::timerHandler(void){ - static bool flag1 = 1; - if(flag1){ - flag1 = 0; - qDebug()<<"timer had started"; - } - - int pulse_100ms = 0; - int pulse_200ms = 0; - int pulse_50ms = 0; - int pulse_20ms = 0; - int pulse_1s = 0; - int pulse_10s = 0; - int pulse_100s = 0; - int pulse_300ms = 0; - int timer_3s = 0; - - static int pulse_3s = 0; - static int pulse_4s = 0; - static int pulse_5s = 0; - static int reciclar_30s = 0; - static int pulse_30s = 0; - static int xxxm=0; - - static int tempFlag=0; - static int save_weeknum = 0; - static bool ControledSwitchFlag = false; - static bool delay3s; - bool InkSwintFlag = false,lastInkSwintFlag = false; - static float gearPumpRunNormalValue = 0.0; - if(sysPara){ - ui.m_LabelTimer->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); - xxxm=1; - if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){ - sysPara->para.flagOfModuleDecimal = 0; - sysPara->para.flagOfModuleHide = 0; - } - - sysPara->para.ReadFileErrorCnt=0; // 正常打开文件 - - if(sysPara->para.gearPumpEnable) - { -// m_MainWidget->enablePushButtonStart(true); - if(!pushButtonStartFlag) - { - gearPumpRunNormalFlag = false; - } - if(!gearPumpRunFlag) - { - m_MainWidget->setReclaimOpenBtnStatus(false); - m_MainWidget->setReclaimCloseBtnStatus(false); - } - } - else - { -// ui->tabMainWindow->enablePushButtonStart(false); - } - - /*-----------------------形成脉冲-----------------------------*/ - sysPara->status.delay10ms ++; - if(sysPara->status.delay10ms == 2){ - pulse_20ms = 1; - } - if(sysPara->status.delay10ms == 5){ - pulse_50ms = 1; - } - if(sysPara->status.delay10ms == 10){ - pulse_100ms = 1; - sysPara->status.delay10ms = 0; - } - if(pulse_100ms){ - sysPara->status.delay100ms ++; - if(sysPara->status.delay100ms == 10){ - pulse_1s = 1; - sysPara->status.delay100ms = 0; - } - pulse_300ms = (sysPara->status.delay100ms%3) == 0; //1秒3次,并非精确的300ms - pulse_200ms = (sysPara->status.delay100ms%2) == 0; - } - - // static QElapsedTimer *timer_3s_elapsed = nullptr; - // if(timer_3s_elapsed == nullptr) { - // timer_3s_elapsed = new QElapsedTimer(); - // timer_3s_elapsed->start(); - // } - - // if(timer_3s_elapsed->elapsed() >= 3000) //读取状态后再检測 - // { - // if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒 - // { - // if(sysPara->para.gearPumpEnable) { - // // 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速 - // if(sysPara->para.gearPumpValue != 0) { - // sysPara->para.gearPumpValue = 0; - // u = 0.0f; - // sysPara->devOp->WriteMoterPump(); - // } - // gearPumpStartFlag = true; - // } - // } - - // timer_3s_elapsed->restart(); - // } - - if(pushButtonStartFlag && sysPara->status.selfCheckDone) - { - if((sysPara->status.PRESSURE > (sysPara->para.pressure -10)) && (sysPara->status.PRESSURE < (sysPara->para.pressure +10))) - { - if(pulse_1s) - { - - pulse_5s++; - } - if( pulse_5s == 5) - { - pulse_5s = 0; - gearPumpRunNormalFlag = true; - gearPumpRunNormalValue = u; - } - } - } - if(sysPara->status.isPumpValveControledByHand) - { - gearPumpRunNormalFlag = false; - ControledSwitchFlag = false; - pulse_3s = 0; - } - // 检测手动→自动边沿,直接恢复压力控制,不走 gearPumpStartFlag 的 3s 等待 - if(m_lastByHand && !sysPara->status.isPumpValveControledByHand) - { - ControledSwitchFlag = true; - u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变 - m_rampDone = false; // 重新软启动,适应切换后的压力状态 - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - } - m_lastByHand = sysPara->status.isPumpValveControledByHand; - if(!(sysPara->status.statWarn & WARN_STATUS_INK_SWINT)){//墨线开关,压力抖动 - InkSwintFlag = true; - } - else - { - InkSwintFlag = false; - } - if(lastInkSwintFlag != InkSwintFlag) - { - lastInkSwintFlag = InkSwintFlag; - gearPumpRunNormalFlag = false; - } - if(gearPumpRunNormalFlag && !sysPara->status.isPumpValveControledByHand && sysPara->para.gearPumpEnable) - { - static int count_3s = 0; - if(u > gearPumpRunNormalValue*1.5)//改大一点 - { - if(pulse_1s) - { - count_3s++; - if(count_3s == 3) - { - count_3s = 0; - m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); - sysPara->status.gearPumpRunStopFlag = true; - gearPumpRunNormalFlag = false; - LogInfo::setRunStatusText(tr("运行中压力泄漏,停齿轮泵!")); - } - } - } - else - { - count_3s = 0; - } - } - if(sysPara->para.gearPumpEnable && (sysPara->status.gearPumpRunSpeed < 100) && test_flag){ - if(test_flag % 2) - m_MainWidget->on_m_LeftBtn_clicked(); - test_flag = 0; - } - if(pulse_1s) { - if(sysPara->status.selfCheckDone && sysPara->para.gearPumpEnable && sysPara->para.flagOfReclaimPumEnable) - checkPressureControl(); - if((QTime::currentTime()>=QTime(00,00,00))&&(QTime::currentTime()<=QTime(00,00,02))&&sysPara->para.Reciclar){ - if(m_MainWidget->getCurrPrintStatus() != 1){ - m_MainWidget->_on_pushButtonPowerOff_pressed(false); - LogInfo::setRunStatusText(tr("定时开机循环完成,准备关机")); - } - } - if(sysPara->status.selfCheckDone && sysPara->para.Reciclar && test_flag){ - reciclar_30s++; - if(reciclar_30s > 30){ - reciclar_30s = 0; - test_flag++; - } - } - else if(reciclar_30s){ - reciclar_30s = 0; - } - QDate d = QDate::currentDate(); - - if(save_weeknum == 0) - { - save_weeknum = d.weekNumber(); - } - - if(save_weeknum != d.weekNumber()) - { - sysPara->devOp->writeFpgaCalandar(1); - save_weeknum = d.weekNumber(); - } - - sysPara->status.delay1s ++; - if(sysPara->status.delay1s == 3 && !delay3s){ - delay3s = true; - } - if(sysPara->status.delay1s % 3 == 0 && sysPara->status.delay1s != 0) - timer_3s = 1; - if(sysPara->status.delay1s == 10){ - pulse_10s = 1; - sysPara->status.delay1s = 0; - } - - pulse_4s++; - if(gearPumpStartFlag) - { - pulse_3s ++; - if(pulse_3s == 6) - { - pulse_3s = 0; - gearPumpRunFlag = true; - ControledSwitchFlag = true; - } - } - if( sysPara->status.reclainTankReachEnd) sysPara->para.openInkLineTime++; - } - - if(pulse_1s && flagOfSerialThreadStratEn){ - #ifdef ARCH_AARCH64 - if (!m_serialThreadFPGA->isRunning()) { - qDebug()<<"start FPGA tread"; - m_serialThreadFPGA->start(); - } - if (!m_serialThreadSTM32->isRunning()){ - qDebug()<<"start STM32 tread"; - m_serialThreadSTM32->start(); - } - #endif - flagOfSerialThreadStratEn = false; - } - - if(pulse_10s){ - sysPara->status.delay10s ++; - if(sysPara->status.delay10s == 10){ - pulse_100s = 1; - sysPara->status.delay10s = 0; - -// if(sysPara->status.flagOfPowerOnMode && (ui->tabMainWindow->getCurrPrintStatus() != 1)) - if(sysPara->status.flagOfPowerOnMode) - { - qDebug()<<"waitPowerOffTime: "<status.waitPowerOffTime; - LogInfo::setRunStatusText(tr("waitPowerOffTime: %1").arg(sysPara->status.waitPowerOffTime)); - if(sysPara->status.waitPowerOffTime) - { - sysPara->status.waitPowerOffTime--; - if(!sysPara->status.waitPowerOffTime) - { - m_MainWidget->_on_pushButtonPowerOff_pressed(false); - LogInfo::setRunStatusText(tr("定时开机循环完成,准备关机")); - m_MainWidget->setRunStatus(tr("准备关机")); - } - } - } - } - } - - /*------------------------------------------------------*/ - if(pulse_100ms) { - sysPara->devOp->stm32Rd(0x07,(unsigned char *)&PulseCnt,2);//读取脉冲个数低字节 - sysPara->devOp->readFgaStatus(); - } - - /**************桂澳增加超速提示*****************************/ - static int logCtrl = 0; - if((sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER || sysPara->para.eleEyeTriggerSynPrintEn) - && sysPara->status.lesslen_warn == 1){ //置1表示超速了 - if(logCtrl++ % 500 == 0){ -// LogInfo::setRunStatusText(tr("速度过快,请检查是否漏喷!!!")); - qDebug()<<"速度过快,请检查是否漏喷!!!"; - } - - /*if(msgBox1->isHidden()){ //桂澳的超速提示先保留 - msgBox1->setText(tr("速度过快,请检查是否漏喷!!!")); - msgBox1->show(); - LogInfo::setRunStatusText(tr("速度过快,请检查是否漏喷!!!")); - qDebug()<<"速度过快,请检查是否漏喷!!!"; - }*/ - sysPara->devOp->controlRedLight(true); - sysPara->devOp->controlGreenLight(false); - } - else{ -// if(!msgBox1->isHidden()) -// sysPara->devOp->controlRedLight(false); - } - - sysPara->status.gearPumpRunSpeed = (PulseCnt * 60 * 1000) / (500 * 2); - if(!sysPara->para.gearPumpEnable) - sysPara->status.PRESSURE *= 5; //响应群众号召,数值放大五倍 - - /*-------------------------------------------------------*/ - bool lostCommuFlag = 1; - if(sysPara->status.fpgaVersionNum != 0) - lostCommuFlag = 0; - - if(sysPara->status.delay10ms%5 == 0) - {//复位发送打印数据 - if((m_MainWidget->getCurrPrintStatus() == 1)&&sysPara->para.ResetSendData) - { - static bool oneTimeFlag = false; - if(sysPara->status.productCnt== 0 && (oneTimeFlag==false))//计米复位发送打印数据 - { - oneTimeFlag = true; - m_MainWidget->on_m_StartBtn_clicked(); - //复位重设起始值 - if(sysPara->para.cnt1ResetToInitValue) - { - sysPara->para.cnt1CurrValue = sysPara->para.cnt1StartValue; - sysPara->status.cnt1CurrentValueInitDoneFlag = false; - sysPara->devOp->writeFpgaCalandar(0); - } - } - if(sysPara->status.productCnt != 0) - { - oneTimeFlag = false; - } - } - static unsigned int lastProductCount=0; - if(sysPara->status.productCnt != lastProductCount || sysPara->status.printDoneFlag) - { - sysPara->status.printDoneFlag = false; - lastProductCount = sysPara->status.productCnt; - - if(vartypeR != 0){ //更新替换变量的值 -// LogInfo::setRunStatusText("vartypeR"); - MySleep(100); - m_MainWidget->onPreviewScene(); - m_MainWidget->SendPrintDataToFpga(0); - } - - sysPara->modbusStatus.printFinishFlag = 1; - memcpy((void*)(&sysPara->modbusStatus.orderCode), (void*)(&sysPara->modbusParas.QRcode_buf), 2);//写返回序列号 -// ui->tabMainWindow->UpdateDateTimeQRCode(QDateTime::currentDateTime().toString("hh:mm")); - } - - // byons: 时间类型图元更新 @2026年4月11日 - // byons: 变量类图元现在优化为局部更新,避免每次都要把整个打印内容发送给FPGA,现在只发送被更新的列区间 2026年7月16日 - auto updateAreas = m_MainWidget->variableItemsUpdate(); - if(sysPara->status.isPrinting && !updateAreas.isEmpty()){ - m_MainWidget->SendPrintDataToFpga(0, true); - } - - if (!updateAreas.isEmpty() && m_StackedWidget->currentWidget() == m_MainWidget) { - // // 统计追踪更新频率 - // static QElapsedTimer bnsTimer; - // static int toogleCount = 0; - // ++toogleCount; - // if(toogleCount > 10) { - // auto elapsed = bnsTimer.restart(); - // qDebug() << (QString("timeHandler avg elapsed: %1 s").arg(elapsed / qreal(toogleCount) / 1000.0)); - // toogleCount = 0; - // } - m_MainWidget->updatePrintDisplayLabel(); - } - -// if (modbus->getModbusStatus() == 1) { -// refreshModbusStatus(); -// } - } - - if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0) - { - if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ - // sysPara->status.selfCheckDone = true; - m_MainWidget->updatePrintDisplayLabel(); -// sysPara->status.flagOfAbnormalStatus = true; - qDebug()<<"打印过程中死机了!!!"; - - m_MainWidget->on_m_StopBtn_clicked(); - } - - if(!sysPara->status.selfCheckDone) - { - /*开机自检*/ - autoControlValvePump(); - if(pulse_100ms){ - pressureAdj(); - } - /*-----------------------------------------------------*/ - if(!sysPara->status.selfCheckCnt) { - LogInfo::setRunStatusText(tr("开始自检,请等待60秒...")); - - m_MainWidget->setReclaimOpenBtnStatus(false); - m_MainWidget->setReclaimCloseBtnStatus(false); - - m_MainWidget->enablePrintButton(false); - sysPara->devOp->mainInkCtrl(); - sysPara->para.TrunOnPowerCnt++;// 20151218 开机次数加1 - sysPara->saveParaToFile(); // 保存开机次数值 - - sysPara->status.lastProductCnt = sysPara->status.productCnt ; //这会让产品计数显示出来 - - m_MainWidget->updateTotalCnt(0); - - - } - if((++sysPara->status.selfCheckCnt % 100) == 0){ - m_MainWidget->setRunStatus(tr("开始自检,请等待%1秒..."). - arg((MAX_SELF_CHECK_CNT - sysPara->status.selfCheckCnt)/100)); - } -#ifdef QT_DEBUG - if(sysPara->status.selfCheckCnt >= 1500) // 测试自检改为15s -#else - if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT) -#endif - { - sysPara->status.selfCheckDone = 1; - // 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛 - // 不清零 u,从当前控制字开始,避免突变 - u = (float)sysPara->para.gearPumpValue; - // m_rampDone = false; - // m_adjSkip = 0; - // m_lastPressure = 0; - // m_stableCount = 0; - autoControlValvePump(); - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - - m_MainWidget->setReclaimOpenBtnStatus(true); - m_MainWidget->setReclaimCloseBtnStatus(false); - - sysPara->devOp->mainInkCtrl(); - sysPara->status.canRunAirPushing = true; - - // 自检结束发送打印设置 - qInfo() << "Self check done and send print para to FPGA"; - // sysPara->devOp->setHighVoltageAmplitudetoSTM32(); - // sysPara->devOp->writeFpgaCalandar(0); - // sysPara->devOp->writeFpgaPrintPara(true); - - // 自检完成后,关闭高电压,不知道为什么,有时候开机自检都有高压 - sysPara->devOp->highVoltageCtrl(0); - - m_MainWidget->on_m_StopBtn_clicked(); - - LogInfo::setRunStatusText(tr("自检完成!!!")); - m_MainWidget->setRunStatus(tr("自检完成!!!")); - qDebug()<<"自检完成!!!"; - - if(sysPara->para.Reciclar) - test_flag = 1; - } - else { - if((sysPara->status.selfCheckCnt % 200) == 0) - m_MainWidget->setReclaimOpenBtnStatus(false); - m_MainWidget->setReclaimCloseBtnStatus(false); - } - - } - else{ - // 开机自检完成的前提下 - if (!sysPara->status.airPushing || m_MainWidget->m_2sFlag) { - autoControlValvePump(); - } - - // 检测回收泵模式切换,切换时重置泄漏保护学习状态和软启动状态 - if(m_lastReclaimMode != sysPara->para.flagOfReclaimPumEnable) - { - m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable; - gearPumpRunNormalFlag = false; // 泄漏保护重新学习 - gearPumpRunNormalValue = 0.0f; - m_rampDone = false; // 软启动重新爬坡适应新上限 - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - } - - if(pulse_100ms && sysPara->para.gearPumpEnable && !sysPara->status.isPumpValveControledByHand && ControledSwitchFlag ) { - pressureAdj(); - } - } - } - else{ - static bool flag = 1; - if(delay3s){ - if(flag && gearPumpStartFlag){ - flag = 0; - LogInfo::setRunStatusText(tr("缺少墨水,喷码机不能正常工作!")); - qDebug()<<"缺少墨水,喷码机不能正常工作!"; - m_MainWidget->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); - } -// ui->tabMainWindow->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); - } - } - /*----------------------------控制温度--------------------------------------*/ - if(pulse_300ms){ - autoControlHeater(); - sysPara->devOp->readSyncCounterAtZero(); - } - - sysPara->status.lostCommuFlag = lostCommuFlag; //务必放在后面 - static unsigned int lastProductCnt =0; - static int lastalterMode=-1; - if(sysPara->para.alterPrint.enable) - { - sysPara->para.AlterMode=sysPara->status.AlterMode; // 电眼触发交替功能:新增这一行 - if( (sysPara->para.AlterMode!=lastalterMode) - || (lastProductCnt != sysPara->status.productCnt) - ) - { -// ui->tabMainWindow->alterDataPrint (sysPara->para.AlterMode); - } - } - else sysPara->para.AlterMode=0; - lastalterMode = sysPara->para.AlterMode; - lastProductCnt = sysPara->status.productCnt; -// m_MainWidget->CheckStatus(pulse_300ms); // - /*----------------------------------界面更新状态---------------------------------------*/ -#ifdef __RFID_CARD - static bool flag6 = true; - unsigned int addr = m_MainInstruction->dlgInputAddr->jd.addr; - if(pulse_10s && flag6){ //初始化刷卡模块 - qDebug()<<"初始化刷卡模块"; - LogInfo::setRunStatusText(QString("jd.addr:%1").arg(addr)); - flag6 = false; - if (manager_rfid) - manager_rfid->initRFIDMoudle(addr, sysPara); - } - - if(pulse_300ms){ - if (manager_rfid) - manager_rfid->handleCheck(addr); - } - -#endif - if(pulse_300ms){ - sysPara->devOp->readCalandarDat(); //务必读一下此数据 - - if(sysPara->status.RandomNum>0) - sysPara->devOp->Read_RanddomFromFpga(); -#ifdef COUNTER1_BY_GROUP /* 分段计米 */ -// cnt1GroupCheck();//分段计米 -#endif - //reserved - QWidget *widget = m_StackedWidget->currentWidget(); - static bool read_flag = false; - if((widget == m_MainWidget || widget == m_LogInfo) && pulse_100ms) { - m_MainWidget->updateSysStatusToUI(); - m_MainWidget->updateGeneralState(m_MainWidget->alarmStatus); - m_LogInfo->updateSysStatusToUI(m_MainWidget->alarmStatus); - } - /* - else if(widget == ui->tabTriggerMode){ - ui->tabTriggerMode->updateSysStatusToUI(); - - if(sysPara->status.fpgaVersionNum != 0){ - QString FpgaVersion; - if((sysPara->status.fpgaVersionNum>>12) == 8 || (sysPara->status.fpgaVersionNum>>12) == 6) - FpgaVersion = "72"; - else if((sysPara->status.fpgaVersionNum>>12) == 2 || (sysPara->status.fpgaVersionNum>>12) == 1){ - if(sysPara->para.flagOfFastMode) - FpgaVersion = "66"; - else - FpgaVersion = "67"; - } - FpgaVersion += QString("_F%1.%2.%3").arg(sysPara->status.fpgaVersionNum >> 12) - .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff); - ui->tabTriggerMode->setBuildTime(QString(" No%1").arg(FpgaVersion)); - } - - } - */ - else if(widget == m_PrintSetting) - { - m_PrintSetting->updateSysStatusToUI(); -// if(!read_flag) -// { -// emit sendPicScene(ui->tabMainWindow->getPicScene()); -// } - read_flag = true; - } - else if(widget == m_SystemSetting){ - - m_SystemSetting->updateSysStatusToUI(); - } - else if(widget == m_SystemManage){ - m_SystemManage->updateSysStatusToUI(); - } - else if(widget == m_OtherInfo){ - m_OtherInfo->updateSysStatusToUI(); - } -// else if(widget == ui->tabNetworkManager){ -// if(!sysPara->status.bLanConfigManual) -// { -// ui->tabNetworkManager->updateSysStatusToUI(); -// } -// } - if(widget != m_PrintSetting) - { - read_flag = false; - } - - // 20140306 - static int last_lesslen_warn=0,lesslen_cnt=0; - if(sysPara->status.lesslen_warn && (sysPara->para.printTriggerMode != PRINT_TRIGGER_TIME)) - { - if(last_lesslen_warn==0) - { - last_lesslen_warn =lesslen_cnt; - if(lesslen_cnt<60)lesslen_cnt +=6; - if(lesslen_cnt>40) sysPara->devOp->resumeFault(); - - if(sysPara->para.speedoverPaushPrint) { -// m_MainWidget->on_pushButtonPausePrint_pressed();// 2014-03-19 -// ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全,自动暂停喷印!!!")); - - } - else { -// ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全!!!")); - } - - } - } - else { last_lesslen_warn=0;lesslen_cnt=30;} - - if(last_lesslen_warn) last_lesslen_warn--; - - } - - if(pulse_100ms && sysPara->status.selfCheckDone){ - detectAndcontrolReclaimTank(); //控制回收槽 - } - - /*---------------------------------处理警告--------------------------------------------*/ - if(pulse_1s){ - if(sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone && gearPumpRunNormalFlag) - { - if((sysPara->status.PRESSURE < (sysPara->para.pressure -8)) || (sysPara->status.PRESSURE > (sysPara->para.pressure +8))) - { -// LogInfo::setRunStatusText(tr("压力波动超过设定的5个值.")); - } - } - - static bool logFlag1 = true; - if(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN && logFlag1){ - logFlag1 = false; -// LogInfo::setRunStatusText(tr("溶剂液位报警! %1").arg(sysPara->RFIDPara.solventNumber)); - qDebug()<<"溶剂液位报警! "<RFIDPara.solventNumber; - } - -#ifdef __RFID_CARD - // hlp 0513 :甲方要求提示越来越频繁 -// if(sysPara->status.needMaintenanceRemind){ -// warningHandler(3); -// } -// LogInfo::setRunStatusText(tr("处理警告:%1").arg(QDateTime::currentDateTime())); - - handleWarnInk(); // 处理墨水警告 - handleWarnSolvent(); // 处理溶剂警告 -#endif - - static bool resumeFlag = false; - if(lostCommuFlag || m_MainWidget->updatePhaseIndicatorLight() - || (sysPara->status.statWarn & - (WARN_STATUS_POWER_MON|WARN_STATUS_INK_WARN|WARN_STATUS_SUMP_WARN - |WARN_STATUS_SOLV_WARN|WARN_STATUS_POWER_MON)) - || (sysPara->status.gearPumpRunStopFlag && pushButtonStartFlag) - ||sysPara->status.lastHighVoltageFault) - { - sysPara->status.beeperOnFlag = true; - if(sysPara->status.gearPumpRunStopFlag && pushButtonStartFlag) - { - m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); - } - if(!resumeFlag) - { - resumeFlag = true; - pulse_4s = 0; - if(!sysPara->status.lastHighVoltageFault) - { - m_MainWidget->onLabelFaultRusumePressed(); - } - } - } - else { - sysPara->status.beeperOnFlag = false; - sysPara->devOp->controlBeeper(false); - if(pulse_4s >= 20) - { - pulse_4s = 0; - resumeFlag = false; - } - } - - if(sysPara->status.beeperOnFlag){ //报警会时有时无 - sysPara->devOp->controlBeeper(!sysPara->devOp->isBeeperEnable()); - } - - if((sysPara->status.statWarn & (WARN_STATUS_POWER_MON)) - ||sysPara->status.lastwarmInkPump||sysPara->status.lastwarmInkPump||sysPara->status.mainInkPumpError - ||sysPara->status.compressPumpError||sysPara->status.lastPhaseFault||sysPara->status.lastRecycleWarn||sysPara->status.lastHighVoltageFault) - { //2013-12-12故障报警灯 杨 - sysPara->status.RedLightOnFlag = true; - - } - else { - sysPara->status.RedLightOnFlag = false; - sysPara->devOp->controlRedLight(false); - //sysPara->devOp->controlRedLight(true); - } - if(sysPara->status.RedLightOnFlag){ //报警会时有时无 - sysPara->devOp->controlRedLight(!sysPara->devOp->isRedLightEnable()); - } - if((sysPara->status.statWarn & (WARN_STATUS_INK_WARN|WARN_STATUS_SOLV_WARN |WARN_STATUS_RECYCLE_FAULT|WARN_STATUS_SUMP_WARN)) - && !sysPara->status.RedLightOnFlag){ - //if(!sysPara->status.RedLightOnFlag){ - sysPara->status.YellowLightOnFlag = true; - } - else { - sysPara->status.YellowLightOnFlag = false; - sysPara->devOp->controlYellowLight(false); - //sysPara->devOp->controlYellowLight(true); - } - if(sysPara->status.YellowLightOnFlag){ //报警会时有时无 - sysPara->devOp->controlYellowLight(!sysPara->devOp->isYellowLightEnable()); - } - - if(sysPara->status.waitHightVolOff>0){ - sysPara->status.waitHightVolOff--; - if(sysPara->status.waitHightVolOff==0){ - sysPara->devOp->highVoltageCtrl(0); - m_MainWidget->setRunStatus(tr("停止打印,自动关闭高压.")); - } - } - - }// 1s - -#ifdef WARNING - static int pre_pressed=0,pre_hvcurrent=0,press_err_cnt=0; - if(pulse_1s) - { - if((pre_pressed > sysPara->status.PRESSURE+70)) - { - if(++press_err_cnt>3) - { -// LogInfo::setRunStatusText(tr("压力异常:上次压力值%1,当前压力值%2").arg(pre_pressed).arg(sysPara->status.PRESSURE)); - } - } - else - { - press_err_cnt = 0; - } - pre_pressed = sysPara->status.PRESSURE; - - - } - - if(pulse_100ms) - { - if(pre_hvcurrent>150 && ( sysPara->status.HV_DETOUT> pre_hvcurrent+20) && (sysPara->status.waitHightVolOn==8 || sysPara->status.waitHightVolOff==1) && sysPara->status.isPrinting ) - pre_hvcurrent = sysPara->status.HV_DETOUT; - - if(sysPara->status.waitHightVolOn<8)sysPara->status.waitHightVolOn++; - if(sysPara->status.isPrinting==0) sysPara->status.waitHightVolOn=0; - } -#endif - if(sysPara->devOp->color_flag ==3){ - sysPara->devOp->color_flag = 0; - pulse_30s = 0; - } - else if(pulse_1s && sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone - && (!sysPara->status.statWarn) && !sysPara->status.powerOffAppending){ - if((!sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed <= 2000) - ||(sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed <= sysPara->para.gearPumpSpeedAlarm)) - { - pulse_30s = 0; - } - else{ - pulse_30s++; - if(pulse_30s >= 30){ - if((sysPara->status.gearPumpRunSpeed >= 2500)||(sysPara->devOp->color_flag == 2) - ||(sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed > sysPara->para.gearPumpSpeedAlarm)) - { - sysPara->status.flagOfSpeedAlarm = true; - sysPara->devOp->color_flag = 2; - if(pulse_30s % 500 == 0){ -// LogInfo::setRunStatusText(tr("齿轮泵转速过高,请立即停机并联系供应商!")); - qDebug()<<"齿轮泵转速过高,请立即停机并联系供应商!"; - } -// ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请立即停机并联系供应商!")); - sysPara->devOp->controlRedLight(true); - if(sysPara->status.isPrinting) - m_MainWidget->on_m_StopBtn_clicked(); - } - else{ - sysPara->devOp->color_flag = 1; - if(pulse_30s % 500 == 0){ -// LogInfo::setRunStatusText(tr("齿轮泵转速过高,请清理过滤器或者检查是否泄露!")); - qDebug()<<"齿轮泵转速过高,请清理过滤器或者检查是否泄露!"; - } -// ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请清理过滤器或者检查是否泄露!")); - sysPara->devOp->controlYellowLight(true); - } - } - if(pulse_30s % 10 == 0) - qDebug()<<"粘度: "<status.viscosity); - } - } - else if(sysPara->status.statWarn & 0xFE){ - sysPara->devOp->color_flag = 3; - pulse_30s = 0; - } - } - - //测试代码,发布模式自动忽略 - -} - -void InkJetPrinter::checkStatusAndStartGearPump() -{ - // 使用 QElapsedTimer 去抖:要求条件连续保持 >= 2000ms - if(!sysPara) - return; - - bool cond = !(sysPara->status.statWarn & WARN_STATUS_INK_WARN) - && !gearPumpRunFlag - && !sysPara->status.isPumpValveControledByHand - && sysPara->para.gearPumpEnable; - - if (cond) { - // 若尚未开始计时,启动计时 - if (!m_pipingClearSince.isValid()) { - m_pipingClearSince.start(); - return; - } - - // 若计时已到达阈值,再次确认条件并执行启动动作 - if (m_pipingClearSince.elapsed() >= 2000) { - if (!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) - && !gearPumpRunFlag - && !sysPara->status.isPumpValveControledByHand) { - if (sysPara->para.gearPumpValue != 0) { - sysPara->para.gearPumpValue = 0; - u = 0.0f; - sysPara->devOp->WriteMoterPump(); - } - gearPumpStartFlag = true; // 设置标记位,让 timerHandler 启动齿轮泵 - } - m_pipingClearSince.invalidate(); - } - } else { - // 条件不满足,取消计时 - if (m_pipingClearSince.isValid()) - m_pipingClearSince.invalidate(); - } -} - - -// 以下槽函数逻辑完全不变 -void InkJetPrinter::getTestPrintWidgetButtonClickedSlot(int index) -{ - switch (index) - { - case 201: - { - m_StackedWidget->setCurrentWidget(m_BarCodeDlg); - break; - } - case 202: - { - m_StackedWidget->setCurrentWidget(m_QRCodeDlg); - break; - } - - case 9: - { - m_PrintSetting->updateModelToUI(); - m_StackedWidget->setCurrentWidget(m_PrintSetting); - break; - } - case 10: - { - m_StackedWidget->setCurrentWidget(m_FontSetWidget); - break; - } - case 16: - { - // 已经转由 @see InkJetPrinter::openDatetimeEditor 处理 - break; - } - case 5: - { - // m_StackedWidget->setCurrentWidget(m_CounterVarSet); - // 转由 @see InkJetPrinter::slt_editCounter 处理 - break; - } - case 20: - { - m_StackedWidget->setCurrentWidget(m_MainWidget); - ui.label_currEditFile->setText(""); - break; - } - default: - break; - } -} - -void InkJetPrinter::openDatetimeEditor(DateItemModel dateModel, TextItemModel textItemModel) -{ - m_DateVarSet->initUI(); - m_DateVarSet->initReplaceValue(); - - m_DateVarSet->setTextItemModel(textItemModel); - m_DateVarSet->setDateModel(dateModel); - - m_StackedWidget->setCurrentWidget(m_DateVarSet); -} - -void InkJetPrinter::slt_updatePrintContent(const QString &filename) -{ - loadWorkFileAndPreparePrint(filename); -} - -void InkJetPrinter::getFontSetWidgetButtonClickedSlot(int index) -{ - switch (index) - { - case 1: - { - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - break; - } - default: - break; - } -} - -void InkJetPrinter::getMainWidgetButtonClickedSlot(int index) -{ - switch (index) - { - case 1: { // 编辑当前文件 - - // 如果上次打开的文件不存在或者不是xml文件,则创建一个新的作业文件 - if(currWorkFile.isEmpty()){ - createNewJobFile(); - break; - } - - // 如果上次打开的文件存在且是xml文件,则直接打开该文件 - QFileInfo fileInfo(currWorkFile); - m_TestPrintWidget->openWorkFile(currWorkFile); - ui.label_currEditFile->setText(QString("E: %1").arg(fileInfo.baseName())); - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - break; - } - case 2: // 调入文件喷印 - m_dlgFileOperation->setWindowModality(Qt::WindowModal); - m_dlgFileOperation->refreshListView(SCENE); - m_dlgFileOperation->show(); - break; - case 3: - close(); - break; - case 4: - m_StackedWidget->setCurrentWidget(m_MainInstruction); - break; - case 5: - m_StackedWidget->setCurrentWidget(m_LogInfo); - break; - default: - break; - } -} - -void InkJetPrinter::getPrintSettingButtonClickedSlot(int index){ - if (m_isDefaultPrintSettingMode) { - exitDefaultPrintSettingMode(); - m_StackedWidget->setCurrentWidget(m_MainInstruction); // 修改完默认设置后,回到MainInstruction - return; - } - - switch (index) - { - case 1: - case 2: - { - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - break; - } - default: - break; - } -} - -void InkJetPrinter::enterDefaultPrintSettingMode() -{ - m_savedPrintSettingModel = m_PrintSetting->model(); - m_PrintSetting->setDefaultSettingMode(true); - m_PrintSetting->setModel(PrintSettingModel::defPrintSettingModel()); - m_isDefaultPrintSettingMode = true; - m_StackedWidget->setCurrentWidget(m_PrintSetting); -} - -void InkJetPrinter::exitDefaultPrintSettingMode() -{ - m_PrintSetting->setModel(m_savedPrintSettingModel); - m_PrintSetting->setDefaultSettingMode(false); - m_isDefaultPrintSettingMode = false; -} - -void InkJetPrinter::getMainInstructWidgetButtonClickedSlot(int index) -{ - switch (index) - { - case 1: - { - m_StackedWidget->setCurrentWidget(m_MainWidget); - break; - } - case 2: - { - m_StackedWidget->setCurrentWidget(m_SystemManage); - break; - } - case 3: - { - m_SystemSetting->updateSysParaToUI(); - m_StackedWidget->setCurrentWidget(m_SystemSetting); - break; - } - case 4: - { - m_StackedWidget->setCurrentWidget(m_OtherInfo); - break; - } - case 5: - { - m_StackedWidget->setCurrentWidget(m_SystemUpdate); - break; - } - case 6: - { - enterDefaultPrintSettingMode(); - break; - } - default: - break; - } -} - -void InkJetPrinter::getSystemManageWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - { - m_StackedWidget->setCurrentWidget(m_MainInstruction); - break; - } - default: - break; - } -} - -void InkJetPrinter::getSystemUpdateWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - { - m_StackedWidget->setCurrentWidget(m_MainInstruction); - break; - } - break; - - default: - break; - } -} - -void InkJetPrinter::getSystemSettingWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - case 2: - { - m_StackedWidget->setCurrentWidget(m_MainInstruction); - break; - } - default: - break; - } -} - -void InkJetPrinter::getOtherInfoWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - case 2: - { - m_StackedWidget->setCurrentWidget(m_MainInstruction); - break; - } - default: - break; - } -} - -void InkJetPrinter::getLogInfoWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - case 2: - case 3: - case 4: - { - m_StackedWidget->setCurrentWidget(m_MainWidget); - break; - } - default: - break; - } -} - -void InkJetPrinter::getDateSetWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - { - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - // m_TestPrintWidget->onEditItemVarDone(); - DateItemModel model = m_DateVarSet->dateModel(); - const auto textModel = m_DateVarSet->textItemModeL(); - qInfo() << "A new datetime pattern: " << model.datetimePattern; - qInfo() << "Text model: " << TextItemModel::toString(textModel); - m_TestPrintWidget->addDateTimeItem(model, textModel); - break; - } - case 2: - { - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - break; - } - case 3: - { - break; - } - default: - break; - } - -} - -void InkJetPrinter::getCounterVarSetWidgetButtonClickSlot(int index){ - switch (index) - { - case 1: - { - CounterViewModel vm = m_CounterVarSet->getCounterConfig(); - m_TestPrintWidget->addCounterItem(vm); - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - break; - } - case 2: - { - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - break; - } - case 3: - { - break; - } - default: - break; - } -} - -void InkJetPrinter::slt_counterVarUpdate() -{ - // m_StackedWidget->setCurrentWidget(m_TestPrintWidget); -} - -void InkJetPrinter::showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel) -{ - m_StackedWidget->setCurrentWidget(m_scheduleShiftsEditor); - m_scheduleShiftsEditor->setItemModel(schedules, txtModel); -} - -void InkJetPrinter::onScheduleShiftsEditDone() -{ - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - m_TestPrintWidget->addScheduleShiftsItem(m_scheduleShiftsEditor->scheduleModel(), m_scheduleShiftsEditor->textItemModel()); -} - -bool InkJetPrinter::eventFilter(QObject *watched, QEvent *event) -{ - -// if(sysPara->status.flagOfKeyBoardType) -// return QTabWidget::eventFilter(watched,event); -//qDebug()<<"eventFilter"; - QSpinBox *qsb=dynamic_cast(watched); - QLineEdit *qle=dynamic_cast(watched); - QTextEdit *qte=dynamic_cast(watched); - QWidget *widget = qobject_cast(watched); - switch (event->type()){ - case QEvent::FocusIn: - if(qsb&&!qsb->isReadOnly()||qle&&!qle->isReadOnly()||qte&&!qte->isReadOnly() && watched->objectName() != "inputPreviewBox") - myInputMethod->updateHandler(1); - break; - case QEvent::FocusOut: - if(watched->objectName() != "inputPreviewBox") - myInputMethod->updateHandler(2); - break; - case QEvent::MouseButtonPress: - if(widget && !qsb && !qle && !qte && !myInputMethod->shouldIgnoreHideForWidget(widget)) - myInputMethod->clearCurrentFocusAndHide(); - break; - } - - return QWidget::eventFilter(watched,event); -} - -/*************************FPGA通过串口读取状态赋值给status-start******************************************/ -void InkJetPrinter::saveFPGAVersionNum(unsigned int data){ - sysPara->status.fpgaVersionNum=data; -} -unsigned char statWarnTempData=0; -void InkJetPrinter::saveFPGAStatus(unsigned char *data){ - quint16 len=data[5]; - len=len<<8; - len+=data[6]; - unsigned char *target= ((unsigned char *)&sysPara->status); - for(int i=0;istatus.dummy != sysPara->status.isPrinting && sysPara->status.selfCheckDone){ - sysPara->status.isPrinting = sysPara->status.dummy; - m_MainWidget->updatePrintDisplayLabel(); - emit printStatusChanged(sysPara->status.isPrinting); - } -} - -void InkJetPrinter::saveFPGAPhaseDetectHighTm(unsigned char *data){ - quint16 len=data[5]; - len=len<<8; - len+=data[6]; - unsigned char *target= ((unsigned char *)&sysPara->status.phaseDetectHighTm); - for(int i=0;istatus.calandar_and_dat); - for(int i=0;istatus.calandar_and_dat.cnt1CurrValue, 16); - bool ok; - // sysPara->para.cnt1CurrValue = hexStr.toUInt(&ok, 10); - - hexStr = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue, 16); - // sysPara->para.cnt2CurrValue = hexStr.toUInt(&ok, 10); -} - -void InkJetPrinter::saveFPGACnt3CurrValue(unsigned char *data){ - quint16 len=data[5]; - len=len<<8; - len+=data[6]; - unsigned char *target= ((unsigned char *)&sysPara->status.Status_Counter3.cnt3CurrValue); - for(int i=0;istatus.XXXDay); - for(int i=0;idevOp->stopSendDataFPGA = true; - else - sysPara->devOp->stopSendDataFPGA = false; -} - -void InkJetPrinter::stopSendSTM32Data(bool flag){ - if(flag) - sysPara->devOp->stopSendDataSTM32 = true; - else - sysPara->devOp->stopSendDataSTM32 = false; -} - - -/*************************FPGA通过串口读取状态赋值给status-end******************************************/ - - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - - -/*************************STM32通过串口读取状态赋值给status-start******************************************/ -void InkJetPrinter::saveSTM32Status(unsigned char *data){ - unsigned char *target= ((unsigned char *)&sysPara->status)+0x44; - int len = data[3]; - for(int i=0;istatus.reclaimTankstatus); -// emit showMotorIsen(sysPara->status.MOTOR_ISEN,sysPara->status.AD_FIXED); -} - -void InkJetPrinter::saveGearPumpVal(unsigned char *data){ - unsigned char *target= ((unsigned char *)&sysPara->para.gearPumpValue); - for(int i=0;ipara.gearPumpValue > 0) - return; - - unsigned char *target= ((unsigned char *)&PulseCnt); - for(int i=0;istatus.stm32Verion); - for(int i=0;istatus.flagOfPowerOnMode = (sysPara->status.stm32Verion>>23) & 0x01; - if(sysPara->status.flagOfPowerOnMode) - sysPara->status.waitPowerOffTime = 18;//半个小时 - else - sysPara->status.waitPowerOffTime = 0; - LogInfo::setRunStatusText(tr("flagOfPowerOnMode: %1").arg(sysPara->status.flagOfPowerOnMode)); - QString STM32Ver = QString("%1.%2.%3").arg((sysPara->status.stm32Verion>>16)&0x7F) - .arg((sysPara->status.stm32Verion>>8) & 0xFF).arg(sysPara->status.stm32Verion&0xFF); - qDebug()<<"STM32Ver:"<status.stm32Time = true; - } - - QString Year = QString::number(datatime[0])+QString::number(datatime[1]); - QString Month = QString("%1").arg(datatime[2], 2, 10, QChar('0')); - QString Day = QString("%1").arg(datatime[3], 2, 10, QChar('0')); - QString Week = QString::number(datatime[4]); - - QString Hour = QString("%1").arg(datatime[5], 2, 10, QChar('0')); - QString Minute = QString("%1").arg(datatime[6], 2, 10, QChar('0')); - QString Second = QString("%1").arg(datatime[7], 2, 10, QChar('0')); - QString date = Year+"-"+Month+"-"+Day+" "+Hour+":"+Minute+":"+Second; - qDebug()<PowerOnSetTime(date); - -} - - -/*************************STM32通过串口读取状态赋值给status-end******************************************/ - - -void InkJetPrinter::closedSerial(){ - if(m_serialThreadFPGA->isRunning()){ - m_serialThreadFPGA->quit(); - m_serialThreadFPGA->wait(); - } - if(m_serialThreadSTM32->isRunning()){ - m_serialThreadSTM32->quit(); - m_serialThreadSTM32->wait(); - } - if(serialFPGA) - delete serialFPGA; - if(serialSTM32) - delete serialSTM32; -} - -void InkJetPrinter::closeSerialFPGA(){ - if(m_serialThreadFPGA->isRunning()){ - m_serialThreadFPGA->requestInterruption(); - m_serialThreadFPGA->quit(); - m_serialThreadFPGA->wait(); - } - - if(serialFPGA){ - delete serialFPGA; - serialFPGA = nullptr; - } -} - -void InkJetPrinter::closeSerialSTM32(){ - - if(m_serialThreadSTM32->isRunning()){ - - LogInfo::setRunStatusText("Closing STM32 serial port and exit thread..."); - - m_serialThreadSTM32->requestInterruption(); - m_serialThreadSTM32->quit(); - m_serialThreadSTM32->wait(); - } - if(serialSTM32){ - delete serialSTM32; - serialSTM32 = nullptr; - } -} - -void InkJetPrinter::restartSerialPort(){ - - closeSerialFPGA(); - closeSerialSTM32(); - - initSerialPorts(); -} - -void InkJetPrinter::initSerialPorts() -{ - serialFPGA = new Serial("/dev/ttyAS5"); - connect(m_serialThreadFPGA, &QThread::started, serialFPGA, &Serial::startInitSlot); - serialFPGA->moveToThread(m_serialThreadFPGA); - connect(serialFPGA,SIGNAL(sendQueueData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendFPGADate(int,int,unsigned char*,int,int))); - connect(serialFPGA,SIGNAL(resendFPGAData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendFPGADate(int,int,unsigned char*,int,int))); - connect(sysPara->devOp,SIGNAL(sendSerialDataToFPGA(int,int,unsigned char*,int,int)),serialFPGA,SLOT(sendSerialData(int,int,unsigned char*,int,int)),Qt::QueuedConnection); - connect(serialFPGA,SIGNAL(getFPGAVersion(uint)),this,SLOT(saveFPGAVersionNum(uint))); - connect(serialFPGA,SIGNAL(stopSendData(bool)),this,SLOT(stopSendFPGAData(bool))); - connect(serialFPGA,SIGNAL(getFPGAPhaseDetectHighTm(unsigned char*)),this,SLOT(saveFPGAPhaseDetectHighTm(unsigned char*))); - connect(serialFPGA,SIGNAL(getFPGAStatus(unsigned char*)),this,SLOT(saveFPGAStatus(unsigned char*))); - connect(serialFPGA,SIGNAL(getFPGACalandarAndDat(unsigned char*)),this,SLOT(saveFPGACalandarAndDat(unsigned char*))); - connect(serialFPGA,SIGNAL(getFPGACnt3CurrValue(unsigned char*)),this,SLOT(saveFPGACnt3CurrValue(unsigned char*))); - connect(serialFPGA,SIGNAL(getFPGAXXXDay(unsigned char*)),this,SLOT(saveFPGAXXXDay(unsigned char*))); - connect(serialFPGA,SIGNAL(queueSizeFPGA(int)),this,SLOT(showFPGAqueuesize(int))); - connect(serialFPGA,SIGNAL(queueFPGASizeSIG(int)),this,SLOT(showqueueFPGAsize(int))); - connect(serialFPGA, &Serial::FPGABuildDat, this, [this](int buildTime){ - sysPara->status.build_dat.builTime = quint16(buildTime); - qDebug() << "FPGA build time: " << buildTime; - LogInfo::setRunStatusText(QString("FPGA build time: %1").arg(buildTime)); - }); - - serialSTM32 = new Serial("/dev/ttyAS2"); - connect(m_serialThreadSTM32, &QThread::started, serialSTM32, &Serial::startInitSlot); - serialSTM32->moveToThread(m_serialThreadSTM32); - connect(serialSTM32,SIGNAL(sendQueueData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendSTM32Date(int,int,unsigned char*,int,int))); - connect(sysPara->devOp,SIGNAL(sendSerialDataToSTM32(int,int,unsigned char*,int,int)),serialSTM32,SLOT(sendSerialData(int,int,unsigned char*,int,int))); - connect(serialSTM32,SIGNAL(getSTM32Status(unsigned char*)),this,SLOT(saveSTM32Status(unsigned char*))); - connect(serialSTM32,SIGNAL(getGearPumpVal(unsigned char*)),this,SLOT(saveGearPumpVal(unsigned char*))); - connect(serialSTM32,SIGNAL(getPulseCnt(unsigned char*)),this,SLOT(savePulseCntVal(unsigned char*))); - connect(serialSTM32,SIGNAL(getSTM32Version(unsigned char*)),this,SLOT(saveSTM32Version(unsigned char*))); - connect(serialSTM32,SIGNAL(getSTM32Time(unsigned char*)),this,SLOT(saveSTM32Time(unsigned char*))); - connect(serialSTM32,SIGNAL(stopSendData(bool)),this,SLOT(stopSendSTM32Data(bool))); - connect(serialSTM32,SIGNAL(powerOffReady()),m_MainWidget,SLOT(powerOffConfirmed())); - connect(serialSTM32,SIGNAL(queueSizeSTM32(int)),this,SLOT(showSTM32queuesize(int))); - connect(serialSTM32, &Serial::STM32Connected, this, [this](bool ok, QString errorMsg){ - if(ok){ - LogInfo::setRunStatusText("Connected to STM32 serial port"); - } - else{ - LogInfo::setRunStatusText("STM32 serial port connection failed: " + errorMsg); - } - }); - - flagOfSerialThreadStratEn = true; -} - -void InkJetPrinter::showFPGAqueuesize(int size){ - sysPara->status.sizeFPGA = size; -} - -void InkJetPrinter::showSTM32queuesize(int size){ - sysPara->status.sizeSTM32 = size; -} - -void InkJetPrinter::showqueueFPGAsize(int size){ - sysPara->status.sizequeueFPGA = size; -} - -void InkJetPrinter::autoControlValvePump(void) - -{ - if(sysPara){ - if(!sysPara->status.isPumpValveControledByHand){ - - /*---------------------------------供墨阀--------------------------------------------*/ - bool enableFlag = ((sysPara->status.statWarn & WARN_STATUS_INK_SWINT) - || (sysPara->status.lastRecycleWarn && sysPara->para.RecycleWarnAction) // 2017.8.15版本回收故障关供墨阀问题 - || ( sysPara->status.HVFaultCloseEn ) //高压故障关闭墨线 - )?false:true; //墨线开关 - - if(enableFlag != sysPara->devOp->isInkValveOpen()){ - if(enableFlag == false) { //关闭供墨阀的顺序 先开循环阀后关闭供墨阀间 - if (sysPara->status.cycleValveOpenCntAfterSWintOff == 0) { - sysPara->status.cycleValveOpenCntAfterSWintOff = MAX_CYCLEVALVE_OPEN_TIME_AFTER_SWITN_OFF; - } - if (sysPara->status.cycleValveOpenCntAfterSWintOff < 60) { //在准备关闭循环阀的时候关闭供墨阀 - sysPara->devOp->controlInkValve(enableFlag); //关供墨 - sysPara->devOp->controlInkValvePWM(enableFlag); //关供墨 - } - } - else { //开供墨阀 - if(!sysPara->devOp->isReclaimPumpOpen()) //开供墨阀之前要判断回收泵有没有开,没开就提前打开 - { - sysPara->devOp->controlReclaimPump(true, false); // 回收泵开 - } - if(!m_MainWidget->m_2sFlag) - { - sysPara->devOp->controlInkValve(enableFlag); - sysPara->devOp->controlInkValvePWM(enableFlag); - } - } - } - - /*----------------------------------循环阀-------------------------------------------*/ - if(!sysPara->status.selfCheckDone) { - if(!sysPara->devOp->isCycleValveOpen()) { - sysPara->devOp->controlCycleValve(false); - } - } - else { - autoControlCycleValve(); - } - - /*----------------------------------泄压阀-------------------------------------------*/ - //===================================================================================================== - - if(( - sysPara->status.releaseValveOpenApending || - sysPara->status.pressureOverFlowCnt > 2 - ) //防止干扰和误动作 - && !sysPara->status.releaseValveDelayCnt) - { - if(!sysPara->devOp->isReleaseValveOpen()) - { //泄压阀 - sysPara->devOp->controlReleaseValve(true); - } - sysPara->status.releaseValveDelayCnt = MAX_RELEASE_VALVE_DELAY_CNT; - sysPara->status.releaseValveOpenApending = true; - } - else - { - if(sysPara->devOp->isReleaseValveOpen()) - { // - //sysPara->devOp->controlReleaseValve(false); - } - - if(sysPara->status.releaseValveDelayCnt) - sysPara->status.releaseValveDelayCnt --; - if(sysPara->status.PRESSURE < sysPara->para.pressure) - { - sysPara->status.releaseValveOpenApending = false; - if(sysPara->devOp->isReleaseValveOpen()){ sysPara->devOp->controlReleaseValve(false); - - } - } - } - - /*-----------------------------------主墨泵------------------------------------------*/ -// if(sysPara->status.SEPTAL_POSITION < (sysPara->para.septalPostion - DIFF_SEPTAL_POSITION)) -// sysPara->status.septalPositionOverFlowCnt ++; -// else -// sysPara->status.septalPositionOverFlowCnt = 0; - if(sysPara->status.septalPositionOverFlowCnt > 2 && !sysPara->status.mainInkPumpError){ //主墨泵 - if(!sysPara->devOp->isMainInkPumpOpen()){ - sysPara->devOp->controlMainInkPump(true); - sysPara->status.mainInkPumpRunTmCnt = 0; - } - else if(sysPara->status.selfCheckDone){ - if(sysPara->status.mainInkPumpRunTmCnt < MAX_MAIN_INK_PUMP_RUN_TIME){ // - sysPara->status.mainInkPumpRunTmCnt ++; - } - else { - if(!sysPara->para.gearPumpEnable) - { - sysPara->status.mainInkPumpError = true; - sysPara->devOp->controlMainInkPump(false); -// LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!主墨泵故障")); -// ui->tabMainWindow->setRunStatus(tr("主墨泵故障!!!")); - } - } - } - } - else if(sysPara->status.SEPTAL_POSITION > sysPara->para.septalPostion){ - if(sysPara->devOp->isMainInkPumpOpen()) - sysPara->devOp->controlMainInkPump(false); - } - /*-----------------------------------压缩机------------------------------------------*/ - /*reserved - if((sysPara->para.pressure - sysPara->status.PRESSURE > MAX_PRESSURE_DIFF) && !sysPara->status.compressPumpError){ //压缩机 - if(!sysPara->devOp->isCompressPumpOpen()){ - sysPara->devOp->controlCompressPump(true); - sysPara->status.compressPumpRunTmCnt = 0; - } - else if(sysPara->status.selfCheckDone){ - if(sysPara->status.compressPumpRunTmCnt < MAX_COMPRESS_PUMP_RUN_TIME){ //如果长时间开压缩机,考虑设备故障 - sysPara->status.compressPumpRunTmCnt ++; - } - else { - sysPara->status.compressPumpError = true; - sysPara->devOp->controlCompressPump(false); - if(!sysPara->para.gearPumpEnable) - { -// LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!压缩机故障")); -// ui->tabMainWindow->setRunStatus(tr("压缩机故障!!!")); - } - - } - } - } - else if(sysPara->para.pressure <= sysPara->status.PRESSURE){ //压力到达预期的压力 - if(sysPara->devOp->isCompressPumpOpen()) - sysPara->devOp->controlCompressPump(false); - }*/ - - /*------------------------------------粘度泵,混合阀-----------------------------------------*/ - - /*-----------------------------每30s打开一次粘度泵以及相关处理--------------------------------------*/ - static bool hasDetectedBellow = false; // 检测到下位灯 - static bool hasDetectedTop = false; // 检测到上位灯 - static int viscosity_low = 0; //统计粘度连续偏低10%次数 - static unsigned char Mixing_valve_open = 0; //统计粘度连续偏高5%次数 - static unsigned char viscosity_faulty_num = 0; //统计粘度连续偏高13%次数 - static bool flag = 0; - - if(sysPara->status.cycleValveOpenCntAfterSWintOff) { //关闭墨线的时候要提前开粘度泵 - sysPara->status.viscosityDelayCnt = sysPara->para.viscosityPumpInterval*100 + 100; - } - ++sysPara->status.viscosityDelayCnt; - int mixer_open_threshold = (105*sysPara->para.viscosity)/100; - int viscosity_faulty_threshold =(113*sysPara->para.viscosity)/100; - if(sysPara->status.viscosityDelayCnt >= sysPara->para.viscosityPumpInterval*100 && flag == 0) - { - flag=1; - if (!sysPara->devOp->isViscosityPumpOpen()) - { - sysPara->devOp->controlViscosityPump(true); - viscosity_timer->start(10000); - qDebug()<<"粘度: "<status.viscosity); - } - if((sysPara->status.viscosity >= 90*sysPara->para.viscosity/100) && (sysPara->status.viscosity <= mixer_open_threshold)) - { - sysPara->status.viscosityFault = 0; - viscosity_low=0; - Mixing_valve_open = 0; - viscosity_faulty_num = 0; - } - if(sysPara->status.viscosity < 90*sysPara->para.viscosity/100) - { - viscosity_low++; - viscosity_faulty_num = 0; - Mixing_valve_open = 0; - } - if(sysPara->status.viscosity > mixer_open_threshold && sysPara->status.viscosity <= viscosity_faulty_threshold) - { - Mixing_valve_open++; - viscosity_low = 0; - viscosity_faulty_num = 0; - } - if(sysPara->status.viscosity > viscosity_faulty_threshold){ - Mixing_valve_open++; - viscosity_faulty_num++; - viscosity_low = 0; - } - - if((!sysPara->devOp->isMixValveOpen()) && (((Mixing_valve_open > 1) && (!sysPara->para.gearPumpEnable)) || ((Mixing_valve_open > 4) && sysPara->para.gearPumpEnable))) { // - sysPara->devOp->controlMixValve(true); - Mixing_valve_open = 0; -// LogInfo::setRunStatusText(tr("添加溶剂:")+QString::number(sysPara->status.viscosity)); - qDebug()<<"添加溶剂"; - } - - if(viscosity_low >= 60) - { -// LogInfo::setRunStatusText(tr("警告!!!!!!!!!!!粘度值偏低")+QString::number(sysPara->status.viscosity)); - qDebug()<<"粘度值偏低"; - sysPara->status.viscosityFault = 2; - if(sysPara->devOp->isMixValveOpen()) { - sysPara->devOp->controlMixValve(false); - } - } - if(viscosity_faulty_num >= 5) - { -// LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!粘度偏大故障")+QString::number(sysPara->status.viscosity)); - qDebug()<<"粘度偏大故障"; - sysPara->status.viscosityFault = 1; - } - - } - if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+120)) && flag==1) - { - if(sysPara->devOp->isMixValveOpen()) { - sysPara->devOp->controlMixValve(false); - } - } - - if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+130)) && flag==1) - { - if (sysPara->devOp->isViscosityPumpOpen()) { - sysPara->devOp->controlViscosityPump(false); - } - sysPara->status.viscosityDelayCnt = 0; - flag=0; - } - - if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY){ //上位灯检测标志位 - viscosity_timer->stop(); - } - - if(sysPara->status.viscosityDelayCnt < sysPara->para.viscosityPumpInterval*100) { - static int detectBelow = 0; - if (++detectBelow%400 == 0) { - if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY) - { - if(sysPara->status.rWarnViscoReady>=15){ - sysPara->status.viscosityFault = 1; - sysPara->status.viscosity=0; - if(!firstTime) - qDebug()<<"错误!粘度计下位灯故障."+QString::number(sysPara->status.viscosity); - // LogInfo::setRunStatusText(tr("错误!粘度计下位灯故障.")+QString::number(sysPara->status.viscosity)); - hasDetectedBellow = true; - } - else sysPara->status.rWarnViscoReady++; - } - else { - sysPara->status.rWarnViscoReady = 0; - sysPara->status.viscosityFault = 0; - } - } - } - if(hasDetectedBellow && hasDetectedTop) - { - if(sysPara->devOp->isMixValveOpen()) { // - sysPara->devOp->controlMixValve(false); //如果检测不到上下位灯就关掉混合阀 - } - } - if(sysPara->status.viscosityFault==0) - { - hasDetectedBellow = false; - hasDetectedTop = false; - } -// } - /*-----------------------------------回收泵------------------------------------------*/ - - if(!sysPara->status.autoCtlReclaimAfterSWintOff) - { - if(!sysPara->devOp->isReclaimPumpOpen() ){ //回收泵 - // ui->tabMainWindow->setRunStatus(tr("全速回收泵!!!")); - sysPara->status.reclaimPumpFullSpeedCnt = 0; - sysPara->devOp->controlReclaimPump(true,true); //先全速,后降速 - } - else if(sysPara->status.reclaimPumpFullSpeedCnt <= RECLAIM_PUMP_FULL_SPEED_CNT){ - sysPara->status.reclaimPumpFullSpeedCnt ++; - if(sysPara->status.reclaimPumpFullSpeedCnt == RECLAIM_PUMP_FULL_SPEED_CNT){ //降速 - // ui->tabMainWindow->setRunStatus(tr("降速回收泵!!!")); - sysPara->devOp->controlReclaimPump(true,false); - } - } - } - /*-----------------------------------------------------------------------------*/ - } - } -} - -void InkJetPrinter::autoControlCycleValve() -{ - if(!sysPara->status.selfCheckDone || (sysPara->status.flagOfPowerOnMode && sysPara->para.gearPumpEnable)){ - // if(!sysPara->devOp->isCycleValveOpen()){ //循环阀 //定时开机循环时隔膜泵不开关循环阀 - // sysPara->devOp->controlCycleValve(true); - // } - cycleValveRunForSelfCheck(); - if(sysPara->status.flagOfPowerOnMode) - { - if(sysPara->devOp->isMixValveOpen()) { // - sysPara->devOp->controlMixValve(false); - } - } - } - else { - if(sysPara->status.cycleValveOpenCntAfterSWintOff){ // 开循环阀 - if(!sysPara->devOp->isCycleValveOpen()){ - sysPara->devOp->controlCycleValve(true); - } - sysPara->status.cycleValveOpenCntAfterSWintOff --; - } - else if(sysPara->devOp->isCycleValveOpen()){ // 关循环阀 - sysPara->devOp->controlCycleValve(false); - } - } -} - -//在开机自检过程中交替打开和关闭循环阀 -void InkJetPrinter::cycleValveRunForSelfCheck(){ - static int cycleValveOpenCnt = 0; - if (++cycleValveOpenCnt%300 > 150) { - if(!sysPara->devOp->isCycleValveOpen()){ //循环阀 开 - sysPara->devOp->controlCycleValve(true); - } - } - else { - if(sysPara->devOp->isCycleValveOpen()){ //循环阀 关 - sysPara->devOp->controlCycleValve(false); - } - } -} - - -void InkJetPrinter::autoControlHeater(){ - //100ms - static int tempDly=1830; - if(sysPara->para.heatTime == 0) - sysPara->para.heatTime = 5; - int maxHeatTime = sysPara->para.heatTime * 600; - if(sysPara->para.flagOfContinueHeat) - maxHeatTime = 60* 600; - if(tempDly) tempDly--; - if(tempDly>=1800) - { - if(tempDly==1800) - { - sysPara->status.indoorTemperature = sysPara->status.TEMP_ADIN/4; - sysPara->devOp->pumpValveCtrl(1); -// if(sysPara->status.indoorTemperature-35>0) -// ui->tabSystemSetting->updateViscosityAdjust((sysPara->status.indoorTemperature-35)); -// else -// ui->tabSystemSetting->updateViscosityAdjust(0); - } - return; - } - if(sysPara->status.TEMP_ADIN/4 < sysPara->para.temperature && sysPara->status.heaterONTimeCnt < MAX_HEATER_TIME){ - if(tempDly==0) sysPara->status.heaterONTimeCnt ++; - sysPara->devOp->controlHeater(true); - - if(sysPara->status.heaterONTimeCnt == maxHeatTime) - { - if(sysPara->status.TEMP_ADIN/4 < (sysPara->para.temperature - 2)){ -// LogInfo::setRunStatusText(tr("警告:加热器长时间无法达到预期温度,故障或设置错误!")); -// ui->tabMainWindow->setRunStatus("加热器长时间无法达到预期温度,故障或设置错误!");//20150105 no check - sysPara->devOp->controlHeater(false); - } - else - sysPara->status.heaterONTimeCnt = 0; - } - } - else if(sysPara->status.TEMP_ADIN/4 >= (sysPara->para.temperature + 2)){ - if(sysPara->status.heaterONTimeCnt < maxHeatTime) - { - sysPara->status.heaterONTimeCnt = 0; - } -// if(sysPara->devOp->isHearterEnable()) - sysPara->devOp->controlHeater(false); - } -} - -/* - * - * 控制回收槽 - * - * */ -void InkJetPrinter::detectAndcontrolReclaimTank(){ - sysPara->status.currReclaimTankPos =10*sysPara->status.curr_reclaimTankTime; - sysPara->status.reclaimTankBlockedAppending =0; - if(sysPara->status.reclaimTankstatus == 0x10) //7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { - LogInfo::setRunStatusText(tr("电机故障")); - m_MainWidget->setRunStatus(tr("电机故障")); - if(sysPara->devOp->isReclaimTankCloseEnable()) - { - sysPara->devOp->controlReclaimTankClose(false); - } - else { - if(sysPara->devOp->isReclaimTankOpenEnable()) - sysPara->devOp->controlReclaimTankOpen(false); - } - - m_MainWidget->stopFlashReclaimOpenBtn(); - } - else if(sysPara->status.reclaimTankstatus == 5 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { - if(sysPara->devOp->isReclaimTankOpenEnable()) - sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭 - sysPara->status.reclainTankReachEnd = true; - m_MainWidget->setRunStatus(tr("回收槽到头")); - m_MainWidget->setReclaimStatus(true, 100); - m_MainWidget->enablePrintButton(true); //仅仅在此时能使能打印按钮 - // sysPara->devOp->highVoltageCtrl(1); - - m_MainWidget->stopFlashReclaimOpenBtn(); - -// emit reclaimTankOpenDone(); - /*回收槽开关时间校正*/ - sysPara->para.reclaimTankTime =( sysPara->status.currReclaimTankPos>120 )? sysPara->status.currReclaimTankPos/10-1:12; - m_SystemSetting->updateReclaimTime( sysPara->para.reclaimTankTime ); - - qDebug()<<"reclaimTankOpenDone currReclaimTankPos:"<status.currReclaimTankPos; - qDebug()<<"reclaimTankOpenDone curr_reclaimTankTime:"<status.curr_reclaimTankTime; - - LogInfo::setRunStatusText("reclaimTankOpenDone currReclaimTankPos:"+QString::number(sysPara->status.currReclaimTankPos)); - } - else if(sysPara->status.reclaimTankstatus == 0x11 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { - sysPara->devOp->controlReclaimTankOpen(false); //卡住,关闭 - m_MainWidget->stopFlashReclaimOpenBtn(); -// ui->tabMainWindow->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); - } - else if(sysPara->status.reclaimTankstatus == 1 || sysPara->status.reclaimTankstatus == 2)//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { - auto recliamTime = (sysPara->para.reclaimTankTime != 0 ? sysPara->para.reclaimTankTime : 15.0f) * 10.0f; - int rate = qBound(0, 100, int((sysPara->status.currReclaimTankPos / recliamTime) * 100)); - - // 不知道为什么会有rate为0,且 sysPara->status.reclaimTankstatus == 2 ,也就是 关的状态。 回收槽位置在0处,而状态却是 关 ,很奇怪 - if(sysPara->status.reclaimTankstatus != 2 && rate != 0) { - m_MainWidget->setReclaimStatus(sysPara->status.reclaimTankstatus == 1, rate); - } - - m_MainWidget->setReclaimOpenBtnStatus(sysPara->status.reclaimTankstatus == 2); - m_MainWidget->setReclaimCloseBtnStatus(sysPara->status.reclaimTankstatus == 1); - - sysPara->status.reclaimBlockedCnt = 0; - } - else if(sysPara->status.reclaimTankstatus == 6 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { - if(sysPara->devOp->isReclaimTankCloseEnable()) - sysPara->devOp->controlReclaimTankClose(false); //到头,关闭 - m_MainWidget->setReclaimStatus(false, 0); - m_MainWidget->stopFlashReclaimOpenBtn(); - //sysPara->status.currReclaimTankPos = 0; //将回收槽的时间置为零 -// emit reclaimTankCloseDone(); - sysPara->status.lastRecycleWarn = 0; - sysPara->status.HVFaultCloseEn=0; - sysPara->status.reclainCloseAppending=false; - sysPara->status.canRunAirPushing = true; //下次开回收槽就执行排气程序 - } - else if(sysPara->status.reclaimTankstatus == 0x12 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { - sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭 - LogInfo::setRunStatusText(tr("回收槽卡住或者回收槽开关时间设置错误")); - m_MainWidget->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); - } - else if(sysPara->status.reclaimTankstatus == 4 ) - { - m_MainWidget->setReclaimOpenBtnStatus(true); - m_MainWidget->setReclaimCloseBtnStatus(true); - LogInfo::setRunStatusText("Reclaim tank hold on "+QString::number(sysPara->status.currReclaimTankPos)); - } -} - -void InkJetPrinter::viscosity_timerHandler() -{ - if(!firstTime) - qDebug()<<"错误!粘度计故障:检测不到上位灯"; - // LogInfo::setRunStatusText(tr("错误!粘度计故障:检测不到上位灯")); - viscosity_timer->stop(); - firstTime = 0; -} - -void InkJetPrinter::rebootApp() -{ - if(!sysPara->status.selfCheckDone) - sysPara->status.selfCheckDone = true; - - this->setDisabled(true); - - m_StackedWidget->setCurrentWidget(m_MainWidget); - - // emit setDisableAll(); - if(!TEST_MODE && sysPara->para.flagOfReclaimPumEnable){ - for(int i=15;i>11;i--) - { - if(i == 15){ - sysPara->status.isPumpValveControledByHand = true; //停止自动 - sysPara->devOp->controlInkValve(true); - sysPara->devOp->controlInkValvePWM(true); - sysPara->devOp->controlReclaimPump(true,true); - sysPara->devOp->controlViscosityPump(true); - sysPara->devOp->controlCycleValve(true); - sysPara->para.gearPumpValue = 0; - sysPara->devOp->WriteMoterPump(); - } - if(i == 12){ - sysPara->devOp->controlInkValve(false); - sysPara->devOp->controlInkValvePWM(false); - } - m_MainWidget->setRunStatus(tr("正在准备重启,请等待%1秒......").arg(i)); - MySleep(1000); - } - } - sysPara->devOp->controlReclaimTankOpen(true); - sysPara->status.isPumpValveControledByHand = true; //停止自动 - if(sysPara->para.gearPumpEnable ){ - if(!sysPara->para.flagOfReclaimPumEnable){ - sysPara->para.gearPumpValue = 360; - sysPara->devOp->WriteMoterPump(); - } - else{ - sysPara->devOp->controlReclaimPump(true,false); - sysPara->para.gearPumpValue = 0; - sysPara->devOp->WriteMoterPump(); - } - } - else{ - sysPara->para.reclaimPumpPWMWidth = 95; - sysPara->devOp->controlReclaimPump(true,true); - } - - if(!sysPara->devOp->isViscosityPumpOpen()) - sysPara->devOp->controlViscosityPump(true); - sysPara->devOp->controlCycleValve(true); - sysPara->devOp->controlInkValve(false); //关供墨 - sysPara->devOp->controlInkValvePWM(false); //关供墨 - - if(!TEST_MODE){ - for(int i=11;i>7;i--) - { - if(i==9) - sysPara->devOp->controlReclaimTankOpen(false); - m_MainWidget->setRunStatus(tr("正在准备重启,请等待%1秒......").arg(i)); - MySleep(1000); - } - } - - if(!sysPara->status.lostCommuFlag){ - sysPara->para.calandar_and_dat.cnt1CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt(); - sysPara->para.calandar_and_dat.cnt2CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue,16).toInt(); - sysPara->para.Counter3.cnt3CurrValue = QString::number(sysPara->status.Status_Counter3.cnt3CurrValue,16).toInt(); - - m_MainWidget->updateTotalCnt(0); - sysPara->saveParaToFile(); // 关机前将相关配置保存 - } - sysPara->status.powerOffAppending = false; - if(!TEST_MODE){ - for(int i=7;i>0;i--) - { - if(i == 5) - sysPara->devOp->controlReclaimTankClose(true); - if(i == 4){ - sysPara->devOp->controlViscosityPump(false); - sysPara->devOp->controlCycleValve(false); - sysPara->devOp->controlReclaimPump(false,false); - sysPara->para.gearPumpValue = 0; - sysPara->devOp->WriteMoterPump(); - } - m_MainWidget->setRunStatus(tr("正在准备重启,请等待%1秒......").arg(i)); - MySleep(1000); - } - } - - sysPara->saveParaToFile(); // 关机前将相关配置保存 - sysPara->saveRFIDPara(); - MySleep(200); - system("sync");//缓存同步 - QCoreApplication::quit(); -} - -void InkJetPrinter::handleInitedPID() -{ - PID_init(); -} - - -bool InkJetPrinter::loadLastWorkAndPreparePrint() -{ - // 打开最后一次作业文件 - qDebug() << sysPara->sysFile; - qDebug() << sysPara->para.lastOpenedFileName; - QString lastFilename = QString(sysPara->para.lastOpenedFileName); - - QFileInfo fileInfo(lastFilename); - if (!(fileInfo.exists() && fileInfo.isFile())) { - LogInfo::setRunStatusText(QString("Last work file not found: %1").arg(lastFilename)); - return false; - } - - return loadWorkFileAndPreparePrint(lastFilename); -} - -void InkJetPrinter::restartPrintWhenSwitchedWorkFile(bool isPrinting) -{ - if(!isPrinting) { - m_MainWidget->on_m_StartBtn_clicked(); - auto ret = disconnect(this, &InkJetPrinter::printStatusChanged, this, &InkJetPrinter::restartPrintWhenSwitchedWorkFile); - LogInfo::setRunStatusText(QString("Printing has restarted: %1").arg(ret)); - } -} - -bool InkJetPrinter::loadWorkFileAndPreparePrint(const QString &filename) -{ - auto u8Filename = filename.toUtf8(); - if(u8Filename.size() > int(ARRAY_SIZE(sysPara->para.lastOpenedFileName) - 1)) { - LogInfo::setRunStatusText(QString("File name is too long: %1").arg(filename)); - return false; - } - - PicScene* scene = new PicScene(); - PrintSettingModel model; - auto ret = PicSceneLoader::loadSceneFromFile(filename, scene, &model); - if(!ret) { - LogInfo::setRunStatusText(QString("Failed to load work file: %1").arg(filename)); - delete scene; - return false; - } - - bool rePrint = false; - if(sysPara->status.isPrinting && sysPara->status.selfCheckDone) { - // connect(this, &InkJetPrinter::printStatusChanged, - // this, &InkJetPrinter::restartPrintWhenSwitchedWorkFile, Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection)); - m_MainWidget->on_m_StopBtn_clicked(); - LogInfo::setRunStatusText("Pause printing first, then write to the new file"); - rePrint = true; - } - - PrintSettingModel::applyToSysPara(model, sysPara); - - // 应用完数据之后,将当前值编辑标志位清除,避免下次读取时为 true - model.cnt1Settings.editCurrValue = false; - model.cnt2Settings.editCurrValue = false; - PicSceneLoader::saveSceneToXmlFile(filename, scene, &model); - - ret = m_MainWidget->generatePrintContent(scene); - if(!ret) { - LogInfo::setRunStatusText(QString("Failed to generate print content from work file: %1").arg(filename)); - delete scene; - return false; - } - - LogInfo::setRunStatusText(QString("Work file loaded: %1").arg(filename)); - - ui.label_currWorkFile->setText(QFileInfo(filename).baseName()); - - strncpy(sysPara->para.lastOpenedFileName, u8Filename.constData(), sizeof(sysPara->para.lastOpenedFileName) - 1); - sysPara->para.lastOpenedFileName[sizeof(sysPara->para.lastOpenedFileName) - 1] = '\0'; - sysPara->saveParaToFile(); - - currWorkFile = filename; - - if(rePrint) { - m_MainWidget->on_m_StartBtn_clicked(); - } - - return true; -} - -static int highPressureCnt = 0; -static unsigned int logCnt = 0; - -void InkJetPrinter::checkPressureControl() -{ // 1s - unsigned int alarmPressure = 0; - if(sysPara->para.pressure <= 700) - alarmPressure = 800; - else - alarmPressure = 950; - - if(sysPara->status.PRESSURE > alarmPressure) - highPressureCnt++; - else - highPressureCnt = 0; - - if(highPressureCnt >= 4 && sysPara->status.PRESSURE > 1000){ - QString str = tr("压力过高,请检查管路是否堵塞,然后点击故障恢复按钮"); - showMessage(str); - sysPara->para.gearPumpValue = 0; - sysPara->devOp->WriteMoterPump(); - sysPara->status.isPumpValveControledByHand = true; - sysPara->devOp->mainInkCtrl(); - sysPara->status.flagOfPressureFault = true; - } -} - -void InkJetPrinter::showMessage(QString str){ - if(logCnt++ % 30 == 0){ - LogInfo::setRunStatusText(str); - qDebug()<devOp->color_flag = 2; - m_MainWidget->setRunStatus(str); -} - -void InkJetPrinter::resetPressureCnt(){ - logCnt = 0; - highPressureCnt = 0; -} - -void InkJetPrinter::disableTabClick(){ - this->setDisabled(true); - // this->setCurrentIndex(0); -} - -void InkJetPrinter::setShowVserionInfo(QString str){ - // ui.label_version->setText(str); -} - -void InkJetPrinter::OnFinished(int event){ - //msgtest->setText(" ");msgtest->show(); - Q_UNUSED(event); - msgtest->hide(); - -} - - -#define INTERVAL_AFTER48H 5 - -void InkJetPrinter::warningHandler(int type){ - static bool flagOfWarning = true; - static bool flagOfmtWarning = true; - static int i = 1; - int elasped = curPowerOnDateTime.secsTo(QDateTime::currentDateTime());// 本次开机运行秒数 - if(elasped >= 60*60*i){ //开机后1小时提醒一次,测试时可以缩短 - // if (elasped > 10*i) {//test - i++; - flagOfmtWarning = true; - flagOfWarning = true; - LogInfo::setRunStatusText("Next Hour Warning"); - } - int inkTime = 0, solventTime = 0; - - /***********处理保养到期提示start******************/ - if(type == CARD_TYPE::MAINTENANCE){ - if(sysPara->RFIDPara.needMaintenance){//保养到期,喷码机禁用 - warningShow(CARD_TYPE::MAINTENANCE,timeoutDay); - } - //needMaintenanceRemind:保养到期提前一个月提示标志 - else if(sysPara->status.needMaintenanceRemind){ - if(flagOfmtWarning){ - warningShow(CARD_TYPE::MAINTENANCE,timeoutDay); - flagOfmtWarning = false; - } - } - return; - } - /***********处理保养到期提示end******************/ - - // 超过48小时后,不会执行这一段 - if(flagOfWarning){ - //48小时后禁用,小时=第一次提示时间到当前时间的间隔秒数/60/60 - flagOfWarning = false; - } -} - -// 1:Ink 2:Solvent 3:Maintenance -void InkJetPrinter::warningShow(int type,int num){ - QString str = ""; - if(type == CARD_TYPE::INK && sysPara->RFIDPara.needInkCard){ - if(num < 49) - str = tr("请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用!").arg(num); - else if(num == 49) - str = tr("墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作!"); - slt_showMsg(str); -// m_MainWidget->setRunStatus(str); - LogInfo::setRunStatusText(str); - qDebug()<RFIDPara.needSolventCard){ - if(num < 49) - str = tr("请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用!").arg(num); - else if(num == 49) - str = tr("溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作!"); - slt_showMsg(str); -// m_MainWidget->setRunStatus(str); - LogInfo::setRunStatusText(str); - qDebug()<= 0) - str = tr("保养期还有%1天到期,请及时保养,否则喷码机容易损坏").arg(num); - else - str = tr("保养期已超过%1天,请进行保养以恢复喷码机的正常使用").arg(num*(-1)); - slt_showMsg(str); - LogInfo::setRunStatusText(str); - qDebug()<setText(("E: (New file)")); - m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - m_TestPrintWidget->on_newfileButton_pressed(); -} - -int InkJetPrinter::updateWarningTime(int type){ - QFile file; - if(type == 1) - file.setFileName("/home/plg/inkRFIDTime.txt"); - else if(type == 2) - file.setFileName("/home/plg/solventRFIDTime.txt"); - else - return -1; - - if(!file.exists()){ - LogInfo::setRunStatusText(tr("刷卡倒计时起始时间文件不存在")); - return -1; - } - - QDateTime curDateTime = QDateTime::currentDateTime(); - int dateTimeDiff = -1; - if (type == 1) { - if (inkWarnTime == QDateTime()) { - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - // 读取文件内容 - QTextStream in(&file); - QString starTime = in.readAll(); // 第一次提示的时间 - starTime = starTime.trimmed(); - // 关闭文件 - file.close(); - inkWarnTime = QDateTime::fromString(starTime,"yyyy-MM-dd HH::mm::ss"); - qDebug() << inkWarnTime; - } else { - qDebug() << "Failed to open file for reading:"; - LogInfo::setRunStatusText("Failed to open file for reading"); - return -1; - } - } - dateTimeDiff = inkWarnTime.secsTo(curDateTime); - - } else if (type == 2) { - if (solventWarnTime == QDateTime()) { - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - // 读取文件内容 - QTextStream in(&file); - QString starTime = in.readAll(); // 第一次提示的时间 - starTime = starTime.trimmed(); - // 关闭文件 - file.close(); - solventWarnTime = QDateTime::fromString(starTime,"yyyy-MM-dd HH::mm::ss"); - } else { - qDebug() << "Failed to open file for reading:"; - LogInfo::setRunStatusText("Failed to open file for reading"); - return -1; - } - } - dateTimeDiff = solventWarnTime.secsTo(curDateTime); - } - return dateTimeDiff; -} - -bool InkJetPrinter::cardTouchConfirm(QString msgTxt, QString variableMsgTxt) -{ - QMessageBox box(QMessageBox::Warning, tr("警告"), - msgTxt, QMessageBox::Ok | QMessageBox::Cancel, - this); - - int rfidCountDown = sysPara->para.rfidCountDown; - QTimer msgTimer; - QString boxTxt = variableMsgTxt; - connect(&msgTimer, &QTimer::timeout, [this, &box, &rfidCountDown, boxTxt]() { - box.setText(boxTxt.arg(rfidCountDown)); - box.update(); - rfidCountDown--; - if(rfidCountDown == 0) { - box.accept(); - } - }); - - if(sysPara->para.rfidCountDown > 0) { - box.setText(boxTxt.arg(sysPara->para.rfidCountDown)); - msgTimer.start(1000); - } - - box.exec(); - - return box.result() == QMessageBox::Ok || box.result() == QMessageBox::Accepted; -} - -void InkJetPrinter::initRunTimeCtrl() -{ - if (ctrl_runTime == nullptr) { - ctrl_runTime = RunTimeCtrl::instance(); -#ifdef __RFID_CARD - connect(ctrl_runTime, &RunTimeCtrl::sig_updateTimeoutDay, this, [=](int days) { - // timeoutDay:仅适用于原来月份的处理 - this->timeoutDay = days; - if(timeoutDay <= 30) - sysPara->status.needMaintenanceRemind = true; - }); - connect(ctrl_runTime, &RunTimeCtrl::sig_saveRunTime, this, [=]() { - // 运行时间处理 - sysPara->RFIDPara.runtimeMs = ctrl_runTime->totalRuntimeMs(); - sysPara->saveRFIDPara(); - }); - - // 弹窗提示 - connect(ctrl_runTime, &RunTimeCtrl::sig_alertTimeout, - this, &InkJetPrinter::slt_warningMaintenance); - - curPowerOnDateTime = QDateTime::currentDateTime(); - if (sysPara) - ctrl_runTime->loadConfig(&sysPara->RFIDPara); - ctrl_runTime->start(); -#endif - - } -} - -#ifdef __RFID_CARD -void InkJetPrinter::initRFIDManager() -{ - if (manager_rfid == nullptr) { - manager_rfid = RFIDManager::instance(); - } - - connect(manager_rfid, &RFIDManager::sig_showMsg, - this, &InkJetPrinter::slt_showMsg); - connect(manager_rfid,SIGNAL(sig_maintenanceShow()), - m_MainInstruction,SLOT(maintenanceDialogShow())); - - auto checkReclaimOpenBtn = [this]() { - // if(sysPara->status.selfCheckDone && (sysPara->status.reclaimTankstatus == 2 || sysPara->status.reclaimTankstatus == 6)) { - // m_MainWidget->setReclaimOpenBtnStatus(true); - // } - }; - - connect(manager_rfid, &RFIDManager::sig_inkCardProgressFinished, this, [this](){ - sysPara->RFIDPara.needInkCard = false; - sysPara->saveRFIDPara(); - - if(!sysPara->RFIDPara.addedInk) { - slt_showMsg(tr("刷墨水卡成功, 请及时将该墨水卡对应的墨水添加到机器中")); - } - else { - slt_showMsg(tr("刷墨水卡成功!")); - } - }); - - connect(manager_rfid, &RFIDManager::sig_solventProgressFinished, this, [this](){ - sysPara->RFIDPara.needSolventCard = false; - sysPara->saveRFIDPara(); - - if(!sysPara->RFIDPara.addedSolvent) { - slt_showMsg(tr("刷溶剂卡成功, 请及时将该溶剂卡对应的溶剂添加到机器中")); - } - else { - slt_showMsg(tr("刷溶剂卡成功!")); - } - }); -} - - -#define MAX_WARNING_TIME_HOUR 48 -#define WARNING_INTERVAL_SEC 3600 - -#ifdef BNS_DEBUG - -#undef MAX_WARNING_TIME_HOUR -#undef WARNING_INTERVAL_SEC - -#define MAX_WARNING_TIME_HOUR 10 -#define WARNING_INTERVAL_SEC 20 - -#endif - -void InkJetPrinter::resetRFIDStatus() -{ - if(!sysPara) - return; - - // 停止刷卡请求 - if(manager_rfid) { - manager_rfid->requireInkCard(false); - manager_rfid->requireSolventCard(false); - } - - sysPara->RFIDPara.needInkCard = false; - sysPara->RFIDPara.needSolventCard = false; - - sysPara->RFIDPara.inkCardTimeOut = false; - sysPara->RFIDPara.solventCardTimeOut = false; - - sysPara->saveRFIDPara(); - sysPara->saveParaToFile(); - - LogInfo::setRunStatusText("RFID/ink/solvent flows terminated by resetRFIDStatus"); - QMessageBox::information(this, "", "RFID progress has been cleaned.", QMessageBox::Ok); -} - -/** - * @brief 处理墨水警告 - * 如果发生墨水警告,则进入 加墨水&刷卡 流程。 - * 该流程要求 用户加入墨水并且刷了对应的墨水卡 才退出流程。 - * 如果流程没有完成,则每隔一个小时提示一次,如果超过48小时,则sysPara->RFIDPara.inkCardTimeOut = true,禁用喷码机 - * 该流程不受关机影响 - * - * 该函数 使用定时器 1s 调用一次 - * - */ -void InkJetPrinter::handleWarnInk() -{ - if(!sysPara || !manager_rfid) - return; - - // 墨水盒警告抖动处理 - if(sysPara->status.statWarn & WARN_STATUS_INK_WARN) { - sysPara->status.inkWarningCnt = qMax(0, sysPara->status.inkWarningCnt); - sysPara->status.inkWarningCnt++; // 累计警报10次就提示 - } - else { - sysPara->status.inkWarningCnt = qMin(0, sysPara->status.inkWarningCnt); - --sysPara->status.inkWarningCnt; - } - - // 墨水被加入后处理 - if(sysPara->status.inkWarningCnt <= -5 && sysPara->RFIDPara.inInkAndRFIDProgress) { - if(!sysPara->RFIDPara.addedInk) { - sysPara->RFIDPara.addedInk = true; - sysPara->saveRFIDPara(); - - if(sysPara->RFIDPara.needInkCard) { - slt_showMsg(tr("请及时使用墨水盒附带的IC卡激活墨水盒")); - } - } - } - - // 墨水盒空,进入 刷卡&加墨水 流程 - if(sysPara->status.inkWarningCnt >= DETECT_WARNING_TIME && sysPara->RFIDPara.inInkAndRFIDProgress == 0) { - - sysPara->RFIDPara.addedInk = false; - sysPara->RFIDPara.needInkCard = true; - sysPara->status.showInkWarningNumber = 0; - sysPara->RFIDPara.inInkAndRFIDProgress = 1; - - QString strCurDateTime = QDateTime::currentDateTime().toString("yyMMddhhmmss"); - LogInfo::setRunStatusText("Ink warning."); - qDebug()<<"墨水液位报警"; - - sysPara->para.inkWarnDate = strCurDateTime.mid(0,6).toInt(); - sysPara->para.inkWarnTime = strCurDateTime.mid(6,6).toInt(); - - slt_showMsg(tr("请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR)); - - sysPara->saveParaToFile(); - sysPara->saveRFIDPara(); - } - - // 放在这里是为了防止在 刷卡&加墨水 流程中,用户没有刷卡就关机了。关机后再开机,仍然需要 刷卡&加墨水 才能继续使用喷码机。 - if(sysPara->RFIDPara.needInkCard) - manager_rfid->requireInkCard(); - - - // 计算刷卡时间间隔 - - QDateTime inkWarnDateTime = QDateTime::fromString(QString("20%1%2"). - arg(sysPara->para.inkWarnDate, 6, 10, QChar('0')). - arg(sysPara->para.inkWarnTime, 6, 10, QChar('0')), "yyyyMMddhhmmss"); - - if (!inkWarnDateTime.isValid()) { - // 数据异常时,重置为当前时间并持久化 - QDateTime now = QDateTime::currentDateTime(); - QString s = now.toString("yyMMddhhmmss"); - sysPara->para.inkWarnDate = s.mid(0,6).toInt(); - sysPara->para.inkWarnTime = s.mid(6,6).toInt(); - sysPara->saveParaToFile(); - inkWarnDateTime = now; - } - - // 墨水卡未刷,或者没有加墨水,每隔一个小时提示一次。 - if((!sysPara->RFIDPara.addedInk || sysPara->RFIDPara.needInkCard) && sysPara->RFIDPara.inInkAndRFIDProgress != 0) { - - auto differHours = inkWarnDateTime.secsTo(QDateTime::currentDateTime()) / WARNING_INTERVAL_SEC; - - // 如果differHours小于sysPara->status.showInkWarningNumber,说明系统时间被往前修改过。此时调整开始时间,直接进入超时状态。 - // 我们让用户承担这个风险,直接进入超时状态,用户需要刷卡才能继续使用喷码机。 - if(differHours < sysPara->status.showInkWarningNumber) { - auto now = QDateTime::currentDateTime(); - auto newWarnDateTime = now.addSecs(-(MAX_WARNING_TIME_HOUR + 1) * 3600); // 直接进入超时状态,设置为当前时间的前49小时 - auto str = newWarnDateTime.toString("yyMMddhhmmss"); - sysPara->para.inkWarnDate = str.mid(0,6).toInt(); - sysPara->para.inkWarnTime = str.mid(6,6).toInt(); - - LogInfo::setRunStatusText("Detected system time rollback; forcing ink warn timeout."); - differHours = newWarnDateTime.secsTo(now) / WARNING_INTERVAL_SEC; - sysPara->status.showInkWarningNumber = differHours - 1; - sysPara->saveParaToFile(); - sysPara->saveRFIDPara(); - } - - // if(differHours >= sysPara->status.showInkWarningNumber) { - if(differHours > sysPara->status.showInkWarningNumber) { - - // 理论上differHours只会比 sysPara->status.showInkWarningNumber 大 1, 如果大于1,说明系统时间被被往后修改过或者关过机。 - - if(differHours > MAX_WARNING_TIME_HOUR) - slt_showMsg(tr("墨水液位报警超过%1小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作!").arg(MAX_WARNING_TIME_HOUR)); - else - slt_showMsg(tr("请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR - differHours)); - - sysPara->status.showInkWarningNumber = differHours; - sysPara->saveRFIDPara(); - } - - // 进入超时状态,禁用喷码机 - if(differHours > MAX_WARNING_TIME_HOUR) { - sysPara->RFIDPara.inkCardTimeOut = true; - sysPara->saveRFIDPara(); - } - } - - // 如果用户已经刷了墨水卡,并且加了墨水,则清除 刷卡&加墨水 流程 - if(sysPara->RFIDPara.addedInk && !sysPara->RFIDPara.needInkCard && sysPara->RFIDPara.inInkAndRFIDProgress != 0) { - sysPara->status.showInkWarningNumber = 0; - sysPara->RFIDPara.inkCardTimeOut = false; - sysPara->RFIDPara.inInkAndRFIDProgress = 0; - sysPara->saveRFIDPara(); - manager_rfid->requireInkCard(false); - - LogInfo::setRunStatusText("Ink card has been added, and the ink card requirement has been cleared."); - - if(sysPara->status.selfCheckDone && (sysPara->status.reclaimTankstatus == 2 || sysPara->status.reclaimTankstatus == 6)) { - m_MainWidget->setReclaimOpenBtnStatus(true); - } - } -} - -void InkJetPrinter::handleWarnSolvent() -{ - if(!sysPara || !manager_rfid) - return; - - // 溶剂液位抖动处理 - if(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN) { - sysPara->status.solventWarningCnt = qMax(0, sysPara->status.solventWarningCnt); - sysPara->status.solventWarningCnt++; // 累计警报10次就提示 - } - else { - sysPara->status.solventWarningCnt = qMin(0, sysPara->status.solventWarningCnt); - --sysPara->status.solventWarningCnt; - } - - // 溶剂被加入后处理 - if(sysPara->status.solventWarningCnt <= -5 && sysPara->RFIDPara.inSolventAndRFIDProgress) { - if(!sysPara->RFIDPara.addedSolvent) { - sysPara->RFIDPara.addedSolvent = true; - sysPara->saveRFIDPara(); - - if(sysPara->RFIDPara.needSolventCard) { - slt_showMsg(tr("请及时使用溶剂盒附带的IC卡激活溶剂盒")); - } - } - } - - // 溶剂盒空,进入 刷卡&加溶剂 流程 - if(sysPara->status.solventWarningCnt >= DETECT_WARNING_TIME && sysPara->RFIDPara.inSolventAndRFIDProgress == 0) { - QDateTime curDateTime = QDateTime::currentDateTime(); - QString strCurDateTime = curDateTime.toString("yyMMddhhmmss"); - LogInfo::setRunStatusText("Solvent warning."); - qDebug()<<"溶剂液位报警"; - sysPara->para.solventWarnDate = strCurDateTime.mid(0,6).toInt(); - sysPara->para.solventWarnTime = strCurDateTime.mid(6,6).toInt(); - - sysPara->RFIDPara.addedSolvent = false; - sysPara->RFIDPara.needSolventCard = true; - sysPara->status.showSolventWarningNumber = 0; - - sysPara->RFIDPara.inSolventAndRFIDProgress = 1; - - slt_showMsg(tr("请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR)); - - sysPara->saveParaToFile(); - sysPara->saveRFIDPara(); - } - - // 放在这里是为了防止在 刷卡&加溶剂 流程中,用户没有刷卡就关机了。关机后再开机,仍然需要 刷卡&加溶剂 才能继续使用喷码机。 - if(sysPara->RFIDPara.needSolventCard) - manager_rfid->requireSolventCard(); - - // 计算刷卡时间间隔 - - QDateTime solventWarnDateTime = QDateTime::fromString(QString("20%1%2"). - arg(sysPara->para.solventWarnDate, 6, 10, QChar('0')). - arg(sysPara->para.solventWarnTime, 6, 10, QChar('0')), "yyyyMMddhhmmss"); - - if (!solventWarnDateTime.isValid()) { - // 数据异常时,重置为当前时间并持久化 - QDateTime now = QDateTime::currentDateTime(); - QString s = now.toString("yyMMddhhmmss"); - sysPara->para.solventWarnDate = s.mid(0,6).toInt(); - sysPara->para.solventWarnTime = s.mid(6,6).toInt(); - sysPara->saveParaToFile(); - solventWarnDateTime = now; - } - - // 溶剂卡未刷,或者没有加溶剂,每隔一个小时提示一次。 - if((!sysPara->RFIDPara.addedSolvent || sysPara->RFIDPara.needSolventCard) && sysPara->RFIDPara.inSolventAndRFIDProgress != 0) { - auto differHours = solventWarnDateTime.secsTo(QDateTime::currentDateTime()) / WARNING_INTERVAL_SEC; - - // 如果differHours小于sysPara->status.showSolventWarningNumber,说明系统时间被往前修改过。此时调整开始时间,直接进入超时状态。 - if(differHours < sysPara->status.showSolventWarningNumber) { - auto now = QDateTime::currentDateTime(); - auto newWarnDateTime = now.addSecs(-(MAX_WARNING_TIME_HOUR + 1) * 3600); // 直接进入超时状态,设置为当前时间的前49小时 - auto str = newWarnDateTime.toString("yyMMddhhmmss"); - sysPara->para.solventWarnDate = str.mid(0,6).toInt(); - sysPara->para.solventWarnTime = str.mid(6,6).toInt(); - - LogInfo::setRunStatusText("Detected system time rollback; forcing solvent warn timeout."); - differHours = newWarnDateTime.secsTo(now) / WARNING_INTERVAL_SEC; - sysPara->status.showSolventWarningNumber = differHours - 1; - sysPara->saveParaToFile(); - } - - if(differHours > sysPara->status.showSolventWarningNumber) { - if(differHours > MAX_WARNING_TIME_HOUR) - slt_showMsg(tr("溶剂液位报警超过%1小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作!").arg(MAX_WARNING_TIME_HOUR)); - else - slt_showMsg(tr("请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR - differHours)); - - sysPara->status.showSolventWarningNumber = differHours; - sysPara->saveRFIDPara(); - } - - // 进入超时状态,禁用喷码机 - if(differHours > MAX_WARNING_TIME_HOUR) { - sysPara->RFIDPara.solventCardTimeOut = true; - sysPara->saveRFIDPara(); - } - } - - // 如果用户已经刷了溶剂卡,并且加了溶剂,则清除 刷卡&加溶剂 流程 - if(sysPara->RFIDPara.addedSolvent && !sysPara->RFIDPara.needSolventCard && sysPara->RFIDPara.inSolventAndRFIDProgress != 0) { - sysPara->status.showSolventWarningNumber = 0; - sysPara->RFIDPara.inSolventAndRFIDProgress = 0; - sysPara->RFIDPara.solventCardTimeOut = false; - sysPara->saveRFIDPara(); - manager_rfid->requireSolventCard(false); - - LogInfo::setRunStatusText("Solvent card has been added, and the solvent card requirement has been cleared."); - - if(sysPara->status.selfCheckDone && (sysPara->status.reclaimTankstatus == 2 || sysPara->status.reclaimTankstatus == 6)) { - m_MainWidget->setReclaimOpenBtnStatus(true); - } - } -} -#endif - -void InkJetPrinter::slt_showMsg(QString msg) -{ - static QList msgPool; - - QMessageBox * msgBox = new QMessageBox(QMessageBox::NoIcon, tr("提示"), msg, QMessageBox::StandardButton::Ok); - msgPool.push_back(msgBox); - connect(msgBox, &QMessageBox::finished, [this, msgBox, &msgPool](){ - auto idx = msgPool.lastIndexOf(msgBox); - if(idx != -1) { - msgPool.removeAt(idx); - } - - msgBox->deleteLater(); - }); - - msgBox->show(); - - if(msgPool.size() > 3) { - msgPool.takeFirst()->deleteLater(); - } - - LogInfo::setRunStatusText(msg); -} - -void InkJetPrinter::onDlgFileOpen(const QString& filename) -{ - QFileInfo fileInfo(filename); - if(!fileInfo.exists() || !fileInfo.isFile()) { - LogInfo::setRunStatusText(tr("File not found: %1").arg(filename)); - return; - } - - loadWorkFileAndPreparePrint(filename); -} +#include "InkJetPrinter.h" + +#include +//#include +#include +#include "VerBVersion.h" +#include +#include "DialogFileOperation.h" + +#ifdef __RFID_CARD +#define DETECT_WARNING_TIME 10 //Seconds +#define RFID_WARNING_INTERVAL 5 //Minutes +#endif + +#pragma execution_character_set("utf-8") + +extern MyInputMethod *myInputMethod; +extern unsigned char vartypeR; +static unsigned int PulseCnt = 0; //时间间隔内的脉冲累计数 +InkJetPrinter::InkJetPrinter(QWidget* parent) + : QWidget(parent) +{ + // 加载.ui文件生成的UI界面 + ui.setupUi(this); + + // 关联原有成员变量到UI控件(保持变量名和原代码一致) + m_LabelTimer = ui.m_LabelTimer; + m_StackedWidget = ui.m_StackedWidget; + + // 初始化业务逻辑(仅保留原init中的非UI创建部分) + init(); + initRunTimeCtrl(); +#ifdef __RFID_CARD + initRFIDManager(); +#endif + + QThread::sleep(3); + qApp->installEventFilter(this); + + // QString ARM_Version; + // ARM_Version.sprintf("%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); + // ui.label_version->setText(QString("A%1/F%2.%3.%4").arg(ARM_Version).arg(sysPara->status.fpgaVersionNum >> 12) + // .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff) ); + + +#ifdef ARCH_X86 + setFixedSize(800, 600); +#endif +} + +InkJetPrinter::~InkJetPrinter() +{ + if(m_serialThreadFPGA->isRunning()){ + m_serialThreadFPGA->requestInterruption(); + m_serialThreadFPGA->quit(); + m_serialThreadFPGA->wait(); + } + if(m_serialThreadSTM32->isRunning()){ + m_serialThreadSTM32->requestInterruption(); + m_serialThreadSTM32->quit(); + m_serialThreadSTM32->wait(); + } + if(serialFPGA){ + delete serialFPGA; + serialFPGA = nullptr; + } + if(serialSTM32){ + delete serialSTM32; + serialSTM32 = nullptr; + } +} + +void InkJetPrinter::init() +{ + // 创建自定义子控件(原逻辑不变) + m_MainWidget = new MainWidget(this); + m_TestPrintWidget = new TestPrintWidget(this); +// m_ErCodeSettingsWidget = new ErCodeSettingsWidget(this); +// m_MainInterfaceWidget = new MainInterfaceWidget(this); + + m_FontSetWidget = new FontSetWidget(this); + m_PrintSetting = new PrintSetting(this); + + m_BarCodeDlg = new QBarCode(this); + m_QRCodeDlg = new dlgQrCode(this); + + m_MainInstruction = new MainInstruction(this); + m_SystemManage = new SystemManage(this); + m_SystemUpdate = new SystemUpdate(this); + m_SystemSetting = new SystemSetting(this); + m_OtherInfo = new OtherInfo(this); + m_LogInfo = new LogInfo(this); + m_scheduleShiftsEditor = new ScheduleShiftsEditor(this); + m_DateVarSet = new DateVarSet(this); + m_CounterVarSet = new CounterVarSet(this); + m_dlgFileOperation = new DialogFileOperation(this); + + connect(m_dlgFileOperation, &DialogFileOperation::openFile, this, &InkJetPrinter::onDlgFileOpen); + + viscosity_timer = new QTimer(); + connect(viscosity_timer, SIGNAL(timeout()), this, SLOT(viscosity_timerHandler())); + + msgtest = new QMessageBox(this); + msgtest->setWindowTitle(tr("提示")); + connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int))); + + // 我真的不想拉,但是今天状态燃尽了,以后再改了 + m_TestPrintWidget->setPrintSettingWidget(m_PrintSetting); + + // 初始文件名为 空 + ui.label_currWorkFile->setText(""); + ui.label_currEditFile->setText(""); + + // 信号槽连接(原逻辑完全不变) + connect(m_MainWidget, &MainWidget::sendButtonClickedSignal, this, &InkJetPrinter::getMainWidgetButtonClickedSlot); + connect(m_MainWidget,SIGNAL(setDisableAll()),this,SLOT(disableTabClick())); + connect (m_MainWidget,SIGNAL(CloseJd()),this,SLOT(close_jd_timer())); + connect(m_MainWidget, &MainWidget::newFileAcquired, this, &InkJetPrinter::createNewJobFile); + connect(m_TestPrintWidget, &TestPrintWidget::sendButtonClickedSignal, this, &InkJetPrinter::getTestPrintWidgetButtonClickedSlot); + + // TestPrintWidget::sendButtonClickedSignal(16) 转由 openDatetimeEditor 处理 + connect(m_TestPrintWidget, &TestPrintWidget::sig_showEditDateTime, this, &InkJetPrinter::openDatetimeEditor); + connect(m_TestPrintWidget, &TestPrintWidget::sig_switchWorkFileRequested, this, &InkJetPrinter::slt_updatePrintContent); + + #ifndef FPGA_TEST + // 调入文件喷印时,主动重启打印 + // connect(m_TestPrintWidget, &TestPrintWidget::sig_currentFileChanged, this, [this](){ + + // ui.label_currWorkFile->setText(m_TestPrintWidget->currentFile()); + + // auto isPrinting = sysPara->status.isPrinting; + // if(isPrinting) { + // m_MainWidget->on_m_StopBtn_clicked(); + + // QTimer::singleShot(500, [this](){ + + // m_PrintSetting->applyPrintSettingsToSysPara(false); + + // m_MainWidget->on_m_StartBtn_clicked(); + // LogInfo::setRunStatusText("Restarting the print because the work file was switched."); + // }); + // } + // else { + // QTimer::singleShot(300, [this](){ + // m_PrintSetting->applyPrintSettingsToSysPara(false); + // }); + // } + // }); + #endif + + // 班时元素与编辑 连接 + connect(m_TestPrintWidget, &TestPrintWidget::sig_showScheduleShiftsEditor, this, &InkJetPrinter::showScheduleShiftsEditor); + connect(m_scheduleShiftsEditor, &ScheduleShiftsEditor::accepted, this, &InkJetPrinter::onScheduleShiftsEditDone); + connect(m_scheduleShiftsEditor, &ScheduleShiftsEditor::rejected, [this](){ + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + }); + +// connect(m_ErCodeSettingsWidget, &ErCodeSettingsWidget::sendButtonClickedSignal, this, &InkJetPrinter::getErCodeSettingsWidgetButtonClickedSlot); +// connect(m_MainInterfaceWidget, &MainInterfaceWidget::sendButtonClickedSignal, this, &InkJetPrinter::getErCodeSettingsWidgetButtonClickedSlot); + connect(m_MainWidget,&MainWidget::showVserionInfo,this,&InkJetPrinter::setShowVserionInfo); + + connect(m_FontSetWidget,&FontSetWidget::sendButtonClickedSignal,this,&InkJetPrinter::getFontSetWidgetButtonClickedSlot); + connect(m_PrintSetting,&PrintSetting::sendButtonClickedSignal,this,&InkJetPrinter::getPrintSettingButtonClickedSlot); + connect(m_MainInstruction,&MainInstruction::sendButtonClickedSignal,this,&InkJetPrinter::getMainInstructWidgetButtonClickedSlot); + connect(m_SystemManage,&SystemManage::sendButtonClickedSignal,this,&InkJetPrinter::getSystemManageWidgetButtonClickSlot); + connect(m_SystemSetting,&SystemSetting::sendButtonClickedSignal,this,&InkJetPrinter::getSystemSettingWidgetButtonClickSlot); + connect(m_OtherInfo,&OtherInfo::sendButtonClickedSignal,this,&InkJetPrinter::getOtherInfoWidgetButtonClickSlot); + connect(m_LogInfo,&LogInfo::sendButtonClickedSignal,this,&InkJetPrinter::getLogInfoWidgetButtonClickSlot); + + connect(m_DateVarSet,&DateVarSet::sendButtonClickedSignal,this,&InkJetPrinter::getDateSetWidgetButtonClickSlot); + //添加计数器,修改计数器 + connect(m_CounterVarSet,&CounterVarSet::sendButtonClickedSignal,this,&InkJetPrinter::getCounterVarSetWidgetButtonClickSlot); + connect(m_CounterVarSet,&CounterVarSet::sig_updateSelectedCounter,this,&InkJetPrinter::slt_counterVarUpdate); + + connect(m_MainInstruction,&MainInstruction::newFileBtnClick,m_TestPrintWidget,&TestPrintWidget::on_newfileButton_pressed); + + connect(m_MainInstruction, &MainInstruction::superJmAccepted, this, &InkJetPrinter::resetRFIDStatus); + +// connect(myInputMethod,&MyInputMethod::sendEnterClickedSignal,&TestPrintWidget::onEditItemDone); + // connect(myInputMethod,SIGNAL(sendEnterClickedSignal()),m_TestPrintWidget,SLOT(onEditItemDone())); + connect(m_DateVarSet,SIGNAL(backSpaceBtn()),myInputMethod,SLOT(backSapceButtonDel())); + + connect (m_MainWidget,SIGNAL(repeatInitedPid()),this,SLOT(handleInitedPID())); + connect(m_MainWidget,SIGNAL(clearPressureFault()),this,SLOT(resetPressureCnt())); + connect(m_LogInfo,SIGNAL(faultTesumePress()),m_MainWidget,SLOT(onLabelFaultRusumePressed())); + + // 信号槽:用于修改计数器 + connect(m_TestPrintWidget, &TestPrintWidget::sig_showEditCounter, + this, &InkJetPrinter::slt_editCounter); + + // 状态界面 + if (ctrl_loginfo == nullptr) ctrl_loginfo = LogInfoCtrl::instance(); + connect(ctrl_loginfo, &LogInfoCtrl::sig_show, this, [=](){ + getMainWidgetButtonClickedSlot(5); + m_LogInfo->checkState(); + }); + + SysPara *para = new SysPara(); + sysPara = para; + m_MainWidget->bindSysPara(para); + m_FontSetWidget->bindSysPara(para); + m_PrintSetting->bindSysPara(para); + m_SystemManage->bindSysPara(para); + m_SystemSetting->bindSysPara(para); + m_OtherInfo->bindSysPara(para); + m_TestPrintWidget->bindSysPara(para); + m_DateVarSet->bindSysPara(para); + m_MainInstruction->bindSysPara(para); + m_BarCodeDlg->bindSysPara(para); + m_QRCodeDlg->bindSysPara(para); + m_LogInfo->bindSysPara(para); + + if(sysPara->para.gearPumpEnable) + pushButtonStartFlag = true; + + m_PrintSetting->updateModelToUI(); + m_SystemSetting->updateSysParaToUI(); + m_OtherInfo->updateSysParaToUI(); + m_CounterVarSet->updateSysParaToUI(); + + m_SystemManage->loadKeyBoardType(); + + m_FontSetWidget->bindTxTEdit(m_TestPrintWidget->getQTextEdit()); + m_BarCodeDlg->bindTxTEdit(m_TestPrintWidget->getQTextEdit()); + m_QRCodeDlg->bindTxTEdit(m_TestPrintWidget->getQTextEdit()); + m_textEdit = m_TestPrintWidget->getQTextEdit(); + + // 添加子控件到StackedWidget(原逻辑不变) + m_StackedWidget->addWidget(m_MainWidget); + m_StackedWidget->addWidget(m_TestPrintWidget); +// m_StackedWidget->addWidget(m_ErCodeSettingsWidget); +// m_StackedWidget->addWidget(m_MainInterfaceWidget); + + m_StackedWidget->addWidget(m_FontSetWidget); + m_StackedWidget->addWidget(m_BarCodeDlg); + m_StackedWidget->addWidget(m_QRCodeDlg); + + m_StackedWidget->addWidget(m_PrintSetting); + m_StackedWidget->addWidget(m_MainInstruction); + m_StackedWidget->addWidget(m_SystemManage); + m_StackedWidget->addWidget(m_SystemUpdate); + m_StackedWidget->addWidget(m_SystemSetting); + m_StackedWidget->addWidget(m_OtherInfo); + m_StackedWidget->addWidget(m_LogInfo); + m_StackedWidget->addWidget(m_scheduleShiftsEditor); + m_StackedWidget->addWidget(m_DateVarSet); + m_StackedWidget->addWidget(m_CounterVarSet); + + + // 创建 32 线程和 FPGA 线程,并初始化串口 + m_serialThreadFPGA = new QThread; + m_serialThreadSTM32 = new QThread(); + initSerialPorts(); + + connect(m_SystemManage,SIGNAL(sigToCloseSerialFPGA()),this,SLOT(closeSerialFPGA())); + connect(m_SystemManage,SIGNAL(sigToCloseSerialSTM32()),this,SLOT(closeSerialSTM32())); + connect(m_SystemManage,SIGNAL(restartSerial()),this,SLOT(restartSerialPort())); + connect(m_SystemManage, &SystemManage::rebootAppAcquired, this, &InkJetPrinter::rebootApp); + + connect(m_SystemManage,SIGNAL(enableClick(bool)),this,SLOT(enableInkJetTabClick(bool))); + connect(m_SystemManage,SIGNAL(upgradeSTM32(QString)),serialSTM32,SLOT(upgradeSTM32File(QString))); + connect(serialSTM32,SIGNAL(progress(int,int)),m_SystemManage,SLOT(progressBarControl(int,int))); + + /*系统更新的信号和槽*/ + connect(m_SystemUpdate,&SystemUpdate::sendProgramSTM32Signal,m_SystemManage,&SystemManage::on_pushButtonProgamSTM32_clicked); + connect(m_SystemUpdate,&SystemUpdate::sendProgramFPGASignal,m_SystemManage,&SystemManage::on_pushButtonProgamFPGA_clicked); + connect(m_SystemUpdate,&SystemUpdate::sendUpDateSOFTSignal,m_SystemManage,&SystemManage::on_pushButtonUpdateSoftware_pressed); + connect(m_SystemUpdate,&SystemUpdate::sendUpDateChARLIBSignal,m_SystemManage,&SystemManage::on_pushButtonUpdateCharLib_pressed); + connect(m_SystemUpdate,&SystemUpdate::sendButtonClickedSignal,this,&InkJetPrinter::getSystemManageWidgetButtonClickSlot); + connect(m_SystemUpdate,&SystemUpdate::sig_reboot,this,&InkJetPrinter::rebootApp); + + // 原注释的默认页面设置(按需启用) + sysPara->status.machineMac = m_MainInstruction->dlgInputAddr->jd.addr; + sysPara->para.rfidCountDown = 5; + + connect(this, &InkJetPrinter::pipingStatusChanged, this, &InkJetPrinter::checkStatusAndStartGearPump, Qt::QueuedConnection); + + timer = new QTimer(); + connect(timer, SIGNAL(timeout()), this, SLOT(timerHandler())); + timer->start(10); +} + +// type 1,2: 分别显示计数器1或2的界面 +void InkJetPrinter::slt_editCounter(CounterViewModel vm) +{ + if (m_CounterVarSet) { + m_CounterVarSet->updateSysParaToUI(); + m_CounterVarSet->setCounterConfig(vm); + m_StackedWidget->setCurrentWidget(m_CounterVarSet); + } +} + +void InkJetPrinter::slt_warningMaintenance() +{ + // 距离维护时间结束大于30天,判断运行时间的检测 + if (timeoutDay >= 30) { + double runHours = sysPara->RFIDPara.runtimeMs / 1000.0 / 60.0 / 60.0; + double hours = sysPara->RFIDPara.maintenanceHours - runHours; + QString str; + if (hours >= 0) { + str = tr("保养期还有%1小时到期,请及时保养,否则喷码机容易损坏") + .arg(QString::number(hours, 'f', 2)); + } else { + hours = hours * (-1); + str = tr("保养期已超过%1小时,请及时保养,否则喷码机容易损坏") + .arg(QString::number(hours, 'f', 2)); + } + msgtest->setText(str); + msgtest->show(); + LogInfo::setRunStatusText(str); + return; + } else { + warningHandler(CARD_TYPE::MAINTENANCE); // 距离维护时间结束大于30天,判断运行时间的检测 + return; + } + +} + +void InkJetPrinter::showEvent(QShowEvent *e) +{ + static bool firstShow = true; + + QWidget::showEvent(e); + + if(firstShow) { + loadLastWorkAndPreparePrint(); + firstShow = false; + } +} + +void InkJetPrinter::enableInkJetTabClick(bool flag) +{ + this->setEnabled(flag); +} + +void InkJetPrinter::close_jd_timer() +{ + timer->stop(); +} + +float PID_realize(float speed); + +struct _pid{ + float SetSpeed;//定义设定值 + float ActualSpeed;//定义实际值 + float err;//定义偏差值 + float err_last;//定义上一个偏差值 + float Kp,Ki,Kd;//定义比例、积分、微分系数 + float voltage;//定义电压值(控制执行器的变量) + float integral;//定义积分值 + float integral_max; //积分限幅(根据实际调整) +}pid; + + +void PID_init(){ + pid.SetSpeed=0.0; + pid.ActualSpeed=0.0; + pid.err=0.0; + pid.err_last=0.0; + pid.voltage=0.0; + pid.integral=0.0; + pid.Kp=0.21; //0.25 + pid.Ki=0.006; //0.015 + pid.Kd=0.0; +} + +static float u = 1.0; +float PID_realize(float speed, float act){ + unsigned char index = 1; + pid.SetSpeed=speed; + pid.ActualSpeed = act; + pid.err=pid.SetSpeed-pid.ActualSpeed; + if(u < 900) + { + pid.integral+=pid.err; + } + + pid.voltage=pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err-pid.err_last); + pid.err_last=pid.err; + pid.ActualSpeed =pid.voltage*1.0; + return pid.ActualSpeed; +} + +float PID_realize2(float speed, float act){ + // 增量式 PID:Δu = Kp*(e[k]-e[k-1]) + Ki*e[k] + pid.Kp = 0.15f; + pid.Ki = 0.02f; + pid.Kd = 0.0f; + pid.SetSpeed = speed; + pid.ActualSpeed = act; + pid.err = pid.SetSpeed - pid.ActualSpeed; + + float delta_u = pid.Kp * (pid.err - pid.err_last) + + pid.Ki * pid.err; + + // 自适应非对称限幅: + // 压力严重偏高(err < -30):允许快速减速,限制慢速加速 + // 压力严重偏低(err > 50):允许正常加速,限制减速(避免过度降速) + // 接近目标:小步长,平稳调节 + if(pid.err < -30.0f) { + if(delta_u > 1.0f) delta_u = 1.0f; + if(delta_u < -6.0f) delta_u = -6.0f; + } else if(pid.err > 50.0f) { + if(delta_u > 3.0f) delta_u = 3.0f; + if(delta_u < -2.0f) delta_u = -2.0f; + } else { + if(delta_u > 3.0f) delta_u = 3.0f; + if(delta_u < -3.0f) delta_u = -3.0f; + } + + pid.err_last = pid.err; + return delta_u; +} + +void InkJetPrinter::pressureAdj() +{ + if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm) + { + sysPara->para.gearPumpValue = 0; + u = 0.0f; + m_rampDone = false; + m_adjSkip = 0; + m_lastPressure = 0; + m_stableCount = 0; + for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; + m_bufIdx = 0; + sysPara->devOp->WriteMoterPump(); + return; + } + + if(!sysPara->para.gearPumpEnable) + { + if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0)) + u = PID_realize((float)sysPara->para.pressure, (float)sysPara->status.PRESSURE); + sysPara->para.gearPumpValue = (u > 0) ? (unsigned short)u : 0; + if(sysPara->para.gearPumpValue > 800) + sysPara->para.gearPumpValue = 800; + sysPara->devOp->WriteMoterPump(); + return; + } + + int maxValue = sysPara->para.flagOfReclaimPumEnable ? 420 : 800; + if(maxValue < 60) maxValue = 60; + + int maxSpeed = (int)sysPara->para.gearPumpSpeedAlarm; + + auto clampU = [&]() { + if(u < 60.0f) u = 60.0f; + if(u > (float)maxValue) u = (float)maxValue; + }; + + int actual = sysPara->status.PRESSURE; + int target = (int)sysPara->para.pressure; + int cur; + + // 每次进入都更新滑动平均缓冲(软启动用瞬时值,闭环用平均值) + m_pressureBuf[m_bufIdx] = actual; + m_bufIdx = (m_bufIdx + 1) % 10; + int avgPressure = 0; + for(int i = 0; i < 10; i++) avgPressure += m_pressureBuf[i]; + avgPressure /= 10; + + // --------------------------------------------------------------- + // 硬保护:压力超过目标+50,立即强制减速,优先级最高 + // 覆盖自检、软启动、闭环所有阶段 + // --------------------------------------------------------------- + if(actual > target + 50) + { + float overErr = (float)(actual - (target + 50)); + float delta = -0.1f * overErr; + if(delta < -15.0f) delta = -15.0f; + u += delta; + clampU(); + m_lastPressure = actual; + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + return; + } + + // --------------------------------------------------------------- + // 软启动:自适应步长,每 800ms 一次 + // 自检期间也走此逻辑(硬保护兜底),自检完成后重置重新收敛 + // 软启动阶段不做压力稳定检测,优先快速收敛 + // --------------------------------------------------------------- + if(!m_rampDone) + { + if(++m_adjSkip < 8) + { + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + return; + } + m_adjSkip = 0; + + int err = target - actual; + + if(err < 0) + { + // 超压:小步减速 + u -= 1.0f; + } + else + { + // 自适应步长:差得远步子大,差得近步子小 + float step; + if (err > 200) step = 5.0f; + else if(err > 100) step = 3.0f; + else if(err > 50) step = 2.0f; + else step = 1.0f; + u += step; + } + + clampU(); + + // 转速上限保护 + if(sysPara->para.flagOfReclaimPumEnable && + sysPara->status.gearPumpRunSpeed >= maxSpeed) + { + u -= 3.0f; + clampU(); + } + + cur = (int)u; + + // 进入闭环条件:压力已稳定在目标±50以内 + if(sysPara->status.selfCheckDone && err >= -50 && err <= 50) + { + m_rampDone = true; + m_adjSkip = 0; + } + + sysPara->para.gearPumpValue = (unsigned short)cur; + sysPara->devOp->WriteMoterPump(); + return; + } + + // --------------------------------------------------------------- + // 闭环:等压力稳定后再调速,自适应管路响应时间 + // + // 每100ms采样一次,连续3次压力变化<15认为稳定,才执行调速 + // 最长等待5s(50次)兜底,防止管路持续抖动导致永远不调 + // + // 调速后立即重置稳定计数,重新等待下一次稳定 + // + // 分区Kp:误差大步子大,误差小步子小 + // |err| > 100 → Kp=0.05,限幅±5 + // |err| 50~100→ Kp=0.04,限幅±4 + // |err| < 50 → Kp=0.03,限幅±3 + // --------------------------------------------------------------- + { + // 稳定检测用平均值,滤掉传感器噪声 + int pressureChange = avgPressure - m_lastPressure; + if(pressureChange < 0) pressureChange = -pressureChange; + m_lastPressure = avgPressure; + m_adjSkip++; // 复用为超时计数 + + bool stable = (pressureChange < 10); + bool timeout = (m_adjSkip >= 50); // 5s兜底 + + if(stable) + m_stableCount++; + else + m_stableCount = 0; + + bool readyToAdj = (m_stableCount >= 15) || timeout; + + if(!readyToAdj) + { + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + return; + } + + // 平均压力已稳定(或超时兜底),执行调速,重置计数 + m_adjSkip = 0; + m_stableCount = 0; + + // 误差用平均值计算,避免瞬时噪声影响调速幅度 + float absErr = (float)(target - avgPressure); + if(absErr < 0.0f) absErr = -absErr; + + float kp, capDelta; + if(absErr > 100.0f) { kp = 0.05f; capDelta = 5.0f; } + else if(absErr > 50.0f) { kp = 0.04f; capDelta = 4.0f; } + else { kp = 0.03f; capDelta = 3.0f; } + + float err = (float)(target - avgPressure); + float delta_u = kp * err; + + if(delta_u > capDelta) delta_u = capDelta; + if(delta_u < -capDelta) delta_u = -capDelta; + + // 转速上限软限制:转速已达上限时禁止继续加速 + if(sysPara->para.flagOfReclaimPumEnable && + sysPara->status.gearPumpRunSpeed >= maxSpeed) + { + if(delta_u > 0.0f) delta_u = 0.0f; + } + + u += delta_u; + clampU(); + cur = (int)u; + + sysPara->para.gearPumpValue = (unsigned short)cur; + sysPara->devOp->WriteMoterPump(); + } +} + + +static bool firstTime = true; +extern void MySleep(unsigned int msec); +extern unsigned char test_flag; +bool gearPumpRunNormalFlag = false; +unsigned char isPrintingFlag[1]={0}; +void InkJetPrinter::timerHandler(void){ + static bool flag1 = 1; + if(flag1){ + flag1 = 0; + qDebug()<<"timer had started"; + } + + int pulse_100ms = 0; + int pulse_200ms = 0; + int pulse_50ms = 0; + int pulse_20ms = 0; + int pulse_1s = 0; + int pulse_10s = 0; + int pulse_100s = 0; + int pulse_300ms = 0; + int timer_3s = 0; + + static int pulse_3s = 0; + static int pulse_4s = 0; + static int pulse_5s = 0; + static int reciclar_30s = 0; + static int pulse_30s = 0; + static int xxxm=0; + + static int tempFlag=0; + static int save_weeknum = 0; + static bool ControledSwitchFlag = false; + static bool delay3s; + bool InkSwintFlag = false,lastInkSwintFlag = false; + static float gearPumpRunNormalValue = 0.0; + if(sysPara){ + ui.m_LabelTimer->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); + xxxm=1; + if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){ + sysPara->para.flagOfModuleDecimal = 0; + sysPara->para.flagOfModuleHide = 0; + } + + sysPara->para.ReadFileErrorCnt=0; // 正常打开文件 + + if(sysPara->para.gearPumpEnable) + { +// m_MainWidget->enablePushButtonStart(true); + if(!pushButtonStartFlag) + { + gearPumpRunNormalFlag = false; + } + if(!gearPumpRunFlag) + { + m_MainWidget->setReclaimOpenBtnStatus(false); + m_MainWidget->setReclaimCloseBtnStatus(false); + } + } + else + { +// ui->tabMainWindow->enablePushButtonStart(false); + } + + /*-----------------------形成脉冲-----------------------------*/ + sysPara->status.delay10ms ++; + if(sysPara->status.delay10ms == 2){ + pulse_20ms = 1; + } + if(sysPara->status.delay10ms == 5){ + pulse_50ms = 1; + } + if(sysPara->status.delay10ms == 10){ + pulse_100ms = 1; + sysPara->status.delay10ms = 0; + } + if(pulse_100ms){ + sysPara->status.delay100ms ++; + if(sysPara->status.delay100ms == 10){ + pulse_1s = 1; + sysPara->status.delay100ms = 0; + } + pulse_300ms = (sysPara->status.delay100ms%3) == 0; //1秒3次,并非精确的300ms + pulse_200ms = (sysPara->status.delay100ms%2) == 0; + } + + // static QElapsedTimer *timer_3s_elapsed = nullptr; + // if(timer_3s_elapsed == nullptr) { + // timer_3s_elapsed = new QElapsedTimer(); + // timer_3s_elapsed->start(); + // } + + // if(timer_3s_elapsed->elapsed() >= 3000) //读取状态后再检測 + // { + // if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒 + // { + // if(sysPara->para.gearPumpEnable) { + // // 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速 + // if(sysPara->para.gearPumpValue != 0) { + // sysPara->para.gearPumpValue = 0; + // u = 0.0f; + // sysPara->devOp->WriteMoterPump(); + // } + // gearPumpStartFlag = true; + // } + // } + + // timer_3s_elapsed->restart(); + // } + + if(pushButtonStartFlag && sysPara->status.selfCheckDone) + { + if((sysPara->status.PRESSURE > (sysPara->para.pressure -10)) && (sysPara->status.PRESSURE < (sysPara->para.pressure +10))) + { + if(pulse_1s) + { + + pulse_5s++; + } + if( pulse_5s == 5) + { + pulse_5s = 0; + gearPumpRunNormalFlag = true; + gearPumpRunNormalValue = u; + } + } + } + if(sysPara->status.isPumpValveControledByHand) + { + gearPumpRunNormalFlag = false; + ControledSwitchFlag = false; + pulse_3s = 0; + } + // 检测手动→自动边沿,直接恢复压力控制,不走 gearPumpStartFlag 的 3s 等待 + if(m_lastByHand && !sysPara->status.isPumpValveControledByHand) + { + ControledSwitchFlag = true; + u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变 + m_rampDone = false; // 重新软启动,适应切换后的压力状态 + m_adjSkip = 0; + m_lastPressure = 0; + m_stableCount = 0; + for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; + m_bufIdx = 0; + } + m_lastByHand = sysPara->status.isPumpValveControledByHand; + if(!(sysPara->status.statWarn & WARN_STATUS_INK_SWINT)){//墨线开关,压力抖动 + InkSwintFlag = true; + } + else + { + InkSwintFlag = false; + } + if(lastInkSwintFlag != InkSwintFlag) + { + lastInkSwintFlag = InkSwintFlag; + gearPumpRunNormalFlag = false; + } + if(gearPumpRunNormalFlag && !sysPara->status.isPumpValveControledByHand && sysPara->para.gearPumpEnable) + { + static int count_3s = 0; + if(u > gearPumpRunNormalValue*1.5)//改大一点 + { + if(pulse_1s) + { + count_3s++; + if(count_3s == 3) + { + count_3s = 0; + m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); + sysPara->status.gearPumpRunStopFlag = true; + gearPumpRunNormalFlag = false; + LogInfo::setRunStatusText(tr("运行中压力泄漏,停齿轮泵!")); + } + } + } + else + { + count_3s = 0; + } + } + if(sysPara->para.gearPumpEnable && (sysPara->status.gearPumpRunSpeed < 100) && test_flag){ + if(test_flag % 2) + m_MainWidget->on_m_LeftBtn_clicked(); + test_flag = 0; + } + if(pulse_1s) { + if(sysPara->status.selfCheckDone && sysPara->para.gearPumpEnable && sysPara->para.flagOfReclaimPumEnable) + checkPressureControl(); + if((QTime::currentTime()>=QTime(00,00,00))&&(QTime::currentTime()<=QTime(00,00,02))&&sysPara->para.Reciclar){ + if(m_MainWidget->getCurrPrintStatus() != 1){ + m_MainWidget->_on_pushButtonPowerOff_pressed(false); + LogInfo::setRunStatusText(tr("定时开机循环完成,准备关机")); + } + } + if(sysPara->status.selfCheckDone && sysPara->para.Reciclar && test_flag){ + reciclar_30s++; + if(reciclar_30s > 30){ + reciclar_30s = 0; + test_flag++; + } + } + else if(reciclar_30s){ + reciclar_30s = 0; + } + QDate d = QDate::currentDate(); + + if(save_weeknum == 0) + { + save_weeknum = d.weekNumber(); + } + + if(save_weeknum != d.weekNumber()) + { + sysPara->devOp->writeFpgaCalandar(1); + save_weeknum = d.weekNumber(); + } + + sysPara->status.delay1s ++; + if(sysPara->status.delay1s == 3 && !delay3s){ + delay3s = true; + } + if(sysPara->status.delay1s % 3 == 0 && sysPara->status.delay1s != 0) + timer_3s = 1; + if(sysPara->status.delay1s == 10){ + pulse_10s = 1; + sysPara->status.delay1s = 0; + } + + pulse_4s++; + if(gearPumpStartFlag) + { + pulse_3s ++; + if(pulse_3s == 6) + { + pulse_3s = 0; + gearPumpRunFlag = true; + ControledSwitchFlag = true; + } + } + if( sysPara->status.reclainTankReachEnd) sysPara->para.openInkLineTime++; + } + + if(pulse_1s && flagOfSerialThreadStratEn){ + #ifdef ARCH_AARCH64 + if (!m_serialThreadFPGA->isRunning()) { + qDebug()<<"start FPGA tread"; + m_serialThreadFPGA->start(); + } + if (!m_serialThreadSTM32->isRunning()){ + qDebug()<<"start STM32 tread"; + m_serialThreadSTM32->start(); + } + #endif + flagOfSerialThreadStratEn = false; + } + + if(pulse_10s){ + sysPara->status.delay10s ++; + if(sysPara->status.delay10s == 10){ + pulse_100s = 1; + sysPara->status.delay10s = 0; + +// if(sysPara->status.flagOfPowerOnMode && (ui->tabMainWindow->getCurrPrintStatus() != 1)) + if(sysPara->status.flagOfPowerOnMode) + { + qDebug()<<"waitPowerOffTime: "<status.waitPowerOffTime; + LogInfo::setRunStatusText(tr("waitPowerOffTime: %1").arg(sysPara->status.waitPowerOffTime)); + if(sysPara->status.waitPowerOffTime) + { + sysPara->status.waitPowerOffTime--; + if(!sysPara->status.waitPowerOffTime) + { + m_MainWidget->_on_pushButtonPowerOff_pressed(false); + LogInfo::setRunStatusText(tr("定时开机循环完成,准备关机")); + m_MainWidget->setRunStatus(tr("准备关机")); + } + } + } + } + } + + /*------------------------------------------------------*/ + if(pulse_100ms) { + sysPara->devOp->stm32Rd(0x07,(unsigned char *)&PulseCnt,2);//读取脉冲个数低字节 + sysPara->devOp->readFgaStatus(); + } + + /**************桂澳增加超速提示*****************************/ + static int logCtrl = 0; + if((sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER || sysPara->para.eleEyeTriggerSynPrintEn) + && sysPara->status.lesslen_warn == 1){ //置1表示超速了 + if(logCtrl++ % 500 == 0){ +// LogInfo::setRunStatusText(tr("速度过快,请检查是否漏喷!!!")); + qDebug()<<"速度过快,请检查是否漏喷!!!"; + } + + /*if(msgBox1->isHidden()){ //桂澳的超速提示先保留 + msgBox1->setText(tr("速度过快,请检查是否漏喷!!!")); + msgBox1->show(); + LogInfo::setRunStatusText(tr("速度过快,请检查是否漏喷!!!")); + qDebug()<<"速度过快,请检查是否漏喷!!!"; + }*/ + sysPara->devOp->controlRedLight(true); + sysPara->devOp->controlGreenLight(false); + } + else{ +// if(!msgBox1->isHidden()) +// sysPara->devOp->controlRedLight(false); + } + + sysPara->status.gearPumpRunSpeed = (PulseCnt * 60 * 1000) / (500 * 2); + if(!sysPara->para.gearPumpEnable) + sysPara->status.PRESSURE *= 5; //响应群众号召,数值放大五倍 + + /*-------------------------------------------------------*/ + bool lostCommuFlag = 1; + if(sysPara->status.fpgaVersionNum != 0) + lostCommuFlag = 0; + + if(sysPara->status.delay10ms%5 == 0) + {//复位发送打印数据 + if((m_MainWidget->getCurrPrintStatus() == 1)&&sysPara->para.ResetSendData) + { + static bool oneTimeFlag = false; + if(sysPara->status.productCnt== 0 && (oneTimeFlag==false))//计米复位发送打印数据 + { + oneTimeFlag = true; + m_MainWidget->on_m_StartBtn_clicked(); + //复位重设起始值 + if(sysPara->para.cnt1ResetToInitValue) + { + sysPara->para.cnt1CurrValue = sysPara->para.cnt1StartValue; + sysPara->status.cnt1CurrentValueInitDoneFlag = false; + sysPara->devOp->writeFpgaCalandar(0); + } + } + if(sysPara->status.productCnt != 0) + { + oneTimeFlag = false; + } + } + static unsigned int lastProductCount=0; + if(sysPara->status.productCnt != lastProductCount || sysPara->status.printDoneFlag) + { + sysPara->status.printDoneFlag = false; + lastProductCount = sysPara->status.productCnt; + + if(vartypeR != 0){ //更新替换变量的值 +// LogInfo::setRunStatusText("vartypeR"); + MySleep(100); + m_MainWidget->onPreviewScene(); + m_MainWidget->SendPrintDataToFpga(0); + } + + sysPara->modbusStatus.printFinishFlag = 1; + memcpy((void*)(&sysPara->modbusStatus.orderCode), (void*)(&sysPara->modbusParas.QRcode_buf), 2);//写返回序列号 +// ui->tabMainWindow->UpdateDateTimeQRCode(QDateTime::currentDateTime().toString("hh:mm")); + } + + // byons: 时间类型图元更新 @2026年4月11日 + // byons: 变量类图元现在优化为局部更新,避免每次都要把整个打印内容发送给FPGA,现在只发送被更新的列区间 2026年7月16日 + auto updateAreas = m_MainWidget->variableItemsUpdate(); + if(sysPara->status.isPrinting && !updateAreas.isEmpty()){ + m_MainWidget->SendPrintDataToFpga(0, true); + } + + if (!updateAreas.isEmpty() && m_StackedWidget->currentWidget() == m_MainWidget) { + // // 统计追踪更新频率 + // static QElapsedTimer bnsTimer; + // static int toogleCount = 0; + // ++toogleCount; + // if(toogleCount > 10) { + // auto elapsed = bnsTimer.restart(); + // qDebug() << (QString("timeHandler avg elapsed: %1 s").arg(elapsed / qreal(toogleCount) / 1000.0)); + // toogleCount = 0; + // } + m_MainWidget->updatePrintDisplayLabel(); + } + +// if (modbus->getModbusStatus() == 1) { +// refreshModbusStatus(); +// } + } + + if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0) + { + if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ + // sysPara->status.selfCheckDone = true; + m_MainWidget->updatePrintDisplayLabel(); +// sysPara->status.flagOfAbnormalStatus = true; + qDebug()<<"打印过程中死机了!!!"; + + m_MainWidget->on_m_StopBtn_clicked(); + } + + if(!sysPara->status.selfCheckDone) + { + /*开机自检*/ + autoControlValvePump(); + if(pulse_100ms){ + pressureAdj(); + } + /*-----------------------------------------------------*/ + if(!sysPara->status.selfCheckCnt) { + LogInfo::setRunStatusText(tr("开始自检,请等待60秒...")); + + m_MainWidget->setReclaimOpenBtnStatus(false); + m_MainWidget->setReclaimCloseBtnStatus(false); + + m_MainWidget->enablePrintButton(false); + sysPara->devOp->mainInkCtrl(); + sysPara->para.TrunOnPowerCnt++;// 20151218 开机次数加1 + sysPara->saveParaToFile(); // 保存开机次数值 + + sysPara->status.lastProductCnt = sysPara->status.productCnt ; //这会让产品计数显示出来 + + m_MainWidget->updateTotalCnt(0); + + + } + if((++sysPara->status.selfCheckCnt % 100) == 0){ + m_MainWidget->setRunStatus(tr("开始自检,请等待%1秒..."). + arg((MAX_SELF_CHECK_CNT - sysPara->status.selfCheckCnt)/100)); + } +#ifdef QT_DEBUG + if(sysPara->status.selfCheckCnt >= 1500) // 测试自检改为15s +#else + if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT) +#endif + { + sysPara->status.selfCheckDone = 1; + // 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛 + // 不清零 u,从当前控制字开始,避免突变 + u = (float)sysPara->para.gearPumpValue; + // m_rampDone = false; + // m_adjSkip = 0; + // m_lastPressure = 0; + // m_stableCount = 0; + autoControlValvePump(); + for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; + m_bufIdx = 0; + + m_MainWidget->setReclaimOpenBtnStatus(true); + m_MainWidget->setReclaimCloseBtnStatus(false); + + sysPara->devOp->mainInkCtrl(); + sysPara->status.canRunAirPushing = true; + + // 自检结束发送打印设置 + qInfo() << "Self check done and send print para to FPGA"; + // sysPara->devOp->setHighVoltageAmplitudetoSTM32(); + // sysPara->devOp->writeFpgaCalandar(0); + // sysPara->devOp->writeFpgaPrintPara(true); + + // 自检完成后,关闭高电压,不知道为什么,有时候开机自检都有高压 + sysPara->devOp->highVoltageCtrl(0); + + m_MainWidget->on_m_StopBtn_clicked(); + + LogInfo::setRunStatusText(tr("自检完成!!!")); + m_MainWidget->setRunStatus(tr("自检完成!!!")); + qDebug()<<"自检完成!!!"; + + if(sysPara->para.Reciclar) + test_flag = 1; + } + else { + if((sysPara->status.selfCheckCnt % 200) == 0) + m_MainWidget->setReclaimOpenBtnStatus(false); + m_MainWidget->setReclaimCloseBtnStatus(false); + } + + } + else{ + // 开机自检完成的前提下 + if (!sysPara->status.airPushing || m_MainWidget->m_2sFlag) { + autoControlValvePump(); + } + + // 检测回收泵模式切换,切换时重置泄漏保护学习状态和软启动状态 + if(m_lastReclaimMode != sysPara->para.flagOfReclaimPumEnable) + { + m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable; + gearPumpRunNormalFlag = false; // 泄漏保护重新学习 + gearPumpRunNormalValue = 0.0f; + m_rampDone = false; // 软启动重新爬坡适应新上限 + m_adjSkip = 0; + m_lastPressure = 0; + m_stableCount = 0; + for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; + m_bufIdx = 0; + } + + if(pulse_100ms && sysPara->para.gearPumpEnable && !sysPara->status.isPumpValveControledByHand && ControledSwitchFlag ) { + pressureAdj(); + } + } + } + else{ + static bool flag = 1; + if(delay3s){ + if(flag && gearPumpStartFlag){ + flag = 0; + LogInfo::setRunStatusText(tr("缺少墨水,喷码机不能正常工作!")); + qDebug()<<"缺少墨水,喷码机不能正常工作!"; + m_MainWidget->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); + } +// ui->tabMainWindow->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); + } + } + /*----------------------------控制温度--------------------------------------*/ + if(pulse_300ms){ + autoControlHeater(); + sysPara->devOp->readSyncCounterAtZero(); + } + + sysPara->status.lostCommuFlag = lostCommuFlag; //务必放在后面 + static unsigned int lastProductCnt =0; + static int lastalterMode=-1; + if(sysPara->para.alterPrint.enable) + { + sysPara->para.AlterMode=sysPara->status.AlterMode; // 电眼触发交替功能:新增这一行 + if( (sysPara->para.AlterMode!=lastalterMode) + || (lastProductCnt != sysPara->status.productCnt) + ) + { +// ui->tabMainWindow->alterDataPrint (sysPara->para.AlterMode); + } + } + else sysPara->para.AlterMode=0; + lastalterMode = sysPara->para.AlterMode; + lastProductCnt = sysPara->status.productCnt; +// m_MainWidget->CheckStatus(pulse_300ms); // + /*----------------------------------界面更新状态---------------------------------------*/ +#ifdef __RFID_CARD + static bool flag6 = true; + unsigned int addr = m_MainInstruction->dlgInputAddr->jd.addr; + if(pulse_10s && flag6){ //初始化刷卡模块 + qDebug()<<"初始化刷卡模块"; + LogInfo::setRunStatusText(QString("jd.addr:%1").arg(addr)); + flag6 = false; + if (manager_rfid) + manager_rfid->initRFIDMoudle(addr, sysPara); + } + + if(pulse_300ms){ + if (manager_rfid) + manager_rfid->handleCheck(addr); + } + +#endif + if(pulse_300ms){ + sysPara->devOp->readCalandarDat(); //务必读一下此数据 + + if(sysPara->status.RandomNum>0) + sysPara->devOp->Read_RanddomFromFpga(); +#ifdef COUNTER1_BY_GROUP /* 分段计米 */ +// cnt1GroupCheck();//分段计米 +#endif + //reserved + QWidget *widget = m_StackedWidget->currentWidget(); + static bool read_flag = false; + if((widget == m_MainWidget || widget == m_LogInfo) && pulse_100ms) { + m_MainWidget->updateSysStatusToUI(); + m_MainWidget->updateGeneralState(m_MainWidget->alarmStatus); + m_LogInfo->updateSysStatusToUI(m_MainWidget->alarmStatus); + } + /* + else if(widget == ui->tabTriggerMode){ + ui->tabTriggerMode->updateSysStatusToUI(); + + if(sysPara->status.fpgaVersionNum != 0){ + QString FpgaVersion; + if((sysPara->status.fpgaVersionNum>>12) == 8 || (sysPara->status.fpgaVersionNum>>12) == 6) + FpgaVersion = "72"; + else if((sysPara->status.fpgaVersionNum>>12) == 2 || (sysPara->status.fpgaVersionNum>>12) == 1){ + if(sysPara->para.flagOfFastMode) + FpgaVersion = "66"; + else + FpgaVersion = "67"; + } + FpgaVersion += QString("_F%1.%2.%3").arg(sysPara->status.fpgaVersionNum >> 12) + .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff); + ui->tabTriggerMode->setBuildTime(QString(" No%1").arg(FpgaVersion)); + } + + } + */ + else if(widget == m_PrintSetting) + { + m_PrintSetting->updateSysStatusToUI(); +// if(!read_flag) +// { +// emit sendPicScene(ui->tabMainWindow->getPicScene()); +// } + read_flag = true; + } + else if(widget == m_SystemSetting){ + + m_SystemSetting->updateSysStatusToUI(); + } + else if(widget == m_SystemManage){ + m_SystemManage->updateSysStatusToUI(); + } + else if(widget == m_OtherInfo){ + m_OtherInfo->updateSysStatusToUI(); + } +// else if(widget == ui->tabNetworkManager){ +// if(!sysPara->status.bLanConfigManual) +// { +// ui->tabNetworkManager->updateSysStatusToUI(); +// } +// } + if(widget != m_PrintSetting) + { + read_flag = false; + } + + // 20140306 + static int last_lesslen_warn=0,lesslen_cnt=0; + if(sysPara->status.lesslen_warn && (sysPara->para.printTriggerMode != PRINT_TRIGGER_TIME)) + { + if(last_lesslen_warn==0) + { + last_lesslen_warn =lesslen_cnt; + if(lesslen_cnt<60)lesslen_cnt +=6; + if(lesslen_cnt>40) sysPara->devOp->resumeFault(); + + if(sysPara->para.speedoverPaushPrint) { +// m_MainWidget->on_pushButtonPausePrint_pressed();// 2014-03-19 +// ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全,自动暂停喷印!!!")); + + } + else { +// ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全!!!")); + } + + } + } + else { last_lesslen_warn=0;lesslen_cnt=30;} + + if(last_lesslen_warn) last_lesslen_warn--; + + } + + if(pulse_100ms && sysPara->status.selfCheckDone){ + detectAndcontrolReclaimTank(); //控制回收槽 + } + + /*---------------------------------处理警告--------------------------------------------*/ + if(pulse_1s){ + if(sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone && gearPumpRunNormalFlag) + { + if((sysPara->status.PRESSURE < (sysPara->para.pressure -8)) || (sysPara->status.PRESSURE > (sysPara->para.pressure +8))) + { +// LogInfo::setRunStatusText(tr("压力波动超过设定的5个值.")); + } + } + + static bool logFlag1 = true; + if(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN && logFlag1){ + logFlag1 = false; +// LogInfo::setRunStatusText(tr("溶剂液位报警! %1").arg(sysPara->RFIDPara.solventNumber)); + qDebug()<<"溶剂液位报警! "<RFIDPara.solventNumber; + } + +#ifdef __RFID_CARD + // hlp 0513 :甲方要求提示越来越频繁 +// if(sysPara->status.needMaintenanceRemind){ +// warningHandler(3); +// } +// LogInfo::setRunStatusText(tr("处理警告:%1").arg(QDateTime::currentDateTime())); + + handleWarnInk(); // 处理墨水警告 + handleWarnSolvent(); // 处理溶剂警告 +#endif + + static bool resumeFlag = false; + if(lostCommuFlag || m_MainWidget->updatePhaseIndicatorLight() + || (sysPara->status.statWarn & + (WARN_STATUS_POWER_MON|WARN_STATUS_INK_WARN|WARN_STATUS_SUMP_WARN + |WARN_STATUS_SOLV_WARN|WARN_STATUS_POWER_MON)) + || (sysPara->status.gearPumpRunStopFlag && pushButtonStartFlag) + ||sysPara->status.lastHighVoltageFault) + { + sysPara->status.beeperOnFlag = true; + if(sysPara->status.gearPumpRunStopFlag && pushButtonStartFlag) + { + m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); + } + if(!resumeFlag) + { + resumeFlag = true; + pulse_4s = 0; + if(!sysPara->status.lastHighVoltageFault) + { + m_MainWidget->onLabelFaultRusumePressed(); + } + } + } + else { + sysPara->status.beeperOnFlag = false; + sysPara->devOp->controlBeeper(false); + if(pulse_4s >= 20) + { + pulse_4s = 0; + resumeFlag = false; + } + } + + if(sysPara->status.beeperOnFlag){ //报警会时有时无 + sysPara->devOp->controlBeeper(!sysPara->devOp->isBeeperEnable()); + } + + if((sysPara->status.statWarn & (WARN_STATUS_POWER_MON)) + ||sysPara->status.lastwarmInkPump||sysPara->status.lastwarmInkPump||sysPara->status.mainInkPumpError + ||sysPara->status.compressPumpError||sysPara->status.lastPhaseFault||sysPara->status.lastRecycleWarn||sysPara->status.lastHighVoltageFault) + { //2013-12-12故障报警灯 杨 + sysPara->status.RedLightOnFlag = true; + + } + else { + sysPara->status.RedLightOnFlag = false; + sysPara->devOp->controlRedLight(false); + //sysPara->devOp->controlRedLight(true); + } + if(sysPara->status.RedLightOnFlag){ //报警会时有时无 + sysPara->devOp->controlRedLight(!sysPara->devOp->isRedLightEnable()); + } + if((sysPara->status.statWarn & (WARN_STATUS_INK_WARN|WARN_STATUS_SOLV_WARN |WARN_STATUS_RECYCLE_FAULT|WARN_STATUS_SUMP_WARN)) + && !sysPara->status.RedLightOnFlag){ + //if(!sysPara->status.RedLightOnFlag){ + sysPara->status.YellowLightOnFlag = true; + } + else { + sysPara->status.YellowLightOnFlag = false; + sysPara->devOp->controlYellowLight(false); + //sysPara->devOp->controlYellowLight(true); + } + if(sysPara->status.YellowLightOnFlag){ //报警会时有时无 + sysPara->devOp->controlYellowLight(!sysPara->devOp->isYellowLightEnable()); + } + + if(sysPara->status.waitHightVolOff>0){ + sysPara->status.waitHightVolOff--; + if(sysPara->status.waitHightVolOff==0){ + sysPara->devOp->highVoltageCtrl(0); + m_MainWidget->setRunStatus(tr("停止打印,自动关闭高压.")); + } + } + + }// 1s + +#ifdef WARNING + static int pre_pressed=0,pre_hvcurrent=0,press_err_cnt=0; + if(pulse_1s) + { + if((pre_pressed > sysPara->status.PRESSURE+70)) + { + if(++press_err_cnt>3) + { +// LogInfo::setRunStatusText(tr("压力异常:上次压力值%1,当前压力值%2").arg(pre_pressed).arg(sysPara->status.PRESSURE)); + } + } + else + { + press_err_cnt = 0; + } + pre_pressed = sysPara->status.PRESSURE; + + + } + + if(pulse_100ms) + { + if(pre_hvcurrent>150 && ( sysPara->status.HV_DETOUT> pre_hvcurrent+20) && (sysPara->status.waitHightVolOn==8 || sysPara->status.waitHightVolOff==1) && sysPara->status.isPrinting ) + pre_hvcurrent = sysPara->status.HV_DETOUT; + + if(sysPara->status.waitHightVolOn<8)sysPara->status.waitHightVolOn++; + if(sysPara->status.isPrinting==0) sysPara->status.waitHightVolOn=0; + } +#endif + if(sysPara->devOp->color_flag ==3){ + sysPara->devOp->color_flag = 0; + pulse_30s = 0; + } + else if(pulse_1s && sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone + && (!sysPara->status.statWarn) && !sysPara->status.powerOffAppending){ + if((!sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed <= 2000) + ||(sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed <= sysPara->para.gearPumpSpeedAlarm)) + { + pulse_30s = 0; + } + else{ + pulse_30s++; + if(pulse_30s >= 30){ + if((sysPara->status.gearPumpRunSpeed >= 2500)||(sysPara->devOp->color_flag == 2) + ||(sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed > sysPara->para.gearPumpSpeedAlarm)) + { + sysPara->status.flagOfSpeedAlarm = true; + sysPara->devOp->color_flag = 2; + if(pulse_30s % 500 == 0){ +// LogInfo::setRunStatusText(tr("齿轮泵转速过高,请立即停机并联系供应商!")); + qDebug()<<"齿轮泵转速过高,请立即停机并联系供应商!"; + } +// ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请立即停机并联系供应商!")); + sysPara->devOp->controlRedLight(true); + if(sysPara->status.isPrinting) + m_MainWidget->on_m_StopBtn_clicked(); + } + else{ + sysPara->devOp->color_flag = 1; + if(pulse_30s % 500 == 0){ +// LogInfo::setRunStatusText(tr("齿轮泵转速过高,请清理过滤器或者检查是否泄露!")); + qDebug()<<"齿轮泵转速过高,请清理过滤器或者检查是否泄露!"; + } +// ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请清理过滤器或者检查是否泄露!")); + sysPara->devOp->controlYellowLight(true); + } + } + if(pulse_30s % 10 == 0) + qDebug()<<"粘度: "<status.viscosity); + } + } + else if(sysPara->status.statWarn & 0xFE){ + sysPara->devOp->color_flag = 3; + pulse_30s = 0; + } + } + + //测试代码,发布模式自动忽略 + +} + +void InkJetPrinter::checkStatusAndStartGearPump() +{ + // 使用 QElapsedTimer 去抖:要求条件连续保持 >= 2000ms + if(!sysPara) + return; + + bool cond = !(sysPara->status.statWarn & WARN_STATUS_INK_WARN) + && !gearPumpRunFlag + && !sysPara->status.isPumpValveControledByHand + && sysPara->para.gearPumpEnable; + + if (cond) { + // 若尚未开始计时,启动计时 + if (!m_pipingClearSince.isValid()) { + m_pipingClearSince.start(); + return; + } + + // 若计时已到达阈值,再次确认条件并执行启动动作 + if (m_pipingClearSince.elapsed() >= 2000) { + if (!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) + && !gearPumpRunFlag + && !sysPara->status.isPumpValveControledByHand) { + if (sysPara->para.gearPumpValue != 0) { + sysPara->para.gearPumpValue = 0; + u = 0.0f; + sysPara->devOp->WriteMoterPump(); + } + gearPumpStartFlag = true; // 设置标记位,让 timerHandler 启动齿轮泵 + } + m_pipingClearSince.invalidate(); + } + } else { + // 条件不满足,取消计时 + if (m_pipingClearSince.isValid()) + m_pipingClearSince.invalidate(); + } +} + + +// 以下槽函数逻辑完全不变 +void InkJetPrinter::getTestPrintWidgetButtonClickedSlot(int index) +{ + switch (index) + { + case 201: + { + m_StackedWidget->setCurrentWidget(m_BarCodeDlg); + break; + } + case 202: + { + m_StackedWidget->setCurrentWidget(m_QRCodeDlg); + break; + } + + case 9: + { + m_PrintSetting->updateModelToUI(); + m_StackedWidget->setCurrentWidget(m_PrintSetting); + break; + } + case 10: + { + m_StackedWidget->setCurrentWidget(m_FontSetWidget); + break; + } + case 16: + { + // 已经转由 @see InkJetPrinter::openDatetimeEditor 处理 + break; + } + case 5: + { + // m_StackedWidget->setCurrentWidget(m_CounterVarSet); + // 转由 @see InkJetPrinter::slt_editCounter 处理 + break; + } + case 20: + { + m_StackedWidget->setCurrentWidget(m_MainWidget); + ui.label_currEditFile->setText(""); + break; + } + default: + break; + } +} + +void InkJetPrinter::openDatetimeEditor(DateItemModel dateModel, TextItemModel textItemModel) +{ + m_DateVarSet->initUI(); + m_DateVarSet->initReplaceValue(); + + m_DateVarSet->setTextItemModel(textItemModel); + m_DateVarSet->setDateModel(dateModel); + + m_StackedWidget->setCurrentWidget(m_DateVarSet); +} + +void InkJetPrinter::slt_updatePrintContent(const QString &filename) +{ + loadWorkFileAndPreparePrint(filename); +} + +void InkJetPrinter::getFontSetWidgetButtonClickedSlot(int index) +{ + switch (index) + { + case 1: + { + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + break; + } + default: + break; + } +} + +void InkJetPrinter::getMainWidgetButtonClickedSlot(int index) +{ + switch (index) + { + case 1: { // 编辑当前文件 + + // 如果上次打开的文件不存在或者不是xml文件,则创建一个新的作业文件 + if(currWorkFile.isEmpty()){ + createNewJobFile(); + break; + } + + // 如果上次打开的文件存在且是xml文件,则直接打开该文件 + QFileInfo fileInfo(currWorkFile); + m_TestPrintWidget->openWorkFile(currWorkFile); + ui.label_currEditFile->setText(QString("E: %1").arg(fileInfo.baseName())); + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + break; + } + case 2: // 调入文件喷印 + m_dlgFileOperation->setWindowModality(Qt::WindowModal); + m_dlgFileOperation->refreshListView(SCENE); + m_dlgFileOperation->show(); + break; + case 3: + close(); + break; + case 4: + m_StackedWidget->setCurrentWidget(m_MainInstruction); + break; + case 5: + m_StackedWidget->setCurrentWidget(m_LogInfo); + break; + default: + break; + } +} + +void InkJetPrinter::getPrintSettingButtonClickedSlot(int index){ + if (m_isDefaultPrintSettingMode) { + exitDefaultPrintSettingMode(); + m_StackedWidget->setCurrentWidget(m_MainInstruction); // 修改完默认设置后,回到MainInstruction + return; + } + + switch (index) + { + case 1: + case 2: + { + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + break; + } + default: + break; + } +} + +void InkJetPrinter::enterDefaultPrintSettingMode() +{ + m_savedPrintSettingModel = m_PrintSetting->model(); + m_PrintSetting->setDefaultSettingMode(true); + m_PrintSetting->setModel(PrintSettingModel::defPrintSettingModel()); + m_isDefaultPrintSettingMode = true; + m_StackedWidget->setCurrentWidget(m_PrintSetting); +} + +void InkJetPrinter::exitDefaultPrintSettingMode() +{ + m_PrintSetting->setModel(m_savedPrintSettingModel); + m_PrintSetting->setDefaultSettingMode(false); + m_isDefaultPrintSettingMode = false; +} + +void InkJetPrinter::getMainInstructWidgetButtonClickedSlot(int index) +{ + switch (index) + { + case 1: + { + m_StackedWidget->setCurrentWidget(m_MainWidget); + break; + } + case 2: + { + m_StackedWidget->setCurrentWidget(m_SystemManage); + break; + } + case 3: + { + m_SystemSetting->updateSysParaToUI(); + m_StackedWidget->setCurrentWidget(m_SystemSetting); + break; + } + case 4: + { + m_StackedWidget->setCurrentWidget(m_OtherInfo); + break; + } + case 5: + { + m_StackedWidget->setCurrentWidget(m_SystemUpdate); + break; + } + case 6: + { + enterDefaultPrintSettingMode(); + break; + } + default: + break; + } +} + +void InkJetPrinter::getSystemManageWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + { + m_StackedWidget->setCurrentWidget(m_MainInstruction); + break; + } + default: + break; + } +} + +void InkJetPrinter::getSystemUpdateWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + { + m_StackedWidget->setCurrentWidget(m_MainInstruction); + break; + } + break; + + default: + break; + } +} + +void InkJetPrinter::getSystemSettingWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + case 2: + { + m_StackedWidget->setCurrentWidget(m_MainInstruction); + break; + } + default: + break; + } +} + +void InkJetPrinter::getOtherInfoWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + case 2: + { + m_StackedWidget->setCurrentWidget(m_MainInstruction); + break; + } + default: + break; + } +} + +void InkJetPrinter::getLogInfoWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + case 2: + case 3: + case 4: + { + m_StackedWidget->setCurrentWidget(m_MainWidget); + break; + } + default: + break; + } +} + +void InkJetPrinter::getDateSetWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + { + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + // m_TestPrintWidget->onEditItemVarDone(); + DateItemModel model = m_DateVarSet->dateModel(); + const auto textModel = m_DateVarSet->textItemModeL(); + qInfo() << "A new datetime pattern: " << model.datetimePattern; + qInfo() << "Text model: " << TextItemModel::toString(textModel); + m_TestPrintWidget->addDateTimeItem(model, textModel); + break; + } + case 2: + { + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + break; + } + case 3: + { + break; + } + default: + break; + } + +} + +void InkJetPrinter::getCounterVarSetWidgetButtonClickSlot(int index){ + switch (index) + { + case 1: + { + CounterViewModel vm = m_CounterVarSet->getCounterConfig(); + m_TestPrintWidget->addCounterItem(vm); + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + break; + } + case 2: + { + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + break; + } + case 3: + { + break; + } + default: + break; + } +} + +void InkJetPrinter::slt_counterVarUpdate() +{ + // m_StackedWidget->setCurrentWidget(m_TestPrintWidget); +} + +void InkJetPrinter::showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel) +{ + m_StackedWidget->setCurrentWidget(m_scheduleShiftsEditor); + m_scheduleShiftsEditor->setItemModel(schedules, txtModel); +} + +void InkJetPrinter::onScheduleShiftsEditDone() +{ + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + m_TestPrintWidget->addScheduleShiftsItem(m_scheduleShiftsEditor->scheduleModel(), m_scheduleShiftsEditor->textItemModel()); +} + +bool InkJetPrinter::eventFilter(QObject *watched, QEvent *event) +{ + +// if(sysPara->status.flagOfKeyBoardType) +// return QTabWidget::eventFilter(watched,event); +//qDebug()<<"eventFilter"; + QSpinBox *qsb=dynamic_cast(watched); + QLineEdit *qle=dynamic_cast(watched); + QTextEdit *qte=dynamic_cast(watched); + QWidget *widget = qobject_cast(watched); + switch (event->type()){ + case QEvent::FocusIn: + if(qsb&&!qsb->isReadOnly()||qle&&!qle->isReadOnly()||qte&&!qte->isReadOnly() && watched->objectName() != "inputPreviewBox") + myInputMethod->updateHandler(1); + break; + case QEvent::FocusOut: + if(watched->objectName() != "inputPreviewBox") + myInputMethod->updateHandler(2); + break; + case QEvent::MouseButtonPress: + if(widget && !qsb && !qle && !qte && !myInputMethod->shouldIgnoreHideForWidget(widget)) + myInputMethod->clearCurrentFocusAndHide(); + break; + } + + return QWidget::eventFilter(watched,event); +} + +/*************************FPGA通过串口读取状态赋值给status-start******************************************/ +void InkJetPrinter::saveFPGAVersionNum(unsigned int data){ + sysPara->status.fpgaVersionNum=data; +} +unsigned char statWarnTempData=0; +void InkJetPrinter::saveFPGAStatus(unsigned char *data){ + quint16 len=data[5]; + len=len<<8; + len+=data[6]; + unsigned char *target= ((unsigned char *)&sysPara->status); + for(int i=0;istatus.dummy != sysPara->status.isPrinting && sysPara->status.selfCheckDone){ + sysPara->status.isPrinting = sysPara->status.dummy; + m_MainWidget->updatePrintDisplayLabel(); + emit printStatusChanged(sysPara->status.isPrinting); + } +} + +void InkJetPrinter::saveFPGAPhaseDetectHighTm(unsigned char *data){ + quint16 len=data[5]; + len=len<<8; + len+=data[6]; + unsigned char *target= ((unsigned char *)&sysPara->status.phaseDetectHighTm); + for(int i=0;istatus.calandar_and_dat); + for(int i=0;istatus.calandar_and_dat.cnt1CurrValue, 16); + bool ok; + // sysPara->para.cnt1CurrValue = hexStr.toUInt(&ok, 10); + + hexStr = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue, 16); + // sysPara->para.cnt2CurrValue = hexStr.toUInt(&ok, 10); +} + +void InkJetPrinter::saveFPGACnt3CurrValue(unsigned char *data){ + quint16 len=data[5]; + len=len<<8; + len+=data[6]; + unsigned char *target= ((unsigned char *)&sysPara->status.Status_Counter3.cnt3CurrValue); + for(int i=0;istatus.XXXDay); + for(int i=0;idevOp->stopSendDataFPGA = true; + else + sysPara->devOp->stopSendDataFPGA = false; +} + +void InkJetPrinter::stopSendSTM32Data(bool flag){ + if(flag) + sysPara->devOp->stopSendDataSTM32 = true; + else + sysPara->devOp->stopSendDataSTM32 = false; +} + + +/*************************FPGA通过串口读取状态赋值给status-end******************************************/ + + + +//------------------------------------------------------------------------------------------------------------------------------------------ + + + +/*************************STM32通过串口读取状态赋值给status-start******************************************/ +void InkJetPrinter::saveSTM32Status(unsigned char *data){ + unsigned char *target= ((unsigned char *)&sysPara->status)+0x44; + int len = data[3]; + for(int i=0;istatus.reclaimTankstatus); +// emit showMotorIsen(sysPara->status.MOTOR_ISEN,sysPara->status.AD_FIXED); +} + +void InkJetPrinter::saveGearPumpVal(unsigned char *data){ + unsigned char *target= ((unsigned char *)&sysPara->para.gearPumpValue); + for(int i=0;ipara.gearPumpValue > 0) + return; + + unsigned char *target= ((unsigned char *)&PulseCnt); + for(int i=0;istatus.stm32Verion); + for(int i=0;istatus.flagOfPowerOnMode = (sysPara->status.stm32Verion>>23) & 0x01; + if(sysPara->status.flagOfPowerOnMode) + sysPara->status.waitPowerOffTime = 18;//半个小时 + else + sysPara->status.waitPowerOffTime = 0; + LogInfo::setRunStatusText(tr("flagOfPowerOnMode: %1").arg(sysPara->status.flagOfPowerOnMode)); + QString STM32Ver = QString("%1.%2.%3").arg((sysPara->status.stm32Verion>>16)&0x7F) + .arg((sysPara->status.stm32Verion>>8) & 0xFF).arg(sysPara->status.stm32Verion&0xFF); + qDebug()<<"STM32Ver:"<status.stm32Time = true; + } + + QString Year = QString::number(datatime[0])+QString::number(datatime[1]); + QString Month = QString("%1").arg(datatime[2], 2, 10, QChar('0')); + QString Day = QString("%1").arg(datatime[3], 2, 10, QChar('0')); + QString Week = QString::number(datatime[4]); + + QString Hour = QString("%1").arg(datatime[5], 2, 10, QChar('0')); + QString Minute = QString("%1").arg(datatime[6], 2, 10, QChar('0')); + QString Second = QString("%1").arg(datatime[7], 2, 10, QChar('0')); + QString date = Year+"-"+Month+"-"+Day+" "+Hour+":"+Minute+":"+Second; + qDebug()<PowerOnSetTime(date); + +} + + +/*************************STM32通过串口读取状态赋值给status-end******************************************/ + + +void InkJetPrinter::closedSerial(){ + if(m_serialThreadFPGA->isRunning()){ + m_serialThreadFPGA->quit(); + m_serialThreadFPGA->wait(); + } + if(m_serialThreadSTM32->isRunning()){ + m_serialThreadSTM32->quit(); + m_serialThreadSTM32->wait(); + } + if(serialFPGA) + delete serialFPGA; + if(serialSTM32) + delete serialSTM32; +} + +void InkJetPrinter::closeSerialFPGA(){ + if(m_serialThreadFPGA->isRunning()){ + m_serialThreadFPGA->requestInterruption(); + m_serialThreadFPGA->quit(); + m_serialThreadFPGA->wait(); + } + + if(serialFPGA){ + delete serialFPGA; + serialFPGA = nullptr; + } +} + +void InkJetPrinter::closeSerialSTM32(){ + + if(m_serialThreadSTM32->isRunning()){ + + LogInfo::setRunStatusText("Closing STM32 serial port and exit thread..."); + + m_serialThreadSTM32->requestInterruption(); + m_serialThreadSTM32->quit(); + m_serialThreadSTM32->wait(); + } + if(serialSTM32){ + delete serialSTM32; + serialSTM32 = nullptr; + } +} + +void InkJetPrinter::restartSerialPort(){ + + closeSerialFPGA(); + closeSerialSTM32(); + + initSerialPorts(); +} + +void InkJetPrinter::initSerialPorts() +{ + serialFPGA = new Serial("/dev/ttyAS5"); + connect(m_serialThreadFPGA, &QThread::started, serialFPGA, &Serial::startInitSlot); + serialFPGA->moveToThread(m_serialThreadFPGA); + connect(serialFPGA,SIGNAL(sendQueueData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendFPGADate(int,int,unsigned char*,int,int))); + connect(serialFPGA,SIGNAL(resendFPGAData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendFPGADate(int,int,unsigned char*,int,int))); + connect(sysPara->devOp,SIGNAL(sendSerialDataToFPGA(int,int,unsigned char*,int,int)),serialFPGA,SLOT(sendSerialData(int,int,unsigned char*,int,int)),Qt::QueuedConnection); + connect(serialFPGA,SIGNAL(getFPGAVersion(uint)),this,SLOT(saveFPGAVersionNum(uint))); + connect(serialFPGA,SIGNAL(stopSendData(bool)),this,SLOT(stopSendFPGAData(bool))); + connect(serialFPGA,SIGNAL(getFPGAPhaseDetectHighTm(unsigned char*)),this,SLOT(saveFPGAPhaseDetectHighTm(unsigned char*))); + connect(serialFPGA,SIGNAL(getFPGAStatus(unsigned char*)),this,SLOT(saveFPGAStatus(unsigned char*))); + connect(serialFPGA,SIGNAL(getFPGACalandarAndDat(unsigned char*)),this,SLOT(saveFPGACalandarAndDat(unsigned char*))); + connect(serialFPGA,SIGNAL(getFPGACnt3CurrValue(unsigned char*)),this,SLOT(saveFPGACnt3CurrValue(unsigned char*))); + connect(serialFPGA,SIGNAL(getFPGAXXXDay(unsigned char*)),this,SLOT(saveFPGAXXXDay(unsigned char*))); + connect(serialFPGA,SIGNAL(queueSizeFPGA(int)),this,SLOT(showFPGAqueuesize(int))); + connect(serialFPGA,SIGNAL(queueFPGASizeSIG(int)),this,SLOT(showqueueFPGAsize(int))); + connect(serialFPGA, &Serial::FPGABuildDat, this, [this](int buildTime){ + sysPara->status.build_dat.builTime = quint16(buildTime); + qDebug() << "FPGA build time: " << buildTime; + LogInfo::setRunStatusText(QString("FPGA build time: %1").arg(buildTime)); + }); + + serialSTM32 = new Serial("/dev/ttyAS2"); + connect(m_serialThreadSTM32, &QThread::started, serialSTM32, &Serial::startInitSlot); + serialSTM32->moveToThread(m_serialThreadSTM32); + connect(serialSTM32,SIGNAL(sendQueueData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendSTM32Date(int,int,unsigned char*,int,int))); + connect(sysPara->devOp,SIGNAL(sendSerialDataToSTM32(int,int,unsigned char*,int,int)),serialSTM32,SLOT(sendSerialData(int,int,unsigned char*,int,int))); + connect(serialSTM32,SIGNAL(getSTM32Status(unsigned char*)),this,SLOT(saveSTM32Status(unsigned char*))); + connect(serialSTM32,SIGNAL(getGearPumpVal(unsigned char*)),this,SLOT(saveGearPumpVal(unsigned char*))); + connect(serialSTM32,SIGNAL(getPulseCnt(unsigned char*)),this,SLOT(savePulseCntVal(unsigned char*))); + connect(serialSTM32,SIGNAL(getSTM32Version(unsigned char*)),this,SLOT(saveSTM32Version(unsigned char*))); + connect(serialSTM32,SIGNAL(getSTM32Time(unsigned char*)),this,SLOT(saveSTM32Time(unsigned char*))); + connect(serialSTM32,SIGNAL(stopSendData(bool)),this,SLOT(stopSendSTM32Data(bool))); + connect(serialSTM32,SIGNAL(powerOffReady()),m_MainWidget,SLOT(powerOffConfirmed())); + connect(serialSTM32,SIGNAL(queueSizeSTM32(int)),this,SLOT(showSTM32queuesize(int))); + connect(serialSTM32, &Serial::STM32Connected, this, [this](bool ok, QString errorMsg){ + if(ok){ + LogInfo::setRunStatusText("Connected to STM32 serial port"); + } + else{ + LogInfo::setRunStatusText("STM32 serial port connection failed: " + errorMsg); + } + }); + + flagOfSerialThreadStratEn = true; +} + +void InkJetPrinter::showFPGAqueuesize(int size){ + sysPara->status.sizeFPGA = size; +} + +void InkJetPrinter::showSTM32queuesize(int size){ + sysPara->status.sizeSTM32 = size; +} + +void InkJetPrinter::showqueueFPGAsize(int size){ + sysPara->status.sizequeueFPGA = size; +} + +void InkJetPrinter::autoControlValvePump(void) + +{ + if(sysPara){ + if(!sysPara->status.isPumpValveControledByHand){ + + /*---------------------------------供墨阀--------------------------------------------*/ + bool enableFlag = ((sysPara->status.statWarn & WARN_STATUS_INK_SWINT) + || (sysPara->status.lastRecycleWarn && sysPara->para.RecycleWarnAction) // 2017.8.15版本回收故障关供墨阀问题 + || ( sysPara->status.HVFaultCloseEn ) //高压故障关闭墨线 + )?false:true; //墨线开关 + + if(enableFlag != sysPara->devOp->isInkValveOpen()){ + if(enableFlag == false) { //关闭供墨阀的顺序 先开循环阀后关闭供墨阀间 + if (sysPara->status.cycleValveOpenCntAfterSWintOff == 0) { + sysPara->status.cycleValveOpenCntAfterSWintOff = MAX_CYCLEVALVE_OPEN_TIME_AFTER_SWITN_OFF; + } + if (sysPara->status.cycleValveOpenCntAfterSWintOff < 60) { //在准备关闭循环阀的时候关闭供墨阀 + sysPara->devOp->controlInkValve(enableFlag); //关供墨 + sysPara->devOp->controlInkValvePWM(enableFlag); //关供墨 + } + } + else { //开供墨阀 + if(!sysPara->devOp->isReclaimPumpOpen()) //开供墨阀之前要判断回收泵有没有开,没开就提前打开 + { + sysPara->devOp->controlReclaimPump(true, false); // 回收泵开 + } + if(!m_MainWidget->m_2sFlag) + { + sysPara->devOp->controlInkValve(enableFlag); + sysPara->devOp->controlInkValvePWM(enableFlag); + } + } + } + + /*----------------------------------循环阀-------------------------------------------*/ + if(!sysPara->status.selfCheckDone) { + if(!sysPara->devOp->isCycleValveOpen()) { + sysPara->devOp->controlCycleValve(false); + } + } + else { + autoControlCycleValve(); + } + + /*----------------------------------泄压阀-------------------------------------------*/ + //===================================================================================================== + + if(( + sysPara->status.releaseValveOpenApending || + sysPara->status.pressureOverFlowCnt > 2 + ) //防止干扰和误动作 + && !sysPara->status.releaseValveDelayCnt) + { + if(!sysPara->devOp->isReleaseValveOpen()) + { //泄压阀 + sysPara->devOp->controlReleaseValve(true); + } + sysPara->status.releaseValveDelayCnt = MAX_RELEASE_VALVE_DELAY_CNT; + sysPara->status.releaseValveOpenApending = true; + } + else + { + if(sysPara->devOp->isReleaseValveOpen()) + { // + //sysPara->devOp->controlReleaseValve(false); + } + + if(sysPara->status.releaseValveDelayCnt) + sysPara->status.releaseValveDelayCnt --; + if(sysPara->status.PRESSURE < sysPara->para.pressure) + { + sysPara->status.releaseValveOpenApending = false; + if(sysPara->devOp->isReleaseValveOpen()){ sysPara->devOp->controlReleaseValve(false); + + } + } + } + + /*-----------------------------------主墨泵------------------------------------------*/ +// if(sysPara->status.SEPTAL_POSITION < (sysPara->para.septalPostion - DIFF_SEPTAL_POSITION)) +// sysPara->status.septalPositionOverFlowCnt ++; +// else +// sysPara->status.septalPositionOverFlowCnt = 0; + if(sysPara->status.septalPositionOverFlowCnt > 2 && !sysPara->status.mainInkPumpError){ //主墨泵 + if(!sysPara->devOp->isMainInkPumpOpen()){ + sysPara->devOp->controlMainInkPump(true); + sysPara->status.mainInkPumpRunTmCnt = 0; + } + else if(sysPara->status.selfCheckDone){ + if(sysPara->status.mainInkPumpRunTmCnt < MAX_MAIN_INK_PUMP_RUN_TIME){ // + sysPara->status.mainInkPumpRunTmCnt ++; + } + else { + if(!sysPara->para.gearPumpEnable) + { + sysPara->status.mainInkPumpError = true; + sysPara->devOp->controlMainInkPump(false); +// LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!主墨泵故障")); +// ui->tabMainWindow->setRunStatus(tr("主墨泵故障!!!")); + } + } + } + } + else if(sysPara->status.SEPTAL_POSITION > sysPara->para.septalPostion){ + if(sysPara->devOp->isMainInkPumpOpen()) + sysPara->devOp->controlMainInkPump(false); + } + /*-----------------------------------压缩机------------------------------------------*/ + /*reserved + if((sysPara->para.pressure - sysPara->status.PRESSURE > MAX_PRESSURE_DIFF) && !sysPara->status.compressPumpError){ //压缩机 + if(!sysPara->devOp->isCompressPumpOpen()){ + sysPara->devOp->controlCompressPump(true); + sysPara->status.compressPumpRunTmCnt = 0; + } + else if(sysPara->status.selfCheckDone){ + if(sysPara->status.compressPumpRunTmCnt < MAX_COMPRESS_PUMP_RUN_TIME){ //如果长时间开压缩机,考虑设备故障 + sysPara->status.compressPumpRunTmCnt ++; + } + else { + sysPara->status.compressPumpError = true; + sysPara->devOp->controlCompressPump(false); + if(!sysPara->para.gearPumpEnable) + { +// LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!压缩机故障")); +// ui->tabMainWindow->setRunStatus(tr("压缩机故障!!!")); + } + + } + } + } + else if(sysPara->para.pressure <= sysPara->status.PRESSURE){ //压力到达预期的压力 + if(sysPara->devOp->isCompressPumpOpen()) + sysPara->devOp->controlCompressPump(false); + }*/ + + /*------------------------------------粘度泵,混合阀-----------------------------------------*/ + + /*-----------------------------每30s打开一次粘度泵以及相关处理--------------------------------------*/ + static bool hasDetectedBellow = false; // 检测到下位灯 + static bool hasDetectedTop = false; // 检测到上位灯 + static int viscosity_low = 0; //统计粘度连续偏低10%次数 + static unsigned char Mixing_valve_open = 0; //统计粘度连续偏高5%次数 + static unsigned char viscosity_faulty_num = 0; //统计粘度连续偏高13%次数 + static bool flag = 0; + + if(sysPara->status.cycleValveOpenCntAfterSWintOff) { //关闭墨线的时候要提前开粘度泵 + sysPara->status.viscosityDelayCnt = sysPara->para.viscosityPumpInterval*100 + 100; + } + ++sysPara->status.viscosityDelayCnt; + int mixer_open_threshold = (105*sysPara->para.viscosity)/100; + int viscosity_faulty_threshold =(113*sysPara->para.viscosity)/100; + if(sysPara->status.viscosityDelayCnt >= sysPara->para.viscosityPumpInterval*100 && flag == 0) + { + flag=1; + if (!sysPara->devOp->isViscosityPumpOpen()) + { + sysPara->devOp->controlViscosityPump(true); + viscosity_timer->start(10000); + qDebug()<<"粘度: "<status.viscosity); + } + if((sysPara->status.viscosity >= 90*sysPara->para.viscosity/100) && (sysPara->status.viscosity <= mixer_open_threshold)) + { + sysPara->status.viscosityFault = 0; + viscosity_low=0; + Mixing_valve_open = 0; + viscosity_faulty_num = 0; + } + if(sysPara->status.viscosity < 90*sysPara->para.viscosity/100) + { + viscosity_low++; + viscosity_faulty_num = 0; + Mixing_valve_open = 0; + } + if(sysPara->status.viscosity > mixer_open_threshold && sysPara->status.viscosity <= viscosity_faulty_threshold) + { + Mixing_valve_open++; + viscosity_low = 0; + viscosity_faulty_num = 0; + } + if(sysPara->status.viscosity > viscosity_faulty_threshold){ + Mixing_valve_open++; + viscosity_faulty_num++; + viscosity_low = 0; + } + + if((!sysPara->devOp->isMixValveOpen()) && (((Mixing_valve_open > 1) && (!sysPara->para.gearPumpEnable)) || ((Mixing_valve_open > 4) && sysPara->para.gearPumpEnable))) { // + sysPara->devOp->controlMixValve(true); + Mixing_valve_open = 0; +// LogInfo::setRunStatusText(tr("添加溶剂:")+QString::number(sysPara->status.viscosity)); + qDebug()<<"添加溶剂"; + } + + if(viscosity_low >= 60) + { +// LogInfo::setRunStatusText(tr("警告!!!!!!!!!!!粘度值偏低")+QString::number(sysPara->status.viscosity)); + qDebug()<<"粘度值偏低"; + sysPara->status.viscosityFault = 2; + if(sysPara->devOp->isMixValveOpen()) { + sysPara->devOp->controlMixValve(false); + } + } + if(viscosity_faulty_num >= 5) + { +// LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!粘度偏大故障")+QString::number(sysPara->status.viscosity)); + qDebug()<<"粘度偏大故障"; + sysPara->status.viscosityFault = 1; + } + + } + if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+120)) && flag==1) + { + if(sysPara->devOp->isMixValveOpen()) { + sysPara->devOp->controlMixValve(false); + } + } + + if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+130)) && flag==1) + { + if (sysPara->devOp->isViscosityPumpOpen()) { + sysPara->devOp->controlViscosityPump(false); + } + sysPara->status.viscosityDelayCnt = 0; + flag=0; + } + + if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY){ //上位灯检测标志位 + viscosity_timer->stop(); + } + + if(sysPara->status.viscosityDelayCnt < sysPara->para.viscosityPumpInterval*100) { + static int detectBelow = 0; + if (++detectBelow%400 == 0) { + if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY) + { + if(sysPara->status.rWarnViscoReady>=15){ + sysPara->status.viscosityFault = 1; + sysPara->status.viscosity=0; + if(!firstTime) + qDebug()<<"错误!粘度计下位灯故障."+QString::number(sysPara->status.viscosity); + // LogInfo::setRunStatusText(tr("错误!粘度计下位灯故障.")+QString::number(sysPara->status.viscosity)); + hasDetectedBellow = true; + } + else sysPara->status.rWarnViscoReady++; + } + else { + sysPara->status.rWarnViscoReady = 0; + sysPara->status.viscosityFault = 0; + } + } + } + if(hasDetectedBellow && hasDetectedTop) + { + if(sysPara->devOp->isMixValveOpen()) { // + sysPara->devOp->controlMixValve(false); //如果检测不到上下位灯就关掉混合阀 + } + } + if(sysPara->status.viscosityFault==0) + { + hasDetectedBellow = false; + hasDetectedTop = false; + } +// } + /*-----------------------------------回收泵------------------------------------------*/ + + if(!sysPara->status.autoCtlReclaimAfterSWintOff) + { + if(!sysPara->devOp->isReclaimPumpOpen() ){ //回收泵 + // ui->tabMainWindow->setRunStatus(tr("全速回收泵!!!")); + sysPara->status.reclaimPumpFullSpeedCnt = 0; + sysPara->devOp->controlReclaimPump(true,true); //先全速,后降速 + } + else if(sysPara->status.reclaimPumpFullSpeedCnt <= RECLAIM_PUMP_FULL_SPEED_CNT){ + sysPara->status.reclaimPumpFullSpeedCnt ++; + if(sysPara->status.reclaimPumpFullSpeedCnt == RECLAIM_PUMP_FULL_SPEED_CNT){ //降速 + // ui->tabMainWindow->setRunStatus(tr("降速回收泵!!!")); + sysPara->devOp->controlReclaimPump(true,false); + } + } + } + /*-----------------------------------------------------------------------------*/ + } + } +} + +void InkJetPrinter::autoControlCycleValve() +{ + if(!sysPara->status.selfCheckDone || (sysPara->status.flagOfPowerOnMode && sysPara->para.gearPumpEnable)){ + // if(!sysPara->devOp->isCycleValveOpen()){ //循环阀 //定时开机循环时隔膜泵不开关循环阀 + // sysPara->devOp->controlCycleValve(true); + // } + cycleValveRunForSelfCheck(); + if(sysPara->status.flagOfPowerOnMode) + { + if(sysPara->devOp->isMixValveOpen()) { // + sysPara->devOp->controlMixValve(false); + } + } + } + else { + if(sysPara->status.cycleValveOpenCntAfterSWintOff){ // 开循环阀 + if(!sysPara->devOp->isCycleValveOpen()){ + sysPara->devOp->controlCycleValve(true); + } + sysPara->status.cycleValveOpenCntAfterSWintOff --; + } + else if(sysPara->devOp->isCycleValveOpen()){ // 关循环阀 + sysPara->devOp->controlCycleValve(false); + } + } +} + +//在开机自检过程中交替打开和关闭循环阀 +void InkJetPrinter::cycleValveRunForSelfCheck(){ + static int cycleValveOpenCnt = 0; + if (++cycleValveOpenCnt%300 > 150) { + if(!sysPara->devOp->isCycleValveOpen()){ //循环阀 开 + sysPara->devOp->controlCycleValve(true); + } + } + else { + if(sysPara->devOp->isCycleValveOpen()){ //循环阀 关 + sysPara->devOp->controlCycleValve(false); + } + } +} + + +void InkJetPrinter::autoControlHeater(){ + //100ms + static int tempDly=1830; + if(sysPara->para.heatTime == 0) + sysPara->para.heatTime = 5; + int maxHeatTime = sysPara->para.heatTime * 600; + if(sysPara->para.flagOfContinueHeat) + maxHeatTime = 60* 600; + if(tempDly) tempDly--; + if(tempDly>=1800) + { + if(tempDly==1800) + { + sysPara->status.indoorTemperature = sysPara->status.TEMP_ADIN/4; + sysPara->devOp->pumpValveCtrl(1); +// if(sysPara->status.indoorTemperature-35>0) +// ui->tabSystemSetting->updateViscosityAdjust((sysPara->status.indoorTemperature-35)); +// else +// ui->tabSystemSetting->updateViscosityAdjust(0); + } + return; + } + if(sysPara->status.TEMP_ADIN/4 < sysPara->para.temperature && sysPara->status.heaterONTimeCnt < MAX_HEATER_TIME){ + if(tempDly==0) sysPara->status.heaterONTimeCnt ++; + sysPara->devOp->controlHeater(true); + + if(sysPara->status.heaterONTimeCnt == maxHeatTime) + { + if(sysPara->status.TEMP_ADIN/4 < (sysPara->para.temperature - 2)){ +// LogInfo::setRunStatusText(tr("警告:加热器长时间无法达到预期温度,故障或设置错误!")); +// ui->tabMainWindow->setRunStatus("加热器长时间无法达到预期温度,故障或设置错误!");//20150105 no check + sysPara->devOp->controlHeater(false); + } + else + sysPara->status.heaterONTimeCnt = 0; + } + } + else if(sysPara->status.TEMP_ADIN/4 >= (sysPara->para.temperature + 2)){ + if(sysPara->status.heaterONTimeCnt < maxHeatTime) + { + sysPara->status.heaterONTimeCnt = 0; + } +// if(sysPara->devOp->isHearterEnable()) + sysPara->devOp->controlHeater(false); + } +} + +/* + * + * 控制回收槽 + * + * */ +void InkJetPrinter::detectAndcontrolReclaimTank(){ + sysPara->status.currReclaimTankPos =10*sysPara->status.curr_reclaimTankTime; + sysPara->status.reclaimTankBlockedAppending =0; + if(sysPara->status.reclaimTankstatus == 0x10) //7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 + { + LogInfo::setRunStatusText(tr("电机故障")); + m_MainWidget->setRunStatus(tr("电机故障")); + if(sysPara->devOp->isReclaimTankCloseEnable()) + { + sysPara->devOp->controlReclaimTankClose(false); + } + else { + if(sysPara->devOp->isReclaimTankOpenEnable()) + sysPara->devOp->controlReclaimTankOpen(false); + } + + m_MainWidget->stopFlashReclaimOpenBtn(); + } + else if(sysPara->status.reclaimTankstatus == 5 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 + { + if(sysPara->devOp->isReclaimTankOpenEnable()) + sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭 + sysPara->status.reclainTankReachEnd = true; + m_MainWidget->setRunStatus(tr("回收槽到头")); + m_MainWidget->setReclaimStatus(true, 100); + m_MainWidget->enablePrintButton(true); //仅仅在此时能使能打印按钮 + // sysPara->devOp->highVoltageCtrl(1); + + m_MainWidget->stopFlashReclaimOpenBtn(); + +// emit reclaimTankOpenDone(); + /*回收槽开关时间校正*/ + sysPara->para.reclaimTankTime =( sysPara->status.currReclaimTankPos>120 )? sysPara->status.currReclaimTankPos/10-1:12; + m_SystemSetting->updateReclaimTime( sysPara->para.reclaimTankTime ); + + qDebug()<<"reclaimTankOpenDone currReclaimTankPos:"<status.currReclaimTankPos; + qDebug()<<"reclaimTankOpenDone curr_reclaimTankTime:"<status.curr_reclaimTankTime; + + LogInfo::setRunStatusText("reclaimTankOpenDone currReclaimTankPos:"+QString::number(sysPara->status.currReclaimTankPos)); + } + else if(sysPara->status.reclaimTankstatus == 0x11 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 + { + sysPara->devOp->controlReclaimTankOpen(false); //卡住,关闭 + m_MainWidget->stopFlashReclaimOpenBtn(); +// ui->tabMainWindow->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); + } + else if(sysPara->status.reclaimTankstatus == 1 || sysPara->status.reclaimTankstatus == 2)//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 + { + auto recliamTime = (sysPara->para.reclaimTankTime != 0 ? sysPara->para.reclaimTankTime : 15.0f) * 10.0f; + int rate = qBound(0, 100, int((sysPara->status.currReclaimTankPos / recliamTime) * 100)); + + // 不知道为什么会有rate为0,且 sysPara->status.reclaimTankstatus == 2 ,也就是 关的状态。 回收槽位置在0处,而状态却是 关 ,很奇怪 + if(sysPara->status.reclaimTankstatus != 2 && rate != 0) { + m_MainWidget->setReclaimStatus(sysPara->status.reclaimTankstatus == 1, rate); + } + + m_MainWidget->setReclaimOpenBtnStatus(sysPara->status.reclaimTankstatus == 2); + m_MainWidget->setReclaimCloseBtnStatus(sysPara->status.reclaimTankstatus == 1); + + sysPara->status.reclaimBlockedCnt = 0; + } + else if(sysPara->status.reclaimTankstatus == 6 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 + { + if(sysPara->devOp->isReclaimTankCloseEnable()) + sysPara->devOp->controlReclaimTankClose(false); //到头,关闭 + m_MainWidget->setReclaimStatus(false, 0); + m_MainWidget->stopFlashReclaimOpenBtn(); + //sysPara->status.currReclaimTankPos = 0; //将回收槽的时间置为零 +// emit reclaimTankCloseDone(); + sysPara->status.lastRecycleWarn = 0; + sysPara->status.HVFaultCloseEn=0; + sysPara->status.reclainCloseAppending=false; + sysPara->status.canRunAirPushing = true; //下次开回收槽就执行排气程序 + } + else if(sysPara->status.reclaimTankstatus == 0x12 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 + { + sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭 + LogInfo::setRunStatusText(tr("回收槽卡住或者回收槽开关时间设置错误")); + m_MainWidget->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); + } + else if(sysPara->status.reclaimTankstatus == 4 ) + { + m_MainWidget->setReclaimOpenBtnStatus(true); + m_MainWidget->setReclaimCloseBtnStatus(true); + LogInfo::setRunStatusText("Reclaim tank hold on "+QString::number(sysPara->status.currReclaimTankPos)); + } +} + +void InkJetPrinter::viscosity_timerHandler() +{ + if(!firstTime) + qDebug()<<"错误!粘度计故障:检测不到上位灯"; + // LogInfo::setRunStatusText(tr("错误!粘度计故障:检测不到上位灯")); + viscosity_timer->stop(); + firstTime = 0; +} + +void InkJetPrinter::rebootApp() +{ + if(!sysPara->status.selfCheckDone) + sysPara->status.selfCheckDone = true; + + this->setDisabled(true); + + m_StackedWidget->setCurrentWidget(m_MainWidget); + + // emit setDisableAll(); + if(!TEST_MODE && sysPara->para.flagOfReclaimPumEnable){ + for(int i=15;i>11;i--) + { + if(i == 15){ + sysPara->status.isPumpValveControledByHand = true; //停止自动 + sysPara->devOp->controlInkValve(true); + sysPara->devOp->controlInkValvePWM(true); + sysPara->devOp->controlReclaimPump(true,true); + sysPara->devOp->controlViscosityPump(true); + sysPara->devOp->controlCycleValve(true); + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + } + if(i == 12){ + sysPara->devOp->controlInkValve(false); + sysPara->devOp->controlInkValvePWM(false); + } + m_MainWidget->setRunStatus(tr("正在准备重启,请等待%1秒......").arg(i)); + MySleep(1000); + } + } + sysPara->devOp->controlReclaimTankOpen(true); + sysPara->status.isPumpValveControledByHand = true; //停止自动 + if(sysPara->para.gearPumpEnable ){ + if(!sysPara->para.flagOfReclaimPumEnable){ + sysPara->para.gearPumpValue = 360; + sysPara->devOp->WriteMoterPump(); + } + else{ + sysPara->devOp->controlReclaimPump(true,false); + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + } + } + else{ + sysPara->para.reclaimPumpPWMWidth = 95; + sysPara->devOp->controlReclaimPump(true,true); + } + + if(!sysPara->devOp->isViscosityPumpOpen()) + sysPara->devOp->controlViscosityPump(true); + sysPara->devOp->controlCycleValve(true); + sysPara->devOp->controlInkValve(false); //关供墨 + sysPara->devOp->controlInkValvePWM(false); //关供墨 + + if(!TEST_MODE){ + for(int i=11;i>7;i--) + { + if(i==9) + sysPara->devOp->controlReclaimTankOpen(false); + m_MainWidget->setRunStatus(tr("正在准备重启,请等待%1秒......").arg(i)); + MySleep(1000); + } + } + + if(!sysPara->status.lostCommuFlag){ + sysPara->para.calandar_and_dat.cnt1CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt(); + sysPara->para.calandar_and_dat.cnt2CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue,16).toInt(); + sysPara->para.Counter3.cnt3CurrValue = QString::number(sysPara->status.Status_Counter3.cnt3CurrValue,16).toInt(); + + m_MainWidget->updateTotalCnt(0); + sysPara->saveParaToFile(); // 关机前将相关配置保存 + } + sysPara->status.powerOffAppending = false; + if(!TEST_MODE){ + for(int i=7;i>0;i--) + { + if(i == 5) + sysPara->devOp->controlReclaimTankClose(true); + if(i == 4){ + sysPara->devOp->controlViscosityPump(false); + sysPara->devOp->controlCycleValve(false); + sysPara->devOp->controlReclaimPump(false,false); + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + } + m_MainWidget->setRunStatus(tr("正在准备重启,请等待%1秒......").arg(i)); + MySleep(1000); + } + } + + sysPara->saveParaToFile(); // 关机前将相关配置保存 + sysPara->saveRFIDPara(); + MySleep(200); + system("sync");//缓存同步 + QCoreApplication::quit(); +} + +void InkJetPrinter::handleInitedPID() +{ + PID_init(); +} + + +bool InkJetPrinter::loadLastWorkAndPreparePrint() +{ + // 打开最后一次作业文件 + qDebug() << sysPara->sysFile; + qDebug() << sysPara->para.lastOpenedFileName; + QString lastFilename = QString(sysPara->para.lastOpenedFileName); + + QFileInfo fileInfo(lastFilename); + if (!(fileInfo.exists() && fileInfo.isFile())) { + LogInfo::setRunStatusText(QString("Last work file not found: %1").arg(lastFilename)); + return false; + } + + return loadWorkFileAndPreparePrint(lastFilename); +} + +void InkJetPrinter::restartPrintWhenSwitchedWorkFile(bool isPrinting) +{ + if(!isPrinting) { + m_MainWidget->on_m_StartBtn_clicked(); + auto ret = disconnect(this, &InkJetPrinter::printStatusChanged, this, &InkJetPrinter::restartPrintWhenSwitchedWorkFile); + LogInfo::setRunStatusText(QString("Printing has restarted: %1").arg(ret)); + } +} + +bool InkJetPrinter::loadWorkFileAndPreparePrint(const QString &filename) +{ + auto u8Filename = filename.toUtf8(); + if(u8Filename.size() > int(ARRAY_SIZE(sysPara->para.lastOpenedFileName) - 1)) { + LogInfo::setRunStatusText(QString("File name is too long: %1").arg(filename)); + return false; + } + + PicScene* scene = new PicScene(); + PrintSettingModel model; + auto ret = PicSceneLoader::loadSceneFromFile(filename, scene, &model); + if(!ret) { + LogInfo::setRunStatusText(QString("Failed to load work file: %1").arg(filename)); + delete scene; + return false; + } + + bool rePrint = false; + if(sysPara->status.isPrinting && sysPara->status.selfCheckDone) { + // connect(this, &InkJetPrinter::printStatusChanged, + // this, &InkJetPrinter::restartPrintWhenSwitchedWorkFile, Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection)); + m_MainWidget->on_m_StopBtn_clicked(); + LogInfo::setRunStatusText("Pause printing first, then write to the new file"); + rePrint = true; + } + + PrintSettingModel::applyToSysPara(model, sysPara); + + // 应用完数据之后,将当前值编辑标志位清除,避免下次读取时为 true + model.cnt1Settings.editCurrValue = false; + model.cnt2Settings.editCurrValue = false; + PicSceneLoader::saveSceneToXmlFile(filename, scene, &model); + + ret = m_MainWidget->generatePrintContent(scene); + if(!ret) { + LogInfo::setRunStatusText(QString("Failed to generate print content from work file: %1").arg(filename)); + delete scene; + return false; + } + + LogInfo::setRunStatusText(QString("Work file loaded: %1").arg(filename)); + + ui.label_currWorkFile->setText(QFileInfo(filename).baseName()); + + strncpy(sysPara->para.lastOpenedFileName, u8Filename.constData(), sizeof(sysPara->para.lastOpenedFileName) - 1); + sysPara->para.lastOpenedFileName[sizeof(sysPara->para.lastOpenedFileName) - 1] = '\0'; + sysPara->saveParaToFile(); + + currWorkFile = filename; + + if(rePrint) { + m_MainWidget->on_m_StartBtn_clicked(); + } + + return true; +} + +static int highPressureCnt = 0; +static unsigned int logCnt = 0; + +void InkJetPrinter::checkPressureControl() +{ // 1s + unsigned int alarmPressure = 0; + if(sysPara->para.pressure <= 700) + alarmPressure = 800; + else + alarmPressure = 950; + + if(sysPara->status.PRESSURE > alarmPressure) + highPressureCnt++; + else + highPressureCnt = 0; + + if(highPressureCnt >= 4 && sysPara->status.PRESSURE > 1000){ + QString str = tr("压力过高,请检查管路是否堵塞,然后点击故障恢复按钮"); + showMessage(str); + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + sysPara->status.isPumpValveControledByHand = true; + sysPara->devOp->mainInkCtrl(); + sysPara->status.flagOfPressureFault = true; + } +} + +void InkJetPrinter::showMessage(QString str){ + if(logCnt++ % 30 == 0){ + LogInfo::setRunStatusText(str); + qDebug()<devOp->color_flag = 2; + m_MainWidget->setRunStatus(str); +} + +void InkJetPrinter::resetPressureCnt(){ + logCnt = 0; + highPressureCnt = 0; +} + +void InkJetPrinter::disableTabClick(){ + this->setDisabled(true); + // this->setCurrentIndex(0); +} + +void InkJetPrinter::setShowVserionInfo(QString str){ + // ui.label_version->setText(str); +} + +void InkJetPrinter::OnFinished(int event){ + //msgtest->setText(" ");msgtest->show(); + Q_UNUSED(event); + msgtest->hide(); + +} + + +#define INTERVAL_AFTER48H 5 + +void InkJetPrinter::warningHandler(int type){ + static bool flagOfWarning = true; + static bool flagOfmtWarning = true; + static int i = 1; + int elasped = curPowerOnDateTime.secsTo(QDateTime::currentDateTime());// 本次开机运行秒数 + if(elasped >= 60*60*i){ //开机后1小时提醒一次,测试时可以缩短 + // if (elasped > 10*i) {//test + i++; + flagOfmtWarning = true; + flagOfWarning = true; + LogInfo::setRunStatusText("Next Hour Warning"); + } + int inkTime = 0, solventTime = 0; + + /***********处理保养到期提示start******************/ + if(type == CARD_TYPE::MAINTENANCE){ + if(sysPara->RFIDPara.needMaintenance){//保养到期,喷码机禁用 + warningShow(CARD_TYPE::MAINTENANCE,timeoutDay); + } + //needMaintenanceRemind:保养到期提前一个月提示标志 + else if(sysPara->status.needMaintenanceRemind){ + if(flagOfmtWarning){ + warningShow(CARD_TYPE::MAINTENANCE,timeoutDay); + flagOfmtWarning = false; + } + } + return; + } + /***********处理保养到期提示end******************/ + + // 超过48小时后,不会执行这一段 + if(flagOfWarning){ + //48小时后禁用,小时=第一次提示时间到当前时间的间隔秒数/60/60 + flagOfWarning = false; + } +} + +// 1:Ink 2:Solvent 3:Maintenance +void InkJetPrinter::warningShow(int type,int num){ + QString str = ""; + if(type == CARD_TYPE::INK && sysPara->RFIDPara.needInkCard){ + if(num < 49) + str = tr("请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用!").arg(num); + else if(num == 49) + str = tr("墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作!"); + slt_showMsg(str); +// m_MainWidget->setRunStatus(str); + LogInfo::setRunStatusText(str); + qDebug()<RFIDPara.needSolventCard){ + if(num < 49) + str = tr("请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用!").arg(num); + else if(num == 49) + str = tr("溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作!"); + slt_showMsg(str); +// m_MainWidget->setRunStatus(str); + LogInfo::setRunStatusText(str); + qDebug()<= 0) + str = tr("保养期还有%1天到期,请及时保养,否则喷码机容易损坏").arg(num); + else + str = tr("保养期已超过%1天,请进行保养以恢复喷码机的正常使用").arg(num*(-1)); + slt_showMsg(str); + LogInfo::setRunStatusText(str); + qDebug()<setText(("E: (New file)")); + m_StackedWidget->setCurrentWidget(m_TestPrintWidget); + m_TestPrintWidget->on_newfileButton_pressed(); +} + +int InkJetPrinter::updateWarningTime(int type){ + QFile file; + if(type == 1) + file.setFileName("/home/plg/inkRFIDTime.txt"); + else if(type == 2) + file.setFileName("/home/plg/solventRFIDTime.txt"); + else + return -1; + + if(!file.exists()){ + LogInfo::setRunStatusText(tr("刷卡倒计时起始时间文件不存在")); + return -1; + } + + QDateTime curDateTime = QDateTime::currentDateTime(); + int dateTimeDiff = -1; + if (type == 1) { + if (inkWarnTime == QDateTime()) { + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + // 读取文件内容 + QTextStream in(&file); + QString starTime = in.readAll(); // 第一次提示的时间 + starTime = starTime.trimmed(); + // 关闭文件 + file.close(); + inkWarnTime = QDateTime::fromString(starTime,"yyyy-MM-dd HH::mm::ss"); + qDebug() << inkWarnTime; + } else { + qDebug() << "Failed to open file for reading:"; + LogInfo::setRunStatusText("Failed to open file for reading"); + return -1; + } + } + dateTimeDiff = inkWarnTime.secsTo(curDateTime); + + } else if (type == 2) { + if (solventWarnTime == QDateTime()) { + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + // 读取文件内容 + QTextStream in(&file); + QString starTime = in.readAll(); // 第一次提示的时间 + starTime = starTime.trimmed(); + // 关闭文件 + file.close(); + solventWarnTime = QDateTime::fromString(starTime,"yyyy-MM-dd HH::mm::ss"); + } else { + qDebug() << "Failed to open file for reading:"; + LogInfo::setRunStatusText("Failed to open file for reading"); + return -1; + } + } + dateTimeDiff = solventWarnTime.secsTo(curDateTime); + } + return dateTimeDiff; +} + +bool InkJetPrinter::cardTouchConfirm(QString msgTxt, QString variableMsgTxt) +{ + QMessageBox box(QMessageBox::Warning, tr("警告"), + msgTxt, QMessageBox::Ok | QMessageBox::Cancel, + this); + + int rfidCountDown = sysPara->para.rfidCountDown; + QTimer msgTimer; + QString boxTxt = variableMsgTxt; + connect(&msgTimer, &QTimer::timeout, [this, &box, &rfidCountDown, boxTxt]() { + box.setText(boxTxt.arg(rfidCountDown)); + box.update(); + rfidCountDown--; + if(rfidCountDown == 0) { + box.accept(); + } + }); + + if(sysPara->para.rfidCountDown > 0) { + box.setText(boxTxt.arg(sysPara->para.rfidCountDown)); + msgTimer.start(1000); + } + + box.exec(); + + return box.result() == QMessageBox::Ok || box.result() == QMessageBox::Accepted; +} + +void InkJetPrinter::initRunTimeCtrl() +{ + if (ctrl_runTime == nullptr) { + ctrl_runTime = RunTimeCtrl::instance(); +#ifdef __RFID_CARD + connect(ctrl_runTime, &RunTimeCtrl::sig_updateTimeoutDay, this, [=](int days) { + // timeoutDay:仅适用于原来月份的处理 + this->timeoutDay = days; + if(timeoutDay <= 30) + sysPara->status.needMaintenanceRemind = true; + }); + connect(ctrl_runTime, &RunTimeCtrl::sig_saveRunTime, this, [=]() { + // 运行时间处理 + sysPara->RFIDPara.runtimeMs = ctrl_runTime->totalRuntimeMs(); + sysPara->saveRFIDPara(); + }); + + // 弹窗提示 + connect(ctrl_runTime, &RunTimeCtrl::sig_alertTimeout, + this, &InkJetPrinter::slt_warningMaintenance); + + curPowerOnDateTime = QDateTime::currentDateTime(); + if (sysPara) + ctrl_runTime->loadConfig(&sysPara->RFIDPara); + ctrl_runTime->start(); +#endif + + } +} + +#ifdef __RFID_CARD +void InkJetPrinter::initRFIDManager() +{ + if (manager_rfid == nullptr) { + manager_rfid = RFIDManager::instance(); + } + + connect(manager_rfid, &RFIDManager::sig_showMsg, + this, &InkJetPrinter::slt_showMsg); + connect(manager_rfid,SIGNAL(sig_maintenanceShow()), + m_MainInstruction,SLOT(maintenanceDialogShow())); + + auto checkReclaimOpenBtn = [this]() { + // if(sysPara->status.selfCheckDone && (sysPara->status.reclaimTankstatus == 2 || sysPara->status.reclaimTankstatus == 6)) { + // m_MainWidget->setReclaimOpenBtnStatus(true); + // } + }; + + connect(manager_rfid, &RFIDManager::sig_inkCardProgressFinished, this, [this](){ + sysPara->RFIDPara.needInkCard = false; + sysPara->saveRFIDPara(); + + if(!sysPara->RFIDPara.addedInk) { + slt_showMsg(tr("刷墨水卡成功, 请及时将该墨水卡对应的墨水添加到机器中")); + } + else { + slt_showMsg(tr("刷墨水卡成功!")); + } + }); + + connect(manager_rfid, &RFIDManager::sig_solventProgressFinished, this, [this](){ + sysPara->RFIDPara.needSolventCard = false; + sysPara->saveRFIDPara(); + + if(!sysPara->RFIDPara.addedSolvent) { + slt_showMsg(tr("刷溶剂卡成功, 请及时将该溶剂卡对应的溶剂添加到机器中")); + } + else { + slt_showMsg(tr("刷溶剂卡成功!")); + } + }); +} + + +#define MAX_WARNING_TIME_HOUR 48 +#define WARNING_INTERVAL_SEC 3600 + +#ifdef BNS_DEBUG + +#undef MAX_WARNING_TIME_HOUR +#undef WARNING_INTERVAL_SEC + +#define MAX_WARNING_TIME_HOUR 10 +#define WARNING_INTERVAL_SEC 20 + +#endif + +void InkJetPrinter::resetRFIDStatus() +{ + if(!sysPara) + return; + + // 停止刷卡请求 + if(manager_rfid) { + manager_rfid->requireInkCard(false); + manager_rfid->requireSolventCard(false); + } + + sysPara->RFIDPara.needInkCard = false; + sysPara->RFIDPara.needSolventCard = false; + + sysPara->RFIDPara.inkCardTimeOut = false; + sysPara->RFIDPara.solventCardTimeOut = false; + + sysPara->saveRFIDPara(); + sysPara->saveParaToFile(); + + LogInfo::setRunStatusText("RFID/ink/solvent flows terminated by resetRFIDStatus"); + QMessageBox::information(this, "", "RFID progress has been cleaned.", QMessageBox::Ok); +} + +/** + * @brief 处理墨水警告 + * 如果发生墨水警告,则进入 加墨水&刷卡 流程。 + * 该流程要求 用户加入墨水并且刷了对应的墨水卡 才退出流程。 + * 如果流程没有完成,则每隔一个小时提示一次,如果超过48小时,则sysPara->RFIDPara.inkCardTimeOut = true,禁用喷码机 + * 该流程不受关机影响 + * + * 该函数 使用定时器 1s 调用一次 + * + */ +void InkJetPrinter::handleWarnInk() +{ + if(!sysPara || !manager_rfid) + return; + + // 墨水盒警告抖动处理 + if(sysPara->status.statWarn & WARN_STATUS_INK_WARN) { + sysPara->status.inkWarningCnt = qMax(0, sysPara->status.inkWarningCnt); + sysPara->status.inkWarningCnt++; // 累计警报10次就提示 + } + else { + sysPara->status.inkWarningCnt = qMin(0, sysPara->status.inkWarningCnt); + --sysPara->status.inkWarningCnt; + } + + // 墨水被加入后处理 + if(sysPara->status.inkWarningCnt <= -5 && sysPara->RFIDPara.inInkAndRFIDProgress) { + if(!sysPara->RFIDPara.addedInk) { + sysPara->RFIDPara.addedInk = true; + sysPara->saveRFIDPara(); + + if(sysPara->RFIDPara.needInkCard) { + slt_showMsg(tr("请及时使用墨水盒附带的IC卡激活墨水盒")); + } + } + } + + // 墨水盒空,进入 刷卡&加墨水 流程 + if(sysPara->status.inkWarningCnt >= DETECT_WARNING_TIME && sysPara->RFIDPara.inInkAndRFIDProgress == 0) { + + sysPara->RFIDPara.addedInk = false; + sysPara->RFIDPara.needInkCard = true; + sysPara->status.showInkWarningNumber = 0; + sysPara->RFIDPara.inInkAndRFIDProgress = 1; + + QString strCurDateTime = QDateTime::currentDateTime().toString("yyMMddhhmmss"); + LogInfo::setRunStatusText("Ink warning."); + qDebug()<<"墨水液位报警"; + + sysPara->para.inkWarnDate = strCurDateTime.mid(0,6).toInt(); + sysPara->para.inkWarnTime = strCurDateTime.mid(6,6).toInt(); + + slt_showMsg(tr("请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR)); + + sysPara->saveParaToFile(); + sysPara->saveRFIDPara(); + } + + // 放在这里是为了防止在 刷卡&加墨水 流程中,用户没有刷卡就关机了。关机后再开机,仍然需要 刷卡&加墨水 才能继续使用喷码机。 + if(sysPara->RFIDPara.needInkCard) + manager_rfid->requireInkCard(); + + + // 计算刷卡时间间隔 + + QDateTime inkWarnDateTime = QDateTime::fromString(QString("20%1%2"). + arg(sysPara->para.inkWarnDate, 6, 10, QChar('0')). + arg(sysPara->para.inkWarnTime, 6, 10, QChar('0')), "yyyyMMddhhmmss"); + + if (!inkWarnDateTime.isValid()) { + // 数据异常时,重置为当前时间并持久化 + QDateTime now = QDateTime::currentDateTime(); + QString s = now.toString("yyMMddhhmmss"); + sysPara->para.inkWarnDate = s.mid(0,6).toInt(); + sysPara->para.inkWarnTime = s.mid(6,6).toInt(); + sysPara->saveParaToFile(); + inkWarnDateTime = now; + } + + // 墨水卡未刷,或者没有加墨水,每隔一个小时提示一次。 + if((!sysPara->RFIDPara.addedInk || sysPara->RFIDPara.needInkCard) && sysPara->RFIDPara.inInkAndRFIDProgress != 0) { + + auto differHours = inkWarnDateTime.secsTo(QDateTime::currentDateTime()) / WARNING_INTERVAL_SEC; + + // 如果differHours小于sysPara->status.showInkWarningNumber,说明系统时间被往前修改过。此时调整开始时间,直接进入超时状态。 + // 我们让用户承担这个风险,直接进入超时状态,用户需要刷卡才能继续使用喷码机。 + if(differHours < sysPara->status.showInkWarningNumber) { + auto now = QDateTime::currentDateTime(); + auto newWarnDateTime = now.addSecs(-(MAX_WARNING_TIME_HOUR + 1) * 3600); // 直接进入超时状态,设置为当前时间的前49小时 + auto str = newWarnDateTime.toString("yyMMddhhmmss"); + sysPara->para.inkWarnDate = str.mid(0,6).toInt(); + sysPara->para.inkWarnTime = str.mid(6,6).toInt(); + + LogInfo::setRunStatusText("Detected system time rollback; forcing ink warn timeout."); + differHours = newWarnDateTime.secsTo(now) / WARNING_INTERVAL_SEC; + sysPara->status.showInkWarningNumber = differHours - 1; + sysPara->saveParaToFile(); + sysPara->saveRFIDPara(); + } + + // if(differHours >= sysPara->status.showInkWarningNumber) { + if(differHours > sysPara->status.showInkWarningNumber) { + + // 理论上differHours只会比 sysPara->status.showInkWarningNumber 大 1, 如果大于1,说明系统时间被被往后修改过或者关过机。 + + if(differHours > MAX_WARNING_TIME_HOUR) + slt_showMsg(tr("墨水液位报警超过%1小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作!").arg(MAX_WARNING_TIME_HOUR)); + else + slt_showMsg(tr("请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR - differHours)); + + sysPara->status.showInkWarningNumber = differHours; + sysPara->saveRFIDPara(); + } + + // 进入超时状态,禁用喷码机 + if(differHours > MAX_WARNING_TIME_HOUR) { + sysPara->RFIDPara.inkCardTimeOut = true; + sysPara->saveRFIDPara(); + } + } + + // 如果用户已经刷了墨水卡,并且加了墨水,则清除 刷卡&加墨水 流程 + if(sysPara->RFIDPara.addedInk && !sysPara->RFIDPara.needInkCard && sysPara->RFIDPara.inInkAndRFIDProgress != 0) { + sysPara->status.showInkWarningNumber = 0; + sysPara->RFIDPara.inkCardTimeOut = false; + sysPara->RFIDPara.inInkAndRFIDProgress = 0; + sysPara->saveRFIDPara(); + manager_rfid->requireInkCard(false); + + LogInfo::setRunStatusText("Ink card has been added, and the ink card requirement has been cleared."); + + if(sysPara->status.selfCheckDone && (sysPara->status.reclaimTankstatus == 2 || sysPara->status.reclaimTankstatus == 6)) { + m_MainWidget->setReclaimOpenBtnStatus(true); + } + } +} + +void InkJetPrinter::handleWarnSolvent() +{ + if(!sysPara || !manager_rfid) + return; + + // 溶剂液位抖动处理 + if(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN) { + sysPara->status.solventWarningCnt = qMax(0, sysPara->status.solventWarningCnt); + sysPara->status.solventWarningCnt++; // 累计警报10次就提示 + } + else { + sysPara->status.solventWarningCnt = qMin(0, sysPara->status.solventWarningCnt); + --sysPara->status.solventWarningCnt; + } + + // 溶剂被加入后处理 + if(sysPara->status.solventWarningCnt <= -5 && sysPara->RFIDPara.inSolventAndRFIDProgress) { + if(!sysPara->RFIDPara.addedSolvent) { + sysPara->RFIDPara.addedSolvent = true; + sysPara->saveRFIDPara(); + + if(sysPara->RFIDPara.needSolventCard) { + slt_showMsg(tr("请及时使用溶剂盒附带的IC卡激活溶剂盒")); + } + } + } + + // 溶剂盒空,进入 刷卡&加溶剂 流程 + if(sysPara->status.solventWarningCnt >= DETECT_WARNING_TIME && sysPara->RFIDPara.inSolventAndRFIDProgress == 0) { + QDateTime curDateTime = QDateTime::currentDateTime(); + QString strCurDateTime = curDateTime.toString("yyMMddhhmmss"); + LogInfo::setRunStatusText("Solvent warning."); + qDebug()<<"溶剂液位报警"; + sysPara->para.solventWarnDate = strCurDateTime.mid(0,6).toInt(); + sysPara->para.solventWarnTime = strCurDateTime.mid(6,6).toInt(); + + sysPara->RFIDPara.addedSolvent = false; + sysPara->RFIDPara.needSolventCard = true; + sysPara->status.showSolventWarningNumber = 0; + + sysPara->RFIDPara.inSolventAndRFIDProgress = 1; + + slt_showMsg(tr("请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR)); + + sysPara->saveParaToFile(); + sysPara->saveRFIDPara(); + } + + // 放在这里是为了防止在 刷卡&加溶剂 流程中,用户没有刷卡就关机了。关机后再开机,仍然需要 刷卡&加溶剂 才能继续使用喷码机。 + if(sysPara->RFIDPara.needSolventCard) + manager_rfid->requireSolventCard(); + + // 计算刷卡时间间隔 + + QDateTime solventWarnDateTime = QDateTime::fromString(QString("20%1%2"). + arg(sysPara->para.solventWarnDate, 6, 10, QChar('0')). + arg(sysPara->para.solventWarnTime, 6, 10, QChar('0')), "yyyyMMddhhmmss"); + + if (!solventWarnDateTime.isValid()) { + // 数据异常时,重置为当前时间并持久化 + QDateTime now = QDateTime::currentDateTime(); + QString s = now.toString("yyMMddhhmmss"); + sysPara->para.solventWarnDate = s.mid(0,6).toInt(); + sysPara->para.solventWarnTime = s.mid(6,6).toInt(); + sysPara->saveParaToFile(); + solventWarnDateTime = now; + } + + // 溶剂卡未刷,或者没有加溶剂,每隔一个小时提示一次。 + if((!sysPara->RFIDPara.addedSolvent || sysPara->RFIDPara.needSolventCard) && sysPara->RFIDPara.inSolventAndRFIDProgress != 0) { + auto differHours = solventWarnDateTime.secsTo(QDateTime::currentDateTime()) / WARNING_INTERVAL_SEC; + + // 如果differHours小于sysPara->status.showSolventWarningNumber,说明系统时间被往前修改过。此时调整开始时间,直接进入超时状态。 + if(differHours < sysPara->status.showSolventWarningNumber) { + auto now = QDateTime::currentDateTime(); + auto newWarnDateTime = now.addSecs(-(MAX_WARNING_TIME_HOUR + 1) * 3600); // 直接进入超时状态,设置为当前时间的前49小时 + auto str = newWarnDateTime.toString("yyMMddhhmmss"); + sysPara->para.solventWarnDate = str.mid(0,6).toInt(); + sysPara->para.solventWarnTime = str.mid(6,6).toInt(); + + LogInfo::setRunStatusText("Detected system time rollback; forcing solvent warn timeout."); + differHours = newWarnDateTime.secsTo(now) / WARNING_INTERVAL_SEC; + sysPara->status.showSolventWarningNumber = differHours - 1; + sysPara->saveParaToFile(); + } + + if(differHours > sysPara->status.showSolventWarningNumber) { + if(differHours > MAX_WARNING_TIME_HOUR) + slt_showMsg(tr("溶剂液位报警超过%1小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作!").arg(MAX_WARNING_TIME_HOUR)); + else + slt_showMsg(tr("请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用!").arg(MAX_WARNING_TIME_HOUR - differHours)); + + sysPara->status.showSolventWarningNumber = differHours; + sysPara->saveRFIDPara(); + } + + // 进入超时状态,禁用喷码机 + if(differHours > MAX_WARNING_TIME_HOUR) { + sysPara->RFIDPara.solventCardTimeOut = true; + sysPara->saveRFIDPara(); + } + } + + // 如果用户已经刷了溶剂卡,并且加了溶剂,则清除 刷卡&加溶剂 流程 + if(sysPara->RFIDPara.addedSolvent && !sysPara->RFIDPara.needSolventCard && sysPara->RFIDPara.inSolventAndRFIDProgress != 0) { + sysPara->status.showSolventWarningNumber = 0; + sysPara->RFIDPara.inSolventAndRFIDProgress = 0; + sysPara->RFIDPara.solventCardTimeOut = false; + sysPara->saveRFIDPara(); + manager_rfid->requireSolventCard(false); + + LogInfo::setRunStatusText("Solvent card has been added, and the solvent card requirement has been cleared."); + + if(sysPara->status.selfCheckDone && (sysPara->status.reclaimTankstatus == 2 || sysPara->status.reclaimTankstatus == 6)) { + m_MainWidget->setReclaimOpenBtnStatus(true); + } + } +} +#endif + +void InkJetPrinter::slt_showMsg(QString msg) +{ + static QList msgPool; + + QMessageBox * msgBox = new QMessageBox(QMessageBox::NoIcon, tr("提示"), msg, QMessageBox::StandardButton::Ok); + msgPool.push_back(msgBox); + connect(msgBox, &QMessageBox::finished, [this, msgBox, &msgPool](){ + auto idx = msgPool.lastIndexOf(msgBox); + if(idx != -1) { + msgPool.removeAt(idx); + } + + msgBox->deleteLater(); + }); + + msgBox->show(); + + if(msgPool.size() > 3) { + msgPool.takeFirst()->deleteLater(); + } + + LogInfo::setRunStatusText(msg); +} + +void InkJetPrinter::onDlgFileOpen(const QString& filename) +{ + QFileInfo fileInfo(filename); + if(!fileInfo.exists() || !fileInfo.isFile()) { + LogInfo::setRunStatusText(tr("File not found: %1").arg(filename)); + return; + } + + loadWorkFileAndPreparePrint(filename); +} diff --git a/InkJetPrinter.h b/InkJetPrinter.h index 93725db..e44a1f6 100644 --- a/InkJetPrinter.h +++ b/InkJetPrinter.h @@ -1,275 +1,275 @@ -#pragma once - -#include -#include -#include -#include -// 包含UI自动生成的头文件(qmake编译时会自动生成) -#include "ui_InkJetPrinter.h" -#include "mainwidget.h" -#include "testprintwidget.h" -//#include "ercodesettings.h" -//#include "loadfilesetting.h" -//#include "MainInterfaceWidget.h" - -#include "MyInputMethod.h" -#include -#include -#include -#include -#include "fontsetwidget.h" -#include "Printsetting.h" -#include "MainInstruction.h" -#include "SystemManage.h" -#include "SystemSetting.h" -#include "SystemUpdate.h" -#include "OtherInfo.h" -#include "scene/ScheduleShiftsEditor.h" -#include "Serial/serial.h" -#include "LogInfo.h" -#include "DateVarSet.h" -#include "CounterVarSet.h" - -#include - -#include "QBarCode.h" -#include "dlgQrCode.h" - -#include "rfid/RFIDManager.h" -#include "runtimectrl.h" -#include "scene/PicSceneLoader.h" - -class DialogFileOperation; - -class InkJetPrinter : public QWidget -{ - Q_OBJECT - -public: - InkJetPrinter(QWidget* parent = nullptr); - ~InkJetPrinter(); - -private: - // UI对象(由.ui文件生成) - Ui::InkJetPrinter ui; - SysPara* sysPara = nullptr; - - QLabel* m_LabelTimer; // 保留原有变量,和ui中的控件关联 - QTimer* m_Timer; - QTimer* timer; - QTimer* viscosity_timer; -// QTimer* jd_timer; - - QStackedWidget* m_StackedWidget; // 关联ui中的m_StackedWidget - MainWidget* m_MainWidget; - TestPrintWidget* m_TestPrintWidget; - - QBarCode* m_BarCodeDlg __attribute__((deprecated("Use BarcodeEditor instead"))) = nullptr; - - dlgQrCode* m_QRCodeDlg __attribute__((deprecated("Use BarcodeEditor instead"))) = nullptr; - - SystemManage* m_SystemManage; - SystemUpdate* m_SystemUpdate; - SystemSetting* m_SystemSetting; - OtherInfo* m_OtherInfo; - - DialogFileOperation* m_dlgFileOperation = nullptr; - - FontSetWidget* m_FontSetWidget; - - PrintSetting* m_PrintSetting; - - bool m_isDefaultPrintSettingMode = false; - PrintSettingModel m_savedPrintSettingModel; - - MainInstruction* m_MainInstruction; - - LogInfo* m_LogInfo; - LogInfoCtrl* ctrl_loginfo = nullptr; - - ScheduleShiftsEditor* m_scheduleShiftsEditor = nullptr; - - DateVarSet* m_DateVarSet; - - CounterVarSet* m_CounterVarSet; - - QTextEdit *m_textEdit; - - QTextCursor cursor; - - Serial *serialFPGA; - Serial *serialSTM32; - QThread* m_serialThreadFPGA; - QThread* m_serialThreadSTM32; - bool flagOfSerialThreadStratEn; - -private: - bool pushButtonStartFlag; - void init(); - void initSerialPorts(); - void autoControlValvePump(); - - void autoControlCycleValve(); - - void pressureAdj(); - void autoControlHeater(); - void cycleValveRunForSelfCheck(); - void detectAndcontrolReclaimTank(); - - /** - * @brief 加载最后一次作业文件并准备打印 - * 包括:加载打印内容,打印设置 - * @return 加载是否成功 - * - */ - bool loadLastWorkAndPreparePrint(); - - /** - * @brief 加载指定作业文件并准备打印 - * - * @param filename 作业文件的路径 - * @return 加载是否成功 - */ - bool loadWorkFileAndPreparePrint(const QString& filename); - - QString currWorkFile; - - void checkPressureControl(); - void showMessage(QString); - - void enterDefaultPrintSettingMode(); - void exitDefaultPrintSettingMode(); - - bool cardTouchConfirm(QString msgTxt, QString variableMsgTxt); - - QMessageBox *msgtest; - // 本次开机时间 - QDateTime curPowerOnDateTime; - int timeoutDay; - - RunTimeCtrl* ctrl_runTime = nullptr; - void initRunTimeCtrl(); - -#ifdef __RFID_CARD - RFIDManager* manager_rfid = nullptr; - void initRFIDManager(); - void handleWarnInk(); - void handleWarnSolvent(); - QDateTime inkWarnTime = QDateTime(); - QDateTime solventWarnTime = QDateTime(); -#endif -private slots: - - void resetRFIDStatus(); - - void onDlgFileOpen(const QString& filename); - - void restartPrintWhenSwitchedWorkFile(bool isPrinting); - - void slt_showMsg(QString msg); - void timerHandler(); - void getMainWidgetButtonClickedSlot(int index); - void getTestPrintWidgetButtonClickedSlot(int index); - void openDatetimeEditor(DateItemModel dateModel, TextItemModel textItemModel); - // 更新打印内容 - void slt_updatePrintContent(const QString& filename); -// void getErCodeSettingsWidgetButtonClickedSlot(int index); -// void getMainInterfaceWidgetButtonClickedSlot(int index); - void viscosity_timerHandler(); - - void rebootApp(); - - void getFontSetWidgetButtonClickedSlot(int index); - void getPrintSettingButtonClickedSlot(int index); - void getMainInstructWidgetButtonClickedSlot(int index); - void getSystemManageWidgetButtonClickSlot(int index); - void getSystemUpdateWidgetButtonClickSlot(int index); - void getSystemSettingWidgetButtonClickSlot(int index); - void getOtherInfoWidgetButtonClickSlot(int index); - void getLogInfoWidgetButtonClickSlot(int index); - void getDateSetWidgetButtonClickSlot(int index); - void getCounterVarSetWidgetButtonClickSlot(int index); - void slt_counterVarUpdate(); - - void showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel); - - void onScheduleShiftsEditDone(); - - //Serial - void saveFPGAVersionNum(unsigned int); - void saveFPGAStatus(unsigned char *data); - void saveFPGAPhaseDetectHighTm(unsigned char *data); - void saveFPGACalandarAndDat(unsigned char *data); - void saveFPGACnt3CurrValue(unsigned char *data); - void saveFPGAXXXDay(unsigned char *data); - void stopSendFPGAData(bool); - void closeSerialFPGA(); - - void closeSerialSTM32(); - void stopSendSTM32Data(bool); - void saveSTM32Status(unsigned char *data); - void saveGearPumpVal(unsigned char *data); - void savePulseCntVal(unsigned char *data); - void saveSTM32Version(unsigned char *data); - void saveSTM32Time(unsigned char *data); - void closedSerial(); - void showFPGAqueuesize(int size); - void showSTM32queuesize(int size); - void showqueueFPGAsize(int size); - void restartSerialPort(); - - void disableTabClick(); - - void setShowVserionInfo(QString); - - void OnFinished(int event); - - void slt_editCounter(CounterViewModel vm); - - // 保养警告 - void slt_warningMaintenance(); - - void checkStatusAndStartGearPump(); -signals: - void maintenanceShow(); - - void printStatusChanged(bool isPrinting); - - void pipingStatusChanged(); - -protected: - void showEvent(QShowEvent* e) override; - -public slots: - void close_jd_timer(); - void enableInkJetTabClick(bool flag); - - void handleInitedPID(); - void resetPressureCnt(); - // 从文件获取墨水和溶剂各自第一次警告的时间 - int updateWarningTime(int); - void warningHandler(int); - void warningShow(int,int); - - void createNewJobFile(); - -public: - bool eventFilter(QObject *watched, QEvent *event); - -private: - // 压力调节算法状态变量 - bool m_rampDone = false; // pressureAdj 软启动完成标志 - int m_adjSkip = 0; // pressureAdj 节拍计数(软启动/超时复用) - int m_lastPressure = 0; // pressureAdj 上次采样压力(稳定检测用) - int m_stableCount = 0; // pressureAdj 压力连续稳定计数 - int m_pressureBuf[10] = {}; // pressureAdj 压力滑动平均缓冲(10点=1s) - int m_bufIdx = 0; // pressureAdj 滑动平均写入索引 - bool m_lastByHand = false; // 上一帧手动控制标志(边沿检测用) - bool m_lastReclaimMode = false; // 上一帧回收泵模式(边沿检测用) - - // 去抖(管路/墨水警告清除)——使用 QElapsedTimer 实现连续 2s 无警告判断 - QElapsedTimer m_pipingClearSince; - - bool gearPumpRunFlag = false; - bool gearPumpStartFlag = false; -}; +#pragma once + +#include +#include +#include +#include +// 包含UI自动生成的头文件(qmake编译时会自动生成) +#include "ui_InkJetPrinter.h" +#include "mainwidget.h" +#include "testprintwidget.h" +//#include "ercodesettings.h" +//#include "loadfilesetting.h" +//#include "MainInterfaceWidget.h" + +#include "MyInputMethod.h" +#include +#include +#include +#include +#include "fontsetwidget.h" +#include "Printsetting.h" +#include "MainInstruction.h" +#include "SystemManage.h" +#include "SystemSetting.h" +#include "SystemUpdate.h" +#include "OtherInfo.h" +#include "scene/ScheduleShiftsEditor.h" +#include "Serial/serial.h" +#include "LogInfo.h" +#include "DateVarSet.h" +#include "CounterVarSet.h" + +#include + +#include "QBarCode.h" +#include "dlgQrCode.h" + +#include "rfid/RFIDManager.h" +#include "runtimectrl.h" +#include "scene/PicSceneLoader.h" + +class DialogFileOperation; + +class InkJetPrinter : public QWidget +{ + Q_OBJECT + +public: + InkJetPrinter(QWidget* parent = nullptr); + ~InkJetPrinter(); + +private: + // UI对象(由.ui文件生成) + Ui::InkJetPrinter ui; + SysPara* sysPara = nullptr; + + QLabel* m_LabelTimer; // 保留原有变量,和ui中的控件关联 + QTimer* m_Timer; + QTimer* timer; + QTimer* viscosity_timer; +// QTimer* jd_timer; + + QStackedWidget* m_StackedWidget; // 关联ui中的m_StackedWidget + MainWidget* m_MainWidget; + TestPrintWidget* m_TestPrintWidget; + + QBarCode* m_BarCodeDlg __attribute__((deprecated("Use BarcodeEditor instead"))) = nullptr; + + dlgQrCode* m_QRCodeDlg __attribute__((deprecated("Use BarcodeEditor instead"))) = nullptr; + + SystemManage* m_SystemManage; + SystemUpdate* m_SystemUpdate; + SystemSetting* m_SystemSetting; + OtherInfo* m_OtherInfo; + + DialogFileOperation* m_dlgFileOperation = nullptr; + + FontSetWidget* m_FontSetWidget; + + PrintSetting* m_PrintSetting; + + bool m_isDefaultPrintSettingMode = false; + PrintSettingModel m_savedPrintSettingModel; + + MainInstruction* m_MainInstruction; + + LogInfo* m_LogInfo; + LogInfoCtrl* ctrl_loginfo = nullptr; + + ScheduleShiftsEditor* m_scheduleShiftsEditor = nullptr; + + DateVarSet* m_DateVarSet; + + CounterVarSet* m_CounterVarSet; + + QTextEdit *m_textEdit; + + QTextCursor cursor; + + Serial *serialFPGA; + Serial *serialSTM32; + QThread* m_serialThreadFPGA; + QThread* m_serialThreadSTM32; + bool flagOfSerialThreadStratEn; + +private: + bool pushButtonStartFlag; + void init(); + void initSerialPorts(); + void autoControlValvePump(); + + void autoControlCycleValve(); + + void pressureAdj(); + void autoControlHeater(); + void cycleValveRunForSelfCheck(); + void detectAndcontrolReclaimTank(); + + /** + * @brief 加载最后一次作业文件并准备打印 + * 包括:加载打印内容,打印设置 + * @return 加载是否成功 + * + */ + bool loadLastWorkAndPreparePrint(); + + /** + * @brief 加载指定作业文件并准备打印 + * + * @param filename 作业文件的路径 + * @return 加载是否成功 + */ + bool loadWorkFileAndPreparePrint(const QString& filename); + + QString currWorkFile; + + void checkPressureControl(); + void showMessage(QString); + + void enterDefaultPrintSettingMode(); + void exitDefaultPrintSettingMode(); + + bool cardTouchConfirm(QString msgTxt, QString variableMsgTxt); + + QMessageBox *msgtest; + // 本次开机时间 + QDateTime curPowerOnDateTime; + int timeoutDay; + + RunTimeCtrl* ctrl_runTime = nullptr; + void initRunTimeCtrl(); + +#ifdef __RFID_CARD + RFIDManager* manager_rfid = nullptr; + void initRFIDManager(); + void handleWarnInk(); + void handleWarnSolvent(); + QDateTime inkWarnTime = QDateTime(); + QDateTime solventWarnTime = QDateTime(); +#endif +private slots: + + void resetRFIDStatus(); + + void onDlgFileOpen(const QString& filename); + + void restartPrintWhenSwitchedWorkFile(bool isPrinting); + + void slt_showMsg(QString msg); + void timerHandler(); + void getMainWidgetButtonClickedSlot(int index); + void getTestPrintWidgetButtonClickedSlot(int index); + void openDatetimeEditor(DateItemModel dateModel, TextItemModel textItemModel); + // 更新打印内容 + void slt_updatePrintContent(const QString& filename); +// void getErCodeSettingsWidgetButtonClickedSlot(int index); +// void getMainInterfaceWidgetButtonClickedSlot(int index); + void viscosity_timerHandler(); + + void rebootApp(); + + void getFontSetWidgetButtonClickedSlot(int index); + void getPrintSettingButtonClickedSlot(int index); + void getMainInstructWidgetButtonClickedSlot(int index); + void getSystemManageWidgetButtonClickSlot(int index); + void getSystemUpdateWidgetButtonClickSlot(int index); + void getSystemSettingWidgetButtonClickSlot(int index); + void getOtherInfoWidgetButtonClickSlot(int index); + void getLogInfoWidgetButtonClickSlot(int index); + void getDateSetWidgetButtonClickSlot(int index); + void getCounterVarSetWidgetButtonClickSlot(int index); + void slt_counterVarUpdate(); + + void showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel); + + void onScheduleShiftsEditDone(); + + //Serial + void saveFPGAVersionNum(unsigned int); + void saveFPGAStatus(unsigned char *data); + void saveFPGAPhaseDetectHighTm(unsigned char *data); + void saveFPGACalandarAndDat(unsigned char *data); + void saveFPGACnt3CurrValue(unsigned char *data); + void saveFPGAXXXDay(unsigned char *data); + void stopSendFPGAData(bool); + void closeSerialFPGA(); + + void closeSerialSTM32(); + void stopSendSTM32Data(bool); + void saveSTM32Status(unsigned char *data); + void saveGearPumpVal(unsigned char *data); + void savePulseCntVal(unsigned char *data); + void saveSTM32Version(unsigned char *data); + void saveSTM32Time(unsigned char *data); + void closedSerial(); + void showFPGAqueuesize(int size); + void showSTM32queuesize(int size); + void showqueueFPGAsize(int size); + void restartSerialPort(); + + void disableTabClick(); + + void setShowVserionInfo(QString); + + void OnFinished(int event); + + void slt_editCounter(CounterViewModel vm); + + // 保养警告 + void slt_warningMaintenance(); + + void checkStatusAndStartGearPump(); +signals: + void maintenanceShow(); + + void printStatusChanged(bool isPrinting); + + void pipingStatusChanged(); + +protected: + void showEvent(QShowEvent* e) override; + +public slots: + void close_jd_timer(); + void enableInkJetTabClick(bool flag); + + void handleInitedPID(); + void resetPressureCnt(); + // 从文件获取墨水和溶剂各自第一次警告的时间 + int updateWarningTime(int); + void warningHandler(int); + void warningShow(int,int); + + void createNewJobFile(); + +public: + bool eventFilter(QObject *watched, QEvent *event); + +private: + // 压力调节算法状态变量 + bool m_rampDone = false; // pressureAdj 软启动完成标志 + int m_adjSkip = 0; // pressureAdj 节拍计数(软启动/超时复用) + int m_lastPressure = 0; // pressureAdj 上次采样压力(稳定检测用) + int m_stableCount = 0; // pressureAdj 压力连续稳定计数 + int m_pressureBuf[10] = {}; // pressureAdj 压力滑动平均缓冲(10点=1s) + int m_bufIdx = 0; // pressureAdj 滑动平均写入索引 + bool m_lastByHand = false; // 上一帧手动控制标志(边沿检测用) + bool m_lastReclaimMode = false; // 上一帧回收泵模式(边沿检测用) + + // 去抖(管路/墨水警告清除)——使用 QElapsedTimer 实现连续 2s 无警告判断 + QElapsedTimer m_pipingClearSince; + + bool gearPumpRunFlag = false; + bool gearPumpStartFlag = false; +}; diff --git a/Log/dualfilelogger.cpp b/Log/dualfilelogger.cpp index 7dc9c58..c03364d 100644 --- a/Log/dualfilelogger.cpp +++ b/Log/dualfilelogger.cpp @@ -1,21 +1,21 @@ - -#include "dualfilelogger.h" - -DualFileLogger::DualFileLogger(QSettings *firstSettings, QSettings* secondSettings, const int refreshInterval, QObject* parent) - :Logger(parent) -{ - firstLogger=new FileLogger(firstSettings, refreshInterval, this); - secondLogger=new FileLogger(secondSettings, refreshInterval, this); -} - -void DualFileLogger::log(const QtMsgType type, const QString& message, const QString &file, const QString &function, const int line) -{ - firstLogger->log(type,message,file,function,line); - secondLogger->log(type,message,file,function,line); -} - -void DualFileLogger::clear(const bool buffer, const bool variables) -{ - firstLogger->clear(buffer,variables); - secondLogger->clear(buffer,variables); -} + +#include "dualfilelogger.h" + +DualFileLogger::DualFileLogger(QSettings *firstSettings, QSettings* secondSettings, const int refreshInterval, QObject* parent) + :Logger(parent) +{ + firstLogger=new FileLogger(firstSettings, refreshInterval, this); + secondLogger=new FileLogger(secondSettings, refreshInterval, this); +} + +void DualFileLogger::log(const QtMsgType type, const QString& message, const QString &file, const QString &function, const int line) +{ + firstLogger->log(type,message,file,function,line); + secondLogger->log(type,message,file,function,line); +} + +void DualFileLogger::clear(const bool buffer, const bool variables) +{ + firstLogger->clear(buffer,variables); + secondLogger->clear(buffer,variables); +} diff --git a/Log/dualfilelogger.h b/Log/dualfilelogger.h index c8db707..e1de33e 100644 --- a/Log/dualfilelogger.h +++ b/Log/dualfilelogger.h @@ -1,35 +1,35 @@ - -#ifndef DUALFILELOGGER_H -#define DUALFILELOGGER_H - -#include -#include -#include -#include "logglobal.h" -#include "logger.h" -#include "filelogger.h" - -class DECLSPEC DualFileLogger : public Logger { - Q_OBJECT - Q_DISABLE_COPY(DualFileLogger) -public: - - - DualFileLogger(QSettings* firstSettings, QSettings* secondSettings, - const int refreshInterval=10000, QObject *parent = nullptr); - - - virtual void log(const QtMsgType type, const QString& message, const QString &file="", - const QString &function="", const int line=0); - - virtual void clear(const bool buffer=true, const bool variables=true); - -private: - - FileLogger* firstLogger; - - FileLogger* secondLogger; - -}; - -#endif // DUALFILELOGGER_H + +#ifndef DUALFILELOGGER_H +#define DUALFILELOGGER_H + +#include +#include +#include +#include "logglobal.h" +#include "logger.h" +#include "filelogger.h" + +class DECLSPEC DualFileLogger : public Logger { + Q_OBJECT + Q_DISABLE_COPY(DualFileLogger) +public: + + + DualFileLogger(QSettings* firstSettings, QSettings* secondSettings, + const int refreshInterval=10000, QObject *parent = nullptr); + + + virtual void log(const QtMsgType type, const QString& message, const QString &file="", + const QString &function="", const int line=0); + + virtual void clear(const bool buffer=true, const bool variables=true); + +private: + + FileLogger* firstLogger; + + FileLogger* secondLogger; + +}; + +#endif // DUALFILELOGGER_H diff --git a/Log/filelogger.cpp b/Log/filelogger.cpp index d15bada..e0475f9 100644 --- a/Log/filelogger.cpp +++ b/Log/filelogger.cpp @@ -1,273 +1,273 @@ - -#include "filelogger.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "LogInfo.h" -#define LOG_FILE_PATH "/home/plg/loginfo/" - -void FileLogger::refreshSettings() -{ - mutex.lock(); - QString oldFileName=fileName; - - settings->sync(); - fileName = LOG_FILE_PATH; -// fileName=settings->value("fileName").toString(); -// LogInfo::setRunStatusText(tr("fileName: %1").arg(fileName)); - QDate today = QDate::currentDate(); - QString todayString=today.toString(Qt::ISODate); - // 计算前七天的日期 - //QDate oneWeekAgo = today.addDays(-7); - fileName+=today.toString(Qt::ISODate); - fileName+="/"; - fileName+="log.txt"; - static QString lastDay = ""; - if(lastDay!=todayString) - { - TimerDel->start(30000); - lastDay=todayString; - } - - -#ifdef Q_OS_WIN32 - if (QDir::isRelativePath(fileName) && settings->format()!=QSettings::NativeFormat) -#else - if (QDir::isRelativePath(fileName)) -#endif - { - QFileInfo configFile(settings->fileName()); - fileName=QFileInfo(configFile.absolutePath(),fileName).absoluteFilePath(); - } - maxSize=settings->value("maxSize",0).toLongLong(); - maxBackups=settings->value("maxBackups",0).toInt(); - msgFormat=settings->value("msgFormat","{timestamp} {type} {msg}").toString(); - timestampFormat=settings->value("timestampFormat","yyyy-MM-dd hh:mm:ss.zzz").toString(); - bufferSize=settings->value("bufferSize",0).toInt(); - - QByteArray minLevelStr = settings->value("minLevel","ALL").toByteArray(); - if (minLevelStr=="ALL" || minLevelStr=="DEBUG" || minLevelStr=="0") - { - minLevel=QtDebugMsg; - } - else if (minLevelStr=="WARNING" || minLevelStr=="WARN" || minLevelStr=="1") - { - minLevel=QtWarningMsg; - } - else if (minLevelStr=="ERROR" || minLevelStr=="CRITICAL" || minLevelStr=="2") - { - minLevel=QtCriticalMsg; - } - else if (minLevelStr=="FATAL" || minLevelStr=="3") - { - // minLevel=QtMsgType::QtFatalMsg; - minLevel=QtFatalMsg; - } -// else if (minLevelStr=="INFO" || minLevelStr=="4") -// { -// minLevel=QtMsgType::QtInfoMsg; -// } - - if (oldFileName!=fileName) - { - fprintf(stderr,"Logging to %s\n",qPrintable(fileName)); - close(); - open(); - } - mutex.unlock(); -} - - -FileLogger::FileLogger(QSettings *settings, const int refreshInterval, QObject* parent) - : Logger(parent) -{ - TimerDel = new QTimer(this); - connect(TimerDel,SIGNAL(timeout()),this,SLOT(timeOutToDelete())); - Q_ASSERT(settings!=nullptr); - Q_ASSERT(refreshInterval>=0); - this->settings=settings; - file=nullptr; - if (refreshInterval>0) - { - refreshTimer.start(refreshInterval,this); - } - flushTimer.start(1000,this); - refreshSettings(); -} - - -FileLogger::~FileLogger() -{ - close(); -} - - -void FileLogger::write(const LogMessage* logMessage) -{ - if (file) - { -// qDebug()<<"Critical message output test\n"; -// qCritical("This is a critical message of test\n"); - file->write(qPrintable(logMessage->toString(msgFormat,timestampFormat))); - - if (logMessage->getType()>=QtCriticalMsg) - { - file->flush(); - } - - if (file->error()) - { - qWarning("Cannot write to log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); - close(); - } - - } - - if (!file) - { - Logger::write(logMessage); - } - -} - -void FileLogger::open() -{ - if (fileName.isEmpty()) - { - qWarning("Name of logFile is empty"); - } - else { - file=new QFile(fileName); - QFileInfo fileInfo(fileName); - // 检查文件路径是否有效 - if (!fileInfo.exists()) { - // 获取文件所在的目录路径 - QString dirPath = QFileInfo(fileName).absoluteDir().path(); - // 检查目录是否存在 - if (!QDir(dirPath).exists()) { - // 如果目录不存在,则创建目录 - QDir().mkpath(dirPath); - if (!QDir(dirPath).exists()) { - // 如果创建目录失败,显示错误消息 - qDebug("Cannot create directory for log file: %s", qPrintable(dirPath)); - delete file; - file = nullptr; - return; - } - } - } - if (!file->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) - { - qWarning("Cannot open log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); - file=nullptr; - } - } -} - - -void FileLogger::close() -{ - if (file) - { - file->close(); - delete file; - file=nullptr; - } -} - -void FileLogger::rotate() { - int count=0; - forever - { - QFile bakFile(QString("%1.%2").arg(fileName).arg(count+1)); - if (bakFile.exists()) - { - ++count; - } - else - { - break; - } - } - - while (maxBackups>0 && count>=maxBackups) - { - QFile::remove(QString("%1.%2").arg(fileName).arg(count)); - --count; - } - - for (int i=count; i>0; --i) { - QFile::rename(QString("%1.%2").arg(fileName).arg(i),QString("%1.%2").arg(fileName).arg(i+1)); - } - - QFile::rename(fileName,fileName+".1"); - -} - - -void FileLogger::timerEvent(QTimerEvent* event) -{ - if (!event) - { - return; - } - else if (event->timerId()==refreshTimer.timerId()) - { - refreshSettings(); - } - else if (event->timerId()==flushTimer.timerId() && file) - { - mutex.lock(); - - file->flush(); - - if (maxSize>0 && file->size()>=maxSize) - { - close(); - rotate(); - open(); - } - - mutex.unlock(); - } -} - -bool FileLogger::removeDirectory(const QString &directoryPath) { - // 检查目录是否存在 - QDir dir(directoryPath); - if (dir.exists()) { - system((char *)((QString("rm -r %1").arg(directoryPath)).toLatin1().data())); - return true; - } - return false; -} - -void FileLogger::timeOutToDelete(){ - QDate today = QDate::currentDate(); - for(int daysAgo=14;daysAgo>=7;--daysAgo){ - QString needToDelFoldPath=LOG_FILE_PATH; - QDate pastDate=today.addDays(-daysAgo); - needToDelFoldPath+=pastDate.toString(Qt::ISODate); - needToDelFoldPath+="/"; - if (QDir(needToDelFoldPath).exists()) { - bool result= removeDirectory(needToDelFoldPath); - if(result){ - qDebug()<<"The directory and all its contents have been removed"; - LogInfo::setRunStatusText(tr("The directory and all its contents have been removed")); - }else{ - qDebug() << "Failed to remove the directory"; - LogInfo::setRunStatusText(tr("Failed to remove the directory")); - } - } - } - TimerDel->stop(); -} + +#include "filelogger.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "LogInfo.h" +#define LOG_FILE_PATH "/home/plg/loginfo/" + +void FileLogger::refreshSettings() +{ + mutex.lock(); + QString oldFileName=fileName; + + settings->sync(); + fileName = LOG_FILE_PATH; +// fileName=settings->value("fileName").toString(); +// LogInfo::setRunStatusText(tr("fileName: %1").arg(fileName)); + QDate today = QDate::currentDate(); + QString todayString=today.toString(Qt::ISODate); + // 计算前七天的日期 + //QDate oneWeekAgo = today.addDays(-7); + fileName+=today.toString(Qt::ISODate); + fileName+="/"; + fileName+="log.txt"; + static QString lastDay = ""; + if(lastDay!=todayString) + { + TimerDel->start(30000); + lastDay=todayString; + } + + +#ifdef Q_OS_WIN32 + if (QDir::isRelativePath(fileName) && settings->format()!=QSettings::NativeFormat) +#else + if (QDir::isRelativePath(fileName)) +#endif + { + QFileInfo configFile(settings->fileName()); + fileName=QFileInfo(configFile.absolutePath(),fileName).absoluteFilePath(); + } + maxSize=settings->value("maxSize",0).toLongLong(); + maxBackups=settings->value("maxBackups",0).toInt(); + msgFormat=settings->value("msgFormat","{timestamp} {type} {msg}").toString(); + timestampFormat=settings->value("timestampFormat","yyyy-MM-dd hh:mm:ss.zzz").toString(); + bufferSize=settings->value("bufferSize",0).toInt(); + + QByteArray minLevelStr = settings->value("minLevel","ALL").toByteArray(); + if (minLevelStr=="ALL" || minLevelStr=="DEBUG" || minLevelStr=="0") + { + minLevel=QtDebugMsg; + } + else if (minLevelStr=="WARNING" || minLevelStr=="WARN" || minLevelStr=="1") + { + minLevel=QtWarningMsg; + } + else if (minLevelStr=="ERROR" || minLevelStr=="CRITICAL" || minLevelStr=="2") + { + minLevel=QtCriticalMsg; + } + else if (minLevelStr=="FATAL" || minLevelStr=="3") + { + // minLevel=QtMsgType::QtFatalMsg; + minLevel=QtFatalMsg; + } +// else if (minLevelStr=="INFO" || minLevelStr=="4") +// { +// minLevel=QtMsgType::QtInfoMsg; +// } + + if (oldFileName!=fileName) + { + fprintf(stderr,"Logging to %s\n",qPrintable(fileName)); + close(); + open(); + } + mutex.unlock(); +} + + +FileLogger::FileLogger(QSettings *settings, const int refreshInterval, QObject* parent) + : Logger(parent) +{ + TimerDel = new QTimer(this); + connect(TimerDel,SIGNAL(timeout()),this,SLOT(timeOutToDelete())); + Q_ASSERT(settings!=nullptr); + Q_ASSERT(refreshInterval>=0); + this->settings=settings; + file=nullptr; + if (refreshInterval>0) + { + refreshTimer.start(refreshInterval,this); + } + flushTimer.start(1000,this); + refreshSettings(); +} + + +FileLogger::~FileLogger() +{ + close(); +} + + +void FileLogger::write(const LogMessage* logMessage) +{ + if (file) + { +// qDebug()<<"Critical message output test\n"; +// qCritical("This is a critical message of test\n"); + file->write(qPrintable(logMessage->toString(msgFormat,timestampFormat))); + + if (logMessage->getType()>=QtCriticalMsg) + { + file->flush(); + } + + if (file->error()) + { + qWarning("Cannot write to log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); + close(); + } + + } + + if (!file) + { + Logger::write(logMessage); + } + +} + +void FileLogger::open() +{ + if (fileName.isEmpty()) + { + qWarning("Name of logFile is empty"); + } + else { + file=new QFile(fileName); + QFileInfo fileInfo(fileName); + // 检查文件路径是否有效 + if (!fileInfo.exists()) { + // 获取文件所在的目录路径 + QString dirPath = QFileInfo(fileName).absoluteDir().path(); + // 检查目录是否存在 + if (!QDir(dirPath).exists()) { + // 如果目录不存在,则创建目录 + QDir().mkpath(dirPath); + if (!QDir(dirPath).exists()) { + // 如果创建目录失败,显示错误消息 + qDebug("Cannot create directory for log file: %s", qPrintable(dirPath)); + delete file; + file = nullptr; + return; + } + } + } + if (!file->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) + { + qWarning("Cannot open log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); + file=nullptr; + } + } +} + + +void FileLogger::close() +{ + if (file) + { + file->close(); + delete file; + file=nullptr; + } +} + +void FileLogger::rotate() { + int count=0; + forever + { + QFile bakFile(QString("%1.%2").arg(fileName).arg(count+1)); + if (bakFile.exists()) + { + ++count; + } + else + { + break; + } + } + + while (maxBackups>0 && count>=maxBackups) + { + QFile::remove(QString("%1.%2").arg(fileName).arg(count)); + --count; + } + + for (int i=count; i>0; --i) { + QFile::rename(QString("%1.%2").arg(fileName).arg(i),QString("%1.%2").arg(fileName).arg(i+1)); + } + + QFile::rename(fileName,fileName+".1"); + +} + + +void FileLogger::timerEvent(QTimerEvent* event) +{ + if (!event) + { + return; + } + else if (event->timerId()==refreshTimer.timerId()) + { + refreshSettings(); + } + else if (event->timerId()==flushTimer.timerId() && file) + { + mutex.lock(); + + file->flush(); + + if (maxSize>0 && file->size()>=maxSize) + { + close(); + rotate(); + open(); + } + + mutex.unlock(); + } +} + +bool FileLogger::removeDirectory(const QString &directoryPath) { + // 检查目录是否存在 + QDir dir(directoryPath); + if (dir.exists()) { + system((char *)((QString("rm -r %1").arg(directoryPath)).toLatin1().data())); + return true; + } + return false; +} + +void FileLogger::timeOutToDelete(){ + QDate today = QDate::currentDate(); + for(int daysAgo=14;daysAgo>=7;--daysAgo){ + QString needToDelFoldPath=LOG_FILE_PATH; + QDate pastDate=today.addDays(-daysAgo); + needToDelFoldPath+=pastDate.toString(Qt::ISODate); + needToDelFoldPath+="/"; + if (QDir(needToDelFoldPath).exists()) { + bool result= removeDirectory(needToDelFoldPath); + if(result){ + qDebug()<<"The directory and all its contents have been removed"; + LogInfo::setRunStatusText(tr("The directory and all its contents have been removed")); + }else{ + qDebug() << "Failed to remove the directory"; + LogInfo::setRunStatusText(tr("Failed to remove the directory")); + } + } + } + TimerDel->stop(); +} diff --git a/Log/filelogger.h b/Log/filelogger.h index f4f9f49..1310d8b 100644 --- a/Log/filelogger.h +++ b/Log/filelogger.h @@ -1,62 +1,62 @@ - -#ifndef FILELOGGER_H -#define FILELOGGER_H - -#include -#include -#include -#include -#include -#include "logglobal.h" -#include "logger.h" -#include - -class DECLSPEC FileLogger : public Logger { - Q_OBJECT - Q_DISABLE_COPY(FileLogger) -public: - - FileLogger(QSettings* settings, const int refreshInterval=10000, QObject* parent = nullptr); - - virtual ~FileLogger(); - - virtual void write(const LogMessage* logMessage); - - public slots: - void timeOutToDelete(); - -protected: - - void timerEvent(QTimerEvent* event); - -private: - - - QString fileName; - - - long maxSize; - - int maxBackups; - - QSettings* settings; - - QFile* file; - - QBasicTimer refreshTimer; - - QBasicTimer flushTimer; - QTimer *TimerDel; - - void open(); - - void close(); - - void rotate(); - - void refreshSettings(); - - bool removeDirectory(const QString &directoryPath); -}; - -#endif // FILELOGGER_H + +#ifndef FILELOGGER_H +#define FILELOGGER_H + +#include +#include +#include +#include +#include +#include "logglobal.h" +#include "logger.h" +#include + +class DECLSPEC FileLogger : public Logger { + Q_OBJECT + Q_DISABLE_COPY(FileLogger) +public: + + FileLogger(QSettings* settings, const int refreshInterval=10000, QObject* parent = nullptr); + + virtual ~FileLogger(); + + virtual void write(const LogMessage* logMessage); + + public slots: + void timeOutToDelete(); + +protected: + + void timerEvent(QTimerEvent* event); + +private: + + + QString fileName; + + + long maxSize; + + int maxBackups; + + QSettings* settings; + + QFile* file; + + QBasicTimer refreshTimer; + + QBasicTimer flushTimer; + QTimer *TimerDel; + + void open(); + + void close(); + + void rotate(); + + void refreshSettings(); + + bool removeDirectory(const QString &directoryPath); +}; + +#endif // FILELOGGER_H diff --git a/Log/logger.cpp b/Log/logger.cpp index c2578aa..df24106 100644 --- a/Log/logger.cpp +++ b/Log/logger.cpp @@ -1,247 +1,247 @@ - -#include "logger.h" -#include -#include -#include -#include -#include -#include - -Logger* Logger::defaultLogger=nullptr; - - -QThreadStorage*> Logger::logVars; - - -QMutex Logger::mutex; - - -Logger::Logger(QObject* parent) - : QObject(parent), - msgFormat("{timestamp} {type} {msg}"), - timestampFormat("dd.MM.yyyy hh:mm:ss.zzz"), - minLevel(QtDebugMsg), - bufferSize(0) - {} - - -Logger::Logger(const QString msgFormat, const QString timestampFormat, const QtMsgType minLevel, const int bufferSize, QObject* parent) - :QObject(parent) -{ - this->msgFormat=msgFormat; - this->timestampFormat=timestampFormat; - this->minLevel=minLevel; - this->bufferSize=bufferSize; -} - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - static QRecursiveMutex recursiveMutex; - static QMutex nonRecursiveMutex; -#else - static QMutex recursiveMutex(QMutex::Recursive); - static QMutex nonRecursiveMutex(QMutex::NonRecursive); -#endif - -void Logger::msgHandler(const QtMsgType type, const QString &message, const QString &file, const QString &function, const int line) -{ - - recursiveMutex.lock(); - - if (defaultLogger && nonRecursiveMutex.tryLock()) - { - defaultLogger->log(type, message, file, function, line); - nonRecursiveMutex.unlock(); - } - else - { - fputs(qPrintable(message),stderr); - fflush(stderr); - } - - if (type==QtFatalMsg) - { - abort(); - } - - recursiveMutex.unlock(); -} - - -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - void Logger::msgHandler5(const QtMsgType type, const QMessageLogContext &context, const QString &message) - { - (void)(context); - msgHandler(type,message,context.file,context.function,context.line); - } -#else - void Logger::msgHandler4(const QtMsgType type, const char* message) - { - msgHandler(type,message); - } -#endif - - -Logger::~Logger() -{ - if (defaultLogger==this) - { -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - qInstallMessageHandler(nullptr); -#else - qInstallMsgHandler(nullptr); -#endif - defaultLogger=nullptr; - } -} - - -void Logger::write(const LogMessage* logMessage) -{ - fputs(qPrintable(logMessage->toString(msgFormat,timestampFormat)), stderr); - fflush(stderr); -} - - -void Logger::installMsgHandler() -{ - defaultLogger=this; -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - qInstallMessageHandler(msgHandler5); -#else - qInstallMsgHandler(msgHandler4); -#endif -} - - -void Logger::set(const QString& name, const QString& value) -{ - mutex.lock(); - if (!logVars.hasLocalData()) - { - logVars.setLocalData(new QHash); - } - logVars.localData()->insert(name,value); - mutex.unlock(); -} - - -void Logger::clear(const bool buffer, const bool variables) -{ - mutex.lock(); - if (buffer && buffers.hasLocalData()) - { - QList* buffer=buffers.localData(); - while (buffer && !buffer->isEmpty()) - { - LogMessage* logMessage=buffer->takeLast(); - delete logMessage; - } - } - if (variables && logVars.hasLocalData()) - { - logVars.localData()->clear(); - } - mutex.unlock(); -} - - -void Logger::log(const QtMsgType type, const QString& message, const QString &file, const QString &function, const int line) -{ - bool toPrint=false; - - switch (type) - { - case QtDebugMsg: - if (minLevel==QtDebugMsg) - { - toPrint=true; - } - break; - - #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) - case QtInfoMsg: - if (minLevel==QtDebugMsg || - minLevel==QtInfoMsg) - { - toPrint=true; - } - break; - #endif - - case QtWarningMsg: - if (minLevel==QtDebugMsg || - #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) - minLevel==QtInfoMsg || - #endif - minLevel==QtWarningMsg) - { - toPrint=true; - } - break; - - case QtCriticalMsg: - if (minLevel==QtDebugMsg || - #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) - minLevel==QtInfoMsg || - #endif - minLevel==QtWarningMsg || - minLevel==QtCriticalMsg) - { - toPrint=true; - } - break; - - case QtFatalMsg: - toPrint=true; - break; - - default: - toPrint=true; - } - - mutex.lock(); - - LogMessage* logMessage=new LogMessage(type,message,logVars.localData(),file,function,line); - - // #ifndef BNS_DEBUG - std::cout << qPrintable(logMessage->toString(msgFormat,"hh:mm:ss.zzz")) << std::flush; - // #endif - - if (bufferSize>0) - { - - if (!buffers.hasLocalData()) - { - buffers.setLocalData(new QList()); - } - QList* buffer=buffers.localData(); - - - buffer->append(logMessage); - - if (buffer->size()>bufferSize) - { - delete buffer->takeFirst(); - } - - if (toPrint) - { - while (!buffer->isEmpty()) - { - LogMessage* logMessage=buffer->takeFirst(); - write(logMessage); - delete logMessage; - } - } - } - - else - { - if (toPrint) - { - LogMessage logMessage(type,message,logVars.localData(),file,function,line); - write(&logMessage); - } - } - mutex.unlock(); -} + +#include "logger.h" +#include +#include +#include +#include +#include +#include + +Logger* Logger::defaultLogger=nullptr; + + +QThreadStorage*> Logger::logVars; + + +QMutex Logger::mutex; + + +Logger::Logger(QObject* parent) + : QObject(parent), + msgFormat("{timestamp} {type} {msg}"), + timestampFormat("dd.MM.yyyy hh:mm:ss.zzz"), + minLevel(QtDebugMsg), + bufferSize(0) + {} + + +Logger::Logger(const QString msgFormat, const QString timestampFormat, const QtMsgType minLevel, const int bufferSize, QObject* parent) + :QObject(parent) +{ + this->msgFormat=msgFormat; + this->timestampFormat=timestampFormat; + this->minLevel=minLevel; + this->bufferSize=bufferSize; +} + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + static QRecursiveMutex recursiveMutex; + static QMutex nonRecursiveMutex; +#else + static QMutex recursiveMutex(QMutex::Recursive); + static QMutex nonRecursiveMutex(QMutex::NonRecursive); +#endif + +void Logger::msgHandler(const QtMsgType type, const QString &message, const QString &file, const QString &function, const int line) +{ + + recursiveMutex.lock(); + + if (defaultLogger && nonRecursiveMutex.tryLock()) + { + defaultLogger->log(type, message, file, function, line); + nonRecursiveMutex.unlock(); + } + else + { + fputs(qPrintable(message),stderr); + fflush(stderr); + } + + if (type==QtFatalMsg) + { + abort(); + } + + recursiveMutex.unlock(); +} + + +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + void Logger::msgHandler5(const QtMsgType type, const QMessageLogContext &context, const QString &message) + { + (void)(context); + msgHandler(type,message,context.file,context.function,context.line); + } +#else + void Logger::msgHandler4(const QtMsgType type, const char* message) + { + msgHandler(type,message); + } +#endif + + +Logger::~Logger() +{ + if (defaultLogger==this) + { +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + qInstallMessageHandler(nullptr); +#else + qInstallMsgHandler(nullptr); +#endif + defaultLogger=nullptr; + } +} + + +void Logger::write(const LogMessage* logMessage) +{ + fputs(qPrintable(logMessage->toString(msgFormat,timestampFormat)), stderr); + fflush(stderr); +} + + +void Logger::installMsgHandler() +{ + defaultLogger=this; +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + qInstallMessageHandler(msgHandler5); +#else + qInstallMsgHandler(msgHandler4); +#endif +} + + +void Logger::set(const QString& name, const QString& value) +{ + mutex.lock(); + if (!logVars.hasLocalData()) + { + logVars.setLocalData(new QHash); + } + logVars.localData()->insert(name,value); + mutex.unlock(); +} + + +void Logger::clear(const bool buffer, const bool variables) +{ + mutex.lock(); + if (buffer && buffers.hasLocalData()) + { + QList* buffer=buffers.localData(); + while (buffer && !buffer->isEmpty()) + { + LogMessage* logMessage=buffer->takeLast(); + delete logMessage; + } + } + if (variables && logVars.hasLocalData()) + { + logVars.localData()->clear(); + } + mutex.unlock(); +} + + +void Logger::log(const QtMsgType type, const QString& message, const QString &file, const QString &function, const int line) +{ + bool toPrint=false; + + switch (type) + { + case QtDebugMsg: + if (minLevel==QtDebugMsg) + { + toPrint=true; + } + break; + + #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) + case QtInfoMsg: + if (minLevel==QtDebugMsg || + minLevel==QtInfoMsg) + { + toPrint=true; + } + break; + #endif + + case QtWarningMsg: + if (minLevel==QtDebugMsg || + #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) + minLevel==QtInfoMsg || + #endif + minLevel==QtWarningMsg) + { + toPrint=true; + } + break; + + case QtCriticalMsg: + if (minLevel==QtDebugMsg || + #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) + minLevel==QtInfoMsg || + #endif + minLevel==QtWarningMsg || + minLevel==QtCriticalMsg) + { + toPrint=true; + } + break; + + case QtFatalMsg: + toPrint=true; + break; + + default: + toPrint=true; + } + + mutex.lock(); + + LogMessage* logMessage=new LogMessage(type,message,logVars.localData(),file,function,line); + + // #ifndef BNS_DEBUG + std::cout << qPrintable(logMessage->toString(msgFormat,"hh:mm:ss.zzz")) << std::flush; + // #endif + + if (bufferSize>0) + { + + if (!buffers.hasLocalData()) + { + buffers.setLocalData(new QList()); + } + QList* buffer=buffers.localData(); + + + buffer->append(logMessage); + + if (buffer->size()>bufferSize) + { + delete buffer->takeFirst(); + } + + if (toPrint) + { + while (!buffer->isEmpty()) + { + LogMessage* logMessage=buffer->takeFirst(); + write(logMessage); + delete logMessage; + } + } + } + + else + { + if (toPrint) + { + LogMessage logMessage(type,message,logVars.localData(),file,function,line); + write(&logMessage); + } + } + mutex.unlock(); +} diff --git a/Log/logger.h b/Log/logger.h index 6ad0d89..cea439c 100644 --- a/Log/logger.h +++ b/Log/logger.h @@ -1,76 +1,76 @@ - -#ifndef LOGGER_H -#define LOGGER_H - -#include -#include -#include -#include -#include -#include -#include "logglobal.h" -#include "logmessage.h" -#include - -class DECLSPEC Logger : public QObject { - Q_OBJECT - Q_DISABLE_COPY(Logger) -public: - - Logger(QObject* parent); - - Logger(const QString msgFormat="{timestamp} {type} {msg}", - const QString timestampFormat="dd.MM.yyyy hh:mm:ss.zzz", - const QtMsgType minLevel=QtDebugMsg, const int bufferSize=0, - QObject* parent = nullptr); - - virtual ~Logger(); - - virtual void log(const QtMsgType type, const QString& message, const QString &file="", - const QString &function="", const int line=0); - - void installMsgHandler(); - static void set(const QString& name, const QString& value); - - virtual void clear(const bool buffer=true, const bool variables=true); - -protected: - - - QString msgFormat; - - - QString timestampFormat; - - QtMsgType minLevel; - - int bufferSize; - - static QMutex mutex; - - virtual void write(const LogMessage* logMessage); - -private: - - static Logger* defaultLogger; - - static void msgHandler(const QtMsgType type, const QString &message, const QString &file="", - const QString &function="", const int line=0); - - -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - - static void msgHandler5(const QtMsgType type, const QMessageLogContext& context, const QString &message); - -#else - - static void msgHandler4(const QtMsgType type, const char * message); - -#endif - - static QThreadStorage*> logVars; - - QThreadStorage*> buffers; -}; - -#endif // LOGGER_H + +#ifndef LOGGER_H +#define LOGGER_H + +#include +#include +#include +#include +#include +#include +#include "logglobal.h" +#include "logmessage.h" +#include + +class DECLSPEC Logger : public QObject { + Q_OBJECT + Q_DISABLE_COPY(Logger) +public: + + Logger(QObject* parent); + + Logger(const QString msgFormat="{timestamp} {type} {msg}", + const QString timestampFormat="dd.MM.yyyy hh:mm:ss.zzz", + const QtMsgType minLevel=QtDebugMsg, const int bufferSize=0, + QObject* parent = nullptr); + + virtual ~Logger(); + + virtual void log(const QtMsgType type, const QString& message, const QString &file="", + const QString &function="", const int line=0); + + void installMsgHandler(); + static void set(const QString& name, const QString& value); + + virtual void clear(const bool buffer=true, const bool variables=true); + +protected: + + + QString msgFormat; + + + QString timestampFormat; + + QtMsgType minLevel; + + int bufferSize; + + static QMutex mutex; + + virtual void write(const LogMessage* logMessage); + +private: + + static Logger* defaultLogger; + + static void msgHandler(const QtMsgType type, const QString &message, const QString &file="", + const QString &function="", const int line=0); + + +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + + static void msgHandler5(const QtMsgType type, const QMessageLogContext& context, const QString &message); + +#else + + static void msgHandler4(const QtMsgType type, const char * message); + +#endif + + static QThreadStorage*> logVars; + + QThreadStorage*> buffers; +}; + +#endif // LOGGER_H diff --git a/Log/logglobal.h b/Log/logglobal.h index f3b9177..1e2fc58 100644 --- a/Log/logglobal.h +++ b/Log/logglobal.h @@ -1,23 +1,23 @@ - -#ifndef LOGGLOBAL_H -#define LOGGLOBAL_H - -#include - -#if defined(Q_OS_WIN) - #if defined(QTWEBAPPLIB_EXPORT) - #define DECLSPEC Q_DECL_EXPORT - #elif defined(QTWEBAPPLIB_IMPORT) - #define DECLSPEC Q_DECL_IMPORT - #endif -#endif -#if !defined(DECLSPEC) - #define DECLSPEC -#endif - -#if __cplusplus < 201103L - #define nullptr 0 -#endif - -#endif // LOGGLOBAL_H - + +#ifndef LOGGLOBAL_H +#define LOGGLOBAL_H + +#include + +#if defined(Q_OS_WIN) + #if defined(QTWEBAPPLIB_EXPORT) + #define DECLSPEC Q_DECL_EXPORT + #elif defined(QTWEBAPPLIB_IMPORT) + #define DECLSPEC Q_DECL_IMPORT + #endif +#endif +#if !defined(DECLSPEC) + #define DECLSPEC +#endif + +#if __cplusplus < 201103L + #define nullptr 0 +#endif + +#endif // LOGGLOBAL_H + diff --git a/Log/logmessage.cpp b/Log/logmessage.cpp index a9533bc..34e95aa 100644 --- a/Log/logmessage.cpp +++ b/Log/logmessage.cpp @@ -1,78 +1,78 @@ - -#include "logmessage.h" -#include - -LogMessage::LogMessage(const QtMsgType type, const QString& message, const QHash *logVars, const QString &file, const QString &function, const int line) -{ - this->type=type; - this->message=message; - this->file=file; - this->function=function; - this->line=line; - timestamp=QDateTime::currentDateTime(); - threadId=QThread::currentThreadId(); - - if (logVars) - { - this->logVars=*logVars; - } -} - -QString LogMessage::toString(const QString& msgFormat, const QString& timestampFormat) const -{ - QString decorated=msgFormat+"\n"; - decorated.replace("{msg}",message); - - if (decorated.contains("{timestamp}")) - { - decorated.replace("{timestamp}",timestamp.toString(timestampFormat)); - } - - QString typeNr; - typeNr.setNum(type); - decorated.replace("{typeNr}",typeNr); - - switch (type) - { - case QtDebugMsg: - decorated.replace("{type}","DEBUG "); - break; - case QtWarningMsg: - decorated.replace("{type}","WARNING "); - break; - case QtCriticalMsg: - decorated.replace("{type}","CRITICAL"); - break; - case QtFatalMsg: - decorated.replace("{type}","FATAL "); - break; - #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) - case QtInfoMsg: - decorated.replace("{type}","INFO "); - break; - #endif - } - - decorated.replace("{file}",file); - decorated.replace("{function}",function); - decorated.replace("{line}",QString::number(line)); - - QString threadId = QString("0x%1").arg(qulonglong(QThread::currentThreadId()), 8, 16, QLatin1Char('0')); - decorated.replace("{thread}",threadId); - - if (decorated.contains("{") && !logVars.isEmpty()) - { - QList keys=logVars.keys(); - foreach (QString key, keys) - { - decorated.replace("{"+key+"}",logVars.value(key)); - } - } - - return decorated; -} - -QtMsgType LogMessage::getType() const -{ - return type; -} + +#include "logmessage.h" +#include + +LogMessage::LogMessage(const QtMsgType type, const QString& message, const QHash *logVars, const QString &file, const QString &function, const int line) +{ + this->type=type; + this->message=message; + this->file=file; + this->function=function; + this->line=line; + timestamp=QDateTime::currentDateTime(); + threadId=QThread::currentThreadId(); + + if (logVars) + { + this->logVars=*logVars; + } +} + +QString LogMessage::toString(const QString& msgFormat, const QString& timestampFormat) const +{ + QString decorated=msgFormat+"\n"; + decorated.replace("{msg}",message); + + if (decorated.contains("{timestamp}")) + { + decorated.replace("{timestamp}",timestamp.toString(timestampFormat)); + } + + QString typeNr; + typeNr.setNum(type); + decorated.replace("{typeNr}",typeNr); + + switch (type) + { + case QtDebugMsg: + decorated.replace("{type}","DEBUG "); + break; + case QtWarningMsg: + decorated.replace("{type}","WARNING "); + break; + case QtCriticalMsg: + decorated.replace("{type}","CRITICAL"); + break; + case QtFatalMsg: + decorated.replace("{type}","FATAL "); + break; + #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) + case QtInfoMsg: + decorated.replace("{type}","INFO "); + break; + #endif + } + + decorated.replace("{file}",file); + decorated.replace("{function}",function); + decorated.replace("{line}",QString::number(line)); + + QString threadId = QString("0x%1").arg(qulonglong(QThread::currentThreadId()), 8, 16, QLatin1Char('0')); + decorated.replace("{thread}",threadId); + + if (decorated.contains("{") && !logVars.isEmpty()) + { + QList keys=logVars.keys(); + foreach (QString key, keys) + { + decorated.replace("{"+key+"}",logVars.value(key)); + } + } + + return decorated; +} + +QtMsgType LogMessage::getType() const +{ + return type; +} diff --git a/Log/logmessage.h b/Log/logmessage.h index fde7e63..d2ee785 100644 --- a/Log/logmessage.h +++ b/Log/logmessage.h @@ -1,44 +1,44 @@ - -#ifndef LOGMESSAGE_H -#define LOGMESSAGE_H - -#include -#include -#include -#include "logglobal.h" - -class DECLSPEC LogMessage -{ - Q_DISABLE_COPY(LogMessage) -public: - - LogMessage(const QtMsgType type, const QString& message, const QHash* logVars, - const QString &file, const QString &function, const int line); - - QString toString(const QString& msgFormat, const QString& timestampFormat) const; - - QtMsgType getType() const; - -private: - - - QHash logVars; - - QDateTime timestamp; - - QtMsgType type; - - - Qt::HANDLE threadId; - - QString message; - - QString file; - - QString function; - - int line; - -}; - -#endif // LOGMESSAGE_H + +#ifndef LOGMESSAGE_H +#define LOGMESSAGE_H + +#include +#include +#include +#include "logglobal.h" + +class DECLSPEC LogMessage +{ + Q_DISABLE_COPY(LogMessage) +public: + + LogMessage(const QtMsgType type, const QString& message, const QHash* logVars, + const QString &file, const QString &function, const int line); + + QString toString(const QString& msgFormat, const QString& timestampFormat) const; + + QtMsgType getType() const; + +private: + + + QHash logVars; + + QDateTime timestamp; + + QtMsgType type; + + + Qt::HANDLE threadId; + + QString message; + + QString file; + + QString function; + + int line; + +}; + +#endif // LOGMESSAGE_H diff --git a/Matrix/drawmatrix.cpp b/Matrix/drawmatrix.cpp index 86ac48b..b074d7f 100644 --- a/Matrix/drawmatrix.cpp +++ b/Matrix/drawmatrix.cpp @@ -1,68 +1,68 @@ -#include -#include -// -// U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize -#include "dm200.h" - -#include "QImage" -#include "QDebug" - -#define MAX_WIDTH_BYTE 48 // 384/8 - -char DataMatrixdDraw(U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize); -//char DataMatrixdDrawImg(U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize,QImage *pImg); - -void Draw_Matrix(unsigned char *buffer) -{ - U16 sColumns, sRows; - U08 *Grid; - sColumns = sRows = 0; - Grid = 0; - sColumns = sRows = 0; - short sizeType = 0; - Grid = iec16022ecc200((short*)&sRows, (short*)&sColumns, buffer, &sizeType); - DataMatrixdDraw(Grid,sRows,sColumns,2); -} - -char DataMatrixdDraw(U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize) -{ - int Size=MSize; - int w = cColumns*Size; - int h = cRows*Size; - //qDebug()<fill(0x00ffffff); - /* data */ - int margin=0; - U08 *p = OutBuff; - int ypos=0;//margin * Size; - int xpos=0; - int x,y,xx,yy,bit; - for(y=0; ysetPixel(xpos,h-1-(ypos+yy),0xff000000); - } - } - xpos++; - } - p++; - bit--; - if(bit < 0) { - //q++; - bit = 7; - } - } - ypos+=Size; - } - img->save("Myqr.bmp"); - return 0; -} - +#include +#include +// +// U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize +#include "dm200.h" + +#include "QImage" +#include "QDebug" + +#define MAX_WIDTH_BYTE 48 // 384/8 + +char DataMatrixdDraw(U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize); +//char DataMatrixdDrawImg(U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize,QImage *pImg); + +void Draw_Matrix(unsigned char *buffer) +{ + U16 sColumns, sRows; + U08 *Grid; + sColumns = sRows = 0; + Grid = 0; + sColumns = sRows = 0; + short sizeType = 0; + Grid = iec16022ecc200((short*)&sRows, (short*)&sColumns, buffer, &sizeType); + DataMatrixdDraw(Grid,sRows,sColumns,2); +} + +char DataMatrixdDraw(U08 *OutBuff, U16 cRows, U16 cColumns, U08 MSize) +{ + int Size=MSize; + int w = cColumns*Size; + int h = cRows*Size; + //qDebug()<fill(0x00ffffff); + /* data */ + int margin=0; + U08 *p = OutBuff; + int ypos=0;//margin * Size; + int xpos=0; + int x,y,xx,yy,bit; + for(y=0; ysetPixel(xpos,h-1-(ypos+yy),0xff000000); + } + } + xpos++; + } + p++; + bit--; + if(bit < 0) { + //q++; + bit = 7; + } + } + ypos+=Size; + } + img->save("Myqr.bmp"); + return 0; +} + diff --git a/SecondThread/SecondThread.cpp b/SecondThread/SecondThread.cpp index 4b12a23..9b2b594 100644 --- a/SecondThread/SecondThread.cpp +++ b/SecondThread/SecondThread.cpp @@ -1,107 +1,107 @@ -#include -#include -#include "SecondThread.h" -#include "VerBVersion.h" - -SecondThread::SecondThread(QObject* par) : QThread(par) -,m_runCount(20) -{ - pDdlgShowMsg = new DlgShowMsg; - pDdlgShowMsg->hide(); - pTimer10s = new QTimer(); - pTimer10s->setInterval(10000); - //connect(pTimer10s, SIGNAL(timeout()), this, &SecondThread::timeoutSlot); - connect(pTimer10s, SIGNAL(timeout()), this, SLOT(timeoutSlot()),Qt::QueuedConnection); - pUpLicManager = new LicenseManger(); - licState = pUpLicManager->getLicState(); - if(licState) - { - //pDdlgShowMsg->showMsg(tr("license file was invalid,error code:%1").arg(licState)); - emit printerLicErr(licState); - qDebug()<<"asdfsdf"; - } - bLicFileUpdating = false; -} - -SecondThread::~SecondThread() -{ - qDebug() << "SecondThread::~SecondThread()"; -} - -void SecondThread::setSomething() -{ - msleep(500); - QString str = QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId()); - emit message(str); -} - -void SecondThread::getSomething() -{ - msleep(500); - emit message(QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId())); -} - -void SecondThread::setRunCount(int count) -{ - m_runCount = count; - emit message(QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId())); -} - -void SecondThread::timeoutSlot() -{ - QTime curTime=QTime::currentTime(); - qDebug()<CheckRemainingTime(); - if(remaining_time <= 3) - { - licState = -LICENSE_STATE_REMAIN_TIME_REARCH; - emit printerLicErr(licState); - } - } - emit printerLicErr(licState); - } -} -void SecondThread::update_license_file() -{ - pUpLicManager->UpdateLicenseFileData(); - licState = pUpLicManager->getLicState(); -} -void SecondThread::update_license_process() -{ - qint8 updateFileState = pUpLicManager->CheckUpdateFileState(); - if(updateFileState != UPDATE_LICENSE_FILE_OK) - { - //QMessageBox::critical(this,tr("错误"),tr("升级软件错误,错误码:%1").arg(updateState)); - emit update_license_complete(updateFileState); - } - else - { - bLicFileUpdating = true; - update_license_file(); - emit update_license_complete(UPDATE_LICENSE_FILE_OK); - bLicFileUpdating = false; - } -} - -void SecondThread::set_serial_number_process(quint32 serial_number) -{ - qDebug()<<"set_serial_number_process"<setMachineInfo(serial_number); -} -void SecondThread::run() -{ - qDebug()<<"second thread run"; - pTimer10s->start(); - this->exec(); -} - -void SecondThread::doSomething() -{ - msleep(500); - emit message(QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId())); -} +#include +#include +#include "SecondThread.h" +#include "VerBVersion.h" + +SecondThread::SecondThread(QObject* par) : QThread(par) +,m_runCount(20) +{ + pDdlgShowMsg = new DlgShowMsg; + pDdlgShowMsg->hide(); + pTimer10s = new QTimer(); + pTimer10s->setInterval(10000); + //connect(pTimer10s, SIGNAL(timeout()), this, &SecondThread::timeoutSlot); + connect(pTimer10s, SIGNAL(timeout()), this, SLOT(timeoutSlot()),Qt::QueuedConnection); + pUpLicManager = new LicenseManger(); + licState = pUpLicManager->getLicState(); + if(licState) + { + //pDdlgShowMsg->showMsg(tr("license file was invalid,error code:%1").arg(licState)); + emit printerLicErr(licState); + qDebug()<<"asdfsdf"; + } + bLicFileUpdating = false; +} + +SecondThread::~SecondThread() +{ + qDebug() << "SecondThread::~SecondThread()"; +} + +void SecondThread::setSomething() +{ + msleep(500); + QString str = QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId()); + emit message(str); +} + +void SecondThread::getSomething() +{ + msleep(500); + emit message(QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId())); +} + +void SecondThread::setRunCount(int count) +{ + m_runCount = count; + emit message(QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId())); +} + +void SecondThread::timeoutSlot() +{ + QTime curTime=QTime::currentTime(); + qDebug()<CheckRemainingTime(); + if(remaining_time <= 3) + { + licState = -LICENSE_STATE_REMAIN_TIME_REARCH; + emit printerLicErr(licState); + } + } + emit printerLicErr(licState); + } +} +void SecondThread::update_license_file() +{ + pUpLicManager->UpdateLicenseFileData(); + licState = pUpLicManager->getLicState(); +} +void SecondThread::update_license_process() +{ + qint8 updateFileState = pUpLicManager->CheckUpdateFileState(); + if(updateFileState != UPDATE_LICENSE_FILE_OK) + { + //QMessageBox::critical(this,tr("错误"),tr("升级软件错误,错误码:%1").arg(updateState)); + emit update_license_complete(updateFileState); + } + else + { + bLicFileUpdating = true; + update_license_file(); + emit update_license_complete(UPDATE_LICENSE_FILE_OK); + bLicFileUpdating = false; + } +} + +void SecondThread::set_serial_number_process(quint32 serial_number) +{ + qDebug()<<"set_serial_number_process"<setMachineInfo(serial_number); +} +void SecondThread::run() +{ + qDebug()<<"second thread run"; + pTimer10s->start(); + this->exec(); +} + +void SecondThread::doSomething() +{ + msleep(500); + emit message(QString("%1->%2,thread id:%3").arg(__FUNCTION__).arg(__FILE__).arg((int)QThread::currentThreadId())); +} diff --git a/SecondThread/SecondThread.h b/SecondThread/SecondThread.h index 347d8c0..3660230 100644 --- a/SecondThread/SecondThread.h +++ b/SecondThread/SecondThread.h @@ -1,44 +1,44 @@ -#ifndef SECONDTHREADFROMQTHREAD_H -#define SECONDTHREADFROMQTHREAD_H -#include -#include -#include "LicenseManger/LicenseManger.h" -#include "dlgshowmsg.h" - -#include - -class SecondThread : public QThread -{ - Q_OBJECT -signals: - void message(const QString& info); - void progress(int present); - void printerLicErr(qint8); - void update_license_complete(qint8); - -public: - SecondThread(QObject* par); - ~SecondThread(); - void setSomething(); - void getSomething(); - void setRunCount(int count); - void run(); - void doSomething(); - void update_license_file(); -private: - int m_runCount; - QTimer *pTimer10s; - LicenseManger *pUpLicManager; - QDate curDate; - TAesClass *pAes; - qint8 licState; - DlgShowMsg *pDdlgShowMsg; - bool bLicFileUpdating; - -private slots: - void timeoutSlot(); - void update_license_process(); - void set_serial_number_process(quint32); -}; - -#endif // THREADFROMQTHREAD_H +#ifndef SECONDTHREADFROMQTHREAD_H +#define SECONDTHREADFROMQTHREAD_H +#include +#include +#include "LicenseManger/LicenseManger.h" +#include "dlgshowmsg.h" + +#include + +class SecondThread : public QThread +{ + Q_OBJECT +signals: + void message(const QString& info); + void progress(int present); + void printerLicErr(qint8); + void update_license_complete(qint8); + +public: + SecondThread(QObject* par); + ~SecondThread(); + void setSomething(); + void getSomething(); + void setRunCount(int count); + void run(); + void doSomething(); + void update_license_file(); +private: + int m_runCount; + QTimer *pTimer10s; + LicenseManger *pUpLicManager; + QDate curDate; + TAesClass *pAes; + qint8 licState; + DlgShowMsg *pDdlgShowMsg; + bool bLicFileUpdating; + +private slots: + void timeoutSlot(); + void update_license_process(); + void set_serial_number_process(quint32); +}; + +#endif // THREADFROMQTHREAD_H diff --git a/UpdateFPGA.cpp b/UpdateFPGA.cpp index 828136e..6fb9239 100644 --- a/UpdateFPGA.cpp +++ b/UpdateFPGA.cpp @@ -1,353 +1,353 @@ -#include "UpdateFPGA.h" -#include -#include -#include -#include - -#pragma execution_character_set("utf-8") - -UpdateFPGA::UpdateFPGA(const QString& pythonScriptPath, QWidget* parent) - : QDialog(parent), m_PythonScriptPath(pythonScriptPath) -{ - this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint); - this->setObjectName("UpdateFPGA"); - this->setStyleSheet("QDialog#UpdateFPGA{background-color:#FFFFFF;border:0px solid #D6D6D6;}"); - this->setWindowIcon(QPixmap(":/UpdateFPGA/logo.png")); -// init(); -} - -UpdateFPGA::~UpdateFPGA() -{ - if (conversionProcess->state() == QProcess::Running) - { - conversionProcess->terminate(); - conversionProcess->waitForFinished(); - } -} - -void UpdateFPGA::init() -{ - setWindowTitle(tr("升级工具")); - setMinimumSize(600, 400); - - QLabel* Logo = new QLabel(this); - Logo->setFixedSize(67, 25); - Logo->setPixmap(QPixmap(":/UpdateFPGA/logo.png")); - Logo->setScaledContents(true); - - m_Title = new QLabel(this); - m_Title->setStyleSheet("font-family:\"Microsoft YaHei\";color:#333333;font-size:16px;"); - m_Title->setFixedHeight(25); - m_Title->setText(tr("升级工具")); - - m_CloseBtn = new QPushButton(this); - m_CloseBtn->setFixedSize(25, 25); - m_CloseBtn->setIconSize(QSize(20, 20)); - m_CloseBtn->setIcon(QPixmap(":/UpdateFPGA/close.svg")); - m_CloseBtn->setCursor(Qt::PointingHandCursor); - m_CloseBtn->setStyleSheet("QPushButton{background-color:#ffffff;border-radius:3px;border:none;}\ - QPushButton::hover{background-color:#EEEEEE;}"); - connect(m_CloseBtn, &QPushButton::released, this, [this]() { - this->close(); - }); - - QHBoxLayout* hlayout = new QHBoxLayout; - hlayout->addSpacing(5); - hlayout->addWidget(Logo); - hlayout->addWidget(m_Title); - hlayout->addStretch(); - hlayout->addWidget(m_CloseBtn); - hlayout->addSpacing(10); - - - - QVBoxLayout *mainLayout = new QVBoxLayout(this); - m_UpdateButton = new QPushButton(tr("开始升级"), this); - m_UpdateButton->setFixedHeight(30); - - logLabel = new QLabel(tr("升级日志:"), this); - logTextEdit = new QTextEdit(this); - logTextEdit->setReadOnly(true); - - mainLayout->addLayout(hlayout); - mainLayout->addWidget(m_UpdateButton); - mainLayout->addWidget(logLabel); - mainLayout->addWidget(logTextEdit, 1); - - conversionProcess = new QProcess(this); - - connect(m_UpdateButton, &QPushButton::clicked, this, &UpdateFPGA::startUpdate); - connect(conversionProcess, QOverload::of(&QProcess::finished), - this, &UpdateFPGA::processFinished); - connect(conversionProcess, &QProcess::errorOccurred, this, &UpdateFPGA::processError); - connect(conversionProcess, &QProcess::readyReadStandardOutput, [this]() { - logTextEdit->append(conversionProcess->readAllStandardOutput()); - } - ); - connect(conversionProcess, &QProcess::readyReadStandardError, [this]() { - logTextEdit->append(conversionProcess->readAllStandardError()); - } - ); -} - -void UpdateFPGA::startUpdate() -{ - m_CloseBtn->setEnabled(false); - if (m_PythonScriptPath.isEmpty()) - { - logTextEdit->append(tr("错误: 脚本为空")); - return; - } - QFile inputFile(m_PythonScriptPath); - if (!inputFile.exists()) - { - logTextEdit->append(tr("错误: 脚本不存在 - %1").arg(m_PythonScriptPath)); - return; - } - - logTextEdit->append(tr("开始升级...")); - logTextEdit->append(tr("文件:%1").arg(m_PythonScriptPath)); - - // 自动查找Ubuntu 22.04中可用的Python解释器 - QString pythonPath = findValidPythonInterpreter(); - if (pythonPath.isEmpty()) - { - logTextEdit->append(tr("错误: 未找到可用的Python解释器或缺少serial模块")); - m_CloseBtn->setEnabled(true); - return; - } - - logTextEdit->append(tr("使用Python解释器: %1").arg(pythonPath)); - - QStringList pythonArgs; - pythonArgs << m_PythonScriptPath; - - conversionProcess->start(pythonPath, pythonArgs); - m_UpdateButton->setEnabled(false); // 运行中禁用按钮 -} - -// 查找并验证Ubuntu系统中有效的Python解释器 -QString UpdateFPGA::findValidPythonInterpreter() -{ - QStringList pythonNames = { "python3", "python3.10", "python3.11", "python3.9" }; - QStringList searchPaths; - - QString home = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); - searchPaths << home + "/.local/bin" - << home + "/.pyenv/shims" - << home + "/.virtualenvs/*/bin" - << home + "/venv/bin" - << home + "/env/bin"; - - - searchPaths << "/usr/bin" - << "/usr/local/bin" - << "/bin" - << "/opt/bin" - << "/snap/bin"; - - - QByteArray pathEnvBytes = qgetenv("PATH"); - QString pathEnvStr = QString::fromLocal8Bit(pathEnvBytes); - QStringList pathEnv = pathEnvStr.split(QDir::listSeparator()); - foreach(const QString & path, pathEnv) - { - if (!searchPaths.contains(path)) - { - searchPaths << path; - } - } - - // 遍历所有可能的组合查找有效解释器 - foreach(const QString & path, searchPaths) - { - foreach(const QString & name, pythonNames) - { - if (path.contains("*")) - { - QDir dir(path.left(path.indexOf("*"))); - if (dir.exists()) - { - QStringList subDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); - foreach(const QString & subDir, subDirs) - { - QString fullPath = dir.filePath(subDir + "/bin/" + name); - if (QFile::exists(fullPath) && isValidPythonWithSerial(fullPath)) - { - return fullPath; - } - } - } - } - else - { - QString fullPath = QDir(path).filePath(name); - if (QFile::exists(fullPath) && isValidPythonWithSerial(fullPath)) - { - return fullPath; - } - } - } - } - - return ""; -} - -// 验证Python解释器是否包含serial模块 -bool UpdateFPGA::isValidPythonWithSerial(const QString& pythonPath) -{ - // 检查Python是否可运行 - QProcess testProcess; - testProcess.setProcessChannelMode(QProcess::MergedChannels); // 合并输出通道 - testProcess.start(pythonPath, { "-c", "import sys; sys.exit(0)" }); - - if (!testProcess.waitForFinished(3000) || testProcess.exitCode() != 0) - { - logTextEdit->append(tr("调试: 无效的Python解释器 - %1").arg(pythonPath)); - return false; - } - - // 检查是否安装了serial模块 - testProcess.start(pythonPath, { "-c", "import serial; print('serial found: ' + serial.__version__)" }); - if (testProcess.waitForFinished(3000)) - { - if (testProcess.exitCode() == 0) - { - QString output = testProcess.readAll().trimmed(); - logTextEdit->append(tr("调试: %1").arg(output)); - return true; - } - else - { - logTextEdit->append(tr("调试: %1 缺少serial模块").arg(pythonPath)); - } - } - else - { - logTextEdit->append(tr("调试: %1 响应超时").arg(pythonPath)); - } - - return false; -} - -// 根据错误码解析具体错误信息 -QString UpdateFPGA::getErrorDescription(int errorCode) -{ - switch (errorCode) - { - case 1: return tr("文件不存在(请检查FPGA固件文件路径)"); - case 2: return tr("无可用串口(请检查设备连接)"); - case 3: return tr("串口通信错误(可能是波特率不匹配或设备断开)"); - case 4: return tr("数据发送失败(尝试重新发送)"); - case 5: return tr("数据校验失败(数据传输过程中损坏)"); - case 6: return tr("接收数据不完整(可能是传输中断)"); - case 7: return tr("文件大小发送失败(协议握手错误)"); - case 8: return tr("文件内容发送失败(大文件传输超时)"); - case 9: return tr("未知错误(请查看详细日志)"); - default: return tr("未定义错误"); - } -} - -void UpdateFPGA::processFinished(int exitCode, QProcess::ExitStatus exitStatus) -{ - if (exitStatus == QProcess::NormalExit) - { - if (exitCode == 0) // 成功(错误码0) - { - logTextEdit->append(tr("升级成功!")); - QMessageBox::information(this, tr("成功"), tr("FPGA升级完成,请重启QtUI"), QMessageBox::Ok); - close(); // 成功后关闭界面 - emit upgradeFPGAFinished(); - } - else // 有错误码的失败 - { - QString errorDesc = getErrorDescription(exitCode); - logTextEdit->append(tr("升级失败,错误码: %1,原因: %2").arg(exitCode).arg(errorDesc)); - - // 询问用户是否重试(针对可恢复错误) - QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, - tr("升级失败"), - tr("错误码%1: %2\n是否重新尝试升级?").arg(exitCode).arg(errorDesc), - QMessageBox::Yes | QMessageBox::No); - - if (reply == QMessageBox::Yes) - { - startUpdate(); // 重新运行 - } - else - { - close(); - emit upgradeFPGAFinished(); - m_UpdateButton->setEnabled(true); // 允许手动再次尝试 - m_CloseBtn->setEnabled(true); - } - } - } - else // 进程异常退出(无错误码) - { - logTextEdit->append(tr("升级进程异常退出,退出码: %1").arg(exitCode)); - QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, - tr("进程异常"), - tr("升级过程中程序崩溃,是否重新尝试?"), - QMessageBox::Yes | QMessageBox::No); - - if (reply == QMessageBox::Yes) - { - startUpdate(); - } - else - { - close(); - emit upgradeFPGAFinished(); - m_UpdateButton->setEnabled(true); - m_CloseBtn->setEnabled(true); - } - } -} - -void UpdateFPGA::processError(QProcess::ProcessError error) -{ - QString errorMsg; - switch (error) - { - case QProcess::FailedToStart: - errorMsg = tr("错误: 无法启动脚本(可能是Python环境未配置)"); - break; - case QProcess::Crashed: - errorMsg = tr("错误: 脚本进程崩溃"); - break; - case QProcess::Timedout: - errorMsg = tr("错误: 启动超时(设备无响应)"); - break; - case QProcess::WriteError: - errorMsg = tr("错误: 写入进程失败(权限不足)"); - break; - case QProcess::ReadError: - errorMsg = tr("错误: 读取进程输出失败"); - break; - case QProcess::UnknownError: - default: - errorMsg = tr("错误: 未知错误"); - break; - } - - logTextEdit->append(errorMsg); - logTextEdit->append(tr("错误详情: ") + QString::fromLocal8Bit(conversionProcess->readAllStandardError())); - - // 进程错误时也提示重试 - QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, tr("操作错误"), errorMsg + tr("\n是否重新尝试?"), QMessageBox::Yes | QMessageBox::No); - if (reply == QMessageBox::Yes) - { - startUpdate(); - } - else - { - close(); - emit upgradeFPGAFinished(); - m_UpdateButton->setEnabled(true); - m_CloseBtn->setEnabled(true); - } -} +#include "UpdateFPGA.h" +#include +#include +#include +#include + +#pragma execution_character_set("utf-8") + +UpdateFPGA::UpdateFPGA(const QString& pythonScriptPath, QWidget* parent) + : QDialog(parent), m_PythonScriptPath(pythonScriptPath) +{ + this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint); + this->setObjectName("UpdateFPGA"); + this->setStyleSheet("QDialog#UpdateFPGA{background-color:#FFFFFF;border:0px solid #D6D6D6;}"); + this->setWindowIcon(QPixmap(":/UpdateFPGA/logo.png")); +// init(); +} + +UpdateFPGA::~UpdateFPGA() +{ + if (conversionProcess->state() == QProcess::Running) + { + conversionProcess->terminate(); + conversionProcess->waitForFinished(); + } +} + +void UpdateFPGA::init() +{ + setWindowTitle(tr("升级工具")); + setMinimumSize(600, 400); + + QLabel* Logo = new QLabel(this); + Logo->setFixedSize(67, 25); + Logo->setPixmap(QPixmap(":/UpdateFPGA/logo.png")); + Logo->setScaledContents(true); + + m_Title = new QLabel(this); + m_Title->setStyleSheet("font-family:\"Microsoft YaHei\";color:#333333;font-size:16px;"); + m_Title->setFixedHeight(25); + m_Title->setText(tr("升级工具")); + + m_CloseBtn = new QPushButton(this); + m_CloseBtn->setFixedSize(25, 25); + m_CloseBtn->setIconSize(QSize(20, 20)); + m_CloseBtn->setIcon(QPixmap(":/UpdateFPGA/close.svg")); + m_CloseBtn->setCursor(Qt::PointingHandCursor); + m_CloseBtn->setStyleSheet("QPushButton{background-color:#ffffff;border-radius:3px;border:none;}\ + QPushButton::hover{background-color:#EEEEEE;}"); + connect(m_CloseBtn, &QPushButton::released, this, [this]() { + this->close(); + }); + + QHBoxLayout* hlayout = new QHBoxLayout; + hlayout->addSpacing(5); + hlayout->addWidget(Logo); + hlayout->addWidget(m_Title); + hlayout->addStretch(); + hlayout->addWidget(m_CloseBtn); + hlayout->addSpacing(10); + + + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + m_UpdateButton = new QPushButton(tr("开始升级"), this); + m_UpdateButton->setFixedHeight(30); + + logLabel = new QLabel(tr("升级日志:"), this); + logTextEdit = new QTextEdit(this); + logTextEdit->setReadOnly(true); + + mainLayout->addLayout(hlayout); + mainLayout->addWidget(m_UpdateButton); + mainLayout->addWidget(logLabel); + mainLayout->addWidget(logTextEdit, 1); + + conversionProcess = new QProcess(this); + + connect(m_UpdateButton, &QPushButton::clicked, this, &UpdateFPGA::startUpdate); + connect(conversionProcess, QOverload::of(&QProcess::finished), + this, &UpdateFPGA::processFinished); + connect(conversionProcess, &QProcess::errorOccurred, this, &UpdateFPGA::processError); + connect(conversionProcess, &QProcess::readyReadStandardOutput, [this]() { + logTextEdit->append(conversionProcess->readAllStandardOutput()); + } + ); + connect(conversionProcess, &QProcess::readyReadStandardError, [this]() { + logTextEdit->append(conversionProcess->readAllStandardError()); + } + ); +} + +void UpdateFPGA::startUpdate() +{ + m_CloseBtn->setEnabled(false); + if (m_PythonScriptPath.isEmpty()) + { + logTextEdit->append(tr("错误: 脚本为空")); + return; + } + QFile inputFile(m_PythonScriptPath); + if (!inputFile.exists()) + { + logTextEdit->append(tr("错误: 脚本不存在 - %1").arg(m_PythonScriptPath)); + return; + } + + logTextEdit->append(tr("开始升级...")); + logTextEdit->append(tr("文件:%1").arg(m_PythonScriptPath)); + + // 自动查找Ubuntu 22.04中可用的Python解释器 + QString pythonPath = findValidPythonInterpreter(); + if (pythonPath.isEmpty()) + { + logTextEdit->append(tr("错误: 未找到可用的Python解释器或缺少serial模块")); + m_CloseBtn->setEnabled(true); + return; + } + + logTextEdit->append(tr("使用Python解释器: %1").arg(pythonPath)); + + QStringList pythonArgs; + pythonArgs << m_PythonScriptPath; + + conversionProcess->start(pythonPath, pythonArgs); + m_UpdateButton->setEnabled(false); // 运行中禁用按钮 +} + +// 查找并验证Ubuntu系统中有效的Python解释器 +QString UpdateFPGA::findValidPythonInterpreter() +{ + QStringList pythonNames = { "python3", "python3.10", "python3.11", "python3.9" }; + QStringList searchPaths; + + QString home = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); + searchPaths << home + "/.local/bin" + << home + "/.pyenv/shims" + << home + "/.virtualenvs/*/bin" + << home + "/venv/bin" + << home + "/env/bin"; + + + searchPaths << "/usr/bin" + << "/usr/local/bin" + << "/bin" + << "/opt/bin" + << "/snap/bin"; + + + QByteArray pathEnvBytes = qgetenv("PATH"); + QString pathEnvStr = QString::fromLocal8Bit(pathEnvBytes); + QStringList pathEnv = pathEnvStr.split(QDir::listSeparator()); + foreach(const QString & path, pathEnv) + { + if (!searchPaths.contains(path)) + { + searchPaths << path; + } + } + + // 遍历所有可能的组合查找有效解释器 + foreach(const QString & path, searchPaths) + { + foreach(const QString & name, pythonNames) + { + if (path.contains("*")) + { + QDir dir(path.left(path.indexOf("*"))); + if (dir.exists()) + { + QStringList subDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + foreach(const QString & subDir, subDirs) + { + QString fullPath = dir.filePath(subDir + "/bin/" + name); + if (QFile::exists(fullPath) && isValidPythonWithSerial(fullPath)) + { + return fullPath; + } + } + } + } + else + { + QString fullPath = QDir(path).filePath(name); + if (QFile::exists(fullPath) && isValidPythonWithSerial(fullPath)) + { + return fullPath; + } + } + } + } + + return ""; +} + +// 验证Python解释器是否包含serial模块 +bool UpdateFPGA::isValidPythonWithSerial(const QString& pythonPath) +{ + // 检查Python是否可运行 + QProcess testProcess; + testProcess.setProcessChannelMode(QProcess::MergedChannels); // 合并输出通道 + testProcess.start(pythonPath, { "-c", "import sys; sys.exit(0)" }); + + if (!testProcess.waitForFinished(3000) || testProcess.exitCode() != 0) + { + logTextEdit->append(tr("调试: 无效的Python解释器 - %1").arg(pythonPath)); + return false; + } + + // 检查是否安装了serial模块 + testProcess.start(pythonPath, { "-c", "import serial; print('serial found: ' + serial.__version__)" }); + if (testProcess.waitForFinished(3000)) + { + if (testProcess.exitCode() == 0) + { + QString output = testProcess.readAll().trimmed(); + logTextEdit->append(tr("调试: %1").arg(output)); + return true; + } + else + { + logTextEdit->append(tr("调试: %1 缺少serial模块").arg(pythonPath)); + } + } + else + { + logTextEdit->append(tr("调试: %1 响应超时").arg(pythonPath)); + } + + return false; +} + +// 根据错误码解析具体错误信息 +QString UpdateFPGA::getErrorDescription(int errorCode) +{ + switch (errorCode) + { + case 1: return tr("文件不存在(请检查FPGA固件文件路径)"); + case 2: return tr("无可用串口(请检查设备连接)"); + case 3: return tr("串口通信错误(可能是波特率不匹配或设备断开)"); + case 4: return tr("数据发送失败(尝试重新发送)"); + case 5: return tr("数据校验失败(数据传输过程中损坏)"); + case 6: return tr("接收数据不完整(可能是传输中断)"); + case 7: return tr("文件大小发送失败(协议握手错误)"); + case 8: return tr("文件内容发送失败(大文件传输超时)"); + case 9: return tr("未知错误(请查看详细日志)"); + default: return tr("未定义错误"); + } +} + +void UpdateFPGA::processFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + if (exitStatus == QProcess::NormalExit) + { + if (exitCode == 0) // 成功(错误码0) + { + logTextEdit->append(tr("升级成功!")); + QMessageBox::information(this, tr("成功"), tr("FPGA升级完成,请重启QtUI"), QMessageBox::Ok); + close(); // 成功后关闭界面 + emit upgradeFPGAFinished(); + } + else // 有错误码的失败 + { + QString errorDesc = getErrorDescription(exitCode); + logTextEdit->append(tr("升级失败,错误码: %1,原因: %2").arg(exitCode).arg(errorDesc)); + + // 询问用户是否重试(针对可恢复错误) + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, + tr("升级失败"), + tr("错误码%1: %2\n是否重新尝试升级?").arg(exitCode).arg(errorDesc), + QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::Yes) + { + startUpdate(); // 重新运行 + } + else + { + close(); + emit upgradeFPGAFinished(); + m_UpdateButton->setEnabled(true); // 允许手动再次尝试 + m_CloseBtn->setEnabled(true); + } + } + } + else // 进程异常退出(无错误码) + { + logTextEdit->append(tr("升级进程异常退出,退出码: %1").arg(exitCode)); + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, + tr("进程异常"), + tr("升级过程中程序崩溃,是否重新尝试?"), + QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::Yes) + { + startUpdate(); + } + else + { + close(); + emit upgradeFPGAFinished(); + m_UpdateButton->setEnabled(true); + m_CloseBtn->setEnabled(true); + } + } +} + +void UpdateFPGA::processError(QProcess::ProcessError error) +{ + QString errorMsg; + switch (error) + { + case QProcess::FailedToStart: + errorMsg = tr("错误: 无法启动脚本(可能是Python环境未配置)"); + break; + case QProcess::Crashed: + errorMsg = tr("错误: 脚本进程崩溃"); + break; + case QProcess::Timedout: + errorMsg = tr("错误: 启动超时(设备无响应)"); + break; + case QProcess::WriteError: + errorMsg = tr("错误: 写入进程失败(权限不足)"); + break; + case QProcess::ReadError: + errorMsg = tr("错误: 读取进程输出失败"); + break; + case QProcess::UnknownError: + default: + errorMsg = tr("错误: 未知错误"); + break; + } + + logTextEdit->append(errorMsg); + logTextEdit->append(tr("错误详情: ") + QString::fromLocal8Bit(conversionProcess->readAllStandardError())); + + // 进程错误时也提示重试 + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, tr("操作错误"), errorMsg + tr("\n是否重新尝试?"), QMessageBox::Yes | QMessageBox::No); + if (reply == QMessageBox::Yes) + { + startUpdate(); + } + else + { + close(); + emit upgradeFPGAFinished(); + m_UpdateButton->setEnabled(true); + m_CloseBtn->setEnabled(true); + } +} diff --git a/UpdateFPGA.h b/UpdateFPGA.h index 30b3bb9..c3cab47 100644 --- a/UpdateFPGA.h +++ b/UpdateFPGA.h @@ -1,42 +1,42 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -class UpdateFPGA : public QDialog -{ - Q_OBJECT - -public: - UpdateFPGA(const QString & pythonScriptPath, QWidget *parent = nullptr); - ~UpdateFPGA(); - void init(); - -private slots: - void startUpdate(); - void processFinished(int exitCode, QProcess::ExitStatus exitStatus); - void processError(QProcess::ProcessError error); - -private: - QString m_PythonScriptPath; - QLabel* m_Title; - QPushButton* m_CloseBtn; - QPushButton* m_UpdateButton; - QLabel* logLabel; - QTextEdit* logTextEdit; - QProcess* conversionProcess; - -// void init(); - QString getErrorDescription(int errorCode); - QString findValidPythonInterpreter(); - bool isValidPythonWithSerial(const QString& pythonPath); - -signals: - void upgradeFPGAFinished(); - -}; - +#pragma once + +#include +#include +#include +#include +#include +#include + +class UpdateFPGA : public QDialog +{ + Q_OBJECT + +public: + UpdateFPGA(const QString & pythonScriptPath, QWidget *parent = nullptr); + ~UpdateFPGA(); + void init(); + +private slots: + void startUpdate(); + void processFinished(int exitCode, QProcess::ExitStatus exitStatus); + void processError(QProcess::ProcessError error); + +private: + QString m_PythonScriptPath; + QLabel* m_Title; + QPushButton* m_CloseBtn; + QPushButton* m_UpdateButton; + QLabel* logLabel; + QTextEdit* logTextEdit; + QProcess* conversionProcess; + +// void init(); + QString getErrorDescription(int errorCode); + QString findValidPythonInterpreter(); + bool isValidPythonWithSerial(const QString& pythonPath); + +signals: + void upgradeFPGAFinished(); + +}; + diff --git a/WINPY_utf8.txt b/WINPY_utf8.txt index 93d917a..529c3b9 100644 --- a/WINPY_utf8.txt +++ b/WINPY_utf8.txt @@ -1,20915 +1,20915 @@ -安a -按a -爱a -阿a -暗a -啊a -埃a -碍a -凹a -奥a -岸a -矮a -案a -俺a -挨a -唉a -昂a -氨a -胺a -哎a -吖a -嗄a -腌a -锕a -安徽省ahs -爱ai -埃ai -碍ai -矮ai -挨ai -唉ai -哎ai -哀ai -皑ai -癌ai -蔼ai -艾ai -隘ai -呆*ai -捱ai -嗳ai -嗌ai -嫒ai -瑷ai -暧ai -砹ai -锿ai -霭ai -安an -按an -暗an -岸an -案an -俺an -氨an -胺an -鞍an -谙an -埯an -揞an -犴an -庵an -桉an -铵an -鹌an -黯an -昂ang -肮ang -盎ang -安徽anhui -凹ao -奥ao -敖ao -熬ao -翱ao -袄ao -傲ao -懊ao -澳ao -嚣*ao -坳ao -拗ao -嗷ao -岙ao -廒ao -遨ao -媪ao -骜ao -獒ao -聱ao -螯ao -鏊ao -鳌ao -鏖ao -不b -部b -本b -表b -把b -变b -比b -并b -别b -百b -报b -保b -病b -北b -被b -步b -边b -八b -办b -布b -把ba -八ba -吧ba -巴ba -拔ba -霸ba -罢ba -爸ba -坝ba -芭ba -捌ba -扒ba -叭ba -笆ba -疤ba -跋ba -靶ba -耙ba -茇ba -菝ba -岜ba -灞ba -钯ba -粑ba -鲅ba -魃ba -百bai -白bai -败bai -摆bai -伯*bai -柏bai -佰bai -拜bai -稗bai -捭bai -掰bai -办ban -半ban -板ban -班ban -般ban -版ban -拌ban -搬ban -斑ban -扳ban -伴ban -颁ban -扮ban -瓣ban -绊ban -阪ban -坂ban -钣ban -瘢ban -癍ban -舨ban -帮bang -棒bang -邦bang -榜bang -梆bang -膀bang -绑bang -磅bang -蚌bang -镑bang -傍bang -谤bang -蒡bang -浜bang -报bao -保bao -包bao -剥bao -薄bao -胞bao -暴bao -宝bao -饱bao -抱bao -爆bao -炮*bao -堡bao -刨*bao -苞bao -褒bao -雹bao -豹bao -鲍bao -曝*bao -瀑*bao -葆bao -孢bao -煲bao -鸨bao -褓bao -趵bao -龅bao -北bei -被bei -倍bei -备bei -背bei -辈bei -贝bei -杯bei -卑bei -臂*bei -悲bei -碑bei -钡bei -狈bei -惫bei -焙bei -孛bei -陂bei -邶bei -埤bei -萆bei -蓓bei -呗bei -悖bei -碚bei -鹎bei -褙bei -鐾bei -鞴bei -本ben -奔ben -苯ben -笨ben -夯*ben -畚ben -坌ben -贲ben -锛ben -本报benbao -奔波benbo -本部benbu -本厂benchang -奔驰benchi -本地bendi -奔放benfang -泵beng -崩beng -蚌*beng -绷beng -甭beng -蹦beng -迸beng -嘣beng -甏beng -比bi -必bi -避bi -闭bi -辟bi -笔bi -壁bi -臂bi -毕bi -彼bi -逼bi -币bi -鼻bi -蔽bi -秘*bi -鄙bi -碧bi -蓖bi -毙bi -毖bi -庇bi -痹bi -敝bi -弊bi -陛bi -拂*bi -泌*bi -匕bi -俾bi -埤*bi -芘*bi -荜bi -荸bi -萆*bi -薜bi -吡bi -哔bi -狴bi -庳bi -愎bi -滗bi -濞bi -弼bi -妣bi -婢bi -嬖bi -璧bi -贲*bi -睥*bi -畀bi -铋bi -秕bi -裨bi -筚bi -箅bi -篦bi -舭bi -襞bi -跸bi -髀bi -变bian -边bian -便bian -编bian -遍bian -辩bian -扁bian -辨bian -鞭bian -贬bian -卞bian -辫bian -匾bian -弁bian -苄bian -忭bian -汴bian -缏bian -飚bian -煸bian -砭bian -碥bian -窆bian -褊bian -蝙bian -笾bian -鳊bian -表biao -标biao -彪biao -膘biao -勺*biao -婊biao -骠biao -杓biao -飑biao -飙biao -镖biao -镳biao -瘭biao -裱biao -鳔biao -髟biao -别bie -鳖bie -憋bie -瘪bie -蹩bie -宾bin -彬bin -斌bin -濒bin -滨bin -摈bin -傧bin -豳bin -缤bin -玢bin -槟bin -殡bin -膑bin -镔bin -髌bin -鬓bin -并bing -病bing -兵bing -柄bing -冰bing -丙bing -饼bing -秉bing -炳bing -屏*bing -禀bing -邴bing -摒bing -槟*bing -波bo -播bo -剥*bo -伯bo -拨bo -薄*bo -博bo -勃bo -驳bo -玻bo -泊bo -柏*bo -卜*bo -菠bo -钵bo -搏bo -铂bo -箔bo -帛bo -舶bo -脖bo -膊bo -渤bo -魄*bo -孛*bo -亳bo -啵bo -饽bo -檗bo -掰*bo -擘bo -礴bo -钹bo -鹁bo -簸bo -趵*bo -跛bo -踣bo -不bu -部bu -步bu -布bu -补bu -捕bu -埔*bu -卜bu -堡*bu -哺bu -埠bu -簿bu -怖bu -卟bu -逋bu -瓿bu -晡bu -钚bu -钸bu -醭bu -不安buan -不比bubi -不必bubi -不变bubian -不便bubian -步兵bubing -步步bubu -不曾buceng -补偿buchang -不啻buchi -补充buchong -不错bucuo -不大buda -不待budai -不但budan -不当budang -不得bude -不等budeng -步调budiao -不动budong -不断buduan -不对budui -部队budui -不法bufa -补发bufa -步伐bufa -不凡bufan -不妨bufang -不分bufen -部分bufen -不服bufu -不符bufu -不该bugai -不敢bugan -不甘bugan -布告bugao -不够bugou -不顾bugu -不管buguan -不过buguo -不会buhui -补给buji -部件bujian -不借bujie -不尽bujin -不仅bujin -不禁bujin -布景bujing -不久bujiu -补救bujiu -布局buju -不堪bukan -不可buke -不快bukuai -不愧bukui -不理buli -不利buli -不良buliang -不料buliao -步履bulu -不论bulun -部落buluo -不满buman -部门bumen -不免bumian -不能buneng -不怕bupa -补品bupin -不平buping -步枪buqiang -不屈buqu -不然buran -不如buru -不少bushao -不是bushi -不识bushi -部首bushou -部属bushu -部署bushu -补贴butie -不同butong -不妥butuo -部位buwei -部委buwei -不问buwen -不惜buxi -补习buxi -部下buxia -不行buxing -不幸buxing -步行buxing -不朽buxiu -不许buxu -哺养buyang -不要buyao -不宜buyi -不用buyong -哺育buyu -不在buzai -部长buzhang -不振buzhen -不只buzhi -不止buzhi -不知buzhi -不致buzhi -布置buzhi -步骤buzhou -补助buzhu -捕捉buzhuo -步子buzi -不足buzu -博物馆bwg -产c -成c -出c -长c -从c -此c -常c -处c -车c -场c -传c -采c -层c -厂c -才c -次c -虫c -除c -查c -差c -擦ca -拆*ca -嚓ca -礤ca -采cai -才cai -材cai -菜cai -财cai -裁cai -彩cai -猜cai -睬cai -踩cai -蔡cai -参can -残can -蚕can -灿can -餐can -惭can -惨can -孱can -骖can -璨can -粲can -黪can -惨案canan -惨白canbai -残暴canbao -惨怛canda -残废canfei -藏cang -仓cang -苍cang -舱cang -沧cang -苍白cangbai -仓促cangcu -仓库cangku -苍老canglao -苍茫cangmang -藏匿cangni -苍穹cangqiong -沧桑cangsang -苍天cangtian -参观canguan -残骸canhai -残疾canji -参加canjia -参见canjian -残局canju -惨剧canju -参军canjun -参看cankan -参考cankao -残酷canku -惭愧cankui -灿烂canlan -参谋canmou -残缺canque -残忍canren -孱弱canruo -残杀cansha -残生cansheng -蚕食canshi -参数canshu -惨痛cantong -参与canyu -残余canyu -残月canyue -参阅canyue -参赞canzan -惨遭canzao -参战canzhan -参照canzhao -参政canzheng -惨重canzhong -草cao -槽cao -操cao -糙cao -曹cao -嘈cao -漕cao -螬cao -艚cao -草案caoan -草稿caogao -槽糕caogao -操劳caolao -操练caolian -草率caolu -草木caomu -草拟caoni -草签caoqian -操心caoxin -草原caoyuan -嘈杂caoza -操纵caozong -操作caozuo -差不多cbd -成本核算cbhs -出版社cbs -层出不穷ccbq -从长计议ccjy -存储器ccq -长春市ccs -成都市cds -测ce -策ce -侧ce -册ce -厕ce -恻ce -测定ceding -策动cedong -策反cefan -策划cehua -测量celiang -策略celue -侧面cemian -参*cen -岑cen -涔cen -涔涔cencen -层ceng -曾*ceng -蹭ceng -层层cengceng -层次cengci -曾经cengjing -测试ceshi -厕所cesuo -测验ceyan -侧重cezhong -出发点cfd -充分发挥cffh -唱高调cgd -从古到今cgdj -查cha -差cha -插cha -察cha -茶cha -叉cha -茬cha -碴cha -搽cha -岔cha -诧cha -刹*cha -喳*cha -嚓*cha -猹cha -馇cha -汊cha -姹cha -杈cha -楂cha -槎cha -檫cha -锸cha -镲cha -衩cha -查办chaban -差别chabie -差错chacuo -差点chadian -查对chadui -差额chae -查访chafang -察访chafang -查封chafeng -查获chahuo -差*chai -柴chai -拆chai -豺chai -侪chai -钗chai -瘥chai -虿chai -拆穿chaichuan -豺狼chailang -拆散chaisan -差使chaishi -拆卸chaixie -柴油chaiyou -差价chajia -差距chaju -察觉chajue -查看chakan -察看chakan -查考chakao -查明chaming -产chan -单*chan -铲chan -阐chan -搀chan -掺chan -蝉chan -馋chan -谗chan -缠chan -颤chan -冁chan -谄chan -蒇chan -廛chan -忏chan -潺chan -澶chan -孱*chan -羼chan -婵chan -骣chan -觇chan -禅chan -镡chan -蟾chan -躔chan -铲除chanchu -产地chandi -阐发chanfa -搀扶chanfu -长chang -常chang -场chang -厂chang -唱chang -肠chang -昌chang -倡chang -偿chang -畅chang -猖chang -尝chang -敞chang -裳*chang -倘*chang -伥chang -鬯chang -苌chang -菖chang -徜chang -怅chang -惝chang -阊chang -娼chang -嫦chang -昶chang -氅chang -鲳chang -长安changan -常常changchang -长城changcheng -长春changchun -畅达changda -倡导changdao -长度changdu -长短changduan -唱歌changge -常规changgui -长河changhe -场合changhe -偿还changhuan -厂家changjia -常见changjian -长江changjiang -长久changjiu -猖獗changjue -长空changkong -畅快changkuai -猖狂changkuang -场面changmian -长眠changmian -长年changnian -长篇changpian -长期changqi -长驱changqu -常任changren -长沙changsha -厂商changshang -常识changshi -尝试changshi -长寿changshou -常数changshu -场所changsuo -畅谈changtan -长途changtu -怅惘changwang -常委changwei -倘未changwei -常温changwen -常务changwu -畅想changxiang -畅销changxiao -倡议changyi -畅饮changyin -常用changyong -常有changyou -畅游changyou -长远changyuan -厂长changzhang -长征changzheng -厂址changzhi -常驻changzhu -婵娟chanjuan -蝉联chanlian -产量chanliang -缠绵chanmian -阐明chanming -产品chanpin -产权chanquan -缠绕chanrao -产生chansheng -禅师chanshi -阐述chanshu -产物chanwu -产销chanxiao -产业chanye -产值chanzhi -朝chao -超chao -潮chao -巢chao -抄chao -钞chao -嘲chao -吵chao -炒chao -绰*chao -剿*chao -怊chao -晁chao -焯*chao -耖chao -抄报chaobao -超产chaochan -超出chaochu -朝代chaodai -超额chaoe -嘲讽chaofeng -超过chaoguo -朝晖chaohui -超级chaoji -吵架chaojia -潮解chaojie -潮流chaoliu -抄录chaolu -吵闹chaonao -嘲弄chaonong -潮湿chaoshi -潮水chaoshui -抄送chaosong -超脱chaotuo -抄袭chaoxi -朝鲜chaoxian -嘲笑chaoxiao -巢穴chaoxue -朝阳chaoyang -朝野chaoye -超越chaoyue -超支chaozhi -查清chaqing -插曲chaqu -插入charu -查哨chashao -插手chashou -查收chashou -插图chatu -查问chawen -查询chaxun -茶叶chaye -差异chayi -查阅chayue -查证chazheng -岔子chazi -插足chazu -车che -彻che -尺*che -撤che -扯che -掣che -澈che -坼che -砗che -彻底chedi -车祸chehuo -车间chejian -车辆cheliang -陈chen -沉chen -称chen -衬chen -尘chen -臣chen -晨chen -沈*chen -郴chen -辰chen -忱chen -趁chen -伧chen -谌chen -谶chen -抻chen -嗔chen -宸chen -琛chen -榇chen -碜chen -龀chen -尘埃chenai -沉淀chendian -陈腐chenfu -沉浮chenfu -成cheng -程cheng -称cheng -城cheng -承cheng -乘cheng -呈cheng -盛*cheng -撑cheng -诚cheng -橙cheng -惩cheng -澄cheng -逞cheng -骋cheng -秤cheng -丞cheng -埕cheng -噌cheng -枨cheng -柽cheng -塍cheng -瞠cheng -铖cheng -铛cheng -裎cheng -蛏cheng -酲cheng -成败chengbai -承办chengban -惩办chengban -呈报chengbao -承包chengbao -成本chengben -成材chengcai -惩处chengchu -乘除chengchu -承担chengdan -承当chengdang -成都chengdu -程度chengdu -乘法chengfa -惩罚chengfa -成功chenggong -成规chenggui -成果chengguo -称号chenghao -称呼chenghu -成绩chengji -乘机chengji -成家chengjia -成见chengjian -成交chengjiao -承接chengjie -惩戒chengjie -成就chengjiu -乘客chengke -诚恳chengken -成立chengli -乘凉chengliang -成名chengming -成年chengnian -成批chengpi -成品chengpin -诚朴chengpu -逞强chengqiang -澄清chengqing -城区chengqu -成全chengquan -诚然chengran -成人chengren -承认chengren -成色chengse -成事chengshi -诚实chengshi -城市chengshi -承受chengshou -成熟chengshu -成为chengwei -称谓chengwei -成文chengwen -呈现chengxian -呈献chengxian -城乡chengxiang -成效chengxiao -称心chengxin -诚心chengxin -程序chengxu -乘虚chengxu -撑腰chengyao -诚意chengyi -成语chengyu -成员chengyuan -称赞chengzan -成长chengzhang -城镇chengzhen -称职chengzhi -诚挚chengzhi -趁机chenji -沉积chenji -陈迹chenji -沉浸chenjin -沉静chenjing -陈旧chenjiu -陈列chenlie -沉沦chenlun -沉闷chenmen -沉湎chenmian -沉默chenmo -沉溺chenni -陈设chenshe -陈述chenshu -陈说chenshuo -沉思chensi -沉痛chentong -衬托chentuo -沉吟chenyin -衬映chenying -趁早chenzao -沉重chenzhong -沉着chenzhuo -车皮chepi -扯皮chepi -撤退chetui -撤消chexiao -车站chezhan -撤职chezhi -持chi -尺chi -齿chi -吃chi -赤chi -池chi -迟chi -翅chi -斥chi -耻chi -痴chi -匙chi -弛chi -驰chi -侈chi -炽chi -傺chi -坻chi -墀chi -茌chi -叱chi -哧chi -啻chi -嗤chi -彳chi -饬chi -媸chi -敕chi -眵chi -鸱chi -瘛chi -褫chi -蚩chi -螭chi -笞chi -篪chi -豉chi -踟chi -魑chi -翅膀chibang -赤诚chicheng -驰骋chicheng -尺寸chicun -迟到chidao -赤道chidao -尺度chidu -迟钝chidun -吃喝chihe -迟缓chihuan -吃紧chijin -吃惊chijing -持久chijiu -吃苦chiku -吃亏chikui -吃力chili -炽烈chilie -齿轮chilun -持平chiping -痴情chiqing -炽热chire -耻辱chiru -池塘chitang -耻笑chixiao -赤心chixin -痴心chixin -迟疑chiyi -迟早chizao -斥责chize -叱咤chizha -持重chizhong -吃重chizhong -赤字chizi -催化剂chj -种*chong -虫chong -重*chong -充chong -冲chong -崇chong -涌*chong -宠chong -茺chong -忡chong -憧chong -铳chong -舂chong -艟chong -宠爱chongai -崇拜chongbai -充斥chongchi -冲刺chongci -冲淡chongdan -充当chongdang -重叠chongdie -冲动chongdong -宠儿chonger -充分chongfen -冲锋chongfeng -重复chongfu -崇高chonggao -重合chonghe -重婚chonghun -冲击chongji -重建chongjian -崇敬chongjing -憧憬chongjing -充满chongman -充沛chongpei -冲破chongpo -重庆chongqing -崇尚chongshang -重申chongshen -充实chongshi -冲刷chongshua -冲天chongtian -冲突chongtu -重温chongwen -冲洗chongxi -重新chongxin -重演chongyan -重印chongyin -充裕chongyu -充足chongzu -抽chou -仇chou -臭chou -酬chou -畴chou -踌chou -稠chou -愁chou -筹chou -绸chou -瞅chou -丑chou -俦chou -帱chou -惆chou -瘳chou -雠chou -筹办chouban -筹备choubei -惆怅chouchang -抽搐chouchu -踌躇chouchu -筹措choucuo -抽调choudiao -丑恶choue -仇恨chouhen -丑化chouhua -筹划chouhua -筹集chouji -筹建choujian -酬金choujin -抽空choukong -酬劳choulao -丑陋choulou -筹码chouma -稠密choumi -筹谋choumou -愁容chourong -抽象chouxiang -酬谢chouxie -抽噎chouye -出chu -处chu -除chu -初chu -础chu -触chu -楚chu -锄chu -储chu -畜*chu -橱chu -厨chu -躇chu -雏chu -滁chu -矗chu -搐chu -亍chu -刍chu -怵chu -憷chu -绌chu -杵chu -楮chu -樗chu -褚chu -蜍chu -蹰chu -黜chu -揣chuai -搋chuai -啜chuai -嘬*chuai -膪chuai -踹chuai -揣度chuaidu -揣摩chuaimo -传chuan -船chuan -穿chuan -串chuan -川chuan -椽chuan -喘chuan -舛chuan -遄chuan -巛chuan -氚chuan -钏chuan -舡chuan -传遍chuanbian -传标chuanbiao -传播chuanbo -船舶chuanbo -船埠chuanbu -穿插chuancha -传达chuanda -传单chuandan -传导chuandao -传递chuandi -床chuang -创chuang -窗chuang -闯chuang -疮chuang -幢chuang -怆chuang -创办chuangban -闯荡chuangdang -窗户chuanghu -创见chuangjian -创建chuangjian -闯劲chuangjin -创举chuangju -窗口chuangkou -创立chuangli -窗帘chuanglian -创始chuangshi -创新chuangxin -创业chuangye -创造chuangzao -创作chuangzuo -串联chuanlian -喘气chuanqi -传奇chuanqi -传染chuanran -传授chuanshou -传输chuanshu -传述chuanshu -传说chuanshuo -传送chuansong -传统chuantong -串通chuantong -喘息chuanxi -传讯chuanxun -传扬chuanyang -传阅chuanyue -传真chuanzhen -船只chuanzhi -穿着chuanzhuo -出版chuban -出榜chubang -储备chubei -出兵chubing -初步chubu -储藏chucang -出差chucha -出产chuchan -出场chuchang -出厂chuchang -处处chuchu -橱窗chuchuang -初次chuci -储存chucun -初等chudeng -出动chudong -触动chudong -出发chufa -触发chufa -除法chufa -处罚chufa -触犯chufan -出访chufang -除非chufei -处分chufen -出轨chugui -出海chuhai -吹chui -垂chui -锤chui -椎*chui -炊chui -捶chui -陲chui -棰chui -槌chui -吹棒chuibang -吹风chuifeng -吹拂chuifu -锤炼chuilian -吹牛chuiniu -垂青chuiqing -垂涎chuixian -吹嘘chuixu -垂直chuizhi -初级chuji -出击chuji -出界chujie -出境chujing -处境chujing -处决chujue -触觉chujue -除开chukai -出口chukou -出来chulai -除了chule -出力chuli -处理chuli -矗立chuli -初恋chulian -出笼chulong -出路chulu -出马chuma -出卖chumai -出面chumian -出名chuming -除名chuming -出没chumo -春chun -纯chun -醇chun -椿chun -唇chun -淳chun -蠢chun -莼chun -鹑chun -蝽chun -出纳chuna -春播chunbo -纯粹chuncui -纯度chundu -春分chunfen -春风chunfeng -春耕chungeng -春光chunguang -醇厚chunhou -春辉chunhui -春季chunji -春节chunjie -纯洁chunjie -纯净chunjing -纯利chunli -纯朴chunpu -春秋chunqiu -春色chunse -春笋chunsun -春天chuntian -处女chunu -触怒chunu -春意chunyi -纯真chunzhen -纯正chunzheng -戳chuo -绰chuo -啜*chuo -辍chuo -踔chuo -龊chuo -戳穿chuochuan -绰号chuohao -啜泣chuoqi -出品chupin -出奇chuqi -初期chuqi -出勤chuqin -出去chuqu -出让churang -出任churen -出入churu -出色chuse -出身chushen -出神chushen -出生chusheng -畜生chusheng -出事chushi -出世chushi -处世chushi -厨师chushi -出售chushou -处所chusuo -出庭chuting -锄头chutou -出土chutu -出外chuwai -除外chuwai -出席chuxi -出息chuxi -除夕chuxi -出现chuxian -初小chuxiao -雏形chuxing -储蓄chuxu -刍议chuyi -处于chuyu -初战chuzhan -处长chuzhang -出诊chuzhen -出征chuzheng -处置chuzhi -初中chuzhong -出租chuzu -此ci -次ci -刺ci -磁ci -雌ci -词ci -茨ci -疵ci -辞ci -慈ci -瓷ci -赐ci -伺*ci -兹*ci -茈ci -呲ci -祠ci -鹚ci -糍ci -慈爱ciai -辞别cibie -磁场cichang -磁带cidai -磁道cidao -此地cidi -词典cidian -辞典cidian -刺耳cier -词根cigen -刺骨cigu -此后cihou -词汇cihui -刺激ciji -赐教cijiao -此刻cike -刺客cike -词类cilei -辞令ciling -磁盘cipan -次品cipin -辞去ciqu -刺杀cisha -此时cishi -次数cishu -辞书cishu -词素cisu -祠堂citang -辞退citui -此外ciwai -慈祥cixiang -辞行cixing -词性cixing -雌雄cixiong -次序cixu -词序cixu -刺眼ciyan -次要ciyao -词语ciyu -赐予ciyu -此致cizhi -辞职cizhi -词缀cizhui -词组cizu -超级大国cjdg -参考书cks -参考消息ckxx -参考资料ckzl -触类旁通clpt -藏龙卧虎clwh -参谋长cmc -聪明才智cmcz -出谋划策cmhc -从难从严cncy -从cong -丛cong -聪cong -葱cong -囱cong -匆cong -苁cong -淙cong -骢cong -琮cong -璁cong -从此congci -匆匆congcong -匆促congcu -从而conger -从犯congfan -聪慧conghui -从来conglai -丛林conglin -匆忙congmang -聪明congming -从前congqian -从容congrong -从事congshi -丛书congshu -从速congsu -从新congxin -从严congyan -聪颖congying -葱郁congyu -从中congzhong -凑cou -楱cou -辏cou -腠cou -凑合couhe -凑巧couqiao -成品率cpl -成千上万cqsw -从容不迫crbp -承认错误crcw -趁热打铁crdt -措手不及csbj -出生率csl -长沙市css -炊事员csy -彻头彻尾ctcw -垂头丧气ctsq -粗cu -促cu -醋cu -簇cu -卒*cu -蔟cu -徂cu -猝cu -殂cu -酢cu -蹙cu -蹴cu -篡cuan -蹿cuan -窜cuan -攒*cuan -汆cuan -撺cuan -爨cuan -镩cuan -篡夺cuanduo -窜犯cuanfan -篡改cuangai -篡权cuanquan -粗暴cubao -粗糙cucao -粗犷cuguang -催cui -脆cui -淬cui -粹cui -摧cui -衰*cui -崔cui -瘁cui -翠cui -萃cui -啐cui -悴cui -璀cui -榱cui -毳cui -隹cui -摧残cuican -脆弱cuiruo -促进cujin -存cun -村cun -寸cun -蹲*cun -忖cun -皴cun -存储cunchu -存档cundang -存放cunfang -存款cunkuan -村落cunluo -存亡cunwang -存在cunzai -村镇cunzhen -村庄cunzhuang -村子cunzi -错cuo -措cuo -撮cuo -磋cuo -搓cuo -挫cuo -厝cuo -嵯cuo -脞cuo -锉cuo -矬cuo -痤cuo -瘥*cuo -鹾cuo -蹉cuo -错案cuoan -挫败cuobai -错处cuochu -措辞cuoci -错怪cuoguai -错过cuoguo -撮合cuohe -错觉cuojue -磋商cuoshang -挫伤cuoshang -措施cuoshi -错误cuowu -挫折cuozhe -错综cuozong -粗浅cuqian -促使cushi -粗俗cusu -粗心cuxin -粗壮cuzhuang -常委会cwh -崇文区cwq -常务委员会cwwh -乘务员cwy -诚心诚意cxcy -程序控制cxkz -程序设计cxsj -长远利益cyly -朝阳区cyq -财政部czb -错综复杂czfz -操之过急czgj -出租汽车czqc -此之外czw -财政危机czwj -创造性czx -操作系统czxt -操作员czy -持之以恒czyh -的d -大d -地d -动d -到d -对d -度d -多d -电d -党d -得d -定d -等d -斗d -当d -队d -都d -点d -代d -道d -大da -打da -达da -答da -搭da -塔*da -瘩da -耷da -哒da -嗒da -怛da -妲da -沓*da -疸da -褡da -笪da -靼da -鞑da -答案daan -打败dabai -大办daban -大半daban -打扮daban -答辩dabian -大伯dabo -大部dabu -达成dacheng -大胆dadan -搭档dadang -大道dadao -达到dadao -打倒dadao -大地dadi -大敌dadi -大抵dadi -打断daduan -大队dadui -大多daduo -大凡dafan -大夫dafu -大幅dafu -答复dafu -大概dagai -大纲dagang -大国daguo -大海dahai -大好dahao -大河dahe -大亨daheng -大会dahui -大*dai -代dai -带dai -待dai -袋dai -戴dai -呆dai -歹dai -傣dai -殆dai -贷dai -逮dai -怠dai -埭dai -甙dai -呔dai -岱dai -迨dai -骀dai -绐dai -玳dai -黛dai -呆板daiban -代表daibiao -逮捕daibu -逮逋daibu -代词daici -带动daidong -怠工daigong -代价daijia -贷款daikuan -带来dailai -代理daili -带领dailing -带路dailu -黛绿dailu -代码daima -怠慢daiman -待命daiming -代数daishu -代替daiti -带头daitou -歹徒daitu -待遇daiyu -呆滞daizhi -呆子daizi -打击daji -大家dajia -打搅dajiao -大街dajie -大捷dajie -打劫dajie -搭救dajiu -大局daju -答卷dajuan -打开dakai -耷拉dala -大力dali -大连dalian -大量daliang -打量daliang -大陆dalu -大略dalue -大妈dama -单dan -但dan -弹dan -担dan -石*dan -蛋dan -淡dan -胆dan -氮dan -丹dan -旦dan -耽dan -郸dan -掸dan -惮dan -诞dan -儋dan -萏dan -啖dan -澹*dan -殚dan -赕dan -眈dan -疸dan -瘅dan -聃dan -箪dan -大脑danao -担保danbao -单薄danbao -淡薄danbao -单产danchan -诞辰danchen -单纯danchun -单词danci -担当dandang -单调dandiao -单独dandu -单方danfang -担负danfu -党dang -当dang -档dang -挡dang -荡dang -谠dang -凼dang -菪dang -宕dang -砀dang -裆dang -单干dangan -胆敢dangan -档案dangan -当场dangchang -当初dangchu -当代dangdai -当地dangdi -单个dange -耽搁dange -党风dangfeng -党纲danggang -党纪dangji -党籍dangji -当即dangji -当家dangjia -当今dangjin -当局dangju -当量dangliang -当面dangmian -党内dangnei -当年dangnian -党派dangpai -当铺dangpu -当前dangqian -当然dangran -当日dangri -当时dangshi -当天dangtian -当头dangtou -党团dangtuan -当晚dangwan -党委dangwei -当先dangxian -党校dangxiao -当心dangxin -党性dangxing -荡漾dangyang -党员dangyuan -当月dangyue -党章dangzhang -当真dangzhen -党政dangzheng -当政dangzheng -当中dangzhong -当众dangzhong -当做dangzuo -单价danjia -担架danjia -胆量danliang -胆略danlue -淡漠danmo -胆怯danqie -丹青danqing -担任danren -单身danshen -诞生dansheng -但是danshi -胆识danshi -单体danti -丹田dantian -单位danwei -耽误danwu -单项danxiang -胆小danxiao -担心danxin -淡雅danya -弹药danyao -单一danyi -单元danyuan -但愿danyuan -单质danzhi -担子danzi -掸子danzi -单字danzi -到dao -道dao -导dao -刀dao -倒dao -稻dao -岛dao -捣dao -盗dao -蹈dao -祷dao -悼dao -叨dao -帱*dao -忉dao -氘dao -焘*dao -纛dao -倒闭daobi -到处daochu -悼词daoci -到达daoda -导弹daodan -道德daode -到底daodi -倒戈daoge -捣鬼daogui -捣毁daohui -到来daolai -到了daole -道理daoli -倒立daoli -道路daolu -捣乱daoluan -倒霉daomei -叨念daonian -道歉daoqian -刀枪daoqiang -盗窃daoqie -到时daoshi -导师daoshi -倒数daoshu -导体daoti -倒退daotui -导演daoyan -道义daoyi -盗用daoyong -岛屿daoyu -导致daozhi -大批dapi -大破dapo -打破dapo -大气daqi -大庆daqing -打扰darao -打扫dasao -大厦dasha -搭讪dashan -大赦dashe -大使dashi -大事dashi -大师dashi -大势dashi -大肆dasi -打算dasuan -大体dati -大厅dating -打听dating -大同datong -大小daxiao -大写daxie -答谢daxie -大选daxuan -大学daxue -大业daye -达因dayin -打印dayin -答应daying -大于dayu -大院dayuan -大约dayue -打仗dazhang -大致dazhi -大众dazhong -打字dazi -代办处dbc -得不偿失dbcs -大部分dbf -电报挂号dbgh -大不了dbl -大步流星dblx -对不起dbq -代表团dbt -电冰箱dbx -东城区dcq -到此为止dcwz -独创性dcx -调查研究dcyj -打成一片dcyp -打电话ddh -电动机ddj -对得起ddq -大多数dds -的de -得de -地*de -德de -底*de -锝de -得逞decheng -的当dedang -得当dedang -得到dedao -得分defen -德国deguo -得奖dejiang -得救dejiu -得了dele -得力deli -等deng -灯deng -登deng -邓deng -澄*deng -蹬deng -瞪deng -凳deng -噔deng -嶝deng -戥deng -磴deng -镫deng -簦deng -登场dengchang -等待dengdai -等到dengdao -灯光dengguang -等候denghou -等级dengji -登记dengji -等价dengjia -灯具dengju -登门dengmen -灯谜dengmi -登攀dengpan -登山dengshan -灯塔dengta -登台dengtai -等同dengtong -等闲dengxian -等于dengyu -登载dengzai -得胜desheng -得失deshi -得体deti -德行dexing -得以deyi -得意deyi -德育deyu -得志dezhi -得知dezhi -得罪dezui -大幅度dfd -多方面dfm -单方面dfm -电风扇dfs -大规模dgm -多功能dgn -大公无私dgws -帝国主义dgzy -电话号码dhhm -电化教育dhjy -大会堂dht -的*di -地di -第di -低di -敌di -底di -提*di -帝di -抵di -滴di -弟di -递di -堤di -迪di -笛di -狄di -涤di -翟di -嫡di -蒂di -缔di -氐di -籴di -诋di -谛di -邸di -坻*di -荻di -嘀di -娣di -绨di -柢di -棣di -觌di -砥di -碲di -睇di -镝di -羝di -骶di -嗲dia -电dian -点dian -垫dian -典dian -店dian -颠dian -淀dian -掂dian -滇dian -碘dian -靛dian -佃dian -甸dian -惦dian -奠dian -殿dian -阽dian -坫dian -巅dian -玷dian -钿dian -癜dian -癫dian -簟dian -踮dian -电报dianbao -点播dianbo -电场dianchang -电车dianche -电池dianchi -电传dianchuan -颠倒diandao -电灯diandeng -点滴diandi -奠定dianding -电动diandong -典范dianfan -淀粉dianfen -垫付dianfu -颠覆dianfu -电感diangan -典故diangu -电荷dianhe -电弧dianhu -电话dianhua -电汇dianhui -电机dianji -电极dianji -奠基dianji -惦记dianji -典籍dianji -点将dianjiang -电解dianjie -殿军dianjun -癫狂diankuang -电缆dianlan -电力dianli -电离dianli -典礼dianli -电流dianliu -电路dianlu -电脑diannao -电能dianneng -店铺dianpu -电气dianqi -电器dianqi -点燃dianran -电容dianrong -电扇dianshan -电视dianshi -电台diantai -电梯dianti -点头diantou -电网dianwang -电位dianwei -玷污dianwu -殿下dianxia -电线dianxian -癫痫dianxian -电信dianxin -典型dianxing -电讯dianxun -电压dianya -电影dianying -店员dianyuan -点阵dianzhen -点缀dianzhui -电子dianzi -点子dianzi -电阻dianzu -调diao -掉diao -吊diao -鸟*diao -碉diao -叼diao -雕diao -凋diao -刁diao -钓diao -铞diao -铫diao -貂diao -鲷diao -碉堡diaobao -凋敝diaobi -调查diaocha -吊车diaoche -调动diaodong -调度diaodu -钓饵diaoer -调换diaohuan -掉换diaohuan -雕刻diaoke -调令diaoling -刁难diaonan -调遣diaoqian -调任diaoren -雕塑diaosu -吊唁diaoyan -调用diaoyong -钓鱼diaoyu -调子diaozi -第八diba -地板diban -地步dibu -低沉dichen -抵触dichu -抵达dida -地带didai -低档didang -抵挡didang -地道didao -弟弟didi -地点didian -地段diduan -敌对didui -迭die -跌die -爹die -碟die -蝶die -谍die -叠die -垤die -堞die -揲die -喋die -牒die -瓞die -耋die -踮*die -蹀die -鲽die -迭起dieqi -第二dier -地方difang -低估digu -敌国diguo -帝国diguo -敌后dihou -诋毁dihui -低级diji -递加dijia -递减dijian -地窖dijiao -递交dijiao -缔交dijiao -缔结dijie -第九dijiu -敌军dijun -抵抗dikang -地牢dilao -地理dili -低劣dilie -第六diliu -低落diluo -地貌dimao -地面dimian -抵命diming -定ding -顶ding -钉ding -丁ding -订ding -盯ding -叮ding -鼎ding -锭ding -仃ding -啶ding -玎ding -腚ding -碇ding -町ding -铤*ding -疔ding -耵ding -酊ding -定案dingan -定产dingchan -丁当dingdang -顶点dingdian -定夺dingduo -定额dinge -顶峰dingfeng -顶锋dingfeng -定购dinggou -订购dinggou -订户dinghu -定货dinghuo -订货dinghuo -定价dingjia -定局dingju -定居dingju -定理dingli -订立dingli -鼎立dingli -定量dingliang -定律dinglu -定期dingqi -定然dingran -盯梢dingshao -定时dingshi -顶替dingti -定性dingxing -定型dingxing -定义dingyi -定语dingyu -定员dingyuan -订阅dingyue -订正dingzheng -叮嘱dingzhu -顶撞dingzhuang -钉子dingzi -嫡派dipai -地盘dipan -第七diqi -嫡亲diqin -敌情diqing -地球diqiu -地区diqu -的确dique -敌人diren -第三disan -地势dishi -第十dishi -滴水dishui -第四disi -地铁ditie -地图ditu -丢diu -铥diu -丢掉diudiao -丢脸diulian -丢失diushi -地位diwei -敌伪diwei -第五diwu -嫡系dixi -底细dixi -地下dixia -低下dixia -底下dixia -地形dixing -弟兄dixiong -第一diyi -敌意diyi -地域diyu -抵御diyu -缔造dizao -递增dizeng -地震dizhen -敌阵dizhen -地质dizhi -地址dizhi -抵制dizhi -底子dizi -弟子dizi -党纪国法djgf -当机立断djld -多劳多得dldd -大力发展dlfz -大力加强dljq -大力开展dlkz -独立自主dlzz -多面手dms -对内搞活dngh -多年来dnl -东南亚dny -动dong -东dong -冬dong -懂dong -洞dong -冻dong -董dong -栋dong -侗dong -恫dong -垌dong -咚dong -岽dong -峒dong -氡dong -胨dong -胴dong -硐dong -鸫dong -东北dongbei -东边dongbian -东部dongbu -洞察dongcha -动词dongci -动荡dongdang -懂得dongde -东方dongfang -东风dongfeng -动工donggong -东海donghai -恫吓donghe -动机dongji -冬季dongji -东家dongjia -冻结dongjie -动静dongjing -东京dongjing -动力dongli -动量dongliang -栋梁dongliang -动乱dongluan -动脉dongmai -东南dongnan -东欧dongou -动人dongren -动身dongshen -董事dongshi -动手dongshou -动态dongtai -冬天dongtian -动听dongting -动物dongwu -东西dongxi -洞悉dongxi -动向dongxiang -动心dongxin -东亚dongya -东洋dongyang -动摇dongyao -动用dongyong -动员dongyuan -动辄dongzhe -动作dongzuo -斗dou -都*dou -豆dou -读*dou -兜dou -抖dou -陡dou -逗dou -痘dou -蔸dou -窦dou -蚪dou -篼dou -兜风doufeng -逗号douhao -逗留douliu -斗室doushi -兜售doushou -斗争douzheng -斗志douzhi -斗智douzhi -抖嘴douzui -打破常规dpcg -地平线dpx -电器化dqh -待人接物drjw -第三产业dscy -第十二届dsej -大使馆dsg -到时候dsh -电视机dsj -多少年dsn -大失所望dssw -电视台dst -低三下四dsxs -第十一届dsyj -大踏步dtb -到头来dtl -大体上dts -大同小异dtxy -度du -都du -毒du -独du -读du -渡du -杜du -堵du -镀du -顿du -督du -犊du -睹du -赌du -肚du -妒du -芏du -嘟du -渎du -椟du -牍du -蠹du -笃du -髑du -黩du -断duan -端duan -段duan -短duan -锻duan -缎duan -椴duan -煅duan -簖duan -短波duanbo -短处duanchu -短促duancu -断定duanding -短短duanduan -断交duanjiao -断绝duanjue -锻练duanlian -锻炼duanlian -短路duanlu -段落duanluo -短评duanping -短期duanqi -短缺duanque -断然duanran -煅烧duanshao -断送duansong -短途duantu -端午duanwu -端详duanxiang -短小duanxiao -断言duanyan -端阳duanyang -短语duanyu -短暂duanzan -端正duanzheng -端庄duanzhuang -读报dubao -读本duben -赌博dubo -独裁ducai -毒草ducao -独唱duchang -独创duchuang -督促ducu -毒打duda -独到dudao -度过duguo -毒害duhai -毒化duhua -都会duhui -对dui -队dui -堆dui -敦*dui -兑dui -怼dui -憝dui -碓dui -对比duibi -队部duibu -对策duice -对称duichen -对此duici -对待duidai -对等duideng -对调duidiao -对方duifang -对付duifu -对话duihua -兑换duihuan -对讲duijiang -对抗duikang -对口duikou -对垒duilei -对立duili -对联duilian -队列duilie -对流duiliu -对面duimian -对内duinei -对偶duiou -对手duishou -对数duishu -对外duiwai -队伍duiwu -兑现duixian -对象duixiang -对应duiying -对于duiyu -队员duiyuan -堆栈duizhan -队长duizhang -对照duizhao -对证duizheng -对质duizhi -对峙duizhi -对准duizhun -镀金dujin -杜绝dujue -渡口dukou -都来dulai -独立duli -度量duliang -盾dun -吨dun -顿dun -蹲dun -敦dun -墩dun -囤dun -钝dun -遁dun -沌dun -炖dun -砘dun -礅dun -盹dun -镦dun -趸dun -蹲点dundian -顿号dunhao -囤积dunji -遁迹dunji -钝角dunjiao -顿时dunshi -敦实dunshi -多duo -度*duo -夺duo -朵duo -掇duo -哆duo -垛duo -躲duo -跺duo -舵duo -剁duo -惰duo -堕duo -驮*duo -咄duo -哚duo -沲duo -缍duo -柁duo -铎duo -裰duo -踱duo -多半duoban -躲避duobi -多变duobian -多边duobian -躲藏duocang -多次duoci -夺得duode -多端duoduan -多方duofang -躲开duokai -多亏duokui -夺魁duokui -堕落duoluo -多么duome -夺目duomu -多年duonian -多情duoqing -夺取duoqu -多少duoshao -多事duoshi -掇拾duoshi -舵手duoshou -多数duoshu -多谢duoxie -多心duoxin -惰性duoxing -多样duoyang -多余duoyu -多种duozhong -肚皮dupi -毒品dupin -毒气duqi -读取duqu -度日duri -读入duru -堵塞duse -毒蛇dushe -都是dushi -毒手dushou -读数dushu -读书dushu -毒素dusu -独特dute -读物duwu -毒药duyao -独占duzhan -读者duzhe -毒汁duzhi -渎职duzhi -赌注duzhu -杜撰duzhuan -独自duzi -党委会dwh -对外开放dwkf -敌我矛盾dwmd -对外贸易dwmy -大无畏dww -动物园dwy -当务之急dwzj -邓小平dxp -大学生dxs -大显身手dxss -大西洋dxy -大跃进dyj -打印机dyj -大有可为dykw -待业青年dyqn -掉以轻心dyqx -电影院dyy -大洋洲dyz -大有作为dyzw -党支部dzb -多种多样dzdy -党政机关dzjg -多种经营dzjy -断章取义dzqy -大自然dzr -德智体dzt -电子学dzx -党中央dzy -而e -二e -尔e -儿e -恶e -额e -恩e -俄e -耳e -饵e -蛾e -饿e -峨e -鹅e -讹e -娥e -厄e -扼e -遏e -鄂e -噩e -谔e -垩e -苊e -莪e -萼e -呃e -愕e -屙e -婀e -轭e -腭e -锇e -锷e -鹗e -颚e -鳄e -恶霸eba -恶毒edu -恶感egan -恶棍egun -噩耗ehao -恶化ehua -诶ei -二极管ejg -二进制ejz -恶劣elie -鹅毛emao -噩梦emeng -恶魔emo -耳目一新emyx -恩en -蒽en -摁en -恩爱enai -恩赐enci -恩典endian -恩惠enhui -恩情enqing -而er -二er -尔er -儿er -耳er -饵er -洱er -贰er -佴er -迩er -珥er -铒er -鸸er -鲕er -耳朵erduo -儿歌erge -耳光erguang -而后erhou -尔后erhou -二届erjie -而今erjin -而况erkuang -而且erqie -而是ershi -儿童ertong -儿戏erxi -而已eryi -耳语eryu -二月eryue -儿子erzi -扼杀esha -额外ewai -扼腕ewan -额外负担ewfd -恶习exi -恶心exin -恶性exing -恶性循环exxh -扼要eyao -厄运eyun -讹诈ezha -遏止ezhi -分f -发f -方f -法f -反f -放f -复f -风f -防f -非f -服f -肥f -副f -粉f -府f -夫f -负f -封f -富f -翻f -发fa -法fa -阀fa -乏fa -伐fa -罚fa -筏fa -珐fa -垡fa -砝fa -发报fabao -法宝fabao -发表fabiao -发布fabu -发财facai -发愁fachou -发出fachu -发达fada -发电fadian -法典fadian -法定fading -发动fadong -发放fafang -发奋fafen -发愤fafen -法官faguan -法规fagui -法国faguo -发慌fahuang -发挥fahui -发火fahuo -发给faji -发迹faji -法纪faji -发家fajia -发奖fajiang -发酵fajiao -罚金fajin -发觉fajue -发掘fajue -罚款fakuan -发狂fakuang -法郎falang -法令faling -法律falu -发落faluo -发明faming -反fan -翻fan -范fan -犯fan -饭fan -繁fan -泛fan -番fan -凡fan -烦fan -返fan -藩fan -帆fan -樊fan -矾fan -钒fan -贩fan -蕃fan -蘩fan -幡fan -梵fan -燔fan -畈fan -蹯fan -翻版fanban -反比fanbi -反驳fanbo -帆布fanbu -反常fanchang -范畴fanchou -犯愁fanchou -帆船fanchuan -饭店fandian -反动fandong -翻动fandong -反对fandui -繁多fanduo -反而faner -反复fanfu -方fang -放fang -防fang -访fang -房fang -纺fang -仿fang -妨fang -芳fang -肪fang -坊fang -邡fang -彷*fang -枋fang -钫fang -舫fang -鲂fang -妨碍fangai -方案fangan -反感fangan -防备fangbei -方便fangbian -防潮fangchao -方程fangcheng -放大fangda -放荡fangdang -防盗fangdao -方法fangfa -防范fangfan -防风fangfeng -防腐fangfu -仿佛fangfu -妨害fanghai -防护fanghu -防火fanghuo -放假fangjia -房间fangjian -方面fangmian -放牧fangmu -返工fangong -反攻fangong -放屁fangpi -放弃fangqi -防区fangqu -放任fangren -放哨fangshao -放射fangshe -方式fangshi -防守fangshou -放肆fangsi -放松fangsong -仿宋fangsong -翻滚fangun -方位fangwei -防卫fangwei -访问fangwen -房屋fangwu -放下fangxia -防线fangxian -方向fangxiang -芳香fangxiang -仿效fangxiao -放心fangxin -放行fangxing -方言fangyan -防疫fangyi -防御fangyu -仿造fangzao -仿照fangzhao -方针fangzhen -仿真fangzhen -防治fangzhi -仿制fangzhi -放置fangzhi -防止fangzhi -纺织fangzhi -房子fangzi -放纵fangzong -房租fangzu -番号fanhao -繁华fanhua -反悔fanhui -返回fanhui -反击fanji -反抗fankang -反馈fankui -泛滥fanlan -范例fanli -凡例fanli -翻脸fanlian -贩卖fanmai -繁忙fanmang -烦闷fanmen -反面fanmian -反目fanmu -烦恼fannao -反叛fanpan -犯人fanren -繁荣fanrong -反射fanshe -翻身fanshen -繁盛fansheng -凡是fanshi -凡事fanshi -繁琐fansuo -烦琐fansuo -翻腾fanteng -繁体fanti -饭桶fantong -发怒fanu -饭碗fanwan -范围fanwei -反问fanwen -反响fanxiang -返销fanxiao -反省fanxing -翻修fanxiu -繁衍fanyan -翻译fanyi -翻印fanyin -反应fanying -反映fanying -繁育fanyu -翻越fanyue -翻阅fanyue -贩运fanyun -繁杂fanza -烦燥fanzao -反正fanzheng -反之fanzhi -繁殖fanzhi -繁重fanzhong -贩子fanzi -犯罪fanzui -发起faqi -法权faquan -发射fashe -发生fasheng -发誓fashi -发售fashou -法庭fating -发现faxian -发泄faxie -发行faxing -发言fayan -发扬fayang -法医fayi -发育fayu -发源fayuan -法院fayuan -法则faze -发展fazhan -法制fazhi -法治fazhi -发作fazuo -奋不顾身fbgs -分崩离析fblx -副产品fcp -发电机fdj -发动机fdj -反动派fdp -分道扬镳fdyb -非fei -肥fei -飞fei -费fei -废fei -肺fei -沸fei -菲fei -匪fei -啡fei -诽fei -吠fei -芾fei -狒fei -悱fei -淝fei -妃fei -绯fei -榧fei -腓fei -斐fei -扉fei -镄fei -痱fei -蜚fei -篚fei -翡fei -霏fei -鲱fei -匪帮feibang -诽谤feibang -飞奔feiben -非常feichang -飞驰feichi -废除feichu -非但feidan -非得feide -沸点feidian -非法feifa -非凡feifan -肺腑feifu -绯红feihong -废话feihua -飞机feiji -飞溅feijian -费解feijie -费劲feijin -飞快feikuai -费力feili -肥料feiliao -废料feiliao -肥胖feipang -废品feipin -废弃feiqi -费神feishen -废水feishui -飞速feisu -沸腾feiteng -匪徒feitu -肥沃feiwo -废物feiwu -飞舞feiwu -飞翔feixiang -费心feixin -飞行feixing -废墟feixu -飞扬feiyang -扉页feiye -非议feiyi -费用feiyong -飞跃feiyue -肥皂feizao -飞涨feizhang -废止feizhi -非洲feizhou -妃子feizi -分fen -粉fen -奋fen -份fen -粪fen -纷fen -芬fen -愤fen -酚fen -吩fen -氛fen -坟fen -焚fen -汾fen -忿fen -偾fen -瀵fen -玢*fen -棼fen -鲼fen -鼢fen -分贝fenbei -分辩fenbian -分辨fenbian -粪便fenbian -分别fenbie -分部fenbu -分布fenbu -分册fence -分寸fencun -分担fendan -分得fende -分店fendian -奋斗fendou -分队fendui -分发fenfa -奋发fenfa -纷纷fenfen -吩咐fenfu -风feng -封feng -蜂feng -丰feng -缝feng -峰feng -锋feng -疯feng -奉feng -枫feng -烽feng -逢feng -冯feng -讽feng -凤feng -俸feng -酆feng -葑feng -唪feng -沣feng -砜feng -风暴fengbao -丰碑fengbei -封闭fengbi -风波fengbo -丰产fengchan -奉承fengcheng -讽刺fengci -封存fengcun -风度fengdu -分割fenge -分隔fenge -风发fengfa -风帆fengfan -丰富fengfu -奉告fenggao -风格fengge -奉公fenggong -风光fengguang -风寒fenghan -奉还fenghuan -凤凰fenghuang -烽火fenghuo -封建fengjian -风景fengjing -疯狂fengkuang -风浪fenglang -风力fengli -风流fengliu -丰满fengman -锋芒fengmang -风貌fengmao -奉命fengming -丰年fengnian -分工fengong -奉陪fengpei -风气fengqi -风情fengqing -风趣fengqu -奉劝fengquan -缝纫fengren -风骚fengsao -风沙fengsha -风尚fengshang -风声fengsheng -丰盛fengsheng -丰收fengshou -风霜fengshuang -风水fengshui -丰硕fengshuo -奉祀fengsi -风俗fengsu -封锁fengsuo -疯瘫fengtan -封条fengtiao -风头fengtou -分管fenguan -风味fengwei -缝隙fengxi -风险fengxian -奉献fengxian -风向fengxiang -风行fengxing -奉行fengxing -蜂拥fengyong -风云fengyun -风韵fengyun -风灾fengzai -疯子fengzi -风姿fengzi -分号fenhao -分毫fenhao -分红fenhong -粉红fenhong -分化fenhua -分会fenhui -焚毁fenhui -分级fenji -分解fenjie -分界fenjie -奋进fenjin -分居fenju -分开fenkai -愤慨fenkai -分类fenlei -分离fenli -奋力fenli -分量fenliang -分裂fenlie -纷乱fenluan -分娩fenmian -分秒fenmiao -分明fenming -粉末fenmo -坟墓fenmu -愤怒fennu -分派fenpai -分配fenpei -分批fenpi -分期fenqi -分歧fenqi -奋起fenqi -分清fenqing -分区fenqu -分散fensan -焚烧fenshao -分数fenshu -分说fenshuo -粉碎fensui -分摊fentan -粪土fentu -分外fenwai -氛围fenwei -分析fenxi -奋勇fenyong -分赃fenzang -奋战fenzhan -分支fenzhi -分子fenzi -分组fenzu -丰富多采ffdc -奋发图强fftq -反过来说fgls -反革命fgm -福建省fjs -封建主义fjzy -翻来覆去flfq -法律顾问flgw -分秒必争fmbz -发明创造fmcz -否fou -缶fou -否定fouding -否决foujue -否认fouren -否则fouze -费品率fpl -废寝忘食fqws -缝纫机frj -分水岭fsl -翻天复地ftfd -丰台区ftq -非同小可ftxk -繁体字ftz -复fu -服fu -副fu -府fu -夫fu -负fu -富fu -附fu -福fu -伏fu -符fu -幅fu -腐fu -浮fu -辅fu -付fu -腹fu -妇fu -孵fu -覆fu -扶fu -辐fu -傅fu -佛fu -缚fu -父fu -弗fu -甫fu -肤fu -氟fu -敷fu -拂fu -俘fu -涪fu -袱fu -抚fu -俯fu -釜fu -斧fu -脯fu -腑fu -赴fu -赋fu -阜fu -讣fu -咐fu -匐fu -凫fu -郛fu -芙fu -芾*fu -苻fu -茯fu -莩fu -菔fu -拊fu -呋fu -幞fu -怫fu -滏fu -艴fu -孚fu -驸fu -绂fu -绋fu -桴fu -赙fu -祓fu -砩fu -黻fu -黼fu -罘fu -稃fu -馥fu -蚨fu -蜉fu -蝠fu -蝮fu -麸fu -趺fu -跗fu -鲋fu -鳆fu -腐败fubai -复辟fubi -复查fucha -浮沉fuchen -扶持fuchi -付出fuchu -副词fuci -服从fucong -附带fudai -负担fudan -辅导fudao -浮雕fudiao -浮动fudong -幅度fudu -复发fufa -伏法fufa -夫妇fufu -覆盖fugai -讣告fugao -富贵fugui -符号fuhao -附和fuhe -符合fuhe -负荷fuhe -腐化fuhua -浮华fuhua -复活fuhuo -俘获fuhuo -伏击fuji -附加fujia -附件fujian -福建fujian -佛教fujiao -附近fujin -副刊fukan -俯瞰fukan -浮夸fukua -付款fukuan -腐烂fulan -福利fuli -浮力fuli -富丽fuli -妇联fulian -附录fulu -俘虏fulu -覆灭fumie -覆没fumo -父母fumu -富农funong -妇女funu -扶贫fupin -服气fuqi -福气fuqi -夫妻fuqi -付讫fuqi -肤浅fuqian -富强fuqiang -父亲fuqin -富饶furao -夫人furen -芙蓉furong -妇孺furu -负伤fushang -辐射fushe -复试fushi -腐蚀fushi -俯视fushi -副手fushou -复数fushu -负数fushu -附属fushu -富庶fushu -赋税fushui -伏特fute -覆亡fuwang -富翁fuweng -服务fuwu -复习fuxi -浮现fuxian -赋闲fuxian -浮想fuxiang -腐朽fuxiu -抚恤fuxu -敷衍fuyan -扶养fuyang -抚养fuyang -俯仰fuyang -副业fuye -服役fuyi -复印fuyin -富有fuyou -赋有fuyou -赋于fuyu -抚育fuyu -富裕fuyu -赋予fuyu -复员fuyuan -复原fuyuan -负约fuyue -复杂fuza -负载fuzai -附则fuze -负责fuze -负债fuzhai -付帐fuzhang -复制fuzhi -扶植fuzhi -附中fuzhong -福州fuzhou -抚州fuzhou -附注fuzhu -辅助fuzhu -扶助fuzhu -服装fuzhuang -附着fuzhuo -富足fuzu -辅佐fuzuo -服务部fwb -服务态度fwtd -服务员fwy -方兴未艾fxwa -奋勇当先fydx -翻一番fyf -风言风语fyfy -发扬光大fygd -复印机fyj -发言人fyr -风雨同舟fytz -房租费fzf -副总理fzl -纺织品fzp -福州市fzs -反作用fzy -副作用fzy -负责制fzz -发展中国家fzzj -个g -国g -工g -过g -高g -干g -关g -各g -革g -公g -根g -更g -改g -管g -光g -广g -果g -格g -共g -搞g -夹*ga -噶ga -嘎ga -胳*ga -尬ga -尕ga -尜ga -旮ga -钆ga -公安部gab -改gai -该gai -盖gai -概gai -钙gai -溉gai -芥*gai -丐gai -陔gai -垓gai -戤gai -赅gai -改变gaibian -改编gaibian -该当gaidang -改道gaidao -改动gaidong -改革gaige -改观gaiguan -改过gaiguo -改悔gaihui -改建gaijian -改进gaijin -概况gaikuang -概括gaikuo -改良gailiang -概率gailu -概论gailun -概貌gaimao -概念gainian -改期gaiqi -改善gaishan -概述gaishu -概叹gaitan -改天gaitian -改选gaixuan -概要gaiyao -改造gaizao -改正gaizheng -改装gaizhuang -改组gaizu -公安局gaj -干gan -杆gan -感gan -敢gan -赶gan -甘gan -肝gan -秆gan -柑gan -竿gan -赣gan -乾*gan -坩gan -苷gan -尴gan -擀gan -泔gan -淦gan -澉gan -绀gan -橄gan -旰gan -矸gan -疳gan -酐gan -干部ganbu -感触ganchu -干脆gancui -敢当gandang -甘当gandang -感到gandao -感动gandong -感恩ganen -刚gang -钢gang -缸gang -纲gang -岗gang -港gang -杠gang -冈gang -肛gang -扛*gang -戆gang -罡gang -筻gang -尴尬ganga -港澳gangao -刚才gangcai -钢材gangcai -刚刚ganggang -刚好ganghao -港口gangkou -纲领gangling -岗哨gangshao -钢铁gangtie -港湾gangwan -岗位gangwei -港务gangwu -刚要gangyao -纲要gangyao -刚毅gangyi -干旱ganhan -感化ganhua -干活ganhuo -肝火ganhuo -感激ganji -干劲ganjin -赶紧ganjin -干净ganjing -感觉ganjue -感慨gankai -甘苦ganku -赶快gankuai -赶忙ganmang -感冒ganmao -感情ganqing -感染ganran -干扰ganrao -干涉ganshe -干事ganshi -感受ganshou -甘肃gansu -感叹gantan -干线ganxian -感想ganxiang -敢想ganxiang -感谢ganxie -甘心ganxin -感性ganxing -感应ganying -敢于ganyu -干预ganyu -甘愿ganyuan -干燥ganzao -感召ganzhao -赣州ganzhou -敢做ganzuo -高gao -搞gao -告gao -稿gao -膏gao -篙gao -皋gao -羔gao -糕gao -镐gao -睾gao -诰gao -郜gao -藁gao -缟gao -槔gao -槁gao -杲gao -锆gao -高矮gaoai -高昂gaoang -告别gaobie -高产gaochan -高超gaochao -高潮gaochao -告成gaocheng -告辞gaoci -高大gaoda -高档gaodang -高等gaodeng -高地gaodi -高低gaodi -糕点gaodian -高度gaodu -告发gaofa -高峰gaofeng -高高gaogao -高歌gaoge -高贵gaogui -高喊gaohan -搞好gaohao -高呼gaohu -搞坏gaohuai -高级gaoji -告急gaoji -高价gaojia -高见gaojian -稿件gaojian -告捷gaojie -告诫gaojie -高龄gaoling -高楼gaolou -告密gaomi -高明gaoming -高能gaoneng -高攀gaopan -高频gaopin -高强gaoqiang -高山gaoshan -高尚gaoshang -高深gaoshen -告示gaoshi -高耸gaosong -高速gaosu -告诉gaosu -高温gaowen -高小gaoxiao -高校gaoxiao -高兴gaoxing -膏药gaoyao -高原gaoyuan -高涨gaozhang -高招gaozhao -高中gaozhong -告终gaozhong -告状gaozhuang -稿子gaozi -港澳同胞gatb -怪不得gbd -各部门gbm -各部委gbw -供不应求gbyq -故步自封gbzf -共产党gcd -共产党员gcdy -工程师gcs -顾此失彼gcsb -贯彻执行gczx -共产主义gczy -各地方gdf -各大军区gdjq -广东省gds -高档商品gdsp -各单位gdw -高等院校gdyx -固定资产gdzc -个ge -各ge -革ge -合*ge -格ge -割ge -歌ge -隔ge -盖*ge -哥ge -铬ge -阁ge -戈ge -葛ge -搁ge -鸽ge -胳ge -疙ge -蛤ge -咯*ge -屹*ge -鬲ge -仡ge -哿ge -圪ge -塥ge -嗝ge -纥*ge -搿ge -膈ge -硌ge -镉ge -袼ge -颌*ge -虼ge -舸ge -骼ge -隔壁gebi -戈壁gebi -个别gebie -歌唱gechang -各处gechu -革除gechu -疙瘩geda -各地gedi -格调gediao -隔断geduan -个个gege -各个gege -各国geguo -隔阂gehe -歌喉gehou -各级geji -各界gejie -格局geju -割据geju -隔绝gejue -各类gelei -隔离geli -割裂gelie -格律gelu -革命geming -隔膜gemo -给gei -根gen -跟gen -亘gen -茛gen -哏gen -艮gen -根本genben -根除genchu -根底gendi -更geng -耕geng -颈geng -庚geng -羹geng -埂geng -耿geng -梗geng -哽geng -赓geng -绠geng -鲠geng -耕地gengdi -更迭gengdie -更动gengdong -更多gengduo -更改genggai -梗概genggai -更高genggao -更换genghuan -更加gengjia -更为gengwei -颈项gengxiang -更新gengxin -哽咽gengyan -耕耘gengyun -更正gengzheng -耿直gengzhi -梗直gengzhi -耕种gengzhong -梗阻gengzu -耕作gengzuo -根基genji -根据genju -跟前genqian -跟随gensui -根源genyuan -根治genzhi -跟着genzhuo -根子genzi -跟踪genzong -搁浅geqian -歌曲gequ -个人geren -格式geshi -歌颂gesong -个体geti -格外gewai -各位gewei -歌舞gewu -阁下gexia -各项gexiang -革新gexin -个性gexing -格言geyan -各样geyang -歌咏geyong -搁置gezhi -各种gezhong -各族gezu -国防部gfb -各方面gfm -格格不入ggbr -归根到底ggdd -恭恭敬敬ggjj -滚瓜烂熟ggls -歌功颂德ggsd -共和国ghg -各行各业ghgy -干劲冲天gjct -各级党委gjdw -各级领导gjld -国家利益gjly -国计民生gjms -工具书gjs -各尽所能gjsn -国库券gkq -工矿企业gkqy -孤陋寡闻glgw -规律性glx -国民党gmd -革命化gmh -革命家gmj -国民经济gmjj -购买力gml -光明磊落gmll -光明日报gmrb -顾名思义gmsy -冠冕堂皇gmth -刮目相看gmxk -光明正大gmzd -工农兵gnb -国内外gnw -工农业gny -工gong -公gong -共gong -供gong -功gong -攻gong -红*gong -巩gong -贡gong -汞gong -宫gong -恭gong -龚gong -躬gong -弓gong -拱gong -珙gong -肱gong -蚣gong -觥gong -公安gongan -公报gongbao -工本gongben -公布gongbu -公差gongcha -公拆gongchai -工厂gongchang -功臣gongchen -工程gongcheng -共处gongchu -供词gongci -共存gongcun -公道gongdao -公德gongde -功德gongde -工地gongdi -公敌gongdi -宫殿gongdian -攻读gongdu -公费gongfei -公愤gongfen -工夫gongfu -功夫gongfu -公告gonggao -公共gonggong -巩固gonggu -公关gongguan -公害gonghai -公函gonghan -共和gonghe -工会gonghui -供给gongji -共计gongji -攻击gongji -功绩gongji -公家gongjia -公斤gongjin -恭敬gongjing -工具gongju -公开gongkai -功课gongke -公款gongkuan -功劳gonglao -公理gongli -公里gongli -公历gongli -公路gonglu -功率gonglu -公民gongmin -共鸣gongming -公墓gongmu -功能gongneng -工农gongnong -公判gongpan -公平gongping -公仆gongpu -供求gongqiu -工区gongqu -公然gongran -工人gongren -公认gongren -供认gongren -工伤gongshang -公社gongshe -公审gongshen -工时gongshi -公事gongshi -共事gongshi -公式gongshi -公署gongshu -公司gongsi -公私gongsi -公诉gongsu -宫廷gongting -共同gongtong -恭维gongwei -公文gongwen -公物gongwu -公务gongwu -恭喜gongxi -贡献gongxian -工效gongxiao -功效gongxiao -供销gongxiao -共性gongxing -工序gongxu -共需gongxu -功勋gongxun -供养gongyang -工业gongye -工艺gongyi -供应gongying -公用gongyong -共有gongyou -公元gongyuan -公园gongyuan -公约gongyue -公允gongyun -公债gongzhai -公章gongzhang -共振gongzhen -工整gongzheng -公正gongzheng -公证gongzheng -供职gongzhi -公众gongzhong -工资gongzi -工作gongzuo -够gou -构gou -沟gou -句*gou -狗gou -钩gou -勾gou -购gou -苟gou -垢gou -佝gou -诟gou -岣gou -遘gou -媾gou -缑gou -枸gou -觏gou -彀gou -笱gou -篝gou -鞲gou -构成goucheng -勾搭gouda -勾当goudang -媾和gouhe -沟壑gouhe -构件goujian -勾结goujie -购买goumai -苟且gouqie -构思gousi -沟通goutong -勾通goutong -构陷gouxian -勾销gouxiao -购销gouxiao -勾引gouyin -构造gouzao -购置gouzhi -钩子gouzi -国庆节gqj -共青团gqt -光荣榜grb -根深蒂固gsdg -瓜熟蒂落gsdl -公使馆gsg -各式各样gsgy -甘肃省gss -工商业gsy -个体户gth -改头换面gthm -高谈阔论gtkl -鼓gu -固gu -古gu -骨gu -故gu -顾gu -股gu -谷gu -估gu -雇gu -孤gu -姑gu -贾*gu -辜gu -菇gu -咕gu -箍gu -沽gu -蛊gu -嘏gu -诂gu -菰gu -呱gu -崮gu -汩gu -梏gu -轱gu -牯gu -牿gu -臌gu -毂gu -瞽gu -罟gu -钴gu -锢gu -鸪gu -鹄*gu -痼gu -蛄gu -酤gu -觚gu -鲴gu -鹘gu -挂gua -刮gua -瓜gua -括*gua -剐gua -寡gua -褂gua -卦gua -诖gua -呱gua -栝gua -胍gua -鸹gua -瓜分guafen -瓜葛guage -挂号guahao -怪guai -乖guai -拐guai -乖舛guaichuan -乖戾guaili -乖僻guaipi -乖巧guaiqiao -怪物guaiwu -怪异guaiyi -拐杖guaizhang -挂名guaming -关guan -管guan -观guan -官guan -灌guan -贯guan -惯guan -冠guan -馆guan -罐guan -棺guan -纶*guan -倌guan -莞guan -掼guan -涫guan -盥guan -鹳guan -矜guan -鳏guan -关闭guanbi -观测guance -观察guancha -贯彻guanche -贯穿guanchuan -管道guandao -官邸guandi -观点guandian -官方guanfang -光guang -广guang -逛guang -咣guang -犷guang -桄guang -胱guang -灌溉guangai -光标guangbiao -广播guangbo -广博guangbo -光彩guangcai -广场guangchang -光大guangda -广大guangda -广东guangdong -广度guangdu -广泛guangfan -广告guanggao -光顾guanggu -光滑guanghua -光辉guanghui -光景guangjing -广阔guangkuo -光芒guangmang -广袤guangmao -光明guangming -光盘guangpan -光谱guangpu -光荣guangrong -观光guanguang -广西guangxi -光线guangxian -广义guangyi -光阴guangyin -光涌guangyong -广州guangzhou -关怀guanhuai -挂念guanian -管家guanjia -关键guanjian -管教guanjiao -关节guanjie -冠军guanjun -关卡guanka -观看guankan -关口guankou -管理guanli -贯例guanli -惯例guanli -官吏guanli -关联guanlian -官僚guanliao -观摩guanmo -灌木guanmu -官能guanneng -观念guannian -关切guanqie -观赏guanshang -管事guanshi -管束guanshu -灌输guanshu -关税guanshui -官司guansi -贯通guantong -关头guantou -观望guanwang -关系guanxi -管辖guanxia -官衔guanxian -关心guanxin -惯性guanxing -关押guanya -惯用guanyong -关于guanyu -官员guanyuan -观战guanzhan -关照guanzhao -管制guanzhi -观止guanzhi -观众guanzhong -关注guanzhu -贯注guanzhu -馆子guanzi -挂失guashi -挂帅guashuai -鼓吹guchui -故此guci -古代gudai -孤单gudan -故地gudi -古典gudian -固定guding -鼓动gudong -股东gudong -古董gudong -孤独gudu -咕嘟gudu -孤儿guer -股份gufen -辜负gufu -骨干gugan -雇工gugong -故宫gugong -古怪guguai -蛊惑guhuo -规gui -贵gui -归gui -硅gui -鬼gui -轨gui -龟gui -桂gui -瑰gui -圭gui -闺gui -诡gui -癸gui -柜gui -跪gui -刽gui -傀*gui -炔*gui -匦gui -刿gui -庋gui -宄gui -妫gui -桧gui -炅gui -晷gui -皈gui -簋gui -鲑gui -鳜gui -诡辩guibian -贵宾guibin -归并guibing -规程guicheng -归档guidang -轨道guidao -规定guiding -归队guidui -规范guifan -规格guige -归公guigong -归功guigong -桂冠guiguan -归国guiguo -规划guihua -鬼话guihua -归还guihuan -诡计guiji -轨迹guiji -贵贱guijian -归咎guijiu -规矩guiju -瑰丽guili -鬼脸guilian -龟裂guilie -规律guilu -诡秘guimi -规模guimo -归纳guina -闺女guinu -规劝guiquan -贵人guiren -归属guishu -龟缩guisuo -柜台guitai -闺秀guixiu -归于guiyu -规则guize -规章guizhang -贵重guizhong -贵州guizhou -鬼子guizi -贵族guizu -归罪guizui -顾及guji -估计guji -古迹guji -顾忌guji -估价gujia -古今gujin -古旧gujiu -故旧gujiu -故居guju -顾客guke -孤苦guku -古老gulao -孤立guli -鼓励guli -估量guliang -顾虑gulu -估摸gumo -滚gun -辊gun -棍gun -衮gun -绲gun -磙gun -鲧gun -滚动gundong -姑娘guniang -雇农gunong -滚烫guntang -棍子gunzi -国guo -过guo -果guo -锅guo -郭guo -涡*guo -裹guo -馘guo -埚guo -掴guo -呙guo -帼guo -崞guo -猓guo -椁guo -虢guo -聒guo -蜾guo -蝈guo -过半guoban -国策guoce -国产guochan -过程guocheng -过错guocuo -过度guodu -过渡guodu -果断guoduan -国法guofa -国防guofang -过分guofen -果腹guofu -果敢guogan -国歌guoge -过关guoguan -过后guohou -国会guohui -国际guoji -国籍guoji -国家guojia -国界guojie -国境guojing -国库guoku -过来guolai -过量guoliang -过虑guolu -锅炉guolu -国民guomin -过目guomu -果木guomu -国难guonan -国内guonei -果皮guopi -果品guopin -国旗guoqi -过期guoqi -国情guoqing -国庆guoqing -过去guoqu -果然guoran -过少guoshao -过甚guoshen -过剩guosheng -过时guoshi -国事guoshi -过失guoshi -果实guoshi -过头guotou -国外guowai -国王guowang -过问guowen -国务guowu -过细guoxi -国药guoyao -国营guoying -过硬guoying -过于guoyu -果园guoyuan -果真guozhen -锅子guozi -顾盼gupan -孤僻gupi -股票gupiao -骨气guqi -姑且guqie -顾全guquan -固然guran -古人guren -骨肉gurou -故事gushi -股市gushi -固守gushou -估算gusuan -固体guti -骨头gutou -故土gutu -顾问guwen -古文guwen -谷物guwu -鼓舞guwu -姑息guxi -故乡guxiang -故意guyi -雇佣guyong -固有guyou -雇员guyuan -鼓掌guzhang -故障guzhang -固执guzhi -拐弯抹角gwmj -国务委员gwwy -国务院gwy -改邪归正gxgz -更新换代gxhd -各行其事gxqs -感性认识gxrs -广西壮族gxzz -工业化gyh -工艺流程gylc -工艺美术gyms -工业品gyp -工艺品gyp -贵阳市gys -公有制gyz -各种各样gzgy -工资级别gzjb -各族人民gzrm -工作上gzs -广州市gzs -贵州省gzs -各自为政gzwz -高瞻远瞩gzyz -高瞻远嘱gzyz -工作者gzz -和h -会h -后h -化h -好h -合h -还h -活h -很h -回h -号h -毫h -花h -或h -海h -话h -红h -火h -黄h -害h -哈ha -蛤*ha -虾*ha -铪ha -哈达hada -还hai -海hai -害hai -孩hai -骸hai -氦hai -亥hai -骇hai -嘿*hai -咳*hai -嗨hai -胲hai -醢hai -海岸haian -海拔haiba -海报haibao -害虫haichong -害处haichu -海岛haidao -海港haigang -海关haiguan -还好haihao -海疆haijiang -海军haijun -海浪hailang -海绵haimian -害怕haipa -海上haishang -还是haishi -海外haiwai -海湾haiwan -海峡haixia -海啸haixiao -害羞haixiu -海洋haiyang -还要haiyao -还有haiyou -海域haiyu -海员haiyuan -孩子haizi -含han -焊han -旱han -喊han -汉han -寒han -汗han -函han -韩han -酣han -憨han -邯han -涵han -罕han -翰han -撼han -捍han -憾han -悍han -邗han -菡han -撖han -阚han -瀚han -晗han -焓han -顸han -颔han -蚶han -鼾han -寒潮hanchao -寒带handai -行*hang -航hang -夯hang -杭hang -吭*hang -巷*hang -沆hang -绗hang -珩hang -颃hang -航标hangbiao -航程hangcheng -航船hangchuan -行当hangdang -航道hangdao -航海hanghai -行家hangjia -行距hangju -航空hangkong -行列hanglie -航路hanglu -航模hangmo -函购hangou -行情hangqing -航天hangtian -航线hangxian -航向hangxiang -航行hangxing -航运hangyun -杭州hangzhou -含糊hanhu -含混hanhun -旱季hanji -函件hanjian -罕见hanjian -汉奸hanjian -喊叫hanjiao -焊接hanjie -寒冷hanleng -翰林hanlin -寒流hanliu -函授hanshou -函数hanshu -酣睡hanshui -寒酸hansuan -捍卫hanwei -含蓄hanxu -寒暄hanxuan -涵养hanyang -含义hanyi -涵义hanyi -汉语hanyu -含冤hanyuan -旱灾hanzai -汉字hanzi -汉族hanzu -好hao -号hao -毫hao -耗hao -豪hao -郝hao -浩hao -镐*hao -壕hao -嚎hao -貉*hao -蒿hao -薅hao -嗥hao -嚆hao -濠hao -灏hao -昊hao -皓hao -颢hao -蚝hao -好比haobi -毫不haobu -号称haocheng -好处haochu -浩大haoda -好歹haodai -浩荡haodang -好的haode -浩繁haofan -耗费haofei -好感haogan -好汉haohan -豪华haohua -好坏haohuai -号角haojiao -耗竭haojie -豪杰haojie -浩劫haojie -好看haokan -毫厘haoli -号令haoling -号码haoma -豪迈haomai -毫毛haomao -毫米haomi -浩淼haomiao -好奇haoqi -豪强haoqiang -豪情haoqing -好人haoren -豪绅haoshen -毫升haosheng -好事haoshi -豪爽haoshuang -好似haosi -耗损haosun -号啕haotao -好听haoting -好玩haowan -毫无haowu -好象haoxiang -好些haoxie -好样haoyang -好意haoyi -号召haozhao -好转haozhuan -汇编程序hbcx -货币回笼hbhl -货币流通hblt -河北省hbs -湖北省hbs -汇编语言hbyy -或多或少hdhs -海淀区hdq -和he -合he -河he -何he -核he -赫he -荷he -褐he -喝he -贺he -呵he -禾he -吓*he -盒he -菏he -貉he -阂he -涸he -鹤he -诃he -劾he -壑he -嗬he -阖he -纥he -曷he -盍he -颌he -蚵he -翮he -和蔼heai -哈尔滨heb -合办heban -荷包hebao -河北hebei -何必hebi -合并hebing -哈尔滨市hebs -何不hebu -喝彩hecai -合唱hechang -何尝hechang -合成hecheng -呵斥hechi -何处hechu -河川hechuan -河床hechuang -贺词heci -何等hedeng -贺电hedian -核定heding -核对hedui -合法hefa -何妨hefang -合肥hefei -合格hege -和好hehao -赫赫hehe -合乎hehu -合伙hehuo -黑hei -嘿hei -黑暗heian -黑白heibai -黑帮heibang -嘿嘿heihei -黑人heiren -黑色heise -黑市heishi -黑夜heiye -合计heji -核计heji -和解hejie -合金hejin -何苦heku -何况hekuang -合理heli -合力heli -合流heliu -河流heliu -合谋hemou -和睦hemu -很hen -狠hen -痕hen -恨hen -河南henan -狠毒hendu -很多henduo -河内henei -行*heng -横heng -衡heng -恒heng -哼heng -亨heng -蘅heng -珩*heng -桁heng -横财hengcai -哼哧hengchi -横幅hengfu -横亘henggen -横贯hengguan -横祸henghuo -横加hengjia -衡量hengliang -横蛮hengman -横批hengpi -衡器hengqi -横扫hengsao -横竖hengshu -恒心hengxin -横行hengxing -恒星hengxing -很好henhao -贺年henian -痕迹henji -很快henkuai -狠心henxin -狠抓henzhua -和平heping -和气heqi -河渠hequ -赫然heran -河山heshan -和尚heshang -合适heshi -核实heshi -合算hesuan -核算hesuan -河滩hetan -合同hetong -贺喜hexi -和谐hexie -核心hexin -贺信hexin -和煦hexu -何以heyi -合影heying -合营heying -核准hezhun -合资hezi -赫兹hezi -合作hezuo -合法权益hfqy -合肥市hfs -宏观世界hgsj -化公为私hgws -好高务远hgwy -核工业部hgyb -海关总署hgzs -后顾之忧hgzy -呼和浩特hhht -轰轰烈烈hhll -换句话说hjhs -黄金时代hjsd -环境卫生hjws -后继有人hjyr -海枯石烂hksl -合理化hlh -糊里糊涂hlht -黑龙江hlj -汗流浃背hljb -汗马功劳hmgl -海南岛hnd -河南省hns -湖南省hns -红hong -洪hong -轰hong -烘hong -哄hong -虹hong -鸿hong -宏hong -弘hong -黉hong -訇hong -讧hong -荭hong -蕻hong -薨hong -闳hong -泓hong -红尘hongchen -轰动hongdong -洪都hongdu -洪峰hongfeng -鸿沟honggou -宏观hongguan -红光hongguang -红花honghua -红军hongjun -红利hongli -洪亮hongliang -轰隆honglong -弘论honglun -鸿毛hongmao -轰鸣hongming -哄骗hongpian -红旗hongqi -红人hongren -红色hongse -洪水hongshui -哄抬hongtai -宏图hongtu -宏伟hongwei -红星hongxing -弘扬hongyang -鸿运hongyun -红晕hongyun -轰炸hongzha -后hou -候hou -厚hou -侯hou -喉hou -猴hou -吼hou -堠hou -後hou -逅hou -瘊hou -篌hou -糇hou -鲎hou -骺hou -后备houbei -后辈houbei -后边houbian -厚薄houbo -候补houbu -后尘houchen -后代houdai -厚道houdao -厚度houdu -后盾houdun -后方houfang -后果houguo -后患houhuan -后悔houhui -后记houji -后进houjin -后劲houjin -后来houlai -喉咙houlong -后门houmen -后面houmian -后期houqi -后勤houqin -后人houren -喉舌houshe -厚实houshi -后嗣housi -后台houtai -后天houtian -后退houtui -后续houxu -候选houxuan -后裔houyi -后缀houzhui -和平共处hpgc -黄埔江hpj -后勤部hqb -何去何从hqhc -合情合理hqhl -好容易hry -好事多磨hsdm -胡思乱想hslx -航天工业部htgb -昏头昏脑hthn -欢天喜地htxd -和*hu -护hu -互hu -湖hu -呼hu -户hu -弧hu -乎hu -胡hu -糊hu -虎hu -忽hu -核*hu -瑚hu -戏*hu -壶hu -葫hu -蝴hu -狐hu -唬hu -沪hu -冱hu -唿hu -囫hu -岵hu -猢hu -怙hu -惚hu -浒hu -滹hu -琥hu -槲hu -轷hu -觳hu -烀hu -煳hu -戽hu -扈hu -祜hu -瓠hu -鹄hu -鹕hu -鹱hu -笏hu -醐hu -斛hu -化hua -花hua -话hua -划hua -滑hua -华hua -画hua -哗hua -猾hua -豁*hua -骅hua -桦hua -砉hua -铧hua -画报huabao -华北huabei -哗变huabian -话柄huabing -划拨huabo -划策huace -画册huace -华东huadong -花朵huaduo -花儿huaer -化肥huafei -花费huafei -划分huafen -化工huagong -华贵huagui -化合huahe -花卉huahui -坏huai -怀huai -划*huai -淮huai -槐huai -徊huai -踝huai -怀抱huaibao -淮北huaibei -坏处huaichu -怀古huaigu -淮海huaihai -怀恨huaihen -怀旧huaijiu -淮南huainan -怀念huainian -坏人huairen -坏事huaishi -怀疑huaiyi -怀着huaizhe -滑稽huaji -画家huajia -话剧huaju -哗啦huala -画廊hualang -华丽huali -画面huamian -化名huaming -还*huan -环huan -换huan -欢huan -缓huan -患huan -幻huan -焕huan -桓huan -唤huan -痪huan -豢huan -涣huan -宦huan -郇huan -奂huan -萑huan -擐huan -圜huan -獾huan -洹huan -浣huan -漶huan -寰huan -逭huan -缳huan -锾huan -鲩huan -鬟huan -华南huanan -欢畅huanchang -缓冲huanchong -幻灯huandeng -欢度huandu -焕发huanfa -黄huang -簧huang -荒huang -皇huang -慌huang -蝗huang -磺huang -凰huang -惶huang -煌huang -晃huang -幌huang -恍huang -谎huang -隍huang -徨huang -湟huang -潢huang -遑huang -璜huang -肓huang -癀huang -蟥huang -篁huang -鳇huang -磺胺huangan -皇朝huangchao -荒诞huangdan -晃荡huangdang -皇帝huangdi -荒废huangfei -黄海huanghai -黄河huanghe -恍惚huanghu -谎话huanghua -黄昏huanghun -黄金huangjin -皇历huangli -荒凉huangliang -荒乱huangluan -慌乱huangluan -慌忙huangmang -荒谬huangmiu -恍然huangran -黄色huangse -黄山huangshan -皇上huangshang -荒唐huangtang -环顾huangu -宦官huanguan -谎言huangyan -慌张huangzhang -幌子huangzi -缓和huanhe -欢呼huanhu -环环huanhuan -滑腻huani -花鸟huaniao -还给huanji -缓急huanji -还价huanjia -环节huanjie -环境huanjing -幻境huanjing -幻景huanjing -欢聚huanju -幻觉huanjue -欢乐huanle -缓慢huanman -患难huannan -唤起huanqi -缓期huanqi -欢庆huanqing -环球huanqiu -寰球huanqiu -换取huanqu -环绕huanrao -涣散huansan -欢声huansheng -环视huanshi -欢送huansong -换算huansuan -欢腾huanteng -欢喜huanxi -幻想huanxiang -欢笑huanxiao -欢心huanxin -欢欣huanxin -环行huanxing -缓刑huanxing -唤醒huanxing -幻影huanying -欢迎huanying -寰宇huanyu -还原huanyuan -患者huanzhe -滑坡huapo -花腔huaqiang -华侨huaqiao -划清huaqing -花圈huaquan -划拳huaquan -哗然huaran -华人huaren -花色huase -化身huashen -化石huashi -划算huasuan -话题huati -滑头huatou -花纹huawen -华夏huaxia -化纤huaxian -画像huaxiang -花絮huaxu -化学huaxue -画押huaya -化验huayan -花样huayang -华裔huayi -话音huayin -话语huayu -花园huayuan -画展huazhan -花招huazhao -华中huazhong -化装huazhuang -化妆huazhuang -湖北hubei -胡扯huche -弧度hudu -忽而huer -呼喊huhan -呼号huhao -呼唤huhuan -互惠huhui -会hui -回hui -灰hui -挥hui -辉hui -汇hui -毁hui -慧hui -恢hui -绘hui -惠hui -徽hui -溃*hui -堕*hui -徊*hui -蛔hui -悔hui -卉hui -晦hui -贿hui -秽hui -烩hui -讳hui -诲hui -诙hui -茴hui -荟hui -蕙hui -咴hui -哕hui -喙hui -隳hui -洄hui -浍hui -彗hui -缋hui -珲hui -桧*hui -晖hui -恚hui -虺hui -蟪hui -麾hui -灰暗huian -回报huibao -汇报huibao -回避huibi -汇编huibian -会场huichang -回潮huichao -灰尘huichen -回春huichun -荟萃huicui -回答huida -回荡huidang -回电huidian -汇兑huidui -挥发huifa -汇费huifei -会风huifeng -回复huifu -恢复huifu -悔改huigai -回顾huigu -惠顾huigu -悔过huiguo -会合huihe -回合huihe -汇合huihe -悔恨huihen -恢弘huihong -会话huihua -回话huihua -绘画huihua -毁坏huihuai -辉煌huihuang -挥霍huihuo -会集huiji -回击huiji -汇集huiji -回家huijia -会见huijian -会聚huiju -汇聚huiju -回扣huikou -汇款huikuan -回来huilai -回笼huilong -汇率huilu -贿赂huilu -会面huimian -毁灭huimie -回民huimin -汇票huipiao -回去huiqu -挥洒huisa -灰色huise -晦涩huise -回收huishou -回首huishou -会谈huitan -会堂huitang -会同huitong -回头huitou -回味huiwei -会晤huiwu -挥舞huiwu -悔悟huiwu -麾下huixia -回想huixiang -回响huixiang -诙谐huixie -灰心huixin -彗星huixing -会演huiyan -汇演huiyan -会议huiyi -回忆huiyi -回音huiyin -辉映huiying -会员huiyuan -会战huizhan -徽章huizhang -会诊huizhen -绘制huizhi -回转huizhuan -汇总huizong -回族huizu -户籍huji -呼叫hujiao -户口hukou -虎口hukou -护理huli -互利huli -护林hulin -呼噜hulu -胡乱huluan -忽略hulue -互勉humian -混hun -浑hun -荤hun -昏hun -婚hun -魂hun -诨hun -馄hun -阍hun -溷hun -湖南hunan -胡闹hunao -昏沉hunchen -混合hunhe -浑厚hunhou -昏黄hunhuang -混迹hunji -婚礼hunli -混乱hunluan -糊弄hunong -婚配hunpei -混入hunru -浑身hunshen -混同huntong -混淆hunxiao -婚姻hunyin -昏庸hunyong -混杂hunza -混帐hunzhang -混浊hunzhuo -浑浊hunzhuo -和*huo -活huo -或huo -火huo -货huo -获huo -伙huo -霍huo -豁huo -惑huo -祸huo -劐huo -藿huo -攉huo -嚯huo -夥huo -钬huo -锪huo -镬huo -耠huo -蠖huo -火把huoba -伙伴huoban -火暴huobao -货币huobi -火柴huochai -火车huoche -豁达huoda -获得huode -霍地huodi -活动huodong -伙房huofang -祸根huogen -祸害huohai -火候huohou -火化huohua -火花huohua -祸患huohuan -活活huohuo -伙计huoji -火箭huojian -火警huojing -火炬huoju -火坑huokeng -活力huoli -霍乱huoluan -活泼huopo -获取huoqu -豁然huoran -货色huose -火山huoshan -获胜huosheng -或是huoshi -伙食huoshi -祸首huoshou -伙同huotong -货物huowu -获悉huoxi -火线huoxian -活现huoxian -或许huoxu -火药huoyao -活页huoye -活跃huoyue -货运huoyun -火灾huozai -火葬huozang -或则huoze -或者huozhe -获准huozhun -湖泊hupo -忽然huran -呼声husheng -护士hushi -忽视hushi -湖水hushui -胡说hushuo -护送husong -胡同hutong -互通hutong -户头hutou -糊涂hutu -护卫huwei -呼吸huxi -互相huxiang -呼啸huxiao -虎穴huxue -护养huyang -呼应huying -呼吁huyu -护照huzhao -互助huzhu -毫无疑问hwyw -互相爱护hxah -横行霸道hxbd -互相帮助hxbz -欢欣鼓舞hxgw -候选人hxr -合作化hzh -杭州市hzs -化整为零hzwl -级j -就j -进j -加j -经j -家j -结j -阶j -间j -件j -及j -解j -较j -机j -军j -接j -教j -极j -九j -见j -基本国策jbgc -基本上jbs -据不完全统计jbwj -饥不择食jbzs -坚持不懈jcbx -集成电路jcdl -基础上jcs -绝大部分jdbf -坚定不移jdby -绝大多数jdds -鉴定会jdh -绝对化jdh -经得起jdq -见多识广jdsg -精打细算jdxs -接二连三jels -解放后jfh -解放军jfj -解放军报jfjb -解放前jfq -仅供参考jgck -机构改革jggg -坚固耐用jgny -襟怀坦白jhtb -计划性jhx -级ji -及ji -机ji -极ji -几ji -积ji -给ji -基ji -其*ji -记ji -己ji -期*ji -系*ji -革*ji -计ji -集ji -即ji -际ji -季ji -激ji -济ji -技ji -击ji -继ji -急ji -剂ji -既ji -纪ji -寄ji -挤ji -鸡ji -迹ji -绩ji -齐*ji -奇*ji -吉ji -脊ji -辑ji -籍ji -疾ji -肌ji -棘ji -畸ji -圾ji -稽ji -箕ji -饥ji -讥ji -姬ji -缉ji -汲ji -嫉ji -蓟ji -冀ji -伎ji -祭ji -悸ji -寂ji -忌ji -妓ji -藉ji -丌ji -亟ji -乩ji -剞ji -佶ji -偈ji -诘ji -墼ji -芨ji -芰ji -荠ji -蒺ji -蕺ji -掎ji -叽ji -咭ji -哜ji -唧ji -岌ji -嵴ji -洎ji -屐ji -骥ji -畿ji -玑ji -楫ji -殛ji -戟ji -戢ji -赍ji -觊ji -犄ji -齑ji -矶ji -羁ji -嵇ji -稷ji -瘠ji -虮ji -笈ji -笄ji -暨ji -跻ji -跽ji -霁ji -鲚ji -鲫ji -髻ji -麂ji -加jia -家jia -架jia -价jia -甲jia -夹jia -假jia -钾jia -贾jia -稼jia -驾jia -嘉jia -枷jia -佳jia -荚jia -颊jia -嫁jia -茄*jia -挟*jia -嘏*jia -伽jia -郏jia -葭jia -岬jia -浃jia -迦jia -珈jia -戛jia -胛jia -恝jia -铗jia -镓jia -痂jia -瘕jia -袷jia -蛱jia -笳jia -袈jia -跏jia -加班jiaban -甲板jiaban -加倍jiabei -甲虫jiachong -家畜jiachu -家当jiadang -家底jiadi -假定jiading -加法jiafa -家访jiafang -价格jiage -加工jiagong -佳话jiahua -家伙jiahuo -加急jiaji -嘉奖jiajiang -家教jiajiao -嫁接jiajie -佳节jiajie -假借jiajie -加紧jiajin -家境jiajing -家具jiaju -加剧jiaju -加快jiakuai -加仑jialun -加码jiama -假冒jiamao -家门jiamen -加密jiami -加冕jiamian -价目jiamu -间jian -件jian -见jian -建jian -坚jian -减jian -检jian -践jian -尖jian -简jian -碱jian -剪jian -艰jian -渐jian -肩jian -键jian -健jian -柬jian -鉴jian -剑jian -歼jian -监jian -兼jian -浅*jian -奸jian -箭jian -茧jian -舰jian -俭jian -笺jian -煎jian -缄jian -硷jian -拣jian -捡jian -荐jian -槛jian -贱jian -饯jian -溅jian -涧jian -僭jian -谏jian -谫jian -菅jian -蒹jian -搛jian -囝*jian -湔jian -蹇jian -謇jian -缣jian -枧jian -楗jian -戋jian -戬jian -牮jian -犍jian -毽jian -腱jian -睑jian -锏jian -鹣jian -裥jian -笕jian -翦jian -趼jian -踺jian -鲣jian -鞯jian -吉安jian -煎熬jianao -简报jianbao -渐变jianbian -简便jianbian -简编jianbian -鉴别jianbie -兼并jianbing -尖兵jianbing -剪裁jiancai -剪彩jiancai -检测jiance -检查jiancha -检察jiancha -监察jiancha -减产jianchan -建成jiancheng -简称jiancheng -坚持jianchi -简单jiandan -建党jiandang -减低jiandi -检点jiandian -间谍jiandie -坚定jianding -鉴定jianding -监督jiandu -间断jianduan -尖端jianduan -简短jianduan -舰队jiandui -健儿jianer -减法jianfa -肩负jianfu -将jiang -降jiang -讲jiang -强*jiang -江jiang -浆jiang -蒋jiang -奖jiang -疆jiang -僵jiang -姜jiang -桨jiang -匠jiang -酱jiang -茳jiang -洚jiang -绛jiang -缰jiang -犟jiang -礓jiang -耩jiang -糨jiang -豇jiang -奖杯jiangbei -疆场jiangchang -奖惩jiangcheng -僵持jiangchi -降低jiangdi -间隔jiange -讲稿jianggao -江湖jianghu -僵化jianghua -讲话jianghua -降级jiangji -降价jiangjia -讲解jiangjie -疆界jiangjie -将近jiangjin -奖金jiangjin -讲究jiangjiu -僵局jiangju -将军jiangjun -讲课jiangke -将来jianglai -讲理jiangli -奖励jiangli -降临jianglin -将领jiangling -降落jiangluo -江南jiangnan -奖品jiangpin -讲评jiangping -奖券jiangquan -江山jiangshan -讲师jiangshi -僵尸jiangshi -讲授jiangshou -讲述jiangshu -降水jiangshui -江苏jiangsu -讲台jiangtai -讲坛jiangtan -疆土jiangtu -坚固jiangu -兼顾jiangu -监管jianguan -建国jianguo -降温jiangwen -江西jiangxi -讲习jiangxi -匠心jiangxin -讲学jiangxue -讲演jiangyan -将要jiangyao -讲义jiangyi -僵硬jiangying -奖章jiangzhang -讲座jiangzuo -监护jianhu -简化jianhua -间或jianhuo -奸计jianji -歼击jianji -剪辑jianji -减价jianjia -渐渐jianjian -健将jianjiang -建交jianjiao -间接jianjie -见解jianjie -简介jianjie -简洁jianjie -简捷jianjie -渐进jianjin -监禁jianjin -检举jianju -艰巨jianju -坚决jianjue -健康jiankang -尖刻jianke -坚苦jianku -艰苦jianku -监牢jianlao -建立jianli -尖利jianli -简历jianli -简练jianlian -简陋jianlou -简略jianlue -健美jianmei -减免jianmian -歼灭jianmie -简明jianming -缄默jianmo -艰难jiannan -键盘jianpan -简拼jianpin -简朴jianpu -俭朴jianpu -坚强jianqiang -减轻jianqing -健全jianquan -兼任jianren -坚韧jianren -兼容jianrong -尖锐jianrui -减弱jianruo -艰涩jianse -鉴赏jianshang -减少jianshao -建设jianshe -艰深jianshen -见识jianshi -坚实jianshi -监视jianshi -建树jianshu -减速jiansu -检索jiansuo -践踏jianta -健谈jiantan -检讨jiantao -简体jianti -舰艇jianting -减退jiantui -健忘jianwang -间文jianwen -见闻jianwen -间隙jianxi -奸细jianxi -艰险jianxian -见效jianxiao -间歇jianxie -简写jianxie -坚信jianxin -艰辛jianxin -减刑jianxing -检修jianxiu -简讯jianxun -检验jianyan -简要jianyao -建议jianyi -坚毅jianyi -简易jianyi -奸淫jianyin -坚硬jianying -剪影jianying -鉴于jianyu -监狱jianyu -减员jianyuan -检阅jianyue -建造jianzao -简则jianze -坚贞jianzhen -监制jianzhi -简直jianzhi -兼职jianzhi -建筑jianzhu -简装jianzhuang -健壮jianzhuang -较jiao -教jiao -交jiao -角jiao -叫jiao -脚jiao -胶jiao -浇jiao -焦jiao -觉*jiao -校*jiao -搅jiao -酵jiao -郊jiao -铰jiao -窖jiao -椒jiao -礁jiao -骄jiao -娇jiao -嚼jiao -矫jiao -侥jiao -狡jiao -饺jiao -缴jiao -绞jiao -剿jiao -轿jiao -佼jiao -僬jiao -艽jiao -茭jiao -挢jiao -噍jiao -峤jiao -徼jiao -湫*jiao -姣jiao -敫jiao -皎jiao -鹪jiao -蛟jiao -醮jiao -跤jiao -鲛jiao -骄傲jiaoao -搅拌jiaoban -狡辩jiaobian -教材jiaocai -交叉jiaocha -教程jiaocheng -交错jiaocuo -较大jiaoda -交代jiaodai -交淡jiaodan -教导jiaodao -交点jiaodian -焦点jiaodian -校订jiaoding -角度jiaodu -校对jiaodui -较多jiaoduo -焦耳jiaoer -交锋jiaofeng -交付jiaofu -浇灌jiaoguan -娇贵jiaogui -叫喊jiaohan -较好jiaohao -叫好jiaohao -狡猾jiaohua -交换jiaohuan -叫唤jiaohuan -教诲jiaohui -缴获jiaohuo -交际jiaoji -矫健jiaojian -交接jiaojie -交界jiaojie -叫苦jiaoku -较快jiaokuai -教练jiaolian -较量jiaoliang -交流jiaoliu -搅乱jiaoluan -角落jiaoluo -叫骂jiaoma -剿灭jiaomie -酵母jiaomu -交纳jiaona -缴纳jiaona -娇嫩jiaonen -交配jiaopei -骄气jiaoqi -交情jiaoqing -郊区jiaoqu -叫嚷jiaorang -角色jiaose -交涉jiaoshe -教师jiaoshi -教授jiaoshou -教唆jiaosuo -脚踏jiaota -交谈jiaotan -教堂jiaotang -交替jiaoti -教条jiaotiao -交通jiaotong -郊外jiaowai -交往jiaowang -较为jiaowei -狡黠jiaoxia -叫嚣jiaoxiao -侥幸jiaoxing -绞刑jiaoxing -教学jiaoxue -教训jiaoxun -教养jiaoyang -骄阳jiaoyang -教益jiaoyi -交易jiaoyi -交谊jiaoyi -教育jiaoyu -教员jiaoyuan -狡诈jiaozha -校正jiaozheng -脚注jiaozhu -角逐jiaozhu -浇铸jiaozhu -校准jiaozhun -焦灼jiaozhuo -娇纵jiaozong -叫做jiaozuo -家谱jiapu -假期jiaqi -价钱jiaqian -加强jiaqiang -假日jiari -加入jiaru -假如jiaru -假若jiaruo -加上jiashang -假设jiashe -加深jiashen -假使jiashi -架势jiashi -驾驶jiashi -家属jiashu -假说jiashuo -加速jiasu -枷锁jiasuo -家庭jiating -家乡jiaxiang -假想jiaxiang -家业jiaye -加以jiayi -佳音jiayin -家用jiayong -加油jiayou -家园jiayuan -夹杂jiaza -加载jiazai -家长jiazhang -价值jiazhi -加重jiazhong -假装jiazhuang -嫁妆jiazhuang -架子jiazi -家族jiazu -击败jibai -羁绊jiban -几倍jibei -基本jiben -击毙jibi -级别jibie -疾病jibing -计策jice -基层jiceng -稽查jicha -机场jichang -集成jicheng -继承jicheng -计酬jichou -基础jichu -机床jichuang -几次jici -急促jicu -积存jicun -寄存jicun -极大jida -亟待jidai -激荡jidang -记得jide -基地jidi -机电jidian -极点jidian -基调jidiao -机动jidong -激动jidong -极度jidu -几度jidu -即度jidu -季度jidu -基督jidu -嫉妒jidu -忌妒jidu -极端jiduan -结jie -阶jie -解jie -接jie -节jie -家*jie -界jie -截jie -介jie -借jie -价*jie -届jie -街jie -揭jie -洁jie -杰jie -竭jie -皆jie -秸jie -劫jie -桔jie -捷jie -睫jie -姐jie -戒jie -藉jie -芥jie -疥jie -诫jie -楷*jie -偈*jie -讦jie -诘*jie -拮jie -喈jie -嗟jie -婕jie -孑jie -桀jie -碣jie -疖jie -颉jie -蚧jie -羯jie -鲒jie -骱jie -饥饿jie -结案jiean -洁白jiebai -接班jieban -捷报jiebao -戒备jiebei -结彩jiecai -节操jiecao -阶层jieceng -劫持jiechi -杰出jiechu -解除jiechu -接触jiechu -戒除jiechu -揭穿jiechuan -结存jiecun -解答jieda -接待jiedai -借贷jiedai -街道jiedao -解冻jiedong -阶段jieduan -截断jieduan -揭发jiefa -借方jiefang -解放jiefang -街坊jiefang -结构jiegou -解雇jiegu -借故jiegu -结果jieguo -结合jiehe -结核jiehe -结婚jiehun -阶级jieji -接见jiejian -节俭jiejian -借鉴jiejian -结交jiejiao -姐姐jiejie -接近jiejin -竭尽jiejin -结晶jiejing -捷径jiejing -洁净jiejing -解救jiejiu -结局jieju -解决jiejue -孑孓jiejue -解开jiekai -揭开jiekai -解渴jieke -接口jiekou -借口jiekou -借款jiekuan -竭力jieli -接连jielian -揭露jielu -戒律jielu -结论jielun -解闷jiemen -结盟jiemeng -界面jiemian -节目jiemu -揭幕jiemu -接纳jiena -解聘jiepin -解剖jiepou -节气jieqi -接洽jieqia -截取jiequ -既而jier -节日jieri -介入jieru -解散jiesan -介绍jieshao -节省jiesheng -届时jieshi -结实jieshi -解释jieshi -揭示jieshi -解手jieshou -接受jieshou -接收jieshou -结束jieshu -解说jieshuo -结算jiesuan -解体jieti -阶梯jieti -接替jieti -接头jietou -街头jietou -解脱jietuo -结尾jiewei -解围jiewei -接吻jiewen -解析jiexi -界线jiexian -界限jiexian -揭晓jiexiao -戒严jieyan -结业jieye -介意jieyi -接应jieying -结余jieyu -节约jieyue -结帐jiezhang -接着jiezhao -节制jiezhi -介质jiezhi -戒指jiezhi -借支jiezhi -截止jiezhi -借助jiezhu -节奏jiezou -杰作jiezuo -激发jifa -技法jifa -讥讽jifeng -几个jige -及格jige -技工jigong -记功jigong -机构jigou -叽咕jigu -机关jiguan -籍贯jiguan -极光jiguang -激光jiguang -记过jiguo -极好jihao -记号jihao -集合jihe -几何jihe -稽核jihe -几乎jihu -激化jihua -计划jihua -饥荒jihuang -机会jihui -集会jihui -击毁jihui -忌讳jihui -积极jiji -机件jijian -计件jijian -急件jijian -击剑jijian -即将jijiang -计较jijiao -季节jijie -急进jijin -基金jijin -机警jijing -即景jijing -寂静jijing -急救jijiu -积聚jiju -急剧jiju -急遽jiju -寄居jiju -季刊jikan -即刻jike -疾苦jiku -击溃jikui -积累jilei -极力jili -吉利jili -激励jili -伎俩jilia -计量jiliang -寂寥jiliao -激烈jilie -吉林jilin -机灵jiling -激流jiliu -记录jilu -纪律jilu -纪录jilu -辑录jilu -击落jiluo -急忙jimang -机密jimi -寂寞jimo -计谋jimou -进jin -金jin -近jin -紧jin -斤jin -今jin -尽jin -仅jin -劲jin -浸jin -禁jin -津jin -筋jin -锦jin -晋jin -巾jin -襟jin -谨jin -靳jin -烬jin -卺jin -荩jin -堇jin -噤jin -馑jin -廑jin -妗jin -缙jin -瑾jin -槿jin -赆jin -觐jin -衿jin -缉拿jina -济南jinan -禁闭jinbi -锦标jinbiao -进步jinbu -浸沉jinchen -进程jincheng -进出jinchu -紧凑jincou -近代jindai -劲敌jindi -进度jindu -金额jine -机能jineng -技能jineng -进而jiner -进犯jinfan -经jing -精jing -京jing -径jing -井jing -静jing -竟jing -晶jing -净jing -境jing -镜jing -景jing -警jing -劲*jing -茎jing -敬jing -惊jing -睛jing -竞jing -荆jing -兢jing -鲸jing -粳jing -痉jing -靖jing -刭jing -儆jing -阱jing -菁jing -獍jing -憬jing -泾jing -迳jing -弪jing -婧jing -肼jing -胫jing -腈jing -旌jing -靓*jing -敬爱jingai -警报jingbao -警备jingbei -精兵jingbing -精采jingcai -精彩jingcai -警察jingcha -经常jingchang -精粹jingcui -静电jingdian -经典jingdian -惊动jingdong -精度jingdu -经费jingfei -精干jinggan -竟敢jinggan -警告jinggao -经过jingguo -净化jinghua -精华jinghua -经济jingji -竞技jingji -荆棘jingji -精简jingjian -境界jingjie -警戒jingjie -经久jingjiu -惊恐jingkong -经理jingli -经历jingli -精力jingli -敬礼jingli -精练jinglian -精良jingliang -经络jingluo -精美jingmei -精密jingmi -精明jingming -进攻jingong -敬佩jingpei -精辟jingpi -景气jingqi -惊奇jingqi -精巧jingqiao -精确jingque -竟然jingran -竞赛jingsai -景色jingse -经商jingshang -精神jingshen -经手jingshou -经受jingshou -精髓jingsui -静态jingtai -惊叹jingtan -晶体jingti -警惕jingti -精通jingtong -镜头jingtou -筋骨jingu -禁锢jingu -尽管jinguan -巾帼jinguo -经委jingwei -警卫jingwei -敬畏jingwei -景物jingwu -精细jingxi -京戏jingxi -惊险jingxian -景象jingxiang -经销jingxiao -经心jingxin -精心jingxin -惊心jingxin -惊醒jingxing -竞选jingxuan -惊讶jingya -经验jingyan -敬仰jingyang -经营jingying -晶莹jingying -经由jingyou -境遇jingyu -精湛jingzhan -竞争jingzheng -精制jingzhi -径直jingzhi -精致jingzhi -静止jingzhi -净值jingzhi -竟址jingzhi -净重jingzhong -镜子jingzi -静坐jingzuo -近海jinhai -今后jinhou -近乎jinhu -进化jinhua -几年jinian -记念jinian -纪念jinian -晋级jinji -紧急jinji -近郊jinjiao -紧紧jinjin -仅仅jinjin -进军jinjun -进口jinkou -尽快jinkuai -近况jinkuang -进来jinlai -近来jinlai -尽力jinli -尽量jinliang -斤两jinliang -禁令jinling -劲旅jinlu -紧密jinmi -近年jinnian -今年jinnian -金牌jinpai -紧迫jinpo -近期jinqi -近前jinqian -金钱jinqian -尽情jinqing -进去jinqu -进取jinqu -禁区jinqu -近日jinri -今日jinri -金融jinrong -进入jinru -浸入jinru -谨慎jinshen -晋升jinsheng -今是jinshi -尽是jinshi -近视jinshi -金属jinshu -近似jinsi -紧缩jinsuo -今天jintian -津贴jintie -尽头jintou -劲头jintou -浸透jintou -进退jintui -今晚jinwan -今昔jinxi -尽心jinxin -进行jinxing -进修jinxiu -锦秀jinxiu -谨严jinyan -紧要jinyao -进展jinzhan -紧张jinzhang -今朝jinzhao -紧着jinzhe -禁止jinzhi -尽职jinzhi -进驻jinzhu -金子jinzi -炯jiong -窘jiong -迥jiong -炅*jiong -扃jiong -窘迫jiongpo -迥然jiongran -击破jipo -急迫jipo -及其jiqi -极其jiqi -激起jiqi -机器jiqi -机枪jiqiang -技巧jiqiao -急切jiqie -激情jiqing -汲取jiqu -集权jiquan -既然jiran -己任jiren -继任jiren -即日jiri -吉日jiri -肌肉jirou -极少jishao -寄生jisheng -即是jishi -及时jishi -几时jishi -计时jishi -即时jishi -即使jishi -记事jishi -基石jishi -集市jishi -级数jishu -基数jishu -计数jishu -记述jishu -技术jishu -祭祀jisi -激素jisu -急速jisu -计算jisuan -机体jiti -集体jiti -肌体jiti -几天jitian -集团jituan -寄托jituo -就jiu -九jiu -旧jiu -究jiu -久jiu -救jiu -酒jiu -纠jiu -揪jiu -玖jiu -韭jiu -灸jiu -厩jiu -臼jiu -舅jiu -咎jiu -疚jiu -僦jiu -啾jiu -阄jiu -柩jiu -桕jiu -鸠jiu -鹫jiu -赳jiu -鬏jiu -就餐jiucan -纠察jiucha -纠缠jiuchan -就此jiuci -就地jiudi -就范jiufan -纠纷jiufen -纠葛jiuge -救国jiuguo -救护jiuhu -救火jiuhuo -纠集jiuji -鸠集jiuji -救济jiuji -救急jiuji -九江jiujiang -九届jiujie -就近jiujin -酒精jiujing -究竟jiujing -救命jiuming -救生jiusheng -就是jiushi -就事jiushi -救亡jiuwang -久违jiuwei -酒窝jiuwo -酒席jiuxi -救险jiuxian -揪心jiuxin -救星jiuxing -就绪jiuxu -就学jiuxue -久仰jiuyang -就要jiuyao -就业jiuye -久远jiuyuan -九月jiuyue -救灾jiuzai -纠正jiuzheng -就职jiuzhi -救治jiuzhi -九洲jiuzhou -救助jiuzhu -极为jiwei -纪委jiwei -极限jixian -迹象jixiang -吉祥jixiang -讥笑jixiao -机械jixie -记性jixing -急性jixing -畸形jixing -即兴jixing -吉凶jixiong -几许jixu -积蓄jixu -继续jixu -记叙jixu -急需jixu -集训jixun -积压jiya -羁押jiya -给养jiyang -机要jiyao -纪要jiyao -给以jiyi -记忆jiyi -技艺jiyi -基因jiyin -急用jiyong -基于jiyu -急于jiyu -机遇jiyu -给予jiyu -寄予jiyu -觊觎jiyu -纪元jiyuan -集约jiyue -记载jizai -及早jizao -急躁jizao -激增jizeng -记帐jizhang -记者jizhe -集镇jizhen -机制jizhi -及至jizhi -机智jizhi -集中jizhong -击中jizhong -记住jizhu -基准jizhun -集资jizi -经济核算jjhs -聚精会神jjhs -将计就计jjjj -戒骄戒躁jjjz -近几年来jjnl -竭尽全力jjql -节假日jjr -积极性jjx -经济效益jjxy -兢兢业业jjyy -精简整编jjzb -叽叽喳喳jjzz -艰苦奋斗jkfd -尽可能jkn -教科书jks -俱乐部jlb -交流电jld -吉林省jls -价廉物美jlwm -纪律性jlx -纪念碑jnb -几年来jnl -近年来jnl -纪念品jnp -济南市jns -吉普车jpc -坚强不屈jqbq -奖勤罚懒jqfl -机器人jqr -急起直追jqzz -截然不同jrbt -兼容性jrx -积少成多jscd -金山公司jsgs -集思广益jsgy -精神焕发jshf -计算机jsj -尽善尽美jsjm -集市贸易jsmy -介绍人jsr -就是说jss -计算所jss -江苏省jss -举世闻名jswm -介绍信jsx -技术员jsy -计算中心jszx -交通部jtb -家庭出身jtcs -惊天动地jtdd -具体地说jtds -晶体管jtg -交通工具jtgj -脚踏实地jtsd -具体说来jtsl -具ju -据ju -局ju -举ju -车*ju -句ju -聚ju -距ju -巨ju -居ju -锯ju -剧ju -矩ju -拒ju -柜*ju -桔*ju -鞠ju -拘ju -狙ju -疽ju -驹ju -菊ju -咀ju -沮ju -踞ju -俱ju -惧ju -炬ju -倨ju -讵ju -苣ju -苴ju -莒ju -掬ju -遽ju -屦ju -琚ju -枸*ju -椐ju -榘ju -榉ju -橘ju -犋ju -飓ju -钜ju -锔ju -窭ju -裾ju -趄ju -醵ju -踽ju -龃ju -雎ju -瞿*ju -鞫ju -卷juan -捐juan -鹃juan -娟juan -倦juan -眷juan -绢juan -俊*juan -鄄juan -狷juan -涓juan -桊juan -蠲juan -锩juan -镌juan -隽juan -卷进juanjin -捐款juankuan -眷恋juanlian -眷念juannian -捐躯juanqu -卷入juanru -眷属juanshu -捐献juanxian -卷烟juanyan -卷帙juanzhi -捐助juanzhu -卷宗juanzong -举办juban -具备jubei -剧本juben -巨变jubian -局部jubu -拘捕jubu -剧场juchang -据此juci -巨大juda -举动judong -居多juduo -决jue -觉jue -绝jue -角*jue -脚*jue -掘jue -嚼*jue -撅jue -攫jue -抉jue -倔jue -爵jue -诀jue -厥jue -劂jue -谲jue -矍jue -蕨jue -嗟*jue -噘jue -噱jue -崛jue -獗jue -孓jue -珏jue -桷jue -橛jue -爝jue -镢jue -蹶jue -觖jue -巨额jue -诀别juebie -决不juebu -绝不juebu -决策juece -觉察juecha -觉得juede -决定jueding -决断jueduan -绝对juedui -绝迹jueji -倔强juejiang -绝交juejiao -绝径juejing -绝境juejing -绝句jueju -决裂juelie -绝路juelu -绝密juemi -绝妙juemiao -崛起jueqi -诀窍jueqiao -决赛juesai -绝食jueshi -决死juesi -决算juesuan -绝望juewang -爵位juewei -觉悟juewu -决心juexin -觉醒juexing -决议jueyi -绝缘jueyuan -抉择jueze -决战juezhan -绝招juezhao -绝症juezheng -巨幅jufu -居功jugong -鞠躬jugong -句号juhao -聚合juhe -聚会juhui -聚集juji -巨匠jujiang -拘谨jujin -拒绝jujue -咀嚼jujue -距离juli -举例juli -剧烈julie -拘留juliu -局面jumian -居民jumin -剧目jumu -军jun -均jun -菌jun -君jun -龟*jun -钧jun -峻jun -俊jun -竣jun -浚jun -郡jun -骏jun -捃jun -皲jun -筠jun -麇jun -军操juncao -君臣junchen -均等jundeng -军队jundui -军法junfa -军阀junfa -军服junfu -军港jungang -军工jungong -竣工jungong -均衡junheng -军火junhuo -拘泥juni -军机junji -军纪junji -军舰junjian -俊杰junjie -军垦junken -军粮junliang -军令junling -骏马junma -军民junmin -军旗junqi -峻峭junqiao -俊俏junqiao -军区junqu -军权junquan -军人junren -军事junshi -军师junshi -军属junshu -军团juntuan -军委junwei -军衔junxian -军校junxiao -军械junxie -军心junxin -俊秀junxiu -军需junxu -军训junxun -军医junyi -军营junying -军用junyong -军邮junyou -均匀junyun -军长junzhang -军政junzheng -君主junzhu -军装junzhuang -君子junzi -俱全juquan -居然juran -遽然juran -沮丧jusang -局势jushi -举手jushou -拘束jushu -据说jushuo -具体juti -剧团jutuan -据悉juxi -局限juxian -居心juxin -举行juxing -矩形juxing -巨型juxing -具有juyou -据有juyou -剧院juyuan -局长juzhang -剧照juzhao -举止juzhi -居中juzhong -剧终juzhong -巨著juzhu -居住juzhu -句子juzi -节外生枝jwsz -惊心动魄jxdp -继续革命jxgm -机械化jxh -江西省jxs -谨小慎微jxsw -局限性jxx -教育部jyb -进一步jyb -家用电器jydq -教育方针jyfz -家喻户晓jyhx -加以解决jyjj -记忆力jyl -精益求精jyqj -教研室jys -见义勇为jyyw -旧中国jzg -建筑物jzw -可k -开k -看k -克k -孔k -科k -口k -空k -苦k -快k -考k -刻k -靠k -况k -块k -困k -宽k -矿k -抗k -卡k -卡ka -喀ka -咖ka -咯ka -佧ka -咔ka -胩ka -喀嚓kacha -卡车kache -咖啡kafei -开kai -凯kai -揩kai -楷kai -慨kai -剀kai -垲kai -蒈kai -忾kai -恺kai -铠kai -锎kai -锴kai -开办kaiban -开遍kaibian -开采kaicai -开场kaichang -开车kaiche -开除kaichu -开创kaichuang -开导kaidao -开刀kaidao -开动kaidong -开端kaiduan -开发kaifa -开放kaifang -开封kaifeng -开赴kaifu -凯歌kaige -开关kaiguan -开航kaihang -开户kaihu -开花kaihua -开怀kaihuai -开荒kaihuang -开会kaihui -开掘kaijue -开垦kaiken -开口kaikou -开矿kaikuang -开阔kaikuo -开朗kailang -开郎kailang -开路kailu -开明kaiming -楷模kaimo -开幕kaimu -开炮kaipao -开辟kaipi -开启kaiqi -开枪kaiqiang -开窍kaiqiao -开设kaishe -开始kaishi -开庭kaiting -开头kaitou -开脱kaituo -开拓kaituo -开外kaiwai -开销kaixiao -开心kaixin -凯旋kaixuan -开学kaixue -开颜kaiyan -开业kaiye -开战kaizhan -开展kaizhan -开张kaizhang -开支kaizhi -看kan -刊kan -坎kan -槛*kan -堪kan -勘kan -砍kan -嵌*kan -侃kan -莰kan -阚*kan -戡kan -龛kan -瞰kan -勘测kance -勘察kancha -看出kanchu -看待kandai -看到kandao -刊登kandeng -看法kanfa -砍伐kanfa -抗kang -康kang -炕kang -慷kang -糠kang -扛kang -亢kang -伉kang -闶kang -钪kang -亢奋kangfen -康复kangfu -抗衡kangheng -抗击kangji -亢进kangjin -抗拒kangju -伉俪kangli -抗日kangri -看管kanguan -抗议kangyi -看见kanjian -坎坷kanke -看来kanlai -看齐kanqi -刊头kantou -看望kanwang -刊物kanwu -勘误kanwu -看样kanyang -刊载kanzai -考kao -靠kao -拷kao -烤kao -尻kao -栲kao -犒kao -铐kao -拷贝kaobei -靠边kaobian -考查kaocha -考察kaocha -考核kaohe -靠近kaojin -考究kaojiu -靠拢kaolong -考虑kaolu -考勤kaoqin -靠山kaoshan -考试kaoshi -考题kaoti -考验kaoyan -考证kaozheng -卡片kapian -看不惯kbg -看不起kbq -刻不容缓kbrh -开诚布公kcbg -矿产资源kczy -扩大化kdh -可ke -克ke -科ke -刻ke -客ke -壳ke -颗ke -棵ke -柯ke -呵*ke -坷ke -苛ke -磕ke -咳ke -渴ke -课ke -嗑ke -岢ke -恪ke -溘ke -骒ke -缂ke -珂ke -轲ke -氪ke -瞌ke -钶ke -锞ke -稞ke -疴ke -窠ke -颏ke -蝌ke -髁ke -可爱keai -科班keban -课本keben -可比kebi -刻薄kebo -可不kebu -客车keche -课程kecheng -可耻kechi -可恶kee -可风kefeng -可否kefou -克服kefu -可观keguan -客观keguan -可贵kegui -可好kehao -可恨kehen -刻划kehua -刻画kehua -克己keji -客机keji -科技keji -可见kejian -科教kejiao -可敬kejing -窠臼kejiu -科举keju -可靠kekao -苛刻keke -可口kekou -克扣kekou -刻苦keku -克拉kela -克朗kelang -颗粒keli -可怜kelian -科目kemu -肯ken -啃ken -垦ken -恳ken -裉ken -肯定kending -可能keneng -坑keng -吭keng -铿keng -坑道kengdao -坑害kenghai -铿锵kengqiang -恳切kenqie -恳求kenqiu -垦殖kenzhi -可怕kepa -磕碰kepeng -科普kepu -客气keqi -可亲keqin -可取kequ -客人keren -客商keshang -可是keshi -科室keshi -课堂ketang -客套ketao -课题keti -客体keti -客厅keting -磕头ketou -可望kewang -渴望kewang -可喜kexi -可惜kexi -可行kexing -科学kexue -科研keyan -可以keyi -可疑keyi -刻意keyi -科员keyuan -科长kezhang -可知kezhi -克制kezhi -狂风暴雨kfby -克己奉公kjfg -科技司kjs -苦口婆心kkpx -昆明市kms -可能性knx -孔kong -空kong -控kong -恐kong -倥kong -崆kong -箜kong -空白kongbai -恐怖kongbu -控拆kongchai -空洞kongdong -空额konge -空乏kongfa -控告konggao -空喊konghan -恐吓konghe -空话konghua -恐慌konghuang -空间kongjian -空降kongjiang -恐惧kongju -空军kongjun -空旷kongkuang -恐龙konglong -空虑konglu -恐怕kongpa -空气kongqi -空前kongqian -孔雀kongque -控诉kongsu -空谈kongtan -空头kongtou -空文kongwen -空隙kongxi -空闲kongxian -空想kongxiang -空虚kongxu -空运kongyun -控制kongzhi -空中kongzhong -口kou -扣kou -抠kou -寇kou -芤kou -蔻kou -叩kou -眍kou -筘kou -口岸kouan -叩拜koubai -口才koucai -扣除kouchu -口传kouchuan -口服koufu -口供kougong -口号kouhao -口红kouhong -口角koujiao -口径koujing -口诀koujue -口令kouling -扣留kouliu -口气kouqi -口腔kouqiang -口哨koushao -口试koushi -口述koushu -口头koutou -叩头koutou -口信kouxin -扣押kouya -口语kouyu -看起来kql -口若悬河krxh -口是心非ksxf -苦ku -库ku -枯ku -酷ku -哭ku -窟ku -裤ku -刳ku -堀ku -喾ku -绔ku -骷ku -跨kua -夸kua -垮kua -挎kua -胯kua -侉kua -跨步kuabu -夸大kuada -跨度kuadu -会*kuai -快kuai -块kuai -筷kuai -侩kuai -蒯kuai -郐kuai -哙kuai -狯kuai -浍*kuai -脍kuai -会计kuaiji -快乐kuaile -快速kuaisu -宽kuan -款kuan -髋kuan -宽敞kuanchang -宽绰kuanchuo -宽大kuanda -宽待kuandai -款待kuandai -宽度kuandu -况kuang -矿kuang -狂kuang -框kuang -匡kuang -筐kuang -眶kuang -旷kuang -诓kuang -诳kuang -邝kuang -圹kuang -夼kuang -哐kuang -纩kuang -贶kuang -矿藏kuangcang -矿产kuangchan -狂风kuangfeng -矿工kuanggong -旷工kuanggong -矿井kuangjing -框框kuangkuang -哐啷kuanglang -况且kuangqie -矿区kuangqu -矿泉kuangquan -狂热kuangre -矿山kuangshan -矿石kuangshi -框图kuangtu -宽广kuanguang -狂妄kuangwang -矿物kuangwu -旷野kuangye -宽宏kuanhong -宽厚kuanhou -宽阔kuankuo -宽容kuanrong -款式kuanshi -宽恕kuanshu -款项kuanxiang -宽心kuanxin -宽裕kuanyu -垮台kuatai -跨越kuayue -夸张kuazhang -裤衩kucha -库存kucun -哭喊kuhan -奎kui -溃kui -馈kui -亏kui -盔kui -岿kui -窥kui -葵kui -魁kui -傀kui -愧kui -馗kui -匮kui -夔kui -隗kui -蒉kui -揆kui -喹kui -喟kui -悝kui -愦kui -逵kui -暌kui -睽kui -聩kui -蝰kui -篑kui -跬kui -亏本kuiben -窥测kuice -亏待kuidai -愧疚kuijiu -亏空kuikong -亏损kuisun -魁梧kuiwu -溃疡kuiyang -枯竭kujie -库仑kulun -苦闷kumen -枯木kumu -困kun -昆kun -坤kun -捆kun -悃kun -阃kun -琨kun -锟kun -醌kun -鲲kun -髡kun -苦难kunan -苦恼kunao -困厄kune -困乏kunfa -困惑kunhuo -困境kunjing -困苦kunku -昆明kunming -困难kunnan -扩kuo -括kuo -适*kuo -阔kuo -廓kuo -栝*kuo -蛞kuo -阔别kuobie -扩充kuochong -阔绰kuochuo -扩大kuoda -括号kuohao -扩建kuojian -阔气kuoqi -扩展kuozhan -扩张kuozhang -哭泣kuqi -酷暑kushu -苦头kutou -苦维kuwei -枯萎kuwei -酷刑kuxing -苦于kuyu -枯燥kuzao -可想而知kxez -科学家kxj -科学技术kxjs -可行性kxx -科学院kxy -科研部kyb -开源节流kyjl -看样子kyz -了l -来l -量l -理l -路l -里l -论l -两l -利l -领l -流l -力l -立l -料l -连l -老l -六l -轮l -类l -列l -拉la -落*la -啦la -蜡la -腊la -蓝la -垃la -喇la -辣la -剌la -邋la -旯la -砬la -瘌la -喇叭laba -来lai -赖lai -莱lai -崃lai -徕lai -涞lai -濑lai -赉lai -睐lai -铼lai -癞lai -籁lai -来宾laibin -来到laidao -来犯laifan -来访laifang -来函laihan -来回laihui -来历laili -来临lailin -赖皮laipi -来日lairi -来势laishi -来头laitou -来往laiwang -来信laixin -来源laiyuan -来者laizhe -来自laizi -癞子laizi -辣椒lajiao -拉拢lalong -喇嘛lama -腊梅lamei -兰lan -烂lan -蓝lan -览lan -栏lan -婪lan -拦lan -篮lan -阑lan -澜lan -谰lan -揽lan -懒lan -缆lan -滥lan -岚lan -漤lan -榄lan -斓lan -罱lan -镧lan -褴lan -蓝本lanben -懒怠landai -滥调landiao -懒惰landuo -浪lang -朗lang -郎lang -狼lang -琅lang -榔lang -廊lang -莨lang -蒗lang -啷lang -阆lang -锒lang -稂lang -螂lang -栏杆langan -狼狈langbei -浪潮langchao -浪荡langdang -朗读langdu -浪费langfei -狼藉langji -浪漫langman -朗诵langsong -郎中langzhong -兰花lanhua -拦截lanjie -烂漫lanman -懒散lansan -蓝色lanse -缆绳lansheng -烂熟lanshu -蓝天lantian -蓝图lantu -阑尾lanwei -拦腰lanyao -滥用lanyong -兰州lanzhou -老lao -劳lao -落*lao -牢lao -涝lao -捞lao -络*lao -佬lao -姥lao -酪lao -烙lao -潦*lao -唠lao -崂lao -栳lao -铑lao -铹lao -痨lao -耢lao -醪lao -老板laoban -老伴laoban -老本laoben -劳动laodong -牢固laogu -老汉laohan -老化laohua -牢记laoji -劳驾laojia -牢靠laokao -劳苦laoku -牢牢laolao -劳累laolei -劳力laoli -老练laolian -牢笼laolong -劳模laomo -老年laonian -老人laoren -牢骚laosao -老少laoshao -老是laoshi -老实laoshi -老师laoshi -老乡laoxiang -老爷laoye -烙印laoyin -劳支laozhi -劳资laozi -劳作laozuo -腊月layue -狼狈不堪lbbk -力不从心lbcx -来不及lbj -来不了lbl -了不起lbq -劳动保险ldbx -来得及ldj -劳动量ldl -劳动力ldl -灵丹妙药ldmy -拉丁美洲ldmz -劳动者ldz -劳动致富ldzf -了le -乐le -勒le -肋le -仂le -叻le -泐le -鳓le -乐观leguan -类lei -雷lei -累lei -勒*lei -垒lei -泪lei -镭lei -蕾lei -磊lei -儡lei -擂lei -肋lei -羸lei -诔lei -嘞lei -嫘lei -缧lei -檑lei -耒lei -酹lei -类别leibie -类次leici -雷达leida -雷管leiguan -泪痕leihen -泪花leihua -累积leiji -累计leiji -累进leijin -磊落leiluo -累年leinian -类似leisi -擂台leitai -雷同leitong -类推leitui -类型leixing -雷雨leiyu -累月leiyue -累赘leizhui -勒令leling -冷leng -棱leng -楞leng -塄leng -愣leng -冷藏lengcang -冷淡lengdan -冷宫lenggong -棱角lengjiao -冷静lengjing -冷落lengluo -冷门lengmen -冷漠lengmo -冷暖lengnuan -冷僻lengpi -冷气lengqi -冷却lengque -冷水lengshui -冷遇lengyu -乐趣lequ -勒索lesuo -乐意leyi -乐园leyuan -两个文明lgwm -拉关系lgx -联合国lhg -联合会lhh -两回事lhs -联合体lht -理li -里li -利li -力li -立li -离li -例li -历li -粒li -厘li -礼li -李li -隶li -黎li -璃li -励li -犁li -梨li -丽li -厉li -篱li -狸li -漓li -鲤li -莉li -荔li -吏li -栗li -砾li -傈li -俐li -痢li -沥li -哩li -鬲*li -俪li -俚li -郦li -坜li -苈li -莅li -蓠li -藜li -呖li -唳li -喱li -猁li -悝*li -溧li -澧li -逦li -娌li -嫠li -骊li -缡li -枥li -栎li -轹li -戾li -砺li -詈li -罹li -锂li -鹂li -疠li -疬li -蛎li -蜊li -蠡li -笠li -篥li -粝li -醴li -跞li -雳li -鲡li -鳢li -黧li -俩lia -连lian -联lian -练lian -炼lian -脸lian -链lian -莲lian -镰lian -廉lian -怜lian -涟lian -帘lian -敛lian -恋lian -蔹lian -奁lian -潋lian -濂lian -琏lian -楝lian -殓lian -臁lian -裢lian -裣lian -蠊lian -鲢lian -立案lian -恋爱lianai -联邦lianbang -练兵lianbing -联播lianbo -练达lianda -连队liandui -量liang -两liang -粮liang -良liang -亮liang -梁liang -凉liang -辆liang -粱liang -晾liang -谅liang -墚liang -莨*liang -椋liang -踉liang -靓liang -魉liang -炼钢liangang -两半liangban -量变liangbian -两边liangbian -两便liangbian -两侧liangce -两次liangci -两地liangdi -两点liangdian -量度liangdu -良方liangfang -两广liangguang -良好lianghao -两极liangji -良机liangji -谅解liangjie -量具liangju -凉快liangkuai -两立liangli -两面liangmian -练功liangong -两栖liangqi -两讫liangqi -两全liangquan -粮食liangshi -两手liangshou -凉爽liangshuang -亮堂liangtang -两条liangtiao -两头liangtou -连贯lianguan -联贯lianguan -亮相liangxiang -良心liangxin -两性liangxing -量刑liangxing -两样liangyang -粮油liangyou -良缘liangyuan -粮站liangzhan -两者liangzhe -两重liangzhong -良种liangzhong -量子liangzi -联合lianhe -联欢lianhuan -廉价lianjia -联结lianjie -连接lianjie -联接lianjie -廉洁lianjie -联军lianjun -连累lianlei -联络lianluo -连忙lianmang -联盟lianmeng -怜悯lianmin -连年liannian -脸谱lianpu -连日lianri -炼乳lianru -联赛liansai -脸色lianse -连锁liansuo -练武lianwu -联系lianxi -练习lianxi -怜惜lianxi -联想lianxiang -连续lianxu -涟漪lianyi -联姻lianyin -联营lianying -炼油lianyou -联运lianyun -连载lianzai -了*liao -料liao -疗liao -辽liao -僚liao -撩liao -聊liao -燎liao -寥liao -潦liao -撂liao -镣liao -廖liao -蓼liao -尥liao -嘹liao -獠liao -寮liao -缭liao -钌liao -鹩liao -撩拨liaobo -潦草liaocao -疗程liaocheng -料到liaodao -潦倒liaodao -料定liaoding -了结liaojie -了解liaojie -辽阔liaokuo -料理liaoli -寥寥liaoliao -寥落liaoluo -辽宁liaoning -了却liaoque -了事liaoshi -聊天liaotian -料想liaoxiang -疗养liaoyang -礼拜libai -利弊libi -里边libian -理财licai -理睬licai -立场lichang -里程licheng -历程licheng -立春lichun -历次lici -历代lidai -理当lidang -立冬lidong -列lie -裂lie -烈lie -劣lie -猎lie -冽lie -埒lie -捩lie -咧lie -洌lie -趔lie -躐lie -鬣lie -裂变liebian -列车lieche -列出liechu -列岛liedao -裂缝liefeng -列国lieguo -烈火liehuo -劣迹lieji -列举lieju -裂开liekai -裂口liekou -列宁liening -猎奇lieqi -列强lieqiang -猎取liequ -烈日lieri -列入lieru -劣绅lieshen -烈士lieshi -劣势lieshi -烈属lieshu -裂纹liewen -列席liexi -烈性liexing -立法lifa -立方lifang -礼服lifu -立功ligong -利害lihai -厉害lihai -理化lihua -礼花lihua -理会lihui -离婚lihun -立即liji -理解lijie -礼节lijie -历届lijie -力矩liju -离开likai -理科like -立刻like -理亏likui -历来lilai -历历lili -力量liliang -利率lilu -理论lilun -立论lilun -礼貌limao -里面limian -利民limin -黎民limin -黎明liming -林lin -磷lin -临lin -邻lin -淋lin -麟lin -琳lin -霖lin -鳞lin -凛lin -赁lin -吝lin -蔺lin -啉lin -嶙lin -廪lin -懔lin -遴lin -檩lin -辚lin -膦lin -瞵lin -粼lin -躏lin -淋巴linba -临别linbie -淋病linbing -林场linchang -临床linchuang -临到lindao -领ling -另ling -零ling -令ling -灵ling -岭ling -铃ling -龄ling -凌ling -棱*ling -陵ling -拎ling -玲ling -菱ling -伶ling -羚ling -酃ling -苓ling -呤ling -囹ling -泠ling -绫ling -柃ling -棂ling -瓴ling -聆ling -蛉ling -翎ling -鲮ling -令爱lingai -凌晨lingchen -灵丹lingdan -领导lingdao -领地lingdi -零点lingdian -领队lingdui -灵感linggan -领海linghai -领航linghang -领会linghui -灵魂linghun -灵活linghuo -灵机lingji -零件lingjian -领教lingjiao -灵杰lingjie -领空lingkong -凌空lingkong -玲珑linglong -零乱lingluan -凌乱lingluan -领略linglue -灵敏lingmin -陵墓lingmu -灵巧lingqiao -领取lingqu -令人lingren -凌辱lingru -零散lingsan -领事lingshi -领受lingshou -领司lingsi -零碎lingsui -灵堂lingtang -零头lingtou -领土lingtu -磷光linguang -另外lingwai -领悟lingwu -领先lingxian -领衔lingxian -零星lingxing -领袖lingxiu -另选lingxuan -灵验lingyan -领域lingyu -令尊lingzun -磷火linhuo -历年linian -临界linjie -临近linjin -邻近linjin -邻里linli -淋漓linli -凛冽linlie -临摹linmo -里弄linong -鳞伤linshang -临时linshi -临死linsi -吝惜linxi -临行linxing -林业linye -临战linzhan -临终linzhong -礼炮lipao -李鹏lipeng -礼品lipin -力气liqi -离奇liqi -力求liqiu -立秋liqiu -历任liren -例如liru -利润lirun -离散lisan -理事lishi -历史lishi -隶属lishu -礼堂litang -立体liti -例题liti -力图litu -流liu -六liu -留liu -刘liu -硫liu -柳liu -陆*liu -馏liu -瘤liu -溜liu -琉liu -榴liu -碌*liu -浏liu -遛liu -骝liu -绺liu -旒liu -熘liu -锍liu -镏liu -鹨liu -鎏liu -留步liubu -流产liuchan -流畅liuchang -流程liucheng -流传liuchuan -流窜liucuan -流动liudong -流毒liudu -流放liufang -六届liujie -浏览liulan -流利liuli -留恋liulian -流露liulu -流落liuluo -流氓liumang -留念liunian -流失liushi -流逝liushi -流体liuti -流通liutong -流亡liuwang -流泻liuxie -留心liuxin -流行liuxing -流星liuxing -留学liuxue -流血liuxue -流言liuyan -留言liuyan -留洋liuyang -留影liuying -留用liuyong -流域liuyu -六月liuyue -流转liuzhuan -例外liwai -礼物liwu -利息lixi -立夏lixia -理想lixiang -立新lixin -离心lixin -理性lixing -力行lixing -厉行lixing -离休lixiu -立意liyi -利益liyi -离异liyi -利用liyong -理由liyou -力争lizheng -立正lizheng -理智lizhi -立志lizhi -离职lizhi -例子lizi -粒子lizi -立足lizu -屡见不鲜ljbx -两极分化ljfh -逻辑设计ljsj -逻辑思维ljsw -逻辑性ljx -灵机一动ljyd -落落大方lldf -拦路虎llh -来龙去脉llqm -零零碎碎llss -来来往往llww -联绵不断lmbd -灵敏度lmd -辽宁省lns -列宁主义lnzy -龙long -垄long -弄*long -笼long -隆long -聋long -咙long -窿long -拢long -陇long -垅long -茏long -泷long -珑long -栊long -胧long -砻long -癃long -隆冬longdong -垄断longduan -隆隆longlong -笼络longluo -笼统longtong -笼罩longzhao -隆重longzhong -漏lou -露*lou -楼lou -娄lou -搂lou -篓lou -陋lou -偻lou -蒌lou -喽lou -嵝lou -镂lou -瘘lou -耧lou -蝼lou -髅lou -漏洞loudong -漏斗loudou -镂空loukong -漏网louwang -来日方长lrfc -来人来函lrlh -了如指掌lrzz -理所当然lsdr -连锁反应lsfy -领事馆lsg -理事会lsh -力所能及lsnj -拉萨市lss -流水线lsx -良师益友lsyy -路lu -六*lu -率lu -露lu -绿lu -炉lu -律lu -虑lu -滤lu -陆lu -氯lu -鲁lu -铝lu -录lu -旅lu -卢lu -吕lu -芦lu -颅lu -庐lu -掳lu -卤lu -虏lu -麓lu -碌lu -赂lu -鹿lu -潞lu -禄lu -戮lu -驴lu -侣lu -履lu -屡lu -缕lu -垆lu -蓼*lu -撸lu -噜lu -闾lu -泸lu -渌lu -漉lu -逯lu -璐lu -栌lu -榈lu -橹lu -轳lu -辂lu -辘lu -氇lu -胪lu -膂lu -镥lu -稆lu -鸬lu -鹭lu -褛lu -簏lu -舻lu -鲈lu -卵luan -乱luan -峦luan -挛luan -孪luan -滦luan -脔luan -娈luan -栾luan -鸾luan -銮luan -卵巢luanchao -乱伦luanlun -乱子luanzi -旅伴luban -路标lubiao -路程lucheng -旅程lucheng -露出luchu -屡次luci -陆地ludi -露底ludi -旅店ludian -略lue -掠lue -锊lue -掠夺lueduo -旅费lufei -露骨lugu -旅馆luguan -路过luguo -绿化luhua -炉火luhuo -路径lujing -路局luju -陆军lujun -旅客luke -履历luli -率领luling -鲁莽lumang -露面lumian -论lun -轮lun -伦lun -抡lun -仑lun -沦lun -纶lun -囵lun -论处lunchu -轮船lunchuan -论点lundian -论调lundiao -伦敦lundun -轮换lunhuan -论据lunju -轮廓lunkuo -论理lunli -伦理lunli -轮流lunliu -论述lunshu -轮胎luntai -论坛luntan -沦为lunwei -论文lunwen -沦陷lunxian -轮训lunxun -论战lunzhan -论正lunzheng -论证lunzheng -轮轴lunzhou -论著lunzhu -落luo -罗luo -螺luo -洛luo -络luo -逻luo -咯*luo -烙*luo -萝luo -锣luo -箩luo -骡luo -裸luo -骆luo -倮luo -蠃luo -荦luo -捋luo -摞luo -猡luo -泺luo -漯luo -珞luo -椤luo -脶luo -硌*luo -镙luo -瘰luo -雒luo -萝卜luobu -落成luocheng -螺钉luoding -罗汉luohan -落后luohou -落户luohu -逻辑luoji -落空luokong -落款luokuan -箩筐luokuang -罗列luolie -罗马luoma -螺母luomu -罗盘luopan -落泊luopo -落实luoshi -螺栓luoshuan -裸体luoti -骆驼luotuo -罗网luowang -螺纹luowen -落伍luowu -落选luoxuan -螺旋luoxuan -络绎luoyi -录取luqu -路人luren -绿色luse -庐山lushan -旅社lushe -律师lushi -露天lutian -路途lutu -旅途lutu -路线luxian -率先luxian -录像luxiang -旅行luxing -履行luxing -陆续luxu -录音luyin -绿荫luyin -录用luyong -旅游luyou -绿洲luzhou -露珠luzhu -路子luzi -炉子luzi -另行安排lxap -例行公事lxgs -联系人lxr -留学生lxs -另行通知lxtz -林业部lyb -老一辈lyb -另一方面lyfm -劳逸结合lyjh -利用率lyl -老一套lyt -留有余地lyyd -来者不拒lzbj -立足点lzd -老中青lzq -理直气壮lzqz -兰州市lzs -两重性lzx -面m -命m -们m -民m -毛m -没m -米m -明m -马m -么m -每m -门m -名m -磨m -美m -密m -苗m -满m -亩m -目m -呒m -马ma -么*ma -麻ma -吗ma -妈ma -骂ma -嘛ma -码ma -摩*ma -抹*ma -玛ma -蚂ma -唛ma -犸ma -嬷ma -杩ma -蟆ma -马鞍maan -麻痹mabi -马达mada -麻烦mafan -麻纺mafang -马虎mahu -麦mai -脉mai -卖mai -买mai -埋mai -迈mai -劢mai -荬mai -霾mai -买办maiban -脉搏maibo -迈步maibu -埋藏maicang -脉冲maichong -脉动maidong -埋伏maifu -卖国maiguo -脉络mailuo -买卖maimai -卖命maiming -埋没maimo -卖弄mainong -埋头maitou -卖淫maiyin -埋怨maiyuan -埋葬maizang -买帐maizhang -卖座maizuo -马力mali -麻利mali -马路malu -妈妈mama -麻木mamu -满man -慢man -曼man -漫man -蔓man -瞒man -馒man -蛮man -谩man -墁man -幔man -缦man -熳man -镘man -颟man -螨man -鳗man -鞔man -漫长manchang -忙mang -芒mang -盲mang -茫mang -氓mang -莽mang -邙mang -漭mang -硭mang -蟒mang -忙碌manglu -莽莽mangmang -盲目mangmu -茫然mangran -盲人mangren -忙于mangyu -莽原mangyuan -蛮横manheng -漫画manhua -满怀manhuai -谩骂manma -满目manmu -满腔manqiang -蔓延manyan -满意manyi -满载manzai -满足manzu -毛mao -矛mao -冒mao -貌mao -贸mao -帽mao -猫mao -茅mao -锚mao -铆mao -卯mao -茂mao -袤mao -茆mao -峁mao -泖mao -瑁mao -昴mao -牦mao -耄mao -旄mao -懋mao -瞀mao -蟊mao -髦mao -毛病maobing -毛糙maocao -冒充maochong -铆钉maoding -矛盾maodun -冒犯maofan -毛纺maofang -冒号maohao -冒尖maojian -冒进maojin -茅坑maokeng -毛利maoli -冒昧maomei -茂密maomi -冒牌maopai -毛坯maopi -贸然maoran -茂盛maosheng -冒失maoshi -矛头maotou -冒险maoxian -贸易maoyi -冒雨maoyu -毛重maozhong -帽子maozi -马上mashang -马桶matong -码头matou -马戏maxi -麻醉mazui -免不了mbl -明辨是非mbsf -满不在乎mbzh -默不作声mbzs -满城风雨mcfy -目的地mdd -目瞪口呆mdkd -描淡写mdx -么me -麽me -秘而不宣mebx -没mei -每mei -美mei -煤mei -霉mei -酶mei -梅mei -妹mei -眉mei -玫mei -枚mei -媒mei -镁mei -昧mei -寐mei -媚mei -糜*mei -谜*mei -莓mei -嵋mei -猸mei -浼mei -湄mei -楣mei -镅mei -鹛mei -袂mei -魅mei -每次meici -每当meidang -美德meide -没法meifa -每逢meifeng -每个meige -美观meiguan -玫瑰meigui -美国meiguo -美好meihao -美化meihua -媒介meijie -眉睫meijie -枚举meiju -煤矿meikuang -霉烂meilan -魅力meili -美丽meili -美满meiman -眉毛meimao -美貌meimao -妹妹meimei -美妙meimiao -眉目meimu -每年meinian -煤气meiqi -每人meiren -每日meiri -美容meirong -眉梢meishao -每时meishi -美术meishu -媒妁meishuo -煤炭meitan -每天meitian -煤田meitian -美学meixue -没有meiyou -煤油meiyou -美元meiyuan -每月meiyue -没治meizhi -每周meizhou -们men -门men -闷men -扪men -焖men -懑men -钔men -门房menfang -孟meng -猛meng -蒙meng -盟meng -梦meng -萌meng -锰meng -氓*meng -檬meng -勐meng -甍meng -瞢meng -懵meng -朦meng -礞meng -虻meng -蜢meng -蠓meng -艋meng -艨meng -蒙蔽mengbi -萌发mengfa -蒙古menggu -盟国mengguo -梦幻menghuan -蒙混menghun -梦见mengjian -猛进mengjin -梦境mengjing -猛烈menglie -蒙胧menglong -蒙昧mengmei -猛然mengran -萌生mengsheng -猛士mengshi -蒙受mengshou -梦想mengxiang -梦乡mengxiang -猛醒mengxing -萌芽mengya -盟友mengyou -盟约mengyue -猛增mengzeng -门户menhu -门路menlu -门牌menpai -门票menpiao -闷气menqi -门诊menzhen -名副其实mfqs -眉飞色舞mfsw -没关系mgx -蒙古族mgz -蒙混过关mhgg -米mi -密mi -迷mi -蜜mi -秘mi -眯mi -醚mi -靡mi -糜mi -谜mi -弥mi -觅mi -泌mi -幂mi -芈mi -谧mi -蘼mi -咪mi -嘧mi -猕mi -汨mi -宓mi -弭mi -脒mi -祢mi -敉mi -糸mi -縻mi -麋mi -面mian -棉mian -免mian -绵mian -眠mian -冕mian -勉mian -娩mian -缅mian -沔mian -渑mian -湎mian -腼mian -眄mian -面部mianbu -免除mianchu -免得miande -面对miandui -面额miane -棉花mianhua -缅怀mianhuai -面积mianji -面具mianju -面孔miankong -勉励mianli -面临mianlin -面貌mianmao -面面mianmian -绵绵mianmian -面目mianmu -面庞mianpang -面前mianqian -勉强mianqiang -面容mianrong -面色mianse -棉纱miansha -面授mianshou -免税mianshui -面谈miantan -面向mianxiang -免刑mianxing -棉絮mianxu -绵延mianyan -面议mianyi -免疫mianyi -面罩mianzhao -免职mianzhi -面子mianzi -苗miao -秒miao -描miao -庙miao -妙miao -瞄miao -藐miao -渺miao -喵miao -邈miao -缈miao -缪miao -杪miao -淼miao -眇miao -鹋miao -秒表miaobiao -描绘miaohui -妙龄miaoling -渺茫miaomang -描摹miaomo -藐视miaoshi -描述miaoshu -苗条miaotiao -苗头miaotou -描写miaoxie -瞄准miaozhun -弥补mibu -谜底midi -密度midu -灭mie -蔑mie -乜*mie -咩mie -蠛mie -篾mie -灭火miehuo -灭迹mieji -灭绝miejue -灭口miekou -蔑视mieshi -灭亡miewang -密封mifeng -蜜蜂mifeng -眯缝mifeng -迷航mihang -迷糊mihu -迷惑mihuo -密集miji -密件mijian -迷津mijin -秘诀mijue -糜烂milan -迷恋milian -密令miling -迷路milu -密码mima -迷漫miman -弥漫miman -秘密mimi -汨汨mimi -谜面mimian -密谋mimou -民min -敏min -抿min -皿min -悯min -闽min -苠min -岷min -闵min -泯min -缗min -玟min -珉min -愍min -黾min -鳘min -民办minban -民兵minbing -民法minfa -民愤minfen -民风minfeng -命ming -明ming -名ming -鸣ming -螟ming -盟*ming -铭ming -冥ming -茗ming -溟ming -暝ming -瞑ming -酩ming -敏感mingan -明白mingbai -名册mingce -名称mingcheng -明处mingchu -名次mingci -名词mingci -名单mingdan -明灯mingdeng -民歌minge -名额minge -名贵minggui -铭记mingji -名家mingjia -铭刻mingke -明快mingkuai -明朗minglang -名利mingli -明亮mingliang -明了mingliao -命令mingling -名流mingliu -明码mingma -明媚mingmei -明明mingming -名目mingmu -明年mingnian -名牌mingpai -名片mingpian -名气mingqi -明确mingque -明人mingren -名人mingren -名胜mingsheng -名声mingsheng -名堂mingtang -明天mingtian -名望mingwang -明文mingwen -明细mingxi -明显mingxian -鸣谢mingxie -明星mingxing -名言mingyan -名义mingyi -名誉mingyu -命运mingyun -明知mingzhi -明智mingzhi -明珠mingzhu -名著mingzhu -名字mingzi -民航minhang -民间minjian -敏捷minjie -民警minjing -民情minqing -敏锐minrui -民事minshi -民心minxin -民意minyi -民用minyong -民运minyun -民政minzheng -民众minzhong -民主minzhu -民族minzu -密切miqie -迷人miren -迷失mishi -秘书mishu -密探mitan -迷途mitu -谬miu -谬论miulun -谬误miuwu -迷惘miwang -迷雾miwu -迷信mixin -密友miyou -谜语miyu -蜜月miyue -马克思mks -眉开眼笑mkyx -马列主义mlzy -满面春风mmcf -马马虎虎mmhh -面面俱到mmjd -莫名其妙mmqm -默默无闻mmww -明目张胆mmzd -无*mo -磨mo -没*mo -万*mo -末mo -模mo -膜mo -摸mo -墨mo -摩mo -脉*mo -莫mo -抹mo -冒*mo -默mo -貉*mo -嘿*mo -摹mo -蘑mo -魔mo -沫mo -漠mo -寞mo -陌mo -谟mo -茉mo -蓦mo -馍mo -嫫mo -殁mo -镆mo -秣mo -瘼mo -耱mo -貊mo -貘mo -默哀moai -莫不mobu -磨擦moca -摩擦moca -磨蹭moceng -莫大moda -磨刀modao -摩登modeng -摸底modi -模范mofan -模仿mofang -摹仿mofang -莫非mofei -魔鬼mogui -模糊mohu -墨迹moji -模块mokuai -磨砺moli -磨练molian -末了moliao -末路molu -没落moluo -磨灭momie -默默momo -磨难monan -模拟moni -摹拟moni -末期moqi -默契moqi -默然moran -漠然moran -默认moren -末日mori -莫如moru -抹杀mosha -抹煞mosha -末梢moshao -陌生mosheng -模式moshi -没收moshou -魔术moshu -磨损mosun -摸索mosuo -模特mote -摩托motuo -某mou -谋mou -牟mou -侔mou -哞mou -缪*mou -眸mou -蛑mou -蝥mou -鍪mou -某地moudi -某个mouge -谋害mouhai -谋划mouhua -某军moujun -牟利mouli -谋略moulue -谋求mouqiu -牟取mouqu -谋杀mousha -谋生mousheng -某些mouxie -末尾mowei -默写moxie -模型moxing -默许moxu -模样moyang -魔掌mozhang -模子mozi -妙趣横生mqhs -门市部msb -名胜古迹msgj -妙手回春mshc -莫斯科msk -没什么msm -每时每刻msmk -秘书长msz -没事找事mszs -摩托车mtc -埋头工作mtgz -埋头苦干mtkg -亩mu -目mu -木mu -母mu -墓mu -模*mu -幕mu -牧mu -姆mu -穆mu -姥*mu -牟*mu -拇mu -牡mu -暮mu -募mu -慕mu -睦mu -仫mu -坶mu -苜mu -沐mu -毪mu -钼mu -母爱muai -墓碑mubei -目标mubiao -木材mucai -牧草mucao -目测muce -牧场muchang -目次muci -牡丹mudan -目的mudi -牧歌muge -目光muguang -幕后muhou -目击muji -募集muji -木刻muke -木料muliao -幕僚muliao -目录mulu -牧民mumin -木讷mune -木偶muou -目前muqian -母亲muqin -牧区muqu -木然muran -暮色muse -牧师mushi -目送musong -牧童mutong -牧业muye -沐浴muyu -民意测验mycy -贸易市场mysc -贸易协定myxd -民政部mzb -美中不足mzbz -毛泽东mzd -满载而归mzeg -明知故犯mzgf -毛织品mzp -目中无人mzwr -毛主席mzx -年n -能n -内n -那n -农n -你n -南n -难n -呢n -女n -泥n -哪n -拿n -念n -牛n -宁n -脑n -粘n -尼n -纳n -嗯n -那na -南na -哪na -拿na -纳na -呢*na -钠na -呐na -娜na -捺na -肭na -镎na -衲na -那边nabian -纳粹nacui -哪儿naer -那个nage -哪个nage -呐喊nahan -哪会nahui -耐nai -哪*nai -奶nai -乃nai -氖nai -奈nai -鼐nai -艿nai -萘nai -柰nai -耐烦naifan -奈何naihe -耐久naijiu -耐劳nailao -奶奶nainai -耐心naixin -耐性naixing -耐用naiyong -奶油naiyou -乃至naizhi -那里nali -哪里nali -那么name -南nan -难nan -男nan -喃nan -囝nan -囡nan -楠nan -腩nan -蝻nan -赧nan -难办nanban -南北nanbei -南边nanbian -难产nanchan -南昌nanchang -难处nanchu -难道nandao -难得nande -难点nandian -难度nandu -哪能naneng -南方nanfang -南非nanfei -难分nanfen -南风nanfeng -囊nang -攮nang -囔nang -馕nang -曩nang -囊括nangkuo -难怪nanguai -难关nanguan -南国nanguo -难过nanguo -南海nanhai -南货nanhuo -南极nanji -难解nanjie -南京nanjing -难看nankan -难堪nankan -南面nanmian -难免nanmian -难民nanmin -南宁nanning -男女nannu -赧然nanran -男人nanren -难色nanse -难事nanshi -难受nanshou -难说nanshuo -难题nanti -难听nanting -难为nanwei -男性nanxing -南亚nanya -南洋nanyang -难以nanyi -难友nanyou -难于nanyu -脑nao -闹nao -努*nao -挠nao -恼nao -淖nao -孬nao -垴nao -呶nao -猱nao -瑙nao -硇nao -铙nao -蛲nao -脑袋naodai -脑海naohai -恼火naohuo -脑筋naojin -闹剧naoju -闹事naoshi -哪怕napa -纳入naru -那时nashi -拿手nashou -纳税nashui -那些naxie -哪些naxie -纳新naxin -那样nayang -哪样nayang -那种nazhong -年产量ncl -农产品ncp -南昌市ncs -难道说nds -呢ne -哪*ne -呐*ne -讷ne -内nei -那*nei -哪*nei -馁nei -内部neibu -内存neicun -内地neidi -内阁neige -内涵neihan -内行neihang -内奸neijian -内疚neijiu -内科neike -内乱neiluan -内幕neimu -内勤neiqin -内容neirong -内外neiwai -内销neixiao -内心neixin -内因neiyin -内应neiying -内在neizai -嫩nen -恁nen -能neng -能动nengdong -能否nengfou -能干nenggan -能够nenggou -能力nengli -能量nengliang -能耐nengnai -能人nengren -能手nengshou -能源nengyuan -能者nengzhe -农副产品nfcp -年富力强nflq -能工巧匠ngqj -你ni -泥ni -尼ni -呢*ni -逆ni -拟ni -尿ni -妮ni -霓ni -倪ni -匿ni -腻ni -溺ni -伲ni -坭ni -猊ni -怩ni -昵ni -旎ni -祢*ni -慝ni -睨ni -铌ni -鲵ni -年nian -念nian -粘nian -蔫nian -拈nian -碾nian -撵nian -捻nian -酿nian -廿nian -埝nian -辇nian -黏nian -鲇nian -鲶nian -年初nianchu -年代niandai -念叨niandao -年底niandi -年度niandu -年份nianfen -娘niang -年华nianhua -年画nianhua -年级nianji -年纪nianji -年鉴nianjian -年来nianlai -年利nianli -年历nianli -拈量nianliang -年龄nianling -年迈nianmai -年年niannian -年青nianqing -年轻nianqing -年岁niansui -年头niantou -念头niantou -年限nianxian -年月nianyue -酿造nianzao -年终nianzhong -尿niao -鸟niao -溺*niao -茑niao -嬲niao -脲niao -袅niao -鸟瞰niaokan -逆差nicha -你处nichu -你的nide -拟定niding -拟订niding -镍nie -啮nie -涅nie -捏nie -聂nie -孽nie -镊nie -乜nie -陧nie -蘖nie -嗫nie -颞nie -臬nie -蹑nie -捏造niezao -腻烦nifan -泥浆nijiang -逆境nijing -泥坑nikeng -逆流niliu -你们nimen -您nin -宁ning -凝ning -拧ning -柠ning -狞ning -泞ning -佞ning -苎ning -咛ning -甯ning -聍ning -凝固ninggu -凝结ningjie -宁静ningjing -凝聚ningju -宁可ningke -宁肯ningken -宁日ningri -凝视ningshi -凝望ningwang -宁夏ningxia -宁愿ningyuan -泥泞nining -泥塑nisu -牛niu -扭niu -钮niu -纽niu -拗*niu -狃niu -忸niu -妞niu -纽带niudai -牛犊niudu -纽扣niukou -纽约niuyue -扭转niuzhuan -腻味niwei -你我niwo -拟议niyi -泥沼nizhao -逆转nizhuan -难解难分njnf -南京市njs -南极洲njz -扭亏为盈nkwy -脑力劳动nlld -年老体弱nltr -内蒙古nmg -农贸市场nmsc -那么些nmx -那么样nmy -念念不忘nnbw -难能可贵nnkg -南宁市nns -农nong -弄nong -浓nong -脓nong -侬nong -哝nong -脓包nongbao -农村nongcun -浓度nongdu -农妇nongfu -浓厚nonghou -农会nonghui -农活nonghuo -农具nongju -农历nongli -农林nonglin -农忙nongmang -农民nongmin -弄清nongqing -农时nongshi -农药nongyao -农业nongye -农艺nongyi -浓郁nongyu -耨nou -年轻化nqh -年轻人nqr -那时候nsh -能说会道nshd -南斯拉夫nslf -能上能下nsnx -逆水行舟nsxz -农田水利ntsl -女nu -奴nu -努nu -怒nu -弩nu -胬nu -孥nu -驽nu -恧nu -钕nu -衄nu -暖nuan -暖和nuanhe -暖流nuanliu -暖气nuanqi -奴婢nubi -奴才nucai -虐nue -虐待nuedai -虐疾nueji -女儿nuer -女工nugong -怒吼nuhou -奴化nuhua -怒火nuhuo -努力nuli -奴隶nuli -诺nuo -娜*nuo -挪nuo -懦nuo -糯nuo -傩nuo -搦nuo -喏nuo -锘nuo -挪用nuoyong -奴仆nupu -女人nuren -女色nuse -女士nushi -女性nuxing -女婿nuxu -女子nuzi -能文能武nwnw -弄虚作假nxzj -农作物nzw -你争我夺nzwd -欧o -偶o -哦o -鸥o -殴o -藕o -呕o -沤o -讴o -噢o -怄o -瓯o -耦o -偶然性orx -区*ou -欧ou -偶ou -鸥ou -殴ou -藕ou -呕ou -沤ou -讴ou -怄ou -瓯ou -耦ou -殴打ouda -偶尔ouer -讴歌ouge -偶合ouhe -耦合ouhe -欧姆oumu -怄气ouqi -偶然ouran -藕色ouse -偶数oushu -呕吐outu -欧阳ouyang -欧洲ouzhou -批p -平p -判p -配p -片p -派p -破p -排p -品p -皮p -喷p -盘p -偏p -评p -怕p -培p -普p -贫p -跑p -炮p -怕pa -派pa -爬pa -帕pa -扒*pa -耙*pa -啪pa -趴pa -琶pa -葩pa -杷pa -钯*pa -筢pa -派pai -排pai -拍pai -牌pai -迫*pai -哌pai -徘pai -湃pai -俳pai -蒎pai -排版paiban -拍板paiban -排比paibi -派别paibie -排场paichang -排斥paichi -排除paichu -排队paidui -牌号paihao -徘徊paihuai -排挤paiji -牌价paijia -排列pailie -拍卖paimai -派遣paiqian -排球paiqiu -派生paisheng -派头paitou -排外paiwai -排泄paixie -排演paiyan -牌照paizhao -判pan -盘pan -叛pan -番*pan -潘pan -攀pan -磐pan -盼pan -畔pan -胖pan -拚*pan -爿pan -泮pan -袢pan -襻pan -蟠pan -蹒pan -叛变panbian -判别panbie -盘缠panchan -盘存pancun -叛党pandang -攀登pandeng -盘点pandian -判定panding -判断panduan -攀附panfu -旁pang -膀*pang -磅*pang -乓pang -庞pang -耪pang -胖pang -彷pang -滂pang -逄pang -螃pang -旁边pangbian -庞大pangda -盘亘pangen -旁观pangguan -旁听pangting -旁通pangtong -滂沱pangtuo -庞杂pangza -盘踞panju -判决panjue -叛乱panluan -判明panming -叛逆panni -盘算pansuan -蟠桃pantao -叛徒pantu -盼望panwang -判刑panxing -盘旋panxuan -跑pao -炮pao -刨pao -抛pao -泡pao -咆pao -袍pao -匏pao -狍pao -庖pao -脬pao -疱pao -炮兵paobing -跑步paobu -炮弹paodan -跑道paodao -抛光paoguang -炮火paohuo -炮击paoji -抛锚paomao -泡沫paomo -抛弃paoqi -炮手paoshou -炮台paotai -炮艇paoting -咆哮paoxiao -泡影paoying -炮仗paozhang -炮制paozhi -怕死pasi -疲惫不堪pbbk -迫不急待pbjd -破除迷信pcmx -平等互利pdhl -配pei -培pei -陪pei -胚pei -呸pei -裴pei -赔pei -佩pei -沛pei -辔pei -帔pei -旆pei -锫pei -醅pei -霈pei -陪伴peiban -配备peibei -赔本peiben -赔偿peichang -陪衬peichen -配方peifang -佩服peifu -配合peihe -配给peiji -配件peijian -配角peijiao -赔款peikuan -赔礼peili -配偶peiou -陪审peishen -陪送peisong -胚胎peitai -配套peitao -陪同peitong -培训peixun -培养peiyang -配音peiyin -培育peiyu -配乐peiyue -陪葬peizang -配制peizhi -配置peizhi -培植peizhi -喷pen -盆pen -湓pen -盆地pendi -碰peng -棚peng -蓬peng -朋peng -捧peng -膨peng -砰peng -抨peng -烹peng -澎peng -彭peng -硼peng -篷peng -鹏peng -堋peng -嘭peng -怦peng -蟛peng -碰杯pengbei -碰壁pengbi -蓬勃pengbo -捧场pengchang -抨击pengji -蓬莱penglai -蓬乱pengluan -澎湃pengpai -烹饪pengren -硼砂pengsha -蓬松pengsong -烹调pengtiao -朋友pengyou -膨胀pengzhang -喷溅penjian -盆景penjing -喷射penshe -喷嚏penti -平方公里pfgl -平分秋色pfqs -批pi -皮pi -坏*pi -否*pi -辟*pi -坯pi -脾pi -疲pi -砒pi -霹pi -披pi -劈pi -琵pi -毗pi -啤pi -匹pi -痞pi -僻pi -屁pi -譬pi -丕pi -仳pi -陂*pi -陴pi -邳pi -郫pi -圮pi -埤*pi -鼙pi -芘pi -擗pi -吡*pi -噼pi -庀pi -淠pi -媲pi -纰pi -枇pi -甓pi -睥pi -罴pi -铍pi -癖pi -裨*pi -疋pi -蚍pi -蜱pi -貔pi -片pian -偏pian -便*pian -篇pian -骗pian -扁*pian -谝pian -骈pian -缏*pian -犏pian -胼pian -翩pian -蹁pian -偏差piancha -片断pianduan -片段pianduan -偏废pianfei -篇幅pianfu -偏激pianji -偏见pianjian -骗局pianju -片刻pianke -偏离pianli -片面pianmian -偏旁pianpang -偏僻pianpi -偏颇pianpo -骗取pianqu -骗人pianren -骗术pianshu -偏袒piantan -翩跹pianxian -偏向pianxiang -偏移pianyi -便宜pianyi -篇章pianzhang -骗子pianzi -票piao -漂piao -朴*piao -飘piao -瓢piao -剽piao -莩*piao -嘌piao -嫖piao -骠*piao -缥piao -殍piao -瞟piao -螵piao -漂泊piaobo -票房piaofang -漂浮piaofu -票价piaojia -票据piaoju -漂亮piaoliang -漂流piaoliu -飘流piaoliu -飘落piaoluo -票面piaomian -飘渺piaomiao -飘泊piaopo -剽窃piaoqie -飘然piaoran -飘散piaosan -飘扬piaoyang -飘游piaoyou -疲惫pibei -批驳pibo -撇pie -瞥pie -丿pie -苤pie -氕pie -批发pifa -批复pifu -皮肤pifu -皮革pige -屁股pigu -疲倦pijuan -疲劳pilao -纰漏pilou -披露pilu -品pin -贫pin -频pin -拼pin -苹pin -聘pin -拚pin -姘pin -嫔pin -榀pin -牝pin -颦pin -品尝pinchang -频传pinchuan -拼凑pincou -频带pindai -频道pindao -品德pinde -贫乏pinfa -频繁pinfan -平ping -评ping -瓶ping -凭ping -苹ping -冯*ping -乒ping -坪ping -萍ping -屏ping -俜ping -娉ping -枰ping -鲆ping -平安pingan -评比pingbi -屏蔽pingbi -平常pingchang -平川pingchuan -平淡pingdan -平等pingdeng -平地pingdi -平定pingding -评定pingding -品格pinge -平反pingfan -平凡pingfan -平方pingfang -平分pingfen -评分pingfen -评功pinggong -平衡pingheng -评级pingji -平价pingjia -评价pingjia -评奖pingjiang -凭借pingjie -平静pingjing -平均pingjun -平空pingkong -凭空pingkong -评理pingli -评论pinglun -平面pingmian -平民pingmin -屏幕pingmu -评判pingpan -乒乓pingpang -平平pingping -平壤pingrang -平日pingri -平时pingshi -平手pingshou -评说pingshuo -平素pingsu -平坦pingtan -乒坛pingtan -平稳pingwen -平息pingxi -萍乡pingxiang -平行pingxing -平易pingyi -评议pingyi -平庸pingyong -平原pingyuan -平仄pingze -屏障pingzhang -凭着pingzhe -平整pingzheng -凭证pingzheng -评注pingzhu -贫寒pinhan -品级pinji -贫困pinkun -频率pinlu -品貌pinmao -拼命pinming -品名pinming -品评pinping -聘请pinqing -贫穷pinqiong -聘任pinren -聘书pinshu -拼写pinxie -品行pinxing -品性pinxing -拼音pinyin -品质pinzhi -品种pinzhong -批判pipan -匹配pipei -批评piping -脾气piqi -譬如piru -疲软piruan -批示pishi -脾胃piwei -脾性pixing -辟谣piyao -批语piyu -批阅piyue -批注pizhu -批准pizhun -平均数pjs -披荆斩棘pjzj -评论员ply -跑马观花pmgh -破po -迫po -坡po -泼po -繁*po -朴*po -泊*po -颇po -婆po -魄po -粕po -叵po -陂*po -鄱po -泺*po -珀po -攴po -钋po -钷po -钹*po -皤po -笸po -破案poan -破产pochan -破除pochu -坡度podu -泼妇pofu -破格poge -迫害pohai -破坏pohuai -破获pohuo -迫近pojin -破旧pojiu -泼辣pola -破烂polan -魄力poli -破例poli -破裂polie -破灭pomie -迫切poqie -迫使poshi -破碎posui -破损posun -破土potu -剖pou -裒pou -掊pou -剖解poujie -剖析pouxi -破绽pozhan -蓬蓬勃勃ppbb -普普通通pptt -旁若无人prwr -普通话pth -抛头露面ptlm -普pu -谱pu -扑pu -埔pu -铺pu -暴*pu -葡pu -朴pu -蒲pu -堡*pu -脯*pu -仆pu -莆pu -菩pu -圃pu -浦pu -曝pu -瀑pu -匍pu -噗pu -溥pu -濮pu -璞pu -氆pu -镤pu -镨pu -蹼pu -普遍pubian -普查pucha -扑哧puchi -扑打puda -铺盖pugai -普及puji -铺平puping -仆人puren -菩萨pusa -铺设pushe -朴实pushi -朴素pusu -葡萄putao -普通putong -扑通putong -铺位puwei -谱写puxie -普选puxuan -铺张puzhang -普照puzhao -朴直puzhi -平易近人pyjr -拼音字母pyzm -铺张浪费pzlf -起q -前q -其q -去q -气q -全q -期q -群q -情q -区q -强q -切q -取q -七q -求q -清q -确q -权q -且q -青q -亲爱的qad -情报所qbs -千百万qbw -千变万化qbwh -取长补短qcbd -千锤百炼qcbl -恰到好处qdhc -全党全军和全国qdqg -取而代之qedz -轻而易举qeyj -千方百计qfbj -清规戒律qgjl -勤工俭学qgjx -旗鼓相当qgxd -轻工业qgy -轻工业部qgyb -勤工助学qgzx -权衡利弊qhlb -骑虎难下qhnx -青海省qhs -青红皂白qhzb -起qi -其qi -气qi -期qi -七qi -器qi -齐qi -奇qi -汽qi -企qi -漆qi -欺qi -旗qi -畦qi -启qi -弃qi -歧qi -稽*qi -缉*qi -栖qi -戚qi -妻qi -凄qi -柒qi -沏qi -棋qi -崎qi -脐qi -祈qi -祁qi -骑qi -岂qi -乞qi -契qi -砌qi -迄qi -泣qi -讫qi -亟*qi -亓qi -俟qi -圻qi -芑qi -芪qi -荠*qi -萁qi -萋qi -葺qi -蕲qi -嘁qi -屺qi -岐qi -岖*qi -汔qi -淇qi -骐qi -绮qi -琪qi -琦qi -杞qi -桤qi -槭qi -耆qi -欹qi -祺qi -憩qi -碛qi -颀qi -蛴qi -蜞qi -綦qi -綮qi -蹊qi -鳍qi -麒qi -卡*qia -恰qia -掐qia -洽qia -伽*qia -葜qia -袷*qia -髂qia -恰当qiadang -恰好qiahao -前qian -千qian -钱qian -浅qian -签qian -迁qian -铅qian -潜qian -牵qian -钳qian -纤*qian -谴qian -扦qian -钎qian -仟qian -谦qian -乾qian -黔qian -遣qian -堑qian -嵌qian -欠qian -歉qian -倩qian -佥qian -阡qian -芊qian -芡qian -茜qian -荨qian -掮qian -岍qian -悭qian -慊qian -骞qian -搴qian -褰qian -缱qian -椠qian -犍*qian -肷qian -愆qian -钤qian -虔qian -箬qian -箝qian -前辈qianbei -前边qianbian -浅薄qianbo -钱财qiancai -欠产qianchan -前程qiancheng -签到qiandao -前敌qiandi -签订qianding -签发qianfa -遣返qianfan -前方qianfang -强qiang -将*qiang -枪qiang -抢qiang -墙qiang -腔qiang -呛qiang -羌qiang -蔷qiang -戕qiang -嫱qiang -樯qiang -戗qiang -炝qiang -锖qiang -锵qiang -镪qiang -襁qiang -蜣qiang -羟qiang -跄qiang -墙壁qiangbi -枪毙qiangbi -强辩qiangbian -强大qiangda -枪弹qiangdan -强盗qiangdao -强调qiangdiao -腔调qiangdiao -强度qiangdu -抢夺qiangduo -强攻qianggong -强国qiangguo -强化qianghua -强加qiangjia -强奸qiangjian -抢劫qiangjie -强劲qiangjin -抢救qiangjiu -枪决qiangjue -强烈qianglie -强迫qiangpo -强权qiangquan -强弱qiangruo -枪杀qiangsha -强盛qiangsheng -千古qiangu -牵挂qiangua -蔷薇qiangwei -抢险qiangxian -强行qiangxing -强硬qiangying -强占qiangzhan -强者qiangzhe -强制qiangzhi -枪支qiangzhi -强壮qiangzhuang -前后qianhou -前进qianjin -前景qianjing -迁就qianjiu -歉疚qianjiu -迁居qianju -乾坤qiankun -千里qianli -前例qianli -潜力qianli -牵连qianlian -前列qianlie -浅陋qianlou -前面qianmian -签名qianming -前年qiannian -前期qianqi -千秋qianqiu -前驱qianqu -欠缺qianque -前人qianren -前任qianren -纤弱qianruo -前哨qianshao -牵涉qianshe -歉收qianshou -签署qianshu -遣送qiansong -前提qianti -前天qiantian -欠条qiantiao -前途qiantu -千瓦qianwa -千万qianwan -前往qianwang -前夕qianxi -纤细qianxi -前线qianxian -浅显qianxian -谦虚qianxu -谦逊qianxun -前言qianyan -前沿qianyan -前夜qianye -歉意qianyi -迁移qianyi -牵引qianyin -潜在qianzai -谴责qianze -前者qianzhe -签证qianzheng -牵制qianzhi -钳制qianzhi -签字qianzi -前奏qianzou -桥qiao -瞧qiao -壳*qiao -巧qiao -敲qiao -乔qiao -蕉qiao -橇qiao -锹qiao -悄qiao -侨qiao -鞘qiao -撬qiao -翘qiao -峭qiao -俏qiao -窍qiao -雀*qiao -劁qiao -诮qiao -谯qiao -荞qiao -峤*qiao -愀qiao -憔qiao -缲*qiao -樵qiao -硗qiao -跷qiao -鞒qiao -侨胞qiaobao -桥墩qiaodun -巧计qiaoji -瞧见qiaojian -侨居qiaoju -桥梁qiaoliang -窍门qiaomen -巧妙qiaomiao -桥牌qiaopai -乔迁qiaoqian -悄然qiaoran -侨务qiaowu -敲诈qiaozha -恰似qiasi -洽谈qiatan -岂不qibu -起步qibu -器材qicai -奇才qicai -凄惨qican -起草qicao -汽车qiche -骑车qiche -启程qicheng -起初qichu -凄楚qichu -其次qici -期待qidai -脐带qidai -岂但qidan -启迪qidi -起点qidian -启动qidong -气度qidu -切qie -且qie -砌*qie -茄qie -怯qie -窃qie -伽*qie -郄qie -惬qie -慊*qie -妾qie -挈qie -锲qie -箧qie -窃案qiean -切断qieduan -切合qiehe -窃据qieju -窃取qiequ -怯弱qieruo -切身qieshen -切实qieshi -切题qieti -窃听qieting -切削qiexiao -惬意qieyi -启发qifa -起飞qifei -岂非qifei -气愤qifen -气氛qifen -欺负qifu -气概qigai -乞丐qigai -岂敢qigan -气功qigong -奇怪qiguai -器官qiguan -旗号qihao -漆黑qihei -气候qihou -期货qihuo -契机qiji -奇迹qiji -期间qijian -起见qijian -器件qijian -七届qijie -迄今qijin -起来qilai -凄凉qiliang -欺凌qiling -气流qiliu -歧路qilu -起码qima -骑马qima -启蒙qimeng -奇妙qimiao -器皿qimin -亲qin -侵qin -勤qin -秦qin -钦qin -琴qin -芹qin -擒qin -禽qin -寝qin -沁qin -芩qin -揿qin -吣qin -嗪qin -噙qin -廑*qin -溱qin -檎qin -锓qin -矜*qin -覃qin -螓qin -衾qin -亲爱qinai -亲笔qinbi -岂能qineng -侵犯qinfan -勤奋qinfen -情qing -清qing -青qing -轻qing -倾qing -请qing -亲*qing -庆qing -氢qing -晴qing -卿qing -擎qing -氰qing -顷qing -苘qing -圊qing -檠qing -磬qing -蜻qing -罄qing -箐qing -綮*qing -謦qing -鲭qing -黥qing -清白qingbai -青白qingbai -情报qingbao -情操qingcao -青草qingcao -清查qingcha -清除qingchu -清楚qingchu -青春qingchun -青翠qingcui -清单qingdan -倾倒qingdao -清点qingdian -情调qingdiao -轻浮qingfu -青工qinggong -青海qinghai -庆贺qinghe -清华qinghua -情怀qinghuai -清还qinghuan -请假qingjia -请柬qingjian -请教qingjiao -情节qingjie -清洁qingjie -情景qingjing -顷刻qingke -晴空qingkong -轻快qingkuai -情况qingkuang -青睐qinglai -晴朗qinglang -情理qingli -清理qingli -轻率qinglu -轻蔑qingmie -青年qingnian -氢气qingqi -轻巧qingqiao -请求qingqiu -情趣qingqu -青山qingshan -请示qingshi -清爽qingshuang -青松qingsong -轻松qingsong -倾诉qingsu -青天qingtian -晴天qingtian -倾听qingting -倾吐qingtu -请问qingwen -倾向qingxiang -倾销qingxiao -情形qingxing -清醒qingxing -情绪qingxu -情谊qingyi -轻易qingyi -轻盈qingying -情愿qingyuan -请愿qingyuan -请战qingzhan -轻重qingzhong -倾注qingzhu -庆祝qingzhu -请罪qingzui -侵害qinhai -勤俭qinjian -亲近qinjin -亲眷qinjuan -勤快qinkuai -勤劳qinlao -亲历qinli -亲临qinlin -侵略qinlue -亲密qinmi -勤勉qinmian -钦佩qinpei -亲戚qinqi -亲切qinqie -亲热qinre -亲人qinren -侵入qinru -亲身qinshen -侵蚀qinshi -寝室qinshi -亲手qinshou -亲属qinshu -侵吞qintun -勤务qinwu -亲信qinxin -亲眼qinyan -亲友qinyou -侵占qinzhan -亲自qinzi -穷qiong -琼qiong -邛qiong -茕qiong -穹qiong -蛩qiong -筇qiong -跫qiong -銎qiong -穷国qiongguo -穷苦qiongku -穷困qiongkun -穹隆qionglong -穷期qiongqi -穷人qiongren -穷途qiongtu -气派qipai -欺骗qipian -气魄qipo -乞求qiqiu -崎岖qiqu -齐全qiquan -凄然qiran -起色qise -气色qise -其实qishi -起始qishi -启事qishi -气势qishi -启示qishi -歧视qishi -奇数qishu -汽水qishui -起诉qisu -其他qita -其它qita -奇特qite -气体qiti -汽艇qiting -企图qitu -歧途qitu -求qiu -球qiu -秋qiu -丘qiu -仇*qiu -龟*qiu -邱qiu -囚qiu -酋qiu -泅qiu -俅qiu -巯qiu -犰qiu -湫qiu -逑qiu -遒qiu -楸qiu -赇qiu -虬qiu -蚯qiu -蝤qiu -裘qiu -糗qiu -鳅qiu -鼽qiu -秋播qiubo -球场qiuchang -囚犯qiufan -秋风qiufeng -秋季qiuji -求教qiujiao -囚禁qiujin -求救qiujiu -丘陵qiuling -秋千qiuqian -求情qiuqing -求全qiuquan -秋色qiuse -求实qiushi -秋收qiushou -秋天qiutian -求学qiuxue -求战qiuzhan -求证qiuzheng -求知qiuzhi -求助qiuzhu -期望qiwang -气味qiwei -气温qiwen -奇闻qiwen -欺侮qiwu -气息qixi -栖息qixi -起先qixian -期限qixian -气象qixiang -器械qixie -齐心qixin -气压qiya -欺压qiya -气焰qiyan -企业qiye -起义qiyi -歧义qiyi -起因qiyin -启用qiyong -汽油qiyou -其余qiyu -起源qiyuan -七月qiyue -契约qiyue -欺诈qizha -气质qizhi -旗帜qizhi -其中qizhong -器重qizhong -旗子qizi -妻子qizi -勤俭建国qjjg -勤俭节约qjjy -迄今为止qjwz -取决于qjy -千钧一发qjyf -旗开得胜qkds -全力以赴qlyf -勤劳致富qlzf -千里之行qlzx -亲密无间qmwj -青年人qnr -千篇一律qpyl -清清楚楚qqcc -勤勤恳恳qqkk -切切实实qqss -确确实实qqss -恰恰相反qqxf -求全责备qqzb -恰如其分qrqf -欺人之谈qrzt -七手八脚qsbj -全神贯注qsgz -全世界qsj -切实可行qskx -切身利益qsly -青少年qsn -前所未闻qsww -前所未有qswy -气势汹汹qsxx -齐头并进qtbj -奇谈怪论qtgl -千头万绪qtwx -前提下qtx -去qu -区qu -取qu -曲qu -且*qu -渠qu -屈qu -趋qu -驱qu -趣qu -蛆qu -躯qu -娶qu -龋qu -戌*qu -诎qu -劬qu -苣*qu -蕖qu -蘧qu -岖qu -衢qu -阒qu -璩qu -觑qu -氍qu -朐qu -祛qu -磲qu -鸲qu -癯qu -蛐qu -蠼qu -麴qu -瞿qu -黢qu -全quan -权quan -圈quan -劝quan -泉quan -醛quan -颧quan -痊quan -拳quan -犬quan -券quan -诠quan -荃quan -悛quan -绻quan -辁quan -畎quan -铨quan -蜷quan -筌quan -鬈quan -全部quanbu -全党quandang -劝导quandao -蜷伏quanfu -劝告quangao -全国quanguo -权衡quanheng -全会quanhui -拳击quanji -劝解quanjie -全局quanju -全军quanjun -全力quanli -权利quanli -权力quanli -全貌quanmao -全面quanmian -劝勉quanmian -全民quanmin -全能quanneng -全年quannian -全盘quanpan -全拼quanpin -全球quanqiu -蜷曲quanqu -全权quanquan -全然quanran -全胜quansheng -权术quanshu -泉水quanshui -劝说quanshuo -圈套quantao -全体quanti -拳头quantou -权威quanwei -劝慰quanwei -全文quanwen -全县quanxian -权限quanxian -全校quanxiao -权益quanyi -权宜quanyi -劝诱quanyou -痊愈quanyu -劝止quanzhi -劝阻quanzu -区别qubie -屈才qucai -驱除quchu -取代qudai -渠道qudao -取得qude -取缔qudi -曲调qudiao -驱动qudong -确que -却que -缺que -炔que -瘸que -鹊que -榷que -雀que -阕que -阙que -悫que -确保quebao -缺点quedian -确定queding -缺乏quefa -缺口quekou -确立queli -确切queqie -确认queren -缺少queshao -缺省quesheng -确实queshi -缺席quexi -缺陷quexian -确信quexin -确凿quezao -瘸子quezi -区分qufen -屈服qufu -躯干qugan -区划quhua -曲解qujie -取经qujing -取决qujue -躯壳quke -取乐qule -群qun -裙qun -逡qun -裙带qundai -群岛qundao -去年qunian -群众qunzhong -区区ququ -屈辱quru -驱散qusan -取舍qushe -取胜qusheng -去世qushi -驱使qushi -趋势qushi -躯体quti -区位quwei -区委quwei -趣味quwei -区县quxian -去向quxiang -趋向quxiang -取消quxiao -取信quxin -曲艺quyi -区域quyu -区长quzhang -曲折quzhe -屈指quzhi -驱逐quzhu -曲子quzi -奇形怪状qxgz -全心全意qxqy -气象台qxt -气象万千qxwq -齐心协力qxxl -岂有此理qycl -前因后果qyhg -情有可原qyky -强有力qyl -求之不得qzbd -取之不尽qzbj -轻重缓急qzhj -气壮山河qzsh -千真万确qzwq -人r -如r -日r -认r -入r -任r -热r -然r -容r -让r -润r -弱r -燃r -染r -壤r -绕r -仁r -溶r -刃r -仍r -然ran -燃ran -染ran -冉ran -苒ran -蚺ran -髯ran -燃点randian -然而raner -让rang -壤rang -嚷rang -瓤rang -攘rang -禳rang -穰rang -让步rangbu -让位rangwei -让贤rangxian -然后ranhou -燃料ranliao -染料ranliao -冉冉ranran -燃烧ranshao -绕rao -扰rao -饶rao -荛rao -娆rao -桡rao -扰乱raoluan -如此而已rcey -人才济济rcjj -热re -若*re -惹re -热爱reai -热潮rechao -热忱rechen -热诚recheng -热带redai -热火rehuo -热量reliang -热烈relie -人ren -认ren -任ren -仁ren -刃ren -忍ren -壬ren -韧ren -妊ren -纫ren -仞ren -荏ren -葚ren -饪ren -轫ren -稔ren -衽ren -热闹renao -人才rencai -人次renci -仁慈renci -认错rencuo -人大renda -韧带rendai -人道rendao -认得rende -认定rending -人防renfang -仍reng -扔reng -扔掉rengdiao -人格renge -仍旧rengjiu -人工rengong -认购rengou -仍然rengran -任何renhe -人家renjia -人间renjian -人杰renjie -认可renke -人口renkou -人类renlei -人力renli -人们renmen -任免renmian -人民renmin -任命renming -忍耐rennai -任凭renping -任期renqi -认清renqing -人权renquan -荏苒renran -忍让renrang -人人renren -人参renshen -人生rensheng -人事renshi -人士renshi -认识renshi -人手renshou -忍受renshou -认输renshu -忍痛rentong -人为renwei -认为renwei -人物renwu -任务renwu -人心renxin -忍心renxin -人选renxuan -任意renyi -仁义renyi -任用renyong -人员renyuan -认帐renzhang -认真renzhen -人质renzhi -任职renzhi -认罪renzui -认作renzuo -热切reqie -热情reqing -惹事reshi -热线rexian -热心rexin -热血rexue -人工合成rghc -热火朝天rhct -如虎添翼rhty -日ri -日报ribao -日本riben -日产richan -日常richang -日程richeng -日光riguang -日后rihou -日记riji -日久rijiu -日历rili -日落riluo -日内rinei -日期riqi -日夜riye -日益riyi -日用riyong -日照rizhao -日中rizhong -日子rizi -软件包rjb -人杰地灵rjdl -人尽其才rjqc -如饥似渴rjsk -日久天长rjtc -任劳任怨rlry -热泪盈眶rlyk -人民币rmb -人民代表大会rmdh -人民日报rmrb -燃眉之急rmzj -容rong -溶rong -荣rong -熔rong -融rong -绒rong -戎rong -茸rong -蓉rong -冗rong -嵘rong -狨rong -榕rong -肜rong -蝾rong -熔点rongdian -容光rongguang -融合ronghe -溶化ronghua -熔化ronghua -融化ronghua -融会ronghui -荣获ronghuo -容积rongji -溶解rongjie -容量rongliang -戎马rongma -容貌rongmao -容纳rongna -融洽rongqia -容忍rongren -荣辱rongru -容身rongshen -绒线rongxian -荣幸rongxing -容许rongxu -荣耀rongyao -溶液rongye -容易rongyi -荣誉rongyu -溶质rongzhi -肉rou -揉rou -柔rou -糅rou -蹂rou -鞣rou -柔和rouhe -肉麻rouma -柔软rouruan -肉体routi -任人为贤rrwx -日日夜夜rryy -人生观rsg -认识论rsl -惹事生非rssf -如上所述rsss -如ru -入ru -儒ru -乳ru -茹ru -蠕ru -孺ru -辱ru -汝ru -褥ru -蓐ru -薷ru -嚅ru -洳ru -溽ru -濡ru -缛ru -铷ru -襦ru -颥ru -软ruan -阮ruan -朊ruan -软骨ruangu -软件ruanjian -软禁ruanjin -软盘ruanpan -如常ruchang -如此ruci -入党rudang -蠕动rudong -乳房rufang -如果ruguo -如何ruhe -瑞rui -锐rui -蕊rui -芮rui -蕤rui -枘rui -睿rui -蚋rui -锐利ruili -瑞雪ruixue -锐意ruiyi -儒家rujia -如今rujin -辱骂ruma -入门rumen -入迷rumi -润run -闰run -润滑runhua -弱ruo -若ruo -偌ruo -弱点ruodian -若干ruogan -若是ruoshi -弱小ruoxiao -如期ruqi -入侵ruqin -如若ruruo -儒生rusheng -入手rushou -如同rutong -如下ruxia -入选ruxuan -如意ruyi -如愿ruyuan -入帐ruzhang -人武部rwb -若无其事rwqs -人言可畏rykw -日用品ryp -若有所思ryss -人之长情rzcq -是s -上s -时s -生s -说s -社s -深s -水s -所s -三s -十s -使s -事s -数s -四s -实s -少s -式s -山s -手s -撒sa -萨sa -洒sa -卅sa -仨sa -挲sa -脎sa -飒sa -撒谎sahuang -塞sai -思*sai -赛sai -腮sai -鳃sai -噻sai -赛车saiche -塞子saizi -撒娇sajiao -三san -散san -叁san -伞san -馓san -毵san -糁san -散步sanbu -散布sanbu -散发sanfa -三废sanfei -桑sang -丧sang -嗓sang -搡sang -磉sang -颡sang -丧命sangming -丧失sangshi -三国sanguo -三好sanhao -散会sanhui -三角sanjiao -三届sanjie -散失sanshi -散文sanwen -三月sanyue -扫sao -梢*sao -搔sao -骚sao -嫂sao -埽sao -缫sao -缲sao -臊sao -瘙sao -鳋sao -扫除saochu -扫荡saodang -扫地saodi -骚动saodong -骚乱saoluan -扫描saomiao -扫墓saomu -骚扰saorao -瘙痒saoyang -扫帚saozhou -洒脱satuo -说不定sbd -舍不得sbd -说不过去sbgq -说不来sbl -数不胜数sbss -素不相识sbxs -身不由己sbyj -上层建筑scjz -生产力scl -生产率scl -水产品scp -四川省scs -市场调节sctj -市场信息scxx -生动活泼sdhp -山东省sds -水电站sdz -色se -塞*se -瑟se -涩se -啬se -铯se -穑se -视而不见sebj -色彩secai -色调sediao -色盲semang -森sen -僧seng -僧侣senglu -森林senlin -森严senyan -色情seqing -瑟瑟sese -十二月sey -色泽seze -司法部sfb -赏罚分明sffm -说服力sfl -手风琴sfq -三番五次sfwc -四个现代化sgxh -手工业sgy -沙sha -杀sha -砂sha -啥sha -纱sha -莎sha -刹sha -傻sha -煞sha -杉sha -厦*sha -唼sha -嗄*sha -挲*sha -歃sha -铩sha -痧sha -裟sha -霎sha -鲨sha -煞白shabai -刹车shache -煞车shache -沙发shafa -傻瓜shagua -沙皇shahuang -色*shai -筛shai -晒shai -晒台shaitai -砂烬shajin -沙龙shalong -沙漠shamo -山shan -单*shan -闪shan -善shan -珊shan -扇shan -陕shan -掸*shan -苫shan -杉shan -删shan -煽shan -衫shan -擅shan -赡shan -膳shan -汕shan -缮shan -栅*shan -剡shan -讪shan -鄯shan -埏shan -芟shan -潸shan -姗shan -嬗shan -骟shan -膻shan -禅*shan -钐shan -疝shan -蟮shan -舢shan -跚shan -鳝shan -刹那shana -山坳shanao -陕北shanbei -擅长shanchang -删除shanchu -山川shanchuan -山地shandi -闪电shandian -扇动shandong -煽动shandong -山东shandong -山峰shanfeng -上shang -商shang -伤shang -尚shang -汤*shang -墒shang -赏shang -晌shang -裳shang -垧shang -绱shang -殇shang -熵shang -觞shang -删改shangai -山岗shangang -山冈shangang -上班shangban -上报shangbao -上边shangbian -商标shangbiao -上部shangbu -上策shangce -上层shangceng -商场shangchang -上次shangci -赏赐shangci -上当shangdang -上等shangdeng -上帝shangdi -商店shangdian -上调shangdiao -商定shangding -上访shangfang -伤感shanggan -上告shanggao -赏光shangguang -上海shanghai -伤害shanghai -商行shanghang -上级shangji -上集shangji -上进shangjin -上空shangkong -上来shanglai -商量shangliang -上流shangliu -上门shangmen -上面shangmian -上年shangnian -山沟shangou -商品shangpin -商洽shangqia -上前shangqian -尚且shangqie -上去shangqu -商榷shangque -商人shangren -上任shangren -上山shangshan -上升shangsheng -赏识shangshi -上述shangshu -上司shangsi -上诉shangsu -商谈shangtan -商讨shangtao -闪光shanguang -上文shangwen -上午shangwu -商务shangwu -上下shangxia -上限shangxian -伤心shangxin -上旬shangxun -上演shangyan -商业shangye -商议shangyi -上映shangying -上游shangyou -上涨shangzhang -上阵shangzhen -山河shanhe -善后shanhou -删节shanjie -善良shanliang -山林shanlin -山岭shanling -山脉shanmai -杉木shanmu -山区shanqu -扇区shanqu -山水shanshui -闪烁shanshuo -山头shantou -山西shanxi -陕西shanxi -赡养shanyang -闪耀shanyao -善意shanyi -善于shanyu -善战shanzhan -擅自shanzi -少shao -烧shao -稍shao -绍shao -召*shao -哨shao -梢shao -鞘*shao -捎shao -芍shao -勺shao -韶shao -邵shao -劭shao -苕shao -潲shao -杓*shao -蛸shao -筲shao -艄shao -哨兵shaobing -艄公shaogong -烧毁shaohui -少见shaojian -哨卡shaoka -少量shaoliang -少年shaonian -少女shaonu -烧伤shaoshang -少数shaoshu -哨所shaosuo -稍微shaowei -少许shaoxu -稍许shaoxu -少爷shaoye -少有shaoyou -少于shaoyu -少壮shaozhuang -沙哑shaya -砂眼shayan -傻子shazi -社she -设she -射she -摄she -舌she -折*she -涉she -舍she -蛇she -奢she -赊she -赦she -慑she -厍she -佘she -摺*she -猞she -滠she -歙she -畲she -麝she -设备shebei -射程shecheng -奢侈shechi -舍得shede -设法shefa -慑服shefu -赊购shegou -奢华shehua -社会shehui -社稷sheji -涉及sheji -设计sheji -射击sheji -舍己sheji -社交shejiao -设立sheli -涉猎shelie -社论shelun -深shen -身shen -神shen -什*shen -伸shen -参*shen -甚shen -渗shen -沈shen -肾shen -审shen -申shen -慎shen -砷shen -呻shen -娠shen -绅shen -婶shen -诜shen -谂shen -莘shen -葚*shen -哂shen -渖shen -椹shen -胂shen -矧shen -蜃shen -深奥shenao -申报shenbao -身边shenbian -申辩shenbian -身材shencai -审查shencha -深沉shenchen -深处shenchu -审处shenchu -审定shending -深度shendu -甚而shener -身分shenfen -身份shenfen -生sheng -胜sheng -声sheng -省sheng -升sheng -盛sheng -绳sheng -剩sheng -圣sheng -牲sheng -乘*sheng -甥sheng -嵊sheng -渑*sheng -晟sheng -眚sheng -笙sheng -生财shengcai -生产shengchan -生成shengcheng -牲畜shengchu -生存shengcun -盛大shengda -省得shengde -胜地shengdi -盛典shengdian -声调shengdiao -生动shengdong -省份shengfen -胜负shengfu -省府shengfu -生根shenggen -升华shenghua -省会shenghui -盛会shenghui -生活shenghuo -生机shengji -生计shengji -升级shengji -圣洁shengjie -圣经shengjing -盛开shengkai -牲口shengkou -盛况shengkuang -生理shengli -胜利shengli -省力shengli -省略shenglue -生命shengming -声明shengming -盛名shengming -生怕shengpa -生僻shengpi -生平shengping -升旗shengqi -生前shengqian -升迁shengqian -盛情shengqing -生趣shengqu -省去shengqu -胜任shengren -生日shengri -省事shengshi -盛事shengshi -声势shengshi -生疏shengshu -生死shengsi -胜似shengsi -胜诉shengsu -绳索shengsuo -生态shengtai -声讨shengtao -声望shengwang -省委shengwei -生物shengwu -生息shengxi -剩下shengxia -盛夏shengxia -圣贤shengxian -生效shengxiao -生肖shengxiao -盛行shengxing -生涯shengya -生意shengyi -声音shengyin -生于shengyu -生育shengyu -胜于shengyu -声誉shengyu -剩余shengyu -声援shengyuan -生长shengzhang -省长shengzhang -声张shengzhang -胜仗shengzhang -生殖shengzhi -圣旨shengzhi -盛装shengzhuang -审核shenhe -深厚shenhou -深化shenhua -神话shenhua -甚或shenhuo -审计shenji -神经shenjing -深刻shenke -审理shenli -什么shenme -审美shenmei -神秘shenmi -申明shenming -审判shenpan -身旁shenpang -审批shenpi -神气shenqi -神奇shenqi -深浅shenqian -深切shenqie -深情shenqing -申请shenqing -身躯shenqu -深入shenru -渗入shenru -神圣shensheng -身世shenshi -绅士shenshi -伸手shenshou -申述shenshu -神速shensu -申诉shensu -伸缩shensuo -神态shentai -身体shenti -神通shentong -渗透shentou -审问shenwen -神仙shenxian -审讯shenxun -沈阳shenyang -审议shenyi -呻吟shenyin -身影shenying -深远shenyuan -申冤shenyuan -审阅shenyue -深造shenzao -伸张shenzhang -深圳shenzhen -甚至shenzhi -深重shenzhong -慎重shenzhong -神州shenzhou -舍弃sheqi -赊欠sheqian -设施sheshi -社团shetuan -奢望shewang -射线shexian -涉嫌shexian -设想shexiang -赊销shexiao -设宴sheyan -摄影sheying -社员sheyuan -社长shezhang -设置shezhi -涉足shezu -社会公德shgd -是shi -时shi -十shi -使shi -事shi -实shi -式shi -识shi -世shi -试shi -石shi -什shi -示shi -市shi -史shi -师shi -始shi -施shi -士shi -势shi -湿shi -适shi -食shi -失shi -视shi -室shi -氏shi -似*shi -蚀shi -诗shi -释shi -殖*shi -拾shi -饰shi -驶shi -匙*shi -狮shi -尸shi -虱shi -矢shi -屎shi -柿shi -拭shi -誓shi -逝shi -嗜shi -噬shi -仕shi -侍shi -恃shi -嘘*shi -峙*shi -谥shi -埘shi -莳shi -蓍shi -弑shi -轼shi -贳shi -炻shi -铈shi -螫shi -舐shi -筮shi -酾shi -豕shi -鲥shi -鲺shi -失败shibai -势必shibi -事变shibian -师表shibiao -识别shibie -失策shice -史册shice -视察shicha -时常shichang -失常shichang -市场shichang -时辰shichen -失传shichuan -侍从shicong -时代shidai -世代shidai -适当shidang -是的shide -实地shidi -试点shidian -失调shidiao -失掉shidiao -事端shiduan -拾掇shiduo -时而shier -示范shifan -师范shifan -施放shifang -释放shifang -是非shifei -时分shifen -十分shifen -侍奉shifeng -是否shifou -师傅shifu -实干shigan -是个shige -诗歌shige -施工shigong -事故shigu -世故shigu -尸骨shigu -使馆shiguan -时光shiguang -嗜好shihao -适合shihe -时候shihou -事后shihou -侍候shihou -使唤shihuan -实惠shihui -失火shihuo -时机shiji -事迹shiji -实际shiji -世纪shiji -试剂shiji -史籍shiji -施加shijia -市价shijia -时间shijian -事件shijian -世间shijian -实践shijian -视角shijiao -市郊shijiao -使节shijie -十届shijie -世界shijie -使劲shijin -市井shijing -时局shiju -视觉shijue -时刻shike -石刻shike -市侩shikuai -实况shikuang -事理shili -实力shili -事例shili -势利shili -失利shili -势力shili -视力shili -示例shili -失恋shilian -适量shiliang -矢量shiliang -拾零shiling -失灵shiling -适龄shiling -时髦shimao -失密shimi -市民shimin -使命shiming -市内shinei -室内shinei -诗篇shipian -食品shipin -视频shipin -识破shipo -时期shiqi -事前shiqian -失窃shiqie -事情shiqing -实情shiqing -时区shiqu -时取shiqu -失去shiqu -市区shiqu -诗人shiren -市容shirong -湿润shirun -示弱shiruo -失散shisan -失色shise -施舍shishe -师生shisheng -失声shisheng -时时shishi -时事shishi -适时shishi -事实shishi -失事shishi -实施shishi -失实shishi -逝世shishi -史诗shishi -失势shishi -誓师shishi -尸首shishou -失守shishou -实数shishu -施属shishu -世俗shisu -失算shisuan -事态shitai -试探shitan -食堂shitang -实体shiti -尸体shiti -石头shitou -势头shitou -师团shituan -十万shiwan -失望shiwang -市委shiwei -示威shiwei -时务shiwu -事物shiwu -事务shiwu -实物shiwu -食物shiwu -饰物shiwu -失误shiwu -实习shixi -事先shixian -视线shixian -实现shixian -试想shixiang -事项shixiang -实效shixiao -试销shixiao -失信shixin -实行shixing -试行shixing -施行shixing -失修shixiu -实学shixue -史学shixue -实验shiyan -试验shiyan -食言shiyan -誓言shiyan -式样shiyang -事业shiye -实业shiye -失业shiye -视野shiye -时宜shiyi -事宜shiyi -示意shiyi -诗意shiyi -适宜shiyi -释疑shiyi -适应shiying -使用shiyong -实用shiyong -试用shiyong -适用shiyong -事由shiyou -石油shiyou -誓由shiyou -适于shiyu -誓愿shiyuan -十月shiyue -失约shiyue -实在shizai -实战shizhan -施展shizhan -市长shizhang -师长shizhang -使者shizhe -侍者shizhe -失真shizhen -市镇shizhen -市政shizheng -试制shizhi -实质shizhi -市制shizhi -食指shizhi -失职shizhi -适中shizhong -示众shizhong -始终shizhong -时装shizhuang -师资shizi -十足shizu -实足shizu -失足shizu -始祖shizu -手shou -受shou -收shou -首shou -守shou -熟*shou -授shou -寿shou -兽shou -售shou -瘦shou -狩shou -绶shou -艏shou -守备shoubei -手表shoubiao -收兵shoubing -收藏shoucang -手册shouce -首倡shouchang -寿辰shouchen -收成shoucheng -首创shouchuang -首次shouci -收存shoucun -寿诞shoudan -受到shoudao -守敌shoudi -首度shoudu -首都shoudu -手段shouduan -守法shoufa -首犯shoufan -收复shoufu -首府shoufu -手感shougan -手稿shougao -收割shouge -收购shougou -受害shouhai -守候shouhou -守护shouhu -收回shouhui -受贿shouhui -收获shouhuo -收集shouji -售价shoujia -受奖shoujiang -授奖shoujiang -手脚shoujiao -收缴shoujiao -首届shoujie -守旧shoujiu -收据shouju -授课shouke -受理shouli -收敛shoulian -首领shouling -收留shouliu -收录shoulu -收买shoumai -授命shouming -寿命shouming -首脑shounao -首批shoupi -授权shouquan -收容shourong -收入shouru -手软shouruan -瘦弱shouruo -首饰shoushi -手术shoushu -收缩shousuo -收条shoutiao -收听shouting -收尾shouwei -首尾shouwei -首先shouxian -首相shouxiang -瘦小shouxiao -收效shouxiao -手续shouxu -瘦削shouxue -收养shouyang -首要shouyao -受益shouyi -收益shouyi -兽医shouyi -受用shouyong -授予shouyu -守则shouze -首长shouzhang -收支shouzhi -生活上shs -上海市shs -数shu -书shu -树shu -属shu -术shu -输shu -述shu -熟shu -束shu -鼠shu -疏shu -殊shu -舒shu -蔬shu -薯shu -叔shu -署shu -枢shu -梳shu -抒shu -淑shu -赎shu -孰shu -暑shu -曙shu -蜀shu -黍shu -戍shu -竖shu -墅shu -庶shu -漱shu -恕shu -俞*shu -丨shu -倏shu -塾shu -菽shu -摅shu -沭shu -澍shu -姝shu -纾shu -毹shu -腧shu -殳shu -秫shu -刷shua -耍shua -唰shua -衰shuai -帅shuai -摔shuai -甩shuai -蟀shuai -衰败shuaibai -摔打shuaida -摔交shuaijiao -衰竭shuaijie -衰老shuailao -衰弱shuairuo -衰退shuaitui -衰亡shuaiwang -耍赖shualai -栓shuan -拴shuan -闩shuan -涮shuan -双shuang -霜shuang -爽shuang -泷*shuang -孀shuang -双边shuangbian -双方shuangfang -爽口shuangkou -爽快shuangkuai -爽朗shuanglang -双拼shuangpin -双重shuangzhong -耍弄shuanong -刷洗shuaxi -刷新shuaxin -书报shubao -书本shuben -蔬菜shucai -舒畅shuchang -输出shuchu -树丛shucong -疏导shudao -书店shudian -数额shue -抒发shufa -书法shufa -舒服shufu -束缚shufu -曙光shuguang -蜀汉shuhan -疏忽shuhu -倏忽shuhu -书画shuhua -水shui -说*shui -谁shui -睡shui -税shui -水稻shuidao -水电shuidian -水分shuifen -水果shuiguo -水火shuihuo -水晶shuijing -水库shuiku -水利shuili -水流shuiliu -睡眠shuimian -水平shuiping -税收shuishou -税务shuiwu -水下shuixia -水性shuixing -水源shuiyuan -水灾shuizai -谁知shuizhi -书记shuji -书籍shuji -暑假shujia -数据shuju -书刊shukan -数理shuli -树立shuli -竖立shuli -熟练shulian -数量shuliang -数列shulie -疏漏shulou -数落shuluo -数码shuma -书面shumian -庶民shumin -数目shumu -书目shumu -树木shumu -顺shun -吮shun -瞬shun -舜shun -顺便shunbian -顺差shuncha -顺次shunci -顺从shuncong -顺当shundang -顺道shundao -顺风shunfeng -枢纽shuniu -顺利shunli -顺路shunlu -瞬时shunshi -顺势shunshi -顺心shunxin -顺序shunxu -顺应shunying -顺着shunzhuo -说shuo -数*shuo -硕shuo -朔shuo -烁shuo -蒴shuo -搠shuo -妁shuo -槊shuo -铄shuo -说到shuodao -说道shuodao -说动shuodong -说法shuofa -说服shuofu -硕果shuoguo -说话shuohua -说教shuojiao -说明shuoming -说情shuoqing -硕士shuoshi -述评shuping -署期shuqi -暑期shuqi -抒情shuqing -熟人shuren -输入shuru -疏散shusan -属实shushi -熟识shushi -舒适shushi -束手shushou -叔叔shushu -数说shushuo -述说shushuo -输送shusong -疏松shusong -舒坦shutan -疏通shutong -熟悉shuxi -属相shuxiang -舒心shuxin -书信shuxin -属性shuxing -数学shuxue -属于shuyu -术语shuyu -疏远shuyuan -舒展shuzhan -数值shuzhi -树脂shuzhi -梳妆shuzhuang -数字shuzi -赎罪shuzui -售货员shy -社会主义shzy -四si -思si -死si -斯si -丝si -似si -司si -饲si -食*si -私si -厕*si -撕si -嘶si -肆si -寺si -嗣si -伺si -巳si -厮si -俟*si -兕si -厶si -咝si -汜si -泗si -澌si -姒si -驷si -缌si -祀si -锶si -鸶si -耜si -蛳si -笥si -死板siban -四边sibian -死别sibie -思潮sichao -丝绸sichou -四处sichu -四川sichuan -死党sidang -死敌sidi -司法sifa -四方sifang -四海sihai -丝毫sihao -嗣后sihou -似乎sihu -四化sihua -死缓sihuan -撕毁sihui -死活sihuo -四季siji -司机siji -私交sijiao -四届sijie -思考sikao -私利sili -私了siliao -司令siling -思路silu -四面simian -思念sinian -私念sinian -死去siqu -私人siren -死伤sishang -私事sishi -死尸sishi -死水sishui -思索sisuo -四体siti -私吞situn -死亡siwang -思维siwei -斯文siwen -私下sixia -思想sixiang -四项sixiang -死心sixin -私心sixin -肆行sixing -死刑sixing -私有siyou -私欲siyu -寺院siyuan -四月siyue -死者sizhe -四周sizhou -私自sizi -死罪sizui -拾金不昧sjbm -身经百战sjbz -书记处sjc -世界观sjg -舍己救人sjjr -数据库sjk -省军区sjq -杀鸡取蛋sjqd -实际上sjs -设计所sjs -试金石sjs -舍己为人sjwr -设计院sjy -随机应变sjyb -十进制sjz -石家庄sjz -适可而止skez -数理化slh -收录机slj -十六进制sljz -三令五申slws -司令员sly -四面八方smbf -手忙脚乱smjl -生命力sml -说明书sms -什么样smy -深谋远虑smyl -数目字smz -松song -送song -宋song -颂song -耸song -怂song -讼song -诵song -凇song -菘song -崧song -嵩song -忪song -悚song -淞song -竦song -松绑songbang -送别songbie -松弛songchi -松动songdong -颂歌songge -松劲songjin -松快songkuai -耸立songli -送礼songli -松散songsan -松涛songtao -松懈songxie -颂扬songyang -怂恿songyong -送葬songzang -送终songzhong -搜sou -艘sou -擞sou -嗽sou -叟sou -薮sou -嗖sou -嗾sou -馊sou -溲sou -飕sou -瞍sou -锼sou -螋sou -搜查soucha -搜集souji -搜索sousuo -搜寻souxun -售票处spc -食品工业spgy -水平线spx -生气勃勃sqbb -诗情画意sqhy -盛气凌人sqlr -山穷水尽sqsj -十全十美sqsm -首屈一指sqyz -四人帮srb -损人利己srlj -深入浅出srqc -似是而非ssef -时时刻刻sskk -姗姗来迟sslc -实事求是ssqs -事实上sss -随时随地sssd -善始善终sssz -顺水推舟sstz -四通公司stgs -四通集团stjt -身体力行stlx -生态平衡stph -素su -速su -苏su -塑su -缩su -俗su -诉su -宿su -肃su -酥su -粟su -僳su -溯su -夙su -谡su -蔌su -嗉su -愫su -涑su -簌su -觫su -稣su -算suan -酸suan -蒜suan -狻suan -酸楚suanchu -算法suanfa -算计suanji -算了suanle -算盘suanpan -算术suanshu -酸疼suanteng -酸痛suantong -素材sucai -速成sucheng -苏丹sudan -速度sudu -俗话suhua -随sui -穗sui -碎sui -虽sui -岁sui -尿*sui -隋sui -绥sui -髓sui -遂sui -隧sui -祟sui -谇sui -荽sui -濉sui -邃sui -燧sui -眭sui -睢sui -随笔suibi -随便suibian -随处suichu -随从suicong -随地suidi -随和suihe -随后suihou -随机suiji -随即suiji -虽然suiran -随身suishen -随时suishi -随手suishou -岁数suishu -虽说suishuo -随同suitong -随心suixin -随行suixing -随意suiyi -遂意suiyi -岁月suiyue -虽则suize -随着suizhe -诉苦suku -苏联sulian -塑料suliao -速率sulu -素描sumiao -肃穆sumu -损sun -孙sun -笋sun -荪sun -狲sun -飧sun -榫sun -隼sun -损害sunhai -损耗sunhao -损坏sunhuai -损伤sunshang -损失sunshi -孙子sunzi -所suo -缩suo -锁suo -索suo -莎*suo -蓑suo -梭suo -唆suo -琐suo -唢suo -嗦suo -嗍suo -娑suo -桫suo -挲*suo -睃suo -羧suo -所得suode -缩短suoduan -缩减suojian -锁链suolian -所能suoneng -索取suoqu -唆使suoshi -所属suoshu -琐碎suosui -所为suowei -所谓suowei -缩小suoxiao -缩写suoxie -琐屑suoxie -索性suoxing -所以suoyi -索引suoyin -缩影suoying -所有suoyou -所在suozai -所长suozhang -所至suozhi -梭子suozi -肃清suqing -苏区suqu -宿舍sushe -素数sushu -诉说sushuo -诉讼susong -速效suxiao -速写suxie -苏醒suxing -素养suyang -宿营suying -溯源suyuan -宿愿suyuan -夙愿suyuan -塑造suzao -速战suzhan -素质suzhi -苏州suzhou -苏维埃swa -税务局swj -手舞足蹈swzd -少先队sxd -身心健康sxjk -思想上sxs -山西省sxs -陕西省sxs -顺息万变sxwb -所向无敌sxwd -思想性sxx -商业部syb -说一不二sybe -收音机syj -使用价值syjz -所有权syq -沈阳市sys -实用性syx -十一月syy -所有制syz -私有制syz -时至今日szjr -三中全会szqh -始终如一szry -深圳四通szst -所作所为szsw -甚至于szy -他t -同t -它t -提t -题t -体t -图t -天t -头t -通t -条t -特t -土t -团t -统t -台t -她t -太t -套t -铁t -他ta -它ta -她ta -塔ta -踏ta -塌ta -獭ta -挞ta -蹋ta -拓*ta -嗒*ta -闼ta -溻ta -漯*ta -遢ta -榻ta -沓ta -铊ta -趿ta -鳎ta -踏步tabu -他的tade -它的tade -她的tade -塌方tafang -台tai -太tai -态tai -胎tai -抬tai -泰tai -苔tai -酞tai -汰tai -邰tai -薹tai -呔*tai -骀*tai -肽tai -炱tai -钛tai -跆tai -鲐tai -台北taibei -台词taici -态度taidu -台风taifeng -台阶taijie -太平taiping -泰然tairan -泰山taishan -态势taishi -太太taitai -抬头taitou -台湾taiwan -太阳taiyang -太原taiyuan -天安门tam -他们tamen -它们tamen -她们tamen -谈tan -碳tan -探tan -炭tan -弹*tan -坦tan -贪tan -滩tan -坍tan -摊tan -瘫tan -坛tan -檀tan -痰tan -潭tan -谭tan -毯tan -袒tan -叹tan -郯tan -澹tan -昙tan -忐tan -钽tan -锬tan -镡*tan -坦白tanbai -探测tance -探访tanfang -谈锋tanfeng -叹服tanfu -堂tang -糖tang -唐tang -塘tang -汤tang -搪tang -棠tang -膛tang -倘tang -躺tang -淌tang -趟tang -烫tang -傥tang -帑tang -溏tang -瑭tang -樘tang -铴tang -镗tang -耥tang -螗tang -螳tang -羰tang -醣tang -倘不tangbu -搪瓷tangci -弹弓tangong -倘若tangruo -搪塞tangsai -烫伤tangshang -堂堂tangtang -唐突tangtu -弹劾tanhe -袒护tanhu -谈话tanhua -瘫痪tanhuan -探究tanjiu -坦克tanke -贪婪tanlan -坦率tanlu -谈论tanlun -摊派tanpai -谈判tanpan -叹气tanqi -探亲tanqin -弹琴tanqin -坦然tanran -探索tansuo -探讨tantao -谈天tantian -探听tanting -贪图tantu -谈吐tantu -滩涂tantu -探望tanwang -探问tanwen -贪污tanwu -叹息tanxi -探险tanxian -谈心tanxin -弹性tanxing -探询tanxun -贪赃tanzang -套tao -讨tao -逃tao -陶tao -萄tao -桃tao -掏tao -涛tao -滔tao -绦tao -淘tao -鼗tao -叨*tao -啕tao -洮tao -韬tao -焘tao -饕tao -逃奔taoben -逃避taobi -逃兵taobing -逃窜taocuan -逃遁taodun -讨伐taofa -讨饭taofan -套购taogou -讨好taohao -讨还taohuan -讨价taojia -桃李taoli -韬略taolue -讨论taolun -逃命taoming -逃难taonan -逃跑taopao -淘气taoqi -逃生taosheng -淘汰taotai -滔滔taotao -逃脱taotuo -逃亡taowang -讨厌taoyan -陶冶taoye -桃子taozi -逃走taozou -陶醉taozui -踏青taqing -他人taren -踏实tashi -他说tashuo -他乡taxiang -挑拨离间tblj -台北市tbs -贪便宜tby -统筹兼顾tcjg -铁道部tdb -土地改革tdgg -同等学历tdxl -特te -忒te -忑te -慝*te -铽te -特别tebie -特产techan -特长techang -特出techu -特此teci -特大teda -特等tedeng -特地tedi -特点tedian -特定teding -特级teji -特技teji -特急teji -特将tejiang -特刊tekan -特快tekuai -特例teli -腾teng -疼teng -藤teng -誊teng -滕teng -疼爱tengai -腾达tengda -誊写tengxie -特派tepai -特区tequ -特权tequan -托儿所tes -特色tese -特使teshi -特殊teshu -特为tewei -特务tewu -特效texiao -特写texie -特性texing -特邀teyao -特意teyi -特有teyou -特约teyue -特征tezheng -特制tezhi -特种tezhong -突飞猛进tfmj -铁饭碗tfw -同甘共苦tggk -提货单thd -谈何容易thry -提ti -题ti -体ti -替ti -梯ti -惕ti -剔ti -踢ti -锑ti -蹄ti -啼ti -嚏ti -涕ti -剃ti -屉ti -倜ti -荑*ti -悌ti -逖ti -绨*ti -缇ti -鹈ti -裼ti -醍ti -天tian -田tian -添tian -填tian -甜tian -佃*tian -恬tian -舔tian -腆tian -掭tian -忝tian -阗tian -殄tian -畋tian -填报tianbao -天边tianbian -填表tianbiao -填补tianbu -天才tiancai -天长tianchang -填充tianchong -天地tiandi -田地tiandi -天鹅tiane -天府tianfu -天赋tianfu -天机tianji -天际tianji -添加tianjia -天津tianjin -恬静tianjing -天空tiankong -填空tiankong -天理tianli -天良tianliang -天亮tianliang -甜美tianmei -甜蜜tianmi -天明tianming -天平tianping -天气tianqi -天桥tianqiao -天然tianran -天壤tianrang -天色tianse -天上tianshang -天生tiansheng -天使tianshi -天堂tiantang -天体tianti -天天tiantian -甜头tiantou -天文tianwen -天下tianxia -天险tianxian -天仙tianxian -天性tianxing -天涯tianya -田野tianye -天真tianzhen -天职tianzhi -添置tianzhi -天资tianzi -条tiao -调*tiao -跳tiao -挑tiao -迢tiao -眺tiao -佻tiao -苕*tiao -祧tiao -窕tiao -蜩tiao -笤tiao -粜tiao -龆tiao -鲦tiao -髫tiao -挑拔tiaoba -跳动tiaodong -挑动tiaodong -挑逗tiaodou -跳高tiaogao -调和tiaohe -调剂tiaoji -条件tiaojian -调解tiaojie -调节tiaojie -条款tiaokuan -调理tiaoli -条理tiaoli -条例tiaoli -条令tiaoling -调配tiaopei -挑剔tiaoti -调停tiaoting -条文tiaowen -跳舞tiaowu -调戏tiaoxi -挑衅tiaoxin -挑选tiaoxuan -条约tiaoyue -挑战tiaozhan -调整tiaozheng -条子tiaozi -提拨tibo -题材ticai -体裁ticai -体操ticao -体察ticha -提倡tichang -提成ticheng -提出tichu -剔除tichu -题词tici -替代tidai -梯队tidui -铁tie -贴tie -帖tie -萜tie -餮tie -贴补tiebu -铁道tiedao -贴近tiejin -铁路tielu -贴切tieqie -贴身tieshen -铁证tiezheng -提法tifa -提防tifang -提纲tigang -提高tigao -体格tige -提供tigong -替换tihuan -体会tihui -提货tihuo -体积tiji -提价tijia -体力tili -体例tili -提炼tilian -体谅tiliang -体面timian -提名timing -题名timing -题目timu -听ting -停ting -庭ting -挺ting -廷ting -厅ting -烃ting -汀ting -亭ting -艇ting -莛ting -葶ting -婷ting -梃ting -町*ting -铤ting -蜓ting -霆ting -挺拔tingba -停办tingban -停泊tingbo -停产tingchan -听从tingcong -停顿tingdun -停工tinggong -挺括tinggua -听候tinghou -听话tinghua -停火tinghuo -听见tingjian -厅局tingju -听觉tingjue -停留tingliu -听凭tingping -听取tingqu -听任tingren -听说tingshuo -听信tingxin -厅长tingzhang -停止tingzhi -停职tingzhi -停滞tingzhi -听众tingzhong -提起tiqi -提前tiqian -提取tiqu -提升tisheng -提示tishi -体坛titan -体贴titie -提问tiwen -体温tiwen -体系tixi -体现tixian -体型tixing -提醒tixing -体验tiyan -提要tiyao -提议tiyi -体育tiyu -体制tizhi -体质tizhi -题字tizi -统计表tjb -条件反射tjfs -讨价还价tjhj -天津市tjs -条件下tjx -讨论会tlh -拖拉机tlj -他们的tmd -同盟会tmh -天南地北tndb -同tong -通tong -统tong -铜tong -痛tong -筒tong -童tong -桶tong -侗*tong -恫*tong -桐tong -酮tong -瞳tong -彤tong -捅tong -佟tong -仝tong -垌*tong -茼tong -嗵tong -峒*tong -恸tong -潼tong -砼tong -同伴tongban -同胞tongbao -通报tongbao -同辈tongbei -通病tongbing -同步tongbu -通常tongchang -通称tongcheng -统称tongcheng -痛斥tongchi -统筹tongchou -痛楚tongchu -同窗tongchuang -同道tongdao -通道tongdao -同等tongdeng -通电tongdian -通牒tongdie -通读tongdu -通告tonggao -统购tonggou -通过tongguo -通航tonghang -痛恨tonghen -同化tonghua -通话tonghua -童话tonghua -痛悔tonghui -通婚tonghun -统计tongji -通辑tongji -痛击tongji -同居tongju -痛苦tongku -痛哭tongku -痛快tongkuai -同僚tongliao -通令tongling -同盟tongmeng -同年tongnian -童年tongnian -同期tongqi -通气tongqi -同情tongqing -通融tongrong -同上tongshang -通商tongshang -同时tongshi -同事tongshi -统属tongshu -统帅tongshuai -通顺tongshun -通俗tongsu -通往tongwang -痛恶tongwu -痛惜tongxi -统辖tongxia -通向tongxiang -同乡tongxiang -统销tongxiao -通宵tongxiao -通晓tongxiao -同心tongxin -痛心tongxin -通信tongxin -同行tongxing -通行tongxing -同性tongxing -同学tongxue -通讯tongxun -同样tongyang -统一tongyi -同意tongyi -通用tongyong -通邮tongyou -统战tongzhan -同志tongzhi -统治tongzhi -通知tongzhi -头tou -投tou -透tou -偷tou -钭tou -骰tou -投案touan -头版touban -投奔touben -投标toubiao -投产touchan -透彻touche -头等toudeng -投放toufang -投机touji -投靠toukao -投篮toulan -偷懒toulan -头颅toulu -透露toulu -头面toumian -透明touming -头目toumu -头脑tounao -投票toupiao -透气touqi -投入touru -投身toushen -透视toushi -头痛toutong -偷闲touxian -投降touxiang -头绪touxu -投影touying -投掷touzhi -头子touzi -投资touzi -突破口tpk -太平洋tpy -通情达理tqdl -天气预报tqyb -突然袭击trxj -妥善处理tscl -通俗读物tsdw -挺身而出tsec -图书馆tsg -滔滔不绝ttbj -痛痛快快ttkk -团体赛tts -踏踏实实ttss -图tu -土tu -突tu -途tu -徒tu -凸tu -涂tu -吐tu -兔tu -屠tu -秃tu -堍tu -荼tu -菟tu -钍tu -酴tu -团tuan -湍tuan -抟tuan -彖tuan -疃tuan -图案tuan -湍急tuanji -团结tuanjie -团聚tuanju -湍流tuanliu -团体tuanti -团员tuanyuan -团圆tuanyuan -团长tuanzhang -突变tubian -图表tubiao -土产tuchan -突出tuchu -土地tudi -徒弟tudi -土匪tufei -土改tugai -涂改tugai -图画tuhua -土话tuhua -推tui -退tui -腿tui -颓tui -蜕tui -褪tui -忒*tui -煺tui -蜕变tuibian -退步tuibu -推测tuice -推迟tuichi -推崇tuichong -退出tuichu -推导tuidao -推动tuidong -推断tuiduan -推翻tuifan -颓废tuifei -推广tuiguang -退化tuihua -蜕化tuihua -退回tuihui -推荐tuijian -推进tuijin -推举tuiju -推开tuikai -推理tuili -推论tuilun -推敲tuiqiao -推却tuique -退却tuique -推让tuirang -退让tuirang -颓丧tuisang -退色tuise -推算tuisuan -退缩tuisuo -颓唐tuitang -推托tuituo -退伍tuiwu -推向tuixiang -推销tuixiao -推卸tuixie -推行tuixing -退休tuixiu -退学tuixue -推移tuiyi -退职tuizhi -突击tuji -图解tujie -途径tujing -徒劳tulao -图例tuli -吐露tulu -囤*tun -褪*tun -吞tun -屯tun -臀tun -氽tun -饨tun -暾tun -豚tun -吞并tunbing -吞没tunmo -吞吐tuntu -脱tuo -拖tuo -托tuo -妥tuo -椭tuo -舵*tuo -魄*tuo -鸵tuo -陀tuo -驮tuo -驼tuo -拓tuo -唾tuo -乇tuo -佗tuo -坨tuo -庹tuo -沱tuo -柝tuo -柁*tuo -橐tuo -砣tuo -铊*tuo -箨tuo -酡tuo -跎tuo -鼍tuo -驼背tuobei -拓补tuobu -脱出tuochu -妥当tuodang -脱轨tuogui -拓荒tuohuang -脱节tuojie -拖拉tuola -脱离tuoli -唾骂tuoma -唾弃tuoqi -妥善tuoshan -脱身tuoshen -妥协tuoxie -拖延tuoyan -唾液tuoye -图片tupian -突破tupo -突起tuqi -突然turan -徒然turan -土壤turang -屠杀tusha -徒手tushou -图书tushu -吐痰tutan -突围tuwei -突兀tuwu -图象tuxiang -图像tuxiang -图形tuxing -徒刑tuxing -图章tuzhang -图纸tuzhi -途中tuzhong -土著tuzhu -秃子tuzi -贪污盗窃twdq -台湾省tws -贪污受贿twsh -提心吊胆txdd -通讯社txs -同心同德txtd -同心协力txxl -推心置腹txzf -体育场tyc -体育锻炼tydl -体育馆tyg -腾云驾雾tyjw -太阳能tyn -太原市tys -天衣无缝tywf -通用性tyx -体育运动tyyd -团支部tzb -停滞不前tzbq -同志们tzm -天灾人祸tzrh -听之任之tzrz -通知书tzs -为w -我w -无w -问w -外w -五w -位w -物w -委w -完w -温w -万w -文w -往w -武w -务w -王w -围w -误w -晚w -瓦wa -挖wa -凹*wa -哇wa -蛙wa -洼wa -娃wa -袜wa -佤wa -娲wa -腽wa -外wai -歪wai -外币waibi -外边waibian -外表waibiao -外宾waibin -外部waibu -外传waichuan -外存waicun -外地waidi -外调waidiao -歪风waifeng -外观waiguan -外国waiguo -外行waihang -外汇waihui -外加waijia -外交waijiao -外界waijie -外景waijing -外科waike -外快waikuai -外流wailiu -外貌waimao -外贸waimao -外面waimian -外勤waiqin -歪曲waiqu -外商waishang -外伤waishang -外设waishe -外省waisheng -外甥waisheng -外事waishi -外围waiwei -外文waiwen -外线waixian -外销waixiao -歪斜waixie -外延waiyan -外因waiyin -外语waiyu -外援waiyuan -外在waizai -外债waizhai -外资waizi -瓦解wajie -挖掘wajue -挖苦waku -瓦砾wali -完wan -万wan -晚wan -弯wan -碗wan -顽wan -湾wan -挽wan -玩wan -蔓*wan -娩*wan -豌wan -丸wan -烷wan -皖wan -惋wan -宛wan -婉wan -腕wan -剜wan -芄wan -莞*wan -菀wan -纨wan -绾wan -琬wan -脘wan -畹wan -蜿wan -万般wanban -晚报wanbao -完备wanbei -完毕wanbi -完成wancheng -万代wandai -顽敌wandi -万吨wandun -万恶wane -万分wanfen -往wang -王wang -望wang -网wang -忘wang -妄wang -亡wang -旺wang -芒*wang -汪wang -枉wang -罔wang -尢wang -惘wang -辋wang -魍wang -往常wangchang -王朝wangchao -忘掉wangdiao -妄动wangdong -枉法wangfa -往返wangfan -枉费wangfei -往复wangfu -王国wangguo -亡国wangguo -往后wanghou -忘怀wanghuai -忘记wangji -旺季wangji -往来wanglai -网络wangluo -亡命wangming -往年wangnian -完工wangong -忘却wangque -枉然wangran -惘然wangran -往日wangri -旺盛wangsheng -往事wangshi -妄图wangtu -万古wangu -顽固wangu -往往wangwang -汪汪wangwang -忘我wangwo -往昔wangxi -妄想wangxiang -汪洋wangyang -望远wangyuan -王子wangzi -完好wanhao -晚会wanhui -挽回wanhui -晚婚wanhun -晚间wanjian -完结wanjie -挽救wanjiu -玩具wanju -顽抗wankang -完了wanle -挽力wanli -弯路wanlu -完美wanmei -万能wanneng -万年wannian -晚年wannian -玩弄wannong -晚期wanqi -顽强wanqiang -弯曲wanqu -完全wanquan -完善wanshan -晚上wanshang -玩赏wanshang -万事wanshi -万世wanshi -玩耍wanshua -万岁wansui -万万wanwan -万物wanwu -晚霞wanxia -万象wanxiang -玩笑wanxiao -万幸wanxing -婉言wanyan -万一wanyi -万元wanyuan -完整wanzheng -顽症wanzheng -万众wanzhong -宛转wanzhuan -瓦斯wasi -瓦特wate -娃娃wawa -外部设备wbsb -微不足道wbzd -无产阶级wcjj -微处理机wclj -无产者wcz -为wei -位wei -委wei -围wei -维wei -唯wei -卫wei -微wei -伟wei -未wei -威wei -危wei -尾wei -谓wei -喂wei -味wei -胃wei -魏wei -伪wei -遗*wei -违wei -韦wei -畏wei -纬wei -巍wei -桅wei -惟wei -潍wei -苇wei -萎wei -蔚wei -渭wei -尉wei -慰wei -偎wei -诿wei -隈wei -隗*wei -圩*wei -葳wei -薇wei -囗wei -帏wei -帷wei -崴wei -嵬wei -猥wei -猬wei -闱wei -沩wei -洧wei -涠wei -逶wei -娓wei -玮wei -韪wei -軎wei -炜wei -煨wei -痿wei -艉wei -鲔wei -尾巴weiba -违背weibei -未必weibi -威逼weibi -微波weibo -微薄weibo -未曾weiceng -未尝weichang -维持weichi -为此weici -伟大weida -味道weidao -纬度weidu -唯独weidu -巍峨weie -违法weifa -违反weifan -违犯weifan -威风weifeng -桅杆weigan -微观weiguan -危害weihai -为何weihe -维护weihu -危及weiji -微机weiji -危机weiji -危急weiji -围歼weijian -围剿weijiao -慰藉weijie -违禁weijin -未经weijing -畏惧weiju -违抗weikang -未可weike -唯恐weikong -惟恐weikong -胃口weikou -未来weilai -慰劳weilao -为了weile -威力weili -委靡weimi -未免weimian -微妙weimiao -帷幕weimu -危难weinan -畏难weinan -未能weineng -委派weipai -为期weiqi -畏怯weiqie -委曲weiqu -委屈weiqu -未然weiran -巍然weiran -围绕weirao -伟人weiren -委任weiren -微弱weiruo -威慑weishe -为生weisheng -卫生weisheng -尾声weisheng -卫士weishi -威势weishi -为首weishou -为数weishu -尾随weisui -未遂weisui -畏缩weisuo -萎缩weisuo -猥琐weisuo -委托weituo -委婉weiwan -危亡weiwang -巍巍weiwei -慰问weiwen -唯物weiwu -威武weiwu -微细weixi -威吓weixia -危险weixian -微小weixiao -微笑weixiao -威协weixie -威胁weixie -猥亵weixie -维新weixin -唯心weixin -违心weixin -威信weixin -微型weixing -卫星weixing -维修weixiu -威严weiyan -伟业weiye -唯一weiyi -位移weiyi -位于weiyu -谓语weiyu -委员weiyuan -为止weizhi -位置weizhi -未知weizhi -为重weizhong -为主weizhu -伪装weizhuang -问wen -温wen -文wen -稳wen -纹wen -闻wen -蚊wen -瘟wen -吻wen -紊wen -刎wen -阌wen -汶wen -璺wen -雯wen -文本wenben -瘟病wenbing -稳步wenbu -问答wenda -稳定wending -温度wendu -嗡weng -翁weng -瓮weng -蓊weng -蕹weng -稳固wengu -问好wenhao -温和wenhe -吻合wenhe -文化wenhua -文件wenjian -稳健wenjian -问津wenjin -文静wenjing -文具wenju -文科wenke -文盲wenmang -文明wenming -闻名wenming -温暖wennuan -文凭wenping -文人wenren -温柔wenrou -问世wenshi -文坛wentan -问题wenti -文体wenti -稳妥wentuo -文物wenwu -文献wenxian -文选wenxuan -文学wenxue -问讯wenxun -闻讯wenxun -文艺wenyi -瘟疫wenyi -文娱wenyu -文摘wenzhai -文章wenzhang -稳重wenzhong -文字wenzi -问罪wenzui -望而生畏wesw -闻风而动wfed -违法乱纪wflj -歪风邪气wfxq -温故知新wgzx -文化部whb -文汇报whb -文化馆whg -文化宫whg -武汉市whs -五湖四海whsh -忘乎所以whsy -问寒问暖whwn -文化娱乐whyl -玩忽职守whzs -外交部wjb -无纪律wjl -五讲四美wjsm -无拘无束wjws -无可奉告wkfg -无可非议wkfy -无可奈何wknh -乌鲁木齐wlmq -无理取闹wlqn -无论如何wlrh -物美价廉wmjl -误码率wml -文明礼貌wmlm -无名英雄wmyx -无能为力wnwl -我wo -握wo -窝wo -蜗wo -涡wo -沃wo -挝wo -卧wo -斡wo -倭wo -莴wo -喔wo -幄wo -渥wo -肟wo -硪wo -龌wo -窝藏wocang -卧床wochuang -我党wodang -卧倒wodao -我的wode -窝工wogong -我国woguo -我军wojun -我们women -窝囊wonang -我省wosheng -我校woxiao -为期不远wqby -无穷无尽wqwj -误入歧途wrqt -卫生部wsb -纹丝不动wsbd -万事大吉wsdj -万事俱备wsjb -为什么wsm -无所谓wsw -为所欲为wsyw -无所作为wszw -无wu -五wu -物wu -武wu -务wu -误wu -伍wu -舞wu -污wu -悟wu -雾wu -午wu -恶*wu -屋wu -乌wu -吴wu -亡*wu -诬wu -钨wu -巫wu -呜wu -芜wu -梧wu -吾wu -毋wu -捂wu -侮wu -坞wu -戊wu -晤wu -勿wu -兀wu -仵wu -阢wu -邬wu -圬wu -芴wu -唔wu -庑wu -怃wu -忤wu -浯wu -寤wu -迕wu -妩wu -婺wu -骛wu -杌wu -牾wu -於*wu -焐wu -鹉wu -鹜wu -痦wu -蜈wu -鋈wu -鼯wu -吾辈wubei -无比wubi -五笔wubi -务必wubi -舞弊wubi -无边wubian -无不wubu -五彩wucai -误差wucha -无常wuchang -无偿wuchang -舞场wuchang -武昌wuchang -无耻wuchi -无从wucong -武打wuda -舞蹈wudao -无敌wudi -舞动wudong -武斗wudou -武断wuduan -无法wufa -无妨wufang -无非wufei -武功wugong -污垢wugou -无故wugu -无关wuguan -五官wuguan -武官wuguan -无害wuhai -诬害wuhai -武汉wuhan -无何wuhe -乌黑wuhei -五湖wuhu -呜呼wuhu -误会wuhui -舞会wuhui -污秽wuhui -无及wuji -无机wuji -物价wujia -无间wujian -物件wujian -误解wujie -五届wujie -五金wujin -无愧wukui -无赖wulai -诬赖wulai -无理wuli -物理wuli -无礼wuli -物力wuli -武力wuli -无聊wuliao -无虑wulu -无论wulun -污蔑wumie -诬蔑wumie -无奈wunai -无能wuneng -毋宁wuning -务农wunong -物品wupin -无期wuqi -五七wuqi -武器wuqi -无情wuqing -无穷wuqiong -舞曲wuqu -无权wuquan -污染wuran -无任wuren -污辱wuru -侮辱wuru -物色wuse -无上wushang -误伤wushang -无声wusheng -午时wushi -务使wushi -无视wushi -误事wushi -务实wushi -无数wushu -武术wushu -无双wushuang -午睡wushui -五四wusi -无私wusi -舞台wutai -无题wuti -物体wuti -舞厅wuting -无为wuwei -无谓wuwei -无物wuwu -无暇wuxia -无限wuxian -诬陷wuxian -无效wuxiao -五星wuxing -午休wuxiu -无须wuxu -无需wuxu -务虚wuxu -午夜wuye -五一wuyi -无益wuyi -无疑wuyi -无垠wuyin -无用wuyong -毋庸wuyong -无余wuyu -无缘wuyuan -五月wuyue -物证wuzheng -无知wuzhi -物质wuzhi -武装wuzhuang -物资wuzi -兀自wuzi -误字wuzi -无罪wuzui -无微不至wwbz -唯物论wwl -卧薪尝胆wxcd -无线电wxd -微型机wxj -唯心论wxl -问心无愧wxwk -委员会wyh -无缘无故wywg -委员长wyz -误字率wzl -无足轻重wzqz -未知数wzs -完整无缺wzwq -学x -下x -行x -小x -线x -性x -新x -些x -想x -心x -向x -相x -系x -席x -现x -西x -修x -象x -先x -形x -心安理得xald -西安市xas -西半球xbq -相比之下xbzx -宣传部xcb -新陈代谢xcdx -新产品xcp -畜产品xcp -西城区xcq -喜出望外xcww -相对而言xdey -现代化xdh -想当然xdr -相对误差xdwc -先睹为快xdwk -形而上学xesx -显而易见xeyj -西方国家xfgj -消费品xfp -想方设法xfsf -先发制人xfzr -兴高采烈xgcl -新华社xhs -新华书店xhsd -系xi -席xi -西xi -习xi -细xi -吸xi -析xi -喜xi -洗xi -铣xi -稀xi -戏xi -隙xi -希xi -息xi -袭xi -锡xi -烯xi -牺xi -悉xi -惜xi -溪xi -腊*xi -栖*xi -昔xi -熙xi -硒xi -矽xi -晰xi -嘻xi -膝xi -夕xi -熄xi -汐xi -犀xi -檄xi -媳xi -僖xi -兮xi -隰xi -郗xi -茜*xi -菥xi -葸xi -蓰xi -奚xi -唏xi -徙xi -饩xi -阋xi -浠xi -淅xi -屣xi -嬉xi -玺xi -樨xi -曦xi -觋xi -欷xi -歙*xi -熹xi -禊xi -禧xi -皙xi -穸xi -裼*xi -蜥xi -螅xi -蟋xi -舄xi -舾xi -羲xi -粞xi -翕xi -醯xi -蹊*xi -鼷xi -下xia -夏xia -吓xia -狭xia -霞xia -唬*xia -瞎xia -虾xia -匣xia -辖xia -暇xia -峡xia -侠xia -厦xia -呷xia -狎xia -遐xia -瑕xia -柙xia -硖xia -瘕*xia -罅xia -黠xia -狭隘xiaai -下班xiaban -下辈xiabei -下边xiabian -下策xiace -下层xiaceng -下场xiachang -下沉xiachen -下次xiaci -瑕疵xiaci -下达xiada -吓倒xiadao -下等xiadeng -下毒xiadu -下发xiafa -下放xiafang -峡谷xiagu -霞光xiaguang -瞎话xiahua -喜爱xiai -下级xiaji -下集xiaji -夏季xiaji -下降xiajiang -侠客xiake -下来xialai -下联xialian -夏粮xialiang -下列xialie -下令xialing -下流xialiu -下落xialuo -下马xiama -厦门xiamen -下面xiamian -线xian -现xian -先xian -县xian -限xian -见*xian -显xian -鲜xian -献xian -险xian -陷xian -宪xian -纤xian -洗*xian -掀xian -弦xian -铣*xian -腺xian -锨xian -仙xian -咸xian -贤xian -衔xian -舷xian -闲xian -涎xian -嫌xian -馅xian -羡xian -冼xian -苋xian -莶xian -藓xian -岘xian -猃xian -暹xian -娴xian -氙xian -燹xian -祆xian -鹇xian -痫xian -蚬xian -筅xian -籼xian -酰xian -跣xian -跹xian -霰xian -西安xian -献宝xianbao -先辈xianbei -现场xianchang -现成xiancheng -县城xiancheng -献丑xianchou -献词xianci -现存xiancun -现代xiandai -先导xiandao -显得xiande -险地xiandi -限定xianding -限度xiandu -线段xianduan -限额xiane -险恶xiane -宪法xianfa -先锋xianfeng -险峰xianfeng -想xiang -向xiang -相xiang -象xiang -响xiang -项xiang -箱xiang -乡xiang -降*xiang -香xiang -像xiang -详xiang -橡xiang -享xiang -湘xiang -厢xiang -镶xiang -襄xiang -翔xiang -祥xiang -巷xiang -芗xiang -葙xiang -饷xiang -庠xiang -骧xiang -缃xiang -蟓xiang -鲞xiang -飨xiang -相爱xiangai -相比xiangbi -想必xiangbi -相差xiangcha -相称xiangcheng -相处xiangchu -相传xiangchuan -乡村xiangcun -相当xiangdang -向导xiangdao -相等xiangdeng -相对xiangdui -想法xiangfa -相反xiangfan -相仿xiangfang -相干xianggan -香港xianggang -相隔xiangge -相关xiangguan -相好xianghao -相互xianghu -相继xiangji -相加xiangjia -相见xiangjian -相减xiangjian -相交xiangjiao -橡胶xiangjiao -相近xiangjin -详尽xiangjin -巷口xiangkou -向来xianglai -相连xianglian -向量xiangliang -响亮xiangliang -相貌xiangmao -项目xiangmu -想念xiangnian -相片xiangpian -想起xiangqi -详情xiangqing -向上xiangshang -相声xiangsheng -响声xiangsheng -相识xiangshi -翔实xiangshi -享受xiangshou -相思xiangsi -相似xiangsi -香甜xiangtian -相同xiangtong -相投xiangtou -显贵xiangui -向往xiangwang -详细xiangxi -向下xiangxia -乡下xiangxia -象限xiangxian -想象xiangxiang -相信xiangxin -香烟xiangyan -相依xiangyi -相宜xiangyi -相应xiangying -相映xiangying -响应xiangying -享用xiangyong -相遇xiangyu -相约xiangyue -乡镇xiangzhen -象征xiangzheng -箱子xiangzi -陷害xianhai -显赫xianhe -鲜红xianhong -先后xianhou -鲜花xianhua -献花xianhua -闲话xianhua -贤惠xianhui -献计xianji -献技xianji -显见xianjian -衔接xianjie -先进xianjin -现金xianjin -险境xianjing -陷阱xianjing -现款xiankuan -现况xiankuang -先例xianli -献礼xianli -先烈xianlie -线路xianlu -显露xianlu -鲜美xianmei -鲜明xianming -贤明xianming -显目xianmu -羡慕xianmu -贤能xianneng -先期xianqi -掀起xianqi -限期xianqi -嫌弃xianqi -先前xianqian -先遣xianqian -险情xianqing -先驱xianqu -显然xianran -贤人xianren -闲人xianren -现任xianren -陷入xianru -闲散xiansan -献身xianshen -先生xiansheng -先是xianshi -现实xianshi -显示xianshi -娴熟xianshu -线索xiansuo -闲谈xiantan -险滩xiantan -先天xiantian -线条xiantiao -县委xianwei -纤维xianwei -显现xianxian -现象xianxiang -现行xianxing -鲜血xianxue -显眼xianyan -鲜艳xianyan -显要xianyao -险要xianyao -显耀xianyao -现役xianyi -嫌疑xianyi -现有xianyou -限于xianyu -闲杂xianza -现在xianzai -县长xianzhang -宪章xianzhang -限制xianzhi -先知xianzhi -闲置xianzhi -闲职xianzhi -显著xianzhu -现状xianzhuang -险阻xianzu -小xiao -消xiao -削xiao -效xiao -笑xiao -校xiao -销xiao -硝xiao -萧xiao -肖xiao -孝xiao -霄xiao -哮xiao -嚣xiao -宵xiao -淆xiao -晓xiao -啸xiao -哓xiao -崤xiao -潇xiao -逍xiao -骁xiao -绡xiao -枭xiao -枵xiao -蛸*xiao -筱xiao -箫xiao -魈xiao -小报xiaobao -小辈xiaobei -笑柄xiaobing -消沉xiaochen -消除xiaochu -消毒xiaodu -效法xiaofa -小贩xiaofan -消防xiaofang -消费xiaofei -校风xiaofeng -小鬼xiaogui -效果xiaoguo -小孩xiaohai -消耗xiaohao -消化xiaohua -笑话xiaohua -小惠xiaohui -销毁xiaohui -销魂xiaohun -消极xiaoji -削减xiaojian -小结xiaojie -小姐xiaojie -孝敬xiaojing -校刊xiaokan -小康xiaokang -效劳xiaolao -效力xiaoli -销路xiaolu -效率xiaolu -消灭xiaomie -消磨xiaomo -效能xiaoneng -消气xiaoqi -消遣xiaoqian -笑容xiaorong -削弱xiaoruo -潇洒xiaosa -校舍xiaoshe -小时xiaoshi -消失xiaoshi -消逝xiaoshi -消瘦xiaoshou -销售xiaoshou -小数xiaoshu -小说xiaoshuo -萧条xiaotiao -消息xiaoxi -肖像xiaoxiang -小心xiaoxin -枭雄xiaoxiong -小学xiaoxue -效验xiaoyan -逍遥xiaoyao -效益xiaoyi -效应xiaoying -校友xiaoyou -小于xiaoyu -校园xiaoyuan -销赃xiaozang -校长xiaozhang -嚣张xiaozhang -效忠xiaozhong -小组xiaozu -下情xiaqing -下去xiaqu -辖区xiaqu -下手xiashou -夏收xiashou -下属xiashu -下水xiashui -下台xiatai -夏天xiatian -下文xiawen -下午xiawu -下限xiaxian -下乡xiaxiang -遐想xiaxiang -狭义xiayi -下游xiayou -狭窄xiazhai -夏至xiazhi -夏种xiazhong -喜报xibao -细胞xibao -西北xibei -西边xibian -稀薄xibo -锡箔xibo -西餐xican -洗涤xidi -吸毒xidu -些xie -解*xie -写xie -斜xie -谢xie -协xie -械xie -叶*xie -血*xie -卸xie -屑xie -鞋xie -歇xie -邪xie -胁xie -蟹xie -泄xie -泻xie -契*xie -楔xie -蝎xie -挟xie -携xie -谐xie -懈xie -偕xie -亵xie -勰xie -燮xie -薤xie -撷xie -獬xie -廨xie -渫xie -瀣xie -邂xie -绁xie -缬xie -榭xie -榍xie -颉*xie -躞xie -写出xiechu -协从xiecong -携带xiedai -邪道xiedao -协调xiediao -协定xieding -亵渎xiedu -邪恶xiee -协和xiehe -谐和xiehe -协会xiehui -谢绝xiejue -协力xieli -泄漏xielou -邪路xielu -泄露xielu -泄密xiemi -邪念xienian -胁迫xiepo -邪气xieqi -协商xieshang -写生xiesheng -携手xieshou -邪说xieshuo -协同xietong -歇息xiexi -谢谢xiexie -协议xieyi -谐音xieyin -协约xieyue -写照xiezhao -协助xiezhu -鞋子xiezi -写作xiezuo -协作xiezuo -西方xifang -西风xifeng -西服xifu -吸附xifu -媳妇xifu -习惯xiguan -西汉xihan -稀罕xihan -希罕xihan -喜欢xihuan -袭击xiji -细节xijie -洗劫xijie -喜剧xiju -戏剧xiju -席卷xijuan -细菌xijun -犀利xili -系列xilie -奚落xiluo -熄灭ximie -新xin -心xin -信xin -锌xin -芯xin -辛xin -寻*xin -欣xin -薪xin -忻xin -衅xin -囟xin -馨xin -昕xin -歆xin -镡*xin -鑫xin -心爱xinai -西南xinan -新春xinchun -信贷xindai -心得xinde -心烦xinfan -心服xinfu -信服xinfu -行xing -性xing -形xing -型xing -星xing -兴xing -省*xing -醒xing -姓xing -幸xing -腥xing -猩xing -惺xing -刑xing -邢xing -杏xing -陉xing -荇xing -荥xing -擤xing -饧xing -悻xing -硎xing -心甘xingan -兴办xingban -性别xingbie -姓别xingbie -刑场xingchang -星辰xingchen -形成xingcheng -行程xingcheng -行动xingdong -幸而xinger -刑法xingfa -刑罚xingfa -兴奋xingfen -幸福xingfu -性格xingge -幸好xinghao -型号xinghao -行贿xinghui -星火xinghuo -性急xingji -形迹xingji -兴建xingjian -行径xingjing -行军xingjun -星空xingkong -幸亏xingkui -行李xingli -行旅xinglu -幸免xingmian -性命xingming -姓名xingming -醒目xingmu -性能xingneng -行期xingqi -兴起xingqi -星期xingqi -性情xingqing -星球xingqiu -兴趣xingqu -形容xingrong -行商xingshang -兴盛xingsheng -行使xingshi -行事xingshi -行驶xingshi -形式xingshi -幸事xingshi -刑事xingshi -形势xingshi -姓氏xingshi -行署xingshu -兴衰xingshuai -形态xingtai -形体xingti -兴亡xingwang -兴旺xingwang -行为xingwei -行文xingwen -醒悟xingwu -形象xingxiang -行销xingxiao -星星xingxing -行凶xingxiong -兴修xingxiu -行业xingye -星夜xingye -幸运xingyun -行政xingzheng -性质xingzhi -兴致xingzhi -形状xingzhuang -行走xingzou -信号xinhao -心狠xinhen -心慌xinhuang -信汇xinhui -细腻xini -西宁xining -心急xinji -信件xinjian -新疆xinjiang -新近xinjin -新居xinju -心坎xinkan -辛苦xinku -信赖xinlai -辛劳xinlao -心理xinli -心里xinli -心灵xinling -心目xinmu -信念xinnian -戏弄xinong -新奇xinqi -辛勤xinqin -心情xinqing -新区xinqu -新人xinren -信任xinren -欣赏xinshang -新生xinsheng -心声xinsheng -新事xinshi -新式xinshi -新书xinshu -薪水xinshui -心酸xinsuan -辛酸xinsuan -心疼xinteng -心田xintian -心跳xintiao -心头xintou -欣慰xinwei -新闻xinwen -心细xinxi -信息xinxi -欣喜xinxi -新鲜xinxian -心想xinxiang -信箱xinxiang -馨香xinxiang -信心xinxin -新型xinxing -新星xinxing -新兴xinxing -心虚xinxu -心血xinxue -信仰xinyang -心意xinyi -新异xinyi -新颖xinying -信用xinyong -新余xinyu -信誉xinyu -心愿xinyuan -心脏xinzang -新址xinzhi -心中xinzhong -雄xiong -胸xiong -兄xiong -凶xiong -熊xiong -匈xiong -汹xiong -芎xiong -雄辩xiongbian -雄兵xiongbing -凶残xiongcan -兄弟xiongdi -凶恶xionge -雄关xiongguan -凶狠xionghen -雄厚xionghou -胸怀xionghuai -雄健xiongjian -胸口xiongkou -熊猫xiongmao -凶猛xiongmeng -匈奴xiongnu -凶器xiongqi -凶杀xiongsha -雄师xiongshi -凶手xiongshou -胸膛xiongtang -雄伟xiongwei -雄心xiongxin -汹涌xiongyong -雄壮xiongzhuang -雄姿xiongzi -西欧xiou -习气xiqi -吸气xiqi -喜气xiqi -稀奇xiqi -希奇xiqi -喜庆xiqing -吸取xiqu -戏曲xiqu -昔日xiri -牺牲xisheng -西式xishi -喜事xishi -稀释xishi -吸收xishou -系数xishu -洗刷xishua -吸吮xishun -习俗xisu -习题xiti -西天xitian -系统xitong -修xiu -锈xiu -休xiu -袖xiu -秀xiu -朽xiu -宿*xiu -臭*xiu -羞xiu -嗅xiu -绣xiu -咻xiu -岫xiu -馐xiu -庥xiu -溴xiu -鸺xiu -貅xiu -髹xiu -修补xiubu -秀才xiucai -羞耻xiuchi -修辞xiuci -修订xiuding -修复xiufu -修改xiugai -修建xiujian -修剪xiujian -嗅觉xiujue -休克xiuke -羞愧xiukui -修理xiuli -秀丽xiuli -秀气xiuqi -羞辱xiuru -羞涩xiuse -修饰xiushi -休息xiuxi -休想xiuxiang -修养xiuyang -休养xiuyang -修造xiuzao -袖章xiuzhang -袖珍xiuzhen -修正xiuzheng -修筑xiuzhu -希望xiwang -席位xiwei -细微xiwei -西文xiwen -檄文xiwen -细小xixiao -细心xixin -悉心xixin -喜讯xixun -吸烟xiyan -西洋xiyang -西医xiyi -吸引xiyin -希有xiyou -戏院xiyuan -喜悦xiyue -西藏xizang -洗澡xizao -细则xize -细致xizhi -习作xizuo -下基层xjc -现阶段xjd -新技术xjs -献计献策xjxc -先见之明xjzm -兴利除弊xlcb -系列化xlh -稀里糊涂xlht -狭路相逢xlxf -畜牧业xmy -心满意足xmyz -西宁市xns -小朋友xpy -向前看xqk -喜气洋洋xqyy -先人后己xrhj -兴师动众xsdz -销售额xse -刑事犯罪xsfz -小时候xsh -新时期xsq -新生事物xssw -形式主义xszy -相提并论xtbl -续xu -许xu -须xu -需xu -序xu -虚xu -絮xu -畜xu -叙xu -蓄xu -绪xu -徐xu -墟xu -戌xu -嘘xu -酗xu -旭xu -恤xu -婿xu -吁*xu -诩xu -勖xu -圩xu -蓿xu -洫xu -浒*xu -溆xu -顼xu -栩xu -煦xu -砉*xu -盱xu -胥xu -糈xu -醑xu -选xuan -旋xuan -宣xuan -悬xuan -玄xuan -券*xuan -轩xuan -喧xuan -癣xuan -眩xuan -绚xuan -儇xuan -谖xuan -萱xuan -揎xuan -泫xuan -渲xuan -漩xuan -璇xuan -楦xuan -暄xuan -炫xuan -煊xuan -碹xuan -铉xuan -镟xuan -痃xuan -悬案xuanan -轩昂xuanang -选拔xuanba -宣布xuanbu -选材xuancai -选场xuanchang -宣称xuancheng -宣传xuanchuan -选定xuanding -宣读xuandu -宣告xuangao -选购xuangou -悬挂xuangua -玄乎xuanhu -喧哗xuanhua -选集xuanji -宣讲xuanjiang -选举xuanju -绚烂xuanlan -绚丽xuanli -选录xuanlu -旋律xuanlu -选民xuanmin -喧闹xuannao -悬念xuannian -选派xuanpai -宣判xuanpan -选配xuanpei -选票xuanpiao -选区xuanqu -选取xuanqu -喧嚷xuanrang -宣誓xuanshi -选手xuanshou -悬殊xuanshu -旋涡xuanwo -玄虚xuanxu -悬崖xuanya -宣言xuanyan -宣扬xuanyang -炫耀xuanyao -选用xuanyong -选择xuanze -宣战xuanzhan -选种xuanzhong -旋转xuanzhuan -许多xuduo -学xue -血xue -削*xue -雪xue -穴xue -靴xue -薛xue -谑xue -噱*xue -泶xue -踅xue -鳕xue -学报xuebao -学部xuebu -学潮xuechao -学费xuefei -学风xuefeng -学府xuefu -血汗xuehan -学好xuehao -学会xuehui -学籍xueji -血迹xueji -学科xueke -血泪xuelei -学历xueli -学龄xueling -学年xuenian -学派xuepai -学期xueqi -血肉xuerou -学生xuesheng -学时xueshi -学识xueshi -学士xueshi -学术xueshu -血书xueshu -学说xueshuo -血统xuetong -学徒xuetu -学位xuewei -学问xuewen -学习xuexi -血洗xuexi -学校xuexiao -血压xueya -学业xueye -血液xueye -学友xueyou -学员xueyuan -学院xueyuan -血晕xueyun -血战xuezhan -学者xuezhe -学制xuezhi -虚构xugou -序号xuhao -蓄积xuji -虚假xujia -叙旧xujiu -许可xuke -序列xulie -绪论xulun -虚名xuming -序幕xumu -畜牧xumu -训xun -旬xun -迅xun -讯xun -寻xun -循xun -巡xun -荤*xun -浚*xun -勋xun -熏xun -询xun -驯xun -殉xun -汛xun -逊xun -巽xun -郇*xun -埙xun -荀xun -蕈xun -薰xun -峋xun -徇xun -獯xun -恂xun -洵xun -浔xun -曛xun -窨*xun -醺xun -鲟xun -巡捕xunbu -巡查xuncha -寻常xunchang -驯服xunfu -殉国xunguo -巡航xunhang -循环xunhuan -巡回xunhui -虚拟xuni -寻机xunji -巡警xunjing -勋爵xunjue -训练xunlian -巡逻xunluo -迅猛xunmeng -寻求xunqiu -逊色xunse -巡视xunshi -徇私xunsi -迅速xunsu -熏陶xuntao -许诺xunuo -讯问xunwen -询问xunwen -寻衅xunxin -循序xunxu -勋章xunzhang -寻找xunzhao -殉职xunzhi -寻址xunzhi -需求xuqiu -序曲xuqu -虚荣xurong -虚弱xuruo -虚设xushe -叙事xushi -虚实xushi -序数xushu -虚数xushu -叙述xushu -叙说xushuo -虚伪xuwei -虚心xuxin -序言xuyan -需要xuyao -须臾xuyu -许愿xuyuan -须知xuzhi -宣武区xwq -信息处理xxcl -循序见进xxjj -辛辛苦苦xxkk -信息量xxl -熙熙攘攘xxrr -小学生xxs -欣欣向荣xxxr -小心翼翼xxyy -下一步xyb -胸有成竹xycz -洗衣机xyj -小意思xys -习以为常xywc -新颖性xyx -兴致勃勃xzbb -新中国xzg -行政区域xzqy -雪中送炭xzst -心中无数xzws -选择性xzx -心中有数xzys -行之有效xzyx -一y -有y -用y -要y -以y -于y -也y -样y -义y -与y -由y -压y -员y -月y -意y -又y -运y -原y -油y -验y -压ya -亚ya -呀ya -牙ya -芽ya -雅ya -蚜ya -鸭ya -匹*ya -押ya -鸦ya -丫ya -崖ya -衙ya -涯ya -哑ya -讶ya -伢ya -垭ya -揠ya -岈ya -迓ya -娅ya -琊ya -桠ya -氩ya -砑ya -睚ya -痖ya -哑巴yaba -牙齿yachi -压倒yadao -压服yafu -牙关yaguan -雅观yaguan -压价yajia -押金yajin -亚军yajun -压力yali -验yan -研yan -严yan -眼yan -言yan -盐yan -演yan -岩yan -沿yan -烟yan -延yan -掩yan -宴yan -炎yan -颜yan -燕yan -衍yan -铅*yan -焉yan -咽yan -阉yan -淹yan -蜒yan -阎yan -奄yan -艳yan -堰yan -厌yan -砚yan -雁yan -唁yan -彦yan -焰yan -谚yan -殷*yan -厣yan -赝yan -剡*yan -俨yan -偃yan -兖yan -谳yan -阽*yan -郾yan -鄢yan -芫*yan -菸yan -崦yan -恹yan -闫yan -阏yan -湮yan -滟yan -妍yan -嫣yan -琰yan -檐yan -晏yan -胭yan -腌*yan -焱yan -罨yan -筵yan -酽yan -魇yan -餍yan -鼹yan -沿岸yanan -严办yanban -掩蔽yanbi -演变yanbian -烟草yancao -延长yanchang -演唱yanchang -严惩yancheng -延迟yanchi -演出yanchu -唁电yandian -严冬yandong -厌恶yane -厌烦yanfan -样yang -养yang -氧yang -扬yang -洋yang -阳yang -羊yang -秧yang -央yang -杨yang -仰yang -殃yang -鸯yang -佯yang -疡yang -痒yang -漾yang -徉yang -怏yang -泱yang -炀yang -烊yang -恙yang -蛘yang -鞅yang -掩盖yangai -样板yangban -样本yangben -洋财yangcai -养成yangcheng -沿革yange -严格yange -阳光yangguang -洋行yanghang -养护yanghu -氧化yanghua -养料yangliao -杨柳yangliu -仰面yangmian -殃民yangmin -仰慕yangmu -样品yangpin -洋气yangqi -扬弃yangqi -央求yangqiu -养伤yangshang -样式yangshi -阳台yangtai -眼光yanguang -仰望yangwang -洋务yangwu -洋相yangxiang -扬言yangyan -样样yangyang -洋溢yangyi -养育yangyu -养殖yangzhi -样子yangzi -沿海yanhai -严寒yanhan -眼红yanhong -咽喉yanhou -掩护yanhu -眼花yanhua -延缓yanhuan -宴会yanhui -焰火yanhuo -演讲yanjiang -眼界yanjie -严禁yanjin -严谨yanjin -眼镜yanjing -眼睛yanjing -研究yanjiu -严峻yanjun -眼看yankan -严酷yanku -眼眶yankuang -眼泪yanlei -眼力yanli -严厉yanli -艳丽yanli -眼帘yanlian -眼亮yanliang -言路yanlu -沿路yanlu -言论yanlun -掩埋yanmai -严密yanmi -严明yanming -烟幕yanmu -延年yannian -延期yanqi -眼前yanqian -宴请yanqing -俨然yanran -炎热yanre -眼色yanse -颜色yanse -延伸yanshen -岩石yanshi -演示yanshi -掩饰yanshi -验收yanshou -严守yanshou -延寿yanshou -演说yanshuo -严肃yansu -演算yansuan -言谈yantan -研讨yantao -沿途yantu -阎王yanwang -延误yanwu -烟雾yanwu -宴席yanxi -筵席yanxi -演习yanxi -沿袭yanxi -眼下yanxia -沿线yanxian -言行yanxing -严刑yanxing -延续yanxu -艳阳yanyang -演义yanyi -演绎yanyi -掩映yanying -沿用yanyong -言语yanyu -演员yanyuan -厌战yanzhan -沿着yanzhe -验证yanzheng -研制yanzhi -严重yanzhong -演奏yanzou -要yao -药yao -约*yao -摇yao -腰yao -咬yao -邀yao -耀yao -陶*yao -侥*yao -疟yao -妖yao -瑶yao -尧yao -遥yao -窑yao -谣yao -姚yao -舀yao -钥*yao -夭yao -爻yao -吆yao -崾yao -徭yao -幺yao -珧yao -杳yao -轺yao -曜yao -肴yao -铫*yao -鹞yao -窈yao -繇yao -鳐yao -摇摆yaobai -腰包yaobao -要不yaobu -谣传yaochuan -要得yaode -要点yaodian -摇动yaodong -窑洞yaodong -遥感yaogan -妖怪yaoguai -要害yaohai -摇撼yaohan -摇晃yaohuang -要件yaojian -要紧yaojin -摇控yaokong -遥控yaokong -摇篮yaolan -要领yaoling -要么yaome -妖魔yaomo -要目yaomu -邀请yaoqing -要求yaoqiu -要塞yaosai -要是yaoshi -钥匙yaoshi -要素yaosu -窈窕yaotiao -摇头yaotou -要闻yaowen -药物yaowu -要挟yaoxie -耀眼yaoyan -谣言yaoyan -妖艳yaoyan -夭折yaozhe -要职yaozhi -鸦片yapian -压迫yapo -压强yaqiang -压缩yasuo -雅兴yaxing -压仰yayang -压抑yayi -压榨yazha -压制yazhi -雅致yazhi -亚洲yazhou -鸭子yazi -雅座yazuo -要不得ybd -一般的说ybds -一部分ybf -要不然ybr -要不是ybs -一般说来ybsl -要不要yby -一辈子ybz -一把抓ybz -用不着ybz -扬长避短ycbd -由此可见yckj -银川市ycs -与此同时ycts -有偿转让yczr -邮电部ydb -有道德ydd -邮电局ydj -一刀切ydq -运动员ydy -印度洋ydy -因地制宜ydzy -也ye -业ye -页ye -叶ye -液ye -夜ye -野ye -爷ye -冶ye -邪*ye -哗*ye -咽*ye -椰ye -噎ye -耶ye -掖ye -曳ye -腋ye -拽*ye -靥ye -谒ye -邺ye -揶ye -晔ye -烨ye -铘ye -夜餐yecan -野餐yecan -野火yehuo -业绩yeji -夜间yejian -冶金yejin -夜里yeli -冶练yelian -野蛮yeman -夜幕yemu -夜色yese -也是yeshi -夜市yeshi -野兽yeshou -液体yeti -野外yewai -夜晚yewan -业务yewu -夜校yexiao -野心yexin -野性yexing -也许yexu -幼儿园yey -爷爷yeye -野营yeying -业余yeyu -野战yezhan -叶子yezi -一方面yfm -一分为二yfwe -阳奉阴违yfyw -一概而论ygel -一国两制yglz -有根有据ygyj -严格要求ygyq -有何特长yhtc -银行帐号yhzh -炎黄子孙yhzs -一yi -以yi -义yi -意yi -已yi -移yi -医yi -议yi -依yi -易yi -乙yi -艺yi -益yi -异yi -宜yi -仪yi -亿yi -遗yi -伊yi -役yi -衣yi -疑yi -亦yi -谊yi -翼yi -译yi -抑yi -忆yi -疫yi -壹yi -揖yi -铱yi -颐yi -夷yi -胰yi -沂yi -姨yi -彝yi -椅yi -蚁yi -倚yi -矣yi -邑yi -屹yi -臆yi -逸yi -肄yi -裔yi -毅yi -溢yi -诣yi -翌yi -绎yi -刈yi -劓yi -仡*yi -佚yi -佾yi -诒yi -圯yi -埸yi -懿yi -苡yi -荑yi -薏yi -弈yi -奕yi -挹yi -弋yi -呓yi -咦yi -咿yi -嗌*yi -噫yi -峄yi -嶷yi -猗yi -饴yi -怿yi -怡yi -悒yi -漪yi -迤yi -驿yi -缢yi -殪yi -轶yi -贻yi -欹*yi -旖yi -熠yi -眙yi -钇yi -镒yi -镱yi -痍yi -瘗yi -癔yi -翊yi -蜴yi -舣yi -羿yi -翳yi -酏yi -黟yi -议案yian -疑案yian -一半yiban -一般yiban -一斑yiban -一边yibian -以便yibian -仪表yibiao -一并yibing -异步yibu -遗产yichan -异常yichang -议程yicheng -益处yichu -遗传yichuan -一次yici -依次yici -依从yicong -一代yidai -一带yidai -一旦yidan -一点yidian -一定yiding -议定yiding -移动yidong -一度yidu -遗毒yidu -一端yiduan -臆断yiduan -亿吨yidun -一发yifa -依法yifa -义愤yifen -衣服yifu -依附yifu -一概yigai -一个yige -一共yigong -议购yigou -已故yigu -一贯yiguan -异国yiguo -遗憾yihan -遗恨yihen -以后yihou -异化yihua -议会yihui -疑惑yihuo -以及yiji -异己yiji -遗迹yiji -议价yijia -意见yijian -移交yijiao -一届yijie -一经yijing -已经yijing -意境yijing -依旧yijiu -一举yiju -依据yiju -移居yiju -议决yijue -依靠yikao -倚靠yikao -一刻yike -医科yike -一块yikuai -以来yilai -依赖yilai -一览yilan -一例yili -毅力yili -屹立yili -一连yilian -意料yiliao -医疗yiliao -遗留yiliu -遗漏yilou -一律yilu -疑虑yilu -议论yilun -一面yimian -以免yimian -疫苗yimiao -移民yimin -因yin -引yin -阴yin -印yin -音yin -银yin -烟*yin -隐yin -饮yin -荫yin -茵yin -殷yin -姻yin -吟yin -淫yin -寅yin -尹yin -胤yin -鄞yin -圻*yin -垠yin -堙yin -茚yin -吲yin -喑yin -狺yin -夤yin -洇yin -湮*yin -氤yin -铟yin -瘾yin -窨yin -蚓yin -霪yin -龈yin -疑难yinan -阴暗yinan -隐蔽yinbi -音标yinbiao -隐藏yincang -阴沉yinchen -银川yinchuan -因此yinci -引导yindao -音调yindiao -印度yindu -引渡yindu -以内yinei -因而yiner -印发yinfa -音符yinfu -应ying -影ying -硬ying -营ying -英ying -映ying -迎ying -樱ying -婴ying -鹰ying -缨ying -莹ying -萤ying -荧ying -蝇ying -赢ying -盈ying -颖ying -嬴ying -郢ying -茔ying -荥*ying -莺ying -萦ying -蓥ying -撄ying -嘤ying -膺ying -滢ying -潆ying -瀛ying -瑛ying -璎ying -楹ying -媵ying -鹦ying -瘿ying -颍ying -罂ying -英镑yingbang -硬币yingbi -应变yingbian -映衬yingchen -应酬yingchou -迎春yingchun -应当yingdang -赢得yingde -婴儿yinger -营房yingfang -迎风yingfeng -应付yingfu -应该yinggai -英国yingguo -樱花yinghua -英魂yinghun -应急yingji -硬件yingjian -迎接yingjie -应届yingjie -英杰yingjie -营救yingjiu -英俊yingjun -盈亏yingkui -赢利yingli -盈利yingli -英烈yinglie -迎面yingmian -英明yingming -硬盘yingpan -影片yingpian -硬拼yingpin -影射yingshe -映射yingshe -樱桃yingtao -迎头yingtou -因果yinguo -影响yingxiang -硬性yingxing -英雄yingxiong -营养yingyang -应邀yingyao -营业yingye -应用yingyong -英勇yingyong -应有yingyou -英语yingyu -盈余yingyu -营造yingzao -应战yingzhan -迎战yingzhan -映照yingzhao -应征yingzheng -影子yingzi -英姿yingzi -银行yinhang -引号yinhao -殷红yinhong -隐患yinhuan -淫秽yinhui -阴魂yinhun -意念yinian -姨娘yiniang -阴极yinji -印鉴yinjian -引进yinjin -引力yinli -阴历yinli -阴凉yinliang -引路yinlu -隐瞒yinman -阴谋yinmou -银幕yinmu -隐慝yinni -银牌yinpai -引起yinqi -殷切yinqie -殷勤yinqin -引擎yinqing -引人yinren -饮食yinshi -印刷yinshua -饮水yinshui -因素yinsu -阴天yintian -引退yintui -因为yinwei -淫威yinwei -阴险yinxian -印象yinxiang -音响yinxiang -音信yinxin -因循yinxun -引言yinyan -阴影yinying -引用yinyong -引诱yinyou -阴雨yinyu -姻缘yinyuan -隐约yinyue -音乐yinyue -引证yinzheng -印证yinzheng -一片yipian -一瞥yipie -一起yiqi -一齐yiqi -义气yiqi -意气yiqi -仪器yiqi -遗弃yiqi -以前yiqian -一切yiqie -依然yiran -亦然yiran -毅然yiran -艺人yiren -宜人yiren -遗容yirong -以上yishang -一生yisheng -医生yisheng -一时yishi -一事yishi -意识yishi -议事yishi -逸事yishi -仪式yishi -医师yishi -医士yishi -遗失yishi -一手yishou -遗书yishu -艺术yishu -意思yisi -一体yiti -议题yiti -遗体yiti -一天yitian -一同yitong -异同yitong -一头yitou -意图yitu -疑团yituan -以外yiwai -意外yiwai -亿万yiwan -以往yiwang -遗忘yiwang -以为yiwei -意味yiwei -意文yiwen -疑问yiwen -译文yiwen -一无yiwu -义务yiwu -遗物yiwu -医务yiwu -贻误yiwu -一下yixia -以下yixia -一线yixian -一向yixiang -一项yixiang -意向yixiang -遗像yixiang -一些yixie -一心yixin -疑心yixin -异性yixing -医学yixue -一言yiyan -义演yiyan -遗言yiyan -一样yiyang -医药yiyao -意义yiyi -异议yiyi -义勇yiyong -易于yiyu -议员yiyuan -意愿yiyuan -医院yiyuan -亿元yiyuan -遗愿yiyuan -疑云yiyun -一再yizai -一早yizao -臆造yizao -依仗yizhang -仪仗yizhang -一朝yizhao -衣着yizhao -依照yizhao -一阵yizhen -一直yizhi -一致yizhi -以至yizhi -以致yizhi -意志yizhi -抑制yizhi -医治yizhi -抑止yizhi -移植yizhi -遗址yizhi -一种yizhong -遗嘱yizhu -研究会yjh -有纪律yjl -研究生yjs -研究所yjs -研究室yjs -养精畜锐yjxr -研究员yjy -拥军优属yjys -一技之长yjzc -一口气ykq -一览表ylb -以理服人ylfr -阅览室yls -有理想ylx -有利于yly -越来越yly -有目共睹ymgd -一目了然ymlr -有没有ymy -云南省yns -育*yo -哟yo -唷yo -用yong -勇yong -永yong -拥yong -涌yong -蛹yong -庸yong -佣yong -臃yong -痈yong -雍yong -踊yong -咏yong -泳yong -恿yong -俑yong -壅yong -墉yong -喁yong -慵yong -邕yong -镛yong -甬yong -鳙yong -饔yong -拥抱yongbao -永别yongbie -永不yongbu -用处yongchu -用度yongdu -用法yongfa -用费yongfei -勇敢yonggan -用功yonggong -永恒yongheng -用户yonghu -拥护yonghu -拥挤yongji -永久yongjiu -用具yongju -永诀yongjue -用力yongli -庸碌yonglu -勇猛yongmeng -用品yongpin -勇气yongqi -勇士yongshi -庸俗yongsu -咏叹yongtan -用途yongtu -涌现yongxian -用心yongxin -用意yongyi -拥有yongyou -用于yongyu -勇于yongyu -永远yongyuan -踊跃yongyue -有you -由you -又you -油you -右you -友you -优you -幼you -游you -尤you -诱you -犹you -幽you -悠you -忧you -邮you -铀you -酉you -佑you -釉you -卣you -攸you -侑you -莠you -莜you -莸you -尢*you -呦you -囿you -宥you -柚you -猷you -牖you -铕you -疣you -蚰you -蚴you -蝣you -蝤*you -繇*you -鱿you -黝you -鼬you -有碍youai -友爱youai -幽暗youan -友邦youbang -右边youbian -忧愁youchou -由此youci -有错youcuo -有待youdai -优待youdai -诱导youdao -有的youde -优等youdeng -有点youdian -邮电youdian -优点youdian -诱发youfa -有功yougong -有关youguan -有害youhai -友好youhao -优化youhua -油画youhua -幽会youhui -优惠youhui -诱惑youhuo -有机youji -游击youji -有劲youjin -幽静youjing -悠久youjiu -邮局youju -由来youlai -游览youlan -有劳youlao -有利youli -有力youli -游离youli -优良youliang -优劣youlie -幽灵youling -忧虑youlu -优美youmei -幼苗youmiao -有名youming -幽默youmo -右派youpai -诱骗youpian -邮票youpiao -尤其youqi -油漆youqi -友情youqing -右倾youqing -有趣youqu -油然youran -犹如youru -有色youse -优胜yousheng -有时youshi -有事youshi -有失youshi -优势youshi -有数youshu -油水youshui -有所yousuo -有望youwang -有为youwei -游戏youxi -有限youxian -优先youxian -悠闲youxian -有效youxiao -幼小youxiao -有些youxie -有心youxin -游行youxing -优秀youxiu -幽雅youya -悠扬youyang -又要youyao -有益youyi -优异youyi -友谊youyi -有用youyong -游泳youyong -有余youyu -由于youyu -犹豫youyu -忧郁youyu -悠远youyuan -优越youyue -有着youzhe -邮政youzheng -优质youzhi -幼稚youzhi -由衷youzhong -邮资youzi -有求必应yqby -以权谋私yqms -有气无力yqwl -迎刃而解yrej -因人而异yrey -与人为善yrws -引人注目yrzm -意识到ysd -艺术家ysj -因势利导ysld -印刷体yst -意识形态ysxt -衣食住行yszx -以身作则yszz -研讨会yth -一条龙ytl -一条心ytx -有条有理ytyl -于yu -与yu -育yu -鱼yu -雨yu -玉yu -余yu -遇yu -预yu -域yu -语yu -愈yu -渔yu -予yu -羽yu -愚yu -御yu -谷*yu -欲yu -宇yu -蔚*yu -尉*yu -迂yu -淤yu -盂yu -榆yu -虞yu -舆yu -俞yu -逾yu -愉yu -渝yu -隅yu -娱yu -屿yu -禹yu -芋yu -郁yu -吁yu -喻yu -峪yu -狱yu -誉yu -浴yu -寓yu -裕yu -豫yu -驭yu -粥*yu -禺yu -毓yu -伛yu -俣yu -谀yu -谕yu -萸yu -菀*yu -蓣yu -揄yu -圄yu -圉yu -嵛yu -狳yu -饫yu -馀yu -庾yu -阈yu -鬻yu -妪yu -妤yu -纡yu -瑜yu -昱yu -觎yu -腴yu -腧*yu -欤yu -於yu -煜yu -熨yu -燠yu -聿yu -钰yu -鹆yu -鹬yu -瘐yu -瘀yu -窬yu -窳yu -蜮yu -蝓yu -竽yu -臾yu -舁yu -雩yu -龉yu -员yuan -原yuan -圆yuan -源yuan -元yuan -远yuan -愿yuan -院yuan -缘yuan -援yuan -园yuan -怨yuan -鸳yuan -渊yuan -冤yuan -垣yuan -袁yuan -辕yuan -猿yuan -苑yuan -垸yuan -塬yuan -芫yuan -掾yuan -圜*yuan -沅yuan -媛yuan -瑗yuan -橼yuan -爰yuan -眢yuan -鸢yuan -螈yuan -箢yuan -鼋yuan -原本yuanben -渊博yuanbo -冤仇yuanchou -远大yuanda -元旦yuandan -园地yuandi -园丁yuanding -远东yuandong -远方yuanfang -缘分yuanfen -原告yuangao -原故yuangu -缘故yuangu -圆滑yuanhua -原籍yuanji -冤家yuanjia -元件yuanjian -远见yuanjian -远近yuanjin -远景yuanjing -援救yuanjiu -原来yuanlai -原理yuanli -原谅yuanliang -原料yuanliao -远虑yuanlu -圆满yuanman -远谋yuanmou -远期yuanqi -冤屈yuanqu -源泉yuanquan -原始yuanshi -远视yuanshi -元首yuanshou -元帅yuanshuai -元素yuansu -援外yuanwai -愿望yuanwang -冤枉yuanwang -原先yuanxian -远销yuanxiao -元宵yuanxiao -院校yuanxiao -原形yuanxing -怨言yuanyan -原野yuanye -愿意yuanyi -园艺yuanyi -原因yuanyin -援引yuanyin -原有yuanyou -缘由yuanyou -远游yuanyou -远远yuanyuan -渊源yuanyuan -元月yuanyue -原则yuanze -院长yuanzhang -远征yuanzheng -援助yuanzhu -原子yuanzi -院子yuanzi -预报yubao -预备yubei -愚笨yuben -余步yubu -预测yuce -愚蠢yuchun -遇到yudao -预定yuding -预订yuding -余毒yudu -月yue -说*yue -越yue -约yue -乐*yue -跃yue -曰yue -阅yue -钥yue -岳yue -粤yue -悦yue -龠yue -瀹yue -栎*yue -樾yue -刖yue -钺yue -月报yuebao -月初yuechu -月底yuedi -约定yueding -月度yuedu -阅读yuedu -乐队yuedui -约法yuefa -月份yuefen -月光yueguang -越轨yuegui -约会yuehui -越界yuejie -跃进yuejin -越境yuejing -阅览yuelan -阅历yueli -月亮yueliang -月末yuemo -约莫yuemo -越南yuenan -乐谱yuepu -乐器yueqi -月球yueqiu -乐曲yuequ -月色yuese -越是yueshi -约束yueshu -月台yuetai -乐团yuetuan -约有yueyou -乐章yuezhang -预防yufang -预风yufeng -预付yufu -预感yugan -预告yugao -预购yugou -遇害yuhai -宇航yuhang -与会yuhui -迂回yuhui -雨季yuji -预计yuji -遇见yujian -预见yujian -语句yuju -豫剧yuju -愉快yukuai -娱乐yule -鱼雷yulei -预料yuliao -雨露yulu -舆论yulun -愚昧yumei -育苗yumiao -预谋yumou -运yun -员*yun -云yun -匀yun -均*yun -允yun -孕yun -耘yun -郧yun -陨yun -蕴yun -酝yun -晕yun -韵yun -郓yun -芸yun -狁yun -恽yun -愠yun -纭yun -韫yun -殒yun -昀yun -氲yun -熨yun -遇难yunan -云彩yuncai -蕴藏yuncang -匀称yuncheng -运动yundong -熨斗yundou -云海yunhai -运河yunhe -韵律yunlu -陨落yunluo -云南yunnan -酝酿yunnian -允诺yunnuo -愚弄yunong -运气yunqi -运输yunshu -运算yunsuan -云梯yunti -运往yunwang -韵味yunwei -云雾yunwu -云霞yunxia -运行yunxing -允许yunxu -运用yunyong -孕育yunyu -运载yunzai -运转yunzhuan -与其yuqi -语气yuqi -预期yuqi -预审yushen -于是yushi -预示yushi -预售yushou -雨水yushui -预算yusuan -欲望yuwang -语文yuwen -预习yuxi -预先yuxian -遇险yuxian -预想yuxiang -预言yuyan -语言yuyan -寓言yuyan -预演yuyan -予以yuyi -寓于yuyu -愉悦yuyue -预兆yuzhao -预支yuzhi -宇宙yuzhou -有文化ywh -业务联系ywlx -意味着ywz -有限公司yxgs -一系列yxl -有效期yxq -医学院yxy -一心一意yxyy -游泳池yyc -营业额yye -夜以继日yyjr -应用科学yykx -一言堂yyt -引以为戒yywj -优越性yyx -营业员yyy -隐隐约约yyyy -运用自如yyzr -拥政爱民yzam -原子能yzn -已知数yzs -有助于yzy -言之有理yzyl -在z -这z -主z -中z -种z -着z -争z -战z -作z -正z -之z -制z -重z -组z -治z -只z -子z -自z -质z -指z -杂za -扎*za -咱za -匝za -砸za -咋za -咂za -在zai -再zai -载zai -栽zai -灾zai -仔*zai -哉zai -宰zai -崽zai -甾zai -再版zaiban -再不zaibu -在场zaichang -再度zaidu -宰割zaige -灾害zaihai -再好zaihao -在乎zaihu -灾荒zaihuang -再会zaihui -灾祸zaihuo -再见zaijian -在理zaili -灾民zaimin -灾难zainan -栽培zaipei -再起zaiqi -灾情zaiqing -灾区zaiqu -再三zaisan -在世zaishi -再说zaishuo -载体zaiti -在下zaixia -再现zaixian -宰相zaixiang -在意zaiyi -在于zaiyu -再造zaizao -再则zaize -在职zaizhi -再植zaizhi -杂技zaji -杂粮zaliang -杂乱zaluan -赞zan -咱zan -暂zan -攒zan -拶zan -瓒zan -昝zan -簪zan -糌zan -趱zan -錾zan -赞成zancheng -暂定zanding -藏*zang -脏zang -葬zang -赃zang -奘zang -驵zang -臧zang -赞歌zange -赃款zangkuan -葬送zangsong -赃物zangwu -藏族zangzu -杂念zanian -赞美zanmei -咱们zanmen -暂且zanqie -暂缺zanque -赞赏zanshang -暂时zanshi -赞颂zansong -赞叹zantan -暂停zanting -赞同zantong -暂行zanxing -赞扬zanyang -暂用zanyong -赞助zanzhu -造zao -早zao -遭zao -燥zao -凿zao -糟zao -枣zao -皂zao -藻zao -澡zao -蚤zao -躁zao -噪zao -灶zao -唣zao -早晨zaochen -造成zaocheng -凿穿zaochuan -造次zaoci -造词zaoci -遭到zaodao -早稻zaodao -造反zaofan -早饭zaofan -造福zaofu -糟糕zaogao -造化zaohua -造价zaojia -造就zaojiu -造林zaolin -早年zaonian -糟粕zaopo -早期zaoqi -早日zaori -早上zaoshang -遭受zaoshou -早衰zaoshuai -糟蹋zaota -早晚zaowan -造型zaoxing -遭殃zaoyang -造谣zaoyao -造诣zaoyi -早已zaoyi -噪音zaoyin -遭遇zaoyu -造字zaozi -杂谈zatan -杂文zawen -杂质zazhi -杂志zazhi -资本主义zbzy -资产阶级zcjj -增长率zcl -总参谋部zcmb -真才实学zcsx -自动化zdh -自动检测zdjc -自动检索zdjs -自动控制zdkz -主动权zdq -招待所zds -总的说来zdsl -主动性zdx -则ze -择ze -责ze -侧*ze -泽ze -咋*ze -仄ze -赜ze -啧ze -帻ze -迮ze -昃ze -笮ze -箦ze -舴ze -责备zebei -责成zecheng -责罚zefa -责怪zeguai -贼zei -责令zeling -责骂zema -怎zen -谮zen -增zeng -曾zeng -综*zeng -憎zeng -赠zeng -缯zeng -甑zeng -罾zeng -锃zeng -增补zengbu -增产zengchan -增长zengchang -增大zengda -增订zengding -增多zengduo -增高zenggao -憎恨zenghen -增加zengjia -增减zengjian -增进zengjin -增量zengliang -赠品zengpin -增强zengqiang -增删zengshan -增设zengshe -赠送zengsong -增添zengtian -赠言zengyan -增益zengyi -增援zengyuan -怎么zenme -怎奈zennai -怎样zenyang -责任zeren -责问zewen -总而言之zeyz -争分夺秒zfdm -针锋相对zfxd -自负盈亏zfyk -中关村zgc -自告奋勇zgfy -中国共产党zggd -总工会zgh -中国特色的zgtd -中国银行zgyh -自古以来zgyl -中国政府zgzf -中共中央zgzy -查*zha -扎zha -炸zha -闸zha -铡zha -轧zha -渣zha -蜡*zha -喳zha -札zha -眨zha -栅zha -榨zha -咋*zha -乍zha -诈zha -柞*zha -揸zha -吒zha -咤zha -哳zha -喋*zha -楂*zha -砟zha -痄zha -蚱zha -齄zha -炸弹zhadan -扎根zhagen -炸毁zhahui -寨zhai -侧*zhai -择*zhai -摘zhai -窄zhai -斋zhai -翟*zhai -祭*zhai -宅zhai -债zhai -砦zhai -瘵zhai -摘录zhailu -债权zhaiquan -债务zhaiwu -窄小zhaixiao -摘要zhaiyao -札记zhaji -战zhan -展zhan -站zhan -占zhan -粘*zhan -颤*zhan -瞻zhan -毡zhan -詹zhan -沾zhan -盏zhan -斩zhan -辗zhan -崭zhan -蘸zhan -栈zhan -湛zhan -绽zhan -谵zhan -搌zhan -旃zhan -战败zhanbai -战报zhanbao -战备zhanbei -战场zhanchang -展翅zhanchi -展出zhanchu -战地zhandi -战斗zhandou -战犯zhanfan -长*zhang -张zhang -章zhang -掌zhang -仗zhang -障zhang -胀zhang -涨zhang -账zhang -樟zhang -彰zhang -漳zhang -杖zhang -丈zhang -帐zhang -瘴zhang -仉zhang -鄣zhang -幛zhang -嶂zhang -獐zhang -嫜zhang -璋zhang -蟑zhang -障碍zhangai -站岗zhangang -长辈zhangbei -章程zhangcheng -长大zhangda -战歌zhange -章法zhangfa -帐房zhangfang -丈夫zhangfu -掌管zhangguan -帐号zhanghao -章节zhangjie -帐目zhangmu -战功zhangong -掌权zhangquan -张贴zhangtie -战鼓zhangu -沾光zhanguang -战国zhanguo -战果zhanguo -张望zhangwang -掌握zhangwo -张扬zhangyang -战壕zhanhao -战后zhanhou -战机zhanji -战绩zhanji -战局zhanju -占据zhanju -展开zhankai -战况zhankuang -展览zhanlan -占领zhanling -战略zhanlue -战马zhanma -展品zhanpin -战区zhanqu -沾染zhanran -战胜zhansheng -战时zhanshi -战事zhanshi -战士zhanshi -展示zhanshi -战术zhanshu -展望zhanwang -战线zhanxian -展现zhanxian -展销zhanxiao -崭新zhanxin -瞻仰zhanyang -战役zhanyi -占用zhanyong -占有zhanyou -战友zhanyou -站长zhanzhang -战争zhanzheng -着*zhao -照zhao -找zhao -招zhao -朝*zhao -召zhao -赵zhao -爪zhao -罩zhao -沼zhao -兆zhao -嘲*zhao -昭zhao -肇zhao -诏zhao -啁*zhao -棹zhao -钊zhao -笊zhao -照办zhaoban -照搬zhaoban -招标zhaobiao -照常zhaochang -照抄zhaochao -招待zhaodai -照发zhaofa -招工zhaogong -照顾zhaogu -招呼zhaohu -召唤zhaohuan -照会zhaohui -着急zhaoji -招集zhaoji -召集zhaoji -招架zhaojia -召开zhaokai -招考zhaokao -招揽zhaolan -着力zhaoli -照例zhaoli -照料zhaoliao -着落zhaoluo -着迷zhaomi -照明zhaoming -招聘zhaopin -朝气zhaoqi -招惹zhaore -照射zhaoshe -招生zhaosheng -着手zhaoshou -招手zhaoshou -招收zhaoshou -招贴zhaotie -朝夕zhaoxi -朝霞zhaoxia -着想zhaoxiang -照相zhaoxiang -昭雪zhaoxue -找寻zhaoxun -着眼zhaoyan -照样zhaoyang -照耀zhaoyao -照应zhaoying -招展zhaozhan -招致zhaozhi -着重zhaozhong -照着zhaozhuo -诈骗zhapian -榨取zhaqu -诈取zhaqu -扎实zhashi -炸药zhayao -渣滓zhazi -这zhe -着zhe -者zhe -折zhe -哲zhe -浙zhe -遮zhe -蛰zhe -辙zhe -锗zhe -蔗zhe -谪zhe -摺zhe -柘zhe -辄zhe -磔zhe -鹧zhe -褶zhe -蜇zhe -赭zhe -这般zheban -这边zhebian -这次zheci -遮挡zhedang -这点zhedian -折叠zhedie -折服zhefu -遮盖zhegai -这个zhege -折合zhehe -浙江zhejiang -折旧zhejiu -折扣zhekou -这里zheli -哲理zheli -这么zheme -折磨zhemo -真zhen -针zhen -阵zhen -镇zhen -振zhen -震zhen -珍zhen -诊zhen -斟zhen -甄zhen -砧zhen -臻zhen -贞zhen -侦zhen -枕zhen -疹zhen -圳zhen -蓁zhen -浈zhen -溱*zhen -缜zhen -桢zhen -椹*zhen -榛zhen -轸zhen -赈zhen -胗zhen -朕zhen -祯zhen -畛zhen -稹zhen -鸩zhen -箴zhen -珍爱zhenai -珍宝zhenbao -针砭zhenbian -珍藏zhencang -贞操zhencao -侦察zhencha -真诚zhencheng -震荡zhendang -阵地zhendi -真谛zhendi -震动zhendong -诊断zhenduan -针对zhendui -振奋zhenfen -争zheng -正zheng -政zheng -整zheng -证zheng -征zheng -蒸zheng -症zheng -丁*zheng -郑zheng -挣zheng -睁zheng -狰zheng -怔zheng -拯zheng -帧zheng -诤zheng -峥zheng -徵zheng -钲zheng -铮zheng -筝zheng -争霸zhengba -整备zhengbei -正比zhengbi -政变zhengbian -争辩zhengbian -整编zhengbian -征兵zhengbing -政策zhengce -正常zhengchang -争吵zhengchao -征程zhengcheng -争持zhengchi -正大zhengda -正当zhengdang -政党zhengdang -整党zhengdang -正道zhengdao -争端zhengduan -整顿zhengdun -争夺zhengduo -蒸发zhengfa -政法zhengfa -正反zhengfan -整风zhengfeng -政府zhengfu -征服zhengfu -整改zhenggai -整个zhengge -征购zhenggou -争光zhengguang -正规zhenggui -正轨zhenggui -正好zhenghao -政绩zhengji -征集zhengji -证件zhengjian -政见zhengjian -整洁zhengjie -政局zhengju -证据zhengju -正理zhengli -整理zhengli -正梁zhengliang -政令zhengling -争论zhenglun -政论zhenglun -正面zhengmian -争鸣zhengming -证明zhengming -正派zhengpai -征聘zhengpin -争气zhengqi -正气zhengqi -蒸气zhengqi -整齐zhengqi -正巧zhengqiao -征求zhengqiu -争取zhengqu -政权zhengquan -正确zhengque -证人zhengren -正是zhengshi -正式zhengshi -正视zhengshi -证实zhengshi -征收zhengshou -整数zhengshu -证书zhengshu -征税zhengshui -整套zhengtao -正题zhengti -政体zhengti -整体zhengti -整天zhengtian -征调zhengtiao -正统zhengtong -征途zhengtu -珍贵zhengui -政委zhengwei -正文zhengwen -征文zhengwen -政务zhengwu -争先zhengxian -政协zhengxie -整形zhengxing -整修zhengxiu -征询zhengxun -争艳zhengyan -正业zhengye -正义zhengyi -争议zhengyi -征用zhengyong -正月zhengyue -正在zhengzai -挣扎zhengzha -整整zhengzheng -正直zhengzhi -政治zhengzhi -争执zhengzhi -正中zhengzhong -郑重zhengzhong -郑州zhengzhou -症状zhengzhuang -正宗zhengzong -震撼zhenhan -侦缉zhenji -真假zhenjia -阵脚zhenjiao -贞节zhenjie -贞洁zhenjie -镇静zhenjing -震惊zhenjing -真空zhenkong -真理zhenli -诊疗zhenliao -珍品zhenpin -珍奇zhenqi -真切zhenqie -真情zhenqing -真确zhenque -真人zhenren -阵容zhenrong -真是zhenshi -真实zhenshi -阵势zhenshi -珍视zhenshi -侦探zhentan -阵亡zhenwang -珍惜zhenxi -阵线zhenxian -真相zhenxiang -振兴zhenxing -镇压zhenya -阵阵zhenzhen -真正zhenzheng -真知zhenzhi -真挚zhenzhi -珍重zhenzhong -珍珠zhenzhu -斟酌zhenzhuo -振作zhenzuo -这是zheshi -这时zheshi -折腾zheteng -这些zhexie -哲学zhexue -遮掩zheyan -这样zheyang -这种zhezhong -折中zhezhong -之zhi -制zhi -治zhi -只zhi -质zhi -指zhi -直zhi -支zhi -织zhi -止zhi -至zhi -置zhi -志zhi -值zhi -知zhi -识*zhi -执zhi -职zhi -植zhi -纸zhi -致zhi -枝zhi -殖zhi -脂zhi -智zhi -氏*zhi -肢zhi -秩zhi -址zhi -滞zhi -汁zhi -芝zhi -吱zhi -蜘zhi -侄zhi -趾zhi -旨zhi -挚zhi -掷zhi -帜zhi -峙zhi -稚zhi -炙zhi -痔zhi -窒zhi -卮zhi -陟zhi -郅zhi -埴zhi -芷zhi -摭zhi -帙zhi -徵*zhi -忮zhi -彘zhi -咫zhi -骘zhi -栉zhi -枳zhi -栀zhi -桎zhi -轵zhi -轾zhi -贽zhi -胝zhi -膣zhi -祉zhi -祗zhi -黹zhi -雉zhi -鸷zhi -痣zhi -蛭zhi -絷zhi -酯zhi -跖zhi -踬zhi -踯zhi -豸zhi -觯zhi -治安zhian -值班zhiban -植保zhibao -置备zhibei -质变zhibian -指标zhibiao -职别zhibie -支部zhibu -制裁zhicai -支撑zhicheng -职称zhicheng -支持zhichi -指出zhichu -支出zhichu -至此zhici -值此zhici -直达zhida -只当zhidang -直到zhidao -指导zhidao -知道zhidao -只得zhide -值得zhide -质地zhidi -指点zhidian -制定zhiding -指定zhiding -制订zhiding -制度zhidu -支队zhidui -至多zhiduo -知法zhifa -执法zhifa -制服zhifu -支付zhifu -职工zhigong -只顾zhigu -只管zhiguan -直观zhiguan -治国zhiguo -只好zhihao -之后zhihou -指挥zhihui -智慧zhihui -知己zhiji -指甲zhijia -之间zhijian -只见zhijian -指教zhijiao -直接zhijie -枝节zhijie -至今zhijin -直经zhijing -直径zhijing -止境zhijing -致敬zhijing -知觉zhijue -治理zhili -致力zhili -智力zhili -质量zhiliang -治疗zhiliao -指令zhiling -直流zhiliu -支流zhiliu -殖民zhimin -致命zhiming -指明zhiming -知名zhiming -智谋zhimou -指南zhinan -智囊zhinang -之内zhinei -只能zhineng -职能zhineng -智能zhineng -只怕zhipa -指派zhipai -支配zhipei -支票zhipiao -制品zhipin -志气zhiqi -之前zhiqian -支前zhiqian -值勤zhiqin -执勤zhiqin -知情zhiqing -知青zhiqing -智取zhiqu -志趣zhiqu -知趣zhiqu -职权zhiquan -值日zhiri -治丧zhisang -之上zhishang -直上zhishang -至上zhishang -至少zhishao -制胜zhisheng -之声zhisheng -只是zhishi -指使zhishi -支使zhishi -致使zhishi -知事zhishi -指示zhishi -知识zhishi -指数zhishu -支书zhishu -直属zhishu -植树zhishu -直爽zhishuang -治水zhishui -直说zhishuo -致死zhisi -之外zhiwai -指望zhiwang -职位zhiwei -质问zhiwen -植物zhiwu -职务zhiwu -窒息zhixi -之下zhixia -直线zhixian -指向zhixiang -志向zhixiang -知心zhixin -执行zhixing -只许zhixu -秩序zhixu -直言zhiyan -只要zhiyao -职业zhiye -致意zhiyi -旨意zhiyi -质疑zhiyi -指引zhiyin -知音zhiyin -只有zhiyou -至于zhiyu -置于zhiyu -智育zhiyu -职员zhiyuan -支援zhiyuan -志愿zhiyuan -制约zhiyue -制造zhizao -指责zhize -职责zhize -纸张zhizhang -职掌zhizhang -执照zhizhao -指正zhizheng -执政zhizheng -制止zhizhi -直至zhizhi -之中zhizhong -支助zhizhu -支柱zhizhu -知足zhizu -制作zhizuo -走后门zhm -中华民国zhmg -中华民族zhmz -中zhong -种zhong -重zhong -众zhong -钟zhong -终zhong -忠zhong -肿zhong -仲zhong -盅zhong -衷zhong -冢zhong -忪*zhong -锺zhong -螽zhong -舯zhong -踵zhong -钟爱zhongai -重办zhongban -重兵zhongbing -中部zhongbu -仲裁zhongcai -中层zhongceng -衷肠zhongchang -忠诚zhongcheng -重大zhongda -重担zhongdan -中等zhongdeng -种地zhongdi -重地zhongdi -重点zhongdian -终点zhongdian -中东zhongdong -中断zhongduan -终端zhongduan -中队zhongdui -众多zhongduo -重犯zhongfan -忠告zhonggao -中共zhonggong -中国zhongguo -忠厚zhonghou -中华zhonghua -中级zhongji -终极zhongji -重价zhongjia -中间zhongjian -中坚zhongjian -中奖zhongjiang -终结zhongjie -终究zhongjiu -终久zhongjiu -终局zhongju -中肯zhongken -种类zhonglei -中立zhongli -重量zhongliang -终了zhongliao -中流zhongliu -肿瘤zhongliu -中美zhongmei -众目zhongmu -中年zhongnian -终年zhongnian -中秋zhongqiu -重任zhongren -中日zhongri -终日zhongri -中伤zhongshang -重赏zhongshang -终身zhongshen -终生zhongsheng -重视zhongshi -忠实zhongshi -中枢zhongshu -众说zhongshuo -中苏zhongsu -终天zhongtian -中途zhongtu -重托zhongtuo -中外zhongwai -重围zhongwei -中文zhongwen -中午zhongwu -中西zhongxi -中心zhongxin -忠心zhongxin -衷心zhongxin -中性zhongxing -中学zhongxue -中旬zhongxun -忠言zhongyan -中央zhongyang -中药zhongyao -重要zhongyao -中医zhongyi -重用zhongyong -中庸zhongyong -中游zhongyou -终于zhongyu -忠于zhongyu -忠贞zhongzhen -中止zhongzhi -种植zhongzhi -终止zhongzhi -种种zhongzhong -中专zhongzhuan -种族zhongzu -轴zhou -周zhou -洲zhou -州zhou -皱zhou -骤zhou -舟zhou -诌zhou -粥zhou -肘zhou -帚zhou -咒zhou -宙zhou -昼zhou -荮zhou -啁zhou -妯zhou -纣zhou -绉zhou -胄zhou -碡zhou -籀zhou -繇*zhou -酎zhou -周到zhoudao -咒骂zhouma -周密zhoumi -周末zhoumo -周期zhouqi -周全zhouquan -周围zhouwei -周旋zhouxuan -昼夜zhouye -周折zhouzhe -周知zhouzhi -周转zhouzhuan -总后勤部zhqb -中华人民共和国zhrg -主zhu -注zhu -著zhu -住zhu -助zhu -猪zhu -铸zhu -属*zhu -株zhu -筑zhu -柱zhu -术*zhu -驻zhu -逐zhu -祝zhu -竹zhu -贮zhu -珠zhu -朱zhu -诸zhu -蛛zhu -诛zhu -烛zhu -煮zhu -拄zhu -瞩zhu -嘱zhu -蛀zhu -伫zhu -侏zhu -邾zhu -茱zhu -洙zhu -渚zhu -潴zhu -杼zhu -槠zhu -橥zhu -炷zhu -铢zhu -疰zhu -瘃zhu -褚*zhu -竺zhu -箸zhu -舳zhu -翥zhu -躅zhu -麈zhu -抓zhua -挝*zhua -抓好zhuahao -转*zhuai -曳*zhuai -拽zhuai -抓紧zhuajin -转zhuan -专zhuan -传*zhuan -砖zhuan -撰zhuan -赚zhuan -篆zhuan -啭zhuan -馔zhuan -沌*zhuan -颛zhuan -转变zhuanbian -转播zhuanbo -专长zhuanchang -专程zhuancheng -转达zhuanda -转发zhuanfa -装zhuang -状zhuang -壮zhuang -庄zhuang -撞zhuang -幢*zhuang -桩zhuang -妆zhuang -僮zhuang -奘*zhuang -转告zhuangao -装扮zhuangban -装备zhuangbei -壮大zhuangda -装订zhuangding -壮观zhuangguan -装甲zhuangjia -庄稼zhuangjia -庄嫁zhuangjia -壮举zhuangju -状况zhuangkuang -壮阔zhuangkuo -壮丽zhuangli -壮烈zhuanglie -装配zhuangpei -装饰zhuangshi -状态zhuangtai -装卸zhuangxie -庄严zhuangyan -庄园zhuangyuan -装运zhuangyun -装置zhuangzhi -壮志zhuangzhi -庄重zhuangzhong -转化zhuanhua -转换zhuanhuan -转给zhuanji -专家zhuanjia -专科zhuanke -专利zhuanli -专门zhuanmen -转让zhuanrang -专题zhuanti -转向zhuanxiang -专心zhuanxin -转眼zhuanyan -专业zhuanye -转移zhuanyi -专员zhuanyuan -转载zhuanzai -转折zhuanzhe -转正zhuanzheng -专政zhuanzheng -专制zhuanzhi -专职zhuanzhi -专注zhuanzhu -专著zhuanzhu -主办zhuban -逐步zhubu -贮藏zhucang -注册zhuce -助长zhuchang -主持zhuchi -主次zhuci -主导zhudao -注定zhuding -主动zhudong -主队zhudui -主犯zhufan -住房zhufang -祝福zhufu -嘱咐zhufu -逐个zhuge -主攻zhugong -助工zhugong -主管zhuguan -主观zhuguan -追zhui -锥zhui -椎zhui -赘zhui -坠zhui -缀zhui -惴zhui -骓zhui -缒zhui -追捕zhuibu -追查zhuicha -追悼zhuidao -追赶zhuigan -坠毁zhuihui -追加zhuijia -追究zhuijiu -追求zhuiqiu -追认zhuiren -追溯zhuisu -追随zhuisui -追问zhuiwen -追逐zhuizhu -追踪zhuizong -主机zhuji -主见zhujian -逐渐zhujian -主将zhujiang -主讲zhujiang -主教zhujiao -主角zhujiao -注解zhujie -祝酒zhujiu -主力zhuli -助理zhuli -株连zhulian -主粮zhuliang -主流zhuliu -驻留zhuliu -著名zhuming -主谋zhumou -注目zhumu -瞩目zhumu -准zhun -屯*zhun -谆zhun -肫zhun -窀zhun -准备zhunbei -逐年zhunian -准确zhunque -准绳zhunsheng -准时zhunshi -准许zhunxu -准则zhunze -着*zhuo -著*zhuo -捉zhuo -桌zhuo -缴*zhuo -拙zhuo -卓zhuo -琢zhuo -茁zhuo -酌zhuo -啄zhuo -灼zhuo -浊zhuo -倬zhuo -诼zhuo -擢zhuo -浞zhuo -涿zhuo -濯zhuo -棹*zhuo -焯zhuo -禚zhuo -斫zhuo -镯zhuo -拙劣zhuolie -琢磨zhuomo -捉弄zhuonong -酌情zhuoqing -卓越zhuoyue -茁壮zhuozhuang -主权zhuquan -主人zhuren -主任zhuren -诸如zhuru -注色zhuse -注视zhushi -柱石zhushi -注释zhushi -助手zhushou -主送zhusong -住宿zhusu -珠算zhusuan -主题zhuti -主体zhuti -逐条zhutiao -嘱托zhutuo -诸位zhuwei -主席zhuxi -注销zhuxiao -主要zhuyao -逐一zhuyi -主义zhuyi -主意zhuyi -注意zhuyi -祝愿zhuyuan -逐月zhuyue -主宰zhuzai -铸造zhuzao -驻扎zhuzha -住宅zhuzhai -主张zhuzhang -住址zhuzhi -注重zhuzhong -著作zhuzuo -子zi -自zi -资zi -字zi -紫zi -仔zi -籽zi -姿zi -吱*zi -兹zi -咨zi -滋zi -淄zi -孜zi -滓zi -渍zi -谘zi -茈*zi -呲*zi -嵫zi -姊zi -孳zi -缁zi -梓zi -辎zi -赀zi -恣zi -眦zi -锱zi -秭zi -耔zi -笫zi -粢zi -趑zi -觜zi -訾zi -龇zi -鲻zi -髭zi -自爱ziai -自白zibai -自卑zibei -资本ziben -资产zichan -滋长zichang -自称zicheng -自传zichuan -自从zicong -子弟zidi -字典zidian -自动zidong -自发zifa -自费zifei -自封zifeng -自负zifu -字符zifu -资格zige -字根zigen -自豪zihao -自给ziji -自己ziji -字迹ziji -字节zijie -资金zijin -自救zijiu -自居ziju -自觉zijue -字库ziku -自夸zikua -自理zili -资历zili -资料ziliao -自满ziman -自勉zimian -字母zimu -字幕zimu -子女zinu -自强ziqiang -自然ziran -滋润zirun -自杀zisha -自身zishen -姿势zishi -自述zishu -自私zisi -姿态zitai -字体ziti -字帖zitie -自卫ziwei -滋味ziwei -自问ziwen -自我ziwo -仔细zixi -自信zixin -自修zixiu -自叙zixu -自选zixuan -自学zixue -咨询zixun -滋养ziyang -自由ziyou -自愿ziyuan -资源ziyuan -自找zizhao -自治zizhi -自重zizhong -资助zizhu -自尊zizun -直截了当zjld -浙江省zjs -这就是说zjss -中纪委zjw -再接再厉zjzl -中联部zlb -专利法zlf -质量管理zlgl -自力更生zlgs -展览会zlh -智力开发zlkf -专利权zlq -知名人士zmrs -这么些zmx -这么样zmy -怎么样zmy -总zong -纵zong -宗zong -综zong -棕zong -鬃zong -踪zong -偬zong -枞zong -腙zong -粽zong -总部zongbu -总裁zongcai -总参zongcan -总队zongdui -总额zonge -总纲zonggang -总共zonggong -纵贯zongguan -总和zonghe -综合zonghe -纵横zongheng -总后zonghou -总计zongji -踪迹zongji -宗教zongjiao -总结zongjie -总局zongju -总括zongkuo -总理zongli -总论zonglun -宗派zongpai -纵情zongqing -纵深zongshen -总是zongshi -纵使zongshi -总数zongshu -总算zongsuan -总体zongti -总统zongtong -总务zongwu -踪影zongying -总帐zongzhang -总政zongzheng -总之zongzhi -宗旨zongzhi -走zou -邹zou -奏zou -揍zou -诹zou -陬zou -鄹zou -驺zou -鲰zou -走访zoufang -邹虹zouhong -走私zousi -奏效zouxiao -酌情处理zqcl -中青年zqn -朝气蓬勃zqpb -准确无误zqww -正确性zqx -诸如此类zrcl -责任感zrg -自然界zrj -主人翁zrw -责任心zrx -责任制zrz -再生产zsc -自上而下zsex -知识分子zsfz -这时候zsh -知识化zsh -株式会社zshs -总书记zsj -装饰品zsp -综上所述zsss -之所以zsy -自始至终zszz -众所周知zszz -座谈会zth -组zu -族zu -足zu -阻zu -祖zu -租zu -卒zu -诅zu -俎zu -菹zu -镞zu -阻碍zuai -钻zuan -赚*zuan -纂zuan -攥zuan -缵zuan -躜zuan -钻研zuanyan -组成zucheng -阻挡zudang -组阁zuge -足够zugou -祖国zuguo -组合zuhe -最zui -罪zui -嘴zui -堆*zui -咀*zui -醉zui -蕞zui -最初zuichu -最大zuida -最低zuidi -罪恶zuie -罪犯zuifan -最高zuigao -罪过zuiguo -最好zuihao -最后zuihou -最坏zuihuai -最佳zuijia -最近zuijin -嘴脸zuilian -罪名zuiming -罪孽zuinie -罪人zuiren -最先zuixian -最小zuixiao -最新zuixin -醉心zuixin -罪行zuixing -罪责zuize -罪证zuizheng -最终zuizhong -罪状zuizhuang -阻击zuji -租界zujie -租借zujie -阻拦zulan -阻力zuli -租赁zulin -尊zun -遵zun -撙zun -樽zun -鳟zun -阻挠zunao -遵从zuncong -尊贵zungui -尊敬zunjing -遵守zunshou -遵循zunxun -尊严zunyan -遵照zunzhao -尊重zunzhong -作zuo -做zuo -左zuo -座zuo -坐zuo -昨zuo -撮*zuo -凿*zuo -搓*zuo -琢*zuo -佐zuo -柞zuo -阼zuo -唑zuo -嘬zuo -怍zuo -胙zuo -祚zuo -笮*zuo -作案zuoan -作弊zuobi -左边zuobian -坐标zuobiao -做到zuodao -作法zuofa -做法zuofa -作废zuofei -作风zuofeng -做工zuogong -作怪zuoguai -做好zuohao -作家zuojia -作客zuoke -作乐zuole -作乱zuoluan -坐落zuoluo -左派zuopai -作品zuopin -左倾zuoqing -做人zuoren -昨日zuori -做事zuoshi -坐视zuoshi -座谈zuotan -昨天zuotian -昨晚zuowan -作为zuowei -座位zuowei -坐位zuowei -作文zuowen -作物zuowu -作业zuoye -昨夜zuoye -作用zuoyong -左右zuoyou -作战zuozhan -作者zuozhe -作证zuozheng -作主zuozhu -做主zuozhu -做作zuozuo -足球zuqiu -阻塞zuse -祖师zushi -祖先zuxian -组长zuzhang -组织zuzhi -阻止zuzhi -祖宗zuzong -中外合资zwhz -责无旁贷zwpd -中宣部zxb -自行车zxc -自下而上zxes -忠心耿耿zxgg -展销会zxh -照相机zxj -争先恐后zxkh -中学生zxs -主席团zxt -中小学zxx -自信心zxx -中央办公厅zybt -着眼点zyd -专业对口zydk -中央电视台zydt -中央各部委zygw -专业化zyh -专业户zyh -中央军委zyjw -座右铭zym -中央全会zyqh -中央人民广播电台zyrt -主要人员zyry -专业人员zyry -中央书记处zysc -中央委员会zywh -中央委员zywy -重要性zyx -主要原因zyyy -中央政治局zyzj -专业知识zyzs -中组部zzb -组织部zzb -政治部zzb -政治处zzc -转折点zzd -置之度外zzdw -政治局zzj -自治区zzq -蒸蒸日上zzrs -组织上zzs -郑州市zzs -组织性zzx -自尊心zzx -赵紫阳zzy -总政治部zzzb -喷码pm -优喷yp -科技kj -比洋by -公司gs -有限公司yxgz -股份公司gfgs -企业qy -标准bz -喷码机pmj -电线dx -电缆dl -电线电缆dxdl -电力电缆dldl -绝缘jy -绝缘层jyc -导体dt -导线dx -电力dl -通信tx -控制电缆kzdl -补偿电缆bcdl -屏蔽电缆pbdl -高温电缆gwdl -计算机电缆jsjdl -信号电缆xhdl -同轴电缆tzdl -耐火电缆nhdl -船用电缆cydl -铝合金电缆lhjdl -单股dg -多股dg -连接lj -电路dl -电器dq -型号xh -铜t -铝l -铅包qb -铝包qb -聚氯乙烯jlyx -电磁线dcx -北京市bj -东城区dcq -西城区xcq -崇文区cwq -宣武区xwq -朝阳区zyq -海淀区hdq -丰台区ftq -房山区fsq -通州区tzq -顺义区syq -昌平区cpq -大兴区txq -怀柔区hrq -平谷区pgq -门头沟区mtgq -石景山区sjsq -天津市tjs -和平区hpq -河东区hdq -河西区hxq -南开区nkq -河北区hbq -红桥区hqq -塘沽区tgq -汉沽区hgq -大港区tgq -东丽区dlq -西青区xqq -北辰区bcq -津南区jnq -武清区wqq -宝坻区bdq -河北省hbs -辛集市xjs -藁城市gcs -晋州市jzs -新乐市xls -鹿泉市lqs -唐山市tss -遵化市zhs -安市as -邯郸市hds -武安市was -邢台市xts -南宫市ngs -沙河市shs -保定市bds -涿州市zzs -定州市dzs -安国市ags -承德市cds -沧州市czs -泊头市bts -任丘市rqs -黄骅市hhs -河间市hjs -廊坊市lfs -霸州市bzs -三河市shs -衡水市hss -冀州市jzs -深州市szs -石家庄市sjzs -张家口市zjks -高碑店市gbds -秦皇岛市qhds -山西省sxs -太原市tys -古交市gjs -大同市dts -阳泉市yqs -长治市czs -潞城市lcs -晋城市jcs -高平市gps -朔州市szs -晋中市jzs -介休市jxs -运城市ycs -河津市hjs -永济市sjs -忻州市xzs -原平市yps -临汾市lfs -侯马市hms -霍州市hzs -吕梁市lls -孝义市xys -汾阳市fys -内蒙古自治区nmg -包头市bts -乌海市whs -赤峰市cfs -通辽市tls -根河市ghs -丰镇市fzs -辽宁省LNS -沈阳市sys -新民市xms -大连市dls -庄河市zhs -鞍山市ass -海城市hcs -抚顺市fss -本溪市bxs -丹东市dds -东港市dgs -凤城市fcs -锦州市jzs -凌海市lhs -北宁市bns -营口市yks -盖州市gzs -阜新市fxs -辽阳市lys -灯塔市dts -盘锦市pjs -铁岭市tls -开原市kys -朝阳市zys -凌源市lys -北票市bps -兴城市xcs -大石桥市dsqs -瓦房店市wfds -普兰店市plds -调兵山市dbss -葫芦岛市hlds -吉林省jls -长春市ccs -九台市jts -榆树市yss -德惠市dhs -吉林市jls -舒兰市sls -桦甸市hds -蛟河市jhs -磐石市pss -四平市sps -双辽市sls -辽源市lys -通化市ths -集安市jas -白山市bss -临江市ljs -松原市sys -白城市bcs -大安市das -洮南市tns -延吉市yjs -图们市tms -敦化市ghs -龙井市ljs -珲春市hcs -和龙市hls -公主岭市gzls -梅河口市mhks -黑龙江省hljs -阿城市acs -尚志市szs -双城市scs -五常市wcs -讷河市nhs -鹤岗市hgs -鸡西市jxs -密山市mss -虎林市hls -大庆市dqs -伊春市ycs -铁力市tls -宁安市nas -海林市hls -穆棱市mls -同江市tjs -富锦市fjs -黑河市hhs -北安市bas -绥化市shs -安达市ads -肇东市zds -海伦市hls -七台河市qths -双鸭山市syss -牡丹江市mdjs -佳木斯市jmss -绥芬河市sfhs -哈尔滨市hebs -齐齐哈尔市qqhes -五大连池市wdlcs -上海市shs -黄浦区hpq -卢湾区lwq -徐汇区xhq -长宁区cnq -静安区jaq -普陀区ptq -闸北区zbq -虹口区hkq -杨浦区ypq -宝山区bsq -闵行区mxq -嘉定区jdq -松江区sjq -金山区jsq -青浦区qpq -南汇区nhq -奉贤区fxq -崇明县浦东新区cmxpdxq -江苏省jss -南京市njs -无锡市wxs -江阴市jys -宜兴市yxs -徐州市xzs -邳州市pzs -新沂市xys -常州市czs -金坛市jts -溧阳市lys -苏州市szs -常熟市css -太仓市dcs -昆山市hss -吴江市wjs -南通市nns -如皋市rgs -通州市tzs -海门市hms -启东市qds -淮安市has -盐城市ycs -东台市dts -大丰市dfs -扬州市yzs -高邮市gys -江都市jds -仪征市yzs -镇江市zjs -丹阳市dys -扬中市yzs -句容市jrs -泰州市dzs -泰兴市dxs -姜堰市jys -靖江市jjs -兴化市xhs -宿迁市sqs -连云港市lygs -张家港市zjgs -浙江省zjs -杭州市hzs -建德市jds -富阳市fys -临安市las -宁波市nbx -余姚市yys -慈溪市cxs -奉化市fhs -温州市wzs -瑞安市ras -乐清市lqs -嘉兴市jxs -海宁市hns -平湖市phs -桐乡市txs -湖州市hzs -绍兴市sxs -诸暨市zjs -上虞市sys -嵊州市szs -金华市jhs -兰溪市lxs -义乌市yws -东阳市dys -永康市yks -衢州市qzs -江山市jss -舟山市zss -台州市tzs -临海市lhs -丽水市lss -龙泉市lqs -安徽省ahs -合肥市hfs -芜湖市whs -蚌埠市bbs -淮南市hns -淮北市hbs -铜陵市tls -安庆市aqs -桐城市tcs -黄山市hss -滁州市czs -天长市dcs -明光市mgs -阜阳市fys -界首市jss -宿州市szs -巢湖市chs -六安市las -亳州市hzs -池州市czs -宣城市ycs -宁国市ngs -马鞍山市mass -福建省fjs -福州市fjs -福清市fqs -长乐市cls -厦门市xms -莆田市pts -三明市sms -永安市yas -泉州市qzs -石狮市sss -晋江市jjs -南安市nas -漳州市zzs -龙海市lhs -南平市nps -建瓯市jos -邵武市sws -建阳市jys -龙岩市lys -漳平市zps -宁德市nds -福安市fas -福鼎市fds -武夷山市wyss -江西省jxs -南昌市ncs -乐平市lps -萍乡市pxs -九江市jjs -瑞昌市rcs -新余市xys -鹰潭市yts -贵溪市gxs -赣州市gzs -瑞金市rjs -南康市nks -吉安市jas -宜春市ycs -丰城市fcs -樟树市zss -高安市gas -抚州市fzs -上饶市srs -德兴市dxs -井冈山市jgss -景德镇市jdzs -山东省sds -济南市jns -章丘市zqs -青岛市qds -胶南市jns -胶州市jzs -平度市pds -莱西市lxs -即墨市jms -淄博市zbs -枣庄市zzs -滕州市tzs -烟台市yts -龙口市lks -莱阳市lys -莱州市lzs -招远市zys -蓬莱市pls -栖霞市qxs -海阳市hys -潍坊市wfs -青州市qzs -诸城市zcs -寿光市sgs -安丘市aqs -高密市gms -昌邑市cys -济宁市jns -曲阜市qfs -兖州市yzs -邹城市zcs -泰安市tas -新泰市xts -肥城市fcs -威海市whs -乳山市rss -文登市wds -荣成市rcs -日照市rzs -莱芜市lws -临沂市lys -德州市dzs -乐陵市lls -禹城市ycs -聊城市lcs -临清市lqs -滨州市bzs -菏泽市hzs -河南省hns -郑州市zzs -巩义市gys -新郑市xzs -新密市xms -登封市dfs -荥阳市xys -开封市kfs -洛阳市lys -偃师市yss -汝州市rzs -舞钢市wgs -安阳市ays -林州市lzs -新乡市xxs -卫辉市whs -辉县市hxs -焦作市jzs -沁阳市qys -孟州市mzs -濮阳市pys -许昌市xcs -禹州市yzs -长葛市cgs -漯河市lhs -义马市yms -灵宝市lbs -南阳市nys -邓州市dzs -商丘市sqs -永城市ycs -信阳市xys -周口市zks -项城市dcs -济源市jys -三门峡市smxs -平顶山市pdss -驻马店市zmds -湖北省hbs -武汉市whs -黄石市hss -大冶市dys -十堰市sys -荆州市jzs -洪湖市hhs -石首市sss -松滋市szs -宜昌市ycs -宜都市yds -当阳市dys -枝江市jjs -襄樊市xfs -枣阳市zys -宜城市ycs -鄂州市ezs -荆门市jms -钟祥市zxs -孝感市xgs -应城市ycs -安陆市als -汉川市hcs -黄冈市hgs -麻城市mcs -武穴市wxs -咸宁市xns -赤壁市cbs -随州市szs -广水市gss -仙桃市xts -天门市tms -潜江市qjs -恩施市ess -利川市lcs -丹江口市djks -老河口市lhks -神农架林区snjlq -湖南省hns -长沙市css -浏阳市lys -株洲市zzs -醴陵市lls -湘潭市xts -湘乡市xxs -韶山市sss -衡阳市hys -耒阳市lys -常宁市cns -邵阳市sys -武冈市wgs -岳阳市yys -临湘市lxs -汨罗市mls -常德市cds -津市市jss -益阳市yys -沅江市yjs -郴州市czs -资兴市zxs -永州市yzs -怀化市hhs -洪江市hjs -娄底市lds -涟源市lys -吉首市jss -冷水江市lsjs -张家界市zjjs -广东省gds -广州市gzs -从化市chs -增城市zcs -深圳市szs -珠海市zhs -汕头市sts -韶关市sgs -乐昌市lcs -南雄市nxs -佛山市fss -江门市jms -台山市tss -开平市kps -鹤山市hss -恩平市eps -湛江市zjs -廉江市ljs -雷州市lzs -吴川市wcs -茂名市mms -西昌市xcs -峨眉山市emss -都江堰市djys -攀枝花市pzhs -贵州省gzs -贵阳市gys -清镇市qzs -遵义市zys -赤水市css -仁怀市rhs -安顺市ass -毕节市bjs -兴义市xys -凯里市kls -都匀市dys -福泉市fqs -六盘水市lpss -六枝特区lztq -万山特区wstq -云南省yns -昆明市kms -安宁市ans -曲靖市qjs -宣威市xws -玉溪市yxs -保山市bss -昭通市zts -丽江市ljs -思茅市sms -临沧市lqs -个旧市gjs -开远市kys -景洪市jhs -楚雄市cxs -大理市dls -潞西市lxs -瑞丽市rls -西藏自治区xzzzq -拉萨市lss -陕西省sxs -西安市xas -铜川市tcs -宝鸡市bjs -咸阳市xys -渭南市wns -韩城市hcs -华阴市hys -延安市yas -汉中市azs -榆林市yls -安康市aks -商洛市sls -甘肃省gss -兰州市lzs -金昌市jcs -白银市bys -天水市tss -武威市wws -张掖市zys -平凉市pls -酒泉市jqs -玉门市yms -敦煌市dhs -庆阳市qys -定西市dxs -陇南市lns -临夏市lxs -合作市hzs -嘉峪关市jygs -青海省qhs -西宁市xns -德令哈市dlhs -格尔木市gems -宁夏回族自治区nxhzzzq -银川市ycs -灵武市lws -吴忠市wzs -固原市gys -中卫市zws -石嘴山市szss -青铜峡市qtxs -新疆维吾尔自治区xjwwezzq -喀什市kss -昌吉市cjs -阜康市fks -米泉市mqs -博乐市bls -伊宁市yns -奎屯市kts -塔城市tcs -乌苏市wss -石河子市shzs -阿拉尔市ales -五家渠市wjqs -吐鲁番市tlfs -阿克苏市akss -阿图什市atss -库尔勒市kels -阿勒泰市alts -乌鲁木齐市wlmqs -克拉玛依市klmys -图木舒克市tmsks -香港特别行政区 -中西区zxq -东区dq -观塘区gtq -南区nq -湾仔区wzq -离岛区ldq -葵青区kqq -北区bq -西贡区xgq -沙田区stq -屯门区tmq -大埔区dpq -荃湾区qwq -元朗区ylq -九龙城区jtcq -油尖旺区yjwq -深水埗区ssbq -黄大仙区hdxq -台湾省tws -台北市tbs -高雄市gxs -基隆市jls -台中市tzs -台南市tns -新竹市xzs -嘉义市jys -板桥市bqs -宜兰市yls -竹北市zbs -桃园市tys -苗栗市mls -丰原市fys -彰化市zhs -南投市nts -太保市tbs -斗六市dls -新营市xys -凤山市fss -屏东市pds -台东市tds -花莲市hls -马公市mgs +安a +按a +爱a +阿a +暗a +啊a +埃a +碍a +凹a +奥a +岸a +矮a +案a +俺a +挨a +唉a +昂a +氨a +胺a +哎a +吖a +嗄a +腌a +锕a +安徽省ahs +爱ai +埃ai +碍ai +矮ai +挨ai +唉ai +哎ai +哀ai +皑ai +癌ai +蔼ai +艾ai +隘ai +呆*ai +捱ai +嗳ai +嗌ai +嫒ai +瑷ai +暧ai +砹ai +锿ai +霭ai +安an +按an +暗an +岸an +案an +俺an +氨an +胺an +鞍an +谙an +埯an +揞an +犴an +庵an +桉an +铵an +鹌an +黯an +昂ang +肮ang +盎ang +安徽anhui +凹ao +奥ao +敖ao +熬ao +翱ao +袄ao +傲ao +懊ao +澳ao +嚣*ao +坳ao +拗ao +嗷ao +岙ao +廒ao +遨ao +媪ao +骜ao +獒ao +聱ao +螯ao +鏊ao +鳌ao +鏖ao +不b +部b +本b +表b +把b +变b +比b +并b +别b +百b +报b +保b +病b +北b +被b +步b +边b +八b +办b +布b +把ba +八ba +吧ba +巴ba +拔ba +霸ba +罢ba +爸ba +坝ba +芭ba +捌ba +扒ba +叭ba +笆ba +疤ba +跋ba +靶ba +耙ba +茇ba +菝ba +岜ba +灞ba +钯ba +粑ba +鲅ba +魃ba +百bai +白bai +败bai +摆bai +伯*bai +柏bai +佰bai +拜bai +稗bai +捭bai +掰bai +办ban +半ban +板ban +班ban +般ban +版ban +拌ban +搬ban +斑ban +扳ban +伴ban +颁ban +扮ban +瓣ban +绊ban +阪ban +坂ban +钣ban +瘢ban +癍ban +舨ban +帮bang +棒bang +邦bang +榜bang +梆bang +膀bang +绑bang +磅bang +蚌bang +镑bang +傍bang +谤bang +蒡bang +浜bang +报bao +保bao +包bao +剥bao +薄bao +胞bao +暴bao +宝bao +饱bao +抱bao +爆bao +炮*bao +堡bao +刨*bao +苞bao +褒bao +雹bao +豹bao +鲍bao +曝*bao +瀑*bao +葆bao +孢bao +煲bao +鸨bao +褓bao +趵bao +龅bao +北bei +被bei +倍bei +备bei +背bei +辈bei +贝bei +杯bei +卑bei +臂*bei +悲bei +碑bei +钡bei +狈bei +惫bei +焙bei +孛bei +陂bei +邶bei +埤bei +萆bei +蓓bei +呗bei +悖bei +碚bei +鹎bei +褙bei +鐾bei +鞴bei +本ben +奔ben +苯ben +笨ben +夯*ben +畚ben +坌ben +贲ben +锛ben +本报benbao +奔波benbo +本部benbu +本厂benchang +奔驰benchi +本地bendi +奔放benfang +泵beng +崩beng +蚌*beng +绷beng +甭beng +蹦beng +迸beng +嘣beng +甏beng +比bi +必bi +避bi +闭bi +辟bi +笔bi +壁bi +臂bi +毕bi +彼bi +逼bi +币bi +鼻bi +蔽bi +秘*bi +鄙bi +碧bi +蓖bi +毙bi +毖bi +庇bi +痹bi +敝bi +弊bi +陛bi +拂*bi +泌*bi +匕bi +俾bi +埤*bi +芘*bi +荜bi +荸bi +萆*bi +薜bi +吡bi +哔bi +狴bi +庳bi +愎bi +滗bi +濞bi +弼bi +妣bi +婢bi +嬖bi +璧bi +贲*bi +睥*bi +畀bi +铋bi +秕bi +裨bi +筚bi +箅bi +篦bi +舭bi +襞bi +跸bi +髀bi +变bian +边bian +便bian +编bian +遍bian +辩bian +扁bian +辨bian +鞭bian +贬bian +卞bian +辫bian +匾bian +弁bian +苄bian +忭bian +汴bian +缏bian +飚bian +煸bian +砭bian +碥bian +窆bian +褊bian +蝙bian +笾bian +鳊bian +表biao +标biao +彪biao +膘biao +勺*biao +婊biao +骠biao +杓biao +飑biao +飙biao +镖biao +镳biao +瘭biao +裱biao +鳔biao +髟biao +别bie +鳖bie +憋bie +瘪bie +蹩bie +宾bin +彬bin +斌bin +濒bin +滨bin +摈bin +傧bin +豳bin +缤bin +玢bin +槟bin +殡bin +膑bin +镔bin +髌bin +鬓bin +并bing +病bing +兵bing +柄bing +冰bing +丙bing +饼bing +秉bing +炳bing +屏*bing +禀bing +邴bing +摒bing +槟*bing +波bo +播bo +剥*bo +伯bo +拨bo +薄*bo +博bo +勃bo +驳bo +玻bo +泊bo +柏*bo +卜*bo +菠bo +钵bo +搏bo +铂bo +箔bo +帛bo +舶bo +脖bo +膊bo +渤bo +魄*bo +孛*bo +亳bo +啵bo +饽bo +檗bo +掰*bo +擘bo +礴bo +钹bo +鹁bo +簸bo +趵*bo +跛bo +踣bo +不bu +部bu +步bu +布bu +补bu +捕bu +埔*bu +卜bu +堡*bu +哺bu +埠bu +簿bu +怖bu +卟bu +逋bu +瓿bu +晡bu +钚bu +钸bu +醭bu +不安buan +不比bubi +不必bubi +不变bubian +不便bubian +步兵bubing +步步bubu +不曾buceng +补偿buchang +不啻buchi +补充buchong +不错bucuo +不大buda +不待budai +不但budan +不当budang +不得bude +不等budeng +步调budiao +不动budong +不断buduan +不对budui +部队budui +不法bufa +补发bufa +步伐bufa +不凡bufan +不妨bufang +不分bufen +部分bufen +不服bufu +不符bufu +不该bugai +不敢bugan +不甘bugan +布告bugao +不够bugou +不顾bugu +不管buguan +不过buguo +不会buhui +补给buji +部件bujian +不借bujie +不尽bujin +不仅bujin +不禁bujin +布景bujing +不久bujiu +补救bujiu +布局buju +不堪bukan +不可buke +不快bukuai +不愧bukui +不理buli +不利buli +不良buliang +不料buliao +步履bulu +不论bulun +部落buluo +不满buman +部门bumen +不免bumian +不能buneng +不怕bupa +补品bupin +不平buping +步枪buqiang +不屈buqu +不然buran +不如buru +不少bushao +不是bushi +不识bushi +部首bushou +部属bushu +部署bushu +补贴butie +不同butong +不妥butuo +部位buwei +部委buwei +不问buwen +不惜buxi +补习buxi +部下buxia +不行buxing +不幸buxing +步行buxing +不朽buxiu +不许buxu +哺养buyang +不要buyao +不宜buyi +不用buyong +哺育buyu +不在buzai +部长buzhang +不振buzhen +不只buzhi +不止buzhi +不知buzhi +不致buzhi +布置buzhi +步骤buzhou +补助buzhu +捕捉buzhuo +步子buzi +不足buzu +博物馆bwg +产c +成c +出c +长c +从c +此c +常c +处c +车c +场c +传c +采c +层c +厂c +才c +次c +虫c +除c +查c +差c +擦ca +拆*ca +嚓ca +礤ca +采cai +才cai +材cai +菜cai +财cai +裁cai +彩cai +猜cai +睬cai +踩cai +蔡cai +参can +残can +蚕can +灿can +餐can +惭can +惨can +孱can +骖can +璨can +粲can +黪can +惨案canan +惨白canbai +残暴canbao +惨怛canda +残废canfei +藏cang +仓cang +苍cang +舱cang +沧cang +苍白cangbai +仓促cangcu +仓库cangku +苍老canglao +苍茫cangmang +藏匿cangni +苍穹cangqiong +沧桑cangsang +苍天cangtian +参观canguan +残骸canhai +残疾canji +参加canjia +参见canjian +残局canju +惨剧canju +参军canjun +参看cankan +参考cankao +残酷canku +惭愧cankui +灿烂canlan +参谋canmou +残缺canque +残忍canren +孱弱canruo +残杀cansha +残生cansheng +蚕食canshi +参数canshu +惨痛cantong +参与canyu +残余canyu +残月canyue +参阅canyue +参赞canzan +惨遭canzao +参战canzhan +参照canzhao +参政canzheng +惨重canzhong +草cao +槽cao +操cao +糙cao +曹cao +嘈cao +漕cao +螬cao +艚cao +草案caoan +草稿caogao +槽糕caogao +操劳caolao +操练caolian +草率caolu +草木caomu +草拟caoni +草签caoqian +操心caoxin +草原caoyuan +嘈杂caoza +操纵caozong +操作caozuo +差不多cbd +成本核算cbhs +出版社cbs +层出不穷ccbq +从长计议ccjy +存储器ccq +长春市ccs +成都市cds +测ce +策ce +侧ce +册ce +厕ce +恻ce +测定ceding +策动cedong +策反cefan +策划cehua +测量celiang +策略celue +侧面cemian +参*cen +岑cen +涔cen +涔涔cencen +层ceng +曾*ceng +蹭ceng +层层cengceng +层次cengci +曾经cengjing +测试ceshi +厕所cesuo +测验ceyan +侧重cezhong +出发点cfd +充分发挥cffh +唱高调cgd +从古到今cgdj +查cha +差cha +插cha +察cha +茶cha +叉cha +茬cha +碴cha +搽cha +岔cha +诧cha +刹*cha +喳*cha +嚓*cha +猹cha +馇cha +汊cha +姹cha +杈cha +楂cha +槎cha +檫cha +锸cha +镲cha +衩cha +查办chaban +差别chabie +差错chacuo +差点chadian +查对chadui +差额chae +查访chafang +察访chafang +查封chafeng +查获chahuo +差*chai +柴chai +拆chai +豺chai +侪chai +钗chai +瘥chai +虿chai +拆穿chaichuan +豺狼chailang +拆散chaisan +差使chaishi +拆卸chaixie +柴油chaiyou +差价chajia +差距chaju +察觉chajue +查看chakan +察看chakan +查考chakao +查明chaming +产chan +单*chan +铲chan +阐chan +搀chan +掺chan +蝉chan +馋chan +谗chan +缠chan +颤chan +冁chan +谄chan +蒇chan +廛chan +忏chan +潺chan +澶chan +孱*chan +羼chan +婵chan +骣chan +觇chan +禅chan +镡chan +蟾chan +躔chan +铲除chanchu +产地chandi +阐发chanfa +搀扶chanfu +长chang +常chang +场chang +厂chang +唱chang +肠chang +昌chang +倡chang +偿chang +畅chang +猖chang +尝chang +敞chang +裳*chang +倘*chang +伥chang +鬯chang +苌chang +菖chang +徜chang +怅chang +惝chang +阊chang +娼chang +嫦chang +昶chang +氅chang +鲳chang +长安changan +常常changchang +长城changcheng +长春changchun +畅达changda +倡导changdao +长度changdu +长短changduan +唱歌changge +常规changgui +长河changhe +场合changhe +偿还changhuan +厂家changjia +常见changjian +长江changjiang +长久changjiu +猖獗changjue +长空changkong +畅快changkuai +猖狂changkuang +场面changmian +长眠changmian +长年changnian +长篇changpian +长期changqi +长驱changqu +常任changren +长沙changsha +厂商changshang +常识changshi +尝试changshi +长寿changshou +常数changshu +场所changsuo +畅谈changtan +长途changtu +怅惘changwang +常委changwei +倘未changwei +常温changwen +常务changwu +畅想changxiang +畅销changxiao +倡议changyi +畅饮changyin +常用changyong +常有changyou +畅游changyou +长远changyuan +厂长changzhang +长征changzheng +厂址changzhi +常驻changzhu +婵娟chanjuan +蝉联chanlian +产量chanliang +缠绵chanmian +阐明chanming +产品chanpin +产权chanquan +缠绕chanrao +产生chansheng +禅师chanshi +阐述chanshu +产物chanwu +产销chanxiao +产业chanye +产值chanzhi +朝chao +超chao +潮chao +巢chao +抄chao +钞chao +嘲chao +吵chao +炒chao +绰*chao +剿*chao +怊chao +晁chao +焯*chao +耖chao +抄报chaobao +超产chaochan +超出chaochu +朝代chaodai +超额chaoe +嘲讽chaofeng +超过chaoguo +朝晖chaohui +超级chaoji +吵架chaojia +潮解chaojie +潮流chaoliu +抄录chaolu +吵闹chaonao +嘲弄chaonong +潮湿chaoshi +潮水chaoshui +抄送chaosong +超脱chaotuo +抄袭chaoxi +朝鲜chaoxian +嘲笑chaoxiao +巢穴chaoxue +朝阳chaoyang +朝野chaoye +超越chaoyue +超支chaozhi +查清chaqing +插曲chaqu +插入charu +查哨chashao +插手chashou +查收chashou +插图chatu +查问chawen +查询chaxun +茶叶chaye +差异chayi +查阅chayue +查证chazheng +岔子chazi +插足chazu +车che +彻che +尺*che +撤che +扯che +掣che +澈che +坼che +砗che +彻底chedi +车祸chehuo +车间chejian +车辆cheliang +陈chen +沉chen +称chen +衬chen +尘chen +臣chen +晨chen +沈*chen +郴chen +辰chen +忱chen +趁chen +伧chen +谌chen +谶chen +抻chen +嗔chen +宸chen +琛chen +榇chen +碜chen +龀chen +尘埃chenai +沉淀chendian +陈腐chenfu +沉浮chenfu +成cheng +程cheng +称cheng +城cheng +承cheng +乘cheng +呈cheng +盛*cheng +撑cheng +诚cheng +橙cheng +惩cheng +澄cheng +逞cheng +骋cheng +秤cheng +丞cheng +埕cheng +噌cheng +枨cheng +柽cheng +塍cheng +瞠cheng +铖cheng +铛cheng +裎cheng +蛏cheng +酲cheng +成败chengbai +承办chengban +惩办chengban +呈报chengbao +承包chengbao +成本chengben +成材chengcai +惩处chengchu +乘除chengchu +承担chengdan +承当chengdang +成都chengdu +程度chengdu +乘法chengfa +惩罚chengfa +成功chenggong +成规chenggui +成果chengguo +称号chenghao +称呼chenghu +成绩chengji +乘机chengji +成家chengjia +成见chengjian +成交chengjiao +承接chengjie +惩戒chengjie +成就chengjiu +乘客chengke +诚恳chengken +成立chengli +乘凉chengliang +成名chengming +成年chengnian +成批chengpi +成品chengpin +诚朴chengpu +逞强chengqiang +澄清chengqing +城区chengqu +成全chengquan +诚然chengran +成人chengren +承认chengren +成色chengse +成事chengshi +诚实chengshi +城市chengshi +承受chengshou +成熟chengshu +成为chengwei +称谓chengwei +成文chengwen +呈现chengxian +呈献chengxian +城乡chengxiang +成效chengxiao +称心chengxin +诚心chengxin +程序chengxu +乘虚chengxu +撑腰chengyao +诚意chengyi +成语chengyu +成员chengyuan +称赞chengzan +成长chengzhang +城镇chengzhen +称职chengzhi +诚挚chengzhi +趁机chenji +沉积chenji +陈迹chenji +沉浸chenjin +沉静chenjing +陈旧chenjiu +陈列chenlie +沉沦chenlun +沉闷chenmen +沉湎chenmian +沉默chenmo +沉溺chenni +陈设chenshe +陈述chenshu +陈说chenshuo +沉思chensi +沉痛chentong +衬托chentuo +沉吟chenyin +衬映chenying +趁早chenzao +沉重chenzhong +沉着chenzhuo +车皮chepi +扯皮chepi +撤退chetui +撤消chexiao +车站chezhan +撤职chezhi +持chi +尺chi +齿chi +吃chi +赤chi +池chi +迟chi +翅chi +斥chi +耻chi +痴chi +匙chi +弛chi +驰chi +侈chi +炽chi +傺chi +坻chi +墀chi +茌chi +叱chi +哧chi +啻chi +嗤chi +彳chi +饬chi +媸chi +敕chi +眵chi +鸱chi +瘛chi +褫chi +蚩chi +螭chi +笞chi +篪chi +豉chi +踟chi +魑chi +翅膀chibang +赤诚chicheng +驰骋chicheng +尺寸chicun +迟到chidao +赤道chidao +尺度chidu +迟钝chidun +吃喝chihe +迟缓chihuan +吃紧chijin +吃惊chijing +持久chijiu +吃苦chiku +吃亏chikui +吃力chili +炽烈chilie +齿轮chilun +持平chiping +痴情chiqing +炽热chire +耻辱chiru +池塘chitang +耻笑chixiao +赤心chixin +痴心chixin +迟疑chiyi +迟早chizao +斥责chize +叱咤chizha +持重chizhong +吃重chizhong +赤字chizi +催化剂chj +种*chong +虫chong +重*chong +充chong +冲chong +崇chong +涌*chong +宠chong +茺chong +忡chong +憧chong +铳chong +舂chong +艟chong +宠爱chongai +崇拜chongbai +充斥chongchi +冲刺chongci +冲淡chongdan +充当chongdang +重叠chongdie +冲动chongdong +宠儿chonger +充分chongfen +冲锋chongfeng +重复chongfu +崇高chonggao +重合chonghe +重婚chonghun +冲击chongji +重建chongjian +崇敬chongjing +憧憬chongjing +充满chongman +充沛chongpei +冲破chongpo +重庆chongqing +崇尚chongshang +重申chongshen +充实chongshi +冲刷chongshua +冲天chongtian +冲突chongtu +重温chongwen +冲洗chongxi +重新chongxin +重演chongyan +重印chongyin +充裕chongyu +充足chongzu +抽chou +仇chou +臭chou +酬chou +畴chou +踌chou +稠chou +愁chou +筹chou +绸chou +瞅chou +丑chou +俦chou +帱chou +惆chou +瘳chou +雠chou +筹办chouban +筹备choubei +惆怅chouchang +抽搐chouchu +踌躇chouchu +筹措choucuo +抽调choudiao +丑恶choue +仇恨chouhen +丑化chouhua +筹划chouhua +筹集chouji +筹建choujian +酬金choujin +抽空choukong +酬劳choulao +丑陋choulou +筹码chouma +稠密choumi +筹谋choumou +愁容chourong +抽象chouxiang +酬谢chouxie +抽噎chouye +出chu +处chu +除chu +初chu +础chu +触chu +楚chu +锄chu +储chu +畜*chu +橱chu +厨chu +躇chu +雏chu +滁chu +矗chu +搐chu +亍chu +刍chu +怵chu +憷chu +绌chu +杵chu +楮chu +樗chu +褚chu +蜍chu +蹰chu +黜chu +揣chuai +搋chuai +啜chuai +嘬*chuai +膪chuai +踹chuai +揣度chuaidu +揣摩chuaimo +传chuan +船chuan +穿chuan +串chuan +川chuan +椽chuan +喘chuan +舛chuan +遄chuan +巛chuan +氚chuan +钏chuan +舡chuan +传遍chuanbian +传标chuanbiao +传播chuanbo +船舶chuanbo +船埠chuanbu +穿插chuancha +传达chuanda +传单chuandan +传导chuandao +传递chuandi +床chuang +创chuang +窗chuang +闯chuang +疮chuang +幢chuang +怆chuang +创办chuangban +闯荡chuangdang +窗户chuanghu +创见chuangjian +创建chuangjian +闯劲chuangjin +创举chuangju +窗口chuangkou +创立chuangli +窗帘chuanglian +创始chuangshi +创新chuangxin +创业chuangye +创造chuangzao +创作chuangzuo +串联chuanlian +喘气chuanqi +传奇chuanqi +传染chuanran +传授chuanshou +传输chuanshu +传述chuanshu +传说chuanshuo +传送chuansong +传统chuantong +串通chuantong +喘息chuanxi +传讯chuanxun +传扬chuanyang +传阅chuanyue +传真chuanzhen +船只chuanzhi +穿着chuanzhuo +出版chuban +出榜chubang +储备chubei +出兵chubing +初步chubu +储藏chucang +出差chucha +出产chuchan +出场chuchang +出厂chuchang +处处chuchu +橱窗chuchuang +初次chuci +储存chucun +初等chudeng +出动chudong +触动chudong +出发chufa +触发chufa +除法chufa +处罚chufa +触犯chufan +出访chufang +除非chufei +处分chufen +出轨chugui +出海chuhai +吹chui +垂chui +锤chui +椎*chui +炊chui +捶chui +陲chui +棰chui +槌chui +吹棒chuibang +吹风chuifeng +吹拂chuifu +锤炼chuilian +吹牛chuiniu +垂青chuiqing +垂涎chuixian +吹嘘chuixu +垂直chuizhi +初级chuji +出击chuji +出界chujie +出境chujing +处境chujing +处决chujue +触觉chujue +除开chukai +出口chukou +出来chulai +除了chule +出力chuli +处理chuli +矗立chuli +初恋chulian +出笼chulong +出路chulu +出马chuma +出卖chumai +出面chumian +出名chuming +除名chuming +出没chumo +春chun +纯chun +醇chun +椿chun +唇chun +淳chun +蠢chun +莼chun +鹑chun +蝽chun +出纳chuna +春播chunbo +纯粹chuncui +纯度chundu +春分chunfen +春风chunfeng +春耕chungeng +春光chunguang +醇厚chunhou +春辉chunhui +春季chunji +春节chunjie +纯洁chunjie +纯净chunjing +纯利chunli +纯朴chunpu +春秋chunqiu +春色chunse +春笋chunsun +春天chuntian +处女chunu +触怒chunu +春意chunyi +纯真chunzhen +纯正chunzheng +戳chuo +绰chuo +啜*chuo +辍chuo +踔chuo +龊chuo +戳穿chuochuan +绰号chuohao +啜泣chuoqi +出品chupin +出奇chuqi +初期chuqi +出勤chuqin +出去chuqu +出让churang +出任churen +出入churu +出色chuse +出身chushen +出神chushen +出生chusheng +畜生chusheng +出事chushi +出世chushi +处世chushi +厨师chushi +出售chushou +处所chusuo +出庭chuting +锄头chutou +出土chutu +出外chuwai +除外chuwai +出席chuxi +出息chuxi +除夕chuxi +出现chuxian +初小chuxiao +雏形chuxing +储蓄chuxu +刍议chuyi +处于chuyu +初战chuzhan +处长chuzhang +出诊chuzhen +出征chuzheng +处置chuzhi +初中chuzhong +出租chuzu +此ci +次ci +刺ci +磁ci +雌ci +词ci +茨ci +疵ci +辞ci +慈ci +瓷ci +赐ci +伺*ci +兹*ci +茈ci +呲ci +祠ci +鹚ci +糍ci +慈爱ciai +辞别cibie +磁场cichang +磁带cidai +磁道cidao +此地cidi +词典cidian +辞典cidian +刺耳cier +词根cigen +刺骨cigu +此后cihou +词汇cihui +刺激ciji +赐教cijiao +此刻cike +刺客cike +词类cilei +辞令ciling +磁盘cipan +次品cipin +辞去ciqu +刺杀cisha +此时cishi +次数cishu +辞书cishu +词素cisu +祠堂citang +辞退citui +此外ciwai +慈祥cixiang +辞行cixing +词性cixing +雌雄cixiong +次序cixu +词序cixu +刺眼ciyan +次要ciyao +词语ciyu +赐予ciyu +此致cizhi +辞职cizhi +词缀cizhui +词组cizu +超级大国cjdg +参考书cks +参考消息ckxx +参考资料ckzl +触类旁通clpt +藏龙卧虎clwh +参谋长cmc +聪明才智cmcz +出谋划策cmhc +从难从严cncy +从cong +丛cong +聪cong +葱cong +囱cong +匆cong +苁cong +淙cong +骢cong +琮cong +璁cong +从此congci +匆匆congcong +匆促congcu +从而conger +从犯congfan +聪慧conghui +从来conglai +丛林conglin +匆忙congmang +聪明congming +从前congqian +从容congrong +从事congshi +丛书congshu +从速congsu +从新congxin +从严congyan +聪颖congying +葱郁congyu +从中congzhong +凑cou +楱cou +辏cou +腠cou +凑合couhe +凑巧couqiao +成品率cpl +成千上万cqsw +从容不迫crbp +承认错误crcw +趁热打铁crdt +措手不及csbj +出生率csl +长沙市css +炊事员csy +彻头彻尾ctcw +垂头丧气ctsq +粗cu +促cu +醋cu +簇cu +卒*cu +蔟cu +徂cu +猝cu +殂cu +酢cu +蹙cu +蹴cu +篡cuan +蹿cuan +窜cuan +攒*cuan +汆cuan +撺cuan +爨cuan +镩cuan +篡夺cuanduo +窜犯cuanfan +篡改cuangai +篡权cuanquan +粗暴cubao +粗糙cucao +粗犷cuguang +催cui +脆cui +淬cui +粹cui +摧cui +衰*cui +崔cui +瘁cui +翠cui +萃cui +啐cui +悴cui +璀cui +榱cui +毳cui +隹cui +摧残cuican +脆弱cuiruo +促进cujin +存cun +村cun +寸cun +蹲*cun +忖cun +皴cun +存储cunchu +存档cundang +存放cunfang +存款cunkuan +村落cunluo +存亡cunwang +存在cunzai +村镇cunzhen +村庄cunzhuang +村子cunzi +错cuo +措cuo +撮cuo +磋cuo +搓cuo +挫cuo +厝cuo +嵯cuo +脞cuo +锉cuo +矬cuo +痤cuo +瘥*cuo +鹾cuo +蹉cuo +错案cuoan +挫败cuobai +错处cuochu +措辞cuoci +错怪cuoguai +错过cuoguo +撮合cuohe +错觉cuojue +磋商cuoshang +挫伤cuoshang +措施cuoshi +错误cuowu +挫折cuozhe +错综cuozong +粗浅cuqian +促使cushi +粗俗cusu +粗心cuxin +粗壮cuzhuang +常委会cwh +崇文区cwq +常务委员会cwwh +乘务员cwy +诚心诚意cxcy +程序控制cxkz +程序设计cxsj +长远利益cyly +朝阳区cyq +财政部czb +错综复杂czfz +操之过急czgj +出租汽车czqc +此之外czw +财政危机czwj +创造性czx +操作系统czxt +操作员czy +持之以恒czyh +的d +大d +地d +动d +到d +对d +度d +多d +电d +党d +得d +定d +等d +斗d +当d +队d +都d +点d +代d +道d +大da +打da +达da +答da +搭da +塔*da +瘩da +耷da +哒da +嗒da +怛da +妲da +沓*da +疸da +褡da +笪da +靼da +鞑da +答案daan +打败dabai +大办daban +大半daban +打扮daban +答辩dabian +大伯dabo +大部dabu +达成dacheng +大胆dadan +搭档dadang +大道dadao +达到dadao +打倒dadao +大地dadi +大敌dadi +大抵dadi +打断daduan +大队dadui +大多daduo +大凡dafan +大夫dafu +大幅dafu +答复dafu +大概dagai +大纲dagang +大国daguo +大海dahai +大好dahao +大河dahe +大亨daheng +大会dahui +大*dai +代dai +带dai +待dai +袋dai +戴dai +呆dai +歹dai +傣dai +殆dai +贷dai +逮dai +怠dai +埭dai +甙dai +呔dai +岱dai +迨dai +骀dai +绐dai +玳dai +黛dai +呆板daiban +代表daibiao +逮捕daibu +逮逋daibu +代词daici +带动daidong +怠工daigong +代价daijia +贷款daikuan +带来dailai +代理daili +带领dailing +带路dailu +黛绿dailu +代码daima +怠慢daiman +待命daiming +代数daishu +代替daiti +带头daitou +歹徒daitu +待遇daiyu +呆滞daizhi +呆子daizi +打击daji +大家dajia +打搅dajiao +大街dajie +大捷dajie +打劫dajie +搭救dajiu +大局daju +答卷dajuan +打开dakai +耷拉dala +大力dali +大连dalian +大量daliang +打量daliang +大陆dalu +大略dalue +大妈dama +单dan +但dan +弹dan +担dan +石*dan +蛋dan +淡dan +胆dan +氮dan +丹dan +旦dan +耽dan +郸dan +掸dan +惮dan +诞dan +儋dan +萏dan +啖dan +澹*dan +殚dan +赕dan +眈dan +疸dan +瘅dan +聃dan +箪dan +大脑danao +担保danbao +单薄danbao +淡薄danbao +单产danchan +诞辰danchen +单纯danchun +单词danci +担当dandang +单调dandiao +单独dandu +单方danfang +担负danfu +党dang +当dang +档dang +挡dang +荡dang +谠dang +凼dang +菪dang +宕dang +砀dang +裆dang +单干dangan +胆敢dangan +档案dangan +当场dangchang +当初dangchu +当代dangdai +当地dangdi +单个dange +耽搁dange +党风dangfeng +党纲danggang +党纪dangji +党籍dangji +当即dangji +当家dangjia +当今dangjin +当局dangju +当量dangliang +当面dangmian +党内dangnei +当年dangnian +党派dangpai +当铺dangpu +当前dangqian +当然dangran +当日dangri +当时dangshi +当天dangtian +当头dangtou +党团dangtuan +当晚dangwan +党委dangwei +当先dangxian +党校dangxiao +当心dangxin +党性dangxing +荡漾dangyang +党员dangyuan +当月dangyue +党章dangzhang +当真dangzhen +党政dangzheng +当政dangzheng +当中dangzhong +当众dangzhong +当做dangzuo +单价danjia +担架danjia +胆量danliang +胆略danlue +淡漠danmo +胆怯danqie +丹青danqing +担任danren +单身danshen +诞生dansheng +但是danshi +胆识danshi +单体danti +丹田dantian +单位danwei +耽误danwu +单项danxiang +胆小danxiao +担心danxin +淡雅danya +弹药danyao +单一danyi +单元danyuan +但愿danyuan +单质danzhi +担子danzi +掸子danzi +单字danzi +到dao +道dao +导dao +刀dao +倒dao +稻dao +岛dao +捣dao +盗dao +蹈dao +祷dao +悼dao +叨dao +帱*dao +忉dao +氘dao +焘*dao +纛dao +倒闭daobi +到处daochu +悼词daoci +到达daoda +导弹daodan +道德daode +到底daodi +倒戈daoge +捣鬼daogui +捣毁daohui +到来daolai +到了daole +道理daoli +倒立daoli +道路daolu +捣乱daoluan +倒霉daomei +叨念daonian +道歉daoqian +刀枪daoqiang +盗窃daoqie +到时daoshi +导师daoshi +倒数daoshu +导体daoti +倒退daotui +导演daoyan +道义daoyi +盗用daoyong +岛屿daoyu +导致daozhi +大批dapi +大破dapo +打破dapo +大气daqi +大庆daqing +打扰darao +打扫dasao +大厦dasha +搭讪dashan +大赦dashe +大使dashi +大事dashi +大师dashi +大势dashi +大肆dasi +打算dasuan +大体dati +大厅dating +打听dating +大同datong +大小daxiao +大写daxie +答谢daxie +大选daxuan +大学daxue +大业daye +达因dayin +打印dayin +答应daying +大于dayu +大院dayuan +大约dayue +打仗dazhang +大致dazhi +大众dazhong +打字dazi +代办处dbc +得不偿失dbcs +大部分dbf +电报挂号dbgh +大不了dbl +大步流星dblx +对不起dbq +代表团dbt +电冰箱dbx +东城区dcq +到此为止dcwz +独创性dcx +调查研究dcyj +打成一片dcyp +打电话ddh +电动机ddj +对得起ddq +大多数dds +的de +得de +地*de +德de +底*de +锝de +得逞decheng +的当dedang +得当dedang +得到dedao +得分defen +德国deguo +得奖dejiang +得救dejiu +得了dele +得力deli +等deng +灯deng +登deng +邓deng +澄*deng +蹬deng +瞪deng +凳deng +噔deng +嶝deng +戥deng +磴deng +镫deng +簦deng +登场dengchang +等待dengdai +等到dengdao +灯光dengguang +等候denghou +等级dengji +登记dengji +等价dengjia +灯具dengju +登门dengmen +灯谜dengmi +登攀dengpan +登山dengshan +灯塔dengta +登台dengtai +等同dengtong +等闲dengxian +等于dengyu +登载dengzai +得胜desheng +得失deshi +得体deti +德行dexing +得以deyi +得意deyi +德育deyu +得志dezhi +得知dezhi +得罪dezui +大幅度dfd +多方面dfm +单方面dfm +电风扇dfs +大规模dgm +多功能dgn +大公无私dgws +帝国主义dgzy +电话号码dhhm +电化教育dhjy +大会堂dht +的*di +地di +第di +低di +敌di +底di +提*di +帝di +抵di +滴di +弟di +递di +堤di +迪di +笛di +狄di +涤di +翟di +嫡di +蒂di +缔di +氐di +籴di +诋di +谛di +邸di +坻*di +荻di +嘀di +娣di +绨di +柢di +棣di +觌di +砥di +碲di +睇di +镝di +羝di +骶di +嗲dia +电dian +点dian +垫dian +典dian +店dian +颠dian +淀dian +掂dian +滇dian +碘dian +靛dian +佃dian +甸dian +惦dian +奠dian +殿dian +阽dian +坫dian +巅dian +玷dian +钿dian +癜dian +癫dian +簟dian +踮dian +电报dianbao +点播dianbo +电场dianchang +电车dianche +电池dianchi +电传dianchuan +颠倒diandao +电灯diandeng +点滴diandi +奠定dianding +电动diandong +典范dianfan +淀粉dianfen +垫付dianfu +颠覆dianfu +电感diangan +典故diangu +电荷dianhe +电弧dianhu +电话dianhua +电汇dianhui +电机dianji +电极dianji +奠基dianji +惦记dianji +典籍dianji +点将dianjiang +电解dianjie +殿军dianjun +癫狂diankuang +电缆dianlan +电力dianli +电离dianli +典礼dianli +电流dianliu +电路dianlu +电脑diannao +电能dianneng +店铺dianpu +电气dianqi +电器dianqi +点燃dianran +电容dianrong +电扇dianshan +电视dianshi +电台diantai +电梯dianti +点头diantou +电网dianwang +电位dianwei +玷污dianwu +殿下dianxia +电线dianxian +癫痫dianxian +电信dianxin +典型dianxing +电讯dianxun +电压dianya +电影dianying +店员dianyuan +点阵dianzhen +点缀dianzhui +电子dianzi +点子dianzi +电阻dianzu +调diao +掉diao +吊diao +鸟*diao +碉diao +叼diao +雕diao +凋diao +刁diao +钓diao +铞diao +铫diao +貂diao +鲷diao +碉堡diaobao +凋敝diaobi +调查diaocha +吊车diaoche +调动diaodong +调度diaodu +钓饵diaoer +调换diaohuan +掉换diaohuan +雕刻diaoke +调令diaoling +刁难diaonan +调遣diaoqian +调任diaoren +雕塑diaosu +吊唁diaoyan +调用diaoyong +钓鱼diaoyu +调子diaozi +第八diba +地板diban +地步dibu +低沉dichen +抵触dichu +抵达dida +地带didai +低档didang +抵挡didang +地道didao +弟弟didi +地点didian +地段diduan +敌对didui +迭die +跌die +爹die +碟die +蝶die +谍die +叠die +垤die +堞die +揲die +喋die +牒die +瓞die +耋die +踮*die +蹀die +鲽die +迭起dieqi +第二dier +地方difang +低估digu +敌国diguo +帝国diguo +敌后dihou +诋毁dihui +低级diji +递加dijia +递减dijian +地窖dijiao +递交dijiao +缔交dijiao +缔结dijie +第九dijiu +敌军dijun +抵抗dikang +地牢dilao +地理dili +低劣dilie +第六diliu +低落diluo +地貌dimao +地面dimian +抵命diming +定ding +顶ding +钉ding +丁ding +订ding +盯ding +叮ding +鼎ding +锭ding +仃ding +啶ding +玎ding +腚ding +碇ding +町ding +铤*ding +疔ding +耵ding +酊ding +定案dingan +定产dingchan +丁当dingdang +顶点dingdian +定夺dingduo +定额dinge +顶峰dingfeng +顶锋dingfeng +定购dinggou +订购dinggou +订户dinghu +定货dinghuo +订货dinghuo +定价dingjia +定局dingju +定居dingju +定理dingli +订立dingli +鼎立dingli +定量dingliang +定律dinglu +定期dingqi +定然dingran +盯梢dingshao +定时dingshi +顶替dingti +定性dingxing +定型dingxing +定义dingyi +定语dingyu +定员dingyuan +订阅dingyue +订正dingzheng +叮嘱dingzhu +顶撞dingzhuang +钉子dingzi +嫡派dipai +地盘dipan +第七diqi +嫡亲diqin +敌情diqing +地球diqiu +地区diqu +的确dique +敌人diren +第三disan +地势dishi +第十dishi +滴水dishui +第四disi +地铁ditie +地图ditu +丢diu +铥diu +丢掉diudiao +丢脸diulian +丢失diushi +地位diwei +敌伪diwei +第五diwu +嫡系dixi +底细dixi +地下dixia +低下dixia +底下dixia +地形dixing +弟兄dixiong +第一diyi +敌意diyi +地域diyu +抵御diyu +缔造dizao +递增dizeng +地震dizhen +敌阵dizhen +地质dizhi +地址dizhi +抵制dizhi +底子dizi +弟子dizi +党纪国法djgf +当机立断djld +多劳多得dldd +大力发展dlfz +大力加强dljq +大力开展dlkz +独立自主dlzz +多面手dms +对内搞活dngh +多年来dnl +东南亚dny +动dong +东dong +冬dong +懂dong +洞dong +冻dong +董dong +栋dong +侗dong +恫dong +垌dong +咚dong +岽dong +峒dong +氡dong +胨dong +胴dong +硐dong +鸫dong +东北dongbei +东边dongbian +东部dongbu +洞察dongcha +动词dongci +动荡dongdang +懂得dongde +东方dongfang +东风dongfeng +动工donggong +东海donghai +恫吓donghe +动机dongji +冬季dongji +东家dongjia +冻结dongjie +动静dongjing +东京dongjing +动力dongli +动量dongliang +栋梁dongliang +动乱dongluan +动脉dongmai +东南dongnan +东欧dongou +动人dongren +动身dongshen +董事dongshi +动手dongshou +动态dongtai +冬天dongtian +动听dongting +动物dongwu +东西dongxi +洞悉dongxi +动向dongxiang +动心dongxin +东亚dongya +东洋dongyang +动摇dongyao +动用dongyong +动员dongyuan +动辄dongzhe +动作dongzuo +斗dou +都*dou +豆dou +读*dou +兜dou +抖dou +陡dou +逗dou +痘dou +蔸dou +窦dou +蚪dou +篼dou +兜风doufeng +逗号douhao +逗留douliu +斗室doushi +兜售doushou +斗争douzheng +斗志douzhi +斗智douzhi +抖嘴douzui +打破常规dpcg +地平线dpx +电器化dqh +待人接物drjw +第三产业dscy +第十二届dsej +大使馆dsg +到时候dsh +电视机dsj +多少年dsn +大失所望dssw +电视台dst +低三下四dsxs +第十一届dsyj +大踏步dtb +到头来dtl +大体上dts +大同小异dtxy +度du +都du +毒du +独du +读du +渡du +杜du +堵du +镀du +顿du +督du +犊du +睹du +赌du +肚du +妒du +芏du +嘟du +渎du +椟du +牍du +蠹du +笃du +髑du +黩du +断duan +端duan +段duan +短duan +锻duan +缎duan +椴duan +煅duan +簖duan +短波duanbo +短处duanchu +短促duancu +断定duanding +短短duanduan +断交duanjiao +断绝duanjue +锻练duanlian +锻炼duanlian +短路duanlu +段落duanluo +短评duanping +短期duanqi +短缺duanque +断然duanran +煅烧duanshao +断送duansong +短途duantu +端午duanwu +端详duanxiang +短小duanxiao +断言duanyan +端阳duanyang +短语duanyu +短暂duanzan +端正duanzheng +端庄duanzhuang +读报dubao +读本duben +赌博dubo +独裁ducai +毒草ducao +独唱duchang +独创duchuang +督促ducu +毒打duda +独到dudao +度过duguo +毒害duhai +毒化duhua +都会duhui +对dui +队dui +堆dui +敦*dui +兑dui +怼dui +憝dui +碓dui +对比duibi +队部duibu +对策duice +对称duichen +对此duici +对待duidai +对等duideng +对调duidiao +对方duifang +对付duifu +对话duihua +兑换duihuan +对讲duijiang +对抗duikang +对口duikou +对垒duilei +对立duili +对联duilian +队列duilie +对流duiliu +对面duimian +对内duinei +对偶duiou +对手duishou +对数duishu +对外duiwai +队伍duiwu +兑现duixian +对象duixiang +对应duiying +对于duiyu +队员duiyuan +堆栈duizhan +队长duizhang +对照duizhao +对证duizheng +对质duizhi +对峙duizhi +对准duizhun +镀金dujin +杜绝dujue +渡口dukou +都来dulai +独立duli +度量duliang +盾dun +吨dun +顿dun +蹲dun +敦dun +墩dun +囤dun +钝dun +遁dun +沌dun +炖dun +砘dun +礅dun +盹dun +镦dun +趸dun +蹲点dundian +顿号dunhao +囤积dunji +遁迹dunji +钝角dunjiao +顿时dunshi +敦实dunshi +多duo +度*duo +夺duo +朵duo +掇duo +哆duo +垛duo +躲duo +跺duo +舵duo +剁duo +惰duo +堕duo +驮*duo +咄duo +哚duo +沲duo +缍duo +柁duo +铎duo +裰duo +踱duo +多半duoban +躲避duobi +多变duobian +多边duobian +躲藏duocang +多次duoci +夺得duode +多端duoduan +多方duofang +躲开duokai +多亏duokui +夺魁duokui +堕落duoluo +多么duome +夺目duomu +多年duonian +多情duoqing +夺取duoqu +多少duoshao +多事duoshi +掇拾duoshi +舵手duoshou +多数duoshu +多谢duoxie +多心duoxin +惰性duoxing +多样duoyang +多余duoyu +多种duozhong +肚皮dupi +毒品dupin +毒气duqi +读取duqu +度日duri +读入duru +堵塞duse +毒蛇dushe +都是dushi +毒手dushou +读数dushu +读书dushu +毒素dusu +独特dute +读物duwu +毒药duyao +独占duzhan +读者duzhe +毒汁duzhi +渎职duzhi +赌注duzhu +杜撰duzhuan +独自duzi +党委会dwh +对外开放dwkf +敌我矛盾dwmd +对外贸易dwmy +大无畏dww +动物园dwy +当务之急dwzj +邓小平dxp +大学生dxs +大显身手dxss +大西洋dxy +大跃进dyj +打印机dyj +大有可为dykw +待业青年dyqn +掉以轻心dyqx +电影院dyy +大洋洲dyz +大有作为dyzw +党支部dzb +多种多样dzdy +党政机关dzjg +多种经营dzjy +断章取义dzqy +大自然dzr +德智体dzt +电子学dzx +党中央dzy +而e +二e +尔e +儿e +恶e +额e +恩e +俄e +耳e +饵e +蛾e +饿e +峨e +鹅e +讹e +娥e +厄e +扼e +遏e +鄂e +噩e +谔e +垩e +苊e +莪e +萼e +呃e +愕e +屙e +婀e +轭e +腭e +锇e +锷e +鹗e +颚e +鳄e +恶霸eba +恶毒edu +恶感egan +恶棍egun +噩耗ehao +恶化ehua +诶ei +二极管ejg +二进制ejz +恶劣elie +鹅毛emao +噩梦emeng +恶魔emo +耳目一新emyx +恩en +蒽en +摁en +恩爱enai +恩赐enci +恩典endian +恩惠enhui +恩情enqing +而er +二er +尔er +儿er +耳er +饵er +洱er +贰er +佴er +迩er +珥er +铒er +鸸er +鲕er +耳朵erduo +儿歌erge +耳光erguang +而后erhou +尔后erhou +二届erjie +而今erjin +而况erkuang +而且erqie +而是ershi +儿童ertong +儿戏erxi +而已eryi +耳语eryu +二月eryue +儿子erzi +扼杀esha +额外ewai +扼腕ewan +额外负担ewfd +恶习exi +恶心exin +恶性exing +恶性循环exxh +扼要eyao +厄运eyun +讹诈ezha +遏止ezhi +分f +发f +方f +法f +反f +放f +复f +风f +防f +非f +服f +肥f +副f +粉f +府f +夫f +负f +封f +富f +翻f +发fa +法fa +阀fa +乏fa +伐fa +罚fa +筏fa +珐fa +垡fa +砝fa +发报fabao +法宝fabao +发表fabiao +发布fabu +发财facai +发愁fachou +发出fachu +发达fada +发电fadian +法典fadian +法定fading +发动fadong +发放fafang +发奋fafen +发愤fafen +法官faguan +法规fagui +法国faguo +发慌fahuang +发挥fahui +发火fahuo +发给faji +发迹faji +法纪faji +发家fajia +发奖fajiang +发酵fajiao +罚金fajin +发觉fajue +发掘fajue +罚款fakuan +发狂fakuang +法郎falang +法令faling +法律falu +发落faluo +发明faming +反fan +翻fan +范fan +犯fan +饭fan +繁fan +泛fan +番fan +凡fan +烦fan +返fan +藩fan +帆fan +樊fan +矾fan +钒fan +贩fan +蕃fan +蘩fan +幡fan +梵fan +燔fan +畈fan +蹯fan +翻版fanban +反比fanbi +反驳fanbo +帆布fanbu +反常fanchang +范畴fanchou +犯愁fanchou +帆船fanchuan +饭店fandian +反动fandong +翻动fandong +反对fandui +繁多fanduo +反而faner +反复fanfu +方fang +放fang +防fang +访fang +房fang +纺fang +仿fang +妨fang +芳fang +肪fang +坊fang +邡fang +彷*fang +枋fang +钫fang +舫fang +鲂fang +妨碍fangai +方案fangan +反感fangan +防备fangbei +方便fangbian +防潮fangchao +方程fangcheng +放大fangda +放荡fangdang +防盗fangdao +方法fangfa +防范fangfan +防风fangfeng +防腐fangfu +仿佛fangfu +妨害fanghai +防护fanghu +防火fanghuo +放假fangjia +房间fangjian +方面fangmian +放牧fangmu +返工fangong +反攻fangong +放屁fangpi +放弃fangqi +防区fangqu +放任fangren +放哨fangshao +放射fangshe +方式fangshi +防守fangshou +放肆fangsi +放松fangsong +仿宋fangsong +翻滚fangun +方位fangwei +防卫fangwei +访问fangwen +房屋fangwu +放下fangxia +防线fangxian +方向fangxiang +芳香fangxiang +仿效fangxiao +放心fangxin +放行fangxing +方言fangyan +防疫fangyi +防御fangyu +仿造fangzao +仿照fangzhao +方针fangzhen +仿真fangzhen +防治fangzhi +仿制fangzhi +放置fangzhi +防止fangzhi +纺织fangzhi +房子fangzi +放纵fangzong +房租fangzu +番号fanhao +繁华fanhua +反悔fanhui +返回fanhui +反击fanji +反抗fankang +反馈fankui +泛滥fanlan +范例fanli +凡例fanli +翻脸fanlian +贩卖fanmai +繁忙fanmang +烦闷fanmen +反面fanmian +反目fanmu +烦恼fannao +反叛fanpan +犯人fanren +繁荣fanrong +反射fanshe +翻身fanshen +繁盛fansheng +凡是fanshi +凡事fanshi +繁琐fansuo +烦琐fansuo +翻腾fanteng +繁体fanti +饭桶fantong +发怒fanu +饭碗fanwan +范围fanwei +反问fanwen +反响fanxiang +返销fanxiao +反省fanxing +翻修fanxiu +繁衍fanyan +翻译fanyi +翻印fanyin +反应fanying +反映fanying +繁育fanyu +翻越fanyue +翻阅fanyue +贩运fanyun +繁杂fanza +烦燥fanzao +反正fanzheng +反之fanzhi +繁殖fanzhi +繁重fanzhong +贩子fanzi +犯罪fanzui +发起faqi +法权faquan +发射fashe +发生fasheng +发誓fashi +发售fashou +法庭fating +发现faxian +发泄faxie +发行faxing +发言fayan +发扬fayang +法医fayi +发育fayu +发源fayuan +法院fayuan +法则faze +发展fazhan +法制fazhi +法治fazhi +发作fazuo +奋不顾身fbgs +分崩离析fblx +副产品fcp +发电机fdj +发动机fdj +反动派fdp +分道扬镳fdyb +非fei +肥fei +飞fei +费fei +废fei +肺fei +沸fei +菲fei +匪fei +啡fei +诽fei +吠fei +芾fei +狒fei +悱fei +淝fei +妃fei +绯fei +榧fei +腓fei +斐fei +扉fei +镄fei +痱fei +蜚fei +篚fei +翡fei +霏fei +鲱fei +匪帮feibang +诽谤feibang +飞奔feiben +非常feichang +飞驰feichi +废除feichu +非但feidan +非得feide +沸点feidian +非法feifa +非凡feifan +肺腑feifu +绯红feihong +废话feihua +飞机feiji +飞溅feijian +费解feijie +费劲feijin +飞快feikuai +费力feili +肥料feiliao +废料feiliao +肥胖feipang +废品feipin +废弃feiqi +费神feishen +废水feishui +飞速feisu +沸腾feiteng +匪徒feitu +肥沃feiwo +废物feiwu +飞舞feiwu +飞翔feixiang +费心feixin +飞行feixing +废墟feixu +飞扬feiyang +扉页feiye +非议feiyi +费用feiyong +飞跃feiyue +肥皂feizao +飞涨feizhang +废止feizhi +非洲feizhou +妃子feizi +分fen +粉fen +奋fen +份fen +粪fen +纷fen +芬fen +愤fen +酚fen +吩fen +氛fen +坟fen +焚fen +汾fen +忿fen +偾fen +瀵fen +玢*fen +棼fen +鲼fen +鼢fen +分贝fenbei +分辩fenbian +分辨fenbian +粪便fenbian +分别fenbie +分部fenbu +分布fenbu +分册fence +分寸fencun +分担fendan +分得fende +分店fendian +奋斗fendou +分队fendui +分发fenfa +奋发fenfa +纷纷fenfen +吩咐fenfu +风feng +封feng +蜂feng +丰feng +缝feng +峰feng +锋feng +疯feng +奉feng +枫feng +烽feng +逢feng +冯feng +讽feng +凤feng +俸feng +酆feng +葑feng +唪feng +沣feng +砜feng +风暴fengbao +丰碑fengbei +封闭fengbi +风波fengbo +丰产fengchan +奉承fengcheng +讽刺fengci +封存fengcun +风度fengdu +分割fenge +分隔fenge +风发fengfa +风帆fengfan +丰富fengfu +奉告fenggao +风格fengge +奉公fenggong +风光fengguang +风寒fenghan +奉还fenghuan +凤凰fenghuang +烽火fenghuo +封建fengjian +风景fengjing +疯狂fengkuang +风浪fenglang +风力fengli +风流fengliu +丰满fengman +锋芒fengmang +风貌fengmao +奉命fengming +丰年fengnian +分工fengong +奉陪fengpei +风气fengqi +风情fengqing +风趣fengqu +奉劝fengquan +缝纫fengren +风骚fengsao +风沙fengsha +风尚fengshang +风声fengsheng +丰盛fengsheng +丰收fengshou +风霜fengshuang +风水fengshui +丰硕fengshuo +奉祀fengsi +风俗fengsu +封锁fengsuo +疯瘫fengtan +封条fengtiao +风头fengtou +分管fenguan +风味fengwei +缝隙fengxi +风险fengxian +奉献fengxian +风向fengxiang +风行fengxing +奉行fengxing +蜂拥fengyong +风云fengyun +风韵fengyun +风灾fengzai +疯子fengzi +风姿fengzi +分号fenhao +分毫fenhao +分红fenhong +粉红fenhong +分化fenhua +分会fenhui +焚毁fenhui +分级fenji +分解fenjie +分界fenjie +奋进fenjin +分居fenju +分开fenkai +愤慨fenkai +分类fenlei +分离fenli +奋力fenli +分量fenliang +分裂fenlie +纷乱fenluan +分娩fenmian +分秒fenmiao +分明fenming +粉末fenmo +坟墓fenmu +愤怒fennu +分派fenpai +分配fenpei +分批fenpi +分期fenqi +分歧fenqi +奋起fenqi +分清fenqing +分区fenqu +分散fensan +焚烧fenshao +分数fenshu +分说fenshuo +粉碎fensui +分摊fentan +粪土fentu +分外fenwai +氛围fenwei +分析fenxi +奋勇fenyong +分赃fenzang +奋战fenzhan +分支fenzhi +分子fenzi +分组fenzu +丰富多采ffdc +奋发图强fftq +反过来说fgls +反革命fgm +福建省fjs +封建主义fjzy +翻来覆去flfq +法律顾问flgw +分秒必争fmbz +发明创造fmcz +否fou +缶fou +否定fouding +否决foujue +否认fouren +否则fouze +费品率fpl +废寝忘食fqws +缝纫机frj +分水岭fsl +翻天复地ftfd +丰台区ftq +非同小可ftxk +繁体字ftz +复fu +服fu +副fu +府fu +夫fu +负fu +富fu +附fu +福fu +伏fu +符fu +幅fu +腐fu +浮fu +辅fu +付fu +腹fu +妇fu +孵fu +覆fu +扶fu +辐fu +傅fu +佛fu +缚fu +父fu +弗fu +甫fu +肤fu +氟fu +敷fu +拂fu +俘fu +涪fu +袱fu +抚fu +俯fu +釜fu +斧fu +脯fu +腑fu +赴fu +赋fu +阜fu +讣fu +咐fu +匐fu +凫fu +郛fu +芙fu +芾*fu +苻fu +茯fu +莩fu +菔fu +拊fu +呋fu +幞fu +怫fu +滏fu +艴fu +孚fu +驸fu +绂fu +绋fu +桴fu +赙fu +祓fu +砩fu +黻fu +黼fu +罘fu +稃fu +馥fu +蚨fu +蜉fu +蝠fu +蝮fu +麸fu +趺fu +跗fu +鲋fu +鳆fu +腐败fubai +复辟fubi +复查fucha +浮沉fuchen +扶持fuchi +付出fuchu +副词fuci +服从fucong +附带fudai +负担fudan +辅导fudao +浮雕fudiao +浮动fudong +幅度fudu +复发fufa +伏法fufa +夫妇fufu +覆盖fugai +讣告fugao +富贵fugui +符号fuhao +附和fuhe +符合fuhe +负荷fuhe +腐化fuhua +浮华fuhua +复活fuhuo +俘获fuhuo +伏击fuji +附加fujia +附件fujian +福建fujian +佛教fujiao +附近fujin +副刊fukan +俯瞰fukan +浮夸fukua +付款fukuan +腐烂fulan +福利fuli +浮力fuli +富丽fuli +妇联fulian +附录fulu +俘虏fulu +覆灭fumie +覆没fumo +父母fumu +富农funong +妇女funu +扶贫fupin +服气fuqi +福气fuqi +夫妻fuqi +付讫fuqi +肤浅fuqian +富强fuqiang +父亲fuqin +富饶furao +夫人furen +芙蓉furong +妇孺furu +负伤fushang +辐射fushe +复试fushi +腐蚀fushi +俯视fushi +副手fushou +复数fushu +负数fushu +附属fushu +富庶fushu +赋税fushui +伏特fute +覆亡fuwang +富翁fuweng +服务fuwu +复习fuxi +浮现fuxian +赋闲fuxian +浮想fuxiang +腐朽fuxiu +抚恤fuxu +敷衍fuyan +扶养fuyang +抚养fuyang +俯仰fuyang +副业fuye +服役fuyi +复印fuyin +富有fuyou +赋有fuyou +赋于fuyu +抚育fuyu +富裕fuyu +赋予fuyu +复员fuyuan +复原fuyuan +负约fuyue +复杂fuza +负载fuzai +附则fuze +负责fuze +负债fuzhai +付帐fuzhang +复制fuzhi +扶植fuzhi +附中fuzhong +福州fuzhou +抚州fuzhou +附注fuzhu +辅助fuzhu +扶助fuzhu +服装fuzhuang +附着fuzhuo +富足fuzu +辅佐fuzuo +服务部fwb +服务态度fwtd +服务员fwy +方兴未艾fxwa +奋勇当先fydx +翻一番fyf +风言风语fyfy +发扬光大fygd +复印机fyj +发言人fyr +风雨同舟fytz +房租费fzf +副总理fzl +纺织品fzp +福州市fzs +反作用fzy +副作用fzy +负责制fzz +发展中国家fzzj +个g +国g +工g +过g +高g +干g +关g +各g +革g +公g +根g +更g +改g +管g +光g +广g +果g +格g +共g +搞g +夹*ga +噶ga +嘎ga +胳*ga +尬ga +尕ga +尜ga +旮ga +钆ga +公安部gab +改gai +该gai +盖gai +概gai +钙gai +溉gai +芥*gai +丐gai +陔gai +垓gai +戤gai +赅gai +改变gaibian +改编gaibian +该当gaidang +改道gaidao +改动gaidong +改革gaige +改观gaiguan +改过gaiguo +改悔gaihui +改建gaijian +改进gaijin +概况gaikuang +概括gaikuo +改良gailiang +概率gailu +概论gailun +概貌gaimao +概念gainian +改期gaiqi +改善gaishan +概述gaishu +概叹gaitan +改天gaitian +改选gaixuan +概要gaiyao +改造gaizao +改正gaizheng +改装gaizhuang +改组gaizu +公安局gaj +干gan +杆gan +感gan +敢gan +赶gan +甘gan +肝gan +秆gan +柑gan +竿gan +赣gan +乾*gan +坩gan +苷gan +尴gan +擀gan +泔gan +淦gan +澉gan +绀gan +橄gan +旰gan +矸gan +疳gan +酐gan +干部ganbu +感触ganchu +干脆gancui +敢当gandang +甘当gandang +感到gandao +感动gandong +感恩ganen +刚gang +钢gang +缸gang +纲gang +岗gang +港gang +杠gang +冈gang +肛gang +扛*gang +戆gang +罡gang +筻gang +尴尬ganga +港澳gangao +刚才gangcai +钢材gangcai +刚刚ganggang +刚好ganghao +港口gangkou +纲领gangling +岗哨gangshao +钢铁gangtie +港湾gangwan +岗位gangwei +港务gangwu +刚要gangyao +纲要gangyao +刚毅gangyi +干旱ganhan +感化ganhua +干活ganhuo +肝火ganhuo +感激ganji +干劲ganjin +赶紧ganjin +干净ganjing +感觉ganjue +感慨gankai +甘苦ganku +赶快gankuai +赶忙ganmang +感冒ganmao +感情ganqing +感染ganran +干扰ganrao +干涉ganshe +干事ganshi +感受ganshou +甘肃gansu +感叹gantan +干线ganxian +感想ganxiang +敢想ganxiang +感谢ganxie +甘心ganxin +感性ganxing +感应ganying +敢于ganyu +干预ganyu +甘愿ganyuan +干燥ganzao +感召ganzhao +赣州ganzhou +敢做ganzuo +高gao +搞gao +告gao +稿gao +膏gao +篙gao +皋gao +羔gao +糕gao +镐gao +睾gao +诰gao +郜gao +藁gao +缟gao +槔gao +槁gao +杲gao +锆gao +高矮gaoai +高昂gaoang +告别gaobie +高产gaochan +高超gaochao +高潮gaochao +告成gaocheng +告辞gaoci +高大gaoda +高档gaodang +高等gaodeng +高地gaodi +高低gaodi +糕点gaodian +高度gaodu +告发gaofa +高峰gaofeng +高高gaogao +高歌gaoge +高贵gaogui +高喊gaohan +搞好gaohao +高呼gaohu +搞坏gaohuai +高级gaoji +告急gaoji +高价gaojia +高见gaojian +稿件gaojian +告捷gaojie +告诫gaojie +高龄gaoling +高楼gaolou +告密gaomi +高明gaoming +高能gaoneng +高攀gaopan +高频gaopin +高强gaoqiang +高山gaoshan +高尚gaoshang +高深gaoshen +告示gaoshi +高耸gaosong +高速gaosu +告诉gaosu +高温gaowen +高小gaoxiao +高校gaoxiao +高兴gaoxing +膏药gaoyao +高原gaoyuan +高涨gaozhang +高招gaozhao +高中gaozhong +告终gaozhong +告状gaozhuang +稿子gaozi +港澳同胞gatb +怪不得gbd +各部门gbm +各部委gbw +供不应求gbyq +故步自封gbzf +共产党gcd +共产党员gcdy +工程师gcs +顾此失彼gcsb +贯彻执行gczx +共产主义gczy +各地方gdf +各大军区gdjq +广东省gds +高档商品gdsp +各单位gdw +高等院校gdyx +固定资产gdzc +个ge +各ge +革ge +合*ge +格ge +割ge +歌ge +隔ge +盖*ge +哥ge +铬ge +阁ge +戈ge +葛ge +搁ge +鸽ge +胳ge +疙ge +蛤ge +咯*ge +屹*ge +鬲ge +仡ge +哿ge +圪ge +塥ge +嗝ge +纥*ge +搿ge +膈ge +硌ge +镉ge +袼ge +颌*ge +虼ge +舸ge +骼ge +隔壁gebi +戈壁gebi +个别gebie +歌唱gechang +各处gechu +革除gechu +疙瘩geda +各地gedi +格调gediao +隔断geduan +个个gege +各个gege +各国geguo +隔阂gehe +歌喉gehou +各级geji +各界gejie +格局geju +割据geju +隔绝gejue +各类gelei +隔离geli +割裂gelie +格律gelu +革命geming +隔膜gemo +给gei +根gen +跟gen +亘gen +茛gen +哏gen +艮gen +根本genben +根除genchu +根底gendi +更geng +耕geng +颈geng +庚geng +羹geng +埂geng +耿geng +梗geng +哽geng +赓geng +绠geng +鲠geng +耕地gengdi +更迭gengdie +更动gengdong +更多gengduo +更改genggai +梗概genggai +更高genggao +更换genghuan +更加gengjia +更为gengwei +颈项gengxiang +更新gengxin +哽咽gengyan +耕耘gengyun +更正gengzheng +耿直gengzhi +梗直gengzhi +耕种gengzhong +梗阻gengzu +耕作gengzuo +根基genji +根据genju +跟前genqian +跟随gensui +根源genyuan +根治genzhi +跟着genzhuo +根子genzi +跟踪genzong +搁浅geqian +歌曲gequ +个人geren +格式geshi +歌颂gesong +个体geti +格外gewai +各位gewei +歌舞gewu +阁下gexia +各项gexiang +革新gexin +个性gexing +格言geyan +各样geyang +歌咏geyong +搁置gezhi +各种gezhong +各族gezu +国防部gfb +各方面gfm +格格不入ggbr +归根到底ggdd +恭恭敬敬ggjj +滚瓜烂熟ggls +歌功颂德ggsd +共和国ghg +各行各业ghgy +干劲冲天gjct +各级党委gjdw +各级领导gjld +国家利益gjly +国计民生gjms +工具书gjs +各尽所能gjsn +国库券gkq +工矿企业gkqy +孤陋寡闻glgw +规律性glx +国民党gmd +革命化gmh +革命家gmj +国民经济gmjj +购买力gml +光明磊落gmll +光明日报gmrb +顾名思义gmsy +冠冕堂皇gmth +刮目相看gmxk +光明正大gmzd +工农兵gnb +国内外gnw +工农业gny +工gong +公gong +共gong +供gong +功gong +攻gong +红*gong +巩gong +贡gong +汞gong +宫gong +恭gong +龚gong +躬gong +弓gong +拱gong +珙gong +肱gong +蚣gong +觥gong +公安gongan +公报gongbao +工本gongben +公布gongbu +公差gongcha +公拆gongchai +工厂gongchang +功臣gongchen +工程gongcheng +共处gongchu +供词gongci +共存gongcun +公道gongdao +公德gongde +功德gongde +工地gongdi +公敌gongdi +宫殿gongdian +攻读gongdu +公费gongfei +公愤gongfen +工夫gongfu +功夫gongfu +公告gonggao +公共gonggong +巩固gonggu +公关gongguan +公害gonghai +公函gonghan +共和gonghe +工会gonghui +供给gongji +共计gongji +攻击gongji +功绩gongji +公家gongjia +公斤gongjin +恭敬gongjing +工具gongju +公开gongkai +功课gongke +公款gongkuan +功劳gonglao +公理gongli +公里gongli +公历gongli +公路gonglu +功率gonglu +公民gongmin +共鸣gongming +公墓gongmu +功能gongneng +工农gongnong +公判gongpan +公平gongping +公仆gongpu +供求gongqiu +工区gongqu +公然gongran +工人gongren +公认gongren +供认gongren +工伤gongshang +公社gongshe +公审gongshen +工时gongshi +公事gongshi +共事gongshi +公式gongshi +公署gongshu +公司gongsi +公私gongsi +公诉gongsu +宫廷gongting +共同gongtong +恭维gongwei +公文gongwen +公物gongwu +公务gongwu +恭喜gongxi +贡献gongxian +工效gongxiao +功效gongxiao +供销gongxiao +共性gongxing +工序gongxu +共需gongxu +功勋gongxun +供养gongyang +工业gongye +工艺gongyi +供应gongying +公用gongyong +共有gongyou +公元gongyuan +公园gongyuan +公约gongyue +公允gongyun +公债gongzhai +公章gongzhang +共振gongzhen +工整gongzheng +公正gongzheng +公证gongzheng +供职gongzhi +公众gongzhong +工资gongzi +工作gongzuo +够gou +构gou +沟gou +句*gou +狗gou +钩gou +勾gou +购gou +苟gou +垢gou +佝gou +诟gou +岣gou +遘gou +媾gou +缑gou +枸gou +觏gou +彀gou +笱gou +篝gou +鞲gou +构成goucheng +勾搭gouda +勾当goudang +媾和gouhe +沟壑gouhe +构件goujian +勾结goujie +购买goumai +苟且gouqie +构思gousi +沟通goutong +勾通goutong +构陷gouxian +勾销gouxiao +购销gouxiao +勾引gouyin +构造gouzao +购置gouzhi +钩子gouzi +国庆节gqj +共青团gqt +光荣榜grb +根深蒂固gsdg +瓜熟蒂落gsdl +公使馆gsg +各式各样gsgy +甘肃省gss +工商业gsy +个体户gth +改头换面gthm +高谈阔论gtkl +鼓gu +固gu +古gu +骨gu +故gu +顾gu +股gu +谷gu +估gu +雇gu +孤gu +姑gu +贾*gu +辜gu +菇gu +咕gu +箍gu +沽gu +蛊gu +嘏gu +诂gu +菰gu +呱gu +崮gu +汩gu +梏gu +轱gu +牯gu +牿gu +臌gu +毂gu +瞽gu +罟gu +钴gu +锢gu +鸪gu +鹄*gu +痼gu +蛄gu +酤gu +觚gu +鲴gu +鹘gu +挂gua +刮gua +瓜gua +括*gua +剐gua +寡gua +褂gua +卦gua +诖gua +呱gua +栝gua +胍gua +鸹gua +瓜分guafen +瓜葛guage +挂号guahao +怪guai +乖guai +拐guai +乖舛guaichuan +乖戾guaili +乖僻guaipi +乖巧guaiqiao +怪物guaiwu +怪异guaiyi +拐杖guaizhang +挂名guaming +关guan +管guan +观guan +官guan +灌guan +贯guan +惯guan +冠guan +馆guan +罐guan +棺guan +纶*guan +倌guan +莞guan +掼guan +涫guan +盥guan +鹳guan +矜guan +鳏guan +关闭guanbi +观测guance +观察guancha +贯彻guanche +贯穿guanchuan +管道guandao +官邸guandi +观点guandian +官方guanfang +光guang +广guang +逛guang +咣guang +犷guang +桄guang +胱guang +灌溉guangai +光标guangbiao +广播guangbo +广博guangbo +光彩guangcai +广场guangchang +光大guangda +广大guangda +广东guangdong +广度guangdu +广泛guangfan +广告guanggao +光顾guanggu +光滑guanghua +光辉guanghui +光景guangjing +广阔guangkuo +光芒guangmang +广袤guangmao +光明guangming +光盘guangpan +光谱guangpu +光荣guangrong +观光guanguang +广西guangxi +光线guangxian +广义guangyi +光阴guangyin +光涌guangyong +广州guangzhou +关怀guanhuai +挂念guanian +管家guanjia +关键guanjian +管教guanjiao +关节guanjie +冠军guanjun +关卡guanka +观看guankan +关口guankou +管理guanli +贯例guanli +惯例guanli +官吏guanli +关联guanlian +官僚guanliao +观摩guanmo +灌木guanmu +官能guanneng +观念guannian +关切guanqie +观赏guanshang +管事guanshi +管束guanshu +灌输guanshu +关税guanshui +官司guansi +贯通guantong +关头guantou +观望guanwang +关系guanxi +管辖guanxia +官衔guanxian +关心guanxin +惯性guanxing +关押guanya +惯用guanyong +关于guanyu +官员guanyuan +观战guanzhan +关照guanzhao +管制guanzhi +观止guanzhi +观众guanzhong +关注guanzhu +贯注guanzhu +馆子guanzi +挂失guashi +挂帅guashuai +鼓吹guchui +故此guci +古代gudai +孤单gudan +故地gudi +古典gudian +固定guding +鼓动gudong +股东gudong +古董gudong +孤独gudu +咕嘟gudu +孤儿guer +股份gufen +辜负gufu +骨干gugan +雇工gugong +故宫gugong +古怪guguai +蛊惑guhuo +规gui +贵gui +归gui +硅gui +鬼gui +轨gui +龟gui +桂gui +瑰gui +圭gui +闺gui +诡gui +癸gui +柜gui +跪gui +刽gui +傀*gui +炔*gui +匦gui +刿gui +庋gui +宄gui +妫gui +桧gui +炅gui +晷gui +皈gui +簋gui +鲑gui +鳜gui +诡辩guibian +贵宾guibin +归并guibing +规程guicheng +归档guidang +轨道guidao +规定guiding +归队guidui +规范guifan +规格guige +归公guigong +归功guigong +桂冠guiguan +归国guiguo +规划guihua +鬼话guihua +归还guihuan +诡计guiji +轨迹guiji +贵贱guijian +归咎guijiu +规矩guiju +瑰丽guili +鬼脸guilian +龟裂guilie +规律guilu +诡秘guimi +规模guimo +归纳guina +闺女guinu +规劝guiquan +贵人guiren +归属guishu +龟缩guisuo +柜台guitai +闺秀guixiu +归于guiyu +规则guize +规章guizhang +贵重guizhong +贵州guizhou +鬼子guizi +贵族guizu +归罪guizui +顾及guji +估计guji +古迹guji +顾忌guji +估价gujia +古今gujin +古旧gujiu +故旧gujiu +故居guju +顾客guke +孤苦guku +古老gulao +孤立guli +鼓励guli +估量guliang +顾虑gulu +估摸gumo +滚gun +辊gun +棍gun +衮gun +绲gun +磙gun +鲧gun +滚动gundong +姑娘guniang +雇农gunong +滚烫guntang +棍子gunzi +国guo +过guo +果guo +锅guo +郭guo +涡*guo +裹guo +馘guo +埚guo +掴guo +呙guo +帼guo +崞guo +猓guo +椁guo +虢guo +聒guo +蜾guo +蝈guo +过半guoban +国策guoce +国产guochan +过程guocheng +过错guocuo +过度guodu +过渡guodu +果断guoduan +国法guofa +国防guofang +过分guofen +果腹guofu +果敢guogan +国歌guoge +过关guoguan +过后guohou +国会guohui +国际guoji +国籍guoji +国家guojia +国界guojie +国境guojing +国库guoku +过来guolai +过量guoliang +过虑guolu +锅炉guolu +国民guomin +过目guomu +果木guomu +国难guonan +国内guonei +果皮guopi +果品guopin +国旗guoqi +过期guoqi +国情guoqing +国庆guoqing +过去guoqu +果然guoran +过少guoshao +过甚guoshen +过剩guosheng +过时guoshi +国事guoshi +过失guoshi +果实guoshi +过头guotou +国外guowai +国王guowang +过问guowen +国务guowu +过细guoxi +国药guoyao +国营guoying +过硬guoying +过于guoyu +果园guoyuan +果真guozhen +锅子guozi +顾盼gupan +孤僻gupi +股票gupiao +骨气guqi +姑且guqie +顾全guquan +固然guran +古人guren +骨肉gurou +故事gushi +股市gushi +固守gushou +估算gusuan +固体guti +骨头gutou +故土gutu +顾问guwen +古文guwen +谷物guwu +鼓舞guwu +姑息guxi +故乡guxiang +故意guyi +雇佣guyong +固有guyou +雇员guyuan +鼓掌guzhang +故障guzhang +固执guzhi +拐弯抹角gwmj +国务委员gwwy +国务院gwy +改邪归正gxgz +更新换代gxhd +各行其事gxqs +感性认识gxrs +广西壮族gxzz +工业化gyh +工艺流程gylc +工艺美术gyms +工业品gyp +工艺品gyp +贵阳市gys +公有制gyz +各种各样gzgy +工资级别gzjb +各族人民gzrm +工作上gzs +广州市gzs +贵州省gzs +各自为政gzwz +高瞻远瞩gzyz +高瞻远嘱gzyz +工作者gzz +和h +会h +后h +化h +好h +合h +还h +活h +很h +回h +号h +毫h +花h +或h +海h +话h +红h +火h +黄h +害h +哈ha +蛤*ha +虾*ha +铪ha +哈达hada +还hai +海hai +害hai +孩hai +骸hai +氦hai +亥hai +骇hai +嘿*hai +咳*hai +嗨hai +胲hai +醢hai +海岸haian +海拔haiba +海报haibao +害虫haichong +害处haichu +海岛haidao +海港haigang +海关haiguan +还好haihao +海疆haijiang +海军haijun +海浪hailang +海绵haimian +害怕haipa +海上haishang +还是haishi +海外haiwai +海湾haiwan +海峡haixia +海啸haixiao +害羞haixiu +海洋haiyang +还要haiyao +还有haiyou +海域haiyu +海员haiyuan +孩子haizi +含han +焊han +旱han +喊han +汉han +寒han +汗han +函han +韩han +酣han +憨han +邯han +涵han +罕han +翰han +撼han +捍han +憾han +悍han +邗han +菡han +撖han +阚han +瀚han +晗han +焓han +顸han +颔han +蚶han +鼾han +寒潮hanchao +寒带handai +行*hang +航hang +夯hang +杭hang +吭*hang +巷*hang +沆hang +绗hang +珩hang +颃hang +航标hangbiao +航程hangcheng +航船hangchuan +行当hangdang +航道hangdao +航海hanghai +行家hangjia +行距hangju +航空hangkong +行列hanglie +航路hanglu +航模hangmo +函购hangou +行情hangqing +航天hangtian +航线hangxian +航向hangxiang +航行hangxing +航运hangyun +杭州hangzhou +含糊hanhu +含混hanhun +旱季hanji +函件hanjian +罕见hanjian +汉奸hanjian +喊叫hanjiao +焊接hanjie +寒冷hanleng +翰林hanlin +寒流hanliu +函授hanshou +函数hanshu +酣睡hanshui +寒酸hansuan +捍卫hanwei +含蓄hanxu +寒暄hanxuan +涵养hanyang +含义hanyi +涵义hanyi +汉语hanyu +含冤hanyuan +旱灾hanzai +汉字hanzi +汉族hanzu +好hao +号hao +毫hao +耗hao +豪hao +郝hao +浩hao +镐*hao +壕hao +嚎hao +貉*hao +蒿hao +薅hao +嗥hao +嚆hao +濠hao +灏hao +昊hao +皓hao +颢hao +蚝hao +好比haobi +毫不haobu +号称haocheng +好处haochu +浩大haoda +好歹haodai +浩荡haodang +好的haode +浩繁haofan +耗费haofei +好感haogan +好汉haohan +豪华haohua +好坏haohuai +号角haojiao +耗竭haojie +豪杰haojie +浩劫haojie +好看haokan +毫厘haoli +号令haoling +号码haoma +豪迈haomai +毫毛haomao +毫米haomi +浩淼haomiao +好奇haoqi +豪强haoqiang +豪情haoqing +好人haoren +豪绅haoshen +毫升haosheng +好事haoshi +豪爽haoshuang +好似haosi +耗损haosun +号啕haotao +好听haoting +好玩haowan +毫无haowu +好象haoxiang +好些haoxie +好样haoyang +好意haoyi +号召haozhao +好转haozhuan +汇编程序hbcx +货币回笼hbhl +货币流通hblt +河北省hbs +湖北省hbs +汇编语言hbyy +或多或少hdhs +海淀区hdq +和he +合he +河he +何he +核he +赫he +荷he +褐he +喝he +贺he +呵he +禾he +吓*he +盒he +菏he +貉he +阂he +涸he +鹤he +诃he +劾he +壑he +嗬he +阖he +纥he +曷he +盍he +颌he +蚵he +翮he +和蔼heai +哈尔滨heb +合办heban +荷包hebao +河北hebei +何必hebi +合并hebing +哈尔滨市hebs +何不hebu +喝彩hecai +合唱hechang +何尝hechang +合成hecheng +呵斥hechi +何处hechu +河川hechuan +河床hechuang +贺词heci +何等hedeng +贺电hedian +核定heding +核对hedui +合法hefa +何妨hefang +合肥hefei +合格hege +和好hehao +赫赫hehe +合乎hehu +合伙hehuo +黑hei +嘿hei +黑暗heian +黑白heibai +黑帮heibang +嘿嘿heihei +黑人heiren +黑色heise +黑市heishi +黑夜heiye +合计heji +核计heji +和解hejie +合金hejin +何苦heku +何况hekuang +合理heli +合力heli +合流heliu +河流heliu +合谋hemou +和睦hemu +很hen +狠hen +痕hen +恨hen +河南henan +狠毒hendu +很多henduo +河内henei +行*heng +横heng +衡heng +恒heng +哼heng +亨heng +蘅heng +珩*heng +桁heng +横财hengcai +哼哧hengchi +横幅hengfu +横亘henggen +横贯hengguan +横祸henghuo +横加hengjia +衡量hengliang +横蛮hengman +横批hengpi +衡器hengqi +横扫hengsao +横竖hengshu +恒心hengxin +横行hengxing +恒星hengxing +很好henhao +贺年henian +痕迹henji +很快henkuai +狠心henxin +狠抓henzhua +和平heping +和气heqi +河渠hequ +赫然heran +河山heshan +和尚heshang +合适heshi +核实heshi +合算hesuan +核算hesuan +河滩hetan +合同hetong +贺喜hexi +和谐hexie +核心hexin +贺信hexin +和煦hexu +何以heyi +合影heying +合营heying +核准hezhun +合资hezi +赫兹hezi +合作hezuo +合法权益hfqy +合肥市hfs +宏观世界hgsj +化公为私hgws +好高务远hgwy +核工业部hgyb +海关总署hgzs +后顾之忧hgzy +呼和浩特hhht +轰轰烈烈hhll +换句话说hjhs +黄金时代hjsd +环境卫生hjws +后继有人hjyr +海枯石烂hksl +合理化hlh +糊里糊涂hlht +黑龙江hlj +汗流浃背hljb +汗马功劳hmgl +海南岛hnd +河南省hns +湖南省hns +红hong +洪hong +轰hong +烘hong +哄hong +虹hong +鸿hong +宏hong +弘hong +黉hong +訇hong +讧hong +荭hong +蕻hong +薨hong +闳hong +泓hong +红尘hongchen +轰动hongdong +洪都hongdu +洪峰hongfeng +鸿沟honggou +宏观hongguan +红光hongguang +红花honghua +红军hongjun +红利hongli +洪亮hongliang +轰隆honglong +弘论honglun +鸿毛hongmao +轰鸣hongming +哄骗hongpian +红旗hongqi +红人hongren +红色hongse +洪水hongshui +哄抬hongtai +宏图hongtu +宏伟hongwei +红星hongxing +弘扬hongyang +鸿运hongyun +红晕hongyun +轰炸hongzha +后hou +候hou +厚hou +侯hou +喉hou +猴hou +吼hou +堠hou +後hou +逅hou +瘊hou +篌hou +糇hou +鲎hou +骺hou +后备houbei +后辈houbei +后边houbian +厚薄houbo +候补houbu +后尘houchen +后代houdai +厚道houdao +厚度houdu +后盾houdun +后方houfang +后果houguo +后患houhuan +后悔houhui +后记houji +后进houjin +后劲houjin +后来houlai +喉咙houlong +后门houmen +后面houmian +后期houqi +后勤houqin +后人houren +喉舌houshe +厚实houshi +后嗣housi +后台houtai +后天houtian +后退houtui +后续houxu +候选houxuan +后裔houyi +后缀houzhui +和平共处hpgc +黄埔江hpj +后勤部hqb +何去何从hqhc +合情合理hqhl +好容易hry +好事多磨hsdm +胡思乱想hslx +航天工业部htgb +昏头昏脑hthn +欢天喜地htxd +和*hu +护hu +互hu +湖hu +呼hu +户hu +弧hu +乎hu +胡hu +糊hu +虎hu +忽hu +核*hu +瑚hu +戏*hu +壶hu +葫hu +蝴hu +狐hu +唬hu +沪hu +冱hu +唿hu +囫hu +岵hu +猢hu +怙hu +惚hu +浒hu +滹hu +琥hu +槲hu +轷hu +觳hu +烀hu +煳hu +戽hu +扈hu +祜hu +瓠hu +鹄hu +鹕hu +鹱hu +笏hu +醐hu +斛hu +化hua +花hua +话hua +划hua +滑hua +华hua +画hua +哗hua +猾hua +豁*hua +骅hua +桦hua +砉hua +铧hua +画报huabao +华北huabei +哗变huabian +话柄huabing +划拨huabo +划策huace +画册huace +华东huadong +花朵huaduo +花儿huaer +化肥huafei +花费huafei +划分huafen +化工huagong +华贵huagui +化合huahe +花卉huahui +坏huai +怀huai +划*huai +淮huai +槐huai +徊huai +踝huai +怀抱huaibao +淮北huaibei +坏处huaichu +怀古huaigu +淮海huaihai +怀恨huaihen +怀旧huaijiu +淮南huainan +怀念huainian +坏人huairen +坏事huaishi +怀疑huaiyi +怀着huaizhe +滑稽huaji +画家huajia +话剧huaju +哗啦huala +画廊hualang +华丽huali +画面huamian +化名huaming +还*huan +环huan +换huan +欢huan +缓huan +患huan +幻huan +焕huan +桓huan +唤huan +痪huan +豢huan +涣huan +宦huan +郇huan +奂huan +萑huan +擐huan +圜huan +獾huan +洹huan +浣huan +漶huan +寰huan +逭huan +缳huan +锾huan +鲩huan +鬟huan +华南huanan +欢畅huanchang +缓冲huanchong +幻灯huandeng +欢度huandu +焕发huanfa +黄huang +簧huang +荒huang +皇huang +慌huang +蝗huang +磺huang +凰huang +惶huang +煌huang +晃huang +幌huang +恍huang +谎huang +隍huang +徨huang +湟huang +潢huang +遑huang +璜huang +肓huang +癀huang +蟥huang +篁huang +鳇huang +磺胺huangan +皇朝huangchao +荒诞huangdan +晃荡huangdang +皇帝huangdi +荒废huangfei +黄海huanghai +黄河huanghe +恍惚huanghu +谎话huanghua +黄昏huanghun +黄金huangjin +皇历huangli +荒凉huangliang +荒乱huangluan +慌乱huangluan +慌忙huangmang +荒谬huangmiu +恍然huangran +黄色huangse +黄山huangshan +皇上huangshang +荒唐huangtang +环顾huangu +宦官huanguan +谎言huangyan +慌张huangzhang +幌子huangzi +缓和huanhe +欢呼huanhu +环环huanhuan +滑腻huani +花鸟huaniao +还给huanji +缓急huanji +还价huanjia +环节huanjie +环境huanjing +幻境huanjing +幻景huanjing +欢聚huanju +幻觉huanjue +欢乐huanle +缓慢huanman +患难huannan +唤起huanqi +缓期huanqi +欢庆huanqing +环球huanqiu +寰球huanqiu +换取huanqu +环绕huanrao +涣散huansan +欢声huansheng +环视huanshi +欢送huansong +换算huansuan +欢腾huanteng +欢喜huanxi +幻想huanxiang +欢笑huanxiao +欢心huanxin +欢欣huanxin +环行huanxing +缓刑huanxing +唤醒huanxing +幻影huanying +欢迎huanying +寰宇huanyu +还原huanyuan +患者huanzhe +滑坡huapo +花腔huaqiang +华侨huaqiao +划清huaqing +花圈huaquan +划拳huaquan +哗然huaran +华人huaren +花色huase +化身huashen +化石huashi +划算huasuan +话题huati +滑头huatou +花纹huawen +华夏huaxia +化纤huaxian +画像huaxiang +花絮huaxu +化学huaxue +画押huaya +化验huayan +花样huayang +华裔huayi +话音huayin +话语huayu +花园huayuan +画展huazhan +花招huazhao +华中huazhong +化装huazhuang +化妆huazhuang +湖北hubei +胡扯huche +弧度hudu +忽而huer +呼喊huhan +呼号huhao +呼唤huhuan +互惠huhui +会hui +回hui +灰hui +挥hui +辉hui +汇hui +毁hui +慧hui +恢hui +绘hui +惠hui +徽hui +溃*hui +堕*hui +徊*hui +蛔hui +悔hui +卉hui +晦hui +贿hui +秽hui +烩hui +讳hui +诲hui +诙hui +茴hui +荟hui +蕙hui +咴hui +哕hui +喙hui +隳hui +洄hui +浍hui +彗hui +缋hui +珲hui +桧*hui +晖hui +恚hui +虺hui +蟪hui +麾hui +灰暗huian +回报huibao +汇报huibao +回避huibi +汇编huibian +会场huichang +回潮huichao +灰尘huichen +回春huichun +荟萃huicui +回答huida +回荡huidang +回电huidian +汇兑huidui +挥发huifa +汇费huifei +会风huifeng +回复huifu +恢复huifu +悔改huigai +回顾huigu +惠顾huigu +悔过huiguo +会合huihe +回合huihe +汇合huihe +悔恨huihen +恢弘huihong +会话huihua +回话huihua +绘画huihua +毁坏huihuai +辉煌huihuang +挥霍huihuo +会集huiji +回击huiji +汇集huiji +回家huijia +会见huijian +会聚huiju +汇聚huiju +回扣huikou +汇款huikuan +回来huilai +回笼huilong +汇率huilu +贿赂huilu +会面huimian +毁灭huimie +回民huimin +汇票huipiao +回去huiqu +挥洒huisa +灰色huise +晦涩huise +回收huishou +回首huishou +会谈huitan +会堂huitang +会同huitong +回头huitou +回味huiwei +会晤huiwu +挥舞huiwu +悔悟huiwu +麾下huixia +回想huixiang +回响huixiang +诙谐huixie +灰心huixin +彗星huixing +会演huiyan +汇演huiyan +会议huiyi +回忆huiyi +回音huiyin +辉映huiying +会员huiyuan +会战huizhan +徽章huizhang +会诊huizhen +绘制huizhi +回转huizhuan +汇总huizong +回族huizu +户籍huji +呼叫hujiao +户口hukou +虎口hukou +护理huli +互利huli +护林hulin +呼噜hulu +胡乱huluan +忽略hulue +互勉humian +混hun +浑hun +荤hun +昏hun +婚hun +魂hun +诨hun +馄hun +阍hun +溷hun +湖南hunan +胡闹hunao +昏沉hunchen +混合hunhe +浑厚hunhou +昏黄hunhuang +混迹hunji +婚礼hunli +混乱hunluan +糊弄hunong +婚配hunpei +混入hunru +浑身hunshen +混同huntong +混淆hunxiao +婚姻hunyin +昏庸hunyong +混杂hunza +混帐hunzhang +混浊hunzhuo +浑浊hunzhuo +和*huo +活huo +或huo +火huo +货huo +获huo +伙huo +霍huo +豁huo +惑huo +祸huo +劐huo +藿huo +攉huo +嚯huo +夥huo +钬huo +锪huo +镬huo +耠huo +蠖huo +火把huoba +伙伴huoban +火暴huobao +货币huobi +火柴huochai +火车huoche +豁达huoda +获得huode +霍地huodi +活动huodong +伙房huofang +祸根huogen +祸害huohai +火候huohou +火化huohua +火花huohua +祸患huohuan +活活huohuo +伙计huoji +火箭huojian +火警huojing +火炬huoju +火坑huokeng +活力huoli +霍乱huoluan +活泼huopo +获取huoqu +豁然huoran +货色huose +火山huoshan +获胜huosheng +或是huoshi +伙食huoshi +祸首huoshou +伙同huotong +货物huowu +获悉huoxi +火线huoxian +活现huoxian +或许huoxu +火药huoyao +活页huoye +活跃huoyue +货运huoyun +火灾huozai +火葬huozang +或则huoze +或者huozhe +获准huozhun +湖泊hupo +忽然huran +呼声husheng +护士hushi +忽视hushi +湖水hushui +胡说hushuo +护送husong +胡同hutong +互通hutong +户头hutou +糊涂hutu +护卫huwei +呼吸huxi +互相huxiang +呼啸huxiao +虎穴huxue +护养huyang +呼应huying +呼吁huyu +护照huzhao +互助huzhu +毫无疑问hwyw +互相爱护hxah +横行霸道hxbd +互相帮助hxbz +欢欣鼓舞hxgw +候选人hxr +合作化hzh +杭州市hzs +化整为零hzwl +级j +就j +进j +加j +经j +家j +结j +阶j +间j +件j +及j +解j +较j +机j +军j +接j +教j +极j +九j +见j +基本国策jbgc +基本上jbs +据不完全统计jbwj +饥不择食jbzs +坚持不懈jcbx +集成电路jcdl +基础上jcs +绝大部分jdbf +坚定不移jdby +绝大多数jdds +鉴定会jdh +绝对化jdh +经得起jdq +见多识广jdsg +精打细算jdxs +接二连三jels +解放后jfh +解放军jfj +解放军报jfjb +解放前jfq +仅供参考jgck +机构改革jggg +坚固耐用jgny +襟怀坦白jhtb +计划性jhx +级ji +及ji +机ji +极ji +几ji +积ji +给ji +基ji +其*ji +记ji +己ji +期*ji +系*ji +革*ji +计ji +集ji +即ji +际ji +季ji +激ji +济ji +技ji +击ji +继ji +急ji +剂ji +既ji +纪ji +寄ji +挤ji +鸡ji +迹ji +绩ji +齐*ji +奇*ji +吉ji +脊ji +辑ji +籍ji +疾ji +肌ji +棘ji +畸ji +圾ji +稽ji +箕ji +饥ji +讥ji +姬ji +缉ji +汲ji +嫉ji +蓟ji +冀ji +伎ji +祭ji +悸ji +寂ji +忌ji +妓ji +藉ji +丌ji +亟ji +乩ji +剞ji +佶ji +偈ji +诘ji +墼ji +芨ji +芰ji +荠ji +蒺ji +蕺ji +掎ji +叽ji +咭ji +哜ji +唧ji +岌ji +嵴ji +洎ji +屐ji +骥ji +畿ji +玑ji +楫ji +殛ji +戟ji +戢ji +赍ji +觊ji +犄ji +齑ji +矶ji +羁ji +嵇ji +稷ji +瘠ji +虮ji +笈ji +笄ji +暨ji +跻ji +跽ji +霁ji +鲚ji +鲫ji +髻ji +麂ji +加jia +家jia +架jia +价jia +甲jia +夹jia +假jia +钾jia +贾jia +稼jia +驾jia +嘉jia +枷jia +佳jia +荚jia +颊jia +嫁jia +茄*jia +挟*jia +嘏*jia +伽jia +郏jia +葭jia +岬jia +浃jia +迦jia +珈jia +戛jia +胛jia +恝jia +铗jia +镓jia +痂jia +瘕jia +袷jia +蛱jia +笳jia +袈jia +跏jia +加班jiaban +甲板jiaban +加倍jiabei +甲虫jiachong +家畜jiachu +家当jiadang +家底jiadi +假定jiading +加法jiafa +家访jiafang +价格jiage +加工jiagong +佳话jiahua +家伙jiahuo +加急jiaji +嘉奖jiajiang +家教jiajiao +嫁接jiajie +佳节jiajie +假借jiajie +加紧jiajin +家境jiajing +家具jiaju +加剧jiaju +加快jiakuai +加仑jialun +加码jiama +假冒jiamao +家门jiamen +加密jiami +加冕jiamian +价目jiamu +间jian +件jian +见jian +建jian +坚jian +减jian +检jian +践jian +尖jian +简jian +碱jian +剪jian +艰jian +渐jian +肩jian +键jian +健jian +柬jian +鉴jian +剑jian +歼jian +监jian +兼jian +浅*jian +奸jian +箭jian +茧jian +舰jian +俭jian +笺jian +煎jian +缄jian +硷jian +拣jian +捡jian +荐jian +槛jian +贱jian +饯jian +溅jian +涧jian +僭jian +谏jian +谫jian +菅jian +蒹jian +搛jian +囝*jian +湔jian +蹇jian +謇jian +缣jian +枧jian +楗jian +戋jian +戬jian +牮jian +犍jian +毽jian +腱jian +睑jian +锏jian +鹣jian +裥jian +笕jian +翦jian +趼jian +踺jian +鲣jian +鞯jian +吉安jian +煎熬jianao +简报jianbao +渐变jianbian +简便jianbian +简编jianbian +鉴别jianbie +兼并jianbing +尖兵jianbing +剪裁jiancai +剪彩jiancai +检测jiance +检查jiancha +检察jiancha +监察jiancha +减产jianchan +建成jiancheng +简称jiancheng +坚持jianchi +简单jiandan +建党jiandang +减低jiandi +检点jiandian +间谍jiandie +坚定jianding +鉴定jianding +监督jiandu +间断jianduan +尖端jianduan +简短jianduan +舰队jiandui +健儿jianer +减法jianfa +肩负jianfu +将jiang +降jiang +讲jiang +强*jiang +江jiang +浆jiang +蒋jiang +奖jiang +疆jiang +僵jiang +姜jiang +桨jiang +匠jiang +酱jiang +茳jiang +洚jiang +绛jiang +缰jiang +犟jiang +礓jiang +耩jiang +糨jiang +豇jiang +奖杯jiangbei +疆场jiangchang +奖惩jiangcheng +僵持jiangchi +降低jiangdi +间隔jiange +讲稿jianggao +江湖jianghu +僵化jianghua +讲话jianghua +降级jiangji +降价jiangjia +讲解jiangjie +疆界jiangjie +将近jiangjin +奖金jiangjin +讲究jiangjiu +僵局jiangju +将军jiangjun +讲课jiangke +将来jianglai +讲理jiangli +奖励jiangli +降临jianglin +将领jiangling +降落jiangluo +江南jiangnan +奖品jiangpin +讲评jiangping +奖券jiangquan +江山jiangshan +讲师jiangshi +僵尸jiangshi +讲授jiangshou +讲述jiangshu +降水jiangshui +江苏jiangsu +讲台jiangtai +讲坛jiangtan +疆土jiangtu +坚固jiangu +兼顾jiangu +监管jianguan +建国jianguo +降温jiangwen +江西jiangxi +讲习jiangxi +匠心jiangxin +讲学jiangxue +讲演jiangyan +将要jiangyao +讲义jiangyi +僵硬jiangying +奖章jiangzhang +讲座jiangzuo +监护jianhu +简化jianhua +间或jianhuo +奸计jianji +歼击jianji +剪辑jianji +减价jianjia +渐渐jianjian +健将jianjiang +建交jianjiao +间接jianjie +见解jianjie +简介jianjie +简洁jianjie +简捷jianjie +渐进jianjin +监禁jianjin +检举jianju +艰巨jianju +坚决jianjue +健康jiankang +尖刻jianke +坚苦jianku +艰苦jianku +监牢jianlao +建立jianli +尖利jianli +简历jianli +简练jianlian +简陋jianlou +简略jianlue +健美jianmei +减免jianmian +歼灭jianmie +简明jianming +缄默jianmo +艰难jiannan +键盘jianpan +简拼jianpin +简朴jianpu +俭朴jianpu +坚强jianqiang +减轻jianqing +健全jianquan +兼任jianren +坚韧jianren +兼容jianrong +尖锐jianrui +减弱jianruo +艰涩jianse +鉴赏jianshang +减少jianshao +建设jianshe +艰深jianshen +见识jianshi +坚实jianshi +监视jianshi +建树jianshu +减速jiansu +检索jiansuo +践踏jianta +健谈jiantan +检讨jiantao +简体jianti +舰艇jianting +减退jiantui +健忘jianwang +间文jianwen +见闻jianwen +间隙jianxi +奸细jianxi +艰险jianxian +见效jianxiao +间歇jianxie +简写jianxie +坚信jianxin +艰辛jianxin +减刑jianxing +检修jianxiu +简讯jianxun +检验jianyan +简要jianyao +建议jianyi +坚毅jianyi +简易jianyi +奸淫jianyin +坚硬jianying +剪影jianying +鉴于jianyu +监狱jianyu +减员jianyuan +检阅jianyue +建造jianzao +简则jianze +坚贞jianzhen +监制jianzhi +简直jianzhi +兼职jianzhi +建筑jianzhu +简装jianzhuang +健壮jianzhuang +较jiao +教jiao +交jiao +角jiao +叫jiao +脚jiao +胶jiao +浇jiao +焦jiao +觉*jiao +校*jiao +搅jiao +酵jiao +郊jiao +铰jiao +窖jiao +椒jiao +礁jiao +骄jiao +娇jiao +嚼jiao +矫jiao +侥jiao +狡jiao +饺jiao +缴jiao +绞jiao +剿jiao +轿jiao +佼jiao +僬jiao +艽jiao +茭jiao +挢jiao +噍jiao +峤jiao +徼jiao +湫*jiao +姣jiao +敫jiao +皎jiao +鹪jiao +蛟jiao +醮jiao +跤jiao +鲛jiao +骄傲jiaoao +搅拌jiaoban +狡辩jiaobian +教材jiaocai +交叉jiaocha +教程jiaocheng +交错jiaocuo +较大jiaoda +交代jiaodai +交淡jiaodan +教导jiaodao +交点jiaodian +焦点jiaodian +校订jiaoding +角度jiaodu +校对jiaodui +较多jiaoduo +焦耳jiaoer +交锋jiaofeng +交付jiaofu +浇灌jiaoguan +娇贵jiaogui +叫喊jiaohan +较好jiaohao +叫好jiaohao +狡猾jiaohua +交换jiaohuan +叫唤jiaohuan +教诲jiaohui +缴获jiaohuo +交际jiaoji +矫健jiaojian +交接jiaojie +交界jiaojie +叫苦jiaoku +较快jiaokuai +教练jiaolian +较量jiaoliang +交流jiaoliu +搅乱jiaoluan +角落jiaoluo +叫骂jiaoma +剿灭jiaomie +酵母jiaomu +交纳jiaona +缴纳jiaona +娇嫩jiaonen +交配jiaopei +骄气jiaoqi +交情jiaoqing +郊区jiaoqu +叫嚷jiaorang +角色jiaose +交涉jiaoshe +教师jiaoshi +教授jiaoshou +教唆jiaosuo +脚踏jiaota +交谈jiaotan +教堂jiaotang +交替jiaoti +教条jiaotiao +交通jiaotong +郊外jiaowai +交往jiaowang +较为jiaowei +狡黠jiaoxia +叫嚣jiaoxiao +侥幸jiaoxing +绞刑jiaoxing +教学jiaoxue +教训jiaoxun +教养jiaoyang +骄阳jiaoyang +教益jiaoyi +交易jiaoyi +交谊jiaoyi +教育jiaoyu +教员jiaoyuan +狡诈jiaozha +校正jiaozheng +脚注jiaozhu +角逐jiaozhu +浇铸jiaozhu +校准jiaozhun +焦灼jiaozhuo +娇纵jiaozong +叫做jiaozuo +家谱jiapu +假期jiaqi +价钱jiaqian +加强jiaqiang +假日jiari +加入jiaru +假如jiaru +假若jiaruo +加上jiashang +假设jiashe +加深jiashen +假使jiashi +架势jiashi +驾驶jiashi +家属jiashu +假说jiashuo +加速jiasu +枷锁jiasuo +家庭jiating +家乡jiaxiang +假想jiaxiang +家业jiaye +加以jiayi +佳音jiayin +家用jiayong +加油jiayou +家园jiayuan +夹杂jiaza +加载jiazai +家长jiazhang +价值jiazhi +加重jiazhong +假装jiazhuang +嫁妆jiazhuang +架子jiazi +家族jiazu +击败jibai +羁绊jiban +几倍jibei +基本jiben +击毙jibi +级别jibie +疾病jibing +计策jice +基层jiceng +稽查jicha +机场jichang +集成jicheng +继承jicheng +计酬jichou +基础jichu +机床jichuang +几次jici +急促jicu +积存jicun +寄存jicun +极大jida +亟待jidai +激荡jidang +记得jide +基地jidi +机电jidian +极点jidian +基调jidiao +机动jidong +激动jidong +极度jidu +几度jidu +即度jidu +季度jidu +基督jidu +嫉妒jidu +忌妒jidu +极端jiduan +结jie +阶jie +解jie +接jie +节jie +家*jie +界jie +截jie +介jie +借jie +价*jie +届jie +街jie +揭jie +洁jie +杰jie +竭jie +皆jie +秸jie +劫jie +桔jie +捷jie +睫jie +姐jie +戒jie +藉jie +芥jie +疥jie +诫jie +楷*jie +偈*jie +讦jie +诘*jie +拮jie +喈jie +嗟jie +婕jie +孑jie +桀jie +碣jie +疖jie +颉jie +蚧jie +羯jie +鲒jie +骱jie +饥饿jie +结案jiean +洁白jiebai +接班jieban +捷报jiebao +戒备jiebei +结彩jiecai +节操jiecao +阶层jieceng +劫持jiechi +杰出jiechu +解除jiechu +接触jiechu +戒除jiechu +揭穿jiechuan +结存jiecun +解答jieda +接待jiedai +借贷jiedai +街道jiedao +解冻jiedong +阶段jieduan +截断jieduan +揭发jiefa +借方jiefang +解放jiefang +街坊jiefang +结构jiegou +解雇jiegu +借故jiegu +结果jieguo +结合jiehe +结核jiehe +结婚jiehun +阶级jieji +接见jiejian +节俭jiejian +借鉴jiejian +结交jiejiao +姐姐jiejie +接近jiejin +竭尽jiejin +结晶jiejing +捷径jiejing +洁净jiejing +解救jiejiu +结局jieju +解决jiejue +孑孓jiejue +解开jiekai +揭开jiekai +解渴jieke +接口jiekou +借口jiekou +借款jiekuan +竭力jieli +接连jielian +揭露jielu +戒律jielu +结论jielun +解闷jiemen +结盟jiemeng +界面jiemian +节目jiemu +揭幕jiemu +接纳jiena +解聘jiepin +解剖jiepou +节气jieqi +接洽jieqia +截取jiequ +既而jier +节日jieri +介入jieru +解散jiesan +介绍jieshao +节省jiesheng +届时jieshi +结实jieshi +解释jieshi +揭示jieshi +解手jieshou +接受jieshou +接收jieshou +结束jieshu +解说jieshuo +结算jiesuan +解体jieti +阶梯jieti +接替jieti +接头jietou +街头jietou +解脱jietuo +结尾jiewei +解围jiewei +接吻jiewen +解析jiexi +界线jiexian +界限jiexian +揭晓jiexiao +戒严jieyan +结业jieye +介意jieyi +接应jieying +结余jieyu +节约jieyue +结帐jiezhang +接着jiezhao +节制jiezhi +介质jiezhi +戒指jiezhi +借支jiezhi +截止jiezhi +借助jiezhu +节奏jiezou +杰作jiezuo +激发jifa +技法jifa +讥讽jifeng +几个jige +及格jige +技工jigong +记功jigong +机构jigou +叽咕jigu +机关jiguan +籍贯jiguan +极光jiguang +激光jiguang +记过jiguo +极好jihao +记号jihao +集合jihe +几何jihe +稽核jihe +几乎jihu +激化jihua +计划jihua +饥荒jihuang +机会jihui +集会jihui +击毁jihui +忌讳jihui +积极jiji +机件jijian +计件jijian +急件jijian +击剑jijian +即将jijiang +计较jijiao +季节jijie +急进jijin +基金jijin +机警jijing +即景jijing +寂静jijing +急救jijiu +积聚jiju +急剧jiju +急遽jiju +寄居jiju +季刊jikan +即刻jike +疾苦jiku +击溃jikui +积累jilei +极力jili +吉利jili +激励jili +伎俩jilia +计量jiliang +寂寥jiliao +激烈jilie +吉林jilin +机灵jiling +激流jiliu +记录jilu +纪律jilu +纪录jilu +辑录jilu +击落jiluo +急忙jimang +机密jimi +寂寞jimo +计谋jimou +进jin +金jin +近jin +紧jin +斤jin +今jin +尽jin +仅jin +劲jin +浸jin +禁jin +津jin +筋jin +锦jin +晋jin +巾jin +襟jin +谨jin +靳jin +烬jin +卺jin +荩jin +堇jin +噤jin +馑jin +廑jin +妗jin +缙jin +瑾jin +槿jin +赆jin +觐jin +衿jin +缉拿jina +济南jinan +禁闭jinbi +锦标jinbiao +进步jinbu +浸沉jinchen +进程jincheng +进出jinchu +紧凑jincou +近代jindai +劲敌jindi +进度jindu +金额jine +机能jineng +技能jineng +进而jiner +进犯jinfan +经jing +精jing +京jing +径jing +井jing +静jing +竟jing +晶jing +净jing +境jing +镜jing +景jing +警jing +劲*jing +茎jing +敬jing +惊jing +睛jing +竞jing +荆jing +兢jing +鲸jing +粳jing +痉jing +靖jing +刭jing +儆jing +阱jing +菁jing +獍jing +憬jing +泾jing +迳jing +弪jing +婧jing +肼jing +胫jing +腈jing +旌jing +靓*jing +敬爱jingai +警报jingbao +警备jingbei +精兵jingbing +精采jingcai +精彩jingcai +警察jingcha +经常jingchang +精粹jingcui +静电jingdian +经典jingdian +惊动jingdong +精度jingdu +经费jingfei +精干jinggan +竟敢jinggan +警告jinggao +经过jingguo +净化jinghua +精华jinghua +经济jingji +竞技jingji +荆棘jingji +精简jingjian +境界jingjie +警戒jingjie +经久jingjiu +惊恐jingkong +经理jingli +经历jingli +精力jingli +敬礼jingli +精练jinglian +精良jingliang +经络jingluo +精美jingmei +精密jingmi +精明jingming +进攻jingong +敬佩jingpei +精辟jingpi +景气jingqi +惊奇jingqi +精巧jingqiao +精确jingque +竟然jingran +竞赛jingsai +景色jingse +经商jingshang +精神jingshen +经手jingshou +经受jingshou +精髓jingsui +静态jingtai +惊叹jingtan +晶体jingti +警惕jingti +精通jingtong +镜头jingtou +筋骨jingu +禁锢jingu +尽管jinguan +巾帼jinguo +经委jingwei +警卫jingwei +敬畏jingwei +景物jingwu +精细jingxi +京戏jingxi +惊险jingxian +景象jingxiang +经销jingxiao +经心jingxin +精心jingxin +惊心jingxin +惊醒jingxing +竞选jingxuan +惊讶jingya +经验jingyan +敬仰jingyang +经营jingying +晶莹jingying +经由jingyou +境遇jingyu +精湛jingzhan +竞争jingzheng +精制jingzhi +径直jingzhi +精致jingzhi +静止jingzhi +净值jingzhi +竟址jingzhi +净重jingzhong +镜子jingzi +静坐jingzuo +近海jinhai +今后jinhou +近乎jinhu +进化jinhua +几年jinian +记念jinian +纪念jinian +晋级jinji +紧急jinji +近郊jinjiao +紧紧jinjin +仅仅jinjin +进军jinjun +进口jinkou +尽快jinkuai +近况jinkuang +进来jinlai +近来jinlai +尽力jinli +尽量jinliang +斤两jinliang +禁令jinling +劲旅jinlu +紧密jinmi +近年jinnian +今年jinnian +金牌jinpai +紧迫jinpo +近期jinqi +近前jinqian +金钱jinqian +尽情jinqing +进去jinqu +进取jinqu +禁区jinqu +近日jinri +今日jinri +金融jinrong +进入jinru +浸入jinru +谨慎jinshen +晋升jinsheng +今是jinshi +尽是jinshi +近视jinshi +金属jinshu +近似jinsi +紧缩jinsuo +今天jintian +津贴jintie +尽头jintou +劲头jintou +浸透jintou +进退jintui +今晚jinwan +今昔jinxi +尽心jinxin +进行jinxing +进修jinxiu +锦秀jinxiu +谨严jinyan +紧要jinyao +进展jinzhan +紧张jinzhang +今朝jinzhao +紧着jinzhe +禁止jinzhi +尽职jinzhi +进驻jinzhu +金子jinzi +炯jiong +窘jiong +迥jiong +炅*jiong +扃jiong +窘迫jiongpo +迥然jiongran +击破jipo +急迫jipo +及其jiqi +极其jiqi +激起jiqi +机器jiqi +机枪jiqiang +技巧jiqiao +急切jiqie +激情jiqing +汲取jiqu +集权jiquan +既然jiran +己任jiren +继任jiren +即日jiri +吉日jiri +肌肉jirou +极少jishao +寄生jisheng +即是jishi +及时jishi +几时jishi +计时jishi +即时jishi +即使jishi +记事jishi +基石jishi +集市jishi +级数jishu +基数jishu +计数jishu +记述jishu +技术jishu +祭祀jisi +激素jisu +急速jisu +计算jisuan +机体jiti +集体jiti +肌体jiti +几天jitian +集团jituan +寄托jituo +就jiu +九jiu +旧jiu +究jiu +久jiu +救jiu +酒jiu +纠jiu +揪jiu +玖jiu +韭jiu +灸jiu +厩jiu +臼jiu +舅jiu +咎jiu +疚jiu +僦jiu +啾jiu +阄jiu +柩jiu +桕jiu +鸠jiu +鹫jiu +赳jiu +鬏jiu +就餐jiucan +纠察jiucha +纠缠jiuchan +就此jiuci +就地jiudi +就范jiufan +纠纷jiufen +纠葛jiuge +救国jiuguo +救护jiuhu +救火jiuhuo +纠集jiuji +鸠集jiuji +救济jiuji +救急jiuji +九江jiujiang +九届jiujie +就近jiujin +酒精jiujing +究竟jiujing +救命jiuming +救生jiusheng +就是jiushi +就事jiushi +救亡jiuwang +久违jiuwei +酒窝jiuwo +酒席jiuxi +救险jiuxian +揪心jiuxin +救星jiuxing +就绪jiuxu +就学jiuxue +久仰jiuyang +就要jiuyao +就业jiuye +久远jiuyuan +九月jiuyue +救灾jiuzai +纠正jiuzheng +就职jiuzhi +救治jiuzhi +九洲jiuzhou +救助jiuzhu +极为jiwei +纪委jiwei +极限jixian +迹象jixiang +吉祥jixiang +讥笑jixiao +机械jixie +记性jixing +急性jixing +畸形jixing +即兴jixing +吉凶jixiong +几许jixu +积蓄jixu +继续jixu +记叙jixu +急需jixu +集训jixun +积压jiya +羁押jiya +给养jiyang +机要jiyao +纪要jiyao +给以jiyi +记忆jiyi +技艺jiyi +基因jiyin +急用jiyong +基于jiyu +急于jiyu +机遇jiyu +给予jiyu +寄予jiyu +觊觎jiyu +纪元jiyuan +集约jiyue +记载jizai +及早jizao +急躁jizao +激增jizeng +记帐jizhang +记者jizhe +集镇jizhen +机制jizhi +及至jizhi +机智jizhi +集中jizhong +击中jizhong +记住jizhu +基准jizhun +集资jizi +经济核算jjhs +聚精会神jjhs +将计就计jjjj +戒骄戒躁jjjz +近几年来jjnl +竭尽全力jjql +节假日jjr +积极性jjx +经济效益jjxy +兢兢业业jjyy +精简整编jjzb +叽叽喳喳jjzz +艰苦奋斗jkfd +尽可能jkn +教科书jks +俱乐部jlb +交流电jld +吉林省jls +价廉物美jlwm +纪律性jlx +纪念碑jnb +几年来jnl +近年来jnl +纪念品jnp +济南市jns +吉普车jpc +坚强不屈jqbq +奖勤罚懒jqfl +机器人jqr +急起直追jqzz +截然不同jrbt +兼容性jrx +积少成多jscd +金山公司jsgs +集思广益jsgy +精神焕发jshf +计算机jsj +尽善尽美jsjm +集市贸易jsmy +介绍人jsr +就是说jss +计算所jss +江苏省jss +举世闻名jswm +介绍信jsx +技术员jsy +计算中心jszx +交通部jtb +家庭出身jtcs +惊天动地jtdd +具体地说jtds +晶体管jtg +交通工具jtgj +脚踏实地jtsd +具体说来jtsl +具ju +据ju +局ju +举ju +车*ju +句ju +聚ju +距ju +巨ju +居ju +锯ju +剧ju +矩ju +拒ju +柜*ju +桔*ju +鞠ju +拘ju +狙ju +疽ju +驹ju +菊ju +咀ju +沮ju +踞ju +俱ju +惧ju +炬ju +倨ju +讵ju +苣ju +苴ju +莒ju +掬ju +遽ju +屦ju +琚ju +枸*ju +椐ju +榘ju +榉ju +橘ju +犋ju +飓ju +钜ju +锔ju +窭ju +裾ju +趄ju +醵ju +踽ju +龃ju +雎ju +瞿*ju +鞫ju +卷juan +捐juan +鹃juan +娟juan +倦juan +眷juan +绢juan +俊*juan +鄄juan +狷juan +涓juan +桊juan +蠲juan +锩juan +镌juan +隽juan +卷进juanjin +捐款juankuan +眷恋juanlian +眷念juannian +捐躯juanqu +卷入juanru +眷属juanshu +捐献juanxian +卷烟juanyan +卷帙juanzhi +捐助juanzhu +卷宗juanzong +举办juban +具备jubei +剧本juben +巨变jubian +局部jubu +拘捕jubu +剧场juchang +据此juci +巨大juda +举动judong +居多juduo +决jue +觉jue +绝jue +角*jue +脚*jue +掘jue +嚼*jue +撅jue +攫jue +抉jue +倔jue +爵jue +诀jue +厥jue +劂jue +谲jue +矍jue +蕨jue +嗟*jue +噘jue +噱jue +崛jue +獗jue +孓jue +珏jue +桷jue +橛jue +爝jue +镢jue +蹶jue +觖jue +巨额jue +诀别juebie +决不juebu +绝不juebu +决策juece +觉察juecha +觉得juede +决定jueding +决断jueduan +绝对juedui +绝迹jueji +倔强juejiang +绝交juejiao +绝径juejing +绝境juejing +绝句jueju +决裂juelie +绝路juelu +绝密juemi +绝妙juemiao +崛起jueqi +诀窍jueqiao +决赛juesai +绝食jueshi +决死juesi +决算juesuan +绝望juewang +爵位juewei +觉悟juewu +决心juexin +觉醒juexing +决议jueyi +绝缘jueyuan +抉择jueze +决战juezhan +绝招juezhao +绝症juezheng +巨幅jufu +居功jugong +鞠躬jugong +句号juhao +聚合juhe +聚会juhui +聚集juji +巨匠jujiang +拘谨jujin +拒绝jujue +咀嚼jujue +距离juli +举例juli +剧烈julie +拘留juliu +局面jumian +居民jumin +剧目jumu +军jun +均jun +菌jun +君jun +龟*jun +钧jun +峻jun +俊jun +竣jun +浚jun +郡jun +骏jun +捃jun +皲jun +筠jun +麇jun +军操juncao +君臣junchen +均等jundeng +军队jundui +军法junfa +军阀junfa +军服junfu +军港jungang +军工jungong +竣工jungong +均衡junheng +军火junhuo +拘泥juni +军机junji +军纪junji +军舰junjian +俊杰junjie +军垦junken +军粮junliang +军令junling +骏马junma +军民junmin +军旗junqi +峻峭junqiao +俊俏junqiao +军区junqu +军权junquan +军人junren +军事junshi +军师junshi +军属junshu +军团juntuan +军委junwei +军衔junxian +军校junxiao +军械junxie +军心junxin +俊秀junxiu +军需junxu +军训junxun +军医junyi +军营junying +军用junyong +军邮junyou +均匀junyun +军长junzhang +军政junzheng +君主junzhu +军装junzhuang +君子junzi +俱全juquan +居然juran +遽然juran +沮丧jusang +局势jushi +举手jushou +拘束jushu +据说jushuo +具体juti +剧团jutuan +据悉juxi +局限juxian +居心juxin +举行juxing +矩形juxing +巨型juxing +具有juyou +据有juyou +剧院juyuan +局长juzhang +剧照juzhao +举止juzhi +居中juzhong +剧终juzhong +巨著juzhu +居住juzhu +句子juzi +节外生枝jwsz +惊心动魄jxdp +继续革命jxgm +机械化jxh +江西省jxs +谨小慎微jxsw +局限性jxx +教育部jyb +进一步jyb +家用电器jydq +教育方针jyfz +家喻户晓jyhx +加以解决jyjj +记忆力jyl +精益求精jyqj +教研室jys +见义勇为jyyw +旧中国jzg +建筑物jzw +可k +开k +看k +克k +孔k +科k +口k +空k +苦k +快k +考k +刻k +靠k +况k +块k +困k +宽k +矿k +抗k +卡k +卡ka +喀ka +咖ka +咯ka +佧ka +咔ka +胩ka +喀嚓kacha +卡车kache +咖啡kafei +开kai +凯kai +揩kai +楷kai +慨kai +剀kai +垲kai +蒈kai +忾kai +恺kai +铠kai +锎kai +锴kai +开办kaiban +开遍kaibian +开采kaicai +开场kaichang +开车kaiche +开除kaichu +开创kaichuang +开导kaidao +开刀kaidao +开动kaidong +开端kaiduan +开发kaifa +开放kaifang +开封kaifeng +开赴kaifu +凯歌kaige +开关kaiguan +开航kaihang +开户kaihu +开花kaihua +开怀kaihuai +开荒kaihuang +开会kaihui +开掘kaijue +开垦kaiken +开口kaikou +开矿kaikuang +开阔kaikuo +开朗kailang +开郎kailang +开路kailu +开明kaiming +楷模kaimo +开幕kaimu +开炮kaipao +开辟kaipi +开启kaiqi +开枪kaiqiang +开窍kaiqiao +开设kaishe +开始kaishi +开庭kaiting +开头kaitou +开脱kaituo +开拓kaituo +开外kaiwai +开销kaixiao +开心kaixin +凯旋kaixuan +开学kaixue +开颜kaiyan +开业kaiye +开战kaizhan +开展kaizhan +开张kaizhang +开支kaizhi +看kan +刊kan +坎kan +槛*kan +堪kan +勘kan +砍kan +嵌*kan +侃kan +莰kan +阚*kan +戡kan +龛kan +瞰kan +勘测kance +勘察kancha +看出kanchu +看待kandai +看到kandao +刊登kandeng +看法kanfa +砍伐kanfa +抗kang +康kang +炕kang +慷kang +糠kang +扛kang +亢kang +伉kang +闶kang +钪kang +亢奋kangfen +康复kangfu +抗衡kangheng +抗击kangji +亢进kangjin +抗拒kangju +伉俪kangli +抗日kangri +看管kanguan +抗议kangyi +看见kanjian +坎坷kanke +看来kanlai +看齐kanqi +刊头kantou +看望kanwang +刊物kanwu +勘误kanwu +看样kanyang +刊载kanzai +考kao +靠kao +拷kao +烤kao +尻kao +栲kao +犒kao +铐kao +拷贝kaobei +靠边kaobian +考查kaocha +考察kaocha +考核kaohe +靠近kaojin +考究kaojiu +靠拢kaolong +考虑kaolu +考勤kaoqin +靠山kaoshan +考试kaoshi +考题kaoti +考验kaoyan +考证kaozheng +卡片kapian +看不惯kbg +看不起kbq +刻不容缓kbrh +开诚布公kcbg +矿产资源kczy +扩大化kdh +可ke +克ke +科ke +刻ke +客ke +壳ke +颗ke +棵ke +柯ke +呵*ke +坷ke +苛ke +磕ke +咳ke +渴ke +课ke +嗑ke +岢ke +恪ke +溘ke +骒ke +缂ke +珂ke +轲ke +氪ke +瞌ke +钶ke +锞ke +稞ke +疴ke +窠ke +颏ke +蝌ke +髁ke +可爱keai +科班keban +课本keben +可比kebi +刻薄kebo +可不kebu +客车keche +课程kecheng +可耻kechi +可恶kee +可风kefeng +可否kefou +克服kefu +可观keguan +客观keguan +可贵kegui +可好kehao +可恨kehen +刻划kehua +刻画kehua +克己keji +客机keji +科技keji +可见kejian +科教kejiao +可敬kejing +窠臼kejiu +科举keju +可靠kekao +苛刻keke +可口kekou +克扣kekou +刻苦keku +克拉kela +克朗kelang +颗粒keli +可怜kelian +科目kemu +肯ken +啃ken +垦ken +恳ken +裉ken +肯定kending +可能keneng +坑keng +吭keng +铿keng +坑道kengdao +坑害kenghai +铿锵kengqiang +恳切kenqie +恳求kenqiu +垦殖kenzhi +可怕kepa +磕碰kepeng +科普kepu +客气keqi +可亲keqin +可取kequ +客人keren +客商keshang +可是keshi +科室keshi +课堂ketang +客套ketao +课题keti +客体keti +客厅keting +磕头ketou +可望kewang +渴望kewang +可喜kexi +可惜kexi +可行kexing +科学kexue +科研keyan +可以keyi +可疑keyi +刻意keyi +科员keyuan +科长kezhang +可知kezhi +克制kezhi +狂风暴雨kfby +克己奉公kjfg +科技司kjs +苦口婆心kkpx +昆明市kms +可能性knx +孔kong +空kong +控kong +恐kong +倥kong +崆kong +箜kong +空白kongbai +恐怖kongbu +控拆kongchai +空洞kongdong +空额konge +空乏kongfa +控告konggao +空喊konghan +恐吓konghe +空话konghua +恐慌konghuang +空间kongjian +空降kongjiang +恐惧kongju +空军kongjun +空旷kongkuang +恐龙konglong +空虑konglu +恐怕kongpa +空气kongqi +空前kongqian +孔雀kongque +控诉kongsu +空谈kongtan +空头kongtou +空文kongwen +空隙kongxi +空闲kongxian +空想kongxiang +空虚kongxu +空运kongyun +控制kongzhi +空中kongzhong +口kou +扣kou +抠kou +寇kou +芤kou +蔻kou +叩kou +眍kou +筘kou +口岸kouan +叩拜koubai +口才koucai +扣除kouchu +口传kouchuan +口服koufu +口供kougong +口号kouhao +口红kouhong +口角koujiao +口径koujing +口诀koujue +口令kouling +扣留kouliu +口气kouqi +口腔kouqiang +口哨koushao +口试koushi +口述koushu +口头koutou +叩头koutou +口信kouxin +扣押kouya +口语kouyu +看起来kql +口若悬河krxh +口是心非ksxf +苦ku +库ku +枯ku +酷ku +哭ku +窟ku +裤ku +刳ku +堀ku +喾ku +绔ku +骷ku +跨kua +夸kua +垮kua +挎kua +胯kua +侉kua +跨步kuabu +夸大kuada +跨度kuadu +会*kuai +快kuai +块kuai +筷kuai +侩kuai +蒯kuai +郐kuai +哙kuai +狯kuai +浍*kuai +脍kuai +会计kuaiji +快乐kuaile +快速kuaisu +宽kuan +款kuan +髋kuan +宽敞kuanchang +宽绰kuanchuo +宽大kuanda +宽待kuandai +款待kuandai +宽度kuandu +况kuang +矿kuang +狂kuang +框kuang +匡kuang +筐kuang +眶kuang +旷kuang +诓kuang +诳kuang +邝kuang +圹kuang +夼kuang +哐kuang +纩kuang +贶kuang +矿藏kuangcang +矿产kuangchan +狂风kuangfeng +矿工kuanggong +旷工kuanggong +矿井kuangjing +框框kuangkuang +哐啷kuanglang +况且kuangqie +矿区kuangqu +矿泉kuangquan +狂热kuangre +矿山kuangshan +矿石kuangshi +框图kuangtu +宽广kuanguang +狂妄kuangwang +矿物kuangwu +旷野kuangye +宽宏kuanhong +宽厚kuanhou +宽阔kuankuo +宽容kuanrong +款式kuanshi +宽恕kuanshu +款项kuanxiang +宽心kuanxin +宽裕kuanyu +垮台kuatai +跨越kuayue +夸张kuazhang +裤衩kucha +库存kucun +哭喊kuhan +奎kui +溃kui +馈kui +亏kui +盔kui +岿kui +窥kui +葵kui +魁kui +傀kui +愧kui +馗kui +匮kui +夔kui +隗kui +蒉kui +揆kui +喹kui +喟kui +悝kui +愦kui +逵kui +暌kui +睽kui +聩kui +蝰kui +篑kui +跬kui +亏本kuiben +窥测kuice +亏待kuidai +愧疚kuijiu +亏空kuikong +亏损kuisun +魁梧kuiwu +溃疡kuiyang +枯竭kujie +库仑kulun +苦闷kumen +枯木kumu +困kun +昆kun +坤kun +捆kun +悃kun +阃kun +琨kun +锟kun +醌kun +鲲kun +髡kun +苦难kunan +苦恼kunao +困厄kune +困乏kunfa +困惑kunhuo +困境kunjing +困苦kunku +昆明kunming +困难kunnan +扩kuo +括kuo +适*kuo +阔kuo +廓kuo +栝*kuo +蛞kuo +阔别kuobie +扩充kuochong +阔绰kuochuo +扩大kuoda +括号kuohao +扩建kuojian +阔气kuoqi +扩展kuozhan +扩张kuozhang +哭泣kuqi +酷暑kushu +苦头kutou +苦维kuwei +枯萎kuwei +酷刑kuxing +苦于kuyu +枯燥kuzao +可想而知kxez +科学家kxj +科学技术kxjs +可行性kxx +科学院kxy +科研部kyb +开源节流kyjl +看样子kyz +了l +来l +量l +理l +路l +里l +论l +两l +利l +领l +流l +力l +立l +料l +连l +老l +六l +轮l +类l +列l +拉la +落*la +啦la +蜡la +腊la +蓝la +垃la +喇la +辣la +剌la +邋la +旯la +砬la +瘌la +喇叭laba +来lai +赖lai +莱lai +崃lai +徕lai +涞lai +濑lai +赉lai +睐lai +铼lai +癞lai +籁lai +来宾laibin +来到laidao +来犯laifan +来访laifang +来函laihan +来回laihui +来历laili +来临lailin +赖皮laipi +来日lairi +来势laishi +来头laitou +来往laiwang +来信laixin +来源laiyuan +来者laizhe +来自laizi +癞子laizi +辣椒lajiao +拉拢lalong +喇嘛lama +腊梅lamei +兰lan +烂lan +蓝lan +览lan +栏lan +婪lan +拦lan +篮lan +阑lan +澜lan +谰lan +揽lan +懒lan +缆lan +滥lan +岚lan +漤lan +榄lan +斓lan +罱lan +镧lan +褴lan +蓝本lanben +懒怠landai +滥调landiao +懒惰landuo +浪lang +朗lang +郎lang +狼lang +琅lang +榔lang +廊lang +莨lang +蒗lang +啷lang +阆lang +锒lang +稂lang +螂lang +栏杆langan +狼狈langbei +浪潮langchao +浪荡langdang +朗读langdu +浪费langfei +狼藉langji +浪漫langman +朗诵langsong +郎中langzhong +兰花lanhua +拦截lanjie +烂漫lanman +懒散lansan +蓝色lanse +缆绳lansheng +烂熟lanshu +蓝天lantian +蓝图lantu +阑尾lanwei +拦腰lanyao +滥用lanyong +兰州lanzhou +老lao +劳lao +落*lao +牢lao +涝lao +捞lao +络*lao +佬lao +姥lao +酪lao +烙lao +潦*lao +唠lao +崂lao +栳lao +铑lao +铹lao +痨lao +耢lao +醪lao +老板laoban +老伴laoban +老本laoben +劳动laodong +牢固laogu +老汉laohan +老化laohua +牢记laoji +劳驾laojia +牢靠laokao +劳苦laoku +牢牢laolao +劳累laolei +劳力laoli +老练laolian +牢笼laolong +劳模laomo +老年laonian +老人laoren +牢骚laosao +老少laoshao +老是laoshi +老实laoshi +老师laoshi +老乡laoxiang +老爷laoye +烙印laoyin +劳支laozhi +劳资laozi +劳作laozuo +腊月layue +狼狈不堪lbbk +力不从心lbcx +来不及lbj +来不了lbl +了不起lbq +劳动保险ldbx +来得及ldj +劳动量ldl +劳动力ldl +灵丹妙药ldmy +拉丁美洲ldmz +劳动者ldz +劳动致富ldzf +了le +乐le +勒le +肋le +仂le +叻le +泐le +鳓le +乐观leguan +类lei +雷lei +累lei +勒*lei +垒lei +泪lei +镭lei +蕾lei +磊lei +儡lei +擂lei +肋lei +羸lei +诔lei +嘞lei +嫘lei +缧lei +檑lei +耒lei +酹lei +类别leibie +类次leici +雷达leida +雷管leiguan +泪痕leihen +泪花leihua +累积leiji +累计leiji +累进leijin +磊落leiluo +累年leinian +类似leisi +擂台leitai +雷同leitong +类推leitui +类型leixing +雷雨leiyu +累月leiyue +累赘leizhui +勒令leling +冷leng +棱leng +楞leng +塄leng +愣leng +冷藏lengcang +冷淡lengdan +冷宫lenggong +棱角lengjiao +冷静lengjing +冷落lengluo +冷门lengmen +冷漠lengmo +冷暖lengnuan +冷僻lengpi +冷气lengqi +冷却lengque +冷水lengshui +冷遇lengyu +乐趣lequ +勒索lesuo +乐意leyi +乐园leyuan +两个文明lgwm +拉关系lgx +联合国lhg +联合会lhh +两回事lhs +联合体lht +理li +里li +利li +力li +立li +离li +例li +历li +粒li +厘li +礼li +李li +隶li +黎li +璃li +励li +犁li +梨li +丽li +厉li +篱li +狸li +漓li +鲤li +莉li +荔li +吏li +栗li +砾li +傈li +俐li +痢li +沥li +哩li +鬲*li +俪li +俚li +郦li +坜li +苈li +莅li +蓠li +藜li +呖li +唳li +喱li +猁li +悝*li +溧li +澧li +逦li +娌li +嫠li +骊li +缡li +枥li +栎li +轹li +戾li +砺li +詈li +罹li +锂li +鹂li +疠li +疬li +蛎li +蜊li +蠡li +笠li +篥li +粝li +醴li +跞li +雳li +鲡li +鳢li +黧li +俩lia +连lian +联lian +练lian +炼lian +脸lian +链lian +莲lian +镰lian +廉lian +怜lian +涟lian +帘lian +敛lian +恋lian +蔹lian +奁lian +潋lian +濂lian +琏lian +楝lian +殓lian +臁lian +裢lian +裣lian +蠊lian +鲢lian +立案lian +恋爱lianai +联邦lianbang +练兵lianbing +联播lianbo +练达lianda +连队liandui +量liang +两liang +粮liang +良liang +亮liang +梁liang +凉liang +辆liang +粱liang +晾liang +谅liang +墚liang +莨*liang +椋liang +踉liang +靓liang +魉liang +炼钢liangang +两半liangban +量变liangbian +两边liangbian +两便liangbian +两侧liangce +两次liangci +两地liangdi +两点liangdian +量度liangdu +良方liangfang +两广liangguang +良好lianghao +两极liangji +良机liangji +谅解liangjie +量具liangju +凉快liangkuai +两立liangli +两面liangmian +练功liangong +两栖liangqi +两讫liangqi +两全liangquan +粮食liangshi +两手liangshou +凉爽liangshuang +亮堂liangtang +两条liangtiao +两头liangtou +连贯lianguan +联贯lianguan +亮相liangxiang +良心liangxin +两性liangxing +量刑liangxing +两样liangyang +粮油liangyou +良缘liangyuan +粮站liangzhan +两者liangzhe +两重liangzhong +良种liangzhong +量子liangzi +联合lianhe +联欢lianhuan +廉价lianjia +联结lianjie +连接lianjie +联接lianjie +廉洁lianjie +联军lianjun +连累lianlei +联络lianluo +连忙lianmang +联盟lianmeng +怜悯lianmin +连年liannian +脸谱lianpu +连日lianri +炼乳lianru +联赛liansai +脸色lianse +连锁liansuo +练武lianwu +联系lianxi +练习lianxi +怜惜lianxi +联想lianxiang +连续lianxu +涟漪lianyi +联姻lianyin +联营lianying +炼油lianyou +联运lianyun +连载lianzai +了*liao +料liao +疗liao +辽liao +僚liao +撩liao +聊liao +燎liao +寥liao +潦liao +撂liao +镣liao +廖liao +蓼liao +尥liao +嘹liao +獠liao +寮liao +缭liao +钌liao +鹩liao +撩拨liaobo +潦草liaocao +疗程liaocheng +料到liaodao +潦倒liaodao +料定liaoding +了结liaojie +了解liaojie +辽阔liaokuo +料理liaoli +寥寥liaoliao +寥落liaoluo +辽宁liaoning +了却liaoque +了事liaoshi +聊天liaotian +料想liaoxiang +疗养liaoyang +礼拜libai +利弊libi +里边libian +理财licai +理睬licai +立场lichang +里程licheng +历程licheng +立春lichun +历次lici +历代lidai +理当lidang +立冬lidong +列lie +裂lie +烈lie +劣lie +猎lie +冽lie +埒lie +捩lie +咧lie +洌lie +趔lie +躐lie +鬣lie +裂变liebian +列车lieche +列出liechu +列岛liedao +裂缝liefeng +列国lieguo +烈火liehuo +劣迹lieji +列举lieju +裂开liekai +裂口liekou +列宁liening +猎奇lieqi +列强lieqiang +猎取liequ +烈日lieri +列入lieru +劣绅lieshen +烈士lieshi +劣势lieshi +烈属lieshu +裂纹liewen +列席liexi +烈性liexing +立法lifa +立方lifang +礼服lifu +立功ligong +利害lihai +厉害lihai +理化lihua +礼花lihua +理会lihui +离婚lihun +立即liji +理解lijie +礼节lijie +历届lijie +力矩liju +离开likai +理科like +立刻like +理亏likui +历来lilai +历历lili +力量liliang +利率lilu +理论lilun +立论lilun +礼貌limao +里面limian +利民limin +黎民limin +黎明liming +林lin +磷lin +临lin +邻lin +淋lin +麟lin +琳lin +霖lin +鳞lin +凛lin +赁lin +吝lin +蔺lin +啉lin +嶙lin +廪lin +懔lin +遴lin +檩lin +辚lin +膦lin +瞵lin +粼lin +躏lin +淋巴linba +临别linbie +淋病linbing +林场linchang +临床linchuang +临到lindao +领ling +另ling +零ling +令ling +灵ling +岭ling +铃ling +龄ling +凌ling +棱*ling +陵ling +拎ling +玲ling +菱ling +伶ling +羚ling +酃ling +苓ling +呤ling +囹ling +泠ling +绫ling +柃ling +棂ling +瓴ling +聆ling +蛉ling +翎ling +鲮ling +令爱lingai +凌晨lingchen +灵丹lingdan +领导lingdao +领地lingdi +零点lingdian +领队lingdui +灵感linggan +领海linghai +领航linghang +领会linghui +灵魂linghun +灵活linghuo +灵机lingji +零件lingjian +领教lingjiao +灵杰lingjie +领空lingkong +凌空lingkong +玲珑linglong +零乱lingluan +凌乱lingluan +领略linglue +灵敏lingmin +陵墓lingmu +灵巧lingqiao +领取lingqu +令人lingren +凌辱lingru +零散lingsan +领事lingshi +领受lingshou +领司lingsi +零碎lingsui +灵堂lingtang +零头lingtou +领土lingtu +磷光linguang +另外lingwai +领悟lingwu +领先lingxian +领衔lingxian +零星lingxing +领袖lingxiu +另选lingxuan +灵验lingyan +领域lingyu +令尊lingzun +磷火linhuo +历年linian +临界linjie +临近linjin +邻近linjin +邻里linli +淋漓linli +凛冽linlie +临摹linmo +里弄linong +鳞伤linshang +临时linshi +临死linsi +吝惜linxi +临行linxing +林业linye +临战linzhan +临终linzhong +礼炮lipao +李鹏lipeng +礼品lipin +力气liqi +离奇liqi +力求liqiu +立秋liqiu +历任liren +例如liru +利润lirun +离散lisan +理事lishi +历史lishi +隶属lishu +礼堂litang +立体liti +例题liti +力图litu +流liu +六liu +留liu +刘liu +硫liu +柳liu +陆*liu +馏liu +瘤liu +溜liu +琉liu +榴liu +碌*liu +浏liu +遛liu +骝liu +绺liu +旒liu +熘liu +锍liu +镏liu +鹨liu +鎏liu +留步liubu +流产liuchan +流畅liuchang +流程liucheng +流传liuchuan +流窜liucuan +流动liudong +流毒liudu +流放liufang +六届liujie +浏览liulan +流利liuli +留恋liulian +流露liulu +流落liuluo +流氓liumang +留念liunian +流失liushi +流逝liushi +流体liuti +流通liutong +流亡liuwang +流泻liuxie +留心liuxin +流行liuxing +流星liuxing +留学liuxue +流血liuxue +流言liuyan +留言liuyan +留洋liuyang +留影liuying +留用liuyong +流域liuyu +六月liuyue +流转liuzhuan +例外liwai +礼物liwu +利息lixi +立夏lixia +理想lixiang +立新lixin +离心lixin +理性lixing +力行lixing +厉行lixing +离休lixiu +立意liyi +利益liyi +离异liyi +利用liyong +理由liyou +力争lizheng +立正lizheng +理智lizhi +立志lizhi +离职lizhi +例子lizi +粒子lizi +立足lizu +屡见不鲜ljbx +两极分化ljfh +逻辑设计ljsj +逻辑思维ljsw +逻辑性ljx +灵机一动ljyd +落落大方lldf +拦路虎llh +来龙去脉llqm +零零碎碎llss +来来往往llww +联绵不断lmbd +灵敏度lmd +辽宁省lns +列宁主义lnzy +龙long +垄long +弄*long +笼long +隆long +聋long +咙long +窿long +拢long +陇long +垅long +茏long +泷long +珑long +栊long +胧long +砻long +癃long +隆冬longdong +垄断longduan +隆隆longlong +笼络longluo +笼统longtong +笼罩longzhao +隆重longzhong +漏lou +露*lou +楼lou +娄lou +搂lou +篓lou +陋lou +偻lou +蒌lou +喽lou +嵝lou +镂lou +瘘lou +耧lou +蝼lou +髅lou +漏洞loudong +漏斗loudou +镂空loukong +漏网louwang +来日方长lrfc +来人来函lrlh +了如指掌lrzz +理所当然lsdr +连锁反应lsfy +领事馆lsg +理事会lsh +力所能及lsnj +拉萨市lss +流水线lsx +良师益友lsyy +路lu +六*lu +率lu +露lu +绿lu +炉lu +律lu +虑lu +滤lu +陆lu +氯lu +鲁lu +铝lu +录lu +旅lu +卢lu +吕lu +芦lu +颅lu +庐lu +掳lu +卤lu +虏lu +麓lu +碌lu +赂lu +鹿lu +潞lu +禄lu +戮lu +驴lu +侣lu +履lu +屡lu +缕lu +垆lu +蓼*lu +撸lu +噜lu +闾lu +泸lu +渌lu +漉lu +逯lu +璐lu +栌lu +榈lu +橹lu +轳lu +辂lu +辘lu +氇lu +胪lu +膂lu +镥lu +稆lu +鸬lu +鹭lu +褛lu +簏lu +舻lu +鲈lu +卵luan +乱luan +峦luan +挛luan +孪luan +滦luan +脔luan +娈luan +栾luan +鸾luan +銮luan +卵巢luanchao +乱伦luanlun +乱子luanzi +旅伴luban +路标lubiao +路程lucheng +旅程lucheng +露出luchu +屡次luci +陆地ludi +露底ludi +旅店ludian +略lue +掠lue +锊lue +掠夺lueduo +旅费lufei +露骨lugu +旅馆luguan +路过luguo +绿化luhua +炉火luhuo +路径lujing +路局luju +陆军lujun +旅客luke +履历luli +率领luling +鲁莽lumang +露面lumian +论lun +轮lun +伦lun +抡lun +仑lun +沦lun +纶lun +囵lun +论处lunchu +轮船lunchuan +论点lundian +论调lundiao +伦敦lundun +轮换lunhuan +论据lunju +轮廓lunkuo +论理lunli +伦理lunli +轮流lunliu +论述lunshu +轮胎luntai +论坛luntan +沦为lunwei +论文lunwen +沦陷lunxian +轮训lunxun +论战lunzhan +论正lunzheng +论证lunzheng +轮轴lunzhou +论著lunzhu +落luo +罗luo +螺luo +洛luo +络luo +逻luo +咯*luo +烙*luo +萝luo +锣luo +箩luo +骡luo +裸luo +骆luo +倮luo +蠃luo +荦luo +捋luo +摞luo +猡luo +泺luo +漯luo +珞luo +椤luo +脶luo +硌*luo +镙luo +瘰luo +雒luo +萝卜luobu +落成luocheng +螺钉luoding +罗汉luohan +落后luohou +落户luohu +逻辑luoji +落空luokong +落款luokuan +箩筐luokuang +罗列luolie +罗马luoma +螺母luomu +罗盘luopan +落泊luopo +落实luoshi +螺栓luoshuan +裸体luoti +骆驼luotuo +罗网luowang +螺纹luowen +落伍luowu +落选luoxuan +螺旋luoxuan +络绎luoyi +录取luqu +路人luren +绿色luse +庐山lushan +旅社lushe +律师lushi +露天lutian +路途lutu +旅途lutu +路线luxian +率先luxian +录像luxiang +旅行luxing +履行luxing +陆续luxu +录音luyin +绿荫luyin +录用luyong +旅游luyou +绿洲luzhou +露珠luzhu +路子luzi +炉子luzi +另行安排lxap +例行公事lxgs +联系人lxr +留学生lxs +另行通知lxtz +林业部lyb +老一辈lyb +另一方面lyfm +劳逸结合lyjh +利用率lyl +老一套lyt +留有余地lyyd +来者不拒lzbj +立足点lzd +老中青lzq +理直气壮lzqz +兰州市lzs +两重性lzx +面m +命m +们m +民m +毛m +没m +米m +明m +马m +么m +每m +门m +名m +磨m +美m +密m +苗m +满m +亩m +目m +呒m +马ma +么*ma +麻ma +吗ma +妈ma +骂ma +嘛ma +码ma +摩*ma +抹*ma +玛ma +蚂ma +唛ma +犸ma +嬷ma +杩ma +蟆ma +马鞍maan +麻痹mabi +马达mada +麻烦mafan +麻纺mafang +马虎mahu +麦mai +脉mai +卖mai +买mai +埋mai +迈mai +劢mai +荬mai +霾mai +买办maiban +脉搏maibo +迈步maibu +埋藏maicang +脉冲maichong +脉动maidong +埋伏maifu +卖国maiguo +脉络mailuo +买卖maimai +卖命maiming +埋没maimo +卖弄mainong +埋头maitou +卖淫maiyin +埋怨maiyuan +埋葬maizang +买帐maizhang +卖座maizuo +马力mali +麻利mali +马路malu +妈妈mama +麻木mamu +满man +慢man +曼man +漫man +蔓man +瞒man +馒man +蛮man +谩man +墁man +幔man +缦man +熳man +镘man +颟man +螨man +鳗man +鞔man +漫长manchang +忙mang +芒mang +盲mang +茫mang +氓mang +莽mang +邙mang +漭mang +硭mang +蟒mang +忙碌manglu +莽莽mangmang +盲目mangmu +茫然mangran +盲人mangren +忙于mangyu +莽原mangyuan +蛮横manheng +漫画manhua +满怀manhuai +谩骂manma +满目manmu +满腔manqiang +蔓延manyan +满意manyi +满载manzai +满足manzu +毛mao +矛mao +冒mao +貌mao +贸mao +帽mao +猫mao +茅mao +锚mao +铆mao +卯mao +茂mao +袤mao +茆mao +峁mao +泖mao +瑁mao +昴mao +牦mao +耄mao +旄mao +懋mao +瞀mao +蟊mao +髦mao +毛病maobing +毛糙maocao +冒充maochong +铆钉maoding +矛盾maodun +冒犯maofan +毛纺maofang +冒号maohao +冒尖maojian +冒进maojin +茅坑maokeng +毛利maoli +冒昧maomei +茂密maomi +冒牌maopai +毛坯maopi +贸然maoran +茂盛maosheng +冒失maoshi +矛头maotou +冒险maoxian +贸易maoyi +冒雨maoyu +毛重maozhong +帽子maozi +马上mashang +马桶matong +码头matou +马戏maxi +麻醉mazui +免不了mbl +明辨是非mbsf +满不在乎mbzh +默不作声mbzs +满城风雨mcfy +目的地mdd +目瞪口呆mdkd +描淡写mdx +么me +麽me +秘而不宣mebx +没mei +每mei +美mei +煤mei +霉mei +酶mei +梅mei +妹mei +眉mei +玫mei +枚mei +媒mei +镁mei +昧mei +寐mei +媚mei +糜*mei +谜*mei +莓mei +嵋mei +猸mei +浼mei +湄mei +楣mei +镅mei +鹛mei +袂mei +魅mei +每次meici +每当meidang +美德meide +没法meifa +每逢meifeng +每个meige +美观meiguan +玫瑰meigui +美国meiguo +美好meihao +美化meihua +媒介meijie +眉睫meijie +枚举meiju +煤矿meikuang +霉烂meilan +魅力meili +美丽meili +美满meiman +眉毛meimao +美貌meimao +妹妹meimei +美妙meimiao +眉目meimu +每年meinian +煤气meiqi +每人meiren +每日meiri +美容meirong +眉梢meishao +每时meishi +美术meishu +媒妁meishuo +煤炭meitan +每天meitian +煤田meitian +美学meixue +没有meiyou +煤油meiyou +美元meiyuan +每月meiyue +没治meizhi +每周meizhou +们men +门men +闷men +扪men +焖men +懑men +钔men +门房menfang +孟meng +猛meng +蒙meng +盟meng +梦meng +萌meng +锰meng +氓*meng +檬meng +勐meng +甍meng +瞢meng +懵meng +朦meng +礞meng +虻meng +蜢meng +蠓meng +艋meng +艨meng +蒙蔽mengbi +萌发mengfa +蒙古menggu +盟国mengguo +梦幻menghuan +蒙混menghun +梦见mengjian +猛进mengjin +梦境mengjing +猛烈menglie +蒙胧menglong +蒙昧mengmei +猛然mengran +萌生mengsheng +猛士mengshi +蒙受mengshou +梦想mengxiang +梦乡mengxiang +猛醒mengxing +萌芽mengya +盟友mengyou +盟约mengyue +猛增mengzeng +门户menhu +门路menlu +门牌menpai +门票menpiao +闷气menqi +门诊menzhen +名副其实mfqs +眉飞色舞mfsw +没关系mgx +蒙古族mgz +蒙混过关mhgg +米mi +密mi +迷mi +蜜mi +秘mi +眯mi +醚mi +靡mi +糜mi +谜mi +弥mi +觅mi +泌mi +幂mi +芈mi +谧mi +蘼mi +咪mi +嘧mi +猕mi +汨mi +宓mi +弭mi +脒mi +祢mi +敉mi +糸mi +縻mi +麋mi +面mian +棉mian +免mian +绵mian +眠mian +冕mian +勉mian +娩mian +缅mian +沔mian +渑mian +湎mian +腼mian +眄mian +面部mianbu +免除mianchu +免得miande +面对miandui +面额miane +棉花mianhua +缅怀mianhuai +面积mianji +面具mianju +面孔miankong +勉励mianli +面临mianlin +面貌mianmao +面面mianmian +绵绵mianmian +面目mianmu +面庞mianpang +面前mianqian +勉强mianqiang +面容mianrong +面色mianse +棉纱miansha +面授mianshou +免税mianshui +面谈miantan +面向mianxiang +免刑mianxing +棉絮mianxu +绵延mianyan +面议mianyi +免疫mianyi +面罩mianzhao +免职mianzhi +面子mianzi +苗miao +秒miao +描miao +庙miao +妙miao +瞄miao +藐miao +渺miao +喵miao +邈miao +缈miao +缪miao +杪miao +淼miao +眇miao +鹋miao +秒表miaobiao +描绘miaohui +妙龄miaoling +渺茫miaomang +描摹miaomo +藐视miaoshi +描述miaoshu +苗条miaotiao +苗头miaotou +描写miaoxie +瞄准miaozhun +弥补mibu +谜底midi +密度midu +灭mie +蔑mie +乜*mie +咩mie +蠛mie +篾mie +灭火miehuo +灭迹mieji +灭绝miejue +灭口miekou +蔑视mieshi +灭亡miewang +密封mifeng +蜜蜂mifeng +眯缝mifeng +迷航mihang +迷糊mihu +迷惑mihuo +密集miji +密件mijian +迷津mijin +秘诀mijue +糜烂milan +迷恋milian +密令miling +迷路milu +密码mima +迷漫miman +弥漫miman +秘密mimi +汨汨mimi +谜面mimian +密谋mimou +民min +敏min +抿min +皿min +悯min +闽min +苠min +岷min +闵min +泯min +缗min +玟min +珉min +愍min +黾min +鳘min +民办minban +民兵minbing +民法minfa +民愤minfen +民风minfeng +命ming +明ming +名ming +鸣ming +螟ming +盟*ming +铭ming +冥ming +茗ming +溟ming +暝ming +瞑ming +酩ming +敏感mingan +明白mingbai +名册mingce +名称mingcheng +明处mingchu +名次mingci +名词mingci +名单mingdan +明灯mingdeng +民歌minge +名额minge +名贵minggui +铭记mingji +名家mingjia +铭刻mingke +明快mingkuai +明朗minglang +名利mingli +明亮mingliang +明了mingliao +命令mingling +名流mingliu +明码mingma +明媚mingmei +明明mingming +名目mingmu +明年mingnian +名牌mingpai +名片mingpian +名气mingqi +明确mingque +明人mingren +名人mingren +名胜mingsheng +名声mingsheng +名堂mingtang +明天mingtian +名望mingwang +明文mingwen +明细mingxi +明显mingxian +鸣谢mingxie +明星mingxing +名言mingyan +名义mingyi +名誉mingyu +命运mingyun +明知mingzhi +明智mingzhi +明珠mingzhu +名著mingzhu +名字mingzi +民航minhang +民间minjian +敏捷minjie +民警minjing +民情minqing +敏锐minrui +民事minshi +民心minxin +民意minyi +民用minyong +民运minyun +民政minzheng +民众minzhong +民主minzhu +民族minzu +密切miqie +迷人miren +迷失mishi +秘书mishu +密探mitan +迷途mitu +谬miu +谬论miulun +谬误miuwu +迷惘miwang +迷雾miwu +迷信mixin +密友miyou +谜语miyu +蜜月miyue +马克思mks +眉开眼笑mkyx +马列主义mlzy +满面春风mmcf +马马虎虎mmhh +面面俱到mmjd +莫名其妙mmqm +默默无闻mmww +明目张胆mmzd +无*mo +磨mo +没*mo +万*mo +末mo +模mo +膜mo +摸mo +墨mo +摩mo +脉*mo +莫mo +抹mo +冒*mo +默mo +貉*mo +嘿*mo +摹mo +蘑mo +魔mo +沫mo +漠mo +寞mo +陌mo +谟mo +茉mo +蓦mo +馍mo +嫫mo +殁mo +镆mo +秣mo +瘼mo +耱mo +貊mo +貘mo +默哀moai +莫不mobu +磨擦moca +摩擦moca +磨蹭moceng +莫大moda +磨刀modao +摩登modeng +摸底modi +模范mofan +模仿mofang +摹仿mofang +莫非mofei +魔鬼mogui +模糊mohu +墨迹moji +模块mokuai +磨砺moli +磨练molian +末了moliao +末路molu +没落moluo +磨灭momie +默默momo +磨难monan +模拟moni +摹拟moni +末期moqi +默契moqi +默然moran +漠然moran +默认moren +末日mori +莫如moru +抹杀mosha +抹煞mosha +末梢moshao +陌生mosheng +模式moshi +没收moshou +魔术moshu +磨损mosun +摸索mosuo +模特mote +摩托motuo +某mou +谋mou +牟mou +侔mou +哞mou +缪*mou +眸mou +蛑mou +蝥mou +鍪mou +某地moudi +某个mouge +谋害mouhai +谋划mouhua +某军moujun +牟利mouli +谋略moulue +谋求mouqiu +牟取mouqu +谋杀mousha +谋生mousheng +某些mouxie +末尾mowei +默写moxie +模型moxing +默许moxu +模样moyang +魔掌mozhang +模子mozi +妙趣横生mqhs +门市部msb +名胜古迹msgj +妙手回春mshc +莫斯科msk +没什么msm +每时每刻msmk +秘书长msz +没事找事mszs +摩托车mtc +埋头工作mtgz +埋头苦干mtkg +亩mu +目mu +木mu +母mu +墓mu +模*mu +幕mu +牧mu +姆mu +穆mu +姥*mu +牟*mu +拇mu +牡mu +暮mu +募mu +慕mu +睦mu +仫mu +坶mu +苜mu +沐mu +毪mu +钼mu +母爱muai +墓碑mubei +目标mubiao +木材mucai +牧草mucao +目测muce +牧场muchang +目次muci +牡丹mudan +目的mudi +牧歌muge +目光muguang +幕后muhou +目击muji +募集muji +木刻muke +木料muliao +幕僚muliao +目录mulu +牧民mumin +木讷mune +木偶muou +目前muqian +母亲muqin +牧区muqu +木然muran +暮色muse +牧师mushi +目送musong +牧童mutong +牧业muye +沐浴muyu +民意测验mycy +贸易市场mysc +贸易协定myxd +民政部mzb +美中不足mzbz +毛泽东mzd +满载而归mzeg +明知故犯mzgf +毛织品mzp +目中无人mzwr +毛主席mzx +年n +能n +内n +那n +农n +你n +南n +难n +呢n +女n +泥n +哪n +拿n +念n +牛n +宁n +脑n +粘n +尼n +纳n +嗯n +那na +南na +哪na +拿na +纳na +呢*na +钠na +呐na +娜na +捺na +肭na +镎na +衲na +那边nabian +纳粹nacui +哪儿naer +那个nage +哪个nage +呐喊nahan +哪会nahui +耐nai +哪*nai +奶nai +乃nai +氖nai +奈nai +鼐nai +艿nai +萘nai +柰nai +耐烦naifan +奈何naihe +耐久naijiu +耐劳nailao +奶奶nainai +耐心naixin +耐性naixing +耐用naiyong +奶油naiyou +乃至naizhi +那里nali +哪里nali +那么name +南nan +难nan +男nan +喃nan +囝nan +囡nan +楠nan +腩nan +蝻nan +赧nan +难办nanban +南北nanbei +南边nanbian +难产nanchan +南昌nanchang +难处nanchu +难道nandao +难得nande +难点nandian +难度nandu +哪能naneng +南方nanfang +南非nanfei +难分nanfen +南风nanfeng +囊nang +攮nang +囔nang +馕nang +曩nang +囊括nangkuo +难怪nanguai +难关nanguan +南国nanguo +难过nanguo +南海nanhai +南货nanhuo +南极nanji +难解nanjie +南京nanjing +难看nankan +难堪nankan +南面nanmian +难免nanmian +难民nanmin +南宁nanning +男女nannu +赧然nanran +男人nanren +难色nanse +难事nanshi +难受nanshou +难说nanshuo +难题nanti +难听nanting +难为nanwei +男性nanxing +南亚nanya +南洋nanyang +难以nanyi +难友nanyou +难于nanyu +脑nao +闹nao +努*nao +挠nao +恼nao +淖nao +孬nao +垴nao +呶nao +猱nao +瑙nao +硇nao +铙nao +蛲nao +脑袋naodai +脑海naohai +恼火naohuo +脑筋naojin +闹剧naoju +闹事naoshi +哪怕napa +纳入naru +那时nashi +拿手nashou +纳税nashui +那些naxie +哪些naxie +纳新naxin +那样nayang +哪样nayang +那种nazhong +年产量ncl +农产品ncp +南昌市ncs +难道说nds +呢ne +哪*ne +呐*ne +讷ne +内nei +那*nei +哪*nei +馁nei +内部neibu +内存neicun +内地neidi +内阁neige +内涵neihan +内行neihang +内奸neijian +内疚neijiu +内科neike +内乱neiluan +内幕neimu +内勤neiqin +内容neirong +内外neiwai +内销neixiao +内心neixin +内因neiyin +内应neiying +内在neizai +嫩nen +恁nen +能neng +能动nengdong +能否nengfou +能干nenggan +能够nenggou +能力nengli +能量nengliang +能耐nengnai +能人nengren +能手nengshou +能源nengyuan +能者nengzhe +农副产品nfcp +年富力强nflq +能工巧匠ngqj +你ni +泥ni +尼ni +呢*ni +逆ni +拟ni +尿ni +妮ni +霓ni +倪ni +匿ni +腻ni +溺ni +伲ni +坭ni +猊ni +怩ni +昵ni +旎ni +祢*ni +慝ni +睨ni +铌ni +鲵ni +年nian +念nian +粘nian +蔫nian +拈nian +碾nian +撵nian +捻nian +酿nian +廿nian +埝nian +辇nian +黏nian +鲇nian +鲶nian +年初nianchu +年代niandai +念叨niandao +年底niandi +年度niandu +年份nianfen +娘niang +年华nianhua +年画nianhua +年级nianji +年纪nianji +年鉴nianjian +年来nianlai +年利nianli +年历nianli +拈量nianliang +年龄nianling +年迈nianmai +年年niannian +年青nianqing +年轻nianqing +年岁niansui +年头niantou +念头niantou +年限nianxian +年月nianyue +酿造nianzao +年终nianzhong +尿niao +鸟niao +溺*niao +茑niao +嬲niao +脲niao +袅niao +鸟瞰niaokan +逆差nicha +你处nichu +你的nide +拟定niding +拟订niding +镍nie +啮nie +涅nie +捏nie +聂nie +孽nie +镊nie +乜nie +陧nie +蘖nie +嗫nie +颞nie +臬nie +蹑nie +捏造niezao +腻烦nifan +泥浆nijiang +逆境nijing +泥坑nikeng +逆流niliu +你们nimen +您nin +宁ning +凝ning +拧ning +柠ning +狞ning +泞ning +佞ning +苎ning +咛ning +甯ning +聍ning +凝固ninggu +凝结ningjie +宁静ningjing +凝聚ningju +宁可ningke +宁肯ningken +宁日ningri +凝视ningshi +凝望ningwang +宁夏ningxia +宁愿ningyuan +泥泞nining +泥塑nisu +牛niu +扭niu +钮niu +纽niu +拗*niu +狃niu +忸niu +妞niu +纽带niudai +牛犊niudu +纽扣niukou +纽约niuyue +扭转niuzhuan +腻味niwei +你我niwo +拟议niyi +泥沼nizhao +逆转nizhuan +难解难分njnf +南京市njs +南极洲njz +扭亏为盈nkwy +脑力劳动nlld +年老体弱nltr +内蒙古nmg +农贸市场nmsc +那么些nmx +那么样nmy +念念不忘nnbw +难能可贵nnkg +南宁市nns +农nong +弄nong +浓nong +脓nong +侬nong +哝nong +脓包nongbao +农村nongcun +浓度nongdu +农妇nongfu +浓厚nonghou +农会nonghui +农活nonghuo +农具nongju +农历nongli +农林nonglin +农忙nongmang +农民nongmin +弄清nongqing +农时nongshi +农药nongyao +农业nongye +农艺nongyi +浓郁nongyu +耨nou +年轻化nqh +年轻人nqr +那时候nsh +能说会道nshd +南斯拉夫nslf +能上能下nsnx +逆水行舟nsxz +农田水利ntsl +女nu +奴nu +努nu +怒nu +弩nu +胬nu +孥nu +驽nu +恧nu +钕nu +衄nu +暖nuan +暖和nuanhe +暖流nuanliu +暖气nuanqi +奴婢nubi +奴才nucai +虐nue +虐待nuedai +虐疾nueji +女儿nuer +女工nugong +怒吼nuhou +奴化nuhua +怒火nuhuo +努力nuli +奴隶nuli +诺nuo +娜*nuo +挪nuo +懦nuo +糯nuo +傩nuo +搦nuo +喏nuo +锘nuo +挪用nuoyong +奴仆nupu +女人nuren +女色nuse +女士nushi +女性nuxing +女婿nuxu +女子nuzi +能文能武nwnw +弄虚作假nxzj +农作物nzw +你争我夺nzwd +欧o +偶o +哦o +鸥o +殴o +藕o +呕o +沤o +讴o +噢o +怄o +瓯o +耦o +偶然性orx +区*ou +欧ou +偶ou +鸥ou +殴ou +藕ou +呕ou +沤ou +讴ou +怄ou +瓯ou +耦ou +殴打ouda +偶尔ouer +讴歌ouge +偶合ouhe +耦合ouhe +欧姆oumu +怄气ouqi +偶然ouran +藕色ouse +偶数oushu +呕吐outu +欧阳ouyang +欧洲ouzhou +批p +平p +判p +配p +片p +派p +破p +排p +品p +皮p +喷p +盘p +偏p +评p +怕p +培p +普p +贫p +跑p +炮p +怕pa +派pa +爬pa +帕pa +扒*pa +耙*pa +啪pa +趴pa +琶pa +葩pa +杷pa +钯*pa +筢pa +派pai +排pai +拍pai +牌pai +迫*pai +哌pai +徘pai +湃pai +俳pai +蒎pai +排版paiban +拍板paiban +排比paibi +派别paibie +排场paichang +排斥paichi +排除paichu +排队paidui +牌号paihao +徘徊paihuai +排挤paiji +牌价paijia +排列pailie +拍卖paimai +派遣paiqian +排球paiqiu +派生paisheng +派头paitou +排外paiwai +排泄paixie +排演paiyan +牌照paizhao +判pan +盘pan +叛pan +番*pan +潘pan +攀pan +磐pan +盼pan +畔pan +胖pan +拚*pan +爿pan +泮pan +袢pan +襻pan +蟠pan +蹒pan +叛变panbian +判别panbie +盘缠panchan +盘存pancun +叛党pandang +攀登pandeng +盘点pandian +判定panding +判断panduan +攀附panfu +旁pang +膀*pang +磅*pang +乓pang +庞pang +耪pang +胖pang +彷pang +滂pang +逄pang +螃pang +旁边pangbian +庞大pangda +盘亘pangen +旁观pangguan +旁听pangting +旁通pangtong +滂沱pangtuo +庞杂pangza +盘踞panju +判决panjue +叛乱panluan +判明panming +叛逆panni +盘算pansuan +蟠桃pantao +叛徒pantu +盼望panwang +判刑panxing +盘旋panxuan +跑pao +炮pao +刨pao +抛pao +泡pao +咆pao +袍pao +匏pao +狍pao +庖pao +脬pao +疱pao +炮兵paobing +跑步paobu +炮弹paodan +跑道paodao +抛光paoguang +炮火paohuo +炮击paoji +抛锚paomao +泡沫paomo +抛弃paoqi +炮手paoshou +炮台paotai +炮艇paoting +咆哮paoxiao +泡影paoying +炮仗paozhang +炮制paozhi +怕死pasi +疲惫不堪pbbk +迫不急待pbjd +破除迷信pcmx +平等互利pdhl +配pei +培pei +陪pei +胚pei +呸pei +裴pei +赔pei +佩pei +沛pei +辔pei +帔pei +旆pei +锫pei +醅pei +霈pei +陪伴peiban +配备peibei +赔本peiben +赔偿peichang +陪衬peichen +配方peifang +佩服peifu +配合peihe +配给peiji +配件peijian +配角peijiao +赔款peikuan +赔礼peili +配偶peiou +陪审peishen +陪送peisong +胚胎peitai +配套peitao +陪同peitong +培训peixun +培养peiyang +配音peiyin +培育peiyu +配乐peiyue +陪葬peizang +配制peizhi +配置peizhi +培植peizhi +喷pen +盆pen +湓pen +盆地pendi +碰peng +棚peng +蓬peng +朋peng +捧peng +膨peng +砰peng +抨peng +烹peng +澎peng +彭peng +硼peng +篷peng +鹏peng +堋peng +嘭peng +怦peng +蟛peng +碰杯pengbei +碰壁pengbi +蓬勃pengbo +捧场pengchang +抨击pengji +蓬莱penglai +蓬乱pengluan +澎湃pengpai +烹饪pengren +硼砂pengsha +蓬松pengsong +烹调pengtiao +朋友pengyou +膨胀pengzhang +喷溅penjian +盆景penjing +喷射penshe +喷嚏penti +平方公里pfgl +平分秋色pfqs +批pi +皮pi +坏*pi +否*pi +辟*pi +坯pi +脾pi +疲pi +砒pi +霹pi +披pi +劈pi +琵pi +毗pi +啤pi +匹pi +痞pi +僻pi +屁pi +譬pi +丕pi +仳pi +陂*pi +陴pi +邳pi +郫pi +圮pi +埤*pi +鼙pi +芘pi +擗pi +吡*pi +噼pi +庀pi +淠pi +媲pi +纰pi +枇pi +甓pi +睥pi +罴pi +铍pi +癖pi +裨*pi +疋pi +蚍pi +蜱pi +貔pi +片pian +偏pian +便*pian +篇pian +骗pian +扁*pian +谝pian +骈pian +缏*pian +犏pian +胼pian +翩pian +蹁pian +偏差piancha +片断pianduan +片段pianduan +偏废pianfei +篇幅pianfu +偏激pianji +偏见pianjian +骗局pianju +片刻pianke +偏离pianli +片面pianmian +偏旁pianpang +偏僻pianpi +偏颇pianpo +骗取pianqu +骗人pianren +骗术pianshu +偏袒piantan +翩跹pianxian +偏向pianxiang +偏移pianyi +便宜pianyi +篇章pianzhang +骗子pianzi +票piao +漂piao +朴*piao +飘piao +瓢piao +剽piao +莩*piao +嘌piao +嫖piao +骠*piao +缥piao +殍piao +瞟piao +螵piao +漂泊piaobo +票房piaofang +漂浮piaofu +票价piaojia +票据piaoju +漂亮piaoliang +漂流piaoliu +飘流piaoliu +飘落piaoluo +票面piaomian +飘渺piaomiao +飘泊piaopo +剽窃piaoqie +飘然piaoran +飘散piaosan +飘扬piaoyang +飘游piaoyou +疲惫pibei +批驳pibo +撇pie +瞥pie +丿pie +苤pie +氕pie +批发pifa +批复pifu +皮肤pifu +皮革pige +屁股pigu +疲倦pijuan +疲劳pilao +纰漏pilou +披露pilu +品pin +贫pin +频pin +拼pin +苹pin +聘pin +拚pin +姘pin +嫔pin +榀pin +牝pin +颦pin +品尝pinchang +频传pinchuan +拼凑pincou +频带pindai +频道pindao +品德pinde +贫乏pinfa +频繁pinfan +平ping +评ping +瓶ping +凭ping +苹ping +冯*ping +乒ping +坪ping +萍ping +屏ping +俜ping +娉ping +枰ping +鲆ping +平安pingan +评比pingbi +屏蔽pingbi +平常pingchang +平川pingchuan +平淡pingdan +平等pingdeng +平地pingdi +平定pingding +评定pingding +品格pinge +平反pingfan +平凡pingfan +平方pingfang +平分pingfen +评分pingfen +评功pinggong +平衡pingheng +评级pingji +平价pingjia +评价pingjia +评奖pingjiang +凭借pingjie +平静pingjing +平均pingjun +平空pingkong +凭空pingkong +评理pingli +评论pinglun +平面pingmian +平民pingmin +屏幕pingmu +评判pingpan +乒乓pingpang +平平pingping +平壤pingrang +平日pingri +平时pingshi +平手pingshou +评说pingshuo +平素pingsu +平坦pingtan +乒坛pingtan +平稳pingwen +平息pingxi +萍乡pingxiang +平行pingxing +平易pingyi +评议pingyi +平庸pingyong +平原pingyuan +平仄pingze +屏障pingzhang +凭着pingzhe +平整pingzheng +凭证pingzheng +评注pingzhu +贫寒pinhan +品级pinji +贫困pinkun +频率pinlu +品貌pinmao +拼命pinming +品名pinming +品评pinping +聘请pinqing +贫穷pinqiong +聘任pinren +聘书pinshu +拼写pinxie +品行pinxing +品性pinxing +拼音pinyin +品质pinzhi +品种pinzhong +批判pipan +匹配pipei +批评piping +脾气piqi +譬如piru +疲软piruan +批示pishi +脾胃piwei +脾性pixing +辟谣piyao +批语piyu +批阅piyue +批注pizhu +批准pizhun +平均数pjs +披荆斩棘pjzj +评论员ply +跑马观花pmgh +破po +迫po +坡po +泼po +繁*po +朴*po +泊*po +颇po +婆po +魄po +粕po +叵po +陂*po +鄱po +泺*po +珀po +攴po +钋po +钷po +钹*po +皤po +笸po +破案poan +破产pochan +破除pochu +坡度podu +泼妇pofu +破格poge +迫害pohai +破坏pohuai +破获pohuo +迫近pojin +破旧pojiu +泼辣pola +破烂polan +魄力poli +破例poli +破裂polie +破灭pomie +迫切poqie +迫使poshi +破碎posui +破损posun +破土potu +剖pou +裒pou +掊pou +剖解poujie +剖析pouxi +破绽pozhan +蓬蓬勃勃ppbb +普普通通pptt +旁若无人prwr +普通话pth +抛头露面ptlm +普pu +谱pu +扑pu +埔pu +铺pu +暴*pu +葡pu +朴pu +蒲pu +堡*pu +脯*pu +仆pu +莆pu +菩pu +圃pu +浦pu +曝pu +瀑pu +匍pu +噗pu +溥pu +濮pu +璞pu +氆pu +镤pu +镨pu +蹼pu +普遍pubian +普查pucha +扑哧puchi +扑打puda +铺盖pugai +普及puji +铺平puping +仆人puren +菩萨pusa +铺设pushe +朴实pushi +朴素pusu +葡萄putao +普通putong +扑通putong +铺位puwei +谱写puxie +普选puxuan +铺张puzhang +普照puzhao +朴直puzhi +平易近人pyjr +拼音字母pyzm +铺张浪费pzlf +起q +前q +其q +去q +气q +全q +期q +群q +情q +区q +强q +切q +取q +七q +求q +清q +确q +权q +且q +青q +亲爱的qad +情报所qbs +千百万qbw +千变万化qbwh +取长补短qcbd +千锤百炼qcbl +恰到好处qdhc +全党全军和全国qdqg +取而代之qedz +轻而易举qeyj +千方百计qfbj +清规戒律qgjl +勤工俭学qgjx +旗鼓相当qgxd +轻工业qgy +轻工业部qgyb +勤工助学qgzx +权衡利弊qhlb +骑虎难下qhnx +青海省qhs +青红皂白qhzb +起qi +其qi +气qi +期qi +七qi +器qi +齐qi +奇qi +汽qi +企qi +漆qi +欺qi +旗qi +畦qi +启qi +弃qi +歧qi +稽*qi +缉*qi +栖qi +戚qi +妻qi +凄qi +柒qi +沏qi +棋qi +崎qi +脐qi +祈qi +祁qi +骑qi +岂qi +乞qi +契qi +砌qi +迄qi +泣qi +讫qi +亟*qi +亓qi +俟qi +圻qi +芑qi +芪qi +荠*qi +萁qi +萋qi +葺qi +蕲qi +嘁qi +屺qi +岐qi +岖*qi +汔qi +淇qi +骐qi +绮qi +琪qi +琦qi +杞qi +桤qi +槭qi +耆qi +欹qi +祺qi +憩qi +碛qi +颀qi +蛴qi +蜞qi +綦qi +綮qi +蹊qi +鳍qi +麒qi +卡*qia +恰qia +掐qia +洽qia +伽*qia +葜qia +袷*qia +髂qia +恰当qiadang +恰好qiahao +前qian +千qian +钱qian +浅qian +签qian +迁qian +铅qian +潜qian +牵qian +钳qian +纤*qian +谴qian +扦qian +钎qian +仟qian +谦qian +乾qian +黔qian +遣qian +堑qian +嵌qian +欠qian +歉qian +倩qian +佥qian +阡qian +芊qian +芡qian +茜qian +荨qian +掮qian +岍qian +悭qian +慊qian +骞qian +搴qian +褰qian +缱qian +椠qian +犍*qian +肷qian +愆qian +钤qian +虔qian +箬qian +箝qian +前辈qianbei +前边qianbian +浅薄qianbo +钱财qiancai +欠产qianchan +前程qiancheng +签到qiandao +前敌qiandi +签订qianding +签发qianfa +遣返qianfan +前方qianfang +强qiang +将*qiang +枪qiang +抢qiang +墙qiang +腔qiang +呛qiang +羌qiang +蔷qiang +戕qiang +嫱qiang +樯qiang +戗qiang +炝qiang +锖qiang +锵qiang +镪qiang +襁qiang +蜣qiang +羟qiang +跄qiang +墙壁qiangbi +枪毙qiangbi +强辩qiangbian +强大qiangda +枪弹qiangdan +强盗qiangdao +强调qiangdiao +腔调qiangdiao +强度qiangdu +抢夺qiangduo +强攻qianggong +强国qiangguo +强化qianghua +强加qiangjia +强奸qiangjian +抢劫qiangjie +强劲qiangjin +抢救qiangjiu +枪决qiangjue +强烈qianglie +强迫qiangpo +强权qiangquan +强弱qiangruo +枪杀qiangsha +强盛qiangsheng +千古qiangu +牵挂qiangua +蔷薇qiangwei +抢险qiangxian +强行qiangxing +强硬qiangying +强占qiangzhan +强者qiangzhe +强制qiangzhi +枪支qiangzhi +强壮qiangzhuang +前后qianhou +前进qianjin +前景qianjing +迁就qianjiu +歉疚qianjiu +迁居qianju +乾坤qiankun +千里qianli +前例qianli +潜力qianli +牵连qianlian +前列qianlie +浅陋qianlou +前面qianmian +签名qianming +前年qiannian +前期qianqi +千秋qianqiu +前驱qianqu +欠缺qianque +前人qianren +前任qianren +纤弱qianruo +前哨qianshao +牵涉qianshe +歉收qianshou +签署qianshu +遣送qiansong +前提qianti +前天qiantian +欠条qiantiao +前途qiantu +千瓦qianwa +千万qianwan +前往qianwang +前夕qianxi +纤细qianxi +前线qianxian +浅显qianxian +谦虚qianxu +谦逊qianxun +前言qianyan +前沿qianyan +前夜qianye +歉意qianyi +迁移qianyi +牵引qianyin +潜在qianzai +谴责qianze +前者qianzhe +签证qianzheng +牵制qianzhi +钳制qianzhi +签字qianzi +前奏qianzou +桥qiao +瞧qiao +壳*qiao +巧qiao +敲qiao +乔qiao +蕉qiao +橇qiao +锹qiao +悄qiao +侨qiao +鞘qiao +撬qiao +翘qiao +峭qiao +俏qiao +窍qiao +雀*qiao +劁qiao +诮qiao +谯qiao +荞qiao +峤*qiao +愀qiao +憔qiao +缲*qiao +樵qiao +硗qiao +跷qiao +鞒qiao +侨胞qiaobao +桥墩qiaodun +巧计qiaoji +瞧见qiaojian +侨居qiaoju +桥梁qiaoliang +窍门qiaomen +巧妙qiaomiao +桥牌qiaopai +乔迁qiaoqian +悄然qiaoran +侨务qiaowu +敲诈qiaozha +恰似qiasi +洽谈qiatan +岂不qibu +起步qibu +器材qicai +奇才qicai +凄惨qican +起草qicao +汽车qiche +骑车qiche +启程qicheng +起初qichu +凄楚qichu +其次qici +期待qidai +脐带qidai +岂但qidan +启迪qidi +起点qidian +启动qidong +气度qidu +切qie +且qie +砌*qie +茄qie +怯qie +窃qie +伽*qie +郄qie +惬qie +慊*qie +妾qie +挈qie +锲qie +箧qie +窃案qiean +切断qieduan +切合qiehe +窃据qieju +窃取qiequ +怯弱qieruo +切身qieshen +切实qieshi +切题qieti +窃听qieting +切削qiexiao +惬意qieyi +启发qifa +起飞qifei +岂非qifei +气愤qifen +气氛qifen +欺负qifu +气概qigai +乞丐qigai +岂敢qigan +气功qigong +奇怪qiguai +器官qiguan +旗号qihao +漆黑qihei +气候qihou +期货qihuo +契机qiji +奇迹qiji +期间qijian +起见qijian +器件qijian +七届qijie +迄今qijin +起来qilai +凄凉qiliang +欺凌qiling +气流qiliu +歧路qilu +起码qima +骑马qima +启蒙qimeng +奇妙qimiao +器皿qimin +亲qin +侵qin +勤qin +秦qin +钦qin +琴qin +芹qin +擒qin +禽qin +寝qin +沁qin +芩qin +揿qin +吣qin +嗪qin +噙qin +廑*qin +溱qin +檎qin +锓qin +矜*qin +覃qin +螓qin +衾qin +亲爱qinai +亲笔qinbi +岂能qineng +侵犯qinfan +勤奋qinfen +情qing +清qing +青qing +轻qing +倾qing +请qing +亲*qing +庆qing +氢qing +晴qing +卿qing +擎qing +氰qing +顷qing +苘qing +圊qing +檠qing +磬qing +蜻qing +罄qing +箐qing +綮*qing +謦qing +鲭qing +黥qing +清白qingbai +青白qingbai +情报qingbao +情操qingcao +青草qingcao +清查qingcha +清除qingchu +清楚qingchu +青春qingchun +青翠qingcui +清单qingdan +倾倒qingdao +清点qingdian +情调qingdiao +轻浮qingfu +青工qinggong +青海qinghai +庆贺qinghe +清华qinghua +情怀qinghuai +清还qinghuan +请假qingjia +请柬qingjian +请教qingjiao +情节qingjie +清洁qingjie +情景qingjing +顷刻qingke +晴空qingkong +轻快qingkuai +情况qingkuang +青睐qinglai +晴朗qinglang +情理qingli +清理qingli +轻率qinglu +轻蔑qingmie +青年qingnian +氢气qingqi +轻巧qingqiao +请求qingqiu +情趣qingqu +青山qingshan +请示qingshi +清爽qingshuang +青松qingsong +轻松qingsong +倾诉qingsu +青天qingtian +晴天qingtian +倾听qingting +倾吐qingtu +请问qingwen +倾向qingxiang +倾销qingxiao +情形qingxing +清醒qingxing +情绪qingxu +情谊qingyi +轻易qingyi +轻盈qingying +情愿qingyuan +请愿qingyuan +请战qingzhan +轻重qingzhong +倾注qingzhu +庆祝qingzhu +请罪qingzui +侵害qinhai +勤俭qinjian +亲近qinjin +亲眷qinjuan +勤快qinkuai +勤劳qinlao +亲历qinli +亲临qinlin +侵略qinlue +亲密qinmi +勤勉qinmian +钦佩qinpei +亲戚qinqi +亲切qinqie +亲热qinre +亲人qinren +侵入qinru +亲身qinshen +侵蚀qinshi +寝室qinshi +亲手qinshou +亲属qinshu +侵吞qintun +勤务qinwu +亲信qinxin +亲眼qinyan +亲友qinyou +侵占qinzhan +亲自qinzi +穷qiong +琼qiong +邛qiong +茕qiong +穹qiong +蛩qiong +筇qiong +跫qiong +銎qiong +穷国qiongguo +穷苦qiongku +穷困qiongkun +穹隆qionglong +穷期qiongqi +穷人qiongren +穷途qiongtu +气派qipai +欺骗qipian +气魄qipo +乞求qiqiu +崎岖qiqu +齐全qiquan +凄然qiran +起色qise +气色qise +其实qishi +起始qishi +启事qishi +气势qishi +启示qishi +歧视qishi +奇数qishu +汽水qishui +起诉qisu +其他qita +其它qita +奇特qite +气体qiti +汽艇qiting +企图qitu +歧途qitu +求qiu +球qiu +秋qiu +丘qiu +仇*qiu +龟*qiu +邱qiu +囚qiu +酋qiu +泅qiu +俅qiu +巯qiu +犰qiu +湫qiu +逑qiu +遒qiu +楸qiu +赇qiu +虬qiu +蚯qiu +蝤qiu +裘qiu +糗qiu +鳅qiu +鼽qiu +秋播qiubo +球场qiuchang +囚犯qiufan +秋风qiufeng +秋季qiuji +求教qiujiao +囚禁qiujin +求救qiujiu +丘陵qiuling +秋千qiuqian +求情qiuqing +求全qiuquan +秋色qiuse +求实qiushi +秋收qiushou +秋天qiutian +求学qiuxue +求战qiuzhan +求证qiuzheng +求知qiuzhi +求助qiuzhu +期望qiwang +气味qiwei +气温qiwen +奇闻qiwen +欺侮qiwu +气息qixi +栖息qixi +起先qixian +期限qixian +气象qixiang +器械qixie +齐心qixin +气压qiya +欺压qiya +气焰qiyan +企业qiye +起义qiyi +歧义qiyi +起因qiyin +启用qiyong +汽油qiyou +其余qiyu +起源qiyuan +七月qiyue +契约qiyue +欺诈qizha +气质qizhi +旗帜qizhi +其中qizhong +器重qizhong +旗子qizi +妻子qizi +勤俭建国qjjg +勤俭节约qjjy +迄今为止qjwz +取决于qjy +千钧一发qjyf +旗开得胜qkds +全力以赴qlyf +勤劳致富qlzf +千里之行qlzx +亲密无间qmwj +青年人qnr +千篇一律qpyl +清清楚楚qqcc +勤勤恳恳qqkk +切切实实qqss +确确实实qqss +恰恰相反qqxf +求全责备qqzb +恰如其分qrqf +欺人之谈qrzt +七手八脚qsbj +全神贯注qsgz +全世界qsj +切实可行qskx +切身利益qsly +青少年qsn +前所未闻qsww +前所未有qswy +气势汹汹qsxx +齐头并进qtbj +奇谈怪论qtgl +千头万绪qtwx +前提下qtx +去qu +区qu +取qu +曲qu +且*qu +渠qu +屈qu +趋qu +驱qu +趣qu +蛆qu +躯qu +娶qu +龋qu +戌*qu +诎qu +劬qu +苣*qu +蕖qu +蘧qu +岖qu +衢qu +阒qu +璩qu +觑qu +氍qu +朐qu +祛qu +磲qu +鸲qu +癯qu +蛐qu +蠼qu +麴qu +瞿qu +黢qu +全quan +权quan +圈quan +劝quan +泉quan +醛quan +颧quan +痊quan +拳quan +犬quan +券quan +诠quan +荃quan +悛quan +绻quan +辁quan +畎quan +铨quan +蜷quan +筌quan +鬈quan +全部quanbu +全党quandang +劝导quandao +蜷伏quanfu +劝告quangao +全国quanguo +权衡quanheng +全会quanhui +拳击quanji +劝解quanjie +全局quanju +全军quanjun +全力quanli +权利quanli +权力quanli +全貌quanmao +全面quanmian +劝勉quanmian +全民quanmin +全能quanneng +全年quannian +全盘quanpan +全拼quanpin +全球quanqiu +蜷曲quanqu +全权quanquan +全然quanran +全胜quansheng +权术quanshu +泉水quanshui +劝说quanshuo +圈套quantao +全体quanti +拳头quantou +权威quanwei +劝慰quanwei +全文quanwen +全县quanxian +权限quanxian +全校quanxiao +权益quanyi +权宜quanyi +劝诱quanyou +痊愈quanyu +劝止quanzhi +劝阻quanzu +区别qubie +屈才qucai +驱除quchu +取代qudai +渠道qudao +取得qude +取缔qudi +曲调qudiao +驱动qudong +确que +却que +缺que +炔que +瘸que +鹊que +榷que +雀que +阕que +阙que +悫que +确保quebao +缺点quedian +确定queding +缺乏quefa +缺口quekou +确立queli +确切queqie +确认queren +缺少queshao +缺省quesheng +确实queshi +缺席quexi +缺陷quexian +确信quexin +确凿quezao +瘸子quezi +区分qufen +屈服qufu +躯干qugan +区划quhua +曲解qujie +取经qujing +取决qujue +躯壳quke +取乐qule +群qun +裙qun +逡qun +裙带qundai +群岛qundao +去年qunian +群众qunzhong +区区ququ +屈辱quru +驱散qusan +取舍qushe +取胜qusheng +去世qushi +驱使qushi +趋势qushi +躯体quti +区位quwei +区委quwei +趣味quwei +区县quxian +去向quxiang +趋向quxiang +取消quxiao +取信quxin +曲艺quyi +区域quyu +区长quzhang +曲折quzhe +屈指quzhi +驱逐quzhu +曲子quzi +奇形怪状qxgz +全心全意qxqy +气象台qxt +气象万千qxwq +齐心协力qxxl +岂有此理qycl +前因后果qyhg +情有可原qyky +强有力qyl +求之不得qzbd +取之不尽qzbj +轻重缓急qzhj +气壮山河qzsh +千真万确qzwq +人r +如r +日r +认r +入r +任r +热r +然r +容r +让r +润r +弱r +燃r +染r +壤r +绕r +仁r +溶r +刃r +仍r +然ran +燃ran +染ran +冉ran +苒ran +蚺ran +髯ran +燃点randian +然而raner +让rang +壤rang +嚷rang +瓤rang +攘rang +禳rang +穰rang +让步rangbu +让位rangwei +让贤rangxian +然后ranhou +燃料ranliao +染料ranliao +冉冉ranran +燃烧ranshao +绕rao +扰rao +饶rao +荛rao +娆rao +桡rao +扰乱raoluan +如此而已rcey +人才济济rcjj +热re +若*re +惹re +热爱reai +热潮rechao +热忱rechen +热诚recheng +热带redai +热火rehuo +热量reliang +热烈relie +人ren +认ren +任ren +仁ren +刃ren +忍ren +壬ren +韧ren +妊ren +纫ren +仞ren +荏ren +葚ren +饪ren +轫ren +稔ren +衽ren +热闹renao +人才rencai +人次renci +仁慈renci +认错rencuo +人大renda +韧带rendai +人道rendao +认得rende +认定rending +人防renfang +仍reng +扔reng +扔掉rengdiao +人格renge +仍旧rengjiu +人工rengong +认购rengou +仍然rengran +任何renhe +人家renjia +人间renjian +人杰renjie +认可renke +人口renkou +人类renlei +人力renli +人们renmen +任免renmian +人民renmin +任命renming +忍耐rennai +任凭renping +任期renqi +认清renqing +人权renquan +荏苒renran +忍让renrang +人人renren +人参renshen +人生rensheng +人事renshi +人士renshi +认识renshi +人手renshou +忍受renshou +认输renshu +忍痛rentong +人为renwei +认为renwei +人物renwu +任务renwu +人心renxin +忍心renxin +人选renxuan +任意renyi +仁义renyi +任用renyong +人员renyuan +认帐renzhang +认真renzhen +人质renzhi +任职renzhi +认罪renzui +认作renzuo +热切reqie +热情reqing +惹事reshi +热线rexian +热心rexin +热血rexue +人工合成rghc +热火朝天rhct +如虎添翼rhty +日ri +日报ribao +日本riben +日产richan +日常richang +日程richeng +日光riguang +日后rihou +日记riji +日久rijiu +日历rili +日落riluo +日内rinei +日期riqi +日夜riye +日益riyi +日用riyong +日照rizhao +日中rizhong +日子rizi +软件包rjb +人杰地灵rjdl +人尽其才rjqc +如饥似渴rjsk +日久天长rjtc +任劳任怨rlry +热泪盈眶rlyk +人民币rmb +人民代表大会rmdh +人民日报rmrb +燃眉之急rmzj +容rong +溶rong +荣rong +熔rong +融rong +绒rong +戎rong +茸rong +蓉rong +冗rong +嵘rong +狨rong +榕rong +肜rong +蝾rong +熔点rongdian +容光rongguang +融合ronghe +溶化ronghua +熔化ronghua +融化ronghua +融会ronghui +荣获ronghuo +容积rongji +溶解rongjie +容量rongliang +戎马rongma +容貌rongmao +容纳rongna +融洽rongqia +容忍rongren +荣辱rongru +容身rongshen +绒线rongxian +荣幸rongxing +容许rongxu +荣耀rongyao +溶液rongye +容易rongyi +荣誉rongyu +溶质rongzhi +肉rou +揉rou +柔rou +糅rou +蹂rou +鞣rou +柔和rouhe +肉麻rouma +柔软rouruan +肉体routi +任人为贤rrwx +日日夜夜rryy +人生观rsg +认识论rsl +惹事生非rssf +如上所述rsss +如ru +入ru +儒ru +乳ru +茹ru +蠕ru +孺ru +辱ru +汝ru +褥ru +蓐ru +薷ru +嚅ru +洳ru +溽ru +濡ru +缛ru +铷ru +襦ru +颥ru +软ruan +阮ruan +朊ruan +软骨ruangu +软件ruanjian +软禁ruanjin +软盘ruanpan +如常ruchang +如此ruci +入党rudang +蠕动rudong +乳房rufang +如果ruguo +如何ruhe +瑞rui +锐rui +蕊rui +芮rui +蕤rui +枘rui +睿rui +蚋rui +锐利ruili +瑞雪ruixue +锐意ruiyi +儒家rujia +如今rujin +辱骂ruma +入门rumen +入迷rumi +润run +闰run +润滑runhua +弱ruo +若ruo +偌ruo +弱点ruodian +若干ruogan +若是ruoshi +弱小ruoxiao +如期ruqi +入侵ruqin +如若ruruo +儒生rusheng +入手rushou +如同rutong +如下ruxia +入选ruxuan +如意ruyi +如愿ruyuan +入帐ruzhang +人武部rwb +若无其事rwqs +人言可畏rykw +日用品ryp +若有所思ryss +人之长情rzcq +是s +上s +时s +生s +说s +社s +深s +水s +所s +三s +十s +使s +事s +数s +四s +实s +少s +式s +山s +手s +撒sa +萨sa +洒sa +卅sa +仨sa +挲sa +脎sa +飒sa +撒谎sahuang +塞sai +思*sai +赛sai +腮sai +鳃sai +噻sai +赛车saiche +塞子saizi +撒娇sajiao +三san +散san +叁san +伞san +馓san +毵san +糁san +散步sanbu +散布sanbu +散发sanfa +三废sanfei +桑sang +丧sang +嗓sang +搡sang +磉sang +颡sang +丧命sangming +丧失sangshi +三国sanguo +三好sanhao +散会sanhui +三角sanjiao +三届sanjie +散失sanshi +散文sanwen +三月sanyue +扫sao +梢*sao +搔sao +骚sao +嫂sao +埽sao +缫sao +缲sao +臊sao +瘙sao +鳋sao +扫除saochu +扫荡saodang +扫地saodi +骚动saodong +骚乱saoluan +扫描saomiao +扫墓saomu +骚扰saorao +瘙痒saoyang +扫帚saozhou +洒脱satuo +说不定sbd +舍不得sbd +说不过去sbgq +说不来sbl +数不胜数sbss +素不相识sbxs +身不由己sbyj +上层建筑scjz +生产力scl +生产率scl +水产品scp +四川省scs +市场调节sctj +市场信息scxx +生动活泼sdhp +山东省sds +水电站sdz +色se +塞*se +瑟se +涩se +啬se +铯se +穑se +视而不见sebj +色彩secai +色调sediao +色盲semang +森sen +僧seng +僧侣senglu +森林senlin +森严senyan +色情seqing +瑟瑟sese +十二月sey +色泽seze +司法部sfb +赏罚分明sffm +说服力sfl +手风琴sfq +三番五次sfwc +四个现代化sgxh +手工业sgy +沙sha +杀sha +砂sha +啥sha +纱sha +莎sha +刹sha +傻sha +煞sha +杉sha +厦*sha +唼sha +嗄*sha +挲*sha +歃sha +铩sha +痧sha +裟sha +霎sha +鲨sha +煞白shabai +刹车shache +煞车shache +沙发shafa +傻瓜shagua +沙皇shahuang +色*shai +筛shai +晒shai +晒台shaitai +砂烬shajin +沙龙shalong +沙漠shamo +山shan +单*shan +闪shan +善shan +珊shan +扇shan +陕shan +掸*shan +苫shan +杉shan +删shan +煽shan +衫shan +擅shan +赡shan +膳shan +汕shan +缮shan +栅*shan +剡shan +讪shan +鄯shan +埏shan +芟shan +潸shan +姗shan +嬗shan +骟shan +膻shan +禅*shan +钐shan +疝shan +蟮shan +舢shan +跚shan +鳝shan +刹那shana +山坳shanao +陕北shanbei +擅长shanchang +删除shanchu +山川shanchuan +山地shandi +闪电shandian +扇动shandong +煽动shandong +山东shandong +山峰shanfeng +上shang +商shang +伤shang +尚shang +汤*shang +墒shang +赏shang +晌shang +裳shang +垧shang +绱shang +殇shang +熵shang +觞shang +删改shangai +山岗shangang +山冈shangang +上班shangban +上报shangbao +上边shangbian +商标shangbiao +上部shangbu +上策shangce +上层shangceng +商场shangchang +上次shangci +赏赐shangci +上当shangdang +上等shangdeng +上帝shangdi +商店shangdian +上调shangdiao +商定shangding +上访shangfang +伤感shanggan +上告shanggao +赏光shangguang +上海shanghai +伤害shanghai +商行shanghang +上级shangji +上集shangji +上进shangjin +上空shangkong +上来shanglai +商量shangliang +上流shangliu +上门shangmen +上面shangmian +上年shangnian +山沟shangou +商品shangpin +商洽shangqia +上前shangqian +尚且shangqie +上去shangqu +商榷shangque +商人shangren +上任shangren +上山shangshan +上升shangsheng +赏识shangshi +上述shangshu +上司shangsi +上诉shangsu +商谈shangtan +商讨shangtao +闪光shanguang +上文shangwen +上午shangwu +商务shangwu +上下shangxia +上限shangxian +伤心shangxin +上旬shangxun +上演shangyan +商业shangye +商议shangyi +上映shangying +上游shangyou +上涨shangzhang +上阵shangzhen +山河shanhe +善后shanhou +删节shanjie +善良shanliang +山林shanlin +山岭shanling +山脉shanmai +杉木shanmu +山区shanqu +扇区shanqu +山水shanshui +闪烁shanshuo +山头shantou +山西shanxi +陕西shanxi +赡养shanyang +闪耀shanyao +善意shanyi +善于shanyu +善战shanzhan +擅自shanzi +少shao +烧shao +稍shao +绍shao +召*shao +哨shao +梢shao +鞘*shao +捎shao +芍shao +勺shao +韶shao +邵shao +劭shao +苕shao +潲shao +杓*shao +蛸shao +筲shao +艄shao +哨兵shaobing +艄公shaogong +烧毁shaohui +少见shaojian +哨卡shaoka +少量shaoliang +少年shaonian +少女shaonu +烧伤shaoshang +少数shaoshu +哨所shaosuo +稍微shaowei +少许shaoxu +稍许shaoxu +少爷shaoye +少有shaoyou +少于shaoyu +少壮shaozhuang +沙哑shaya +砂眼shayan +傻子shazi +社she +设she +射she +摄she +舌she +折*she +涉she +舍she +蛇she +奢she +赊she +赦she +慑she +厍she +佘she +摺*she +猞she +滠she +歙she +畲she +麝she +设备shebei +射程shecheng +奢侈shechi +舍得shede +设法shefa +慑服shefu +赊购shegou +奢华shehua +社会shehui +社稷sheji +涉及sheji +设计sheji +射击sheji +舍己sheji +社交shejiao +设立sheli +涉猎shelie +社论shelun +深shen +身shen +神shen +什*shen +伸shen +参*shen +甚shen +渗shen +沈shen +肾shen +审shen +申shen +慎shen +砷shen +呻shen +娠shen +绅shen +婶shen +诜shen +谂shen +莘shen +葚*shen +哂shen +渖shen +椹shen +胂shen +矧shen +蜃shen +深奥shenao +申报shenbao +身边shenbian +申辩shenbian +身材shencai +审查shencha +深沉shenchen +深处shenchu +审处shenchu +审定shending +深度shendu +甚而shener +身分shenfen +身份shenfen +生sheng +胜sheng +声sheng +省sheng +升sheng +盛sheng +绳sheng +剩sheng +圣sheng +牲sheng +乘*sheng +甥sheng +嵊sheng +渑*sheng +晟sheng +眚sheng +笙sheng +生财shengcai +生产shengchan +生成shengcheng +牲畜shengchu +生存shengcun +盛大shengda +省得shengde +胜地shengdi +盛典shengdian +声调shengdiao +生动shengdong +省份shengfen +胜负shengfu +省府shengfu +生根shenggen +升华shenghua +省会shenghui +盛会shenghui +生活shenghuo +生机shengji +生计shengji +升级shengji +圣洁shengjie +圣经shengjing +盛开shengkai +牲口shengkou +盛况shengkuang +生理shengli +胜利shengli +省力shengli +省略shenglue +生命shengming +声明shengming +盛名shengming +生怕shengpa +生僻shengpi +生平shengping +升旗shengqi +生前shengqian +升迁shengqian +盛情shengqing +生趣shengqu +省去shengqu +胜任shengren +生日shengri +省事shengshi +盛事shengshi +声势shengshi +生疏shengshu +生死shengsi +胜似shengsi +胜诉shengsu +绳索shengsuo +生态shengtai +声讨shengtao +声望shengwang +省委shengwei +生物shengwu +生息shengxi +剩下shengxia +盛夏shengxia +圣贤shengxian +生效shengxiao +生肖shengxiao +盛行shengxing +生涯shengya +生意shengyi +声音shengyin +生于shengyu +生育shengyu +胜于shengyu +声誉shengyu +剩余shengyu +声援shengyuan +生长shengzhang +省长shengzhang +声张shengzhang +胜仗shengzhang +生殖shengzhi +圣旨shengzhi +盛装shengzhuang +审核shenhe +深厚shenhou +深化shenhua +神话shenhua +甚或shenhuo +审计shenji +神经shenjing +深刻shenke +审理shenli +什么shenme +审美shenmei +神秘shenmi +申明shenming +审判shenpan +身旁shenpang +审批shenpi +神气shenqi +神奇shenqi +深浅shenqian +深切shenqie +深情shenqing +申请shenqing +身躯shenqu +深入shenru +渗入shenru +神圣shensheng +身世shenshi +绅士shenshi +伸手shenshou +申述shenshu +神速shensu +申诉shensu +伸缩shensuo +神态shentai +身体shenti +神通shentong +渗透shentou +审问shenwen +神仙shenxian +审讯shenxun +沈阳shenyang +审议shenyi +呻吟shenyin +身影shenying +深远shenyuan +申冤shenyuan +审阅shenyue +深造shenzao +伸张shenzhang +深圳shenzhen +甚至shenzhi +深重shenzhong +慎重shenzhong +神州shenzhou +舍弃sheqi +赊欠sheqian +设施sheshi +社团shetuan +奢望shewang +射线shexian +涉嫌shexian +设想shexiang +赊销shexiao +设宴sheyan +摄影sheying +社员sheyuan +社长shezhang +设置shezhi +涉足shezu +社会公德shgd +是shi +时shi +十shi +使shi +事shi +实shi +式shi +识shi +世shi +试shi +石shi +什shi +示shi +市shi +史shi +师shi +始shi +施shi +士shi +势shi +湿shi +适shi +食shi +失shi +视shi +室shi +氏shi +似*shi +蚀shi +诗shi +释shi +殖*shi +拾shi +饰shi +驶shi +匙*shi +狮shi +尸shi +虱shi +矢shi +屎shi +柿shi +拭shi +誓shi +逝shi +嗜shi +噬shi +仕shi +侍shi +恃shi +嘘*shi +峙*shi +谥shi +埘shi +莳shi +蓍shi +弑shi +轼shi +贳shi +炻shi +铈shi +螫shi +舐shi +筮shi +酾shi +豕shi +鲥shi +鲺shi +失败shibai +势必shibi +事变shibian +师表shibiao +识别shibie +失策shice +史册shice +视察shicha +时常shichang +失常shichang +市场shichang +时辰shichen +失传shichuan +侍从shicong +时代shidai +世代shidai +适当shidang +是的shide +实地shidi +试点shidian +失调shidiao +失掉shidiao +事端shiduan +拾掇shiduo +时而shier +示范shifan +师范shifan +施放shifang +释放shifang +是非shifei +时分shifen +十分shifen +侍奉shifeng +是否shifou +师傅shifu +实干shigan +是个shige +诗歌shige +施工shigong +事故shigu +世故shigu +尸骨shigu +使馆shiguan +时光shiguang +嗜好shihao +适合shihe +时候shihou +事后shihou +侍候shihou +使唤shihuan +实惠shihui +失火shihuo +时机shiji +事迹shiji +实际shiji +世纪shiji +试剂shiji +史籍shiji +施加shijia +市价shijia +时间shijian +事件shijian +世间shijian +实践shijian +视角shijiao +市郊shijiao +使节shijie +十届shijie +世界shijie +使劲shijin +市井shijing +时局shiju +视觉shijue +时刻shike +石刻shike +市侩shikuai +实况shikuang +事理shili +实力shili +事例shili +势利shili +失利shili +势力shili +视力shili +示例shili +失恋shilian +适量shiliang +矢量shiliang +拾零shiling +失灵shiling +适龄shiling +时髦shimao +失密shimi +市民shimin +使命shiming +市内shinei +室内shinei +诗篇shipian +食品shipin +视频shipin +识破shipo +时期shiqi +事前shiqian +失窃shiqie +事情shiqing +实情shiqing +时区shiqu +时取shiqu +失去shiqu +市区shiqu +诗人shiren +市容shirong +湿润shirun +示弱shiruo +失散shisan +失色shise +施舍shishe +师生shisheng +失声shisheng +时时shishi +时事shishi +适时shishi +事实shishi +失事shishi +实施shishi +失实shishi +逝世shishi +史诗shishi +失势shishi +誓师shishi +尸首shishou +失守shishou +实数shishu +施属shishu +世俗shisu +失算shisuan +事态shitai +试探shitan +食堂shitang +实体shiti +尸体shiti +石头shitou +势头shitou +师团shituan +十万shiwan +失望shiwang +市委shiwei +示威shiwei +时务shiwu +事物shiwu +事务shiwu +实物shiwu +食物shiwu +饰物shiwu +失误shiwu +实习shixi +事先shixian +视线shixian +实现shixian +试想shixiang +事项shixiang +实效shixiao +试销shixiao +失信shixin +实行shixing +试行shixing +施行shixing +失修shixiu +实学shixue +史学shixue +实验shiyan +试验shiyan +食言shiyan +誓言shiyan +式样shiyang +事业shiye +实业shiye +失业shiye +视野shiye +时宜shiyi +事宜shiyi +示意shiyi +诗意shiyi +适宜shiyi +释疑shiyi +适应shiying +使用shiyong +实用shiyong +试用shiyong +适用shiyong +事由shiyou +石油shiyou +誓由shiyou +适于shiyu +誓愿shiyuan +十月shiyue +失约shiyue +实在shizai +实战shizhan +施展shizhan +市长shizhang +师长shizhang +使者shizhe +侍者shizhe +失真shizhen +市镇shizhen +市政shizheng +试制shizhi +实质shizhi +市制shizhi +食指shizhi +失职shizhi +适中shizhong +示众shizhong +始终shizhong +时装shizhuang +师资shizi +十足shizu +实足shizu +失足shizu +始祖shizu +手shou +受shou +收shou +首shou +守shou +熟*shou +授shou +寿shou +兽shou +售shou +瘦shou +狩shou +绶shou +艏shou +守备shoubei +手表shoubiao +收兵shoubing +收藏shoucang +手册shouce +首倡shouchang +寿辰shouchen +收成shoucheng +首创shouchuang +首次shouci +收存shoucun +寿诞shoudan +受到shoudao +守敌shoudi +首度shoudu +首都shoudu +手段shouduan +守法shoufa +首犯shoufan +收复shoufu +首府shoufu +手感shougan +手稿shougao +收割shouge +收购shougou +受害shouhai +守候shouhou +守护shouhu +收回shouhui +受贿shouhui +收获shouhuo +收集shouji +售价shoujia +受奖shoujiang +授奖shoujiang +手脚shoujiao +收缴shoujiao +首届shoujie +守旧shoujiu +收据shouju +授课shouke +受理shouli +收敛shoulian +首领shouling +收留shouliu +收录shoulu +收买shoumai +授命shouming +寿命shouming +首脑shounao +首批shoupi +授权shouquan +收容shourong +收入shouru +手软shouruan +瘦弱shouruo +首饰shoushi +手术shoushu +收缩shousuo +收条shoutiao +收听shouting +收尾shouwei +首尾shouwei +首先shouxian +首相shouxiang +瘦小shouxiao +收效shouxiao +手续shouxu +瘦削shouxue +收养shouyang +首要shouyao +受益shouyi +收益shouyi +兽医shouyi +受用shouyong +授予shouyu +守则shouze +首长shouzhang +收支shouzhi +生活上shs +上海市shs +数shu +书shu +树shu +属shu +术shu +输shu +述shu +熟shu +束shu +鼠shu +疏shu +殊shu +舒shu +蔬shu +薯shu +叔shu +署shu +枢shu +梳shu +抒shu +淑shu +赎shu +孰shu +暑shu +曙shu +蜀shu +黍shu +戍shu +竖shu +墅shu +庶shu +漱shu +恕shu +俞*shu +丨shu +倏shu +塾shu +菽shu +摅shu +沭shu +澍shu +姝shu +纾shu +毹shu +腧shu +殳shu +秫shu +刷shua +耍shua +唰shua +衰shuai +帅shuai +摔shuai +甩shuai +蟀shuai +衰败shuaibai +摔打shuaida +摔交shuaijiao +衰竭shuaijie +衰老shuailao +衰弱shuairuo +衰退shuaitui +衰亡shuaiwang +耍赖shualai +栓shuan +拴shuan +闩shuan +涮shuan +双shuang +霜shuang +爽shuang +泷*shuang +孀shuang +双边shuangbian +双方shuangfang +爽口shuangkou +爽快shuangkuai +爽朗shuanglang +双拼shuangpin +双重shuangzhong +耍弄shuanong +刷洗shuaxi +刷新shuaxin +书报shubao +书本shuben +蔬菜shucai +舒畅shuchang +输出shuchu +树丛shucong +疏导shudao +书店shudian +数额shue +抒发shufa +书法shufa +舒服shufu +束缚shufu +曙光shuguang +蜀汉shuhan +疏忽shuhu +倏忽shuhu +书画shuhua +水shui +说*shui +谁shui +睡shui +税shui +水稻shuidao +水电shuidian +水分shuifen +水果shuiguo +水火shuihuo +水晶shuijing +水库shuiku +水利shuili +水流shuiliu +睡眠shuimian +水平shuiping +税收shuishou +税务shuiwu +水下shuixia +水性shuixing +水源shuiyuan +水灾shuizai +谁知shuizhi +书记shuji +书籍shuji +暑假shujia +数据shuju +书刊shukan +数理shuli +树立shuli +竖立shuli +熟练shulian +数量shuliang +数列shulie +疏漏shulou +数落shuluo +数码shuma +书面shumian +庶民shumin +数目shumu +书目shumu +树木shumu +顺shun +吮shun +瞬shun +舜shun +顺便shunbian +顺差shuncha +顺次shunci +顺从shuncong +顺当shundang +顺道shundao +顺风shunfeng +枢纽shuniu +顺利shunli +顺路shunlu +瞬时shunshi +顺势shunshi +顺心shunxin +顺序shunxu +顺应shunying +顺着shunzhuo +说shuo +数*shuo +硕shuo +朔shuo +烁shuo +蒴shuo +搠shuo +妁shuo +槊shuo +铄shuo +说到shuodao +说道shuodao +说动shuodong +说法shuofa +说服shuofu +硕果shuoguo +说话shuohua +说教shuojiao +说明shuoming +说情shuoqing +硕士shuoshi +述评shuping +署期shuqi +暑期shuqi +抒情shuqing +熟人shuren +输入shuru +疏散shusan +属实shushi +熟识shushi +舒适shushi +束手shushou +叔叔shushu +数说shushuo +述说shushuo +输送shusong +疏松shusong +舒坦shutan +疏通shutong +熟悉shuxi +属相shuxiang +舒心shuxin +书信shuxin +属性shuxing +数学shuxue +属于shuyu +术语shuyu +疏远shuyuan +舒展shuzhan +数值shuzhi +树脂shuzhi +梳妆shuzhuang +数字shuzi +赎罪shuzui +售货员shy +社会主义shzy +四si +思si +死si +斯si +丝si +似si +司si +饲si +食*si +私si +厕*si +撕si +嘶si +肆si +寺si +嗣si +伺si +巳si +厮si +俟*si +兕si +厶si +咝si +汜si +泗si +澌si +姒si +驷si +缌si +祀si +锶si +鸶si +耜si +蛳si +笥si +死板siban +四边sibian +死别sibie +思潮sichao +丝绸sichou +四处sichu +四川sichuan +死党sidang +死敌sidi +司法sifa +四方sifang +四海sihai +丝毫sihao +嗣后sihou +似乎sihu +四化sihua +死缓sihuan +撕毁sihui +死活sihuo +四季siji +司机siji +私交sijiao +四届sijie +思考sikao +私利sili +私了siliao +司令siling +思路silu +四面simian +思念sinian +私念sinian +死去siqu +私人siren +死伤sishang +私事sishi +死尸sishi +死水sishui +思索sisuo +四体siti +私吞situn +死亡siwang +思维siwei +斯文siwen +私下sixia +思想sixiang +四项sixiang +死心sixin +私心sixin +肆行sixing +死刑sixing +私有siyou +私欲siyu +寺院siyuan +四月siyue +死者sizhe +四周sizhou +私自sizi +死罪sizui +拾金不昧sjbm +身经百战sjbz +书记处sjc +世界观sjg +舍己救人sjjr +数据库sjk +省军区sjq +杀鸡取蛋sjqd +实际上sjs +设计所sjs +试金石sjs +舍己为人sjwr +设计院sjy +随机应变sjyb +十进制sjz +石家庄sjz +适可而止skez +数理化slh +收录机slj +十六进制sljz +三令五申slws +司令员sly +四面八方smbf +手忙脚乱smjl +生命力sml +说明书sms +什么样smy +深谋远虑smyl +数目字smz +松song +送song +宋song +颂song +耸song +怂song +讼song +诵song +凇song +菘song +崧song +嵩song +忪song +悚song +淞song +竦song +松绑songbang +送别songbie +松弛songchi +松动songdong +颂歌songge +松劲songjin +松快songkuai +耸立songli +送礼songli +松散songsan +松涛songtao +松懈songxie +颂扬songyang +怂恿songyong +送葬songzang +送终songzhong +搜sou +艘sou +擞sou +嗽sou +叟sou +薮sou +嗖sou +嗾sou +馊sou +溲sou +飕sou +瞍sou +锼sou +螋sou +搜查soucha +搜集souji +搜索sousuo +搜寻souxun +售票处spc +食品工业spgy +水平线spx +生气勃勃sqbb +诗情画意sqhy +盛气凌人sqlr +山穷水尽sqsj +十全十美sqsm +首屈一指sqyz +四人帮srb +损人利己srlj +深入浅出srqc +似是而非ssef +时时刻刻sskk +姗姗来迟sslc +实事求是ssqs +事实上sss +随时随地sssd +善始善终sssz +顺水推舟sstz +四通公司stgs +四通集团stjt +身体力行stlx +生态平衡stph +素su +速su +苏su +塑su +缩su +俗su +诉su +宿su +肃su +酥su +粟su +僳su +溯su +夙su +谡su +蔌su +嗉su +愫su +涑su +簌su +觫su +稣su +算suan +酸suan +蒜suan +狻suan +酸楚suanchu +算法suanfa +算计suanji +算了suanle +算盘suanpan +算术suanshu +酸疼suanteng +酸痛suantong +素材sucai +速成sucheng +苏丹sudan +速度sudu +俗话suhua +随sui +穗sui +碎sui +虽sui +岁sui +尿*sui +隋sui +绥sui +髓sui +遂sui +隧sui +祟sui +谇sui +荽sui +濉sui +邃sui +燧sui +眭sui +睢sui +随笔suibi +随便suibian +随处suichu +随从suicong +随地suidi +随和suihe +随后suihou +随机suiji +随即suiji +虽然suiran +随身suishen +随时suishi +随手suishou +岁数suishu +虽说suishuo +随同suitong +随心suixin +随行suixing +随意suiyi +遂意suiyi +岁月suiyue +虽则suize +随着suizhe +诉苦suku +苏联sulian +塑料suliao +速率sulu +素描sumiao +肃穆sumu +损sun +孙sun +笋sun +荪sun +狲sun +飧sun +榫sun +隼sun +损害sunhai +损耗sunhao +损坏sunhuai +损伤sunshang +损失sunshi +孙子sunzi +所suo +缩suo +锁suo +索suo +莎*suo +蓑suo +梭suo +唆suo +琐suo +唢suo +嗦suo +嗍suo +娑suo +桫suo +挲*suo +睃suo +羧suo +所得suode +缩短suoduan +缩减suojian +锁链suolian +所能suoneng +索取suoqu +唆使suoshi +所属suoshu +琐碎suosui +所为suowei +所谓suowei +缩小suoxiao +缩写suoxie +琐屑suoxie +索性suoxing +所以suoyi +索引suoyin +缩影suoying +所有suoyou +所在suozai +所长suozhang +所至suozhi +梭子suozi +肃清suqing +苏区suqu +宿舍sushe +素数sushu +诉说sushuo +诉讼susong +速效suxiao +速写suxie +苏醒suxing +素养suyang +宿营suying +溯源suyuan +宿愿suyuan +夙愿suyuan +塑造suzao +速战suzhan +素质suzhi +苏州suzhou +苏维埃swa +税务局swj +手舞足蹈swzd +少先队sxd +身心健康sxjk +思想上sxs +山西省sxs +陕西省sxs +顺息万变sxwb +所向无敌sxwd +思想性sxx +商业部syb +说一不二sybe +收音机syj +使用价值syjz +所有权syq +沈阳市sys +实用性syx +十一月syy +所有制syz +私有制syz +时至今日szjr +三中全会szqh +始终如一szry +深圳四通szst +所作所为szsw +甚至于szy +他t +同t +它t +提t +题t +体t +图t +天t +头t +通t +条t +特t +土t +团t +统t +台t +她t +太t +套t +铁t +他ta +它ta +她ta +塔ta +踏ta +塌ta +獭ta +挞ta +蹋ta +拓*ta +嗒*ta +闼ta +溻ta +漯*ta +遢ta +榻ta +沓ta +铊ta +趿ta +鳎ta +踏步tabu +他的tade +它的tade +她的tade +塌方tafang +台tai +太tai +态tai +胎tai +抬tai +泰tai +苔tai +酞tai +汰tai +邰tai +薹tai +呔*tai +骀*tai +肽tai +炱tai +钛tai +跆tai +鲐tai +台北taibei +台词taici +态度taidu +台风taifeng +台阶taijie +太平taiping +泰然tairan +泰山taishan +态势taishi +太太taitai +抬头taitou +台湾taiwan +太阳taiyang +太原taiyuan +天安门tam +他们tamen +它们tamen +她们tamen +谈tan +碳tan +探tan +炭tan +弹*tan +坦tan +贪tan +滩tan +坍tan +摊tan +瘫tan +坛tan +檀tan +痰tan +潭tan +谭tan +毯tan +袒tan +叹tan +郯tan +澹tan +昙tan +忐tan +钽tan +锬tan +镡*tan +坦白tanbai +探测tance +探访tanfang +谈锋tanfeng +叹服tanfu +堂tang +糖tang +唐tang +塘tang +汤tang +搪tang +棠tang +膛tang +倘tang +躺tang +淌tang +趟tang +烫tang +傥tang +帑tang +溏tang +瑭tang +樘tang +铴tang +镗tang +耥tang +螗tang +螳tang +羰tang +醣tang +倘不tangbu +搪瓷tangci +弹弓tangong +倘若tangruo +搪塞tangsai +烫伤tangshang +堂堂tangtang +唐突tangtu +弹劾tanhe +袒护tanhu +谈话tanhua +瘫痪tanhuan +探究tanjiu +坦克tanke +贪婪tanlan +坦率tanlu +谈论tanlun +摊派tanpai +谈判tanpan +叹气tanqi +探亲tanqin +弹琴tanqin +坦然tanran +探索tansuo +探讨tantao +谈天tantian +探听tanting +贪图tantu +谈吐tantu +滩涂tantu +探望tanwang +探问tanwen +贪污tanwu +叹息tanxi +探险tanxian +谈心tanxin +弹性tanxing +探询tanxun +贪赃tanzang +套tao +讨tao +逃tao +陶tao +萄tao +桃tao +掏tao +涛tao +滔tao +绦tao +淘tao +鼗tao +叨*tao +啕tao +洮tao +韬tao +焘tao +饕tao +逃奔taoben +逃避taobi +逃兵taobing +逃窜taocuan +逃遁taodun +讨伐taofa +讨饭taofan +套购taogou +讨好taohao +讨还taohuan +讨价taojia +桃李taoli +韬略taolue +讨论taolun +逃命taoming +逃难taonan +逃跑taopao +淘气taoqi +逃生taosheng +淘汰taotai +滔滔taotao +逃脱taotuo +逃亡taowang +讨厌taoyan +陶冶taoye +桃子taozi +逃走taozou +陶醉taozui +踏青taqing +他人taren +踏实tashi +他说tashuo +他乡taxiang +挑拨离间tblj +台北市tbs +贪便宜tby +统筹兼顾tcjg +铁道部tdb +土地改革tdgg +同等学历tdxl +特te +忒te +忑te +慝*te +铽te +特别tebie +特产techan +特长techang +特出techu +特此teci +特大teda +特等tedeng +特地tedi +特点tedian +特定teding +特级teji +特技teji +特急teji +特将tejiang +特刊tekan +特快tekuai +特例teli +腾teng +疼teng +藤teng +誊teng +滕teng +疼爱tengai +腾达tengda +誊写tengxie +特派tepai +特区tequ +特权tequan +托儿所tes +特色tese +特使teshi +特殊teshu +特为tewei +特务tewu +特效texiao +特写texie +特性texing +特邀teyao +特意teyi +特有teyou +特约teyue +特征tezheng +特制tezhi +特种tezhong +突飞猛进tfmj +铁饭碗tfw +同甘共苦tggk +提货单thd +谈何容易thry +提ti +题ti +体ti +替ti +梯ti +惕ti +剔ti +踢ti +锑ti +蹄ti +啼ti +嚏ti +涕ti +剃ti +屉ti +倜ti +荑*ti +悌ti +逖ti +绨*ti +缇ti +鹈ti +裼ti +醍ti +天tian +田tian +添tian +填tian +甜tian +佃*tian +恬tian +舔tian +腆tian +掭tian +忝tian +阗tian +殄tian +畋tian +填报tianbao +天边tianbian +填表tianbiao +填补tianbu +天才tiancai +天长tianchang +填充tianchong +天地tiandi +田地tiandi +天鹅tiane +天府tianfu +天赋tianfu +天机tianji +天际tianji +添加tianjia +天津tianjin +恬静tianjing +天空tiankong +填空tiankong +天理tianli +天良tianliang +天亮tianliang +甜美tianmei +甜蜜tianmi +天明tianming +天平tianping +天气tianqi +天桥tianqiao +天然tianran +天壤tianrang +天色tianse +天上tianshang +天生tiansheng +天使tianshi +天堂tiantang +天体tianti +天天tiantian +甜头tiantou +天文tianwen +天下tianxia +天险tianxian +天仙tianxian +天性tianxing +天涯tianya +田野tianye +天真tianzhen +天职tianzhi +添置tianzhi +天资tianzi +条tiao +调*tiao +跳tiao +挑tiao +迢tiao +眺tiao +佻tiao +苕*tiao +祧tiao +窕tiao +蜩tiao +笤tiao +粜tiao +龆tiao +鲦tiao +髫tiao +挑拔tiaoba +跳动tiaodong +挑动tiaodong +挑逗tiaodou +跳高tiaogao +调和tiaohe +调剂tiaoji +条件tiaojian +调解tiaojie +调节tiaojie +条款tiaokuan +调理tiaoli +条理tiaoli +条例tiaoli +条令tiaoling +调配tiaopei +挑剔tiaoti +调停tiaoting +条文tiaowen +跳舞tiaowu +调戏tiaoxi +挑衅tiaoxin +挑选tiaoxuan +条约tiaoyue +挑战tiaozhan +调整tiaozheng +条子tiaozi +提拨tibo +题材ticai +体裁ticai +体操ticao +体察ticha +提倡tichang +提成ticheng +提出tichu +剔除tichu +题词tici +替代tidai +梯队tidui +铁tie +贴tie +帖tie +萜tie +餮tie +贴补tiebu +铁道tiedao +贴近tiejin +铁路tielu +贴切tieqie +贴身tieshen +铁证tiezheng +提法tifa +提防tifang +提纲tigang +提高tigao +体格tige +提供tigong +替换tihuan +体会tihui +提货tihuo +体积tiji +提价tijia +体力tili +体例tili +提炼tilian +体谅tiliang +体面timian +提名timing +题名timing +题目timu +听ting +停ting +庭ting +挺ting +廷ting +厅ting +烃ting +汀ting +亭ting +艇ting +莛ting +葶ting +婷ting +梃ting +町*ting +铤ting +蜓ting +霆ting +挺拔tingba +停办tingban +停泊tingbo +停产tingchan +听从tingcong +停顿tingdun +停工tinggong +挺括tinggua +听候tinghou +听话tinghua +停火tinghuo +听见tingjian +厅局tingju +听觉tingjue +停留tingliu +听凭tingping +听取tingqu +听任tingren +听说tingshuo +听信tingxin +厅长tingzhang +停止tingzhi +停职tingzhi +停滞tingzhi +听众tingzhong +提起tiqi +提前tiqian +提取tiqu +提升tisheng +提示tishi +体坛titan +体贴titie +提问tiwen +体温tiwen +体系tixi +体现tixian +体型tixing +提醒tixing +体验tiyan +提要tiyao +提议tiyi +体育tiyu +体制tizhi +体质tizhi +题字tizi +统计表tjb +条件反射tjfs +讨价还价tjhj +天津市tjs +条件下tjx +讨论会tlh +拖拉机tlj +他们的tmd +同盟会tmh +天南地北tndb +同tong +通tong +统tong +铜tong +痛tong +筒tong +童tong +桶tong +侗*tong +恫*tong +桐tong +酮tong +瞳tong +彤tong +捅tong +佟tong +仝tong +垌*tong +茼tong +嗵tong +峒*tong +恸tong +潼tong +砼tong +同伴tongban +同胞tongbao +通报tongbao +同辈tongbei +通病tongbing +同步tongbu +通常tongchang +通称tongcheng +统称tongcheng +痛斥tongchi +统筹tongchou +痛楚tongchu +同窗tongchuang +同道tongdao +通道tongdao +同等tongdeng +通电tongdian +通牒tongdie +通读tongdu +通告tonggao +统购tonggou +通过tongguo +通航tonghang +痛恨tonghen +同化tonghua +通话tonghua +童话tonghua +痛悔tonghui +通婚tonghun +统计tongji +通辑tongji +痛击tongji +同居tongju +痛苦tongku +痛哭tongku +痛快tongkuai +同僚tongliao +通令tongling +同盟tongmeng +同年tongnian +童年tongnian +同期tongqi +通气tongqi +同情tongqing +通融tongrong +同上tongshang +通商tongshang +同时tongshi +同事tongshi +统属tongshu +统帅tongshuai +通顺tongshun +通俗tongsu +通往tongwang +痛恶tongwu +痛惜tongxi +统辖tongxia +通向tongxiang +同乡tongxiang +统销tongxiao +通宵tongxiao +通晓tongxiao +同心tongxin +痛心tongxin +通信tongxin +同行tongxing +通行tongxing +同性tongxing +同学tongxue +通讯tongxun +同样tongyang +统一tongyi +同意tongyi +通用tongyong +通邮tongyou +统战tongzhan +同志tongzhi +统治tongzhi +通知tongzhi +头tou +投tou +透tou +偷tou +钭tou +骰tou +投案touan +头版touban +投奔touben +投标toubiao +投产touchan +透彻touche +头等toudeng +投放toufang +投机touji +投靠toukao +投篮toulan +偷懒toulan +头颅toulu +透露toulu +头面toumian +透明touming +头目toumu +头脑tounao +投票toupiao +透气touqi +投入touru +投身toushen +透视toushi +头痛toutong +偷闲touxian +投降touxiang +头绪touxu +投影touying +投掷touzhi +头子touzi +投资touzi +突破口tpk +太平洋tpy +通情达理tqdl +天气预报tqyb +突然袭击trxj +妥善处理tscl +通俗读物tsdw +挺身而出tsec +图书馆tsg +滔滔不绝ttbj +痛痛快快ttkk +团体赛tts +踏踏实实ttss +图tu +土tu +突tu +途tu +徒tu +凸tu +涂tu +吐tu +兔tu +屠tu +秃tu +堍tu +荼tu +菟tu +钍tu +酴tu +团tuan +湍tuan +抟tuan +彖tuan +疃tuan +图案tuan +湍急tuanji +团结tuanjie +团聚tuanju +湍流tuanliu +团体tuanti +团员tuanyuan +团圆tuanyuan +团长tuanzhang +突变tubian +图表tubiao +土产tuchan +突出tuchu +土地tudi +徒弟tudi +土匪tufei +土改tugai +涂改tugai +图画tuhua +土话tuhua +推tui +退tui +腿tui +颓tui +蜕tui +褪tui +忒*tui +煺tui +蜕变tuibian +退步tuibu +推测tuice +推迟tuichi +推崇tuichong +退出tuichu +推导tuidao +推动tuidong +推断tuiduan +推翻tuifan +颓废tuifei +推广tuiguang +退化tuihua +蜕化tuihua +退回tuihui +推荐tuijian +推进tuijin +推举tuiju +推开tuikai +推理tuili +推论tuilun +推敲tuiqiao +推却tuique +退却tuique +推让tuirang +退让tuirang +颓丧tuisang +退色tuise +推算tuisuan +退缩tuisuo +颓唐tuitang +推托tuituo +退伍tuiwu +推向tuixiang +推销tuixiao +推卸tuixie +推行tuixing +退休tuixiu +退学tuixue +推移tuiyi +退职tuizhi +突击tuji +图解tujie +途径tujing +徒劳tulao +图例tuli +吐露tulu +囤*tun +褪*tun +吞tun +屯tun +臀tun +氽tun +饨tun +暾tun +豚tun +吞并tunbing +吞没tunmo +吞吐tuntu +脱tuo +拖tuo +托tuo +妥tuo +椭tuo +舵*tuo +魄*tuo +鸵tuo +陀tuo +驮tuo +驼tuo +拓tuo +唾tuo +乇tuo +佗tuo +坨tuo +庹tuo +沱tuo +柝tuo +柁*tuo +橐tuo +砣tuo +铊*tuo +箨tuo +酡tuo +跎tuo +鼍tuo +驼背tuobei +拓补tuobu +脱出tuochu +妥当tuodang +脱轨tuogui +拓荒tuohuang +脱节tuojie +拖拉tuola +脱离tuoli +唾骂tuoma +唾弃tuoqi +妥善tuoshan +脱身tuoshen +妥协tuoxie +拖延tuoyan +唾液tuoye +图片tupian +突破tupo +突起tuqi +突然turan +徒然turan +土壤turang +屠杀tusha +徒手tushou +图书tushu +吐痰tutan +突围tuwei +突兀tuwu +图象tuxiang +图像tuxiang +图形tuxing +徒刑tuxing +图章tuzhang +图纸tuzhi +途中tuzhong +土著tuzhu +秃子tuzi +贪污盗窃twdq +台湾省tws +贪污受贿twsh +提心吊胆txdd +通讯社txs +同心同德txtd +同心协力txxl +推心置腹txzf +体育场tyc +体育锻炼tydl +体育馆tyg +腾云驾雾tyjw +太阳能tyn +太原市tys +天衣无缝tywf +通用性tyx +体育运动tyyd +团支部tzb +停滞不前tzbq +同志们tzm +天灾人祸tzrh +听之任之tzrz +通知书tzs +为w +我w +无w +问w +外w +五w +位w +物w +委w +完w +温w +万w +文w +往w +武w +务w +王w +围w +误w +晚w +瓦wa +挖wa +凹*wa +哇wa +蛙wa +洼wa +娃wa +袜wa +佤wa +娲wa +腽wa +外wai +歪wai +外币waibi +外边waibian +外表waibiao +外宾waibin +外部waibu +外传waichuan +外存waicun +外地waidi +外调waidiao +歪风waifeng +外观waiguan +外国waiguo +外行waihang +外汇waihui +外加waijia +外交waijiao +外界waijie +外景waijing +外科waike +外快waikuai +外流wailiu +外貌waimao +外贸waimao +外面waimian +外勤waiqin +歪曲waiqu +外商waishang +外伤waishang +外设waishe +外省waisheng +外甥waisheng +外事waishi +外围waiwei +外文waiwen +外线waixian +外销waixiao +歪斜waixie +外延waiyan +外因waiyin +外语waiyu +外援waiyuan +外在waizai +外债waizhai +外资waizi +瓦解wajie +挖掘wajue +挖苦waku +瓦砾wali +完wan +万wan +晚wan +弯wan +碗wan +顽wan +湾wan +挽wan +玩wan +蔓*wan +娩*wan +豌wan +丸wan +烷wan +皖wan +惋wan +宛wan +婉wan +腕wan +剜wan +芄wan +莞*wan +菀wan +纨wan +绾wan +琬wan +脘wan +畹wan +蜿wan +万般wanban +晚报wanbao +完备wanbei +完毕wanbi +完成wancheng +万代wandai +顽敌wandi +万吨wandun +万恶wane +万分wanfen +往wang +王wang +望wang +网wang +忘wang +妄wang +亡wang +旺wang +芒*wang +汪wang +枉wang +罔wang +尢wang +惘wang +辋wang +魍wang +往常wangchang +王朝wangchao +忘掉wangdiao +妄动wangdong +枉法wangfa +往返wangfan +枉费wangfei +往复wangfu +王国wangguo +亡国wangguo +往后wanghou +忘怀wanghuai +忘记wangji +旺季wangji +往来wanglai +网络wangluo +亡命wangming +往年wangnian +完工wangong +忘却wangque +枉然wangran +惘然wangran +往日wangri +旺盛wangsheng +往事wangshi +妄图wangtu +万古wangu +顽固wangu +往往wangwang +汪汪wangwang +忘我wangwo +往昔wangxi +妄想wangxiang +汪洋wangyang +望远wangyuan +王子wangzi +完好wanhao +晚会wanhui +挽回wanhui +晚婚wanhun +晚间wanjian +完结wanjie +挽救wanjiu +玩具wanju +顽抗wankang +完了wanle +挽力wanli +弯路wanlu +完美wanmei +万能wanneng +万年wannian +晚年wannian +玩弄wannong +晚期wanqi +顽强wanqiang +弯曲wanqu +完全wanquan +完善wanshan +晚上wanshang +玩赏wanshang +万事wanshi +万世wanshi +玩耍wanshua +万岁wansui +万万wanwan +万物wanwu +晚霞wanxia +万象wanxiang +玩笑wanxiao +万幸wanxing +婉言wanyan +万一wanyi +万元wanyuan +完整wanzheng +顽症wanzheng +万众wanzhong +宛转wanzhuan +瓦斯wasi +瓦特wate +娃娃wawa +外部设备wbsb +微不足道wbzd +无产阶级wcjj +微处理机wclj +无产者wcz +为wei +位wei +委wei +围wei +维wei +唯wei +卫wei +微wei +伟wei +未wei +威wei +危wei +尾wei +谓wei +喂wei +味wei +胃wei +魏wei +伪wei +遗*wei +违wei +韦wei +畏wei +纬wei +巍wei +桅wei +惟wei +潍wei +苇wei +萎wei +蔚wei +渭wei +尉wei +慰wei +偎wei +诿wei +隈wei +隗*wei +圩*wei +葳wei +薇wei +囗wei +帏wei +帷wei +崴wei +嵬wei +猥wei +猬wei +闱wei +沩wei +洧wei +涠wei +逶wei +娓wei +玮wei +韪wei +軎wei +炜wei +煨wei +痿wei +艉wei +鲔wei +尾巴weiba +违背weibei +未必weibi +威逼weibi +微波weibo +微薄weibo +未曾weiceng +未尝weichang +维持weichi +为此weici +伟大weida +味道weidao +纬度weidu +唯独weidu +巍峨weie +违法weifa +违反weifan +违犯weifan +威风weifeng +桅杆weigan +微观weiguan +危害weihai +为何weihe +维护weihu +危及weiji +微机weiji +危机weiji +危急weiji +围歼weijian +围剿weijiao +慰藉weijie +违禁weijin +未经weijing +畏惧weiju +违抗weikang +未可weike +唯恐weikong +惟恐weikong +胃口weikou +未来weilai +慰劳weilao +为了weile +威力weili +委靡weimi +未免weimian +微妙weimiao +帷幕weimu +危难weinan +畏难weinan +未能weineng +委派weipai +为期weiqi +畏怯weiqie +委曲weiqu +委屈weiqu +未然weiran +巍然weiran +围绕weirao +伟人weiren +委任weiren +微弱weiruo +威慑weishe +为生weisheng +卫生weisheng +尾声weisheng +卫士weishi +威势weishi +为首weishou +为数weishu +尾随weisui +未遂weisui +畏缩weisuo +萎缩weisuo +猥琐weisuo +委托weituo +委婉weiwan +危亡weiwang +巍巍weiwei +慰问weiwen +唯物weiwu +威武weiwu +微细weixi +威吓weixia +危险weixian +微小weixiao +微笑weixiao +威协weixie +威胁weixie +猥亵weixie +维新weixin +唯心weixin +违心weixin +威信weixin +微型weixing +卫星weixing +维修weixiu +威严weiyan +伟业weiye +唯一weiyi +位移weiyi +位于weiyu +谓语weiyu +委员weiyuan +为止weizhi +位置weizhi +未知weizhi +为重weizhong +为主weizhu +伪装weizhuang +问wen +温wen +文wen +稳wen +纹wen +闻wen +蚊wen +瘟wen +吻wen +紊wen +刎wen +阌wen +汶wen +璺wen +雯wen +文本wenben +瘟病wenbing +稳步wenbu +问答wenda +稳定wending +温度wendu +嗡weng +翁weng +瓮weng +蓊weng +蕹weng +稳固wengu +问好wenhao +温和wenhe +吻合wenhe +文化wenhua +文件wenjian +稳健wenjian +问津wenjin +文静wenjing +文具wenju +文科wenke +文盲wenmang +文明wenming +闻名wenming +温暖wennuan +文凭wenping +文人wenren +温柔wenrou +问世wenshi +文坛wentan +问题wenti +文体wenti +稳妥wentuo +文物wenwu +文献wenxian +文选wenxuan +文学wenxue +问讯wenxun +闻讯wenxun +文艺wenyi +瘟疫wenyi +文娱wenyu +文摘wenzhai +文章wenzhang +稳重wenzhong +文字wenzi +问罪wenzui +望而生畏wesw +闻风而动wfed +违法乱纪wflj +歪风邪气wfxq +温故知新wgzx +文化部whb +文汇报whb +文化馆whg +文化宫whg +武汉市whs +五湖四海whsh +忘乎所以whsy +问寒问暖whwn +文化娱乐whyl +玩忽职守whzs +外交部wjb +无纪律wjl +五讲四美wjsm +无拘无束wjws +无可奉告wkfg +无可非议wkfy +无可奈何wknh +乌鲁木齐wlmq +无理取闹wlqn +无论如何wlrh +物美价廉wmjl +误码率wml +文明礼貌wmlm +无名英雄wmyx +无能为力wnwl +我wo +握wo +窝wo +蜗wo +涡wo +沃wo +挝wo +卧wo +斡wo +倭wo +莴wo +喔wo +幄wo +渥wo +肟wo +硪wo +龌wo +窝藏wocang +卧床wochuang +我党wodang +卧倒wodao +我的wode +窝工wogong +我国woguo +我军wojun +我们women +窝囊wonang +我省wosheng +我校woxiao +为期不远wqby +无穷无尽wqwj +误入歧途wrqt +卫生部wsb +纹丝不动wsbd +万事大吉wsdj +万事俱备wsjb +为什么wsm +无所谓wsw +为所欲为wsyw +无所作为wszw +无wu +五wu +物wu +武wu +务wu +误wu +伍wu +舞wu +污wu +悟wu +雾wu +午wu +恶*wu +屋wu +乌wu +吴wu +亡*wu +诬wu +钨wu +巫wu +呜wu +芜wu +梧wu +吾wu +毋wu +捂wu +侮wu +坞wu +戊wu +晤wu +勿wu +兀wu +仵wu +阢wu +邬wu +圬wu +芴wu +唔wu +庑wu +怃wu +忤wu +浯wu +寤wu +迕wu +妩wu +婺wu +骛wu +杌wu +牾wu +於*wu +焐wu +鹉wu +鹜wu +痦wu +蜈wu +鋈wu +鼯wu +吾辈wubei +无比wubi +五笔wubi +务必wubi +舞弊wubi +无边wubian +无不wubu +五彩wucai +误差wucha +无常wuchang +无偿wuchang +舞场wuchang +武昌wuchang +无耻wuchi +无从wucong +武打wuda +舞蹈wudao +无敌wudi +舞动wudong +武斗wudou +武断wuduan +无法wufa +无妨wufang +无非wufei +武功wugong +污垢wugou +无故wugu +无关wuguan +五官wuguan +武官wuguan +无害wuhai +诬害wuhai +武汉wuhan +无何wuhe +乌黑wuhei +五湖wuhu +呜呼wuhu +误会wuhui +舞会wuhui +污秽wuhui +无及wuji +无机wuji +物价wujia +无间wujian +物件wujian +误解wujie +五届wujie +五金wujin +无愧wukui +无赖wulai +诬赖wulai +无理wuli +物理wuli +无礼wuli +物力wuli +武力wuli +无聊wuliao +无虑wulu +无论wulun +污蔑wumie +诬蔑wumie +无奈wunai +无能wuneng +毋宁wuning +务农wunong +物品wupin +无期wuqi +五七wuqi +武器wuqi +无情wuqing +无穷wuqiong +舞曲wuqu +无权wuquan +污染wuran +无任wuren +污辱wuru +侮辱wuru +物色wuse +无上wushang +误伤wushang +无声wusheng +午时wushi +务使wushi +无视wushi +误事wushi +务实wushi +无数wushu +武术wushu +无双wushuang +午睡wushui +五四wusi +无私wusi +舞台wutai +无题wuti +物体wuti +舞厅wuting +无为wuwei +无谓wuwei +无物wuwu +无暇wuxia +无限wuxian +诬陷wuxian +无效wuxiao +五星wuxing +午休wuxiu +无须wuxu +无需wuxu +务虚wuxu +午夜wuye +五一wuyi +无益wuyi +无疑wuyi +无垠wuyin +无用wuyong +毋庸wuyong +无余wuyu +无缘wuyuan +五月wuyue +物证wuzheng +无知wuzhi +物质wuzhi +武装wuzhuang +物资wuzi +兀自wuzi +误字wuzi +无罪wuzui +无微不至wwbz +唯物论wwl +卧薪尝胆wxcd +无线电wxd +微型机wxj +唯心论wxl +问心无愧wxwk +委员会wyh +无缘无故wywg +委员长wyz +误字率wzl +无足轻重wzqz +未知数wzs +完整无缺wzwq +学x +下x +行x +小x +线x +性x +新x +些x +想x +心x +向x +相x +系x +席x +现x +西x +修x +象x +先x +形x +心安理得xald +西安市xas +西半球xbq +相比之下xbzx +宣传部xcb +新陈代谢xcdx +新产品xcp +畜产品xcp +西城区xcq +喜出望外xcww +相对而言xdey +现代化xdh +想当然xdr +相对误差xdwc +先睹为快xdwk +形而上学xesx +显而易见xeyj +西方国家xfgj +消费品xfp +想方设法xfsf +先发制人xfzr +兴高采烈xgcl +新华社xhs +新华书店xhsd +系xi +席xi +西xi +习xi +细xi +吸xi +析xi +喜xi +洗xi +铣xi +稀xi +戏xi +隙xi +希xi +息xi +袭xi +锡xi +烯xi +牺xi +悉xi +惜xi +溪xi +腊*xi +栖*xi +昔xi +熙xi +硒xi +矽xi +晰xi +嘻xi +膝xi +夕xi +熄xi +汐xi +犀xi +檄xi +媳xi +僖xi +兮xi +隰xi +郗xi +茜*xi +菥xi +葸xi +蓰xi +奚xi +唏xi +徙xi +饩xi +阋xi +浠xi +淅xi +屣xi +嬉xi +玺xi +樨xi +曦xi +觋xi +欷xi +歙*xi +熹xi +禊xi +禧xi +皙xi +穸xi +裼*xi +蜥xi +螅xi +蟋xi +舄xi +舾xi +羲xi +粞xi +翕xi +醯xi +蹊*xi +鼷xi +下xia +夏xia +吓xia +狭xia +霞xia +唬*xia +瞎xia +虾xia +匣xia +辖xia +暇xia +峡xia +侠xia +厦xia +呷xia +狎xia +遐xia +瑕xia +柙xia +硖xia +瘕*xia +罅xia +黠xia +狭隘xiaai +下班xiaban +下辈xiabei +下边xiabian +下策xiace +下层xiaceng +下场xiachang +下沉xiachen +下次xiaci +瑕疵xiaci +下达xiada +吓倒xiadao +下等xiadeng +下毒xiadu +下发xiafa +下放xiafang +峡谷xiagu +霞光xiaguang +瞎话xiahua +喜爱xiai +下级xiaji +下集xiaji +夏季xiaji +下降xiajiang +侠客xiake +下来xialai +下联xialian +夏粮xialiang +下列xialie +下令xialing +下流xialiu +下落xialuo +下马xiama +厦门xiamen +下面xiamian +线xian +现xian +先xian +县xian +限xian +见*xian +显xian +鲜xian +献xian +险xian +陷xian +宪xian +纤xian +洗*xian +掀xian +弦xian +铣*xian +腺xian +锨xian +仙xian +咸xian +贤xian +衔xian +舷xian +闲xian +涎xian +嫌xian +馅xian +羡xian +冼xian +苋xian +莶xian +藓xian +岘xian +猃xian +暹xian +娴xian +氙xian +燹xian +祆xian +鹇xian +痫xian +蚬xian +筅xian +籼xian +酰xian +跣xian +跹xian +霰xian +西安xian +献宝xianbao +先辈xianbei +现场xianchang +现成xiancheng +县城xiancheng +献丑xianchou +献词xianci +现存xiancun +现代xiandai +先导xiandao +显得xiande +险地xiandi +限定xianding +限度xiandu +线段xianduan +限额xiane +险恶xiane +宪法xianfa +先锋xianfeng +险峰xianfeng +想xiang +向xiang +相xiang +象xiang +响xiang +项xiang +箱xiang +乡xiang +降*xiang +香xiang +像xiang +详xiang +橡xiang +享xiang +湘xiang +厢xiang +镶xiang +襄xiang +翔xiang +祥xiang +巷xiang +芗xiang +葙xiang +饷xiang +庠xiang +骧xiang +缃xiang +蟓xiang +鲞xiang +飨xiang +相爱xiangai +相比xiangbi +想必xiangbi +相差xiangcha +相称xiangcheng +相处xiangchu +相传xiangchuan +乡村xiangcun +相当xiangdang +向导xiangdao +相等xiangdeng +相对xiangdui +想法xiangfa +相反xiangfan +相仿xiangfang +相干xianggan +香港xianggang +相隔xiangge +相关xiangguan +相好xianghao +相互xianghu +相继xiangji +相加xiangjia +相见xiangjian +相减xiangjian +相交xiangjiao +橡胶xiangjiao +相近xiangjin +详尽xiangjin +巷口xiangkou +向来xianglai +相连xianglian +向量xiangliang +响亮xiangliang +相貌xiangmao +项目xiangmu +想念xiangnian +相片xiangpian +想起xiangqi +详情xiangqing +向上xiangshang +相声xiangsheng +响声xiangsheng +相识xiangshi +翔实xiangshi +享受xiangshou +相思xiangsi +相似xiangsi +香甜xiangtian +相同xiangtong +相投xiangtou +显贵xiangui +向往xiangwang +详细xiangxi +向下xiangxia +乡下xiangxia +象限xiangxian +想象xiangxiang +相信xiangxin +香烟xiangyan +相依xiangyi +相宜xiangyi +相应xiangying +相映xiangying +响应xiangying +享用xiangyong +相遇xiangyu +相约xiangyue +乡镇xiangzhen +象征xiangzheng +箱子xiangzi +陷害xianhai +显赫xianhe +鲜红xianhong +先后xianhou +鲜花xianhua +献花xianhua +闲话xianhua +贤惠xianhui +献计xianji +献技xianji +显见xianjian +衔接xianjie +先进xianjin +现金xianjin +险境xianjing +陷阱xianjing +现款xiankuan +现况xiankuang +先例xianli +献礼xianli +先烈xianlie +线路xianlu +显露xianlu +鲜美xianmei +鲜明xianming +贤明xianming +显目xianmu +羡慕xianmu +贤能xianneng +先期xianqi +掀起xianqi +限期xianqi +嫌弃xianqi +先前xianqian +先遣xianqian +险情xianqing +先驱xianqu +显然xianran +贤人xianren +闲人xianren +现任xianren +陷入xianru +闲散xiansan +献身xianshen +先生xiansheng +先是xianshi +现实xianshi +显示xianshi +娴熟xianshu +线索xiansuo +闲谈xiantan +险滩xiantan +先天xiantian +线条xiantiao +县委xianwei +纤维xianwei +显现xianxian +现象xianxiang +现行xianxing +鲜血xianxue +显眼xianyan +鲜艳xianyan +显要xianyao +险要xianyao +显耀xianyao +现役xianyi +嫌疑xianyi +现有xianyou +限于xianyu +闲杂xianza +现在xianzai +县长xianzhang +宪章xianzhang +限制xianzhi +先知xianzhi +闲置xianzhi +闲职xianzhi +显著xianzhu +现状xianzhuang +险阻xianzu +小xiao +消xiao +削xiao +效xiao +笑xiao +校xiao +销xiao +硝xiao +萧xiao +肖xiao +孝xiao +霄xiao +哮xiao +嚣xiao +宵xiao +淆xiao +晓xiao +啸xiao +哓xiao +崤xiao +潇xiao +逍xiao +骁xiao +绡xiao +枭xiao +枵xiao +蛸*xiao +筱xiao +箫xiao +魈xiao +小报xiaobao +小辈xiaobei +笑柄xiaobing +消沉xiaochen +消除xiaochu +消毒xiaodu +效法xiaofa +小贩xiaofan +消防xiaofang +消费xiaofei +校风xiaofeng +小鬼xiaogui +效果xiaoguo +小孩xiaohai +消耗xiaohao +消化xiaohua +笑话xiaohua +小惠xiaohui +销毁xiaohui +销魂xiaohun +消极xiaoji +削减xiaojian +小结xiaojie +小姐xiaojie +孝敬xiaojing +校刊xiaokan +小康xiaokang +效劳xiaolao +效力xiaoli +销路xiaolu +效率xiaolu +消灭xiaomie +消磨xiaomo +效能xiaoneng +消气xiaoqi +消遣xiaoqian +笑容xiaorong +削弱xiaoruo +潇洒xiaosa +校舍xiaoshe +小时xiaoshi +消失xiaoshi +消逝xiaoshi +消瘦xiaoshou +销售xiaoshou +小数xiaoshu +小说xiaoshuo +萧条xiaotiao +消息xiaoxi +肖像xiaoxiang +小心xiaoxin +枭雄xiaoxiong +小学xiaoxue +效验xiaoyan +逍遥xiaoyao +效益xiaoyi +效应xiaoying +校友xiaoyou +小于xiaoyu +校园xiaoyuan +销赃xiaozang +校长xiaozhang +嚣张xiaozhang +效忠xiaozhong +小组xiaozu +下情xiaqing +下去xiaqu +辖区xiaqu +下手xiashou +夏收xiashou +下属xiashu +下水xiashui +下台xiatai +夏天xiatian +下文xiawen +下午xiawu +下限xiaxian +下乡xiaxiang +遐想xiaxiang +狭义xiayi +下游xiayou +狭窄xiazhai +夏至xiazhi +夏种xiazhong +喜报xibao +细胞xibao +西北xibei +西边xibian +稀薄xibo +锡箔xibo +西餐xican +洗涤xidi +吸毒xidu +些xie +解*xie +写xie +斜xie +谢xie +协xie +械xie +叶*xie +血*xie +卸xie +屑xie +鞋xie +歇xie +邪xie +胁xie +蟹xie +泄xie +泻xie +契*xie +楔xie +蝎xie +挟xie +携xie +谐xie +懈xie +偕xie +亵xie +勰xie +燮xie +薤xie +撷xie +獬xie +廨xie +渫xie +瀣xie +邂xie +绁xie +缬xie +榭xie +榍xie +颉*xie +躞xie +写出xiechu +协从xiecong +携带xiedai +邪道xiedao +协调xiediao +协定xieding +亵渎xiedu +邪恶xiee +协和xiehe +谐和xiehe +协会xiehui +谢绝xiejue +协力xieli +泄漏xielou +邪路xielu +泄露xielu +泄密xiemi +邪念xienian +胁迫xiepo +邪气xieqi +协商xieshang +写生xiesheng +携手xieshou +邪说xieshuo +协同xietong +歇息xiexi +谢谢xiexie +协议xieyi +谐音xieyin +协约xieyue +写照xiezhao +协助xiezhu +鞋子xiezi +写作xiezuo +协作xiezuo +西方xifang +西风xifeng +西服xifu +吸附xifu +媳妇xifu +习惯xiguan +西汉xihan +稀罕xihan +希罕xihan +喜欢xihuan +袭击xiji +细节xijie +洗劫xijie +喜剧xiju +戏剧xiju +席卷xijuan +细菌xijun +犀利xili +系列xilie +奚落xiluo +熄灭ximie +新xin +心xin +信xin +锌xin +芯xin +辛xin +寻*xin +欣xin +薪xin +忻xin +衅xin +囟xin +馨xin +昕xin +歆xin +镡*xin +鑫xin +心爱xinai +西南xinan +新春xinchun +信贷xindai +心得xinde +心烦xinfan +心服xinfu +信服xinfu +行xing +性xing +形xing +型xing +星xing +兴xing +省*xing +醒xing +姓xing +幸xing +腥xing +猩xing +惺xing +刑xing +邢xing +杏xing +陉xing +荇xing +荥xing +擤xing +饧xing +悻xing +硎xing +心甘xingan +兴办xingban +性别xingbie +姓别xingbie +刑场xingchang +星辰xingchen +形成xingcheng +行程xingcheng +行动xingdong +幸而xinger +刑法xingfa +刑罚xingfa +兴奋xingfen +幸福xingfu +性格xingge +幸好xinghao +型号xinghao +行贿xinghui +星火xinghuo +性急xingji +形迹xingji +兴建xingjian +行径xingjing +行军xingjun +星空xingkong +幸亏xingkui +行李xingli +行旅xinglu +幸免xingmian +性命xingming +姓名xingming +醒目xingmu +性能xingneng +行期xingqi +兴起xingqi +星期xingqi +性情xingqing +星球xingqiu +兴趣xingqu +形容xingrong +行商xingshang +兴盛xingsheng +行使xingshi +行事xingshi +行驶xingshi +形式xingshi +幸事xingshi +刑事xingshi +形势xingshi +姓氏xingshi +行署xingshu +兴衰xingshuai +形态xingtai +形体xingti +兴亡xingwang +兴旺xingwang +行为xingwei +行文xingwen +醒悟xingwu +形象xingxiang +行销xingxiao +星星xingxing +行凶xingxiong +兴修xingxiu +行业xingye +星夜xingye +幸运xingyun +行政xingzheng +性质xingzhi +兴致xingzhi +形状xingzhuang +行走xingzou +信号xinhao +心狠xinhen +心慌xinhuang +信汇xinhui +细腻xini +西宁xining +心急xinji +信件xinjian +新疆xinjiang +新近xinjin +新居xinju +心坎xinkan +辛苦xinku +信赖xinlai +辛劳xinlao +心理xinli +心里xinli +心灵xinling +心目xinmu +信念xinnian +戏弄xinong +新奇xinqi +辛勤xinqin +心情xinqing +新区xinqu +新人xinren +信任xinren +欣赏xinshang +新生xinsheng +心声xinsheng +新事xinshi +新式xinshi +新书xinshu +薪水xinshui +心酸xinsuan +辛酸xinsuan +心疼xinteng +心田xintian +心跳xintiao +心头xintou +欣慰xinwei +新闻xinwen +心细xinxi +信息xinxi +欣喜xinxi +新鲜xinxian +心想xinxiang +信箱xinxiang +馨香xinxiang +信心xinxin +新型xinxing +新星xinxing +新兴xinxing +心虚xinxu +心血xinxue +信仰xinyang +心意xinyi +新异xinyi +新颖xinying +信用xinyong +新余xinyu +信誉xinyu +心愿xinyuan +心脏xinzang +新址xinzhi +心中xinzhong +雄xiong +胸xiong +兄xiong +凶xiong +熊xiong +匈xiong +汹xiong +芎xiong +雄辩xiongbian +雄兵xiongbing +凶残xiongcan +兄弟xiongdi +凶恶xionge +雄关xiongguan +凶狠xionghen +雄厚xionghou +胸怀xionghuai +雄健xiongjian +胸口xiongkou +熊猫xiongmao +凶猛xiongmeng +匈奴xiongnu +凶器xiongqi +凶杀xiongsha +雄师xiongshi +凶手xiongshou +胸膛xiongtang +雄伟xiongwei +雄心xiongxin +汹涌xiongyong +雄壮xiongzhuang +雄姿xiongzi +西欧xiou +习气xiqi +吸气xiqi +喜气xiqi +稀奇xiqi +希奇xiqi +喜庆xiqing +吸取xiqu +戏曲xiqu +昔日xiri +牺牲xisheng +西式xishi +喜事xishi +稀释xishi +吸收xishou +系数xishu +洗刷xishua +吸吮xishun +习俗xisu +习题xiti +西天xitian +系统xitong +修xiu +锈xiu +休xiu +袖xiu +秀xiu +朽xiu +宿*xiu +臭*xiu +羞xiu +嗅xiu +绣xiu +咻xiu +岫xiu +馐xiu +庥xiu +溴xiu +鸺xiu +貅xiu +髹xiu +修补xiubu +秀才xiucai +羞耻xiuchi +修辞xiuci +修订xiuding +修复xiufu +修改xiugai +修建xiujian +修剪xiujian +嗅觉xiujue +休克xiuke +羞愧xiukui +修理xiuli +秀丽xiuli +秀气xiuqi +羞辱xiuru +羞涩xiuse +修饰xiushi +休息xiuxi +休想xiuxiang +修养xiuyang +休养xiuyang +修造xiuzao +袖章xiuzhang +袖珍xiuzhen +修正xiuzheng +修筑xiuzhu +希望xiwang +席位xiwei +细微xiwei +西文xiwen +檄文xiwen +细小xixiao +细心xixin +悉心xixin +喜讯xixun +吸烟xiyan +西洋xiyang +西医xiyi +吸引xiyin +希有xiyou +戏院xiyuan +喜悦xiyue +西藏xizang +洗澡xizao +细则xize +细致xizhi +习作xizuo +下基层xjc +现阶段xjd +新技术xjs +献计献策xjxc +先见之明xjzm +兴利除弊xlcb +系列化xlh +稀里糊涂xlht +狭路相逢xlxf +畜牧业xmy +心满意足xmyz +西宁市xns +小朋友xpy +向前看xqk +喜气洋洋xqyy +先人后己xrhj +兴师动众xsdz +销售额xse +刑事犯罪xsfz +小时候xsh +新时期xsq +新生事物xssw +形式主义xszy +相提并论xtbl +续xu +许xu +须xu +需xu +序xu +虚xu +絮xu +畜xu +叙xu +蓄xu +绪xu +徐xu +墟xu +戌xu +嘘xu +酗xu +旭xu +恤xu +婿xu +吁*xu +诩xu +勖xu +圩xu +蓿xu +洫xu +浒*xu +溆xu +顼xu +栩xu +煦xu +砉*xu +盱xu +胥xu +糈xu +醑xu +选xuan +旋xuan +宣xuan +悬xuan +玄xuan +券*xuan +轩xuan +喧xuan +癣xuan +眩xuan +绚xuan +儇xuan +谖xuan +萱xuan +揎xuan +泫xuan +渲xuan +漩xuan +璇xuan +楦xuan +暄xuan +炫xuan +煊xuan +碹xuan +铉xuan +镟xuan +痃xuan +悬案xuanan +轩昂xuanang +选拔xuanba +宣布xuanbu +选材xuancai +选场xuanchang +宣称xuancheng +宣传xuanchuan +选定xuanding +宣读xuandu +宣告xuangao +选购xuangou +悬挂xuangua +玄乎xuanhu +喧哗xuanhua +选集xuanji +宣讲xuanjiang +选举xuanju +绚烂xuanlan +绚丽xuanli +选录xuanlu +旋律xuanlu +选民xuanmin +喧闹xuannao +悬念xuannian +选派xuanpai +宣判xuanpan +选配xuanpei +选票xuanpiao +选区xuanqu +选取xuanqu +喧嚷xuanrang +宣誓xuanshi +选手xuanshou +悬殊xuanshu +旋涡xuanwo +玄虚xuanxu +悬崖xuanya +宣言xuanyan +宣扬xuanyang +炫耀xuanyao +选用xuanyong +选择xuanze +宣战xuanzhan +选种xuanzhong +旋转xuanzhuan +许多xuduo +学xue +血xue +削*xue +雪xue +穴xue +靴xue +薛xue +谑xue +噱*xue +泶xue +踅xue +鳕xue +学报xuebao +学部xuebu +学潮xuechao +学费xuefei +学风xuefeng +学府xuefu +血汗xuehan +学好xuehao +学会xuehui +学籍xueji +血迹xueji +学科xueke +血泪xuelei +学历xueli +学龄xueling +学年xuenian +学派xuepai +学期xueqi +血肉xuerou +学生xuesheng +学时xueshi +学识xueshi +学士xueshi +学术xueshu +血书xueshu +学说xueshuo +血统xuetong +学徒xuetu +学位xuewei +学问xuewen +学习xuexi +血洗xuexi +学校xuexiao +血压xueya +学业xueye +血液xueye +学友xueyou +学员xueyuan +学院xueyuan +血晕xueyun +血战xuezhan +学者xuezhe +学制xuezhi +虚构xugou +序号xuhao +蓄积xuji +虚假xujia +叙旧xujiu +许可xuke +序列xulie +绪论xulun +虚名xuming +序幕xumu +畜牧xumu +训xun +旬xun +迅xun +讯xun +寻xun +循xun +巡xun +荤*xun +浚*xun +勋xun +熏xun +询xun +驯xun +殉xun +汛xun +逊xun +巽xun +郇*xun +埙xun +荀xun +蕈xun +薰xun +峋xun +徇xun +獯xun +恂xun +洵xun +浔xun +曛xun +窨*xun +醺xun +鲟xun +巡捕xunbu +巡查xuncha +寻常xunchang +驯服xunfu +殉国xunguo +巡航xunhang +循环xunhuan +巡回xunhui +虚拟xuni +寻机xunji +巡警xunjing +勋爵xunjue +训练xunlian +巡逻xunluo +迅猛xunmeng +寻求xunqiu +逊色xunse +巡视xunshi +徇私xunsi +迅速xunsu +熏陶xuntao +许诺xunuo +讯问xunwen +询问xunwen +寻衅xunxin +循序xunxu +勋章xunzhang +寻找xunzhao +殉职xunzhi +寻址xunzhi +需求xuqiu +序曲xuqu +虚荣xurong +虚弱xuruo +虚设xushe +叙事xushi +虚实xushi +序数xushu +虚数xushu +叙述xushu +叙说xushuo +虚伪xuwei +虚心xuxin +序言xuyan +需要xuyao +须臾xuyu +许愿xuyuan +须知xuzhi +宣武区xwq +信息处理xxcl +循序见进xxjj +辛辛苦苦xxkk +信息量xxl +熙熙攘攘xxrr +小学生xxs +欣欣向荣xxxr +小心翼翼xxyy +下一步xyb +胸有成竹xycz +洗衣机xyj +小意思xys +习以为常xywc +新颖性xyx +兴致勃勃xzbb +新中国xzg +行政区域xzqy +雪中送炭xzst +心中无数xzws +选择性xzx +心中有数xzys +行之有效xzyx +一y +有y +用y +要y +以y +于y +也y +样y +义y +与y +由y +压y +员y +月y +意y +又y +运y +原y +油y +验y +压ya +亚ya +呀ya +牙ya +芽ya +雅ya +蚜ya +鸭ya +匹*ya +押ya +鸦ya +丫ya +崖ya +衙ya +涯ya +哑ya +讶ya +伢ya +垭ya +揠ya +岈ya +迓ya +娅ya +琊ya +桠ya +氩ya +砑ya +睚ya +痖ya +哑巴yaba +牙齿yachi +压倒yadao +压服yafu +牙关yaguan +雅观yaguan +压价yajia +押金yajin +亚军yajun +压力yali +验yan +研yan +严yan +眼yan +言yan +盐yan +演yan +岩yan +沿yan +烟yan +延yan +掩yan +宴yan +炎yan +颜yan +燕yan +衍yan +铅*yan +焉yan +咽yan +阉yan +淹yan +蜒yan +阎yan +奄yan +艳yan +堰yan +厌yan +砚yan +雁yan +唁yan +彦yan +焰yan +谚yan +殷*yan +厣yan +赝yan +剡*yan +俨yan +偃yan +兖yan +谳yan +阽*yan +郾yan +鄢yan +芫*yan +菸yan +崦yan +恹yan +闫yan +阏yan +湮yan +滟yan +妍yan +嫣yan +琰yan +檐yan +晏yan +胭yan +腌*yan +焱yan +罨yan +筵yan +酽yan +魇yan +餍yan +鼹yan +沿岸yanan +严办yanban +掩蔽yanbi +演变yanbian +烟草yancao +延长yanchang +演唱yanchang +严惩yancheng +延迟yanchi +演出yanchu +唁电yandian +严冬yandong +厌恶yane +厌烦yanfan +样yang +养yang +氧yang +扬yang +洋yang +阳yang +羊yang +秧yang +央yang +杨yang +仰yang +殃yang +鸯yang +佯yang +疡yang +痒yang +漾yang +徉yang +怏yang +泱yang +炀yang +烊yang +恙yang +蛘yang +鞅yang +掩盖yangai +样板yangban +样本yangben +洋财yangcai +养成yangcheng +沿革yange +严格yange +阳光yangguang +洋行yanghang +养护yanghu +氧化yanghua +养料yangliao +杨柳yangliu +仰面yangmian +殃民yangmin +仰慕yangmu +样品yangpin +洋气yangqi +扬弃yangqi +央求yangqiu +养伤yangshang +样式yangshi +阳台yangtai +眼光yanguang +仰望yangwang +洋务yangwu +洋相yangxiang +扬言yangyan +样样yangyang +洋溢yangyi +养育yangyu +养殖yangzhi +样子yangzi +沿海yanhai +严寒yanhan +眼红yanhong +咽喉yanhou +掩护yanhu +眼花yanhua +延缓yanhuan +宴会yanhui +焰火yanhuo +演讲yanjiang +眼界yanjie +严禁yanjin +严谨yanjin +眼镜yanjing +眼睛yanjing +研究yanjiu +严峻yanjun +眼看yankan +严酷yanku +眼眶yankuang +眼泪yanlei +眼力yanli +严厉yanli +艳丽yanli +眼帘yanlian +眼亮yanliang +言路yanlu +沿路yanlu +言论yanlun +掩埋yanmai +严密yanmi +严明yanming +烟幕yanmu +延年yannian +延期yanqi +眼前yanqian +宴请yanqing +俨然yanran +炎热yanre +眼色yanse +颜色yanse +延伸yanshen +岩石yanshi +演示yanshi +掩饰yanshi +验收yanshou +严守yanshou +延寿yanshou +演说yanshuo +严肃yansu +演算yansuan +言谈yantan +研讨yantao +沿途yantu +阎王yanwang +延误yanwu +烟雾yanwu +宴席yanxi +筵席yanxi +演习yanxi +沿袭yanxi +眼下yanxia +沿线yanxian +言行yanxing +严刑yanxing +延续yanxu +艳阳yanyang +演义yanyi +演绎yanyi +掩映yanying +沿用yanyong +言语yanyu +演员yanyuan +厌战yanzhan +沿着yanzhe +验证yanzheng +研制yanzhi +严重yanzhong +演奏yanzou +要yao +药yao +约*yao +摇yao +腰yao +咬yao +邀yao +耀yao +陶*yao +侥*yao +疟yao +妖yao +瑶yao +尧yao +遥yao +窑yao +谣yao +姚yao +舀yao +钥*yao +夭yao +爻yao +吆yao +崾yao +徭yao +幺yao +珧yao +杳yao +轺yao +曜yao +肴yao +铫*yao +鹞yao +窈yao +繇yao +鳐yao +摇摆yaobai +腰包yaobao +要不yaobu +谣传yaochuan +要得yaode +要点yaodian +摇动yaodong +窑洞yaodong +遥感yaogan +妖怪yaoguai +要害yaohai +摇撼yaohan +摇晃yaohuang +要件yaojian +要紧yaojin +摇控yaokong +遥控yaokong +摇篮yaolan +要领yaoling +要么yaome +妖魔yaomo +要目yaomu +邀请yaoqing +要求yaoqiu +要塞yaosai +要是yaoshi +钥匙yaoshi +要素yaosu +窈窕yaotiao +摇头yaotou +要闻yaowen +药物yaowu +要挟yaoxie +耀眼yaoyan +谣言yaoyan +妖艳yaoyan +夭折yaozhe +要职yaozhi +鸦片yapian +压迫yapo +压强yaqiang +压缩yasuo +雅兴yaxing +压仰yayang +压抑yayi +压榨yazha +压制yazhi +雅致yazhi +亚洲yazhou +鸭子yazi +雅座yazuo +要不得ybd +一般的说ybds +一部分ybf +要不然ybr +要不是ybs +一般说来ybsl +要不要yby +一辈子ybz +一把抓ybz +用不着ybz +扬长避短ycbd +由此可见yckj +银川市ycs +与此同时ycts +有偿转让yczr +邮电部ydb +有道德ydd +邮电局ydj +一刀切ydq +运动员ydy +印度洋ydy +因地制宜ydzy +也ye +业ye +页ye +叶ye +液ye +夜ye +野ye +爷ye +冶ye +邪*ye +哗*ye +咽*ye +椰ye +噎ye +耶ye +掖ye +曳ye +腋ye +拽*ye +靥ye +谒ye +邺ye +揶ye +晔ye +烨ye +铘ye +夜餐yecan +野餐yecan +野火yehuo +业绩yeji +夜间yejian +冶金yejin +夜里yeli +冶练yelian +野蛮yeman +夜幕yemu +夜色yese +也是yeshi +夜市yeshi +野兽yeshou +液体yeti +野外yewai +夜晚yewan +业务yewu +夜校yexiao +野心yexin +野性yexing +也许yexu +幼儿园yey +爷爷yeye +野营yeying +业余yeyu +野战yezhan +叶子yezi +一方面yfm +一分为二yfwe +阳奉阴违yfyw +一概而论ygel +一国两制yglz +有根有据ygyj +严格要求ygyq +有何特长yhtc +银行帐号yhzh +炎黄子孙yhzs +一yi +以yi +义yi +意yi +已yi +移yi +医yi +议yi +依yi +易yi +乙yi +艺yi +益yi +异yi +宜yi +仪yi +亿yi +遗yi +伊yi +役yi +衣yi +疑yi +亦yi +谊yi +翼yi +译yi +抑yi +忆yi +疫yi +壹yi +揖yi +铱yi +颐yi +夷yi +胰yi +沂yi +姨yi +彝yi +椅yi +蚁yi +倚yi +矣yi +邑yi +屹yi +臆yi +逸yi +肄yi +裔yi +毅yi +溢yi +诣yi +翌yi +绎yi +刈yi +劓yi +仡*yi +佚yi +佾yi +诒yi +圯yi +埸yi +懿yi +苡yi +荑yi +薏yi +弈yi +奕yi +挹yi +弋yi +呓yi +咦yi +咿yi +嗌*yi +噫yi +峄yi +嶷yi +猗yi +饴yi +怿yi +怡yi +悒yi +漪yi +迤yi +驿yi +缢yi +殪yi +轶yi +贻yi +欹*yi +旖yi +熠yi +眙yi +钇yi +镒yi +镱yi +痍yi +瘗yi +癔yi +翊yi +蜴yi +舣yi +羿yi +翳yi +酏yi +黟yi +议案yian +疑案yian +一半yiban +一般yiban +一斑yiban +一边yibian +以便yibian +仪表yibiao +一并yibing +异步yibu +遗产yichan +异常yichang +议程yicheng +益处yichu +遗传yichuan +一次yici +依次yici +依从yicong +一代yidai +一带yidai +一旦yidan +一点yidian +一定yiding +议定yiding +移动yidong +一度yidu +遗毒yidu +一端yiduan +臆断yiduan +亿吨yidun +一发yifa +依法yifa +义愤yifen +衣服yifu +依附yifu +一概yigai +一个yige +一共yigong +议购yigou +已故yigu +一贯yiguan +异国yiguo +遗憾yihan +遗恨yihen +以后yihou +异化yihua +议会yihui +疑惑yihuo +以及yiji +异己yiji +遗迹yiji +议价yijia +意见yijian +移交yijiao +一届yijie +一经yijing +已经yijing +意境yijing +依旧yijiu +一举yiju +依据yiju +移居yiju +议决yijue +依靠yikao +倚靠yikao +一刻yike +医科yike +一块yikuai +以来yilai +依赖yilai +一览yilan +一例yili +毅力yili +屹立yili +一连yilian +意料yiliao +医疗yiliao +遗留yiliu +遗漏yilou +一律yilu +疑虑yilu +议论yilun +一面yimian +以免yimian +疫苗yimiao +移民yimin +因yin +引yin +阴yin +印yin +音yin +银yin +烟*yin +隐yin +饮yin +荫yin +茵yin +殷yin +姻yin +吟yin +淫yin +寅yin +尹yin +胤yin +鄞yin +圻*yin +垠yin +堙yin +茚yin +吲yin +喑yin +狺yin +夤yin +洇yin +湮*yin +氤yin +铟yin +瘾yin +窨yin +蚓yin +霪yin +龈yin +疑难yinan +阴暗yinan +隐蔽yinbi +音标yinbiao +隐藏yincang +阴沉yinchen +银川yinchuan +因此yinci +引导yindao +音调yindiao +印度yindu +引渡yindu +以内yinei +因而yiner +印发yinfa +音符yinfu +应ying +影ying +硬ying +营ying +英ying +映ying +迎ying +樱ying +婴ying +鹰ying +缨ying +莹ying +萤ying +荧ying +蝇ying +赢ying +盈ying +颖ying +嬴ying +郢ying +茔ying +荥*ying +莺ying +萦ying +蓥ying +撄ying +嘤ying +膺ying +滢ying +潆ying +瀛ying +瑛ying +璎ying +楹ying +媵ying +鹦ying +瘿ying +颍ying +罂ying +英镑yingbang +硬币yingbi +应变yingbian +映衬yingchen +应酬yingchou +迎春yingchun +应当yingdang +赢得yingde +婴儿yinger +营房yingfang +迎风yingfeng +应付yingfu +应该yinggai +英国yingguo +樱花yinghua +英魂yinghun +应急yingji +硬件yingjian +迎接yingjie +应届yingjie +英杰yingjie +营救yingjiu +英俊yingjun +盈亏yingkui +赢利yingli +盈利yingli +英烈yinglie +迎面yingmian +英明yingming +硬盘yingpan +影片yingpian +硬拼yingpin +影射yingshe +映射yingshe +樱桃yingtao +迎头yingtou +因果yinguo +影响yingxiang +硬性yingxing +英雄yingxiong +营养yingyang +应邀yingyao +营业yingye +应用yingyong +英勇yingyong +应有yingyou +英语yingyu +盈余yingyu +营造yingzao +应战yingzhan +迎战yingzhan +映照yingzhao +应征yingzheng +影子yingzi +英姿yingzi +银行yinhang +引号yinhao +殷红yinhong +隐患yinhuan +淫秽yinhui +阴魂yinhun +意念yinian +姨娘yiniang +阴极yinji +印鉴yinjian +引进yinjin +引力yinli +阴历yinli +阴凉yinliang +引路yinlu +隐瞒yinman +阴谋yinmou +银幕yinmu +隐慝yinni +银牌yinpai +引起yinqi +殷切yinqie +殷勤yinqin +引擎yinqing +引人yinren +饮食yinshi +印刷yinshua +饮水yinshui +因素yinsu +阴天yintian +引退yintui +因为yinwei +淫威yinwei +阴险yinxian +印象yinxiang +音响yinxiang +音信yinxin +因循yinxun +引言yinyan +阴影yinying +引用yinyong +引诱yinyou +阴雨yinyu +姻缘yinyuan +隐约yinyue +音乐yinyue +引证yinzheng +印证yinzheng +一片yipian +一瞥yipie +一起yiqi +一齐yiqi +义气yiqi +意气yiqi +仪器yiqi +遗弃yiqi +以前yiqian +一切yiqie +依然yiran +亦然yiran +毅然yiran +艺人yiren +宜人yiren +遗容yirong +以上yishang +一生yisheng +医生yisheng +一时yishi +一事yishi +意识yishi +议事yishi +逸事yishi +仪式yishi +医师yishi +医士yishi +遗失yishi +一手yishou +遗书yishu +艺术yishu +意思yisi +一体yiti +议题yiti +遗体yiti +一天yitian +一同yitong +异同yitong +一头yitou +意图yitu +疑团yituan +以外yiwai +意外yiwai +亿万yiwan +以往yiwang +遗忘yiwang +以为yiwei +意味yiwei +意文yiwen +疑问yiwen +译文yiwen +一无yiwu +义务yiwu +遗物yiwu +医务yiwu +贻误yiwu +一下yixia +以下yixia +一线yixian +一向yixiang +一项yixiang +意向yixiang +遗像yixiang +一些yixie +一心yixin +疑心yixin +异性yixing +医学yixue +一言yiyan +义演yiyan +遗言yiyan +一样yiyang +医药yiyao +意义yiyi +异议yiyi +义勇yiyong +易于yiyu +议员yiyuan +意愿yiyuan +医院yiyuan +亿元yiyuan +遗愿yiyuan +疑云yiyun +一再yizai +一早yizao +臆造yizao +依仗yizhang +仪仗yizhang +一朝yizhao +衣着yizhao +依照yizhao +一阵yizhen +一直yizhi +一致yizhi +以至yizhi +以致yizhi +意志yizhi +抑制yizhi +医治yizhi +抑止yizhi +移植yizhi +遗址yizhi +一种yizhong +遗嘱yizhu +研究会yjh +有纪律yjl +研究生yjs +研究所yjs +研究室yjs +养精畜锐yjxr +研究员yjy +拥军优属yjys +一技之长yjzc +一口气ykq +一览表ylb +以理服人ylfr +阅览室yls +有理想ylx +有利于yly +越来越yly +有目共睹ymgd +一目了然ymlr +有没有ymy +云南省yns +育*yo +哟yo +唷yo +用yong +勇yong +永yong +拥yong +涌yong +蛹yong +庸yong +佣yong +臃yong +痈yong +雍yong +踊yong +咏yong +泳yong +恿yong +俑yong +壅yong +墉yong +喁yong +慵yong +邕yong +镛yong +甬yong +鳙yong +饔yong +拥抱yongbao +永别yongbie +永不yongbu +用处yongchu +用度yongdu +用法yongfa +用费yongfei +勇敢yonggan +用功yonggong +永恒yongheng +用户yonghu +拥护yonghu +拥挤yongji +永久yongjiu +用具yongju +永诀yongjue +用力yongli +庸碌yonglu +勇猛yongmeng +用品yongpin +勇气yongqi +勇士yongshi +庸俗yongsu +咏叹yongtan +用途yongtu +涌现yongxian +用心yongxin +用意yongyi +拥有yongyou +用于yongyu +勇于yongyu +永远yongyuan +踊跃yongyue +有you +由you +又you +油you +右you +友you +优you +幼you +游you +尤you +诱you +犹you +幽you +悠you +忧you +邮you +铀you +酉you +佑you +釉you +卣you +攸you +侑you +莠you +莜you +莸you +尢*you +呦you +囿you +宥you +柚you +猷you +牖you +铕you +疣you +蚰you +蚴you +蝣you +蝤*you +繇*you +鱿you +黝you +鼬you +有碍youai +友爱youai +幽暗youan +友邦youbang +右边youbian +忧愁youchou +由此youci +有错youcuo +有待youdai +优待youdai +诱导youdao +有的youde +优等youdeng +有点youdian +邮电youdian +优点youdian +诱发youfa +有功yougong +有关youguan +有害youhai +友好youhao +优化youhua +油画youhua +幽会youhui +优惠youhui +诱惑youhuo +有机youji +游击youji +有劲youjin +幽静youjing +悠久youjiu +邮局youju +由来youlai +游览youlan +有劳youlao +有利youli +有力youli +游离youli +优良youliang +优劣youlie +幽灵youling +忧虑youlu +优美youmei +幼苗youmiao +有名youming +幽默youmo +右派youpai +诱骗youpian +邮票youpiao +尤其youqi +油漆youqi +友情youqing +右倾youqing +有趣youqu +油然youran +犹如youru +有色youse +优胜yousheng +有时youshi +有事youshi +有失youshi +优势youshi +有数youshu +油水youshui +有所yousuo +有望youwang +有为youwei +游戏youxi +有限youxian +优先youxian +悠闲youxian +有效youxiao +幼小youxiao +有些youxie +有心youxin +游行youxing +优秀youxiu +幽雅youya +悠扬youyang +又要youyao +有益youyi +优异youyi +友谊youyi +有用youyong +游泳youyong +有余youyu +由于youyu +犹豫youyu +忧郁youyu +悠远youyuan +优越youyue +有着youzhe +邮政youzheng +优质youzhi +幼稚youzhi +由衷youzhong +邮资youzi +有求必应yqby +以权谋私yqms +有气无力yqwl +迎刃而解yrej +因人而异yrey +与人为善yrws +引人注目yrzm +意识到ysd +艺术家ysj +因势利导ysld +印刷体yst +意识形态ysxt +衣食住行yszx +以身作则yszz +研讨会yth +一条龙ytl +一条心ytx +有条有理ytyl +于yu +与yu +育yu +鱼yu +雨yu +玉yu +余yu +遇yu +预yu +域yu +语yu +愈yu +渔yu +予yu +羽yu +愚yu +御yu +谷*yu +欲yu +宇yu +蔚*yu +尉*yu +迂yu +淤yu +盂yu +榆yu +虞yu +舆yu +俞yu +逾yu +愉yu +渝yu +隅yu +娱yu +屿yu +禹yu +芋yu +郁yu +吁yu +喻yu +峪yu +狱yu +誉yu +浴yu +寓yu +裕yu +豫yu +驭yu +粥*yu +禺yu +毓yu +伛yu +俣yu +谀yu +谕yu +萸yu +菀*yu +蓣yu +揄yu +圄yu +圉yu +嵛yu +狳yu +饫yu +馀yu +庾yu +阈yu +鬻yu +妪yu +妤yu +纡yu +瑜yu +昱yu +觎yu +腴yu +腧*yu +欤yu +於yu +煜yu +熨yu +燠yu +聿yu +钰yu +鹆yu +鹬yu +瘐yu +瘀yu +窬yu +窳yu +蜮yu +蝓yu +竽yu +臾yu +舁yu +雩yu +龉yu +员yuan +原yuan +圆yuan +源yuan +元yuan +远yuan +愿yuan +院yuan +缘yuan +援yuan +园yuan +怨yuan +鸳yuan +渊yuan +冤yuan +垣yuan +袁yuan +辕yuan +猿yuan +苑yuan +垸yuan +塬yuan +芫yuan +掾yuan +圜*yuan +沅yuan +媛yuan +瑗yuan +橼yuan +爰yuan +眢yuan +鸢yuan +螈yuan +箢yuan +鼋yuan +原本yuanben +渊博yuanbo +冤仇yuanchou +远大yuanda +元旦yuandan +园地yuandi +园丁yuanding +远东yuandong +远方yuanfang +缘分yuanfen +原告yuangao +原故yuangu +缘故yuangu +圆滑yuanhua +原籍yuanji +冤家yuanjia +元件yuanjian +远见yuanjian +远近yuanjin +远景yuanjing +援救yuanjiu +原来yuanlai +原理yuanli +原谅yuanliang +原料yuanliao +远虑yuanlu +圆满yuanman +远谋yuanmou +远期yuanqi +冤屈yuanqu +源泉yuanquan +原始yuanshi +远视yuanshi +元首yuanshou +元帅yuanshuai +元素yuansu +援外yuanwai +愿望yuanwang +冤枉yuanwang +原先yuanxian +远销yuanxiao +元宵yuanxiao +院校yuanxiao +原形yuanxing +怨言yuanyan +原野yuanye +愿意yuanyi +园艺yuanyi +原因yuanyin +援引yuanyin +原有yuanyou +缘由yuanyou +远游yuanyou +远远yuanyuan +渊源yuanyuan +元月yuanyue +原则yuanze +院长yuanzhang +远征yuanzheng +援助yuanzhu +原子yuanzi +院子yuanzi +预报yubao +预备yubei +愚笨yuben +余步yubu +预测yuce +愚蠢yuchun +遇到yudao +预定yuding +预订yuding +余毒yudu +月yue +说*yue +越yue +约yue +乐*yue +跃yue +曰yue +阅yue +钥yue +岳yue +粤yue +悦yue +龠yue +瀹yue +栎*yue +樾yue +刖yue +钺yue +月报yuebao +月初yuechu +月底yuedi +约定yueding +月度yuedu +阅读yuedu +乐队yuedui +约法yuefa +月份yuefen +月光yueguang +越轨yuegui +约会yuehui +越界yuejie +跃进yuejin +越境yuejing +阅览yuelan +阅历yueli +月亮yueliang +月末yuemo +约莫yuemo +越南yuenan +乐谱yuepu +乐器yueqi +月球yueqiu +乐曲yuequ +月色yuese +越是yueshi +约束yueshu +月台yuetai +乐团yuetuan +约有yueyou +乐章yuezhang +预防yufang +预风yufeng +预付yufu +预感yugan +预告yugao +预购yugou +遇害yuhai +宇航yuhang +与会yuhui +迂回yuhui +雨季yuji +预计yuji +遇见yujian +预见yujian +语句yuju +豫剧yuju +愉快yukuai +娱乐yule +鱼雷yulei +预料yuliao +雨露yulu +舆论yulun +愚昧yumei +育苗yumiao +预谋yumou +运yun +员*yun +云yun +匀yun +均*yun +允yun +孕yun +耘yun +郧yun +陨yun +蕴yun +酝yun +晕yun +韵yun +郓yun +芸yun +狁yun +恽yun +愠yun +纭yun +韫yun +殒yun +昀yun +氲yun +熨yun +遇难yunan +云彩yuncai +蕴藏yuncang +匀称yuncheng +运动yundong +熨斗yundou +云海yunhai +运河yunhe +韵律yunlu +陨落yunluo +云南yunnan +酝酿yunnian +允诺yunnuo +愚弄yunong +运气yunqi +运输yunshu +运算yunsuan +云梯yunti +运往yunwang +韵味yunwei +云雾yunwu +云霞yunxia +运行yunxing +允许yunxu +运用yunyong +孕育yunyu +运载yunzai +运转yunzhuan +与其yuqi +语气yuqi +预期yuqi +预审yushen +于是yushi +预示yushi +预售yushou +雨水yushui +预算yusuan +欲望yuwang +语文yuwen +预习yuxi +预先yuxian +遇险yuxian +预想yuxiang +预言yuyan +语言yuyan +寓言yuyan +预演yuyan +予以yuyi +寓于yuyu +愉悦yuyue +预兆yuzhao +预支yuzhi +宇宙yuzhou +有文化ywh +业务联系ywlx +意味着ywz +有限公司yxgs +一系列yxl +有效期yxq +医学院yxy +一心一意yxyy +游泳池yyc +营业额yye +夜以继日yyjr +应用科学yykx +一言堂yyt +引以为戒yywj +优越性yyx +营业员yyy +隐隐约约yyyy +运用自如yyzr +拥政爱民yzam +原子能yzn +已知数yzs +有助于yzy +言之有理yzyl +在z +这z +主z +中z +种z +着z +争z +战z +作z +正z +之z +制z +重z +组z +治z +只z +子z +自z +质z +指z +杂za +扎*za +咱za +匝za +砸za +咋za +咂za +在zai +再zai +载zai +栽zai +灾zai +仔*zai +哉zai +宰zai +崽zai +甾zai +再版zaiban +再不zaibu +在场zaichang +再度zaidu +宰割zaige +灾害zaihai +再好zaihao +在乎zaihu +灾荒zaihuang +再会zaihui +灾祸zaihuo +再见zaijian +在理zaili +灾民zaimin +灾难zainan +栽培zaipei +再起zaiqi +灾情zaiqing +灾区zaiqu +再三zaisan +在世zaishi +再说zaishuo +载体zaiti +在下zaixia +再现zaixian +宰相zaixiang +在意zaiyi +在于zaiyu +再造zaizao +再则zaize +在职zaizhi +再植zaizhi +杂技zaji +杂粮zaliang +杂乱zaluan +赞zan +咱zan +暂zan +攒zan +拶zan +瓒zan +昝zan +簪zan +糌zan +趱zan +錾zan +赞成zancheng +暂定zanding +藏*zang +脏zang +葬zang +赃zang +奘zang +驵zang +臧zang +赞歌zange +赃款zangkuan +葬送zangsong +赃物zangwu +藏族zangzu +杂念zanian +赞美zanmei +咱们zanmen +暂且zanqie +暂缺zanque +赞赏zanshang +暂时zanshi +赞颂zansong +赞叹zantan +暂停zanting +赞同zantong +暂行zanxing +赞扬zanyang +暂用zanyong +赞助zanzhu +造zao +早zao +遭zao +燥zao +凿zao +糟zao +枣zao +皂zao +藻zao +澡zao +蚤zao +躁zao +噪zao +灶zao +唣zao +早晨zaochen +造成zaocheng +凿穿zaochuan +造次zaoci +造词zaoci +遭到zaodao +早稻zaodao +造反zaofan +早饭zaofan +造福zaofu +糟糕zaogao +造化zaohua +造价zaojia +造就zaojiu +造林zaolin +早年zaonian +糟粕zaopo +早期zaoqi +早日zaori +早上zaoshang +遭受zaoshou +早衰zaoshuai +糟蹋zaota +早晚zaowan +造型zaoxing +遭殃zaoyang +造谣zaoyao +造诣zaoyi +早已zaoyi +噪音zaoyin +遭遇zaoyu +造字zaozi +杂谈zatan +杂文zawen +杂质zazhi +杂志zazhi +资本主义zbzy +资产阶级zcjj +增长率zcl +总参谋部zcmb +真才实学zcsx +自动化zdh +自动检测zdjc +自动检索zdjs +自动控制zdkz +主动权zdq +招待所zds +总的说来zdsl +主动性zdx +则ze +择ze +责ze +侧*ze +泽ze +咋*ze +仄ze +赜ze +啧ze +帻ze +迮ze +昃ze +笮ze +箦ze +舴ze +责备zebei +责成zecheng +责罚zefa +责怪zeguai +贼zei +责令zeling +责骂zema +怎zen +谮zen +增zeng +曾zeng +综*zeng +憎zeng +赠zeng +缯zeng +甑zeng +罾zeng +锃zeng +增补zengbu +增产zengchan +增长zengchang +增大zengda +增订zengding +增多zengduo +增高zenggao +憎恨zenghen +增加zengjia +增减zengjian +增进zengjin +增量zengliang +赠品zengpin +增强zengqiang +增删zengshan +增设zengshe +赠送zengsong +增添zengtian +赠言zengyan +增益zengyi +增援zengyuan +怎么zenme +怎奈zennai +怎样zenyang +责任zeren +责问zewen +总而言之zeyz +争分夺秒zfdm +针锋相对zfxd +自负盈亏zfyk +中关村zgc +自告奋勇zgfy +中国共产党zggd +总工会zgh +中国特色的zgtd +中国银行zgyh +自古以来zgyl +中国政府zgzf +中共中央zgzy +查*zha +扎zha +炸zha +闸zha +铡zha +轧zha +渣zha +蜡*zha +喳zha +札zha +眨zha +栅zha +榨zha +咋*zha +乍zha +诈zha +柞*zha +揸zha +吒zha +咤zha +哳zha +喋*zha +楂*zha +砟zha +痄zha +蚱zha +齄zha +炸弹zhadan +扎根zhagen +炸毁zhahui +寨zhai +侧*zhai +择*zhai +摘zhai +窄zhai +斋zhai +翟*zhai +祭*zhai +宅zhai +债zhai +砦zhai +瘵zhai +摘录zhailu +债权zhaiquan +债务zhaiwu +窄小zhaixiao +摘要zhaiyao +札记zhaji +战zhan +展zhan +站zhan +占zhan +粘*zhan +颤*zhan +瞻zhan +毡zhan +詹zhan +沾zhan +盏zhan +斩zhan +辗zhan +崭zhan +蘸zhan +栈zhan +湛zhan +绽zhan +谵zhan +搌zhan +旃zhan +战败zhanbai +战报zhanbao +战备zhanbei +战场zhanchang +展翅zhanchi +展出zhanchu +战地zhandi +战斗zhandou +战犯zhanfan +长*zhang +张zhang +章zhang +掌zhang +仗zhang +障zhang +胀zhang +涨zhang +账zhang +樟zhang +彰zhang +漳zhang +杖zhang +丈zhang +帐zhang +瘴zhang +仉zhang +鄣zhang +幛zhang +嶂zhang +獐zhang +嫜zhang +璋zhang +蟑zhang +障碍zhangai +站岗zhangang +长辈zhangbei +章程zhangcheng +长大zhangda +战歌zhange +章法zhangfa +帐房zhangfang +丈夫zhangfu +掌管zhangguan +帐号zhanghao +章节zhangjie +帐目zhangmu +战功zhangong +掌权zhangquan +张贴zhangtie +战鼓zhangu +沾光zhanguang +战国zhanguo +战果zhanguo +张望zhangwang +掌握zhangwo +张扬zhangyang +战壕zhanhao +战后zhanhou +战机zhanji +战绩zhanji +战局zhanju +占据zhanju +展开zhankai +战况zhankuang +展览zhanlan +占领zhanling +战略zhanlue +战马zhanma +展品zhanpin +战区zhanqu +沾染zhanran +战胜zhansheng +战时zhanshi +战事zhanshi +战士zhanshi +展示zhanshi +战术zhanshu +展望zhanwang +战线zhanxian +展现zhanxian +展销zhanxiao +崭新zhanxin +瞻仰zhanyang +战役zhanyi +占用zhanyong +占有zhanyou +战友zhanyou +站长zhanzhang +战争zhanzheng +着*zhao +照zhao +找zhao +招zhao +朝*zhao +召zhao +赵zhao +爪zhao +罩zhao +沼zhao +兆zhao +嘲*zhao +昭zhao +肇zhao +诏zhao +啁*zhao +棹zhao +钊zhao +笊zhao +照办zhaoban +照搬zhaoban +招标zhaobiao +照常zhaochang +照抄zhaochao +招待zhaodai +照发zhaofa +招工zhaogong +照顾zhaogu +招呼zhaohu +召唤zhaohuan +照会zhaohui +着急zhaoji +招集zhaoji +召集zhaoji +招架zhaojia +召开zhaokai +招考zhaokao +招揽zhaolan +着力zhaoli +照例zhaoli +照料zhaoliao +着落zhaoluo +着迷zhaomi +照明zhaoming +招聘zhaopin +朝气zhaoqi +招惹zhaore +照射zhaoshe +招生zhaosheng +着手zhaoshou +招手zhaoshou +招收zhaoshou +招贴zhaotie +朝夕zhaoxi +朝霞zhaoxia +着想zhaoxiang +照相zhaoxiang +昭雪zhaoxue +找寻zhaoxun +着眼zhaoyan +照样zhaoyang +照耀zhaoyao +照应zhaoying +招展zhaozhan +招致zhaozhi +着重zhaozhong +照着zhaozhuo +诈骗zhapian +榨取zhaqu +诈取zhaqu +扎实zhashi +炸药zhayao +渣滓zhazi +这zhe +着zhe +者zhe +折zhe +哲zhe +浙zhe +遮zhe +蛰zhe +辙zhe +锗zhe +蔗zhe +谪zhe +摺zhe +柘zhe +辄zhe +磔zhe +鹧zhe +褶zhe +蜇zhe +赭zhe +这般zheban +这边zhebian +这次zheci +遮挡zhedang +这点zhedian +折叠zhedie +折服zhefu +遮盖zhegai +这个zhege +折合zhehe +浙江zhejiang +折旧zhejiu +折扣zhekou +这里zheli +哲理zheli +这么zheme +折磨zhemo +真zhen +针zhen +阵zhen +镇zhen +振zhen +震zhen +珍zhen +诊zhen +斟zhen +甄zhen +砧zhen +臻zhen +贞zhen +侦zhen +枕zhen +疹zhen +圳zhen +蓁zhen +浈zhen +溱*zhen +缜zhen +桢zhen +椹*zhen +榛zhen +轸zhen +赈zhen +胗zhen +朕zhen +祯zhen +畛zhen +稹zhen +鸩zhen +箴zhen +珍爱zhenai +珍宝zhenbao +针砭zhenbian +珍藏zhencang +贞操zhencao +侦察zhencha +真诚zhencheng +震荡zhendang +阵地zhendi +真谛zhendi +震动zhendong +诊断zhenduan +针对zhendui +振奋zhenfen +争zheng +正zheng +政zheng +整zheng +证zheng +征zheng +蒸zheng +症zheng +丁*zheng +郑zheng +挣zheng +睁zheng +狰zheng +怔zheng +拯zheng +帧zheng +诤zheng +峥zheng +徵zheng +钲zheng +铮zheng +筝zheng +争霸zhengba +整备zhengbei +正比zhengbi +政变zhengbian +争辩zhengbian +整编zhengbian +征兵zhengbing +政策zhengce +正常zhengchang +争吵zhengchao +征程zhengcheng +争持zhengchi +正大zhengda +正当zhengdang +政党zhengdang +整党zhengdang +正道zhengdao +争端zhengduan +整顿zhengdun +争夺zhengduo +蒸发zhengfa +政法zhengfa +正反zhengfan +整风zhengfeng +政府zhengfu +征服zhengfu +整改zhenggai +整个zhengge +征购zhenggou +争光zhengguang +正规zhenggui +正轨zhenggui +正好zhenghao +政绩zhengji +征集zhengji +证件zhengjian +政见zhengjian +整洁zhengjie +政局zhengju +证据zhengju +正理zhengli +整理zhengli +正梁zhengliang +政令zhengling +争论zhenglun +政论zhenglun +正面zhengmian +争鸣zhengming +证明zhengming +正派zhengpai +征聘zhengpin +争气zhengqi +正气zhengqi +蒸气zhengqi +整齐zhengqi +正巧zhengqiao +征求zhengqiu +争取zhengqu +政权zhengquan +正确zhengque +证人zhengren +正是zhengshi +正式zhengshi +正视zhengshi +证实zhengshi +征收zhengshou +整数zhengshu +证书zhengshu +征税zhengshui +整套zhengtao +正题zhengti +政体zhengti +整体zhengti +整天zhengtian +征调zhengtiao +正统zhengtong +征途zhengtu +珍贵zhengui +政委zhengwei +正文zhengwen +征文zhengwen +政务zhengwu +争先zhengxian +政协zhengxie +整形zhengxing +整修zhengxiu +征询zhengxun +争艳zhengyan +正业zhengye +正义zhengyi +争议zhengyi +征用zhengyong +正月zhengyue +正在zhengzai +挣扎zhengzha +整整zhengzheng +正直zhengzhi +政治zhengzhi +争执zhengzhi +正中zhengzhong +郑重zhengzhong +郑州zhengzhou +症状zhengzhuang +正宗zhengzong +震撼zhenhan +侦缉zhenji +真假zhenjia +阵脚zhenjiao +贞节zhenjie +贞洁zhenjie +镇静zhenjing +震惊zhenjing +真空zhenkong +真理zhenli +诊疗zhenliao +珍品zhenpin +珍奇zhenqi +真切zhenqie +真情zhenqing +真确zhenque +真人zhenren +阵容zhenrong +真是zhenshi +真实zhenshi +阵势zhenshi +珍视zhenshi +侦探zhentan +阵亡zhenwang +珍惜zhenxi +阵线zhenxian +真相zhenxiang +振兴zhenxing +镇压zhenya +阵阵zhenzhen +真正zhenzheng +真知zhenzhi +真挚zhenzhi +珍重zhenzhong +珍珠zhenzhu +斟酌zhenzhuo +振作zhenzuo +这是zheshi +这时zheshi +折腾zheteng +这些zhexie +哲学zhexue +遮掩zheyan +这样zheyang +这种zhezhong +折中zhezhong +之zhi +制zhi +治zhi +只zhi +质zhi +指zhi +直zhi +支zhi +织zhi +止zhi +至zhi +置zhi +志zhi +值zhi +知zhi +识*zhi +执zhi +职zhi +植zhi +纸zhi +致zhi +枝zhi +殖zhi +脂zhi +智zhi +氏*zhi +肢zhi +秩zhi +址zhi +滞zhi +汁zhi +芝zhi +吱zhi +蜘zhi +侄zhi +趾zhi +旨zhi +挚zhi +掷zhi +帜zhi +峙zhi +稚zhi +炙zhi +痔zhi +窒zhi +卮zhi +陟zhi +郅zhi +埴zhi +芷zhi +摭zhi +帙zhi +徵*zhi +忮zhi +彘zhi +咫zhi +骘zhi +栉zhi +枳zhi +栀zhi +桎zhi +轵zhi +轾zhi +贽zhi +胝zhi +膣zhi +祉zhi +祗zhi +黹zhi +雉zhi +鸷zhi +痣zhi +蛭zhi +絷zhi +酯zhi +跖zhi +踬zhi +踯zhi +豸zhi +觯zhi +治安zhian +值班zhiban +植保zhibao +置备zhibei +质变zhibian +指标zhibiao +职别zhibie +支部zhibu +制裁zhicai +支撑zhicheng +职称zhicheng +支持zhichi +指出zhichu +支出zhichu +至此zhici +值此zhici +直达zhida +只当zhidang +直到zhidao +指导zhidao +知道zhidao +只得zhide +值得zhide +质地zhidi +指点zhidian +制定zhiding +指定zhiding +制订zhiding +制度zhidu +支队zhidui +至多zhiduo +知法zhifa +执法zhifa +制服zhifu +支付zhifu +职工zhigong +只顾zhigu +只管zhiguan +直观zhiguan +治国zhiguo +只好zhihao +之后zhihou +指挥zhihui +智慧zhihui +知己zhiji +指甲zhijia +之间zhijian +只见zhijian +指教zhijiao +直接zhijie +枝节zhijie +至今zhijin +直经zhijing +直径zhijing +止境zhijing +致敬zhijing +知觉zhijue +治理zhili +致力zhili +智力zhili +质量zhiliang +治疗zhiliao +指令zhiling +直流zhiliu +支流zhiliu +殖民zhimin +致命zhiming +指明zhiming +知名zhiming +智谋zhimou +指南zhinan +智囊zhinang +之内zhinei +只能zhineng +职能zhineng +智能zhineng +只怕zhipa +指派zhipai +支配zhipei +支票zhipiao +制品zhipin +志气zhiqi +之前zhiqian +支前zhiqian +值勤zhiqin +执勤zhiqin +知情zhiqing +知青zhiqing +智取zhiqu +志趣zhiqu +知趣zhiqu +职权zhiquan +值日zhiri +治丧zhisang +之上zhishang +直上zhishang +至上zhishang +至少zhishao +制胜zhisheng +之声zhisheng +只是zhishi +指使zhishi +支使zhishi +致使zhishi +知事zhishi +指示zhishi +知识zhishi +指数zhishu +支书zhishu +直属zhishu +植树zhishu +直爽zhishuang +治水zhishui +直说zhishuo +致死zhisi +之外zhiwai +指望zhiwang +职位zhiwei +质问zhiwen +植物zhiwu +职务zhiwu +窒息zhixi +之下zhixia +直线zhixian +指向zhixiang +志向zhixiang +知心zhixin +执行zhixing +只许zhixu +秩序zhixu +直言zhiyan +只要zhiyao +职业zhiye +致意zhiyi +旨意zhiyi +质疑zhiyi +指引zhiyin +知音zhiyin +只有zhiyou +至于zhiyu +置于zhiyu +智育zhiyu +职员zhiyuan +支援zhiyuan +志愿zhiyuan +制约zhiyue +制造zhizao +指责zhize +职责zhize +纸张zhizhang +职掌zhizhang +执照zhizhao +指正zhizheng +执政zhizheng +制止zhizhi +直至zhizhi +之中zhizhong +支助zhizhu +支柱zhizhu +知足zhizu +制作zhizuo +走后门zhm +中华民国zhmg +中华民族zhmz +中zhong +种zhong +重zhong +众zhong +钟zhong +终zhong +忠zhong +肿zhong +仲zhong +盅zhong +衷zhong +冢zhong +忪*zhong +锺zhong +螽zhong +舯zhong +踵zhong +钟爱zhongai +重办zhongban +重兵zhongbing +中部zhongbu +仲裁zhongcai +中层zhongceng +衷肠zhongchang +忠诚zhongcheng +重大zhongda +重担zhongdan +中等zhongdeng +种地zhongdi +重地zhongdi +重点zhongdian +终点zhongdian +中东zhongdong +中断zhongduan +终端zhongduan +中队zhongdui +众多zhongduo +重犯zhongfan +忠告zhonggao +中共zhonggong +中国zhongguo +忠厚zhonghou +中华zhonghua +中级zhongji +终极zhongji +重价zhongjia +中间zhongjian +中坚zhongjian +中奖zhongjiang +终结zhongjie +终究zhongjiu +终久zhongjiu +终局zhongju +中肯zhongken +种类zhonglei +中立zhongli +重量zhongliang +终了zhongliao +中流zhongliu +肿瘤zhongliu +中美zhongmei +众目zhongmu +中年zhongnian +终年zhongnian +中秋zhongqiu +重任zhongren +中日zhongri +终日zhongri +中伤zhongshang +重赏zhongshang +终身zhongshen +终生zhongsheng +重视zhongshi +忠实zhongshi +中枢zhongshu +众说zhongshuo +中苏zhongsu +终天zhongtian +中途zhongtu +重托zhongtuo +中外zhongwai +重围zhongwei +中文zhongwen +中午zhongwu +中西zhongxi +中心zhongxin +忠心zhongxin +衷心zhongxin +中性zhongxing +中学zhongxue +中旬zhongxun +忠言zhongyan +中央zhongyang +中药zhongyao +重要zhongyao +中医zhongyi +重用zhongyong +中庸zhongyong +中游zhongyou +终于zhongyu +忠于zhongyu +忠贞zhongzhen +中止zhongzhi +种植zhongzhi +终止zhongzhi +种种zhongzhong +中专zhongzhuan +种族zhongzu +轴zhou +周zhou +洲zhou +州zhou +皱zhou +骤zhou +舟zhou +诌zhou +粥zhou +肘zhou +帚zhou +咒zhou +宙zhou +昼zhou +荮zhou +啁zhou +妯zhou +纣zhou +绉zhou +胄zhou +碡zhou +籀zhou +繇*zhou +酎zhou +周到zhoudao +咒骂zhouma +周密zhoumi +周末zhoumo +周期zhouqi +周全zhouquan +周围zhouwei +周旋zhouxuan +昼夜zhouye +周折zhouzhe +周知zhouzhi +周转zhouzhuan +总后勤部zhqb +中华人民共和国zhrg +主zhu +注zhu +著zhu +住zhu +助zhu +猪zhu +铸zhu +属*zhu +株zhu +筑zhu +柱zhu +术*zhu +驻zhu +逐zhu +祝zhu +竹zhu +贮zhu +珠zhu +朱zhu +诸zhu +蛛zhu +诛zhu +烛zhu +煮zhu +拄zhu +瞩zhu +嘱zhu +蛀zhu +伫zhu +侏zhu +邾zhu +茱zhu +洙zhu +渚zhu +潴zhu +杼zhu +槠zhu +橥zhu +炷zhu +铢zhu +疰zhu +瘃zhu +褚*zhu +竺zhu +箸zhu +舳zhu +翥zhu +躅zhu +麈zhu +抓zhua +挝*zhua +抓好zhuahao +转*zhuai +曳*zhuai +拽zhuai +抓紧zhuajin +转zhuan +专zhuan +传*zhuan +砖zhuan +撰zhuan +赚zhuan +篆zhuan +啭zhuan +馔zhuan +沌*zhuan +颛zhuan +转变zhuanbian +转播zhuanbo +专长zhuanchang +专程zhuancheng +转达zhuanda +转发zhuanfa +装zhuang +状zhuang +壮zhuang +庄zhuang +撞zhuang +幢*zhuang +桩zhuang +妆zhuang +僮zhuang +奘*zhuang +转告zhuangao +装扮zhuangban +装备zhuangbei +壮大zhuangda +装订zhuangding +壮观zhuangguan +装甲zhuangjia +庄稼zhuangjia +庄嫁zhuangjia +壮举zhuangju +状况zhuangkuang +壮阔zhuangkuo +壮丽zhuangli +壮烈zhuanglie +装配zhuangpei +装饰zhuangshi +状态zhuangtai +装卸zhuangxie +庄严zhuangyan +庄园zhuangyuan +装运zhuangyun +装置zhuangzhi +壮志zhuangzhi +庄重zhuangzhong +转化zhuanhua +转换zhuanhuan +转给zhuanji +专家zhuanjia +专科zhuanke +专利zhuanli +专门zhuanmen +转让zhuanrang +专题zhuanti +转向zhuanxiang +专心zhuanxin +转眼zhuanyan +专业zhuanye +转移zhuanyi +专员zhuanyuan +转载zhuanzai +转折zhuanzhe +转正zhuanzheng +专政zhuanzheng +专制zhuanzhi +专职zhuanzhi +专注zhuanzhu +专著zhuanzhu +主办zhuban +逐步zhubu +贮藏zhucang +注册zhuce +助长zhuchang +主持zhuchi +主次zhuci +主导zhudao +注定zhuding +主动zhudong +主队zhudui +主犯zhufan +住房zhufang +祝福zhufu +嘱咐zhufu +逐个zhuge +主攻zhugong +助工zhugong +主管zhuguan +主观zhuguan +追zhui +锥zhui +椎zhui +赘zhui +坠zhui +缀zhui +惴zhui +骓zhui +缒zhui +追捕zhuibu +追查zhuicha +追悼zhuidao +追赶zhuigan +坠毁zhuihui +追加zhuijia +追究zhuijiu +追求zhuiqiu +追认zhuiren +追溯zhuisu +追随zhuisui +追问zhuiwen +追逐zhuizhu +追踪zhuizong +主机zhuji +主见zhujian +逐渐zhujian +主将zhujiang +主讲zhujiang +主教zhujiao +主角zhujiao +注解zhujie +祝酒zhujiu +主力zhuli +助理zhuli +株连zhulian +主粮zhuliang +主流zhuliu +驻留zhuliu +著名zhuming +主谋zhumou +注目zhumu +瞩目zhumu +准zhun +屯*zhun +谆zhun +肫zhun +窀zhun +准备zhunbei +逐年zhunian +准确zhunque +准绳zhunsheng +准时zhunshi +准许zhunxu +准则zhunze +着*zhuo +著*zhuo +捉zhuo +桌zhuo +缴*zhuo +拙zhuo +卓zhuo +琢zhuo +茁zhuo +酌zhuo +啄zhuo +灼zhuo +浊zhuo +倬zhuo +诼zhuo +擢zhuo +浞zhuo +涿zhuo +濯zhuo +棹*zhuo +焯zhuo +禚zhuo +斫zhuo +镯zhuo +拙劣zhuolie +琢磨zhuomo +捉弄zhuonong +酌情zhuoqing +卓越zhuoyue +茁壮zhuozhuang +主权zhuquan +主人zhuren +主任zhuren +诸如zhuru +注色zhuse +注视zhushi +柱石zhushi +注释zhushi +助手zhushou +主送zhusong +住宿zhusu +珠算zhusuan +主题zhuti +主体zhuti +逐条zhutiao +嘱托zhutuo +诸位zhuwei +主席zhuxi +注销zhuxiao +主要zhuyao +逐一zhuyi +主义zhuyi +主意zhuyi +注意zhuyi +祝愿zhuyuan +逐月zhuyue +主宰zhuzai +铸造zhuzao +驻扎zhuzha +住宅zhuzhai +主张zhuzhang +住址zhuzhi +注重zhuzhong +著作zhuzuo +子zi +自zi +资zi +字zi +紫zi +仔zi +籽zi +姿zi +吱*zi +兹zi +咨zi +滋zi +淄zi +孜zi +滓zi +渍zi +谘zi +茈*zi +呲*zi +嵫zi +姊zi +孳zi +缁zi +梓zi +辎zi +赀zi +恣zi +眦zi +锱zi +秭zi +耔zi +笫zi +粢zi +趑zi +觜zi +訾zi +龇zi +鲻zi +髭zi +自爱ziai +自白zibai +自卑zibei +资本ziben +资产zichan +滋长zichang +自称zicheng +自传zichuan +自从zicong +子弟zidi +字典zidian +自动zidong +自发zifa +自费zifei +自封zifeng +自负zifu +字符zifu +资格zige +字根zigen +自豪zihao +自给ziji +自己ziji +字迹ziji +字节zijie +资金zijin +自救zijiu +自居ziju +自觉zijue +字库ziku +自夸zikua +自理zili +资历zili +资料ziliao +自满ziman +自勉zimian +字母zimu +字幕zimu +子女zinu +自强ziqiang +自然ziran +滋润zirun +自杀zisha +自身zishen +姿势zishi +自述zishu +自私zisi +姿态zitai +字体ziti +字帖zitie +自卫ziwei +滋味ziwei +自问ziwen +自我ziwo +仔细zixi +自信zixin +自修zixiu +自叙zixu +自选zixuan +自学zixue +咨询zixun +滋养ziyang +自由ziyou +自愿ziyuan +资源ziyuan +自找zizhao +自治zizhi +自重zizhong +资助zizhu +自尊zizun +直截了当zjld +浙江省zjs +这就是说zjss +中纪委zjw +再接再厉zjzl +中联部zlb +专利法zlf +质量管理zlgl +自力更生zlgs +展览会zlh +智力开发zlkf +专利权zlq +知名人士zmrs +这么些zmx +这么样zmy +怎么样zmy +总zong +纵zong +宗zong +综zong +棕zong +鬃zong +踪zong +偬zong +枞zong +腙zong +粽zong +总部zongbu +总裁zongcai +总参zongcan +总队zongdui +总额zonge +总纲zonggang +总共zonggong +纵贯zongguan +总和zonghe +综合zonghe +纵横zongheng +总后zonghou +总计zongji +踪迹zongji +宗教zongjiao +总结zongjie +总局zongju +总括zongkuo +总理zongli +总论zonglun +宗派zongpai +纵情zongqing +纵深zongshen +总是zongshi +纵使zongshi +总数zongshu +总算zongsuan +总体zongti +总统zongtong +总务zongwu +踪影zongying +总帐zongzhang +总政zongzheng +总之zongzhi +宗旨zongzhi +走zou +邹zou +奏zou +揍zou +诹zou +陬zou +鄹zou +驺zou +鲰zou +走访zoufang +邹虹zouhong +走私zousi +奏效zouxiao +酌情处理zqcl +中青年zqn +朝气蓬勃zqpb +准确无误zqww +正确性zqx +诸如此类zrcl +责任感zrg +自然界zrj +主人翁zrw +责任心zrx +责任制zrz +再生产zsc +自上而下zsex +知识分子zsfz +这时候zsh +知识化zsh +株式会社zshs +总书记zsj +装饰品zsp +综上所述zsss +之所以zsy +自始至终zszz +众所周知zszz +座谈会zth +组zu +族zu +足zu +阻zu +祖zu +租zu +卒zu +诅zu +俎zu +菹zu +镞zu +阻碍zuai +钻zuan +赚*zuan +纂zuan +攥zuan +缵zuan +躜zuan +钻研zuanyan +组成zucheng +阻挡zudang +组阁zuge +足够zugou +祖国zuguo +组合zuhe +最zui +罪zui +嘴zui +堆*zui +咀*zui +醉zui +蕞zui +最初zuichu +最大zuida +最低zuidi +罪恶zuie +罪犯zuifan +最高zuigao +罪过zuiguo +最好zuihao +最后zuihou +最坏zuihuai +最佳zuijia +最近zuijin +嘴脸zuilian +罪名zuiming +罪孽zuinie +罪人zuiren +最先zuixian +最小zuixiao +最新zuixin +醉心zuixin +罪行zuixing +罪责zuize +罪证zuizheng +最终zuizhong +罪状zuizhuang +阻击zuji +租界zujie +租借zujie +阻拦zulan +阻力zuli +租赁zulin +尊zun +遵zun +撙zun +樽zun +鳟zun +阻挠zunao +遵从zuncong +尊贵zungui +尊敬zunjing +遵守zunshou +遵循zunxun +尊严zunyan +遵照zunzhao +尊重zunzhong +作zuo +做zuo +左zuo +座zuo +坐zuo +昨zuo +撮*zuo +凿*zuo +搓*zuo +琢*zuo +佐zuo +柞zuo +阼zuo +唑zuo +嘬zuo +怍zuo +胙zuo +祚zuo +笮*zuo +作案zuoan +作弊zuobi +左边zuobian +坐标zuobiao +做到zuodao +作法zuofa +做法zuofa +作废zuofei +作风zuofeng +做工zuogong +作怪zuoguai +做好zuohao +作家zuojia +作客zuoke +作乐zuole +作乱zuoluan +坐落zuoluo +左派zuopai +作品zuopin +左倾zuoqing +做人zuoren +昨日zuori +做事zuoshi +坐视zuoshi +座谈zuotan +昨天zuotian +昨晚zuowan +作为zuowei +座位zuowei +坐位zuowei +作文zuowen +作物zuowu +作业zuoye +昨夜zuoye +作用zuoyong +左右zuoyou +作战zuozhan +作者zuozhe +作证zuozheng +作主zuozhu +做主zuozhu +做作zuozuo +足球zuqiu +阻塞zuse +祖师zushi +祖先zuxian +组长zuzhang +组织zuzhi +阻止zuzhi +祖宗zuzong +中外合资zwhz +责无旁贷zwpd +中宣部zxb +自行车zxc +自下而上zxes +忠心耿耿zxgg +展销会zxh +照相机zxj +争先恐后zxkh +中学生zxs +主席团zxt +中小学zxx +自信心zxx +中央办公厅zybt +着眼点zyd +专业对口zydk +中央电视台zydt +中央各部委zygw +专业化zyh +专业户zyh +中央军委zyjw +座右铭zym +中央全会zyqh +中央人民广播电台zyrt +主要人员zyry +专业人员zyry +中央书记处zysc +中央委员会zywh +中央委员zywy +重要性zyx +主要原因zyyy +中央政治局zyzj +专业知识zyzs +中组部zzb +组织部zzb +政治部zzb +政治处zzc +转折点zzd +置之度外zzdw +政治局zzj +自治区zzq +蒸蒸日上zzrs +组织上zzs +郑州市zzs +组织性zzx +自尊心zzx +赵紫阳zzy +总政治部zzzb +喷码pm +优喷yp +科技kj +比洋by +公司gs +有限公司yxgz +股份公司gfgs +企业qy +标准bz +喷码机pmj +电线dx +电缆dl +电线电缆dxdl +电力电缆dldl +绝缘jy +绝缘层jyc +导体dt +导线dx +电力dl +通信tx +控制电缆kzdl +补偿电缆bcdl +屏蔽电缆pbdl +高温电缆gwdl +计算机电缆jsjdl +信号电缆xhdl +同轴电缆tzdl +耐火电缆nhdl +船用电缆cydl +铝合金电缆lhjdl +单股dg +多股dg +连接lj +电路dl +电器dq +型号xh +铜t +铝l +铅包qb +铝包qb +聚氯乙烯jlyx +电磁线dcx +北京市bj +东城区dcq +西城区xcq +崇文区cwq +宣武区xwq +朝阳区zyq +海淀区hdq +丰台区ftq +房山区fsq +通州区tzq +顺义区syq +昌平区cpq +大兴区txq +怀柔区hrq +平谷区pgq +门头沟区mtgq +石景山区sjsq +天津市tjs +和平区hpq +河东区hdq +河西区hxq +南开区nkq +河北区hbq +红桥区hqq +塘沽区tgq +汉沽区hgq +大港区tgq +东丽区dlq +西青区xqq +北辰区bcq +津南区jnq +武清区wqq +宝坻区bdq +河北省hbs +辛集市xjs +藁城市gcs +晋州市jzs +新乐市xls +鹿泉市lqs +唐山市tss +遵化市zhs +安市as +邯郸市hds +武安市was +邢台市xts +南宫市ngs +沙河市shs +保定市bds +涿州市zzs +定州市dzs +安国市ags +承德市cds +沧州市czs +泊头市bts +任丘市rqs +黄骅市hhs +河间市hjs +廊坊市lfs +霸州市bzs +三河市shs +衡水市hss +冀州市jzs +深州市szs +石家庄市sjzs +张家口市zjks +高碑店市gbds +秦皇岛市qhds +山西省sxs +太原市tys +古交市gjs +大同市dts +阳泉市yqs +长治市czs +潞城市lcs +晋城市jcs +高平市gps +朔州市szs +晋中市jzs +介休市jxs +运城市ycs +河津市hjs +永济市sjs +忻州市xzs +原平市yps +临汾市lfs +侯马市hms +霍州市hzs +吕梁市lls +孝义市xys +汾阳市fys +内蒙古自治区nmg +包头市bts +乌海市whs +赤峰市cfs +通辽市tls +根河市ghs +丰镇市fzs +辽宁省LNS +沈阳市sys +新民市xms +大连市dls +庄河市zhs +鞍山市ass +海城市hcs +抚顺市fss +本溪市bxs +丹东市dds +东港市dgs +凤城市fcs +锦州市jzs +凌海市lhs +北宁市bns +营口市yks +盖州市gzs +阜新市fxs +辽阳市lys +灯塔市dts +盘锦市pjs +铁岭市tls +开原市kys +朝阳市zys +凌源市lys +北票市bps +兴城市xcs +大石桥市dsqs +瓦房店市wfds +普兰店市plds +调兵山市dbss +葫芦岛市hlds +吉林省jls +长春市ccs +九台市jts +榆树市yss +德惠市dhs +吉林市jls +舒兰市sls +桦甸市hds +蛟河市jhs +磐石市pss +四平市sps +双辽市sls +辽源市lys +通化市ths +集安市jas +白山市bss +临江市ljs +松原市sys +白城市bcs +大安市das +洮南市tns +延吉市yjs +图们市tms +敦化市ghs +龙井市ljs +珲春市hcs +和龙市hls +公主岭市gzls +梅河口市mhks +黑龙江省hljs +阿城市acs +尚志市szs +双城市scs +五常市wcs +讷河市nhs +鹤岗市hgs +鸡西市jxs +密山市mss +虎林市hls +大庆市dqs +伊春市ycs +铁力市tls +宁安市nas +海林市hls +穆棱市mls +同江市tjs +富锦市fjs +黑河市hhs +北安市bas +绥化市shs +安达市ads +肇东市zds +海伦市hls +七台河市qths +双鸭山市syss +牡丹江市mdjs +佳木斯市jmss +绥芬河市sfhs +哈尔滨市hebs +齐齐哈尔市qqhes +五大连池市wdlcs +上海市shs +黄浦区hpq +卢湾区lwq +徐汇区xhq +长宁区cnq +静安区jaq +普陀区ptq +闸北区zbq +虹口区hkq +杨浦区ypq +宝山区bsq +闵行区mxq +嘉定区jdq +松江区sjq +金山区jsq +青浦区qpq +南汇区nhq +奉贤区fxq +崇明县浦东新区cmxpdxq +江苏省jss +南京市njs +无锡市wxs +江阴市jys +宜兴市yxs +徐州市xzs +邳州市pzs +新沂市xys +常州市czs +金坛市jts +溧阳市lys +苏州市szs +常熟市css +太仓市dcs +昆山市hss +吴江市wjs +南通市nns +如皋市rgs +通州市tzs +海门市hms +启东市qds +淮安市has +盐城市ycs +东台市dts +大丰市dfs +扬州市yzs +高邮市gys +江都市jds +仪征市yzs +镇江市zjs +丹阳市dys +扬中市yzs +句容市jrs +泰州市dzs +泰兴市dxs +姜堰市jys +靖江市jjs +兴化市xhs +宿迁市sqs +连云港市lygs +张家港市zjgs +浙江省zjs +杭州市hzs +建德市jds +富阳市fys +临安市las +宁波市nbx +余姚市yys +慈溪市cxs +奉化市fhs +温州市wzs +瑞安市ras +乐清市lqs +嘉兴市jxs +海宁市hns +平湖市phs +桐乡市txs +湖州市hzs +绍兴市sxs +诸暨市zjs +上虞市sys +嵊州市szs +金华市jhs +兰溪市lxs +义乌市yws +东阳市dys +永康市yks +衢州市qzs +江山市jss +舟山市zss +台州市tzs +临海市lhs +丽水市lss +龙泉市lqs +安徽省ahs +合肥市hfs +芜湖市whs +蚌埠市bbs +淮南市hns +淮北市hbs +铜陵市tls +安庆市aqs +桐城市tcs +黄山市hss +滁州市czs +天长市dcs +明光市mgs +阜阳市fys +界首市jss +宿州市szs +巢湖市chs +六安市las +亳州市hzs +池州市czs +宣城市ycs +宁国市ngs +马鞍山市mass +福建省fjs +福州市fjs +福清市fqs +长乐市cls +厦门市xms +莆田市pts +三明市sms +永安市yas +泉州市qzs +石狮市sss +晋江市jjs +南安市nas +漳州市zzs +龙海市lhs +南平市nps +建瓯市jos +邵武市sws +建阳市jys +龙岩市lys +漳平市zps +宁德市nds +福安市fas +福鼎市fds +武夷山市wyss +江西省jxs +南昌市ncs +乐平市lps +萍乡市pxs +九江市jjs +瑞昌市rcs +新余市xys +鹰潭市yts +贵溪市gxs +赣州市gzs +瑞金市rjs +南康市nks +吉安市jas +宜春市ycs +丰城市fcs +樟树市zss +高安市gas +抚州市fzs +上饶市srs +德兴市dxs +井冈山市jgss +景德镇市jdzs +山东省sds +济南市jns +章丘市zqs +青岛市qds +胶南市jns +胶州市jzs +平度市pds +莱西市lxs +即墨市jms +淄博市zbs +枣庄市zzs +滕州市tzs +烟台市yts +龙口市lks +莱阳市lys +莱州市lzs +招远市zys +蓬莱市pls +栖霞市qxs +海阳市hys +潍坊市wfs +青州市qzs +诸城市zcs +寿光市sgs +安丘市aqs +高密市gms +昌邑市cys +济宁市jns +曲阜市qfs +兖州市yzs +邹城市zcs +泰安市tas +新泰市xts +肥城市fcs +威海市whs +乳山市rss +文登市wds +荣成市rcs +日照市rzs +莱芜市lws +临沂市lys +德州市dzs +乐陵市lls +禹城市ycs +聊城市lcs +临清市lqs +滨州市bzs +菏泽市hzs +河南省hns +郑州市zzs +巩义市gys +新郑市xzs +新密市xms +登封市dfs +荥阳市xys +开封市kfs +洛阳市lys +偃师市yss +汝州市rzs +舞钢市wgs +安阳市ays +林州市lzs +新乡市xxs +卫辉市whs +辉县市hxs +焦作市jzs +沁阳市qys +孟州市mzs +濮阳市pys +许昌市xcs +禹州市yzs +长葛市cgs +漯河市lhs +义马市yms +灵宝市lbs +南阳市nys +邓州市dzs +商丘市sqs +永城市ycs +信阳市xys +周口市zks +项城市dcs +济源市jys +三门峡市smxs +平顶山市pdss +驻马店市zmds +湖北省hbs +武汉市whs +黄石市hss +大冶市dys +十堰市sys +荆州市jzs +洪湖市hhs +石首市sss +松滋市szs +宜昌市ycs +宜都市yds +当阳市dys +枝江市jjs +襄樊市xfs +枣阳市zys +宜城市ycs +鄂州市ezs +荆门市jms +钟祥市zxs +孝感市xgs +应城市ycs +安陆市als +汉川市hcs +黄冈市hgs +麻城市mcs +武穴市wxs +咸宁市xns +赤壁市cbs +随州市szs +广水市gss +仙桃市xts +天门市tms +潜江市qjs +恩施市ess +利川市lcs +丹江口市djks +老河口市lhks +神农架林区snjlq +湖南省hns +长沙市css +浏阳市lys +株洲市zzs +醴陵市lls +湘潭市xts +湘乡市xxs +韶山市sss +衡阳市hys +耒阳市lys +常宁市cns +邵阳市sys +武冈市wgs +岳阳市yys +临湘市lxs +汨罗市mls +常德市cds +津市市jss +益阳市yys +沅江市yjs +郴州市czs +资兴市zxs +永州市yzs +怀化市hhs +洪江市hjs +娄底市lds +涟源市lys +吉首市jss +冷水江市lsjs +张家界市zjjs +广东省gds +广州市gzs +从化市chs +增城市zcs +深圳市szs +珠海市zhs +汕头市sts +韶关市sgs +乐昌市lcs +南雄市nxs +佛山市fss +江门市jms +台山市tss +开平市kps +鹤山市hss +恩平市eps +湛江市zjs +廉江市ljs +雷州市lzs +吴川市wcs +茂名市mms +西昌市xcs +峨眉山市emss +都江堰市djys +攀枝花市pzhs +贵州省gzs +贵阳市gys +清镇市qzs +遵义市zys +赤水市css +仁怀市rhs +安顺市ass +毕节市bjs +兴义市xys +凯里市kls +都匀市dys +福泉市fqs +六盘水市lpss +六枝特区lztq +万山特区wstq +云南省yns +昆明市kms +安宁市ans +曲靖市qjs +宣威市xws +玉溪市yxs +保山市bss +昭通市zts +丽江市ljs +思茅市sms +临沧市lqs +个旧市gjs +开远市kys +景洪市jhs +楚雄市cxs +大理市dls +潞西市lxs +瑞丽市rls +西藏自治区xzzzq +拉萨市lss +陕西省sxs +西安市xas +铜川市tcs +宝鸡市bjs +咸阳市xys +渭南市wns +韩城市hcs +华阴市hys +延安市yas +汉中市azs +榆林市yls +安康市aks +商洛市sls +甘肃省gss +兰州市lzs +金昌市jcs +白银市bys +天水市tss +武威市wws +张掖市zys +平凉市pls +酒泉市jqs +玉门市yms +敦煌市dhs +庆阳市qys +定西市dxs +陇南市lns +临夏市lxs +合作市hzs +嘉峪关市jygs +青海省qhs +西宁市xns +德令哈市dlhs +格尔木市gems +宁夏回族自治区nxhzzzq +银川市ycs +灵武市lws +吴忠市wzs +固原市gys +中卫市zws +石嘴山市szss +青铜峡市qtxs +新疆维吾尔自治区xjwwezzq +喀什市kss +昌吉市cjs +阜康市fks +米泉市mqs +博乐市bls +伊宁市yns +奎屯市kts +塔城市tcs +乌苏市wss +石河子市shzs +阿拉尔市ales +五家渠市wjqs +吐鲁番市tlfs +阿克苏市akss +阿图什市atss +库尔勒市kels +阿勒泰市alts +乌鲁木齐市wlmqs +克拉玛依市klmys +图木舒克市tmsks +香港特别行政区 +中西区zxq +东区dq +观塘区gtq +南区nq +湾仔区wzq +离岛区ldq +葵青区kqq +北区bq +西贡区xgq +沙田区stq +屯门区tmq +大埔区dpq +荃湾区qwq +元朗区ylq +九龙城区jtcq +油尖旺区yjwq +深水埗区ssbq +黄大仙区hdxq +台湾省tws +台北市tbs +高雄市gxs +基隆市jls +台中市tzs +台南市tns +新竹市xzs +嘉义市jys +板桥市bqs +宜兰市yls +竹北市zbs +桃园市tys +苗栗市mls +丰原市fys +彰化市zhs +南投市nts +太保市tbs +斗六市dls +新营市xys +凤山市fss +屏东市pds +台东市tds +花莲市hls +马公市mgs diff --git a/YN_utf8.txt b/YN_utf8.txt index c0c1eb5..a847c21 100644 --- a/YN_utf8.txt +++ b/YN_utf8.txt @@ -1,21061 +1,21061 @@ -Šsw -šsw -Žzw -žzw -Œce -œce -aÀ -aÁ -aẢ -aà -aẠ -aÄ -aÅ -aeÆ -a -asá -afà -arả -axã -ajạ -awă -aaâ -aeă -äa -åa -aaâ -aa -Äa -Åa -Æae -AFÀ -ASÁ -ARẢ -AXà -AJẠ -AÄ -AÅ -AEÆ -AA -eÉ -eÈ -eẺ -eẼ -eẸ -eÊ -eË -esé -efè -erẻ -exẽ -ejẹ -eeê -ESÉ -EFÈ -ERẺ -EXẼ -EJẸ -EEÊ -eeÊ -EË -DDĐ -ddđ -ddĐ -íis -ìif -ỉir -ĩix -ịij -ÌIF -ÍIS -ỈIR -ĨIX -ỊIj -IIÎ -iÌ -iÍ -iỈ -iĨ -ij -iÎ -iÏ -nÑ -osó -ofò -orỏ -oxõ -ojọ -owơ -ooô -OSÓ -OFÒ -ORỎ -OXÕ -OJỌ -OWƠ -OEÒ -OOÔ -ooÔ -OÖ -ooÖ -oÓ -oÒ -oỎ -oÕ -oỌ -oƠ -oÒ -oÔ -usú -ufù -urủ -uxũ -ujụ -uwư -USÚ -UFÙ -URỦ -UXŨ -UJỤ -UWƯ -ÜU -ÛU -uÚ -uÙ -uỦ -uŨ -uỤ -uƯ -uÜ -uÛ -YFỲ -YSÝ -YRỶ -YXỸ -YJỴ -yỲ -yÝ -yỶ -yỸ -yỴ -yfỳ -ysý -yrỷ -yxỹ -ỵyj -安a -按a -爱a -阿a -暗a -啊a -埃a -碍a -凹a -奥a -岸a -矮a -案a -俺a -挨a -唉a -昂a -氨a -胺a -哎a -吖a -嗄a -腌a -锕a -安徽省ahs -爱ai -埃ai -碍ai -矮ai -挨ai -唉ai -哎ai -哀ai -皑ai -癌ai -蔼ai -艾ai -隘ai -呆*ai -捱ai -嗳ai -嗌ai -嫒ai -瑷ai -暧ai -砹ai -锿ai -霭ai -安an -按an -暗an -岸an -案an -俺an -氨an -胺an -鞍an -谙an -埯an -揞an -犴an -庵an -桉an -铵an -鹌an -黯an -昂ang -肮ang -盎ang -安徽anhui -凹ao -奥ao -敖ao -熬ao -翱ao -袄ao -傲ao -懊ao -澳ao -嚣*ao -坳ao -拗ao -嗷ao -岙ao -廒ao -遨ao -媪ao -骜ao -獒ao -聱ao -螯ao -鏊ao -鳌ao -鏖ao -不b -部b -本b -表b -把b -变b -比b -并b -别b -百b -报b -保b -病b -北b -被b -步b -边b -八b -办b -布b -把ba -八ba -吧ba -巴ba -拔ba -霸ba -罢ba -爸ba -坝ba -芭ba -捌ba -扒ba -叭ba -笆ba -疤ba -跋ba -靶ba -耙ba -茇ba -菝ba -岜ba -灞ba -钯ba -粑ba -鲅ba -魃ba -百bai -白bai -败bai -摆bai -伯*bai -柏bai -佰bai -拜bai -稗bai -捭bai -掰bai -办ban -半ban -板ban -班ban -般ban -版ban -拌ban -搬ban -斑ban -扳ban -伴ban -颁ban -扮ban -瓣ban -绊ban -阪ban -坂ban -钣ban -瘢ban -癍ban -舨ban -帮bang -棒bang -邦bang -榜bang -梆bang -膀bang -绑bang -磅bang -蚌bang -镑bang -傍bang -谤bang -蒡bang -浜bang -报bao -保bao -包bao -剥bao -薄bao -胞bao -暴bao -宝bao -饱bao -抱bao -爆bao -炮*bao -堡bao -刨*bao -苞bao -褒bao -雹bao -豹bao -鲍bao -曝*bao -瀑*bao -葆bao -孢bao -煲bao -鸨bao -褓bao -趵bao -龅bao -北bei -被bei -倍bei -备bei -背bei -辈bei -贝bei -杯bei -卑bei -臂*bei -悲bei -碑bei -钡bei -狈bei -惫bei -焙bei -孛bei -陂bei -邶bei -埤bei -萆bei -蓓bei -呗bei -悖bei -碚bei -鹎bei -褙bei -鐾bei -鞴bei -本ben -奔ben -苯ben -笨ben -夯*ben -畚ben -坌ben -贲ben -锛ben -本报benbao -奔波benbo -本部benbu -本厂benchang -奔驰benchi -本地bendi -奔放benfang -泵beng -崩beng -蚌*beng -绷beng -甭beng -蹦beng -迸beng -嘣beng -甏beng -比bi -必bi -避bi -闭bi -辟bi -笔bi -壁bi -臂bi -毕bi -彼bi -逼bi -币bi -鼻bi -蔽bi -秘*bi -鄙bi -碧bi -蓖bi -毙bi -毖bi -庇bi -痹bi -敝bi -弊bi -陛bi -拂*bi -泌*bi -匕bi -俾bi -埤*bi -芘*bi -荜bi -荸bi -萆*bi -薜bi -吡bi -哔bi -狴bi -庳bi -愎bi -滗bi -濞bi -弼bi -妣bi -婢bi -嬖bi -璧bi -贲*bi -睥*bi -畀bi -铋bi -秕bi -裨bi -筚bi -箅bi -篦bi -舭bi -襞bi -跸bi -髀bi -变bian -边bian -便bian -编bian -遍bian -辩bian -扁bian -辨bian -鞭bian -贬bian -卞bian -辫bian -匾bian -弁bian -苄bian -忭bian -汴bian -缏bian -飚bian -煸bian -砭bian -碥bian -窆bian -褊bian -蝙bian -笾bian -鳊bian -表biao -标biao -彪biao -膘biao -勺*biao -婊biao -骠biao -杓biao -飑biao -飙biao -镖biao -镳biao -瘭biao -裱biao -鳔biao -髟biao -别bie -鳖bie -憋bie -瘪bie -蹩bie -宾bin -彬bin -斌bin -濒bin -滨bin -摈bin -傧bin -豳bin -缤bin -玢bin -槟bin -殡bin -膑bin -镔bin -髌bin -鬓bin -并bing -病bing -兵bing -柄bing -冰bing -丙bing -饼bing -秉bing -炳bing -屏*bing -禀bing -邴bing -摒bing -槟*bing -波bo -播bo -剥*bo -伯bo -拨bo -薄*bo -博bo -勃bo -驳bo -玻bo -泊bo -柏*bo -卜*bo -菠bo -钵bo -搏bo -铂bo -箔bo -帛bo -舶bo -脖bo -膊bo -渤bo -魄*bo -孛*bo -亳bo -啵bo -饽bo -檗bo -掰*bo -擘bo -礴bo -钹bo -鹁bo -簸bo -趵*bo -跛bo -踣bo -不bu -部bu -步bu -布bu -补bu -捕bu -埔*bu -卜bu -堡*bu -哺bu -埠bu -簿bu -怖bu -卟bu -逋bu -瓿bu -晡bu -钚bu -钸bu -醭bu -不安buan -不比bubi -不必bubi -不变bubian -不便bubian -步兵bubing -步步bubu -不曾buceng -补偿buchang -不啻buchi -补充buchong -不错bucuo -不大buda -不待budai -不但budan -不当budang -不得bude -不等budeng -步调budiao -不动budong -不断buduan -不对budui -部队budui -不法bufa -补发bufa -步伐bufa -不凡bufan -不妨bufang -不分bufen -部分bufen -不服bufu -不符bufu -不该bugai -不敢bugan -不甘bugan -布告bugao -不够bugou -不顾bugu -不管buguan -不过buguo -不会buhui -补给buji -部件bujian -不借bujie -不尽bujin -不仅bujin -不禁bujin -布景bujing -不久bujiu -补救bujiu -布局buju -不堪bukan -不可buke -不快bukuai -不愧bukui -不理buli -不利buli -不良buliang -不料buliao -步履bulu -不论bulun -部落buluo -不满buman -部门bumen -不免bumian -不能buneng -不怕bupa -补品bupin -不平buping -步枪buqiang -不屈buqu -不然buran -不如buru -不少bushao -不是bushi -不识bushi -部首bushou -部属bushu -部署bushu -补贴butie -不同butong -不妥butuo -部位buwei -部委buwei -不问buwen -不惜buxi -补习buxi -部下buxia -不行buxing -不幸buxing -步行buxing -不朽buxiu -不许buxu -哺养buyang -不要buyao -不宜buyi -不用buyong -哺育buyu -不在buzai -部长buzhang -不振buzhen -不只buzhi -不止buzhi -不知buzhi -不致buzhi -布置buzhi -步骤buzhou -补助buzhu -捕捉buzhuo -步子buzi -不足buzu -博物馆bwg -产c -成c -出c -长c -从c -此c -常c -处c -车c -场c -传c -采c -层c -厂c -才c -次c -虫c -除c -查c -差c -擦ca -拆*ca -嚓ca -礤ca -采cai -才cai -材cai -菜cai -财cai -裁cai -彩cai -猜cai -睬cai -踩cai -蔡cai -参can -残can -蚕can -灿can -餐can -惭can -惨can -孱can -骖can -璨can -粲can -黪can -惨案canan -惨白canbai -残暴canbao -惨怛canda -残废canfei -藏cang -仓cang -苍cang -舱cang -沧cang -苍白cangbai -仓促cangcu -仓库cangku -苍老canglao -苍茫cangmang -藏匿cangni -苍穹cangqiong -沧桑cangsang -苍天cangtian -参观canguan -残骸canhai -残疾canji -参加canjia -参见canjian -残局canju -惨剧canju -参军canjun -参看cankan -参考cankao -残酷canku -惭愧cankui -灿烂canlan -参谋canmou -残缺canque -残忍canren -孱弱canruo -残杀cansha -残生cansheng -蚕食canshi -参数canshu -惨痛cantong -参与canyu -残余canyu -残月canyue -参阅canyue -参赞canzan -惨遭canzao -参战canzhan -参照canzhao -参政canzheng -惨重canzhong -草cao -槽cao -操cao -糙cao -曹cao -嘈cao -漕cao -螬cao -艚cao -草案caoan -草稿caogao -槽糕caogao -操劳caolao -操练caolian -草率caolu -草木caomu -草拟caoni -草签caoqian -操心caoxin -草原caoyuan -嘈杂caoza -操纵caozong -操作caozuo -差不多cbd -成本核算cbhs -出版社cbs -层出不穷ccbq -从长计议ccjy -存储器ccq -长春市ccs -成都市cds -测ce -策ce -侧ce -册ce -厕ce -恻ce -测定ceding -策动cedong -策反cefan -策划cehua -测量celiang -策略celue -侧面cemian -参*cen -岑cen -涔cen -涔涔cencen -层ceng -曾*ceng -蹭ceng -层层cengceng -层次cengci -曾经cengjing -测试ceshi -厕所cesuo -测验ceyan -侧重cezhong -出发点cfd -充分发挥cffh -唱高调cgd -从古到今cgdj -查cha -差cha -插cha -察cha -茶cha -叉cha -茬cha -碴cha -搽cha -岔cha -诧cha -刹*cha -喳*cha -嚓*cha -猹cha -馇cha -汊cha -姹cha -杈cha -楂cha -槎cha -檫cha -锸cha -镲cha -衩cha -查办chaban -差别chabie -差错chacuo -差点chadian -查对chadui -差额chae -查访chafang -察访chafang -查封chafeng -查获chahuo -差*chai -柴chai -拆chai -豺chai -侪chai -钗chai -瘥chai -虿chai -拆穿chaichuan -豺狼chailang -拆散chaisan -差使chaishi -拆卸chaixie -柴油chaiyou -差价chajia -差距chaju -察觉chajue -查看chakan -察看chakan -查考chakao -查明chaming -产chan -单*chan -铲chan -阐chan -搀chan -掺chan -蝉chan -馋chan -谗chan -缠chan -颤chan -冁chan -谄chan -蒇chan -廛chan -忏chan -潺chan -澶chan -孱*chan -羼chan -婵chan -骣chan -觇chan -禅chan -镡chan -蟾chan -躔chan -铲除chanchu -产地chandi -阐发chanfa -搀扶chanfu -长chang -常chang -场chang -厂chang -唱chang -肠chang -昌chang -倡chang -偿chang -畅chang -猖chang -尝chang -敞chang -裳*chang -倘*chang -伥chang -鬯chang -苌chang -菖chang -徜chang -怅chang -惝chang -阊chang -娼chang -嫦chang -昶chang -氅chang -鲳chang -长安changan -常常changchang -长城changcheng -长春changchun -畅达changda -倡导changdao -长度changdu -长短changduan -唱歌changge -常规changgui -长河changhe -场合changhe -偿还changhuan -厂家changjia -常见changjian -长江changjiang -长久changjiu -猖獗changjue -长空changkong -畅快changkuai -猖狂changkuang -场面changmian -长眠changmian -长年changnian -长篇changpian -长期changqi -长驱changqu -常任changren -长沙changsha -厂商changshang -常识changshi -尝试changshi -长寿changshou -常数changshu -场所changsuo -畅谈changtan -长途changtu -怅惘changwang -常委changwei -倘未changwei -常温changwen -常务changwu -畅想changxiang -畅销changxiao -倡议changyi -畅饮changyin -常用changyong -常有changyou -畅游changyou -长远changyuan -厂长changzhang -长征changzheng -厂址changzhi -常驻changzhu -婵娟chanjuan -蝉联chanlian -产量chanliang -缠绵chanmian -阐明chanming -产品chanpin -产权chanquan -缠绕chanrao -产生chansheng -禅师chanshi -阐述chanshu -产物chanwu -产销chanxiao -产业chanye -产值chanzhi -朝chao -超chao -潮chao -巢chao -抄chao -钞chao -嘲chao -吵chao -炒chao -绰*chao -剿*chao -怊chao -晁chao -焯*chao -耖chao -抄报chaobao -超产chaochan -超出chaochu -朝代chaodai -超额chaoe -嘲讽chaofeng -超过chaoguo -朝晖chaohui -超级chaoji -吵架chaojia -潮解chaojie -潮流chaoliu -抄录chaolu -吵闹chaonao -嘲弄chaonong -潮湿chaoshi -潮水chaoshui -抄送chaosong -超脱chaotuo -抄袭chaoxi -朝鲜chaoxian -嘲笑chaoxiao -巢穴chaoxue -朝阳chaoyang -朝野chaoye -超越chaoyue -超支chaozhi -查清chaqing -插曲chaqu -插入charu -查哨chashao -插手chashou -查收chashou -插图chatu -查问chawen -查询chaxun -茶叶chaye -差异chayi -查阅chayue -查证chazheng -岔子chazi -插足chazu -车che -彻che -尺*che -撤che -扯che -掣che -澈che -坼che -砗che -彻底chedi -车祸chehuo -车间chejian -车辆cheliang -陈chen -沉chen -称chen -衬chen -尘chen -臣chen -晨chen -沈*chen -郴chen -辰chen -忱chen -趁chen -伧chen -谌chen -谶chen -抻chen -嗔chen -宸chen -琛chen -榇chen -碜chen -龀chen -尘埃chenai -沉淀chendian -陈腐chenfu -沉浮chenfu -成cheng -程cheng -称cheng -城cheng -承cheng -乘cheng -呈cheng -盛*cheng -撑cheng -诚cheng -橙cheng -惩cheng -澄cheng -逞cheng -骋cheng -秤cheng -丞cheng -埕cheng -噌cheng -枨cheng -柽cheng -塍cheng -瞠cheng -铖cheng -铛cheng -裎cheng -蛏cheng -酲cheng -成败chengbai -承办chengban -惩办chengban -呈报chengbao -承包chengbao -成本chengben -成材chengcai -惩处chengchu -乘除chengchu -承担chengdan -承当chengdang -成都chengdu -程度chengdu -乘法chengfa -惩罚chengfa -成功chenggong -成规chenggui -成果chengguo -称号chenghao -称呼chenghu -成绩chengji -乘机chengji -成家chengjia -成见chengjian -成交chengjiao -承接chengjie -惩戒chengjie -成就chengjiu -乘客chengke -诚恳chengken -成立chengli -乘凉chengliang -成名chengming -成年chengnian -成批chengpi -成品chengpin -诚朴chengpu -逞强chengqiang -澄清chengqing -城区chengqu -成全chengquan -诚然chengran -成人chengren -承认chengren -成色chengse -成事chengshi -诚实chengshi -城市chengshi -承受chengshou -成熟chengshu -成为chengwei -称谓chengwei -成文chengwen -呈现chengxian -呈献chengxian -城乡chengxiang -成效chengxiao -称心chengxin -诚心chengxin -程序chengxu -乘虚chengxu -撑腰chengyao -诚意chengyi -成语chengyu -成员chengyuan -称赞chengzan -成长chengzhang -城镇chengzhen -称职chengzhi -诚挚chengzhi -趁机chenji -沉积chenji -陈迹chenji -沉浸chenjin -沉静chenjing -陈旧chenjiu -陈列chenlie -沉沦chenlun -沉闷chenmen -沉湎chenmian -沉默chenmo -沉溺chenni -陈设chenshe -陈述chenshu -陈说chenshuo -沉思chensi -沉痛chentong -衬托chentuo -沉吟chenyin -衬映chenying -趁早chenzao -沉重chenzhong -沉着chenzhuo -车皮chepi -扯皮chepi -撤退chetui -撤消chexiao -车站chezhan -撤职chezhi -持chi -尺chi -齿chi -吃chi -赤chi -池chi -迟chi -翅chi -斥chi -耻chi -痴chi -匙chi -弛chi -驰chi -侈chi -炽chi -傺chi -坻chi -墀chi -茌chi -叱chi -哧chi -啻chi -嗤chi -彳chi -饬chi -媸chi -敕chi -眵chi -鸱chi -瘛chi -褫chi -蚩chi -螭chi -笞chi -篪chi -豉chi -踟chi -魑chi -翅膀chibang -赤诚chicheng -驰骋chicheng -尺寸chicun -迟到chidao -赤道chidao -尺度chidu -迟钝chidun -吃喝chihe -迟缓chihuan -吃紧chijin -吃惊chijing -持久chijiu -吃苦chiku -吃亏chikui -吃力chili -炽烈chilie -齿轮chilun -持平chiping -痴情chiqing -炽热chire -耻辱chiru -池塘chitang -耻笑chixiao -赤心chixin -痴心chixin -迟疑chiyi -迟早chizao -斥责chize -叱咤chizha -持重chizhong -吃重chizhong -赤字chizi -催化剂chj -种*chong -虫chong -重*chong -充chong -冲chong -崇chong -涌*chong -宠chong -茺chong -忡chong -憧chong -铳chong -舂chong -艟chong -宠爱chongai -崇拜chongbai -充斥chongchi -冲刺chongci -冲淡chongdan -充当chongdang -重叠chongdie -冲动chongdong -宠儿chonger -充分chongfen -冲锋chongfeng -重复chongfu -崇高chonggao -重合chonghe -重婚chonghun -冲击chongji -重建chongjian -崇敬chongjing -憧憬chongjing -充满chongman -充沛chongpei -冲破chongpo -重庆chongqing -崇尚chongshang -重申chongshen -充实chongshi -冲刷chongshua -冲天chongtian -冲突chongtu -重温chongwen -冲洗chongxi -重新chongxin -重演chongyan -重印chongyin -充裕chongyu -充足chongzu -抽chou -仇chou -臭chou -酬chou -畴chou -踌chou -稠chou -愁chou -筹chou -绸chou -瞅chou -丑chou -俦chou -帱chou -惆chou -瘳chou -雠chou -筹办chouban -筹备choubei -惆怅chouchang -抽搐chouchu -踌躇chouchu -筹措choucuo -抽调choudiao -丑恶choue -仇恨chouhen -丑化chouhua -筹划chouhua -筹集chouji -筹建choujian -酬金choujin -抽空choukong -酬劳choulao -丑陋choulou -筹码chouma -稠密choumi -筹谋choumou -愁容chourong -抽象chouxiang -酬谢chouxie -抽噎chouye -出chu -处chu -除chu -初chu -础chu -触chu -楚chu -锄chu -储chu -畜*chu -橱chu -厨chu -躇chu -雏chu -滁chu -矗chu -搐chu -亍chu -刍chu -怵chu -憷chu -绌chu -杵chu -楮chu -樗chu -褚chu -蜍chu -蹰chu -黜chu -揣chuai -搋chuai -啜chuai -嘬*chuai -膪chuai -踹chuai -揣度chuaidu -揣摩chuaimo -传chuan -船chuan -穿chuan -串chuan -川chuan -椽chuan -喘chuan -舛chuan -遄chuan -巛chuan -氚chuan -钏chuan -舡chuan -传遍chuanbian -传标chuanbiao -传播chuanbo -船舶chuanbo -船埠chuanbu -穿插chuancha -传达chuanda -传单chuandan -传导chuandao -传递chuandi -床chuang -创chuang -窗chuang -闯chuang -疮chuang -幢chuang -怆chuang -创办chuangban -闯荡chuangdang -窗户chuanghu -创见chuangjian -创建chuangjian -闯劲chuangjin -创举chuangju -窗口chuangkou -创立chuangli -窗帘chuanglian -创始chuangshi -创新chuangxin -创业chuangye -创造chuangzao -创作chuangzuo -串联chuanlian -喘气chuanqi -传奇chuanqi -传染chuanran -传授chuanshou -传输chuanshu -传述chuanshu -传说chuanshuo -传送chuansong -传统chuantong -串通chuantong -喘息chuanxi -传讯chuanxun -传扬chuanyang -传阅chuanyue -传真chuanzhen -船只chuanzhi -穿着chuanzhuo -出版chuban -出榜chubang -储备chubei -出兵chubing -初步chubu -储藏chucang -出差chucha -出产chuchan -出场chuchang -出厂chuchang -处处chuchu -橱窗chuchuang -初次chuci -储存chucun -初等chudeng -出动chudong -触动chudong -出发chufa -触发chufa -除法chufa -处罚chufa -触犯chufan -出访chufang -除非chufei -处分chufen -出轨chugui -出海chuhai -吹chui -垂chui -锤chui -椎*chui -炊chui -捶chui -陲chui -棰chui -槌chui -吹棒chuibang -吹风chuifeng -吹拂chuifu -锤炼chuilian -吹牛chuiniu -垂青chuiqing -垂涎chuixian -吹嘘chuixu -垂直chuizhi -初级chuji -出击chuji -出界chujie -出境chujing -处境chujing -处决chujue -触觉chujue -除开chukai -出口chukou -出来chulai -除了chule -出力chuli -处理chuli -矗立chuli -初恋chulian -出笼chulong -出路chulu -出马chuma -出卖chumai -出面chumian -出名chuming -除名chuming -出没chumo -春chun -纯chun -醇chun -椿chun -唇chun -淳chun -蠢chun -莼chun -鹑chun -蝽chun -出纳chuna -春播chunbo -纯粹chuncui -纯度chundu -春分chunfen -春风chunfeng -春耕chungeng -春光chunguang -醇厚chunhou -春辉chunhui -春季chunji -春节chunjie -纯洁chunjie -纯净chunjing -纯利chunli -纯朴chunpu -春秋chunqiu -春色chunse -春笋chunsun -春天chuntian -处女chunu -触怒chunu -春意chunyi -纯真chunzhen -纯正chunzheng -戳chuo -绰chuo -啜*chuo -辍chuo -踔chuo -龊chuo -戳穿chuochuan -绰号chuohao -啜泣chuoqi -出品chupin -出奇chuqi -初期chuqi -出勤chuqin -出去chuqu -出让churang -出任churen -出入churu -出色chuse -出身chushen -出神chushen -出生chusheng -畜生chusheng -出事chushi -出世chushi -处世chushi -厨师chushi -出售chushou -处所chusuo -出庭chuting -锄头chutou -出土chutu -出外chuwai -除外chuwai -出席chuxi -出息chuxi -除夕chuxi -出现chuxian -初小chuxiao -雏形chuxing -储蓄chuxu -刍议chuyi -处于chuyu -初战chuzhan -处长chuzhang -出诊chuzhen -出征chuzheng -处置chuzhi -初中chuzhong -出租chuzu -此ci -次ci -刺ci -磁ci -雌ci -词ci -茨ci -疵ci -辞ci -慈ci -瓷ci -赐ci -伺*ci -兹*ci -茈ci -呲ci -祠ci -鹚ci -糍ci -慈爱ciai -辞别cibie -磁场cichang -磁带cidai -磁道cidao -此地cidi -词典cidian -辞典cidian -刺耳cier -词根cigen -刺骨cigu -此后cihou -词汇cihui -刺激ciji -赐教cijiao -此刻cike -刺客cike -词类cilei -辞令ciling -磁盘cipan -次品cipin -辞去ciqu -刺杀cisha -此时cishi -次数cishu -辞书cishu -词素cisu -祠堂citang -辞退citui -此外ciwai -慈祥cixiang -辞行cixing -词性cixing -雌雄cixiong -次序cixu -词序cixu -刺眼ciyan -次要ciyao -词语ciyu -赐予ciyu -此致cizhi -辞职cizhi -词缀cizhui -词组cizu -超级大国cjdg -参考书cks -参考消息ckxx -参考资料ckzl -触类旁通clpt -藏龙卧虎clwh -参谋长cmc -聪明才智cmcz -出谋划策cmhc -从难从严cncy -从cong -丛cong -聪cong -葱cong -囱cong -匆cong -苁cong -淙cong -骢cong -琮cong -璁cong -从此congci -匆匆congcong -匆促congcu -从而conger -从犯congfan -聪慧conghui -从来conglai -丛林conglin -匆忙congmang -聪明congming -从前congqian -从容congrong -从事congshi -丛书congshu -从速congsu -从新congxin -从严congyan -聪颖congying -葱郁congyu -从中congzhong -凑cou -楱cou -辏cou -腠cou -凑合couhe -凑巧couqiao -成品率cpl -成千上万cqsw -从容不迫crbp -承认错误crcw -趁热打铁crdt -措手不及csbj -出生率csl -长沙市css -炊事员csy -彻头彻尾ctcw -垂头丧气ctsq -粗cu -促cu -醋cu -簇cu -卒*cu -蔟cu -徂cu -猝cu -殂cu -酢cu -蹙cu -蹴cu -篡cuan -蹿cuan -窜cuan -攒*cuan -汆cuan -撺cuan -爨cuan -镩cuan -篡夺cuanduo -窜犯cuanfan -篡改cuangai -篡权cuanquan -粗暴cubao -粗糙cucao -粗犷cuguang -催cui -脆cui -淬cui -粹cui -摧cui -衰*cui -崔cui -瘁cui -翠cui -萃cui -啐cui -悴cui -璀cui -榱cui -毳cui -隹cui -摧残cuican -脆弱cuiruo -促进cujin -存cun -村cun -寸cun -蹲*cun -忖cun -皴cun -存储cunchu -存档cundang -存放cunfang -存款cunkuan -村落cunluo -存亡cunwang -存在cunzai -村镇cunzhen -村庄cunzhuang -村子cunzi -错cuo -措cuo -撮cuo -磋cuo -搓cuo -挫cuo -厝cuo -嵯cuo -脞cuo -锉cuo -矬cuo -痤cuo -瘥*cuo -鹾cuo -蹉cuo -错案cuoan -挫败cuobai -错处cuochu -措辞cuoci -错怪cuoguai -错过cuoguo -撮合cuohe -错觉cuojue -磋商cuoshang -挫伤cuoshang -措施cuoshi -错误cuowu -挫折cuozhe -错综cuozong -粗浅cuqian -促使cushi -粗俗cusu -粗心cuxin -粗壮cuzhuang -常委会cwh -崇文区cwq -常务委员会cwwh -乘务员cwy -诚心诚意cxcy -程序控制cxkz -程序设计cxsj -长远利益cyly -朝阳区cyq -财政部czb -错综复杂czfz -操之过急czgj -出租汽车czqc -此之外czw -财政危机czwj -创造性czx -操作系统czxt -操作员czy -持之以恒czyh -的d -大d -地d -动d -到d -对d -度d -多d -电d -党d -得d -定d -等d -斗d -当d -队d -都d -点d -代d -道d -大da -打da -达da -答da -搭da -塔*da -瘩da -耷da -哒da -嗒da -怛da -妲da -沓*da -疸da -褡da -笪da -靼da -鞑da -答案daan -打败dabai -大办daban -大半daban -打扮daban -答辩dabian -大伯dabo -大部dabu -达成dacheng -大胆dadan -搭档dadang -大道dadao -达到dadao -打倒dadao -大地dadi -大敌dadi -大抵dadi -打断daduan -大队dadui -大多daduo -大凡dafan -大夫dafu -大幅dafu -答复dafu -大概dagai -大纲dagang -大国daguo -大海dahai -大好dahao -大河dahe -大亨daheng -大会dahui -大*dai -代dai -带dai -待dai -袋dai -戴dai -呆dai -歹dai -傣dai -殆dai -贷dai -逮dai -怠dai -埭dai -甙dai -呔dai -岱dai -迨dai -骀dai -绐dai -玳dai -黛dai -呆板daiban -代表daibiao -逮捕daibu -逮逋daibu -代词daici -带动daidong -怠工daigong -代价daijia -贷款daikuan -带来dailai -代理daili -带领dailing -带路dailu -黛绿dailu -代码daima -怠慢daiman -待命daiming -代数daishu -代替daiti -带头daitou -歹徒daitu -待遇daiyu -呆滞daizhi -呆子daizi -打击daji -大家dajia -打搅dajiao -大街dajie -大捷dajie -打劫dajie -搭救dajiu -大局daju -答卷dajuan -打开dakai -耷拉dala -大力dali -大连dalian -大量daliang -打量daliang -大陆dalu -大略dalue -大妈dama -单dan -但dan -弹dan -担dan -石*dan -蛋dan -淡dan -胆dan -氮dan -丹dan -旦dan -耽dan -郸dan -掸dan -惮dan -诞dan -儋dan -萏dan -啖dan -澹*dan -殚dan -赕dan -眈dan -疸dan -瘅dan -聃dan -箪dan -大脑danao -担保danbao -单薄danbao -淡薄danbao -单产danchan -诞辰danchen -单纯danchun -单词danci -担当dandang -单调dandiao -单独dandu -单方danfang -担负danfu -党dang -当dang -档dang -挡dang -荡dang -谠dang -凼dang -菪dang -宕dang -砀dang -裆dang -单干dangan -胆敢dangan -档案dangan -当场dangchang -当初dangchu -当代dangdai -当地dangdi -单个dange -耽搁dange -党风dangfeng -党纲danggang -党纪dangji -党籍dangji -当即dangji -当家dangjia -当今dangjin -当局dangju -当量dangliang -当面dangmian -党内dangnei -当年dangnian -党派dangpai -当铺dangpu -当前dangqian -当然dangran -当日dangri -当时dangshi -当天dangtian -当头dangtou -党团dangtuan -当晚dangwan -党委dangwei -当先dangxian -党校dangxiao -当心dangxin -党性dangxing -荡漾dangyang -党员dangyuan -当月dangyue -党章dangzhang -当真dangzhen -党政dangzheng -当政dangzheng -当中dangzhong -当众dangzhong -当做dangzuo -单价danjia -担架danjia -胆量danliang -胆略danlue -淡漠danmo -胆怯danqie -丹青danqing -担任danren -单身danshen -诞生dansheng -但是danshi -胆识danshi -单体danti -丹田dantian -单位danwei -耽误danwu -单项danxiang -胆小danxiao -担心danxin -淡雅danya -弹药danyao -单一danyi -单元danyuan -但愿danyuan -单质danzhi -担子danzi -掸子danzi -单字danzi -到dao -道dao -导dao -刀dao -倒dao -稻dao -岛dao -捣dao -盗dao -蹈dao -祷dao -悼dao -叨dao -帱*dao -忉dao -氘dao -焘*dao -纛dao -倒闭daobi -到处daochu -悼词daoci -到达daoda -导弹daodan -道德daode -到底daodi -倒戈daoge -捣鬼daogui -捣毁daohui -到来daolai -到了daole -道理daoli -倒立daoli -道路daolu -捣乱daoluan -倒霉daomei -叨念daonian -道歉daoqian -刀枪daoqiang -盗窃daoqie -到时daoshi -导师daoshi -倒数daoshu -导体daoti -倒退daotui -导演daoyan -道义daoyi -盗用daoyong -岛屿daoyu -导致daozhi -大批dapi -大破dapo -打破dapo -大气daqi -大庆daqing -打扰darao -打扫dasao -大厦dasha -搭讪dashan -大赦dashe -大使dashi -大事dashi -大师dashi -大势dashi -大肆dasi -打算dasuan -大体dati -大厅dating -打听dating -大同datong -大小daxiao -大写daxie -答谢daxie -大选daxuan -大学daxue -大业daye -达因dayin -打印dayin -答应daying -大于dayu -大院dayuan -大约dayue -打仗dazhang -大致dazhi -大众dazhong -打字dazi -代办处dbc -得不偿失dbcs -大部分dbf -电报挂号dbgh -大不了dbl -大步流星dblx -对不起dbq -代表团dbt -电冰箱dbx -东城区dcq -到此为止dcwz -独创性dcx -调查研究dcyj -打成一片dcyp -打电话ddh -电动机ddj -对得起ddq -大多数dds -的de -得de -地*de -德de -底*de -锝de -得逞decheng -的当dedang -得当dedang -得到dedao -得分defen -德国deguo -得奖dejiang -得救dejiu -得了dele -得力deli -等deng -灯deng -登deng -邓deng -澄*deng -蹬deng -瞪deng -凳deng -噔deng -嶝deng -戥deng -磴deng -镫deng -簦deng -登场dengchang -等待dengdai -等到dengdao -灯光dengguang -等候denghou -等级dengji -登记dengji -等价dengjia -灯具dengju -登门dengmen -灯谜dengmi -登攀dengpan -登山dengshan -灯塔dengta -登台dengtai -等同dengtong -等闲dengxian -等于dengyu -登载dengzai -得胜desheng -得失deshi -得体deti -德行dexing -得以deyi -得意deyi -德育deyu -得志dezhi -得知dezhi -得罪dezui -大幅度dfd -多方面dfm -单方面dfm -电风扇dfs -大规模dgm -多功能dgn -大公无私dgws -帝国主义dgzy -电话号码dhhm -电化教育dhjy -大会堂dht -的*di -地di -第di -低di -敌di -底di -提*di -帝di -抵di -滴di -弟di -递di -堤di -迪di -笛di -狄di -涤di -翟di -嫡di -蒂di -缔di -氐di -籴di -诋di -谛di -邸di -坻*di -荻di -嘀di -娣di -绨di -柢di -棣di -觌di -砥di -碲di -睇di -镝di -羝di -骶di -嗲dia -电dian -点dian -垫dian -典dian -店dian -颠dian -淀dian -掂dian -滇dian -碘dian -靛dian -佃dian -甸dian -惦dian -奠dian -殿dian -阽dian -坫dian -巅dian -玷dian -钿dian -癜dian -癫dian -簟dian -踮dian -电报dianbao -点播dianbo -电场dianchang -电车dianche -电池dianchi -电传dianchuan -颠倒diandao -电灯diandeng -点滴diandi -奠定dianding -电动diandong -典范dianfan -淀粉dianfen -垫付dianfu -颠覆dianfu -电感diangan -典故diangu -电荷dianhe -电弧dianhu -电话dianhua -电汇dianhui -电机dianji -电极dianji -奠基dianji -惦记dianji -典籍dianji -点将dianjiang -电解dianjie -殿军dianjun -癫狂diankuang -电缆dianlan -电力dianli -电离dianli -典礼dianli -电流dianliu -电路dianlu -电脑diannao -电能dianneng -店铺dianpu -电气dianqi -电器dianqi -点燃dianran -电容dianrong -电扇dianshan -电视dianshi -电台diantai -电梯dianti -点头diantou -电网dianwang -电位dianwei -玷污dianwu -殿下dianxia -电线dianxian -癫痫dianxian -电信dianxin -典型dianxing -电讯dianxun -电压dianya -电影dianying -店员dianyuan -点阵dianzhen -点缀dianzhui -电子dianzi -点子dianzi -电阻dianzu -调diao -掉diao -吊diao -鸟*diao -碉diao -叼diao -雕diao -凋diao -刁diao -钓diao -铞diao -铫diao -貂diao -鲷diao -碉堡diaobao -凋敝diaobi -调查diaocha -吊车diaoche -调动diaodong -调度diaodu -钓饵diaoer -调换diaohuan -掉换diaohuan -雕刻diaoke -调令diaoling -刁难diaonan -调遣diaoqian -调任diaoren -雕塑diaosu -吊唁diaoyan -调用diaoyong -钓鱼diaoyu -调子diaozi -第八diba -地板diban -地步dibu -低沉dichen -抵触dichu -抵达dida -地带didai -低档didang -抵挡didang -地道didao -弟弟didi -地点didian -地段diduan -敌对didui -迭die -跌die -爹die -碟die -蝶die -谍die -叠die -垤die -堞die -揲die -喋die -牒die -瓞die -耋die -踮*die -蹀die -鲽die -迭起dieqi -第二dier -地方difang -低估digu -敌国diguo -帝国diguo -敌后dihou -诋毁dihui -低级diji -递加dijia -递减dijian -地窖dijiao -递交dijiao -缔交dijiao -缔结dijie -第九dijiu -敌军dijun -抵抗dikang -地牢dilao -地理dili -低劣dilie -第六diliu -低落diluo -地貌dimao -地面dimian -抵命diming -定ding -顶ding -钉ding -丁ding -订ding -盯ding -叮ding -鼎ding -锭ding -仃ding -啶ding -玎ding -腚ding -碇ding -町ding -铤*ding -疔ding -耵ding -酊ding -定案dingan -定产dingchan -丁当dingdang -顶点dingdian -定夺dingduo -定额dinge -顶峰dingfeng -顶锋dingfeng -定购dinggou -订购dinggou -订户dinghu -定货dinghuo -订货dinghuo -定价dingjia -定局dingju -定居dingju -定理dingli -订立dingli -鼎立dingli -定量dingliang -定律dinglu -定期dingqi -定然dingran -盯梢dingshao -定时dingshi -顶替dingti -定性dingxing -定型dingxing -定义dingyi -定语dingyu -定员dingyuan -订阅dingyue -订正dingzheng -叮嘱dingzhu -顶撞dingzhuang -钉子dingzi -嫡派dipai -地盘dipan -第七diqi -嫡亲diqin -敌情diqing -地球diqiu -地区diqu -的确dique -敌人diren -第三disan -地势dishi -第十dishi -滴水dishui -第四disi -地铁ditie -地图ditu -丢diu -铥diu -丢掉diudiao -丢脸diulian -丢失diushi -地位diwei -敌伪diwei -第五diwu -嫡系dixi -底细dixi -地下dixia -低下dixia -底下dixia -地形dixing -弟兄dixiong -第一diyi -敌意diyi -地域diyu -抵御diyu -缔造dizao -递增dizeng -地震dizhen -敌阵dizhen -地质dizhi -地址dizhi -抵制dizhi -底子dizi -弟子dizi -党纪国法djgf -当机立断djld -多劳多得dldd -大力发展dlfz -大力加强dljq -大力开展dlkz -独立自主dlzz -多面手dms -对内搞活dngh -多年来dnl -东南亚dny -动dong -东dong -冬dong -懂dong -洞dong -冻dong -董dong -栋dong -侗dong -恫dong -垌dong -咚dong -岽dong -峒dong -氡dong -胨dong -胴dong -硐dong -鸫dong -东北dongbei -东边dongbian -东部dongbu -洞察dongcha -动词dongci -动荡dongdang -懂得dongde -东方dongfang -东风dongfeng -动工donggong -东海donghai -恫吓donghe -动机dongji -冬季dongji -东家dongjia -冻结dongjie -动静dongjing -东京dongjing -动力dongli -动量dongliang -栋梁dongliang -动乱dongluan -动脉dongmai -东南dongnan -东欧dongou -动人dongren -动身dongshen -董事dongshi -动手dongshou -动态dongtai -冬天dongtian -动听dongting -动物dongwu -东西dongxi -洞悉dongxi -动向dongxiang -动心dongxin -东亚dongya -东洋dongyang -动摇dongyao -动用dongyong -动员dongyuan -动辄dongzhe -动作dongzuo -斗dou -都*dou -豆dou -读*dou -兜dou -抖dou -陡dou -逗dou -痘dou -蔸dou -窦dou -蚪dou -篼dou -兜风doufeng -逗号douhao -逗留douliu -斗室doushi -兜售doushou -斗争douzheng -斗志douzhi -斗智douzhi -抖嘴douzui -打破常规dpcg -地平线dpx -电器化dqh -待人接物drjw -第三产业dscy -第十二届dsej -大使馆dsg -到时候dsh -电视机dsj -多少年dsn -大失所望dssw -电视台dst -低三下四dsxs -第十一届dsyj -大踏步dtb -到头来dtl -大体上dts -大同小异dtxy -度du -都du -毒du -独du -读du -渡du -杜du -堵du -镀du -顿du -督du -犊du -睹du -赌du -肚du -妒du -芏du -嘟du -渎du -椟du -牍du -蠹du -笃du -髑du -黩du -断duan -端duan -段duan -短duan -锻duan -缎duan -椴duan -煅duan -簖duan -短波duanbo -短处duanchu -短促duancu -断定duanding -短短duanduan -断交duanjiao -断绝duanjue -锻练duanlian -锻炼duanlian -短路duanlu -段落duanluo -短评duanping -短期duanqi -短缺duanque -断然duanran -煅烧duanshao -断送duansong -短途duantu -端午duanwu -端详duanxiang -短小duanxiao -断言duanyan -端阳duanyang -短语duanyu -短暂duanzan -端正duanzheng -端庄duanzhuang -读报dubao -读本duben -赌博dubo -独裁ducai -毒草ducao -独唱duchang -独创duchuang -督促ducu -毒打duda -独到dudao -度过duguo -毒害duhai -毒化duhua -都会duhui -对dui -队dui -堆dui -敦*dui -兑dui -怼dui -憝dui -碓dui -对比duibi -队部duibu -对策duice -对称duichen -对此duici -对待duidai -对等duideng -对调duidiao -对方duifang -对付duifu -对话duihua -兑换duihuan -对讲duijiang -对抗duikang -对口duikou -对垒duilei -对立duili -对联duilian -队列duilie -对流duiliu -对面duimian -对内duinei -对偶duiou -对手duishou -对数duishu -对外duiwai -队伍duiwu -兑现duixian -对象duixiang -对应duiying -对于duiyu -队员duiyuan -堆栈duizhan -队长duizhang -对照duizhao -对证duizheng -对质duizhi -对峙duizhi -对准duizhun -镀金dujin -杜绝dujue -渡口dukou -都来dulai -独立duli -度量duliang -盾dun -吨dun -顿dun -蹲dun -敦dun -墩dun -囤dun -钝dun -遁dun -沌dun -炖dun -砘dun -礅dun -盹dun -镦dun -趸dun -蹲点dundian -顿号dunhao -囤积dunji -遁迹dunji -钝角dunjiao -顿时dunshi -敦实dunshi -多duo -度*duo -夺duo -朵duo -掇duo -哆duo -垛duo -躲duo -跺duo -舵duo -剁duo -惰duo -堕duo -驮*duo -咄duo -哚duo -沲duo -缍duo -柁duo -铎duo -裰duo -踱duo -多半duoban -躲避duobi -多变duobian -多边duobian -躲藏duocang -多次duoci -夺得duode -多端duoduan -多方duofang -躲开duokai -多亏duokui -夺魁duokui -堕落duoluo -多么duome -夺目duomu -多年duonian -多情duoqing -夺取duoqu -多少duoshao -多事duoshi -掇拾duoshi -舵手duoshou -多数duoshu -多谢duoxie -多心duoxin -惰性duoxing -多样duoyang -多余duoyu -多种duozhong -肚皮dupi -毒品dupin -毒气duqi -读取duqu -度日duri -读入duru -堵塞duse -毒蛇dushe -都是dushi -毒手dushou -读数dushu -读书dushu -毒素dusu -独特dute -读物duwu -毒药duyao -独占duzhan -读者duzhe -毒汁duzhi -渎职duzhi -赌注duzhu -杜撰duzhuan -独自duzi -党委会dwh -对外开放dwkf -敌我矛盾dwmd -对外贸易dwmy -大无畏dww -动物园dwy -当务之急dwzj -邓小平dxp -大学生dxs -大显身手dxss -大西洋dxy -大跃进dyj -打印机dyj -大有可为dykw -待业青年dyqn -掉以轻心dyqx -电影院dyy -大洋洲dyz -大有作为dyzw -党支部dzb -多种多样dzdy -党政机关dzjg -多种经营dzjy -断章取义dzqy -大自然dzr -德智体dzt -电子学dzx -党中央dzy -而e -二e -尔e -儿e -恶e -额e -恩e -俄e -耳e -饵e -蛾e -饿e -峨e -鹅e -讹e -娥e -厄e -扼e -遏e -鄂e -噩e -谔e -垩e -苊e -莪e -萼e -呃e -愕e -屙e -婀e -轭e -腭e -锇e -锷e -鹗e -颚e -鳄e -恶霸eba -恶毒edu -恶感egan -恶棍egun -噩耗ehao -恶化ehua -诶ei -二极管ejg -二进制ejz -恶劣elie -鹅毛emao -噩梦emeng -恶魔emo -耳目一新emyx -恩en -蒽en -摁en -恩爱enai -恩赐enci -恩典endian -恩惠enhui -恩情enqing -而er -二er -尔er -儿er -耳er -饵er -洱er -贰er -佴er -迩er -珥er -铒er -鸸er -鲕er -耳朵erduo -儿歌erge -耳光erguang -而后erhou -尔后erhou -二届erjie -而今erjin -而况erkuang -而且erqie -而是ershi -儿童ertong -儿戏erxi -而已eryi -耳语eryu -二月eryue -儿子erzi -扼杀esha -额外ewai -扼腕ewan -额外负担ewfd -恶习exi -恶心exin -恶性exing -恶性循环exxh -扼要eyao -厄运eyun -讹诈ezha -遏止ezhi -分f -发f -方f -法f -反f -放f -复f -风f -防f -非f -服f -肥f -副f -粉f -府f -夫f -负f -封f -富f -翻f -发fa -法fa -阀fa -乏fa -伐fa -罚fa -筏fa -珐fa -垡fa -砝fa -发报fabao -法宝fabao -发表fabiao -发布fabu -发财facai -发愁fachou -发出fachu -发达fada -发电fadian -法典fadian -法定fading -发动fadong -发放fafang -发奋fafen -发愤fafen -法官faguan -法规fagui -法国faguo -发慌fahuang -发挥fahui -发火fahuo -发给faji -发迹faji -法纪faji -发家fajia -发奖fajiang -发酵fajiao -罚金fajin -发觉fajue -发掘fajue -罚款fakuan -发狂fakuang -法郎falang -法令faling -法律falu -发落faluo -发明faming -反fan -翻fan -范fan -犯fan -饭fan -繁fan -泛fan -番fan -凡fan -烦fan -返fan -藩fan -帆fan -樊fan -矾fan -钒fan -贩fan -蕃fan -蘩fan -幡fan -梵fan -燔fan -畈fan -蹯fan -翻版fanban -反比fanbi -反驳fanbo -帆布fanbu -反常fanchang -范畴fanchou -犯愁fanchou -帆船fanchuan -饭店fandian -反动fandong -翻动fandong -反对fandui -繁多fanduo -反而faner -反复fanfu -方fang -放fang -防fang -访fang -房fang -纺fang -仿fang -妨fang -芳fang -肪fang -坊fang -邡fang -彷*fang -枋fang -钫fang -舫fang -鲂fang -妨碍fangai -方案fangan -反感fangan -防备fangbei -方便fangbian -防潮fangchao -方程fangcheng -放大fangda -放荡fangdang -防盗fangdao -方法fangfa -防范fangfan -防风fangfeng -防腐fangfu -仿佛fangfu -妨害fanghai -防护fanghu -防火fanghuo -放假fangjia -房间fangjian -方面fangmian -放牧fangmu -返工fangong -反攻fangong -放屁fangpi -放弃fangqi -防区fangqu -放任fangren -放哨fangshao -放射fangshe -方式fangshi -防守fangshou -放肆fangsi -放松fangsong -仿宋fangsong -翻滚fangun -方位fangwei -防卫fangwei -访问fangwen -房屋fangwu -放下fangxia -防线fangxian -方向fangxiang -芳香fangxiang -仿效fangxiao -放心fangxin -放行fangxing -方言fangyan -防疫fangyi -防御fangyu -仿造fangzao -仿照fangzhao -方针fangzhen -仿真fangzhen -防治fangzhi -仿制fangzhi -放置fangzhi -防止fangzhi -纺织fangzhi -房子fangzi -放纵fangzong -房租fangzu -番号fanhao -繁华fanhua -反悔fanhui -返回fanhui -反击fanji -反抗fankang -反馈fankui -泛滥fanlan -范例fanli -凡例fanli -翻脸fanlian -贩卖fanmai -繁忙fanmang -烦闷fanmen -反面fanmian -反目fanmu -烦恼fannao -反叛fanpan -犯人fanren -繁荣fanrong -反射fanshe -翻身fanshen -繁盛fansheng -凡是fanshi -凡事fanshi -繁琐fansuo -烦琐fansuo -翻腾fanteng -繁体fanti -饭桶fantong -发怒fanu -饭碗fanwan -范围fanwei -反问fanwen -反响fanxiang -返销fanxiao -反省fanxing -翻修fanxiu -繁衍fanyan -翻译fanyi -翻印fanyin -反应fanying -反映fanying -繁育fanyu -翻越fanyue -翻阅fanyue -贩运fanyun -繁杂fanza -烦燥fanzao -反正fanzheng -反之fanzhi -繁殖fanzhi -繁重fanzhong -贩子fanzi -犯罪fanzui -发起faqi -法权faquan -发射fashe -发生fasheng -发誓fashi -发售fashou -法庭fating -发现faxian -发泄faxie -发行faxing -发言fayan -发扬fayang -法医fayi -发育fayu -发源fayuan -法院fayuan -法则faze -发展fazhan -法制fazhi -法治fazhi -发作fazuo -奋不顾身fbgs -分崩离析fblx -副产品fcp -发电机fdj -发动机fdj -反动派fdp -分道扬镳fdyb -非fei -肥fei -飞fei -费fei -废fei -肺fei -沸fei -菲fei -匪fei -啡fei -诽fei -吠fei -芾fei -狒fei -悱fei -淝fei -妃fei -绯fei -榧fei -腓fei -斐fei -扉fei -镄fei -痱fei -蜚fei -篚fei -翡fei -霏fei -鲱fei -匪帮feibang -诽谤feibang -飞奔feiben -非常feichang -飞驰feichi -废除feichu -非但feidan -非得feide -沸点feidian -非法feifa -非凡feifan -肺腑feifu -绯红feihong -废话feihua -飞机feiji -飞溅feijian -费解feijie -费劲feijin -飞快feikuai -费力feili -肥料feiliao -废料feiliao -肥胖feipang -废品feipin -废弃feiqi -费神feishen -废水feishui -飞速feisu -沸腾feiteng -匪徒feitu -肥沃feiwo -废物feiwu -飞舞feiwu -飞翔feixiang -费心feixin -飞行feixing -废墟feixu -飞扬feiyang -扉页feiye -非议feiyi -费用feiyong -飞跃feiyue -肥皂feizao -飞涨feizhang -废止feizhi -非洲feizhou -妃子feizi -分fen -粉fen -奋fen -份fen -粪fen -纷fen -芬fen -愤fen -酚fen -吩fen -氛fen -坟fen -焚fen -汾fen -忿fen -偾fen -瀵fen -玢*fen -棼fen -鲼fen -鼢fen -分贝fenbei -分辩fenbian -分辨fenbian -粪便fenbian -分别fenbie -分部fenbu -分布fenbu -分册fence -分寸fencun -分担fendan -分得fende -分店fendian -奋斗fendou -分队fendui -分发fenfa -奋发fenfa -纷纷fenfen -吩咐fenfu -风feng -封feng -蜂feng -丰feng -缝feng -峰feng -锋feng -疯feng -奉feng -枫feng -烽feng -逢feng -冯feng -讽feng -凤feng -俸feng -酆feng -葑feng -唪feng -沣feng -砜feng -风暴fengbao -丰碑fengbei -封闭fengbi -风波fengbo -丰产fengchan -奉承fengcheng -讽刺fengci -封存fengcun -风度fengdu -分割fenge -分隔fenge -风发fengfa -风帆fengfan -丰富fengfu -奉告fenggao -风格fengge -奉公fenggong -风光fengguang -风寒fenghan -奉还fenghuan -凤凰fenghuang -烽火fenghuo -封建fengjian -风景fengjing -疯狂fengkuang -风浪fenglang -风力fengli -风流fengliu -丰满fengman -锋芒fengmang -风貌fengmao -奉命fengming -丰年fengnian -分工fengong -奉陪fengpei -风气fengqi -风情fengqing -风趣fengqu -奉劝fengquan -缝纫fengren -风骚fengsao -风沙fengsha -风尚fengshang -风声fengsheng -丰盛fengsheng -丰收fengshou -风霜fengshuang -风水fengshui -丰硕fengshuo -奉祀fengsi -风俗fengsu -封锁fengsuo -疯瘫fengtan -封条fengtiao -风头fengtou -分管fenguan -风味fengwei -缝隙fengxi -风险fengxian -奉献fengxian -风向fengxiang -风行fengxing -奉行fengxing -蜂拥fengyong -风云fengyun -风韵fengyun -风灾fengzai -疯子fengzi -风姿fengzi -分号fenhao -分毫fenhao -分红fenhong -粉红fenhong -分化fenhua -分会fenhui -焚毁fenhui -分级fenji -分解fenjie -分界fenjie -奋进fenjin -分居fenju -分开fenkai -愤慨fenkai -分类fenlei -分离fenli -奋力fenli -分量fenliang -分裂fenlie -纷乱fenluan -分娩fenmian -分秒fenmiao -分明fenming -粉末fenmo -坟墓fenmu -愤怒fennu -分派fenpai -分配fenpei -分批fenpi -分期fenqi -分歧fenqi -奋起fenqi -分清fenqing -分区fenqu -分散fensan -焚烧fenshao -分数fenshu -分说fenshuo -粉碎fensui -分摊fentan -粪土fentu -分外fenwai -氛围fenwei -分析fenxi -奋勇fenyong -分赃fenzang -奋战fenzhan -分支fenzhi -分子fenzi -分组fenzu -丰富多采ffdc -奋发图强fftq -反过来说fgls -反革命fgm -福建省fjs -封建主义fjzy -翻来覆去flfq -法律顾问flgw -分秒必争fmbz -发明创造fmcz -否fou -缶fou -否定fouding -否决foujue -否认fouren -否则fouze -费品率fpl -废寝忘食fqws -缝纫机frj -分水岭fsl -翻天复地ftfd -丰台区ftq -非同小可ftxk -繁体字ftz -复fu -服fu -副fu -府fu -夫fu -负fu -富fu -附fu -福fu -伏fu -符fu -幅fu -腐fu -浮fu -辅fu -付fu -腹fu -妇fu -孵fu -覆fu -扶fu -辐fu -傅fu -佛fu -缚fu -父fu -弗fu -甫fu -肤fu -氟fu -敷fu -拂fu -俘fu -涪fu -袱fu -抚fu -俯fu -釜fu -斧fu -脯fu -腑fu -赴fu -赋fu -阜fu -讣fu -咐fu -匐fu -凫fu -郛fu -芙fu -芾*fu -苻fu -茯fu -莩fu -菔fu -拊fu -呋fu -幞fu -怫fu -滏fu -艴fu -孚fu -驸fu -绂fu -绋fu -桴fu -赙fu -祓fu -砩fu -黻fu -黼fu -罘fu -稃fu -馥fu -蚨fu -蜉fu -蝠fu -蝮fu -麸fu -趺fu -跗fu -鲋fu -鳆fu -腐败fubai -复辟fubi -复查fucha -浮沉fuchen -扶持fuchi -付出fuchu -副词fuci -服从fucong -附带fudai -负担fudan -辅导fudao -浮雕fudiao -浮动fudong -幅度fudu -复发fufa -伏法fufa -夫妇fufu -覆盖fugai -讣告fugao -富贵fugui -符号fuhao -附和fuhe -符合fuhe -负荷fuhe -腐化fuhua -浮华fuhua -复活fuhuo -俘获fuhuo -伏击fuji -附加fujia -附件fujian -福建fujian -佛教fujiao -附近fujin -副刊fukan -俯瞰fukan -浮夸fukua -付款fukuan -腐烂fulan -福利fuli -浮力fuli -富丽fuli -妇联fulian -附录fulu -俘虏fulu -覆灭fumie -覆没fumo -父母fumu -富农funong -妇女funu -扶贫fupin -服气fuqi -福气fuqi -夫妻fuqi -付讫fuqi -肤浅fuqian -富强fuqiang -父亲fuqin -富饶furao -夫人furen -芙蓉furong -妇孺furu -负伤fushang -辐射fushe -复试fushi -腐蚀fushi -俯视fushi -副手fushou -复数fushu -负数fushu -附属fushu -富庶fushu -赋税fushui -伏特fute -覆亡fuwang -富翁fuweng -服务fuwu -复习fuxi -浮现fuxian -赋闲fuxian -浮想fuxiang -腐朽fuxiu -抚恤fuxu -敷衍fuyan -扶养fuyang -抚养fuyang -俯仰fuyang -副业fuye -服役fuyi -复印fuyin -富有fuyou -赋有fuyou -赋于fuyu -抚育fuyu -富裕fuyu -赋予fuyu -复员fuyuan -复原fuyuan -负约fuyue -复杂fuza -负载fuzai -附则fuze -负责fuze -负债fuzhai -付帐fuzhang -复制fuzhi -扶植fuzhi -附中fuzhong -福州fuzhou -抚州fuzhou -附注fuzhu -辅助fuzhu -扶助fuzhu -服装fuzhuang -附着fuzhuo -富足fuzu -辅佐fuzuo -服务部fwb -服务态度fwtd -服务员fwy -方兴未艾fxwa -奋勇当先fydx -翻一番fyf -风言风语fyfy -发扬光大fygd -复印机fyj -发言人fyr -风雨同舟fytz -房租费fzf -副总理fzl -纺织品fzp -福州市fzs -反作用fzy -副作用fzy -负责制fzz -发展中国家fzzj -个g -国g -工g -过g -高g -干g -关g -各g -革g -公g -根g -更g -改g -管g -光g -广g -果g -格g -共g -搞g -夹*ga -噶ga -嘎ga -胳*ga -尬ga -尕ga -尜ga -旮ga -钆ga -公安部gab -改gai -该gai -盖gai -概gai -钙gai -溉gai -芥*gai -丐gai -陔gai -垓gai -戤gai -赅gai -改变gaibian -改编gaibian -该当gaidang -改道gaidao -改动gaidong -改革gaige -改观gaiguan -改过gaiguo -改悔gaihui -改建gaijian -改进gaijin -概况gaikuang -概括gaikuo -改良gailiang -概率gailu -概论gailun -概貌gaimao -概念gainian -改期gaiqi -改善gaishan -概述gaishu -概叹gaitan -改天gaitian -改选gaixuan -概要gaiyao -改造gaizao -改正gaizheng -改装gaizhuang -改组gaizu -公安局gaj -干gan -杆gan -感gan -敢gan -赶gan -甘gan -肝gan -秆gan -柑gan -竿gan -赣gan -乾*gan -坩gan -苷gan -尴gan -擀gan -泔gan -淦gan -澉gan -绀gan -橄gan -旰gan -矸gan -疳gan -酐gan -干部ganbu -感触ganchu -干脆gancui -敢当gandang -甘当gandang -感到gandao -感动gandong -感恩ganen -刚gang -钢gang -缸gang -纲gang -岗gang -港gang -杠gang -冈gang -肛gang -扛*gang -戆gang -罡gang -筻gang -尴尬ganga -港澳gangao -刚才gangcai -钢材gangcai -刚刚ganggang -刚好ganghao -港口gangkou -纲领gangling -岗哨gangshao -钢铁gangtie -港湾gangwan -岗位gangwei -港务gangwu -刚要gangyao -纲要gangyao -刚毅gangyi -干旱ganhan -感化ganhua -干活ganhuo -肝火ganhuo -感激ganji -干劲ganjin -赶紧ganjin -干净ganjing -感觉ganjue -感慨gankai -甘苦ganku -赶快gankuai -赶忙ganmang -感冒ganmao -感情ganqing -感染ganran -干扰ganrao -干涉ganshe -干事ganshi -感受ganshou -甘肃gansu -感叹gantan -干线ganxian -感想ganxiang -敢想ganxiang -感谢ganxie -甘心ganxin -感性ganxing -感应ganying -敢于ganyu -干预ganyu -甘愿ganyuan -干燥ganzao -感召ganzhao -赣州ganzhou -敢做ganzuo -高gao -搞gao -告gao -稿gao -膏gao -篙gao -皋gao -羔gao -糕gao -镐gao -睾gao -诰gao -郜gao -藁gao -缟gao -槔gao -槁gao -杲gao -锆gao -高矮gaoai -高昂gaoang -告别gaobie -高产gaochan -高超gaochao -高潮gaochao -告成gaocheng -告辞gaoci -高大gaoda -高档gaodang -高等gaodeng -高地gaodi -高低gaodi -糕点gaodian -高度gaodu -告发gaofa -高峰gaofeng -高高gaogao -高歌gaoge -高贵gaogui -高喊gaohan -搞好gaohao -高呼gaohu -搞坏gaohuai -高级gaoji -告急gaoji -高价gaojia -高见gaojian -稿件gaojian -告捷gaojie -告诫gaojie -高龄gaoling -高楼gaolou -告密gaomi -高明gaoming -高能gaoneng -高攀gaopan -高频gaopin -高强gaoqiang -高山gaoshan -高尚gaoshang -高深gaoshen -告示gaoshi -高耸gaosong -高速gaosu -告诉gaosu -高温gaowen -高小gaoxiao -高校gaoxiao -高兴gaoxing -膏药gaoyao -高原gaoyuan -高涨gaozhang -高招gaozhao -高中gaozhong -告终gaozhong -告状gaozhuang -稿子gaozi -港澳同胞gatb -怪不得gbd -各部门gbm -各部委gbw -供不应求gbyq -故步自封gbzf -共产党gcd -共产党员gcdy -工程师gcs -顾此失彼gcsb -贯彻执行gczx -共产主义gczy -各地方gdf -各大军区gdjq -广东省gds -高档商品gdsp -各单位gdw -高等院校gdyx -固定资产gdzc -个ge -各ge -革ge -合*ge -格ge -割ge -歌ge -隔ge -盖*ge -哥ge -铬ge -阁ge -戈ge -葛ge -搁ge -鸽ge -胳ge -疙ge -蛤ge -咯*ge -屹*ge -鬲ge -仡ge -哿ge -圪ge -塥ge -嗝ge -纥*ge -搿ge -膈ge -硌ge -镉ge -袼ge -颌*ge -虼ge -舸ge -骼ge -隔壁gebi -戈壁gebi -个别gebie -歌唱gechang -各处gechu -革除gechu -疙瘩geda -各地gedi -格调gediao -隔断geduan -个个gege -各个gege -各国geguo -隔阂gehe -歌喉gehou -各级geji -各界gejie -格局geju -割据geju -隔绝gejue -各类gelei -隔离geli -割裂gelie -格律gelu -革命geming -隔膜gemo -给gei -根gen -跟gen -亘gen -茛gen -哏gen -艮gen -根本genben -根除genchu -根底gendi -更geng -耕geng -颈geng -庚geng -羹geng -埂geng -耿geng -梗geng -哽geng -赓geng -绠geng -鲠geng -耕地gengdi -更迭gengdie -更动gengdong -更多gengduo -更改genggai -梗概genggai -更高genggao -更换genghuan -更加gengjia -更为gengwei -颈项gengxiang -更新gengxin -哽咽gengyan -耕耘gengyun -更正gengzheng -耿直gengzhi -梗直gengzhi -耕种gengzhong -梗阻gengzu -耕作gengzuo -根基genji -根据genju -跟前genqian -跟随gensui -根源genyuan -根治genzhi -跟着genzhuo -根子genzi -跟踪genzong -搁浅geqian -歌曲gequ -个人geren -格式geshi -歌颂gesong -个体geti -格外gewai -各位gewei -歌舞gewu -阁下gexia -各项gexiang -革新gexin -个性gexing -格言geyan -各样geyang -歌咏geyong -搁置gezhi -各种gezhong -各族gezu -国防部gfb -各方面gfm -格格不入ggbr -归根到底ggdd -恭恭敬敬ggjj -滚瓜烂熟ggls -歌功颂德ggsd -共和国ghg -各行各业ghgy -干劲冲天gjct -各级党委gjdw -各级领导gjld -国家利益gjly -国计民生gjms -工具书gjs -各尽所能gjsn -国库券gkq -工矿企业gkqy -孤陋寡闻glgw -规律性glx -国民党gmd -革命化gmh -革命家gmj -国民经济gmjj -购买力gml -光明磊落gmll -光明日报gmrb -顾名思义gmsy -冠冕堂皇gmth -刮目相看gmxk -光明正大gmzd -工农兵gnb -国内外gnw -工农业gny -工gong -公gong -共gong -供gong -功gong -攻gong -红*gong -巩gong -贡gong -汞gong -宫gong -恭gong -龚gong -躬gong -弓gong -拱gong -珙gong -肱gong -蚣gong -觥gong -公安gongan -公报gongbao -工本gongben -公布gongbu -公差gongcha -公拆gongchai -工厂gongchang -功臣gongchen -工程gongcheng -共处gongchu -供词gongci -共存gongcun -公道gongdao -公德gongde -功德gongde -工地gongdi -公敌gongdi -宫殿gongdian -攻读gongdu -公费gongfei -公愤gongfen -工夫gongfu -功夫gongfu -公告gonggao -公共gonggong -巩固gonggu -公关gongguan -公害gonghai -公函gonghan -共和gonghe -工会gonghui -供给gongji -共计gongji -攻击gongji -功绩gongji -公家gongjia -公斤gongjin -恭敬gongjing -工具gongju -公开gongkai -功课gongke -公款gongkuan -功劳gonglao -公理gongli -公里gongli -公历gongli -公路gonglu -功率gonglu -公民gongmin -共鸣gongming -公墓gongmu -功能gongneng -工农gongnong -公判gongpan -公平gongping -公仆gongpu -供求gongqiu -工区gongqu -公然gongran -工人gongren -公认gongren -供认gongren -工伤gongshang -公社gongshe -公审gongshen -工时gongshi -公事gongshi -共事gongshi -公式gongshi -公署gongshu -公司gongsi -公私gongsi -公诉gongsu -宫廷gongting -共同gongtong -恭维gongwei -公文gongwen -公物gongwu -公务gongwu -恭喜gongxi -贡献gongxian -工效gongxiao -功效gongxiao -供销gongxiao -共性gongxing -工序gongxu -共需gongxu -功勋gongxun -供养gongyang -工业gongye -工艺gongyi -供应gongying -公用gongyong -共有gongyou -公元gongyuan -公园gongyuan -公约gongyue -公允gongyun -公债gongzhai -公章gongzhang -共振gongzhen -工整gongzheng -公正gongzheng -公证gongzheng -供职gongzhi -公众gongzhong -工资gongzi -工作gongzuo -够gou -构gou -沟gou -句*gou -狗gou -钩gou -勾gou -购gou -苟gou -垢gou -佝gou -诟gou -岣gou -遘gou -媾gou -缑gou -枸gou -觏gou -彀gou -笱gou -篝gou -鞲gou -构成goucheng -勾搭gouda -勾当goudang -媾和gouhe -沟壑gouhe -构件goujian -勾结goujie -购买goumai -苟且gouqie -构思gousi -沟通goutong -勾通goutong -构陷gouxian -勾销gouxiao -购销gouxiao -勾引gouyin -构造gouzao -购置gouzhi -钩子gouzi -国庆节gqj -共青团gqt -光荣榜grb -根深蒂固gsdg -瓜熟蒂落gsdl -公使馆gsg -各式各样gsgy -甘肃省gss -工商业gsy -个体户gth -改头换面gthm -高谈阔论gtkl -鼓gu -固gu -古gu -骨gu -故gu -顾gu -股gu -谷gu -估gu -雇gu -孤gu -姑gu -贾*gu -辜gu -菇gu -咕gu -箍gu -沽gu -蛊gu -嘏gu -诂gu -菰gu -呱gu -崮gu -汩gu -梏gu -轱gu -牯gu -牿gu -臌gu -毂gu -瞽gu -罟gu -钴gu -锢gu -鸪gu -鹄*gu -痼gu -蛄gu -酤gu -觚gu -鲴gu -鹘gu -挂gua -刮gua -瓜gua -括*gua -剐gua -寡gua -褂gua -卦gua -诖gua -呱gua -栝gua -胍gua -鸹gua -瓜分guafen -瓜葛guage -挂号guahao -怪guai -乖guai -拐guai -乖舛guaichuan -乖戾guaili -乖僻guaipi -乖巧guaiqiao -怪物guaiwu -怪异guaiyi -拐杖guaizhang -挂名guaming -关guan -管guan -观guan -官guan -灌guan -贯guan -惯guan -冠guan -馆guan -罐guan -棺guan -纶*guan -倌guan -莞guan -掼guan -涫guan -盥guan -鹳guan -矜guan -鳏guan -关闭guanbi -观测guance -观察guancha -贯彻guanche -贯穿guanchuan -管道guandao -官邸guandi -观点guandian -官方guanfang -光guang -广guang -逛guang -咣guang -犷guang -桄guang -胱guang -灌溉guangai -光标guangbiao -广播guangbo -广博guangbo -光彩guangcai -广场guangchang -光大guangda -广大guangda -广东guangdong -广度guangdu -广泛guangfan -广告guanggao -光顾guanggu -光滑guanghua -光辉guanghui -光景guangjing -广阔guangkuo -光芒guangmang -广袤guangmao -光明guangming -光盘guangpan -光谱guangpu -光荣guangrong -观光guanguang -广西guangxi -光线guangxian -广义guangyi -光阴guangyin -光涌guangyong -广州guangzhou -关怀guanhuai -挂念guanian -管家guanjia -关键guanjian -管教guanjiao -关节guanjie -冠军guanjun -关卡guanka -观看guankan -关口guankou -管理guanli -贯例guanli -惯例guanli -官吏guanli -关联guanlian -官僚guanliao -观摩guanmo -灌木guanmu -官能guanneng -观念guannian -关切guanqie -观赏guanshang -管事guanshi -管束guanshu -灌输guanshu -关税guanshui -官司guansi -贯通guantong -关头guantou -观望guanwang -关系guanxi -管辖guanxia -官衔guanxian -关心guanxin -惯性guanxing -关押guanya -惯用guanyong -关于guanyu -官员guanyuan -观战guanzhan -关照guanzhao -管制guanzhi -观止guanzhi -观众guanzhong -关注guanzhu -贯注guanzhu -馆子guanzi -挂失guashi -挂帅guashuai -鼓吹guchui -故此guci -古代gudai -孤单gudan -故地gudi -古典gudian -固定guding -鼓动gudong -股东gudong -古董gudong -孤独gudu -咕嘟gudu -孤儿guer -股份gufen -辜负gufu -骨干gugan -雇工gugong -故宫gugong -古怪guguai -蛊惑guhuo -规gui -贵gui -归gui -硅gui -鬼gui -轨gui -龟gui -桂gui -瑰gui -圭gui -闺gui -诡gui -癸gui -柜gui -跪gui -刽gui -傀*gui -炔*gui -匦gui -刿gui -庋gui -宄gui -妫gui -桧gui -炅gui -晷gui -皈gui -簋gui -鲑gui -鳜gui -诡辩guibian -贵宾guibin -归并guibing -规程guicheng -归档guidang -轨道guidao -规定guiding -归队guidui -规范guifan -规格guige -归公guigong -归功guigong -桂冠guiguan -归国guiguo -规划guihua -鬼话guihua -归还guihuan -诡计guiji -轨迹guiji -贵贱guijian -归咎guijiu -规矩guiju -瑰丽guili -鬼脸guilian -龟裂guilie -规律guilu -诡秘guimi -规模guimo -归纳guina -闺女guinu -规劝guiquan -贵人guiren -归属guishu -龟缩guisuo -柜台guitai -闺秀guixiu -归于guiyu -规则guize -规章guizhang -贵重guizhong -贵州guizhou -鬼子guizi -贵族guizu -归罪guizui -顾及guji -估计guji -古迹guji -顾忌guji -估价gujia -古今gujin -古旧gujiu -故旧gujiu -故居guju -顾客guke -孤苦guku -古老gulao -孤立guli -鼓励guli -估量guliang -顾虑gulu -估摸gumo -滚gun -辊gun -棍gun -衮gun -绲gun -磙gun -鲧gun -滚动gundong -姑娘guniang -雇农gunong -滚烫guntang -棍子gunzi -国guo -过guo -果guo -锅guo -郭guo -涡*guo -裹guo -馘guo -埚guo -掴guo -呙guo -帼guo -崞guo -猓guo -椁guo -虢guo -聒guo -蜾guo -蝈guo -过半guoban -国策guoce -国产guochan -过程guocheng -过错guocuo -过度guodu -过渡guodu -果断guoduan -国法guofa -国防guofang -过分guofen -果腹guofu -果敢guogan -国歌guoge -过关guoguan -过后guohou -国会guohui -国际guoji -国籍guoji -国家guojia -国界guojie -国境guojing -国库guoku -过来guolai -过量guoliang -过虑guolu -锅炉guolu -国民guomin -过目guomu -果木guomu -国难guonan -国内guonei -果皮guopi -果品guopin -国旗guoqi -过期guoqi -国情guoqing -国庆guoqing -过去guoqu -果然guoran -过少guoshao -过甚guoshen -过剩guosheng -过时guoshi -国事guoshi -过失guoshi -果实guoshi -过头guotou -国外guowai -国王guowang -过问guowen -国务guowu -过细guoxi -国药guoyao -国营guoying -过硬guoying -过于guoyu -果园guoyuan -果真guozhen -锅子guozi -顾盼gupan -孤僻gupi -股票gupiao -骨气guqi -姑且guqie -顾全guquan -固然guran -古人guren -骨肉gurou -故事gushi -股市gushi -固守gushou -估算gusuan -固体guti -骨头gutou -故土gutu -顾问guwen -古文guwen -谷物guwu -鼓舞guwu -姑息guxi -故乡guxiang -故意guyi -雇佣guyong -固有guyou -雇员guyuan -鼓掌guzhang -故障guzhang -固执guzhi -拐弯抹角gwmj -国务委员gwwy -国务院gwy -改邪归正gxgz -更新换代gxhd -各行其事gxqs -感性认识gxrs -广西壮族gxzz -工业化gyh -工艺流程gylc -工艺美术gyms -工业品gyp -工艺品gyp -贵阳市gys -公有制gyz -各种各样gzgy -工资级别gzjb -各族人民gzrm -工作上gzs -广州市gzs -贵州省gzs -各自为政gzwz -高瞻远瞩gzyz -高瞻远嘱gzyz -工作者gzz -和h -会h -后h -化h -好h -合h -还h -活h -很h -回h -号h -毫h -花h -或h -海h -话h -红h -火h -黄h -害h -哈ha -蛤*ha -虾*ha -铪ha -哈达hada -还hai -海hai -害hai -孩hai -骸hai -氦hai -亥hai -骇hai -嘿*hai -咳*hai -嗨hai -胲hai -醢hai -海岸haian -海拔haiba -海报haibao -害虫haichong -害处haichu -海岛haidao -海港haigang -海关haiguan -还好haihao -海疆haijiang -海军haijun -海浪hailang -海绵haimian -害怕haipa -海上haishang -还是haishi -海外haiwai -海湾haiwan -海峡haixia -海啸haixiao -害羞haixiu -海洋haiyang -还要haiyao -还有haiyou -海域haiyu -海员haiyuan -孩子haizi -含han -焊han -旱han -喊han -汉han -寒han -汗han -函han -韩han -酣han -憨han -邯han -涵han -罕han -翰han -撼han -捍han -憾han -悍han -邗han -菡han -撖han -阚han -瀚han -晗han -焓han -顸han -颔han -蚶han -鼾han -寒潮hanchao -寒带handai -行*hang -航hang -夯hang -杭hang -吭*hang -巷*hang -沆hang -绗hang -珩hang -颃hang -航标hangbiao -航程hangcheng -航船hangchuan -行当hangdang -航道hangdao -航海hanghai -行家hangjia -行距hangju -航空hangkong -行列hanglie -航路hanglu -航模hangmo -函购hangou -行情hangqing -航天hangtian -航线hangxian -航向hangxiang -航行hangxing -航运hangyun -杭州hangzhou -含糊hanhu -含混hanhun -旱季hanji -函件hanjian -罕见hanjian -汉奸hanjian -喊叫hanjiao -焊接hanjie -寒冷hanleng -翰林hanlin -寒流hanliu -函授hanshou -函数hanshu -酣睡hanshui -寒酸hansuan -捍卫hanwei -含蓄hanxu -寒暄hanxuan -涵养hanyang -含义hanyi -涵义hanyi -汉语hanyu -含冤hanyuan -旱灾hanzai -汉字hanzi -汉族hanzu -好hao -号hao -毫hao -耗hao -豪hao -郝hao -浩hao -镐*hao -壕hao -嚎hao -貉*hao -蒿hao -薅hao -嗥hao -嚆hao -濠hao -灏hao -昊hao -皓hao -颢hao -蚝hao -好比haobi -毫不haobu -号称haocheng -好处haochu -浩大haoda -好歹haodai -浩荡haodang -好的haode -浩繁haofan -耗费haofei -好感haogan -好汉haohan -豪华haohua -好坏haohuai -号角haojiao -耗竭haojie -豪杰haojie -浩劫haojie -好看haokan -毫厘haoli -号令haoling -号码haoma -豪迈haomai -毫毛haomao -毫米haomi -浩淼haomiao -好奇haoqi -豪强haoqiang -豪情haoqing -好人haoren -豪绅haoshen -毫升haosheng -好事haoshi -豪爽haoshuang -好似haosi -耗损haosun -号啕haotao -好听haoting -好玩haowan -毫无haowu -好象haoxiang -好些haoxie -好样haoyang -好意haoyi -号召haozhao -好转haozhuan -汇编程序hbcx -货币回笼hbhl -货币流通hblt -河北省hbs -湖北省hbs -汇编语言hbyy -或多或少hdhs -海淀区hdq -和he -合he -河he -何he -核he -赫he -荷he -褐he -喝he -贺he -呵he -禾he -吓*he -盒he -菏he -貉he -阂he -涸he -鹤he -诃he -劾he -壑he -嗬he -阖he -纥he -曷he -盍he -颌he -蚵he -翮he -和蔼heai -哈尔滨heb -合办heban -荷包hebao -河北hebei -何必hebi -合并hebing -哈尔滨市hebs -何不hebu -喝彩hecai -合唱hechang -何尝hechang -合成hecheng -呵斥hechi -何处hechu -河川hechuan -河床hechuang -贺词heci -何等hedeng -贺电hedian -核定heding -核对hedui -合法hefa -何妨hefang -合肥hefei -合格hege -和好hehao -赫赫hehe -合乎hehu -合伙hehuo -黑hei -嘿hei -黑暗heian -黑白heibai -黑帮heibang -嘿嘿heihei -黑人heiren -黑色heise -黑市heishi -黑夜heiye -合计heji -核计heji -和解hejie -合金hejin -何苦heku -何况hekuang -合理heli -合力heli -合流heliu -河流heliu -合谋hemou -和睦hemu -很hen -狠hen -痕hen -恨hen -河南henan -狠毒hendu -很多henduo -河内henei -行*heng -横heng -衡heng -恒heng -哼heng -亨heng -蘅heng -珩*heng -桁heng -横财hengcai -哼哧hengchi -横幅hengfu -横亘henggen -横贯hengguan -横祸henghuo -横加hengjia -衡量hengliang -横蛮hengman -横批hengpi -衡器hengqi -横扫hengsao -横竖hengshu -恒心hengxin -横行hengxing -恒星hengxing -很好henhao -贺年henian -痕迹henji -很快henkuai -狠心henxin -狠抓henzhua -和平heping -和气heqi -河渠hequ -赫然heran -河山heshan -和尚heshang -合适heshi -核实heshi -合算hesuan -核算hesuan -河滩hetan -合同hetong -贺喜hexi -和谐hexie -核心hexin -贺信hexin -和煦hexu -何以heyi -合影heying -合营heying -核准hezhun -合资hezi -赫兹hezi -合作hezuo -合法权益hfqy -合肥市hfs -宏观世界hgsj -化公为私hgws -好高务远hgwy -核工业部hgyb -海关总署hgzs -后顾之忧hgzy -呼和浩特hhht -轰轰烈烈hhll -换句话说hjhs -黄金时代hjsd -环境卫生hjws -后继有人hjyr -海枯石烂hksl -合理化hlh -糊里糊涂hlht -黑龙江hlj -汗流浃背hljb -汗马功劳hmgl -海南岛hnd -河南省hns -湖南省hns -红hong -洪hong -轰hong -烘hong -哄hong -虹hong -鸿hong -宏hong -弘hong -黉hong -訇hong -讧hong -荭hong -蕻hong -薨hong -闳hong -泓hong -红尘hongchen -轰动hongdong -洪都hongdu -洪峰hongfeng -鸿沟honggou -宏观hongguan -红光hongguang -红花honghua -红军hongjun -红利hongli -洪亮hongliang -轰隆honglong -弘论honglun -鸿毛hongmao -轰鸣hongming -哄骗hongpian -红旗hongqi -红人hongren -红色hongse -洪水hongshui -哄抬hongtai -宏图hongtu -宏伟hongwei -红星hongxing -弘扬hongyang -鸿运hongyun -红晕hongyun -轰炸hongzha -后hou -候hou -厚hou -侯hou -喉hou -猴hou -吼hou -堠hou -後hou -逅hou -瘊hou -篌hou -糇hou -鲎hou -骺hou -后备houbei -后辈houbei -后边houbian -厚薄houbo -候补houbu -后尘houchen -后代houdai -厚道houdao -厚度houdu -后盾houdun -后方houfang -后果houguo -后患houhuan -后悔houhui -后记houji -后进houjin -后劲houjin -后来houlai -喉咙houlong -后门houmen -后面houmian -后期houqi -后勤houqin -后人houren -喉舌houshe -厚实houshi -后嗣housi -后台houtai -后天houtian -后退houtui -后续houxu -候选houxuan -后裔houyi -后缀houzhui -和平共处hpgc -黄埔江hpj -后勤部hqb -何去何从hqhc -合情合理hqhl -好容易hry -好事多磨hsdm -胡思乱想hslx -航天工业部htgb -昏头昏脑hthn -欢天喜地htxd -和*hu -护hu -互hu -湖hu -呼hu -户hu -弧hu -乎hu -胡hu -糊hu -虎hu -忽hu -核*hu -瑚hu -戏*hu -壶hu -葫hu -蝴hu -狐hu -唬hu -沪hu -冱hu -唿hu -囫hu -岵hu -猢hu -怙hu -惚hu -浒hu -滹hu -琥hu -槲hu -轷hu -觳hu -烀hu -煳hu -戽hu -扈hu -祜hu -瓠hu -鹄hu -鹕hu -鹱hu -笏hu -醐hu -斛hu -化hua -花hua -话hua -划hua -滑hua -华hua -画hua -哗hua -猾hua -豁*hua -骅hua -桦hua -砉hua -铧hua -画报huabao -华北huabei -哗变huabian -话柄huabing -划拨huabo -划策huace -画册huace -华东huadong -花朵huaduo -花儿huaer -化肥huafei -花费huafei -划分huafen -化工huagong -华贵huagui -化合huahe -花卉huahui -坏huai -怀huai -划*huai -淮huai -槐huai -徊huai -踝huai -怀抱huaibao -淮北huaibei -坏处huaichu -怀古huaigu -淮海huaihai -怀恨huaihen -怀旧huaijiu -淮南huainan -怀念huainian -坏人huairen -坏事huaishi -怀疑huaiyi -怀着huaizhe -滑稽huaji -画家huajia -话剧huaju -哗啦huala -画廊hualang -华丽huali -画面huamian -化名huaming -还*huan -环huan -换huan -欢huan -缓huan -患huan -幻huan -焕huan -桓huan -唤huan -痪huan -豢huan -涣huan -宦huan -郇huan -奂huan -萑huan -擐huan -圜huan -獾huan -洹huan -浣huan -漶huan -寰huan -逭huan -缳huan -锾huan -鲩huan -鬟huan -华南huanan -欢畅huanchang -缓冲huanchong -幻灯huandeng -欢度huandu -焕发huanfa -黄huang -簧huang -荒huang -皇huang -慌huang -蝗huang -磺huang -凰huang -惶huang -煌huang -晃huang -幌huang -恍huang -谎huang -隍huang -徨huang -湟huang -潢huang -遑huang -璜huang -肓huang -癀huang -蟥huang -篁huang -鳇huang -磺胺huangan -皇朝huangchao -荒诞huangdan -晃荡huangdang -皇帝huangdi -荒废huangfei -黄海huanghai -黄河huanghe -恍惚huanghu -谎话huanghua -黄昏huanghun -黄金huangjin -皇历huangli -荒凉huangliang -荒乱huangluan -慌乱huangluan -慌忙huangmang -荒谬huangmiu -恍然huangran -黄色huangse -黄山huangshan -皇上huangshang -荒唐huangtang -环顾huangu -宦官huanguan -谎言huangyan -慌张huangzhang -幌子huangzi -缓和huanhe -欢呼huanhu -环环huanhuan -滑腻huani -花鸟huaniao -还给huanji -缓急huanji -还价huanjia -环节huanjie -环境huanjing -幻境huanjing -幻景huanjing -欢聚huanju -幻觉huanjue -欢乐huanle -缓慢huanman -患难huannan -唤起huanqi -缓期huanqi -欢庆huanqing -环球huanqiu -寰球huanqiu -换取huanqu -环绕huanrao -涣散huansan -欢声huansheng -环视huanshi -欢送huansong -换算huansuan -欢腾huanteng -欢喜huanxi -幻想huanxiang -欢笑huanxiao -欢心huanxin -欢欣huanxin -环行huanxing -缓刑huanxing -唤醒huanxing -幻影huanying -欢迎huanying -寰宇huanyu -还原huanyuan -患者huanzhe -滑坡huapo -花腔huaqiang -华侨huaqiao -划清huaqing -花圈huaquan -划拳huaquan -哗然huaran -华人huaren -花色huase -化身huashen -化石huashi -划算huasuan -话题huati -滑头huatou -花纹huawen -华夏huaxia -化纤huaxian -画像huaxiang -花絮huaxu -化学huaxue -画押huaya -化验huayan -花样huayang -华裔huayi -话音huayin -话语huayu -花园huayuan -画展huazhan -花招huazhao -华中huazhong -化装huazhuang -化妆huazhuang -湖北hubei -胡扯huche -弧度hudu -忽而huer -呼喊huhan -呼号huhao -呼唤huhuan -互惠huhui -会hui -回hui -灰hui -挥hui -辉hui -汇hui -毁hui -慧hui -恢hui -绘hui -惠hui -徽hui -溃*hui -堕*hui -徊*hui -蛔hui -悔hui -卉hui -晦hui -贿hui -秽hui -烩hui -讳hui -诲hui -诙hui -茴hui -荟hui -蕙hui -咴hui -哕hui -喙hui -隳hui -洄hui -浍hui -彗hui -缋hui -珲hui -桧*hui -晖hui -恚hui -虺hui -蟪hui -麾hui -灰暗huian -回报huibao -汇报huibao -回避huibi -汇编huibian -会场huichang -回潮huichao -灰尘huichen -回春huichun -荟萃huicui -回答huida -回荡huidang -回电huidian -汇兑huidui -挥发huifa -汇费huifei -会风huifeng -回复huifu -恢复huifu -悔改huigai -回顾huigu -惠顾huigu -悔过huiguo -会合huihe -回合huihe -汇合huihe -悔恨huihen -恢弘huihong -会话huihua -回话huihua -绘画huihua -毁坏huihuai -辉煌huihuang -挥霍huihuo -会集huiji -回击huiji -汇集huiji -回家huijia -会见huijian -会聚huiju -汇聚huiju -回扣huikou -汇款huikuan -回来huilai -回笼huilong -汇率huilu -贿赂huilu -会面huimian -毁灭huimie -回民huimin -汇票huipiao -回去huiqu -挥洒huisa -灰色huise -晦涩huise -回收huishou -回首huishou -会谈huitan -会堂huitang -会同huitong -回头huitou -回味huiwei -会晤huiwu -挥舞huiwu -悔悟huiwu -麾下huixia -回想huixiang -回响huixiang -诙谐huixie -灰心huixin -彗星huixing -会演huiyan -汇演huiyan -会议huiyi -回忆huiyi -回音huiyin -辉映huiying -会员huiyuan -会战huizhan -徽章huizhang -会诊huizhen -绘制huizhi -回转huizhuan -汇总huizong -回族huizu -户籍huji -呼叫hujiao -户口hukou -虎口hukou -护理huli -互利huli -护林hulin -呼噜hulu -胡乱huluan -忽略hulue -互勉humian -混hun -浑hun -荤hun -昏hun -婚hun -魂hun -诨hun -馄hun -阍hun -溷hun -湖南hunan -胡闹hunao -昏沉hunchen -混合hunhe -浑厚hunhou -昏黄hunhuang -混迹hunji -婚礼hunli -混乱hunluan -糊弄hunong -婚配hunpei -混入hunru -浑身hunshen -混同huntong -混淆hunxiao -婚姻hunyin -昏庸hunyong -混杂hunza -混帐hunzhang -混浊hunzhuo -浑浊hunzhuo -和*huo -活huo -或huo -火huo -货huo -获huo -伙huo -霍huo -豁huo -惑huo -祸huo -劐huo -藿huo -攉huo -嚯huo -夥huo -钬huo -锪huo -镬huo -耠huo -蠖huo -火把huoba -伙伴huoban -火暴huobao -货币huobi -火柴huochai -火车huoche -豁达huoda -获得huode -霍地huodi -活动huodong -伙房huofang -祸根huogen -祸害huohai -火候huohou -火化huohua -火花huohua -祸患huohuan -活活huohuo -伙计huoji -火箭huojian -火警huojing -火炬huoju -火坑huokeng -活力huoli -霍乱huoluan -活泼huopo -获取huoqu -豁然huoran -货色huose -火山huoshan -获胜huosheng -或是huoshi -伙食huoshi -祸首huoshou -伙同huotong -货物huowu -获悉huoxi -火线huoxian -活现huoxian -或许huoxu -火药huoyao -活页huoye -活跃huoyue -货运huoyun -火灾huozai -火葬huozang -或则huoze -或者huozhe -获准huozhun -湖泊hupo -忽然huran -呼声husheng -护士hushi -忽视hushi -湖水hushui -胡说hushuo -护送husong -胡同hutong -互通hutong -户头hutou -糊涂hutu -护卫huwei -呼吸huxi -互相huxiang -呼啸huxiao -虎穴huxue -护养huyang -呼应huying -呼吁huyu -护照huzhao -互助huzhu -毫无疑问hwyw -互相爱护hxah -横行霸道hxbd -互相帮助hxbz -欢欣鼓舞hxgw -候选人hxr -合作化hzh -杭州市hzs -化整为零hzwl -级j -就j -进j -加j -经j -家j -结j -阶j -间j -件j -及j -解j -较j -机j -军j -接j -教j -极j -九j -见j -基本国策jbgc -基本上jbs -据不完全统计jbwj -饥不择食jbzs -坚持不懈jcbx -集成电路jcdl -基础上jcs -绝大部分jdbf -坚定不移jdby -绝大多数jdds -鉴定会jdh -绝对化jdh -经得起jdq -见多识广jdsg -精打细算jdxs -接二连三jels -解放后jfh -解放军jfj -解放军报jfjb -解放前jfq -仅供参考jgck -机构改革jggg -坚固耐用jgny -襟怀坦白jhtb -计划性jhx -级ji -及ji -机ji -极ji -几ji -积ji -给ji -基ji -其*ji -记ji -己ji -期*ji -系*ji -革*ji -计ji -集ji -即ji -际ji -季ji -激ji -济ji -技ji -击ji -继ji -急ji -剂ji -既ji -纪ji -寄ji -挤ji -鸡ji -迹ji -绩ji -齐*ji -奇*ji -吉ji -脊ji -辑ji -籍ji -疾ji -肌ji -棘ji -畸ji -圾ji -稽ji -箕ji -饥ji -讥ji -姬ji -缉ji -汲ji -嫉ji -蓟ji -冀ji -伎ji -祭ji -悸ji -寂ji -忌ji -妓ji -藉ji -丌ji -亟ji -乩ji -剞ji -佶ji -偈ji -诘ji -墼ji -芨ji -芰ji -荠ji -蒺ji -蕺ji -掎ji -叽ji -咭ji -哜ji -唧ji -岌ji -嵴ji -洎ji -屐ji -骥ji -畿ji -玑ji -楫ji -殛ji -戟ji -戢ji -赍ji -觊ji -犄ji -齑ji -矶ji -羁ji -嵇ji -稷ji -瘠ji -虮ji -笈ji -笄ji -暨ji -跻ji -跽ji -霁ji -鲚ji -鲫ji -髻ji -麂ji -加jia -家jia -架jia -价jia -甲jia -夹jia -假jia -钾jia -贾jia -稼jia -驾jia -嘉jia -枷jia -佳jia -荚jia -颊jia -嫁jia -茄*jia -挟*jia -嘏*jia -伽jia -郏jia -葭jia -岬jia -浃jia -迦jia -珈jia -戛jia -胛jia -恝jia -铗jia -镓jia -痂jia -瘕jia -袷jia -蛱jia -笳jia -袈jia -跏jia -加班jiaban -甲板jiaban -加倍jiabei -甲虫jiachong -家畜jiachu -家当jiadang -家底jiadi -假定jiading -加法jiafa -家访jiafang -价格jiage -加工jiagong -佳话jiahua -家伙jiahuo -加急jiaji -嘉奖jiajiang -家教jiajiao -嫁接jiajie -佳节jiajie -假借jiajie -加紧jiajin -家境jiajing -家具jiaju -加剧jiaju -加快jiakuai -加仑jialun -加码jiama -假冒jiamao -家门jiamen -加密jiami -加冕jiamian -价目jiamu -间jian -件jian -见jian -建jian -坚jian -减jian -检jian -践jian -尖jian -简jian -碱jian -剪jian -艰jian -渐jian -肩jian -键jian -健jian -柬jian -鉴jian -剑jian -歼jian -监jian -兼jian -浅*jian -奸jian -箭jian -茧jian -舰jian -俭jian -笺jian -煎jian -缄jian -硷jian -拣jian -捡jian -荐jian -槛jian -贱jian -饯jian -溅jian -涧jian -僭jian -谏jian -谫jian -菅jian -蒹jian -搛jian -囝*jian -湔jian -蹇jian -謇jian -缣jian -枧jian -楗jian -戋jian -戬jian -牮jian -犍jian -毽jian -腱jian -睑jian -锏jian -鹣jian -裥jian -笕jian -翦jian -趼jian -踺jian -鲣jian -鞯jian -吉安jian -煎熬jianao -简报jianbao -渐变jianbian -简便jianbian -简编jianbian -鉴别jianbie -兼并jianbing -尖兵jianbing -剪裁jiancai -剪彩jiancai -检测jiance -检查jiancha -检察jiancha -监察jiancha -减产jianchan -建成jiancheng -简称jiancheng -坚持jianchi -简单jiandan -建党jiandang -减低jiandi -检点jiandian -间谍jiandie -坚定jianding -鉴定jianding -监督jiandu -间断jianduan -尖端jianduan -简短jianduan -舰队jiandui -健儿jianer -减法jianfa -肩负jianfu -将jiang -降jiang -讲jiang -强*jiang -江jiang -浆jiang -蒋jiang -奖jiang -疆jiang -僵jiang -姜jiang -桨jiang -匠jiang -酱jiang -茳jiang -洚jiang -绛jiang -缰jiang -犟jiang -礓jiang -耩jiang -糨jiang -豇jiang -奖杯jiangbei -疆场jiangchang -奖惩jiangcheng -僵持jiangchi -降低jiangdi -间隔jiange -讲稿jianggao -江湖jianghu -僵化jianghua -讲话jianghua -降级jiangji -降价jiangjia -讲解jiangjie -疆界jiangjie -将近jiangjin -奖金jiangjin -讲究jiangjiu -僵局jiangju -将军jiangjun -讲课jiangke -将来jianglai -讲理jiangli -奖励jiangli -降临jianglin -将领jiangling -降落jiangluo -江南jiangnan -奖品jiangpin -讲评jiangping -奖券jiangquan -江山jiangshan -讲师jiangshi -僵尸jiangshi -讲授jiangshou -讲述jiangshu -降水jiangshui -江苏jiangsu -讲台jiangtai -讲坛jiangtan -疆土jiangtu -坚固jiangu -兼顾jiangu -监管jianguan -建国jianguo -降温jiangwen -江西jiangxi -讲习jiangxi -匠心jiangxin -讲学jiangxue -讲演jiangyan -将要jiangyao -讲义jiangyi -僵硬jiangying -奖章jiangzhang -讲座jiangzuo -监护jianhu -简化jianhua -间或jianhuo -奸计jianji -歼击jianji -剪辑jianji -减价jianjia -渐渐jianjian -健将jianjiang -建交jianjiao -间接jianjie -见解jianjie -简介jianjie -简洁jianjie -简捷jianjie -渐进jianjin -监禁jianjin -检举jianju -艰巨jianju -坚决jianjue -健康jiankang -尖刻jianke -坚苦jianku -艰苦jianku -监牢jianlao -建立jianli -尖利jianli -简历jianli -简练jianlian -简陋jianlou -简略jianlue -健美jianmei -减免jianmian -歼灭jianmie -简明jianming -缄默jianmo -艰难jiannan -键盘jianpan -简拼jianpin -简朴jianpu -俭朴jianpu -坚强jianqiang -减轻jianqing -健全jianquan -兼任jianren -坚韧jianren -兼容jianrong -尖锐jianrui -减弱jianruo -艰涩jianse -鉴赏jianshang -减少jianshao -建设jianshe -艰深jianshen -见识jianshi -坚实jianshi -监视jianshi -建树jianshu -减速jiansu -检索jiansuo -践踏jianta -健谈jiantan -检讨jiantao -简体jianti -舰艇jianting -减退jiantui -健忘jianwang -间文jianwen -见闻jianwen -间隙jianxi -奸细jianxi -艰险jianxian -见效jianxiao -间歇jianxie -简写jianxie -坚信jianxin -艰辛jianxin -减刑jianxing -检修jianxiu -简讯jianxun -检验jianyan -简要jianyao -建议jianyi -坚毅jianyi -简易jianyi -奸淫jianyin -坚硬jianying -剪影jianying -鉴于jianyu -监狱jianyu -减员jianyuan -检阅jianyue -建造jianzao -简则jianze -坚贞jianzhen -监制jianzhi -简直jianzhi -兼职jianzhi -建筑jianzhu -简装jianzhuang -健壮jianzhuang -较jiao -教jiao -交jiao -角jiao -叫jiao -脚jiao -胶jiao -浇jiao -焦jiao -觉*jiao -校*jiao -搅jiao -酵jiao -郊jiao -铰jiao -窖jiao -椒jiao -礁jiao -骄jiao -娇jiao -嚼jiao -矫jiao -侥jiao -狡jiao -饺jiao -缴jiao -绞jiao -剿jiao -轿jiao -佼jiao -僬jiao -艽jiao -茭jiao -挢jiao -噍jiao -峤jiao -徼jiao -湫*jiao -姣jiao -敫jiao -皎jiao -鹪jiao -蛟jiao -醮jiao -跤jiao -鲛jiao -骄傲jiaoao -搅拌jiaoban -狡辩jiaobian -教材jiaocai -交叉jiaocha -教程jiaocheng -交错jiaocuo -较大jiaoda -交代jiaodai -交淡jiaodan -教导jiaodao -交点jiaodian -焦点jiaodian -校订jiaoding -角度jiaodu -校对jiaodui -较多jiaoduo -焦耳jiaoer -交锋jiaofeng -交付jiaofu -浇灌jiaoguan -娇贵jiaogui -叫喊jiaohan -较好jiaohao -叫好jiaohao -狡猾jiaohua -交换jiaohuan -叫唤jiaohuan -教诲jiaohui -缴获jiaohuo -交际jiaoji -矫健jiaojian -交接jiaojie -交界jiaojie -叫苦jiaoku -较快jiaokuai -教练jiaolian -较量jiaoliang -交流jiaoliu -搅乱jiaoluan -角落jiaoluo -叫骂jiaoma -剿灭jiaomie -酵母jiaomu -交纳jiaona -缴纳jiaona -娇嫩jiaonen -交配jiaopei -骄气jiaoqi -交情jiaoqing -郊区jiaoqu -叫嚷jiaorang -角色jiaose -交涉jiaoshe -教师jiaoshi -教授jiaoshou -教唆jiaosuo -脚踏jiaota -交谈jiaotan -教堂jiaotang -交替jiaoti -教条jiaotiao -交通jiaotong -郊外jiaowai -交往jiaowang -较为jiaowei -狡黠jiaoxia -叫嚣jiaoxiao -侥幸jiaoxing -绞刑jiaoxing -教学jiaoxue -教训jiaoxun -教养jiaoyang -骄阳jiaoyang -教益jiaoyi -交易jiaoyi -交谊jiaoyi -教育jiaoyu -教员jiaoyuan -狡诈jiaozha -校正jiaozheng -脚注jiaozhu -角逐jiaozhu -浇铸jiaozhu -校准jiaozhun -焦灼jiaozhuo -娇纵jiaozong -叫做jiaozuo -家谱jiapu -假期jiaqi -价钱jiaqian -加强jiaqiang -假日jiari -加入jiaru -假如jiaru -假若jiaruo -加上jiashang -假设jiashe -加深jiashen -假使jiashi -架势jiashi -驾驶jiashi -家属jiashu -假说jiashuo -加速jiasu -枷锁jiasuo -家庭jiating -家乡jiaxiang -假想jiaxiang -家业jiaye -加以jiayi -佳音jiayin -家用jiayong -加油jiayou -家园jiayuan -夹杂jiaza -加载jiazai -家长jiazhang -价值jiazhi -加重jiazhong -假装jiazhuang -嫁妆jiazhuang -架子jiazi -家族jiazu -击败jibai -羁绊jiban -几倍jibei -基本jiben -击毙jibi -级别jibie -疾病jibing -计策jice -基层jiceng -稽查jicha -机场jichang -集成jicheng -继承jicheng -计酬jichou -基础jichu -机床jichuang -几次jici -急促jicu -积存jicun -寄存jicun -极大jida -亟待jidai -激荡jidang -记得jide -基地jidi -机电jidian -极点jidian -基调jidiao -机动jidong -激动jidong -极度jidu -几度jidu -即度jidu -季度jidu -基督jidu -嫉妒jidu -忌妒jidu -极端jiduan -结jie -阶jie -解jie -接jie -节jie -家*jie -界jie -截jie -介jie -借jie -价*jie -届jie -街jie -揭jie -洁jie -杰jie -竭jie -皆jie -秸jie -劫jie -桔jie -捷jie -睫jie -姐jie -戒jie -藉jie -芥jie -疥jie -诫jie -楷*jie -偈*jie -讦jie -诘*jie -拮jie -喈jie -嗟jie -婕jie -孑jie -桀jie -碣jie -疖jie -颉jie -蚧jie -羯jie -鲒jie -骱jie -饥饿jie -结案jiean -洁白jiebai -接班jieban -捷报jiebao -戒备jiebei -结彩jiecai -节操jiecao -阶层jieceng -劫持jiechi -杰出jiechu -解除jiechu -接触jiechu -戒除jiechu -揭穿jiechuan -结存jiecun -解答jieda -接待jiedai -借贷jiedai -街道jiedao -解冻jiedong -阶段jieduan -截断jieduan -揭发jiefa -借方jiefang -解放jiefang -街坊jiefang -结构jiegou -解雇jiegu -借故jiegu -结果jieguo -结合jiehe -结核jiehe -结婚jiehun -阶级jieji -接见jiejian -节俭jiejian -借鉴jiejian -结交jiejiao -姐姐jiejie -接近jiejin -竭尽jiejin -结晶jiejing -捷径jiejing -洁净jiejing -解救jiejiu -结局jieju -解决jiejue -孑孓jiejue -解开jiekai -揭开jiekai -解渴jieke -接口jiekou -借口jiekou -借款jiekuan -竭力jieli -接连jielian -揭露jielu -戒律jielu -结论jielun -解闷jiemen -结盟jiemeng -界面jiemian -节目jiemu -揭幕jiemu -接纳jiena -解聘jiepin -解剖jiepou -节气jieqi -接洽jieqia -截取jiequ -既而jier -节日jieri -介入jieru -解散jiesan -介绍jieshao -节省jiesheng -届时jieshi -结实jieshi -解释jieshi -揭示jieshi -解手jieshou -接受jieshou -接收jieshou -结束jieshu -解说jieshuo -结算jiesuan -解体jieti -阶梯jieti -接替jieti -接头jietou -街头jietou -解脱jietuo -结尾jiewei -解围jiewei -接吻jiewen -解析jiexi -界线jiexian -界限jiexian -揭晓jiexiao -戒严jieyan -结业jieye -介意jieyi -接应jieying -结余jieyu -节约jieyue -结帐jiezhang -接着jiezhao -节制jiezhi -介质jiezhi -戒指jiezhi -借支jiezhi -截止jiezhi -借助jiezhu -节奏jiezou -杰作jiezuo -激发jifa -技法jifa -讥讽jifeng -几个jige -及格jige -技工jigong -记功jigong -机构jigou -叽咕jigu -机关jiguan -籍贯jiguan -极光jiguang -激光jiguang -记过jiguo -极好jihao -记号jihao -集合jihe -几何jihe -稽核jihe -几乎jihu -激化jihua -计划jihua -饥荒jihuang -机会jihui -集会jihui -击毁jihui -忌讳jihui -积极jiji -机件jijian -计件jijian -急件jijian -击剑jijian -即将jijiang -计较jijiao -季节jijie -急进jijin -基金jijin -机警jijing -即景jijing -寂静jijing -急救jijiu -积聚jiju -急剧jiju -急遽jiju -寄居jiju -季刊jikan -即刻jike -疾苦jiku -击溃jikui -积累jilei -极力jili -吉利jili -激励jili -伎俩jilia -计量jiliang -寂寥jiliao -激烈jilie -吉林jilin -机灵jiling -激流jiliu -记录jilu -纪律jilu -纪录jilu -辑录jilu -击落jiluo -急忙jimang -机密jimi -寂寞jimo -计谋jimou -进jin -金jin -近jin -紧jin -斤jin -今jin -尽jin -仅jin -劲jin -浸jin -禁jin -津jin -筋jin -锦jin -晋jin -巾jin -襟jin -谨jin -靳jin -烬jin -卺jin -荩jin -堇jin -噤jin -馑jin -廑jin -妗jin -缙jin -瑾jin -槿jin -赆jin -觐jin -衿jin -缉拿jina -济南jinan -禁闭jinbi -锦标jinbiao -进步jinbu -浸沉jinchen -进程jincheng -进出jinchu -紧凑jincou -近代jindai -劲敌jindi -进度jindu -金额jine -机能jineng -技能jineng -进而jiner -进犯jinfan -经jing -精jing -京jing -径jing -井jing -静jing -竟jing -晶jing -净jing -境jing -镜jing -景jing -警jing -劲*jing -茎jing -敬jing -惊jing -睛jing -竞jing -荆jing -兢jing -鲸jing -粳jing -痉jing -靖jing -刭jing -儆jing -阱jing -菁jing -獍jing -憬jing -泾jing -迳jing -弪jing -婧jing -肼jing -胫jing -腈jing -旌jing -靓*jing -敬爱jingai -警报jingbao -警备jingbei -精兵jingbing -精采jingcai -精彩jingcai -警察jingcha -经常jingchang -精粹jingcui -静电jingdian -经典jingdian -惊动jingdong -精度jingdu -经费jingfei -精干jinggan -竟敢jinggan -警告jinggao -经过jingguo -净化jinghua -精华jinghua -经济jingji -竞技jingji -荆棘jingji -精简jingjian -境界jingjie -警戒jingjie -经久jingjiu -惊恐jingkong -经理jingli -经历jingli -精力jingli -敬礼jingli -精练jinglian -精良jingliang -经络jingluo -精美jingmei -精密jingmi -精明jingming -进攻jingong -敬佩jingpei -精辟jingpi -景气jingqi -惊奇jingqi -精巧jingqiao -精确jingque -竟然jingran -竞赛jingsai -景色jingse -经商jingshang -精神jingshen -经手jingshou -经受jingshou -精髓jingsui -静态jingtai -惊叹jingtan -晶体jingti -警惕jingti -精通jingtong -镜头jingtou -筋骨jingu -禁锢jingu -尽管jinguan -巾帼jinguo -经委jingwei -警卫jingwei -敬畏jingwei -景物jingwu -精细jingxi -京戏jingxi -惊险jingxian -景象jingxiang -经销jingxiao -经心jingxin -精心jingxin -惊心jingxin -惊醒jingxing -竞选jingxuan -惊讶jingya -经验jingyan -敬仰jingyang -经营jingying -晶莹jingying -经由jingyou -境遇jingyu -精湛jingzhan -竞争jingzheng -精制jingzhi -径直jingzhi -精致jingzhi -静止jingzhi -净值jingzhi -竟址jingzhi -净重jingzhong -镜子jingzi -静坐jingzuo -近海jinhai -今后jinhou -近乎jinhu -进化jinhua -几年jinian -记念jinian -纪念jinian -晋级jinji -紧急jinji -近郊jinjiao -紧紧jinjin -仅仅jinjin -进军jinjun -进口jinkou -尽快jinkuai -近况jinkuang -进来jinlai -近来jinlai -尽力jinli -尽量jinliang -斤两jinliang -禁令jinling -劲旅jinlu -紧密jinmi -近年jinnian -今年jinnian -金牌jinpai -紧迫jinpo -近期jinqi -近前jinqian -金钱jinqian -尽情jinqing -进去jinqu -进取jinqu -禁区jinqu -近日jinri -今日jinri -金融jinrong -进入jinru -浸入jinru -谨慎jinshen -晋升jinsheng -今是jinshi -尽是jinshi -近视jinshi -金属jinshu -近似jinsi -紧缩jinsuo -今天jintian -津贴jintie -尽头jintou -劲头jintou -浸透jintou -进退jintui -今晚jinwan -今昔jinxi -尽心jinxin -进行jinxing -进修jinxiu -锦秀jinxiu -谨严jinyan -紧要jinyao -进展jinzhan -紧张jinzhang -今朝jinzhao -紧着jinzhe -禁止jinzhi -尽职jinzhi -进驻jinzhu -金子jinzi -炯jiong -窘jiong -迥jiong -炅*jiong -扃jiong -窘迫jiongpo -迥然jiongran -击破jipo -急迫jipo -及其jiqi -极其jiqi -激起jiqi -机器jiqi -机枪jiqiang -技巧jiqiao -急切jiqie -激情jiqing -汲取jiqu -集权jiquan -既然jiran -己任jiren -继任jiren -即日jiri -吉日jiri -肌肉jirou -极少jishao -寄生jisheng -即是jishi -及时jishi -几时jishi -计时jishi -即时jishi -即使jishi -记事jishi -基石jishi -集市jishi -级数jishu -基数jishu -计数jishu -记述jishu -技术jishu -祭祀jisi -激素jisu -急速jisu -计算jisuan -机体jiti -集体jiti -肌体jiti -几天jitian -集团jituan -寄托jituo -就jiu -九jiu -旧jiu -究jiu -久jiu -救jiu -酒jiu -纠jiu -揪jiu -玖jiu -韭jiu -灸jiu -厩jiu -臼jiu -舅jiu -咎jiu -疚jiu -僦jiu -啾jiu -阄jiu -柩jiu -桕jiu -鸠jiu -鹫jiu -赳jiu -鬏jiu -就餐jiucan -纠察jiucha -纠缠jiuchan -就此jiuci -就地jiudi -就范jiufan -纠纷jiufen -纠葛jiuge -救国jiuguo -救护jiuhu -救火jiuhuo -纠集jiuji -鸠集jiuji -救济jiuji -救急jiuji -九江jiujiang -九届jiujie -就近jiujin -酒精jiujing -究竟jiujing -救命jiuming -救生jiusheng -就是jiushi -就事jiushi -救亡jiuwang -久违jiuwei -酒窝jiuwo -酒席jiuxi -救险jiuxian -揪心jiuxin -救星jiuxing -就绪jiuxu -就学jiuxue -久仰jiuyang -就要jiuyao -就业jiuye -久远jiuyuan -九月jiuyue -救灾jiuzai -纠正jiuzheng -就职jiuzhi -救治jiuzhi -九洲jiuzhou -救助jiuzhu -极为jiwei -纪委jiwei -极限jixian -迹象jixiang -吉祥jixiang -讥笑jixiao -机械jixie -记性jixing -急性jixing -畸形jixing -即兴jixing -吉凶jixiong -几许jixu -积蓄jixu -继续jixu -记叙jixu -急需jixu -集训jixun -积压jiya -羁押jiya -给养jiyang -机要jiyao -纪要jiyao -给以jiyi -记忆jiyi -技艺jiyi -基因jiyin -急用jiyong -基于jiyu -急于jiyu -机遇jiyu -给予jiyu -寄予jiyu -觊觎jiyu -纪元jiyuan -集约jiyue -记载jizai -及早jizao -急躁jizao -激增jizeng -记帐jizhang -记者jizhe -集镇jizhen -机制jizhi -及至jizhi -机智jizhi -集中jizhong -击中jizhong -记住jizhu -基准jizhun -集资jizi -经济核算jjhs -聚精会神jjhs -将计就计jjjj -戒骄戒躁jjjz -近几年来jjnl -竭尽全力jjql -节假日jjr -积极性jjx -经济效益jjxy -兢兢业业jjyy -精简整编jjzb -叽叽喳喳jjzz -艰苦奋斗jkfd -尽可能jkn -教科书jks -俱乐部jlb -交流电jld -吉林省jls -价廉物美jlwm -纪律性jlx -纪念碑jnb -几年来jnl -近年来jnl -纪念品jnp -济南市jns -吉普车jpc -坚强不屈jqbq -奖勤罚懒jqfl -机器人jqr -急起直追jqzz -截然不同jrbt -兼容性jrx -积少成多jscd -金山公司jsgs -集思广益jsgy -精神焕发jshf -计算机jsj -尽善尽美jsjm -集市贸易jsmy -介绍人jsr -就是说jss -计算所jss -江苏省jss -举世闻名jswm -介绍信jsx -技术员jsy -计算中心jszx -交通部jtb -家庭出身jtcs -惊天动地jtdd -具体地说jtds -晶体管jtg -交通工具jtgj -脚踏实地jtsd -具体说来jtsl -具ju -据ju -局ju -举ju -车*ju -句ju -聚ju -距ju -巨ju -居ju -锯ju -剧ju -矩ju -拒ju -柜*ju -桔*ju -鞠ju -拘ju -狙ju -疽ju -驹ju -菊ju -咀ju -沮ju -踞ju -俱ju -惧ju -炬ju -倨ju -讵ju -苣ju -苴ju -莒ju -掬ju -遽ju -屦ju -琚ju -枸*ju -椐ju -榘ju -榉ju -橘ju -犋ju -飓ju -钜ju -锔ju -窭ju -裾ju -趄ju -醵ju -踽ju -龃ju -雎ju -瞿*ju -鞫ju -卷juan -捐juan -鹃juan -娟juan -倦juan -眷juan -绢juan -俊*juan -鄄juan -狷juan -涓juan -桊juan -蠲juan -锩juan -镌juan -隽juan -卷进juanjin -捐款juankuan -眷恋juanlian -眷念juannian -捐躯juanqu -卷入juanru -眷属juanshu -捐献juanxian -卷烟juanyan -卷帙juanzhi -捐助juanzhu -卷宗juanzong -举办juban -具备jubei -剧本juben -巨变jubian -局部jubu -拘捕jubu -剧场juchang -据此juci -巨大juda -举动judong -居多juduo -决jue -觉jue -绝jue -角*jue -脚*jue -掘jue -嚼*jue -撅jue -攫jue -抉jue -倔jue -爵jue -诀jue -厥jue -劂jue -谲jue -矍jue -蕨jue -嗟*jue -噘jue -噱jue -崛jue -獗jue -孓jue -珏jue -桷jue -橛jue -爝jue -镢jue -蹶jue -觖jue -巨额jue -诀别juebie -决不juebu -绝不juebu -决策juece -觉察juecha -觉得juede -决定jueding -决断jueduan -绝对juedui -绝迹jueji -倔强juejiang -绝交juejiao -绝径juejing -绝境juejing -绝句jueju -决裂juelie -绝路juelu -绝密juemi -绝妙juemiao -崛起jueqi -诀窍jueqiao -决赛juesai -绝食jueshi -决死juesi -决算juesuan -绝望juewang -爵位juewei -觉悟juewu -决心juexin -觉醒juexing -决议jueyi -绝缘jueyuan -抉择jueze -决战juezhan -绝招juezhao -绝症juezheng -巨幅jufu -居功jugong -鞠躬jugong -句号juhao -聚合juhe -聚会juhui -聚集juji -巨匠jujiang -拘谨jujin -拒绝jujue -咀嚼jujue -距离juli -举例juli -剧烈julie -拘留juliu -局面jumian -居民jumin -剧目jumu -军jun -均jun -菌jun -君jun -龟*jun -钧jun -峻jun -俊jun -竣jun -浚jun -郡jun -骏jun -捃jun -皲jun -筠jun -麇jun -军操juncao -君臣junchen -均等jundeng -军队jundui -军法junfa -军阀junfa -军服junfu -军港jungang -军工jungong -竣工jungong -均衡junheng -军火junhuo -拘泥juni -军机junji -军纪junji -军舰junjian -俊杰junjie -军垦junken -军粮junliang -军令junling -骏马junma -军民junmin -军旗junqi -峻峭junqiao -俊俏junqiao -军区junqu -军权junquan -军人junren -军事junshi -军师junshi -军属junshu -军团juntuan -军委junwei -军衔junxian -军校junxiao -军械junxie -军心junxin -俊秀junxiu -军需junxu -军训junxun -军医junyi -军营junying -军用junyong -军邮junyou -均匀junyun -军长junzhang -军政junzheng -君主junzhu -军装junzhuang -君子junzi -俱全juquan -居然juran -遽然juran -沮丧jusang -局势jushi -举手jushou -拘束jushu -据说jushuo -具体juti -剧团jutuan -据悉juxi -局限juxian -居心juxin -举行juxing -矩形juxing -巨型juxing -具有juyou -据有juyou -剧院juyuan -局长juzhang -剧照juzhao -举止juzhi -居中juzhong -剧终juzhong -巨著juzhu -居住juzhu -句子juzi -节外生枝jwsz -惊心动魄jxdp -继续革命jxgm -机械化jxh -江西省jxs -谨小慎微jxsw -局限性jxx -教育部jyb -进一步jyb -家用电器jydq -教育方针jyfz -家喻户晓jyhx -加以解决jyjj -记忆力jyl -精益求精jyqj -教研室jys -见义勇为jyyw -旧中国jzg -建筑物jzw -可k -开k -看k -克k -孔k -科k -口k -空k -苦k -快k -考k -刻k -靠k -况k -块k -困k -宽k -矿k -抗k -卡k -卡ka -喀ka -咖ka -咯ka -佧ka -咔ka -胩ka -喀嚓kacha -卡车kache -咖啡kafei -开kai -凯kai -揩kai -楷kai -慨kai -剀kai -垲kai -蒈kai -忾kai -恺kai -铠kai -锎kai -锴kai -开办kaiban -开遍kaibian -开采kaicai -开场kaichang -开车kaiche -开除kaichu -开创kaichuang -开导kaidao -开刀kaidao -开动kaidong -开端kaiduan -开发kaifa -开放kaifang -开封kaifeng -开赴kaifu -凯歌kaige -开关kaiguan -开航kaihang -开户kaihu -开花kaihua -开怀kaihuai -开荒kaihuang -开会kaihui -开掘kaijue -开垦kaiken -开口kaikou -开矿kaikuang -开阔kaikuo -开朗kailang -开郎kailang -开路kailu -开明kaiming -楷模kaimo -开幕kaimu -开炮kaipao -开辟kaipi -开启kaiqi -开枪kaiqiang -开窍kaiqiao -开设kaishe -开始kaishi -开庭kaiting -开头kaitou -开脱kaituo -开拓kaituo -开外kaiwai -开销kaixiao -开心kaixin -凯旋kaixuan -开学kaixue -开颜kaiyan -开业kaiye -开战kaizhan -开展kaizhan -开张kaizhang -开支kaizhi -看kan -刊kan -坎kan -槛*kan -堪kan -勘kan -砍kan -嵌*kan -侃kan -莰kan -阚*kan -戡kan -龛kan -瞰kan -勘测kance -勘察kancha -看出kanchu -看待kandai -看到kandao -刊登kandeng -看法kanfa -砍伐kanfa -抗kang -康kang -炕kang -慷kang -糠kang -扛kang -亢kang -伉kang -闶kang -钪kang -亢奋kangfen -康复kangfu -抗衡kangheng -抗击kangji -亢进kangjin -抗拒kangju -伉俪kangli -抗日kangri -看管kanguan -抗议kangyi -看见kanjian -坎坷kanke -看来kanlai -看齐kanqi -刊头kantou -看望kanwang -刊物kanwu -勘误kanwu -看样kanyang -刊载kanzai -考kao -靠kao -拷kao -烤kao -尻kao -栲kao -犒kao -铐kao -拷贝kaobei -靠边kaobian -考查kaocha -考察kaocha -考核kaohe -靠近kaojin -考究kaojiu -靠拢kaolong -考虑kaolu -考勤kaoqin -靠山kaoshan -考试kaoshi -考题kaoti -考验kaoyan -考证kaozheng -卡片kapian -看不惯kbg -看不起kbq -刻不容缓kbrh -开诚布公kcbg -矿产资源kczy -扩大化kdh -可ke -克ke -科ke -刻ke -客ke -壳ke -颗ke -棵ke -柯ke -呵*ke -坷ke -苛ke -磕ke -咳ke -渴ke -课ke -嗑ke -岢ke -恪ke -溘ke -骒ke -缂ke -珂ke -轲ke -氪ke -瞌ke -钶ke -锞ke -稞ke -疴ke -窠ke -颏ke -蝌ke -髁ke -可爱keai -科班keban -课本keben -可比kebi -刻薄kebo -可不kebu -客车keche -课程kecheng -可耻kechi -可恶kee -可风kefeng -可否kefou -克服kefu -可观keguan -客观keguan -可贵kegui -可好kehao -可恨kehen -刻划kehua -刻画kehua -克己keji -客机keji -科技keji -可见kejian -科教kejiao -可敬kejing -窠臼kejiu -科举keju -可靠kekao -苛刻keke -可口kekou -克扣kekou -刻苦keku -克拉kela -克朗kelang -颗粒keli -可怜kelian -科目kemu -肯ken -啃ken -垦ken -恳ken -裉ken -肯定kending -可能keneng -坑keng -吭keng -铿keng -坑道kengdao -坑害kenghai -铿锵kengqiang -恳切kenqie -恳求kenqiu -垦殖kenzhi -可怕kepa -磕碰kepeng -科普kepu -客气keqi -可亲keqin -可取kequ -客人keren -客商keshang -可是keshi -科室keshi -课堂ketang -客套ketao -课题keti -客体keti -客厅keting -磕头ketou -可望kewang -渴望kewang -可喜kexi -可惜kexi -可行kexing -科学kexue -科研keyan -可以keyi -可疑keyi -刻意keyi -科员keyuan -科长kezhang -可知kezhi -克制kezhi -狂风暴雨kfby -克己奉公kjfg -科技司kjs -苦口婆心kkpx -昆明市kms -可能性knx -孔kong -空kong -控kong -恐kong -倥kong -崆kong -箜kong -空白kongbai -恐怖kongbu -控拆kongchai -空洞kongdong -空额konge -空乏kongfa -控告konggao -空喊konghan -恐吓konghe -空话konghua -恐慌konghuang -空间kongjian -空降kongjiang -恐惧kongju -空军kongjun -空旷kongkuang -恐龙konglong -空虑konglu -恐怕kongpa -空气kongqi -空前kongqian -孔雀kongque -控诉kongsu -空谈kongtan -空头kongtou -空文kongwen -空隙kongxi -空闲kongxian -空想kongxiang -空虚kongxu -空运kongyun -控制kongzhi -空中kongzhong -口kou -扣kou -抠kou -寇kou -芤kou -蔻kou -叩kou -眍kou -筘kou -口岸kouan -叩拜koubai -口才koucai -扣除kouchu -口传kouchuan -口服koufu -口供kougong -口号kouhao -口红kouhong -口角koujiao -口径koujing -口诀koujue -口令kouling -扣留kouliu -口气kouqi -口腔kouqiang -口哨koushao -口试koushi -口述koushu -口头koutou -叩头koutou -口信kouxin -扣押kouya -口语kouyu -看起来kql -口若悬河krxh -口是心非ksxf -苦ku -库ku -枯ku -酷ku -哭ku -窟ku -裤ku -刳ku -堀ku -喾ku -绔ku -骷ku -跨kua -夸kua -垮kua -挎kua -胯kua -侉kua -跨步kuabu -夸大kuada -跨度kuadu -会*kuai -快kuai -块kuai -筷kuai -侩kuai -蒯kuai -郐kuai -哙kuai -狯kuai -浍*kuai -脍kuai -会计kuaiji -快乐kuaile -快速kuaisu -宽kuan -款kuan -髋kuan -宽敞kuanchang -宽绰kuanchuo -宽大kuanda -宽待kuandai -款待kuandai -宽度kuandu -况kuang -矿kuang -狂kuang -框kuang -匡kuang -筐kuang -眶kuang -旷kuang -诓kuang -诳kuang -邝kuang -圹kuang -夼kuang -哐kuang -纩kuang -贶kuang -矿藏kuangcang -矿产kuangchan -狂风kuangfeng -矿工kuanggong -旷工kuanggong -矿井kuangjing -框框kuangkuang -哐啷kuanglang -况且kuangqie -矿区kuangqu -矿泉kuangquan -狂热kuangre -矿山kuangshan -矿石kuangshi -框图kuangtu -宽广kuanguang -狂妄kuangwang -矿物kuangwu -旷野kuangye -宽宏kuanhong -宽厚kuanhou -宽阔kuankuo -宽容kuanrong -款式kuanshi -宽恕kuanshu -款项kuanxiang -宽心kuanxin -宽裕kuanyu -垮台kuatai -跨越kuayue -夸张kuazhang -裤衩kucha -库存kucun -哭喊kuhan -奎kui -溃kui -馈kui -亏kui -盔kui -岿kui -窥kui -葵kui -魁kui -傀kui -愧kui -馗kui -匮kui -夔kui -隗kui -蒉kui -揆kui -喹kui -喟kui -悝kui -愦kui -逵kui -暌kui -睽kui -聩kui -蝰kui -篑kui -跬kui -亏本kuiben -窥测kuice -亏待kuidai -愧疚kuijiu -亏空kuikong -亏损kuisun -魁梧kuiwu -溃疡kuiyang -枯竭kujie -库仑kulun -苦闷kumen -枯木kumu -困kun -昆kun -坤kun -捆kun -悃kun -阃kun -琨kun -锟kun -醌kun -鲲kun -髡kun -苦难kunan -苦恼kunao -困厄kune -困乏kunfa -困惑kunhuo -困境kunjing -困苦kunku -昆明kunming -困难kunnan -扩kuo -括kuo -适*kuo -阔kuo -廓kuo -栝*kuo -蛞kuo -阔别kuobie -扩充kuochong -阔绰kuochuo -扩大kuoda -括号kuohao -扩建kuojian -阔气kuoqi -扩展kuozhan -扩张kuozhang -哭泣kuqi -酷暑kushu -苦头kutou -苦维kuwei -枯萎kuwei -酷刑kuxing -苦于kuyu -枯燥kuzao -可想而知kxez -科学家kxj -科学技术kxjs -可行性kxx -科学院kxy -科研部kyb -开源节流kyjl -看样子kyz -了l -来l -量l -理l -路l -里l -论l -两l -利l -领l -流l -力l -立l -料l -连l -老l -六l -轮l -类l -列l -拉la -落*la -啦la -蜡la -腊la -蓝la -垃la -喇la -辣la -剌la -邋la -旯la -砬la -瘌la -喇叭laba -来lai -赖lai -莱lai -崃lai -徕lai -涞lai -濑lai -赉lai -睐lai -铼lai -癞lai -籁lai -来宾laibin -来到laidao -来犯laifan -来访laifang -来函laihan -来回laihui -来历laili -来临lailin -赖皮laipi -来日lairi -来势laishi -来头laitou -来往laiwang -来信laixin -来源laiyuan -来者laizhe -来自laizi -癞子laizi -辣椒lajiao -拉拢lalong -喇嘛lama -腊梅lamei -兰lan -烂lan -蓝lan -览lan -栏lan -婪lan -拦lan -篮lan -阑lan -澜lan -谰lan -揽lan -懒lan -缆lan -滥lan -岚lan -漤lan -榄lan -斓lan -罱lan -镧lan -褴lan -蓝本lanben -懒怠landai -滥调landiao -懒惰landuo -浪lang -朗lang -郎lang -狼lang -琅lang -榔lang -廊lang -莨lang -蒗lang -啷lang -阆lang -锒lang -稂lang -螂lang -栏杆langan -狼狈langbei -浪潮langchao -浪荡langdang -朗读langdu -浪费langfei -狼藉langji -浪漫langman -朗诵langsong -郎中langzhong -兰花lanhua -拦截lanjie -烂漫lanman -懒散lansan -蓝色lanse -缆绳lansheng -烂熟lanshu -蓝天lantian -蓝图lantu -阑尾lanwei -拦腰lanyao -滥用lanyong -兰州lanzhou -老lao -劳lao -落*lao -牢lao -涝lao -捞lao -络*lao -佬lao -姥lao -酪lao -烙lao -潦*lao -唠lao -崂lao -栳lao -铑lao -铹lao -痨lao -耢lao -醪lao -老板laoban -老伴laoban -老本laoben -劳动laodong -牢固laogu -老汉laohan -老化laohua -牢记laoji -劳驾laojia -牢靠laokao -劳苦laoku -牢牢laolao -劳累laolei -劳力laoli -老练laolian -牢笼laolong -劳模laomo -老年laonian -老人laoren -牢骚laosao -老少laoshao -老是laoshi -老实laoshi -老师laoshi -老乡laoxiang -老爷laoye -烙印laoyin -劳支laozhi -劳资laozi -劳作laozuo -腊月layue -狼狈不堪lbbk -力不从心lbcx -来不及lbj -来不了lbl -了不起lbq -劳动保险ldbx -来得及ldj -劳动量ldl -劳动力ldl -灵丹妙药ldmy -拉丁美洲ldmz -劳动者ldz -劳动致富ldzf -了le -乐le -勒le -肋le -仂le -叻le -泐le -鳓le -乐观leguan -类lei -雷lei -累lei -勒*lei -垒lei -泪lei -镭lei -蕾lei -磊lei -儡lei -擂lei -肋lei -羸lei -诔lei -嘞lei -嫘lei -缧lei -檑lei -耒lei -酹lei -类别leibie -类次leici -雷达leida -雷管leiguan -泪痕leihen -泪花leihua -累积leiji -累计leiji -累进leijin -磊落leiluo -累年leinian -类似leisi -擂台leitai -雷同leitong -类推leitui -类型leixing -雷雨leiyu -累月leiyue -累赘leizhui -勒令leling -冷leng -棱leng -楞leng -塄leng -愣leng -冷藏lengcang -冷淡lengdan -冷宫lenggong -棱角lengjiao -冷静lengjing -冷落lengluo -冷门lengmen -冷漠lengmo -冷暖lengnuan -冷僻lengpi -冷气lengqi -冷却lengque -冷水lengshui -冷遇lengyu -乐趣lequ -勒索lesuo -乐意leyi -乐园leyuan -两个文明lgwm -拉关系lgx -联合国lhg -联合会lhh -两回事lhs -联合体lht -理li -里li -利li -力li -立li -离li -例li -历li -粒li -厘li -礼li -李li -隶li -黎li -璃li -励li -犁li -梨li -丽li -厉li -篱li -狸li -漓li -鲤li -莉li -荔li -吏li -栗li -砾li -傈li -俐li -痢li -沥li -哩li -鬲*li -俪li -俚li -郦li -坜li -苈li -莅li -蓠li -藜li -呖li -唳li -喱li -猁li -悝*li -溧li -澧li -逦li -娌li -嫠li -骊li -缡li -枥li -栎li -轹li -戾li -砺li -詈li -罹li -锂li -鹂li -疠li -疬li -蛎li -蜊li -蠡li -笠li -篥li -粝li -醴li -跞li -雳li -鲡li -鳢li -黧li -俩lia -连lian -联lian -练lian -炼lian -脸lian -链lian -莲lian -镰lian -廉lian -怜lian -涟lian -帘lian -敛lian -恋lian -蔹lian -奁lian -潋lian -濂lian -琏lian -楝lian -殓lian -臁lian -裢lian -裣lian -蠊lian -鲢lian -立案lian -恋爱lianai -联邦lianbang -练兵lianbing -联播lianbo -练达lianda -连队liandui -量liang -两liang -粮liang -良liang -亮liang -梁liang -凉liang -辆liang -粱liang -晾liang -谅liang -墚liang -莨*liang -椋liang -踉liang -靓liang -魉liang -炼钢liangang -两半liangban -量变liangbian -两边liangbian -两便liangbian -两侧liangce -两次liangci -两地liangdi -两点liangdian -量度liangdu -良方liangfang -两广liangguang -良好lianghao -两极liangji -良机liangji -谅解liangjie -量具liangju -凉快liangkuai -两立liangli -两面liangmian -练功liangong -两栖liangqi -两讫liangqi -两全liangquan -粮食liangshi -两手liangshou -凉爽liangshuang -亮堂liangtang -两条liangtiao -两头liangtou -连贯lianguan -联贯lianguan -亮相liangxiang -良心liangxin -两性liangxing -量刑liangxing -两样liangyang -粮油liangyou -良缘liangyuan -粮站liangzhan -两者liangzhe -两重liangzhong -良种liangzhong -量子liangzi -联合lianhe -联欢lianhuan -廉价lianjia -联结lianjie -连接lianjie -联接lianjie -廉洁lianjie -联军lianjun -连累lianlei -联络lianluo -连忙lianmang -联盟lianmeng -怜悯lianmin -连年liannian -脸谱lianpu -连日lianri -炼乳lianru -联赛liansai -脸色lianse -连锁liansuo -练武lianwu -联系lianxi -练习lianxi -怜惜lianxi -联想lianxiang -连续lianxu -涟漪lianyi -联姻lianyin -联营lianying -炼油lianyou -联运lianyun -连载lianzai -了*liao -料liao -疗liao -辽liao -僚liao -撩liao -聊liao -燎liao -寥liao -潦liao -撂liao -镣liao -廖liao -蓼liao -尥liao -嘹liao -獠liao -寮liao -缭liao -钌liao -鹩liao -撩拨liaobo -潦草liaocao -疗程liaocheng -料到liaodao -潦倒liaodao -料定liaoding -了结liaojie -了解liaojie -辽阔liaokuo -料理liaoli -寥寥liaoliao -寥落liaoluo -辽宁liaoning -了却liaoque -了事liaoshi -聊天liaotian -料想liaoxiang -疗养liaoyang -礼拜libai -利弊libi -里边libian -理财licai -理睬licai -立场lichang -里程licheng -历程licheng -立春lichun -历次lici -历代lidai -理当lidang -立冬lidong -列lie -裂lie -烈lie -劣lie -猎lie -冽lie -埒lie -捩lie -咧lie -洌lie -趔lie -躐lie -鬣lie -裂变liebian -列车lieche -列出liechu -列岛liedao -裂缝liefeng -列国lieguo -烈火liehuo -劣迹lieji -列举lieju -裂开liekai -裂口liekou -列宁liening -猎奇lieqi -列强lieqiang -猎取liequ -烈日lieri -列入lieru -劣绅lieshen -烈士lieshi -劣势lieshi -烈属lieshu -裂纹liewen -列席liexi -烈性liexing -立法lifa -立方lifang -礼服lifu -立功ligong -利害lihai -厉害lihai -理化lihua -礼花lihua -理会lihui -离婚lihun -立即liji -理解lijie -礼节lijie -历届lijie -力矩liju -离开likai -理科like -立刻like -理亏likui -历来lilai -历历lili -力量liliang -利率lilu -理论lilun -立论lilun -礼貌limao -里面limian -利民limin -黎民limin -黎明liming -林lin -磷lin -临lin -邻lin -淋lin -麟lin -琳lin -霖lin -鳞lin -凛lin -赁lin -吝lin -蔺lin -啉lin -嶙lin -廪lin -懔lin -遴lin -檩lin -辚lin -膦lin -瞵lin -粼lin -躏lin -淋巴linba -临别linbie -淋病linbing -林场linchang -临床linchuang -临到lindao -领ling -另ling -零ling -令ling -灵ling -岭ling -铃ling -龄ling -凌ling -棱*ling -陵ling -拎ling -玲ling -菱ling -伶ling -羚ling -酃ling -苓ling -呤ling -囹ling -泠ling -绫ling -柃ling -棂ling -瓴ling -聆ling -蛉ling -翎ling -鲮ling -令爱lingai -凌晨lingchen -灵丹lingdan -领导lingdao -领地lingdi -零点lingdian -领队lingdui -灵感linggan -领海linghai -领航linghang -领会linghui -灵魂linghun -灵活linghuo -灵机lingji -零件lingjian -领教lingjiao -灵杰lingjie -领空lingkong -凌空lingkong -玲珑linglong -零乱lingluan -凌乱lingluan -领略linglue -灵敏lingmin -陵墓lingmu -灵巧lingqiao -领取lingqu -令人lingren -凌辱lingru -零散lingsan -领事lingshi -领受lingshou -领司lingsi -零碎lingsui -灵堂lingtang -零头lingtou -领土lingtu -磷光linguang -另外lingwai -领悟lingwu -领先lingxian -领衔lingxian -零星lingxing -领袖lingxiu -另选lingxuan -灵验lingyan -领域lingyu -令尊lingzun -磷火linhuo -历年linian -临界linjie -临近linjin -邻近linjin -邻里linli -淋漓linli -凛冽linlie -临摹linmo -里弄linong -鳞伤linshang -临时linshi -临死linsi -吝惜linxi -临行linxing -林业linye -临战linzhan -临终linzhong -礼炮lipao -李鹏lipeng -礼品lipin -力气liqi -离奇liqi -力求liqiu -立秋liqiu -历任liren -例如liru -利润lirun -离散lisan -理事lishi -历史lishi -隶属lishu -礼堂litang -立体liti -例题liti -力图litu -流liu -六liu -留liu -刘liu -硫liu -柳liu -陆*liu -馏liu -瘤liu -溜liu -琉liu -榴liu -碌*liu -浏liu -遛liu -骝liu -绺liu -旒liu -熘liu -锍liu -镏liu -鹨liu -鎏liu -留步liubu -流产liuchan -流畅liuchang -流程liucheng -流传liuchuan -流窜liucuan -流动liudong -流毒liudu -流放liufang -六届liujie -浏览liulan -流利liuli -留恋liulian -流露liulu -流落liuluo -流氓liumang -留念liunian -流失liushi -流逝liushi -流体liuti -流通liutong -流亡liuwang -流泻liuxie -留心liuxin -流行liuxing -流星liuxing -留学liuxue -流血liuxue -流言liuyan -留言liuyan -留洋liuyang -留影liuying -留用liuyong -流域liuyu -六月liuyue -流转liuzhuan -例外liwai -礼物liwu -利息lixi -立夏lixia -理想lixiang -立新lixin -离心lixin -理性lixing -力行lixing -厉行lixing -离休lixiu -立意liyi -利益liyi -离异liyi -利用liyong -理由liyou -力争lizheng -立正lizheng -理智lizhi -立志lizhi -离职lizhi -例子lizi -粒子lizi -立足lizu -屡见不鲜ljbx -两极分化ljfh -逻辑设计ljsj -逻辑思维ljsw -逻辑性ljx -灵机一动ljyd -落落大方lldf -拦路虎llh -来龙去脉llqm -零零碎碎llss -来来往往llww -联绵不断lmbd -灵敏度lmd -辽宁省lns -列宁主义lnzy -龙long -垄long -弄*long -笼long -隆long -聋long -咙long -窿long -拢long -陇long -垅long -茏long -泷long -珑long -栊long -胧long -砻long -癃long -隆冬longdong -垄断longduan -隆隆longlong -笼络longluo -笼统longtong -笼罩longzhao -隆重longzhong -漏lou -露*lou -楼lou -娄lou -搂lou -篓lou -陋lou -偻lou -蒌lou -喽lou -嵝lou -镂lou -瘘lou -耧lou -蝼lou -髅lou -漏洞loudong -漏斗loudou -镂空loukong -漏网louwang -来日方长lrfc -来人来函lrlh -了如指掌lrzz -理所当然lsdr -连锁反应lsfy -领事馆lsg -理事会lsh -力所能及lsnj -拉萨市lss -流水线lsx -良师益友lsyy -路lu -六*lu -率lu -露lu -绿lu -炉lu -律lu -虑lu -滤lu -陆lu -氯lu -鲁lu -铝lu -录lu -旅lu -卢lu -吕lu -芦lu -颅lu -庐lu -掳lu -卤lu -虏lu -麓lu -碌lu -赂lu -鹿lu -潞lu -禄lu -戮lu -驴lu -侣lu -履lu -屡lu -缕lu -垆lu -蓼*lu -撸lu -噜lu -闾lu -泸lu -渌lu -漉lu -逯lu -璐lu -栌lu -榈lu -橹lu -轳lu -辂lu -辘lu -氇lu -胪lu -膂lu -镥lu -稆lu -鸬lu -鹭lu -褛lu -簏lu -舻lu -鲈lu -卵luan -乱luan -峦luan -挛luan -孪luan -滦luan -脔luan -娈luan -栾luan -鸾luan -銮luan -卵巢luanchao -乱伦luanlun -乱子luanzi -旅伴luban -路标lubiao -路程lucheng -旅程lucheng -露出luchu -屡次luci -陆地ludi -露底ludi -旅店ludian -略lue -掠lue -锊lue -掠夺lueduo -旅费lufei -露骨lugu -旅馆luguan -路过luguo -绿化luhua -炉火luhuo -路径lujing -路局luju -陆军lujun -旅客luke -履历luli -率领luling -鲁莽lumang -露面lumian -论lun -轮lun -伦lun -抡lun -仑lun -沦lun -纶lun -囵lun -论处lunchu -轮船lunchuan -论点lundian -论调lundiao -伦敦lundun -轮换lunhuan -论据lunju -轮廓lunkuo -论理lunli -伦理lunli -轮流lunliu -论述lunshu -轮胎luntai -论坛luntan -沦为lunwei -论文lunwen -沦陷lunxian -轮训lunxun -论战lunzhan -论正lunzheng -论证lunzheng -轮轴lunzhou -论著lunzhu -落luo -罗luo -螺luo -洛luo -络luo -逻luo -咯*luo -烙*luo -萝luo -锣luo -箩luo -骡luo -裸luo -骆luo -倮luo -蠃luo -荦luo -捋luo -摞luo -猡luo -泺luo -漯luo -珞luo -椤luo -脶luo -硌*luo -镙luo -瘰luo -雒luo -萝卜luobu -落成luocheng -螺钉luoding -罗汉luohan -落后luohou -落户luohu -逻辑luoji -落空luokong -落款luokuan -箩筐luokuang -罗列luolie -罗马luoma -螺母luomu -罗盘luopan -落泊luopo -落实luoshi -螺栓luoshuan -裸体luoti -骆驼luotuo -罗网luowang -螺纹luowen -落伍luowu -落选luoxuan -螺旋luoxuan -络绎luoyi -录取luqu -路人luren -绿色luse -庐山lushan -旅社lushe -律师lushi -露天lutian -路途lutu -旅途lutu -路线luxian -率先luxian -录像luxiang -旅行luxing -履行luxing -陆续luxu -录音luyin -绿荫luyin -录用luyong -旅游luyou -绿洲luzhou -露珠luzhu -路子luzi -炉子luzi -另行安排lxap -例行公事lxgs -联系人lxr -留学生lxs -另行通知lxtz -林业部lyb -老一辈lyb -另一方面lyfm -劳逸结合lyjh -利用率lyl -老一套lyt -留有余地lyyd -来者不拒lzbj -立足点lzd -老中青lzq -理直气壮lzqz -兰州市lzs -两重性lzx -面m -命m -们m -民m -毛m -没m -米m -明m -马m -么m -每m -门m -名m -磨m -美m -密m -苗m -满m -亩m -目m -呒m -马ma -么*ma -麻ma -吗ma -妈ma -骂ma -嘛ma -码ma -摩*ma -抹*ma -玛ma -蚂ma -唛ma -犸ma -嬷ma -杩ma -蟆ma -马鞍maan -麻痹mabi -马达mada -麻烦mafan -麻纺mafang -马虎mahu -麦mai -脉mai -卖mai -买mai -埋mai -迈mai -劢mai -荬mai -霾mai -买办maiban -脉搏maibo -迈步maibu -埋藏maicang -脉冲maichong -脉动maidong -埋伏maifu -卖国maiguo -脉络mailuo -买卖maimai -卖命maiming -埋没maimo -卖弄mainong -埋头maitou -卖淫maiyin -埋怨maiyuan -埋葬maizang -买帐maizhang -卖座maizuo -马力mali -麻利mali -马路malu -妈妈mama -麻木mamu -满man -慢man -曼man -漫man -蔓man -瞒man -馒man -蛮man -谩man -墁man -幔man -缦man -熳man -镘man -颟man -螨man -鳗man -鞔man -漫长manchang -忙mang -芒mang -盲mang -茫mang -氓mang -莽mang -邙mang -漭mang -硭mang -蟒mang -忙碌manglu -莽莽mangmang -盲目mangmu -茫然mangran -盲人mangren -忙于mangyu -莽原mangyuan -蛮横manheng -漫画manhua -满怀manhuai -谩骂manma -满目manmu -满腔manqiang -蔓延manyan -满意manyi -满载manzai -满足manzu -毛mao -矛mao -冒mao -貌mao -贸mao -帽mao -猫mao -茅mao -锚mao -铆mao -卯mao -茂mao -袤mao -茆mao -峁mao -泖mao -瑁mao -昴mao -牦mao -耄mao -旄mao -懋mao -瞀mao -蟊mao -髦mao -毛病maobing -毛糙maocao -冒充maochong -铆钉maoding -矛盾maodun -冒犯maofan -毛纺maofang -冒号maohao -冒尖maojian -冒进maojin -茅坑maokeng -毛利maoli -冒昧maomei -茂密maomi -冒牌maopai -毛坯maopi -贸然maoran -茂盛maosheng -冒失maoshi -矛头maotou -冒险maoxian -贸易maoyi -冒雨maoyu -毛重maozhong -帽子maozi -马上mashang -马桶matong -码头matou -马戏maxi -麻醉mazui -免不了mbl -明辨是非mbsf -满不在乎mbzh -默不作声mbzs -满城风雨mcfy -目的地mdd -目瞪口呆mdkd -描淡写mdx -么me -麽me -秘而不宣mebx -没mei -每mei -美mei -煤mei -霉mei -酶mei -梅mei -妹mei -眉mei -玫mei -枚mei -媒mei -镁mei -昧mei -寐mei -媚mei -糜*mei -谜*mei -莓mei -嵋mei -猸mei -浼mei -湄mei -楣mei -镅mei -鹛mei -袂mei -魅mei -每次meici -每当meidang -美德meide -没法meifa -每逢meifeng -每个meige -美观meiguan -玫瑰meigui -美国meiguo -美好meihao -美化meihua -媒介meijie -眉睫meijie -枚举meiju -煤矿meikuang -霉烂meilan -魅力meili -美丽meili -美满meiman -眉毛meimao -美貌meimao -妹妹meimei -美妙meimiao -眉目meimu -每年meinian -煤气meiqi -每人meiren -每日meiri -美容meirong -眉梢meishao -每时meishi -美术meishu -媒妁meishuo -煤炭meitan -每天meitian -煤田meitian -美学meixue -没有meiyou -煤油meiyou -美元meiyuan -每月meiyue -没治meizhi -每周meizhou -们men -门men -闷men -扪men -焖men -懑men -钔men -门房menfang -孟meng -猛meng -蒙meng -盟meng -梦meng -萌meng -锰meng -氓*meng -檬meng -勐meng -甍meng -瞢meng -懵meng -朦meng -礞meng -虻meng -蜢meng -蠓meng -艋meng -艨meng -蒙蔽mengbi -萌发mengfa -蒙古menggu -盟国mengguo -梦幻menghuan -蒙混menghun -梦见mengjian -猛进mengjin -梦境mengjing -猛烈menglie -蒙胧menglong -蒙昧mengmei -猛然mengran -萌生mengsheng -猛士mengshi -蒙受mengshou -梦想mengxiang -梦乡mengxiang -猛醒mengxing -萌芽mengya -盟友mengyou -盟约mengyue -猛增mengzeng -门户menhu -门路menlu -门牌menpai -门票menpiao -闷气menqi -门诊menzhen -名副其实mfqs -眉飞色舞mfsw -没关系mgx -蒙古族mgz -蒙混过关mhgg -米mi -密mi -迷mi -蜜mi -秘mi -眯mi -醚mi -靡mi -糜mi -谜mi -弥mi -觅mi -泌mi -幂mi -芈mi -谧mi -蘼mi -咪mi -嘧mi -猕mi -汨mi -宓mi -弭mi -脒mi -祢mi -敉mi -糸mi -縻mi -麋mi -面mian -棉mian -免mian -绵mian -眠mian -冕mian -勉mian -娩mian -缅mian -沔mian -渑mian -湎mian -腼mian -眄mian -面部mianbu -免除mianchu -免得miande -面对miandui -面额miane -棉花mianhua -缅怀mianhuai -面积mianji -面具mianju -面孔miankong -勉励mianli -面临mianlin -面貌mianmao -面面mianmian -绵绵mianmian -面目mianmu -面庞mianpang -面前mianqian -勉强mianqiang -面容mianrong -面色mianse -棉纱miansha -面授mianshou -免税mianshui -面谈miantan -面向mianxiang -免刑mianxing -棉絮mianxu -绵延mianyan -面议mianyi -免疫mianyi -面罩mianzhao -免职mianzhi -面子mianzi -苗miao -秒miao -描miao -庙miao -妙miao -瞄miao -藐miao -渺miao -喵miao -邈miao -缈miao -缪miao -杪miao -淼miao -眇miao -鹋miao -秒表miaobiao -描绘miaohui -妙龄miaoling -渺茫miaomang -描摹miaomo -藐视miaoshi -描述miaoshu -苗条miaotiao -苗头miaotou -描写miaoxie -瞄准miaozhun -弥补mibu -谜底midi -密度midu -灭mie -蔑mie -乜*mie -咩mie -蠛mie -篾mie -灭火miehuo -灭迹mieji -灭绝miejue -灭口miekou -蔑视mieshi -灭亡miewang -密封mifeng -蜜蜂mifeng -眯缝mifeng -迷航mihang -迷糊mihu -迷惑mihuo -密集miji -密件mijian -迷津mijin -秘诀mijue -糜烂milan -迷恋milian -密令miling -迷路milu -密码mima -迷漫miman -弥漫miman -秘密mimi -汨汨mimi -谜面mimian -密谋mimou -民min -敏min -抿min -皿min -悯min -闽min -苠min -岷min -闵min -泯min -缗min -玟min -珉min -愍min -黾min -鳘min -民办minban -民兵minbing -民法minfa -民愤minfen -民风minfeng -命ming -明ming -名ming -鸣ming -螟ming -盟*ming -铭ming -冥ming -茗ming -溟ming -暝ming -瞑ming -酩ming -敏感mingan -明白mingbai -名册mingce -名称mingcheng -明处mingchu -名次mingci -名词mingci -名单mingdan -明灯mingdeng -民歌minge -名额minge -名贵minggui -铭记mingji -名家mingjia -铭刻mingke -明快mingkuai -明朗minglang -名利mingli -明亮mingliang -明了mingliao -命令mingling -名流mingliu -明码mingma -明媚mingmei -明明mingming -名目mingmu -明年mingnian -名牌mingpai -名片mingpian -名气mingqi -明确mingque -明人mingren -名人mingren -名胜mingsheng -名声mingsheng -名堂mingtang -明天mingtian -名望mingwang -明文mingwen -明细mingxi -明显mingxian -鸣谢mingxie -明星mingxing -名言mingyan -名义mingyi -名誉mingyu -命运mingyun -明知mingzhi -明智mingzhi -明珠mingzhu -名著mingzhu -名字mingzi -民航minhang -民间minjian -敏捷minjie -民警minjing -民情minqing -敏锐minrui -民事minshi -民心minxin -民意minyi -民用minyong -民运minyun -民政minzheng -民众minzhong -民主minzhu -民族minzu -密切miqie -迷人miren -迷失mishi -秘书mishu -密探mitan -迷途mitu -谬miu -谬论miulun -谬误miuwu -迷惘miwang -迷雾miwu -迷信mixin -密友miyou -谜语miyu -蜜月miyue -马克思mks -眉开眼笑mkyx -马列主义mlzy -满面春风mmcf -马马虎虎mmhh -面面俱到mmjd -莫名其妙mmqm -默默无闻mmww -明目张胆mmzd -无*mo -磨mo -没*mo -万*mo -末mo -模mo -膜mo -摸mo -墨mo -摩mo -脉*mo -莫mo -抹mo -冒*mo -默mo -貉*mo -嘿*mo -摹mo -蘑mo -魔mo -沫mo -漠mo -寞mo -陌mo -谟mo -茉mo -蓦mo -馍mo -嫫mo -殁mo -镆mo -秣mo -瘼mo -耱mo -貊mo -貘mo -默哀moai -莫不mobu -磨擦moca -摩擦moca -磨蹭moceng -莫大moda -磨刀modao -摩登modeng -摸底modi -模范mofan -模仿mofang -摹仿mofang -莫非mofei -魔鬼mogui -模糊mohu -墨迹moji -模块mokuai -磨砺moli -磨练molian -末了moliao -末路molu -没落moluo -磨灭momie -默默momo -磨难monan -模拟moni -摹拟moni -末期moqi -默契moqi -默然moran -漠然moran -默认moren -末日mori -莫如moru -抹杀mosha -抹煞mosha -末梢moshao -陌生mosheng -模式moshi -没收moshou -魔术moshu -磨损mosun -摸索mosuo -模特mote -摩托motuo -某mou -谋mou -牟mou -侔mou -哞mou -缪*mou -眸mou -蛑mou -蝥mou -鍪mou -某地moudi -某个mouge -谋害mouhai -谋划mouhua -某军moujun -牟利mouli -谋略moulue -谋求mouqiu -牟取mouqu -谋杀mousha -谋生mousheng -某些mouxie -末尾mowei -默写moxie -模型moxing -默许moxu -模样moyang -魔掌mozhang -模子mozi -妙趣横生mqhs -门市部msb -名胜古迹msgj -妙手回春mshc -莫斯科msk -没什么msm -每时每刻msmk -秘书长msz -没事找事mszs -摩托车mtc -埋头工作mtgz -埋头苦干mtkg -亩mu -目mu -木mu -母mu -墓mu -模*mu -幕mu -牧mu -姆mu -穆mu -姥*mu -牟*mu -拇mu -牡mu -暮mu -募mu -慕mu -睦mu -仫mu -坶mu -苜mu -沐mu -毪mu -钼mu -母爱muai -墓碑mubei -目标mubiao -木材mucai -牧草mucao -目测muce -牧场muchang -目次muci -牡丹mudan -目的mudi -牧歌muge -目光muguang -幕后muhou -目击muji -募集muji -木刻muke -木料muliao -幕僚muliao -目录mulu -牧民mumin -木讷mune -木偶muou -目前muqian -母亲muqin -牧区muqu -木然muran -暮色muse -牧师mushi -目送musong -牧童mutong -牧业muye -沐浴muyu -民意测验mycy -贸易市场mysc -贸易协定myxd -民政部mzb -美中不足mzbz -毛泽东mzd -满载而归mzeg -明知故犯mzgf -毛织品mzp -目中无人mzwr -毛主席mzx -年n -能n -内n -那n -农n -你n -南n -难n -呢n -女n -泥n -哪n -拿n -念n -牛n -宁n -脑n -粘n -尼n -纳n -嗯n -那na -南na -哪na -拿na -纳na -呢*na -钠na -呐na -娜na -捺na -肭na -镎na -衲na -那边nabian -纳粹nacui -哪儿naer -那个nage -哪个nage -呐喊nahan -哪会nahui -耐nai -哪*nai -奶nai -乃nai -氖nai -奈nai -鼐nai -艿nai -萘nai -柰nai -耐烦naifan -奈何naihe -耐久naijiu -耐劳nailao -奶奶nainai -耐心naixin -耐性naixing -耐用naiyong -奶油naiyou -乃至naizhi -那里nali -哪里nali -那么name -南nan -难nan -男nan -喃nan -囝nan -囡nan -楠nan -腩nan -蝻nan -赧nan -难办nanban -南北nanbei -南边nanbian -难产nanchan -南昌nanchang -难处nanchu -难道nandao -难得nande -难点nandian -难度nandu -哪能naneng -南方nanfang -南非nanfei -难分nanfen -南风nanfeng -囊nang -攮nang -囔nang -馕nang -曩nang -囊括nangkuo -难怪nanguai -难关nanguan -南国nanguo -难过nanguo -南海nanhai -南货nanhuo -南极nanji -难解nanjie -南京nanjing -难看nankan -难堪nankan -南面nanmian -难免nanmian -难民nanmin -南宁nanning -男女nannu -赧然nanran -男人nanren -难色nanse -难事nanshi -难受nanshou -难说nanshuo -难题nanti -难听nanting -难为nanwei -男性nanxing -南亚nanya -南洋nanyang -难以nanyi -难友nanyou -难于nanyu -脑nao -闹nao -努*nao -挠nao -恼nao -淖nao -孬nao -垴nao -呶nao -猱nao -瑙nao -硇nao -铙nao -蛲nao -脑袋naodai -脑海naohai -恼火naohuo -脑筋naojin -闹剧naoju -闹事naoshi -哪怕napa -纳入naru -那时nashi -拿手nashou -纳税nashui -那些naxie -哪些naxie -纳新naxin -那样nayang -哪样nayang -那种nazhong -年产量ncl -农产品ncp -南昌市ncs -难道说nds -呢ne -哪*ne -呐*ne -讷ne -内nei -那*nei -哪*nei -馁nei -内部neibu -内存neicun -内地neidi -内阁neige -内涵neihan -内行neihang -内奸neijian -内疚neijiu -内科neike -内乱neiluan -内幕neimu -内勤neiqin -内容neirong -内外neiwai -内销neixiao -内心neixin -内因neiyin -内应neiying -内在neizai -嫩nen -恁nen -能neng -能动nengdong -能否nengfou -能干nenggan -能够nenggou -能力nengli -能量nengliang -能耐nengnai -能人nengren -能手nengshou -能源nengyuan -能者nengzhe -农副产品nfcp -年富力强nflq -能工巧匠ngqj -你ni -泥ni -尼ni -呢*ni -逆ni -拟ni -尿ni -妮ni -霓ni -倪ni -匿ni -腻ni -溺ni -伲ni -坭ni -猊ni -怩ni -昵ni -旎ni -祢*ni -慝ni -睨ni -铌ni -鲵ni -年nian -念nian -粘nian -蔫nian -拈nian -碾nian -撵nian -捻nian -酿nian -廿nian -埝nian -辇nian -黏nian -鲇nian -鲶nian -年初nianchu -年代niandai -念叨niandao -年底niandi -年度niandu -年份nianfen -娘niang -年华nianhua -年画nianhua -年级nianji -年纪nianji -年鉴nianjian -年来nianlai -年利nianli -年历nianli -拈量nianliang -年龄nianling -年迈nianmai -年年niannian -年青nianqing -年轻nianqing -年岁niansui -年头niantou -念头niantou -年限nianxian -年月nianyue -酿造nianzao -年终nianzhong -尿niao -鸟niao -溺*niao -茑niao -嬲niao -脲niao -袅niao -鸟瞰niaokan -逆差nicha -你处nichu -你的nide -拟定niding -拟订niding -镍nie -啮nie -涅nie -捏nie -聂nie -孽nie -镊nie -乜nie -陧nie -蘖nie -嗫nie -颞nie -臬nie -蹑nie -捏造niezao -腻烦nifan -泥浆nijiang -逆境nijing -泥坑nikeng -逆流niliu -你们nimen -您nin -宁ning -凝ning -拧ning -柠ning -狞ning -泞ning -佞ning -苎ning -咛ning -甯ning -聍ning -凝固ninggu -凝结ningjie -宁静ningjing -凝聚ningju -宁可ningke -宁肯ningken -宁日ningri -凝视ningshi -凝望ningwang -宁夏ningxia -宁愿ningyuan -泥泞nining -泥塑nisu -牛niu -扭niu -钮niu -纽niu -拗*niu -狃niu -忸niu -妞niu -纽带niudai -牛犊niudu -纽扣niukou -纽约niuyue -扭转niuzhuan -腻味niwei -你我niwo -拟议niyi -泥沼nizhao -逆转nizhuan -难解难分njnf -南京市njs -南极洲njz -扭亏为盈nkwy -脑力劳动nlld -年老体弱nltr -内蒙古nmg -农贸市场nmsc -那么些nmx -那么样nmy -念念不忘nnbw -难能可贵nnkg -南宁市nns -农nong -弄nong -浓nong -脓nong -侬nong -哝nong -脓包nongbao -农村nongcun -浓度nongdu -农妇nongfu -浓厚nonghou -农会nonghui -农活nonghuo -农具nongju -农历nongli -农林nonglin -农忙nongmang -农民nongmin -弄清nongqing -农时nongshi -农药nongyao -农业nongye -农艺nongyi -浓郁nongyu -耨nou -年轻化nqh -年轻人nqr -那时候nsh -能说会道nshd -南斯拉夫nslf -能上能下nsnx -逆水行舟nsxz -农田水利ntsl -女nu -奴nu -努nu -怒nu -弩nu -胬nu -孥nu -驽nu -恧nu -钕nu -衄nu -暖nuan -暖和nuanhe -暖流nuanliu -暖气nuanqi -奴婢nubi -奴才nucai -虐nue -虐待nuedai -虐疾nueji -女儿nuer -女工nugong -怒吼nuhou -奴化nuhua -怒火nuhuo -努力nuli -奴隶nuli -诺nuo -娜*nuo -挪nuo -懦nuo -糯nuo -傩nuo -搦nuo -喏nuo -锘nuo -挪用nuoyong -奴仆nupu -女人nuren -女色nuse -女士nushi -女性nuxing -女婿nuxu -女子nuzi -能文能武nwnw -弄虚作假nxzj -农作物nzw -你争我夺nzwd -欧o -偶o -哦o -鸥o -殴o -藕o -呕o -沤o -讴o -噢o -怄o -瓯o -耦o -偶然性orx -区*ou -欧ou -偶ou -鸥ou -殴ou -藕ou -呕ou -沤ou -讴ou -怄ou -瓯ou -耦ou -殴打ouda -偶尔ouer -讴歌ouge -偶合ouhe -耦合ouhe -欧姆oumu -怄气ouqi -偶然ouran -藕色ouse -偶数oushu -呕吐outu -欧阳ouyang -欧洲ouzhou -批p -平p -判p -配p -片p -派p -破p -排p -品p -皮p -喷p -盘p -偏p -评p -怕p -培p -普p -贫p -跑p -炮p -怕pa -派pa -爬pa -帕pa -扒*pa -耙*pa -啪pa -趴pa -琶pa -葩pa -杷pa -钯*pa -筢pa -派pai -排pai -拍pai -牌pai -迫*pai -哌pai -徘pai -湃pai -俳pai -蒎pai -排版paiban -拍板paiban -排比paibi -派别paibie -排场paichang -排斥paichi -排除paichu -排队paidui -牌号paihao -徘徊paihuai -排挤paiji -牌价paijia -排列pailie -拍卖paimai -派遣paiqian -排球paiqiu -派生paisheng -派头paitou -排外paiwai -排泄paixie -排演paiyan -牌照paizhao -判pan -盘pan -叛pan -番*pan -潘pan -攀pan -磐pan -盼pan -畔pan -胖pan -拚*pan -爿pan -泮pan -袢pan -襻pan -蟠pan -蹒pan -叛变panbian -判别panbie -盘缠panchan -盘存pancun -叛党pandang -攀登pandeng -盘点pandian -判定panding -判断panduan -攀附panfu -旁pang -膀*pang -磅*pang -乓pang -庞pang -耪pang -胖pang -彷pang -滂pang -逄pang -螃pang -旁边pangbian -庞大pangda -盘亘pangen -旁观pangguan -旁听pangting -旁通pangtong -滂沱pangtuo -庞杂pangza -盘踞panju -判决panjue -叛乱panluan -判明panming -叛逆panni -盘算pansuan -蟠桃pantao -叛徒pantu -盼望panwang -判刑panxing -盘旋panxuan -跑pao -炮pao -刨pao -抛pao -泡pao -咆pao -袍pao -匏pao -狍pao -庖pao -脬pao -疱pao -炮兵paobing -跑步paobu -炮弹paodan -跑道paodao -抛光paoguang -炮火paohuo -炮击paoji -抛锚paomao -泡沫paomo -抛弃paoqi -炮手paoshou -炮台paotai -炮艇paoting -咆哮paoxiao -泡影paoying -炮仗paozhang -炮制paozhi -怕死pasi -疲惫不堪pbbk -迫不急待pbjd -破除迷信pcmx -平等互利pdhl -配pei -培pei -陪pei -胚pei -呸pei -裴pei -赔pei -佩pei -沛pei -辔pei -帔pei -旆pei -锫pei -醅pei -霈pei -陪伴peiban -配备peibei -赔本peiben -赔偿peichang -陪衬peichen -配方peifang -佩服peifu -配合peihe -配给peiji -配件peijian -配角peijiao -赔款peikuan -赔礼peili -配偶peiou -陪审peishen -陪送peisong -胚胎peitai -配套peitao -陪同peitong -培训peixun -培养peiyang -配音peiyin -培育peiyu -配乐peiyue -陪葬peizang -配制peizhi -配置peizhi -培植peizhi -喷pen -盆pen -湓pen -盆地pendi -碰peng -棚peng -蓬peng -朋peng -捧peng -膨peng -砰peng -抨peng -烹peng -澎peng -彭peng -硼peng -篷peng -鹏peng -堋peng -嘭peng -怦peng -蟛peng -碰杯pengbei -碰壁pengbi -蓬勃pengbo -捧场pengchang -抨击pengji -蓬莱penglai -蓬乱pengluan -澎湃pengpai -烹饪pengren -硼砂pengsha -蓬松pengsong -烹调pengtiao -朋友pengyou -膨胀pengzhang -喷溅penjian -盆景penjing -喷射penshe -喷嚏penti -平方公里pfgl -平分秋色pfqs -批pi -皮pi -坏*pi -否*pi -辟*pi -坯pi -脾pi -疲pi -砒pi -霹pi -披pi -劈pi -琵pi -毗pi -啤pi -匹pi -痞pi -僻pi -屁pi -譬pi -丕pi -仳pi -陂*pi -陴pi -邳pi -郫pi -圮pi -埤*pi -鼙pi -芘pi -擗pi -吡*pi -噼pi -庀pi -淠pi -媲pi -纰pi -枇pi -甓pi -睥pi -罴pi -铍pi -癖pi -裨*pi -疋pi -蚍pi -蜱pi -貔pi -片pian -偏pian -便*pian -篇pian -骗pian -扁*pian -谝pian -骈pian -缏*pian -犏pian -胼pian -翩pian -蹁pian -偏差piancha -片断pianduan -片段pianduan -偏废pianfei -篇幅pianfu -偏激pianji -偏见pianjian -骗局pianju -片刻pianke -偏离pianli -片面pianmian -偏旁pianpang -偏僻pianpi -偏颇pianpo -骗取pianqu -骗人pianren -骗术pianshu -偏袒piantan -翩跹pianxian -偏向pianxiang -偏移pianyi -便宜pianyi -篇章pianzhang -骗子pianzi -票piao -漂piao -朴*piao -飘piao -瓢piao -剽piao -莩*piao -嘌piao -嫖piao -骠*piao -缥piao -殍piao -瞟piao -螵piao -漂泊piaobo -票房piaofang -漂浮piaofu -票价piaojia -票据piaoju -漂亮piaoliang -漂流piaoliu -飘流piaoliu -飘落piaoluo -票面piaomian -飘渺piaomiao -飘泊piaopo -剽窃piaoqie -飘然piaoran -飘散piaosan -飘扬piaoyang -飘游piaoyou -疲惫pibei -批驳pibo -撇pie -瞥pie -丿pie -苤pie -氕pie -批发pifa -批复pifu -皮肤pifu -皮革pige -屁股pigu -疲倦pijuan -疲劳pilao -纰漏pilou -披露pilu -品pin -贫pin -频pin -拼pin -苹pin -聘pin -拚pin -姘pin -嫔pin -榀pin -牝pin -颦pin -品尝pinchang -频传pinchuan -拼凑pincou -频带pindai -频道pindao -品德pinde -贫乏pinfa -频繁pinfan -平ping -评ping -瓶ping -凭ping -苹ping -冯*ping -乒ping -坪ping -萍ping -屏ping -俜ping -娉ping -枰ping -鲆ping -平安pingan -评比pingbi -屏蔽pingbi -平常pingchang -平川pingchuan -平淡pingdan -平等pingdeng -平地pingdi -平定pingding -评定pingding -品格pinge -平反pingfan -平凡pingfan -平方pingfang -平分pingfen -评分pingfen -评功pinggong -平衡pingheng -评级pingji -平价pingjia -评价pingjia -评奖pingjiang -凭借pingjie -平静pingjing -平均pingjun -平空pingkong -凭空pingkong -评理pingli -评论pinglun -平面pingmian -平民pingmin -屏幕pingmu -评判pingpan -乒乓pingpang -平平pingping -平壤pingrang -平日pingri -平时pingshi -平手pingshou -评说pingshuo -平素pingsu -平坦pingtan -乒坛pingtan -平稳pingwen -平息pingxi -萍乡pingxiang -平行pingxing -平易pingyi -评议pingyi -平庸pingyong -平原pingyuan -平仄pingze -屏障pingzhang -凭着pingzhe -平整pingzheng -凭证pingzheng -评注pingzhu -贫寒pinhan -品级pinji -贫困pinkun -频率pinlu -品貌pinmao -拼命pinming -品名pinming -品评pinping -聘请pinqing -贫穷pinqiong -聘任pinren -聘书pinshu -拼写pinxie -品行pinxing -品性pinxing -拼音pinyin -品质pinzhi -品种pinzhong -批判pipan -匹配pipei -批评piping -脾气piqi -譬如piru -疲软piruan -批示pishi -脾胃piwei -脾性pixing -辟谣piyao -批语piyu -批阅piyue -批注pizhu -批准pizhun -平均数pjs -披荆斩棘pjzj -评论员ply -跑马观花pmgh -破po -迫po -坡po -泼po -繁*po -朴*po -泊*po -颇po -婆po -魄po -粕po -叵po -陂*po -鄱po -泺*po -珀po -攴po -钋po -钷po -钹*po -皤po -笸po -破案poan -破产pochan -破除pochu -坡度podu -泼妇pofu -破格poge -迫害pohai -破坏pohuai -破获pohuo -迫近pojin -破旧pojiu -泼辣pola -破烂polan -魄力poli -破例poli -破裂polie -破灭pomie -迫切poqie -迫使poshi -破碎posui -破损posun -破土potu -剖pou -裒pou -掊pou -剖解poujie -剖析pouxi -破绽pozhan -蓬蓬勃勃ppbb -普普通通pptt -旁若无人prwr -普通话pth -抛头露面ptlm -普pu -谱pu -扑pu -埔pu -铺pu -暴*pu -葡pu -朴pu -蒲pu -堡*pu -脯*pu -仆pu -莆pu -菩pu -圃pu -浦pu -曝pu -瀑pu -匍pu -噗pu -溥pu -濮pu -璞pu -氆pu -镤pu -镨pu -蹼pu -普遍pubian -普查pucha -扑哧puchi -扑打puda -铺盖pugai -普及puji -铺平puping -仆人puren -菩萨pusa -铺设pushe -朴实pushi -朴素pusu -葡萄putao -普通putong -扑通putong -铺位puwei -谱写puxie -普选puxuan -铺张puzhang -普照puzhao -朴直puzhi -平易近人pyjr -拼音字母pyzm -铺张浪费pzlf -起q -前q -其q -去q -气q -全q -期q -群q -情q -区q -强q -切q -取q -七q -求q -清q -确q -权q -且q -青q -亲爱的qad -情报所qbs -千百万qbw -千变万化qbwh -取长补短qcbd -千锤百炼qcbl -恰到好处qdhc -全党全军和全国qdqg -取而代之qedz -轻而易举qeyj -千方百计qfbj -清规戒律qgjl -勤工俭学qgjx -旗鼓相当qgxd -轻工业qgy -轻工业部qgyb -勤工助学qgzx -权衡利弊qhlb -骑虎难下qhnx -青海省qhs -青红皂白qhzb -起qi -其qi -气qi -期qi -七qi -器qi -齐qi -奇qi -汽qi -企qi -漆qi -欺qi -旗qi -畦qi -启qi -弃qi -歧qi -稽*qi -缉*qi -栖qi -戚qi -妻qi -凄qi -柒qi -沏qi -棋qi -崎qi -脐qi -祈qi -祁qi -骑qi -岂qi -乞qi -契qi -砌qi -迄qi -泣qi -讫qi -亟*qi -亓qi -俟qi -圻qi -芑qi -芪qi -荠*qi -萁qi -萋qi -葺qi -蕲qi -嘁qi -屺qi -岐qi -岖*qi -汔qi -淇qi -骐qi -绮qi -琪qi -琦qi -杞qi -桤qi -槭qi -耆qi -欹qi -祺qi -憩qi -碛qi -颀qi -蛴qi -蜞qi -綦qi -綮qi -蹊qi -鳍qi -麒qi -卡*qia -恰qia -掐qia -洽qia -伽*qia -葜qia -袷*qia -髂qia -恰当qiadang -恰好qiahao -前qian -千qian -钱qian -浅qian -签qian -迁qian -铅qian -潜qian -牵qian -钳qian -纤*qian -谴qian -扦qian -钎qian -仟qian -谦qian -乾qian -黔qian -遣qian -堑qian -嵌qian -欠qian -歉qian -倩qian -佥qian -阡qian -芊qian -芡qian -茜qian -荨qian -掮qian -岍qian -悭qian -慊qian -骞qian -搴qian -褰qian -缱qian -椠qian -犍*qian -肷qian -愆qian -钤qian -虔qian -箬qian -箝qian -前辈qianbei -前边qianbian -浅薄qianbo -钱财qiancai -欠产qianchan -前程qiancheng -签到qiandao -前敌qiandi -签订qianding -签发qianfa -遣返qianfan -前方qianfang -强qiang -将*qiang -枪qiang -抢qiang -墙qiang -腔qiang -呛qiang -羌qiang -蔷qiang -戕qiang -嫱qiang -樯qiang -戗qiang -炝qiang -锖qiang -锵qiang -镪qiang -襁qiang -蜣qiang -羟qiang -跄qiang -墙壁qiangbi -枪毙qiangbi -强辩qiangbian -强大qiangda -枪弹qiangdan -强盗qiangdao -强调qiangdiao -腔调qiangdiao -强度qiangdu -抢夺qiangduo -强攻qianggong -强国qiangguo -强化qianghua -强加qiangjia -强奸qiangjian -抢劫qiangjie -强劲qiangjin -抢救qiangjiu -枪决qiangjue -强烈qianglie -强迫qiangpo -强权qiangquan -强弱qiangruo -枪杀qiangsha -强盛qiangsheng -千古qiangu -牵挂qiangua -蔷薇qiangwei -抢险qiangxian -强行qiangxing -强硬qiangying -强占qiangzhan -强者qiangzhe -强制qiangzhi -枪支qiangzhi -强壮qiangzhuang -前后qianhou -前进qianjin -前景qianjing -迁就qianjiu -歉疚qianjiu -迁居qianju -乾坤qiankun -千里qianli -前例qianli -潜力qianli -牵连qianlian -前列qianlie -浅陋qianlou -前面qianmian -签名qianming -前年qiannian -前期qianqi -千秋qianqiu -前驱qianqu -欠缺qianque -前人qianren -前任qianren -纤弱qianruo -前哨qianshao -牵涉qianshe -歉收qianshou -签署qianshu -遣送qiansong -前提qianti -前天qiantian -欠条qiantiao -前途qiantu -千瓦qianwa -千万qianwan -前往qianwang -前夕qianxi -纤细qianxi -前线qianxian -浅显qianxian -谦虚qianxu -谦逊qianxun -前言qianyan -前沿qianyan -前夜qianye -歉意qianyi -迁移qianyi -牵引qianyin -潜在qianzai -谴责qianze -前者qianzhe -签证qianzheng -牵制qianzhi -钳制qianzhi -签字qianzi -前奏qianzou -桥qiao -瞧qiao -壳*qiao -巧qiao -敲qiao -乔qiao -蕉qiao -橇qiao -锹qiao -悄qiao -侨qiao -鞘qiao -撬qiao -翘qiao -峭qiao -俏qiao -窍qiao -雀*qiao -劁qiao -诮qiao -谯qiao -荞qiao -峤*qiao -愀qiao -憔qiao -缲*qiao -樵qiao -硗qiao -跷qiao -鞒qiao -侨胞qiaobao -桥墩qiaodun -巧计qiaoji -瞧见qiaojian -侨居qiaoju -桥梁qiaoliang -窍门qiaomen -巧妙qiaomiao -桥牌qiaopai -乔迁qiaoqian -悄然qiaoran -侨务qiaowu -敲诈qiaozha -恰似qiasi -洽谈qiatan -岂不qibu -起步qibu -器材qicai -奇才qicai -凄惨qican -起草qicao -汽车qiche -骑车qiche -启程qicheng -起初qichu -凄楚qichu -其次qici -期待qidai -脐带qidai -岂但qidan -启迪qidi -起点qidian -启动qidong -气度qidu -切qie -且qie -砌*qie -茄qie -怯qie -窃qie -伽*qie -郄qie -惬qie -慊*qie -妾qie -挈qie -锲qie -箧qie -窃案qiean -切断qieduan -切合qiehe -窃据qieju -窃取qiequ -怯弱qieruo -切身qieshen -切实qieshi -切题qieti -窃听qieting -切削qiexiao -惬意qieyi -启发qifa -起飞qifei -岂非qifei -气愤qifen -气氛qifen -欺负qifu -气概qigai -乞丐qigai -岂敢qigan -气功qigong -奇怪qiguai -器官qiguan -旗号qihao -漆黑qihei -气候qihou -期货qihuo -契机qiji -奇迹qiji -期间qijian -起见qijian -器件qijian -七届qijie -迄今qijin -起来qilai -凄凉qiliang -欺凌qiling -气流qiliu -歧路qilu -起码qima -骑马qima -启蒙qimeng -奇妙qimiao -器皿qimin -亲qin -侵qin -勤qin -秦qin -钦qin -琴qin -芹qin -擒qin -禽qin -寝qin -沁qin -芩qin -揿qin -吣qin -嗪qin -噙qin -廑*qin -溱qin -檎qin -锓qin -矜*qin -覃qin -螓qin -衾qin -亲爱qinai -亲笔qinbi -岂能qineng -侵犯qinfan -勤奋qinfen -情qing -清qing -青qing -轻qing -倾qing -请qing -亲*qing -庆qing -氢qing -晴qing -卿qing -擎qing -氰qing -顷qing -苘qing -圊qing -檠qing -磬qing -蜻qing -罄qing -箐qing -綮*qing -謦qing -鲭qing -黥qing -清白qingbai -青白qingbai -情报qingbao -情操qingcao -青草qingcao -清查qingcha -清除qingchu -清楚qingchu -青春qingchun -青翠qingcui -清单qingdan -倾倒qingdao -清点qingdian -情调qingdiao -轻浮qingfu -青工qinggong -青海qinghai -庆贺qinghe -清华qinghua -情怀qinghuai -清还qinghuan -请假qingjia -请柬qingjian -请教qingjiao -情节qingjie -清洁qingjie -情景qingjing -顷刻qingke -晴空qingkong -轻快qingkuai -情况qingkuang -青睐qinglai -晴朗qinglang -情理qingli -清理qingli -轻率qinglu -轻蔑qingmie -青年qingnian -氢气qingqi -轻巧qingqiao -请求qingqiu -情趣qingqu -青山qingshan -请示qingshi -清爽qingshuang -青松qingsong -轻松qingsong -倾诉qingsu -青天qingtian -晴天qingtian -倾听qingting -倾吐qingtu -请问qingwen -倾向qingxiang -倾销qingxiao -情形qingxing -清醒qingxing -情绪qingxu -情谊qingyi -轻易qingyi -轻盈qingying -情愿qingyuan -请愿qingyuan -请战qingzhan -轻重qingzhong -倾注qingzhu -庆祝qingzhu -请罪qingzui -侵害qinhai -勤俭qinjian -亲近qinjin -亲眷qinjuan -勤快qinkuai -勤劳qinlao -亲历qinli -亲临qinlin -侵略qinlue -亲密qinmi -勤勉qinmian -钦佩qinpei -亲戚qinqi -亲切qinqie -亲热qinre -亲人qinren -侵入qinru -亲身qinshen -侵蚀qinshi -寝室qinshi -亲手qinshou -亲属qinshu -侵吞qintun -勤务qinwu -亲信qinxin -亲眼qinyan -亲友qinyou -侵占qinzhan -亲自qinzi -穷qiong -琼qiong -邛qiong -茕qiong -穹qiong -蛩qiong -筇qiong -跫qiong -銎qiong -穷国qiongguo -穷苦qiongku -穷困qiongkun -穹隆qionglong -穷期qiongqi -穷人qiongren -穷途qiongtu -气派qipai -欺骗qipian -气魄qipo -乞求qiqiu -崎岖qiqu -齐全qiquan -凄然qiran -起色qise -气色qise -其实qishi -起始qishi -启事qishi -气势qishi -启示qishi -歧视qishi -奇数qishu -汽水qishui -起诉qisu -其他qita -其它qita -奇特qite -气体qiti -汽艇qiting -企图qitu -歧途qitu -求qiu -球qiu -秋qiu -丘qiu -仇*qiu -龟*qiu -邱qiu -囚qiu -酋qiu -泅qiu -俅qiu -巯qiu -犰qiu -湫qiu -逑qiu -遒qiu -楸qiu -赇qiu -虬qiu -蚯qiu -蝤qiu -裘qiu -糗qiu -鳅qiu -鼽qiu -秋播qiubo -球场qiuchang -囚犯qiufan -秋风qiufeng -秋季qiuji -求教qiujiao -囚禁qiujin -求救qiujiu -丘陵qiuling -秋千qiuqian -求情qiuqing -求全qiuquan -秋色qiuse -求实qiushi -秋收qiushou -秋天qiutian -求学qiuxue -求战qiuzhan -求证qiuzheng -求知qiuzhi -求助qiuzhu -期望qiwang -气味qiwei -气温qiwen -奇闻qiwen -欺侮qiwu -气息qixi -栖息qixi -起先qixian -期限qixian -气象qixiang -器械qixie -齐心qixin -气压qiya -欺压qiya -气焰qiyan -企业qiye -起义qiyi -歧义qiyi -起因qiyin -启用qiyong -汽油qiyou -其余qiyu -起源qiyuan -七月qiyue -契约qiyue -欺诈qizha -气质qizhi -旗帜qizhi -其中qizhong -器重qizhong -旗子qizi -妻子qizi -勤俭建国qjjg -勤俭节约qjjy -迄今为止qjwz -取决于qjy -千钧一发qjyf -旗开得胜qkds -全力以赴qlyf -勤劳致富qlzf -千里之行qlzx -亲密无间qmwj -青年人qnr -千篇一律qpyl -清清楚楚qqcc -勤勤恳恳qqkk -切切实实qqss -确确实实qqss -恰恰相反qqxf -求全责备qqzb -恰如其分qrqf -欺人之谈qrzt -七手八脚qsbj -全神贯注qsgz -全世界qsj -切实可行qskx -切身利益qsly -青少年qsn -前所未闻qsww -前所未有qswy -气势汹汹qsxx -齐头并进qtbj -奇谈怪论qtgl -千头万绪qtwx -前提下qtx -去qu -区qu -取qu -曲qu -且*qu -渠qu -屈qu -趋qu -驱qu -趣qu -蛆qu -躯qu -娶qu -龋qu -戌*qu -诎qu -劬qu -苣*qu -蕖qu -蘧qu -岖qu -衢qu -阒qu -璩qu -觑qu -氍qu -朐qu -祛qu -磲qu -鸲qu -癯qu -蛐qu -蠼qu -麴qu -瞿qu -黢qu -全quan -权quan -圈quan -劝quan -泉quan -醛quan -颧quan -痊quan -拳quan -犬quan -券quan -诠quan -荃quan -悛quan -绻quan -辁quan -畎quan -铨quan -蜷quan -筌quan -鬈quan -全部quanbu -全党quandang -劝导quandao -蜷伏quanfu -劝告quangao -全国quanguo -权衡quanheng -全会quanhui -拳击quanji -劝解quanjie -全局quanju -全军quanjun -全力quanli -权利quanli -权力quanli -全貌quanmao -全面quanmian -劝勉quanmian -全民quanmin -全能quanneng -全年quannian -全盘quanpan -全拼quanpin -全球quanqiu -蜷曲quanqu -全权quanquan -全然quanran -全胜quansheng -权术quanshu -泉水quanshui -劝说quanshuo -圈套quantao -全体quanti -拳头quantou -权威quanwei -劝慰quanwei -全文quanwen -全县quanxian -权限quanxian -全校quanxiao -权益quanyi -权宜quanyi -劝诱quanyou -痊愈quanyu -劝止quanzhi -劝阻quanzu -区别qubie -屈才qucai -驱除quchu -取代qudai -渠道qudao -取得qude -取缔qudi -曲调qudiao -驱动qudong -确que -却que -缺que -炔que -瘸que -鹊que -榷que -雀que -阕que -阙que -悫que -确保quebao -缺点quedian -确定queding -缺乏quefa -缺口quekou -确立queli -确切queqie -确认queren -缺少queshao -缺省quesheng -确实queshi -缺席quexi -缺陷quexian -确信quexin -确凿quezao -瘸子quezi -区分qufen -屈服qufu -躯干qugan -区划quhua -曲解qujie -取经qujing -取决qujue -躯壳quke -取乐qule -群qun -裙qun -逡qun -裙带qundai -群岛qundao -去年qunian -群众qunzhong -区区ququ -屈辱quru -驱散qusan -取舍qushe -取胜qusheng -去世qushi -驱使qushi -趋势qushi -躯体quti -区位quwei -区委quwei -趣味quwei -区县quxian -去向quxiang -趋向quxiang -取消quxiao -取信quxin -曲艺quyi -区域quyu -区长quzhang -曲折quzhe -屈指quzhi -驱逐quzhu -曲子quzi -奇形怪状qxgz -全心全意qxqy -气象台qxt -气象万千qxwq -齐心协力qxxl -岂有此理qycl -前因后果qyhg -情有可原qyky -强有力qyl -求之不得qzbd -取之不尽qzbj -轻重缓急qzhj -气壮山河qzsh -千真万确qzwq -人r -如r -日r -认r -入r -任r -热r -然r -容r -让r -润r -弱r -燃r -染r -壤r -绕r -仁r -溶r -刃r -仍r -然ran -燃ran -染ran -冉ran -苒ran -蚺ran -髯ran -燃点randian -然而raner -让rang -壤rang -嚷rang -瓤rang -攘rang -禳rang -穰rang -让步rangbu -让位rangwei -让贤rangxian -然后ranhou -燃料ranliao -染料ranliao -冉冉ranran -燃烧ranshao -绕rao -扰rao -饶rao -荛rao -娆rao -桡rao -扰乱raoluan -如此而已rcey -人才济济rcjj -热re -若*re -惹re -热爱reai -热潮rechao -热忱rechen -热诚recheng -热带redai -热火rehuo -热量reliang -热烈relie -人ren -认ren -任ren -仁ren -刃ren -忍ren -壬ren -韧ren -妊ren -纫ren -仞ren -荏ren -葚ren -饪ren -轫ren -稔ren -衽ren -热闹renao -人才rencai -人次renci -仁慈renci -认错rencuo -人大renda -韧带rendai -人道rendao -认得rende -认定rending -人防renfang -仍reng -扔reng -扔掉rengdiao -人格renge -仍旧rengjiu -人工rengong -认购rengou -仍然rengran -任何renhe -人家renjia -人间renjian -人杰renjie -认可renke -人口renkou -人类renlei -人力renli -人们renmen -任免renmian -人民renmin -任命renming -忍耐rennai -任凭renping -任期renqi -认清renqing -人权renquan -荏苒renran -忍让renrang -人人renren -人参renshen -人生rensheng -人事renshi -人士renshi -认识renshi -人手renshou -忍受renshou -认输renshu -忍痛rentong -人为renwei -认为renwei -人物renwu -任务renwu -人心renxin -忍心renxin -人选renxuan -任意renyi -仁义renyi -任用renyong -人员renyuan -认帐renzhang -认真renzhen -人质renzhi -任职renzhi -认罪renzui -认作renzuo -热切reqie -热情reqing -惹事reshi -热线rexian -热心rexin -热血rexue -人工合成rghc -热火朝天rhct -如虎添翼rhty -日ri -日报ribao -日本riben -日产richan -日常richang -日程richeng -日光riguang -日后rihou -日记riji -日久rijiu -日历rili -日落riluo -日内rinei -日期riqi -日夜riye -日益riyi -日用riyong -日照rizhao -日中rizhong -日子rizi -软件包rjb -人杰地灵rjdl -人尽其才rjqc -如饥似渴rjsk -日久天长rjtc -任劳任怨rlry -热泪盈眶rlyk -人民币rmb -人民代表大会rmdh -人民日报rmrb -燃眉之急rmzj -容rong -溶rong -荣rong -熔rong -融rong -绒rong -戎rong -茸rong -蓉rong -冗rong -嵘rong -狨rong -榕rong -肜rong -蝾rong -熔点rongdian -容光rongguang -融合ronghe -溶化ronghua -熔化ronghua -融化ronghua -融会ronghui -荣获ronghuo -容积rongji -溶解rongjie -容量rongliang -戎马rongma -容貌rongmao -容纳rongna -融洽rongqia -容忍rongren -荣辱rongru -容身rongshen -绒线rongxian -荣幸rongxing -容许rongxu -荣耀rongyao -溶液rongye -容易rongyi -荣誉rongyu -溶质rongzhi -肉rou -揉rou -柔rou -糅rou -蹂rou -鞣rou -柔和rouhe -肉麻rouma -柔软rouruan -肉体routi -任人为贤rrwx -日日夜夜rryy -人生观rsg -认识论rsl -惹事生非rssf -如上所述rsss -如ru -入ru -儒ru -乳ru -茹ru -蠕ru -孺ru -辱ru -汝ru -褥ru -蓐ru -薷ru -嚅ru -洳ru -溽ru -濡ru -缛ru -铷ru -襦ru -颥ru -软ruan -阮ruan -朊ruan -软骨ruangu -软件ruanjian -软禁ruanjin -软盘ruanpan -如常ruchang -如此ruci -入党rudang -蠕动rudong -乳房rufang -如果ruguo -如何ruhe -瑞rui -锐rui -蕊rui -芮rui -蕤rui -枘rui -睿rui -蚋rui -锐利ruili -瑞雪ruixue -锐意ruiyi -儒家rujia -如今rujin -辱骂ruma -入门rumen -入迷rumi -润run -闰run -润滑runhua -弱ruo -若ruo -偌ruo -弱点ruodian -若干ruogan -若是ruoshi -弱小ruoxiao -如期ruqi -入侵ruqin -如若ruruo -儒生rusheng -入手rushou -如同rutong -如下ruxia -入选ruxuan -如意ruyi -如愿ruyuan -入帐ruzhang -人武部rwb -若无其事rwqs -人言可畏rykw -日用品ryp -若有所思ryss -人之长情rzcq -是s -上s -时s -生s -说s -社s -深s -水s -所s -三s -十s -使s -事s -数s -四s -实s -少s -式s -山s -手s -撒sa -萨sa -洒sa -卅sa -仨sa -挲sa -脎sa -飒sa -撒谎sahuang -塞sai -思*sai -赛sai -腮sai -鳃sai -噻sai -赛车saiche -塞子saizi -撒娇sajiao -三san -散san -叁san -伞san -馓san -毵san -糁san -散步sanbu -散布sanbu -散发sanfa -三废sanfei -桑sang -丧sang -嗓sang -搡sang -磉sang -颡sang -丧命sangming -丧失sangshi -三国sanguo -三好sanhao -散会sanhui -三角sanjiao -三届sanjie -散失sanshi -散文sanwen -三月sanyue -扫sao -梢*sao -搔sao -骚sao -嫂sao -埽sao -缫sao -缲sao -臊sao -瘙sao -鳋sao -扫除saochu -扫荡saodang -扫地saodi -骚动saodong -骚乱saoluan -扫描saomiao -扫墓saomu -骚扰saorao -瘙痒saoyang -扫帚saozhou -洒脱satuo -说不定sbd -舍不得sbd -说不过去sbgq -说不来sbl -数不胜数sbss -素不相识sbxs -身不由己sbyj -上层建筑scjz -生产力scl -生产率scl -水产品scp -四川省scs -市场调节sctj -市场信息scxx -生动活泼sdhp -山东省sds -水电站sdz -色se -塞*se -瑟se -涩se -啬se -铯se -穑se -视而不见sebj -色彩secai -色调sediao -色盲semang -森sen -僧seng -僧侣senglu -森林senlin -森严senyan -色情seqing -瑟瑟sese -十二月sey -色泽seze -司法部sfb -赏罚分明sffm -说服力sfl -手风琴sfq -三番五次sfwc -四个现代化sgxh -手工业sgy -沙sha -杀sha -砂sha -啥sha -纱sha -莎sha -刹sha -傻sha -煞sha -杉sha -厦*sha -唼sha -嗄*sha -挲*sha -歃sha -铩sha -痧sha -裟sha -霎sha -鲨sha -煞白shabai -刹车shache -煞车shache -沙发shafa -傻瓜shagua -沙皇shahuang -色*shai -筛shai -晒shai -晒台shaitai -砂烬shajin -沙龙shalong -沙漠shamo -山shan -单*shan -闪shan -善shan -珊shan -扇shan -陕shan -掸*shan -苫shan -杉shan -删shan -煽shan -衫shan -擅shan -赡shan -膳shan -汕shan -缮shan -栅*shan -剡shan -讪shan -鄯shan -埏shan -芟shan -潸shan -姗shan -嬗shan -骟shan -膻shan -禅*shan -钐shan -疝shan -蟮shan -舢shan -跚shan -鳝shan -刹那shana -山坳shanao -陕北shanbei -擅长shanchang -删除shanchu -山川shanchuan -山地shandi -闪电shandian -扇动shandong -煽动shandong -山东shandong -山峰shanfeng -上shang -商shang -伤shang -尚shang -汤*shang -墒shang -赏shang -晌shang -裳shang -垧shang -绱shang -殇shang -熵shang -觞shang -删改shangai -山岗shangang -山冈shangang -上班shangban -上报shangbao -上边shangbian -商标shangbiao -上部shangbu -上策shangce -上层shangceng -商场shangchang -上次shangci -赏赐shangci -上当shangdang -上等shangdeng -上帝shangdi -商店shangdian -上调shangdiao -商定shangding -上访shangfang -伤感shanggan -上告shanggao -赏光shangguang -上海shanghai -伤害shanghai -商行shanghang -上级shangji -上集shangji -上进shangjin -上空shangkong -上来shanglai -商量shangliang -上流shangliu -上门shangmen -上面shangmian -上年shangnian -山沟shangou -商品shangpin -商洽shangqia -上前shangqian -尚且shangqie -上去shangqu -商榷shangque -商人shangren -上任shangren -上山shangshan -上升shangsheng -赏识shangshi -上述shangshu -上司shangsi -上诉shangsu -商谈shangtan -商讨shangtao -闪光shanguang -上文shangwen -上午shangwu -商务shangwu -上下shangxia -上限shangxian -伤心shangxin -上旬shangxun -上演shangyan -商业shangye -商议shangyi -上映shangying -上游shangyou -上涨shangzhang -上阵shangzhen -山河shanhe -善后shanhou -删节shanjie -善良shanliang -山林shanlin -山岭shanling -山脉shanmai -杉木shanmu -山区shanqu -扇区shanqu -山水shanshui -闪烁shanshuo -山头shantou -山西shanxi -陕西shanxi -赡养shanyang -闪耀shanyao -善意shanyi -善于shanyu -善战shanzhan -擅自shanzi -少shao -烧shao -稍shao -绍shao -召*shao -哨shao -梢shao -鞘*shao -捎shao -芍shao -勺shao -韶shao -邵shao -劭shao -苕shao -潲shao -杓*shao -蛸shao -筲shao -艄shao -哨兵shaobing -艄公shaogong -烧毁shaohui -少见shaojian -哨卡shaoka -少量shaoliang -少年shaonian -少女shaonu -烧伤shaoshang -少数shaoshu -哨所shaosuo -稍微shaowei -少许shaoxu -稍许shaoxu -少爷shaoye -少有shaoyou -少于shaoyu -少壮shaozhuang -沙哑shaya -砂眼shayan -傻子shazi -社she -设she -射she -摄she -舌she -折*she -涉she -舍she -蛇she -奢she -赊she -赦she -慑she -厍she -佘she -摺*she -猞she -滠she -歙she -畲she -麝she -设备shebei -射程shecheng -奢侈shechi -舍得shede -设法shefa -慑服shefu -赊购shegou -奢华shehua -社会shehui -社稷sheji -涉及sheji -设计sheji -射击sheji -舍己sheji -社交shejiao -设立sheli -涉猎shelie -社论shelun -深shen -身shen -神shen -什*shen -伸shen -参*shen -甚shen -渗shen -沈shen -肾shen -审shen -申shen -慎shen -砷shen -呻shen -娠shen -绅shen -婶shen -诜shen -谂shen -莘shen -葚*shen -哂shen -渖shen -椹shen -胂shen -矧shen -蜃shen -深奥shenao -申报shenbao -身边shenbian -申辩shenbian -身材shencai -审查shencha -深沉shenchen -深处shenchu -审处shenchu -审定shending -深度shendu -甚而shener -身分shenfen -身份shenfen -生sheng -胜sheng -声sheng -省sheng -升sheng -盛sheng -绳sheng -剩sheng -圣sheng -牲sheng -乘*sheng -甥sheng -嵊sheng -渑*sheng -晟sheng -眚sheng -笙sheng -生财shengcai -生产shengchan -生成shengcheng -牲畜shengchu -生存shengcun -盛大shengda -省得shengde -胜地shengdi -盛典shengdian -声调shengdiao -生动shengdong -省份shengfen -胜负shengfu -省府shengfu -生根shenggen -升华shenghua -省会shenghui -盛会shenghui -生活shenghuo -生机shengji -生计shengji -升级shengji -圣洁shengjie -圣经shengjing -盛开shengkai -牲口shengkou -盛况shengkuang -生理shengli -胜利shengli -省力shengli -省略shenglue -生命shengming -声明shengming -盛名shengming -生怕shengpa -生僻shengpi -生平shengping -升旗shengqi -生前shengqian -升迁shengqian -盛情shengqing -生趣shengqu -省去shengqu -胜任shengren -生日shengri -省事shengshi -盛事shengshi -声势shengshi -生疏shengshu -生死shengsi -胜似shengsi -胜诉shengsu -绳索shengsuo -生态shengtai -声讨shengtao -声望shengwang -省委shengwei -生物shengwu -生息shengxi -剩下shengxia -盛夏shengxia -圣贤shengxian -生效shengxiao -生肖shengxiao -盛行shengxing -生涯shengya -生意shengyi -声音shengyin -生于shengyu -生育shengyu -胜于shengyu -声誉shengyu -剩余shengyu -声援shengyuan -生长shengzhang -省长shengzhang -声张shengzhang -胜仗shengzhang -生殖shengzhi -圣旨shengzhi -盛装shengzhuang -审核shenhe -深厚shenhou -深化shenhua -神话shenhua -甚或shenhuo -审计shenji -神经shenjing -深刻shenke -审理shenli -什么shenme -审美shenmei -神秘shenmi -申明shenming -审判shenpan -身旁shenpang -审批shenpi -神气shenqi -神奇shenqi -深浅shenqian -深切shenqie -深情shenqing -申请shenqing -身躯shenqu -深入shenru -渗入shenru -神圣shensheng -身世shenshi -绅士shenshi -伸手shenshou -申述shenshu -神速shensu -申诉shensu -伸缩shensuo -神态shentai -身体shenti -神通shentong -渗透shentou -审问shenwen -神仙shenxian -审讯shenxun -沈阳shenyang -审议shenyi -呻吟shenyin -身影shenying -深远shenyuan -申冤shenyuan -审阅shenyue -深造shenzao -伸张shenzhang -深圳shenzhen -甚至shenzhi -深重shenzhong -慎重shenzhong -神州shenzhou -舍弃sheqi -赊欠sheqian -设施sheshi -社团shetuan -奢望shewang -射线shexian -涉嫌shexian -设想shexiang -赊销shexiao -设宴sheyan -摄影sheying -社员sheyuan -社长shezhang -设置shezhi -涉足shezu -社会公德shgd -是shi -时shi -十shi -使shi -事shi -实shi -式shi -识shi -世shi -试shi -石shi -什shi -示shi -市shi -史shi -师shi -始shi -施shi -士shi -势shi -湿shi -适shi -食shi -失shi -视shi -室shi -氏shi -似*shi -蚀shi -诗shi -释shi -殖*shi -拾shi -饰shi -驶shi -匙*shi -狮shi -尸shi -虱shi -矢shi -屎shi -柿shi -拭shi -誓shi -逝shi -嗜shi -噬shi -仕shi -侍shi -恃shi -嘘*shi -峙*shi -谥shi -埘shi -莳shi -蓍shi -弑shi -轼shi -贳shi -炻shi -铈shi -螫shi -舐shi -筮shi -酾shi -豕shi -鲥shi -鲺shi -失败shibai -势必shibi -事变shibian -师表shibiao -识别shibie -失策shice -史册shice -视察shicha -时常shichang -失常shichang -市场shichang -时辰shichen -失传shichuan -侍从shicong -时代shidai -世代shidai -适当shidang -是的shide -实地shidi -试点shidian -失调shidiao -失掉shidiao -事端shiduan -拾掇shiduo -时而shier -示范shifan -师范shifan -施放shifang -释放shifang -是非shifei -时分shifen -十分shifen -侍奉shifeng -是否shifou -师傅shifu -实干shigan -是个shige -诗歌shige -施工shigong -事故shigu -世故shigu -尸骨shigu -使馆shiguan -时光shiguang -嗜好shihao -适合shihe -时候shihou -事后shihou -侍候shihou -使唤shihuan -实惠shihui -失火shihuo -时机shiji -事迹shiji -实际shiji -世纪shiji -试剂shiji -史籍shiji -施加shijia -市价shijia -时间shijian -事件shijian -世间shijian -实践shijian -视角shijiao -市郊shijiao -使节shijie -十届shijie -世界shijie -使劲shijin -市井shijing -时局shiju -视觉shijue -时刻shike -石刻shike -市侩shikuai -实况shikuang -事理shili -实力shili -事例shili -势利shili -失利shili -势力shili -视力shili -示例shili -失恋shilian -适量shiliang -矢量shiliang -拾零shiling -失灵shiling -适龄shiling -时髦shimao -失密shimi -市民shimin -使命shiming -市内shinei -室内shinei -诗篇shipian -食品shipin -视频shipin -识破shipo -时期shiqi -事前shiqian -失窃shiqie -事情shiqing -实情shiqing -时区shiqu -时取shiqu -失去shiqu -市区shiqu -诗人shiren -市容shirong -湿润shirun -示弱shiruo -失散shisan -失色shise -施舍shishe -师生shisheng -失声shisheng -时时shishi -时事shishi -适时shishi -事实shishi -失事shishi -实施shishi -失实shishi -逝世shishi -史诗shishi -失势shishi -誓师shishi -尸首shishou -失守shishou -实数shishu -施属shishu -世俗shisu -失算shisuan -事态shitai -试探shitan -食堂shitang -实体shiti -尸体shiti -石头shitou -势头shitou -师团shituan -十万shiwan -失望shiwang -市委shiwei -示威shiwei -时务shiwu -事物shiwu -事务shiwu -实物shiwu -食物shiwu -饰物shiwu -失误shiwu -实习shixi -事先shixian -视线shixian -实现shixian -试想shixiang -事项shixiang -实效shixiao -试销shixiao -失信shixin -实行shixing -试行shixing -施行shixing -失修shixiu -实学shixue -史学shixue -实验shiyan -试验shiyan -食言shiyan -誓言shiyan -式样shiyang -事业shiye -实业shiye -失业shiye -视野shiye -时宜shiyi -事宜shiyi -示意shiyi -诗意shiyi -适宜shiyi -释疑shiyi -适应shiying -使用shiyong -实用shiyong -试用shiyong -适用shiyong -事由shiyou -石油shiyou -誓由shiyou -适于shiyu -誓愿shiyuan -十月shiyue -失约shiyue -实在shizai -实战shizhan -施展shizhan -市长shizhang -师长shizhang -使者shizhe -侍者shizhe -失真shizhen -市镇shizhen -市政shizheng -试制shizhi -实质shizhi -市制shizhi -食指shizhi -失职shizhi -适中shizhong -示众shizhong -始终shizhong -时装shizhuang -师资shizi -十足shizu -实足shizu -失足shizu -始祖shizu -手shou -受shou -收shou -首shou -守shou -熟*shou -授shou -寿shou -兽shou -售shou -瘦shou -狩shou -绶shou -艏shou -守备shoubei -手表shoubiao -收兵shoubing -收藏shoucang -手册shouce -首倡shouchang -寿辰shouchen -收成shoucheng -首创shouchuang -首次shouci -收存shoucun -寿诞shoudan -受到shoudao -守敌shoudi -首度shoudu -首都shoudu -手段shouduan -守法shoufa -首犯shoufan -收复shoufu -首府shoufu -手感shougan -手稿shougao -收割shouge -收购shougou -受害shouhai -守候shouhou -守护shouhu -收回shouhui -受贿shouhui -收获shouhuo -收集shouji -售价shoujia -受奖shoujiang -授奖shoujiang -手脚shoujiao -收缴shoujiao -首届shoujie -守旧shoujiu -收据shouju -授课shouke -受理shouli -收敛shoulian -首领shouling -收留shouliu -收录shoulu -收买shoumai -授命shouming -寿命shouming -首脑shounao -首批shoupi -授权shouquan -收容shourong -收入shouru -手软shouruan -瘦弱shouruo -首饰shoushi -手术shoushu -收缩shousuo -收条shoutiao -收听shouting -收尾shouwei -首尾shouwei -首先shouxian -首相shouxiang -瘦小shouxiao -收效shouxiao -手续shouxu -瘦削shouxue -收养shouyang -首要shouyao -受益shouyi -收益shouyi -兽医shouyi -受用shouyong -授予shouyu -守则shouze -首长shouzhang -收支shouzhi -生活上shs -上海市shs -数shu -书shu -树shu -属shu -术shu -输shu -述shu -熟shu -束shu -鼠shu -疏shu -殊shu -舒shu -蔬shu -薯shu -叔shu -署shu -枢shu -梳shu -抒shu -淑shu -赎shu -孰shu -暑shu -曙shu -蜀shu -黍shu -戍shu -竖shu -墅shu -庶shu -漱shu -恕shu -俞*shu -丨shu -倏shu -塾shu -菽shu -摅shu -沭shu -澍shu -姝shu -纾shu -毹shu -腧shu -殳shu -秫shu -刷shua -耍shua -唰shua -衰shuai -帅shuai -摔shuai -甩shuai -蟀shuai -衰败shuaibai -摔打shuaida -摔交shuaijiao -衰竭shuaijie -衰老shuailao -衰弱shuairuo -衰退shuaitui -衰亡shuaiwang -耍赖shualai -栓shuan -拴shuan -闩shuan -涮shuan -双shuang -霜shuang -爽shuang -泷*shuang -孀shuang -双边shuangbian -双方shuangfang -爽口shuangkou -爽快shuangkuai -爽朗shuanglang -双拼shuangpin -双重shuangzhong -耍弄shuanong -刷洗shuaxi -刷新shuaxin -书报shubao -书本shuben -蔬菜shucai -舒畅shuchang -输出shuchu -树丛shucong -疏导shudao -书店shudian -数额shue -抒发shufa -书法shufa -舒服shufu -束缚shufu -曙光shuguang -蜀汉shuhan -疏忽shuhu -倏忽shuhu -书画shuhua -水shui -说*shui -谁shui -睡shui -税shui -水稻shuidao -水电shuidian -水分shuifen -水果shuiguo -水火shuihuo -水晶shuijing -水库shuiku -水利shuili -水流shuiliu -睡眠shuimian -水平shuiping -税收shuishou -税务shuiwu -水下shuixia -水性shuixing -水源shuiyuan -水灾shuizai -谁知shuizhi -书记shuji -书籍shuji -暑假shujia -数据shuju -书刊shukan -数理shuli -树立shuli -竖立shuli -熟练shulian -数量shuliang -数列shulie -疏漏shulou -数落shuluo -数码shuma -书面shumian -庶民shumin -数目shumu -书目shumu -树木shumu -顺shun -吮shun -瞬shun -舜shun -顺便shunbian -顺差shuncha -顺次shunci -顺从shuncong -顺当shundang -顺道shundao -顺风shunfeng -枢纽shuniu -顺利shunli -顺路shunlu -瞬时shunshi -顺势shunshi -顺心shunxin -顺序shunxu -顺应shunying -顺着shunzhuo -说shuo -数*shuo -硕shuo -朔shuo -烁shuo -蒴shuo -搠shuo -妁shuo -槊shuo -铄shuo -说到shuodao -说道shuodao -说动shuodong -说法shuofa -说服shuofu -硕果shuoguo -说话shuohua -说教shuojiao -说明shuoming -说情shuoqing -硕士shuoshi -述评shuping -署期shuqi -暑期shuqi -抒情shuqing -熟人shuren -输入shuru -疏散shusan -属实shushi -熟识shushi -舒适shushi -束手shushou -叔叔shushu -数说shushuo -述说shushuo -输送shusong -疏松shusong -舒坦shutan -疏通shutong -熟悉shuxi -属相shuxiang -舒心shuxin -书信shuxin -属性shuxing -数学shuxue -属于shuyu -术语shuyu -疏远shuyuan -舒展shuzhan -数值shuzhi -树脂shuzhi -梳妆shuzhuang -数字shuzi -赎罪shuzui -售货员shy -社会主义shzy -四si -思si -死si -斯si -丝si -似si -司si -饲si -食*si -私si -厕*si -撕si -嘶si -肆si -寺si -嗣si -伺si -巳si -厮si -俟*si -兕si -厶si -咝si -汜si -泗si -澌si -姒si -驷si -缌si -祀si -锶si -鸶si -耜si -蛳si -笥si -死板siban -四边sibian -死别sibie -思潮sichao -丝绸sichou -四处sichu -四川sichuan -死党sidang -死敌sidi -司法sifa -四方sifang -四海sihai -丝毫sihao -嗣后sihou -似乎sihu -四化sihua -死缓sihuan -撕毁sihui -死活sihuo -四季siji -司机siji -私交sijiao -四届sijie -思考sikao -私利sili -私了siliao -司令siling -思路silu -四面simian -思念sinian -私念sinian -死去siqu -私人siren -死伤sishang -私事sishi -死尸sishi -死水sishui -思索sisuo -四体siti -私吞situn -死亡siwang -思维siwei -斯文siwen -私下sixia -思想sixiang -四项sixiang -死心sixin -私心sixin -肆行sixing -死刑sixing -私有siyou -私欲siyu -寺院siyuan -四月siyue -死者sizhe -四周sizhou -私自sizi -死罪sizui -拾金不昧sjbm -身经百战sjbz -书记处sjc -世界观sjg -舍己救人sjjr -数据库sjk -省军区sjq -杀鸡取蛋sjqd -实际上sjs -设计所sjs -试金石sjs -舍己为人sjwr -设计院sjy -随机应变sjyb -十进制sjz -石家庄sjz -适可而止skez -数理化slh -收录机slj -十六进制sljz -三令五申slws -司令员sly -四面八方smbf -手忙脚乱smjl -生命力sml -说明书sms -什么样smy -深谋远虑smyl -数目字smz -松song -送song -宋song -颂song -耸song -怂song -讼song -诵song -凇song -菘song -崧song -嵩song -忪song -悚song -淞song -竦song -松绑songbang -送别songbie -松弛songchi -松动songdong -颂歌songge -松劲songjin -松快songkuai -耸立songli -送礼songli -松散songsan -松涛songtao -松懈songxie -颂扬songyang -怂恿songyong -送葬songzang -送终songzhong -搜sou -艘sou -擞sou -嗽sou -叟sou -薮sou -嗖sou -嗾sou -馊sou -溲sou -飕sou -瞍sou -锼sou -螋sou -搜查soucha -搜集souji -搜索sousuo -搜寻souxun -售票处spc -食品工业spgy -水平线spx -生气勃勃sqbb -诗情画意sqhy -盛气凌人sqlr -山穷水尽sqsj -十全十美sqsm -首屈一指sqyz -四人帮srb -损人利己srlj -深入浅出srqc -似是而非ssef -时时刻刻sskk -姗姗来迟sslc -实事求是ssqs -事实上sss -随时随地sssd -善始善终sssz -顺水推舟sstz -四通公司stgs -四通集团stjt -身体力行stlx -生态平衡stph -素su -速su -苏su -塑su -缩su -俗su -诉su -宿su -肃su -酥su -粟su -僳su -溯su -夙su -谡su -蔌su -嗉su -愫su -涑su -簌su -觫su -稣su -算suan -酸suan -蒜suan -狻suan -酸楚suanchu -算法suanfa -算计suanji -算了suanle -算盘suanpan -算术suanshu -酸疼suanteng -酸痛suantong -素材sucai -速成sucheng -苏丹sudan -速度sudu -俗话suhua -随sui -穗sui -碎sui -虽sui -岁sui -尿*sui -隋sui -绥sui -髓sui -遂sui -隧sui -祟sui -谇sui -荽sui -濉sui -邃sui -燧sui -眭sui -睢sui -随笔suibi -随便suibian -随处suichu -随从suicong -随地suidi -随和suihe -随后suihou -随机suiji -随即suiji -虽然suiran -随身suishen -随时suishi -随手suishou -岁数suishu -虽说suishuo -随同suitong -随心suixin -随行suixing -随意suiyi -遂意suiyi -岁月suiyue -虽则suize -随着suizhe -诉苦suku -苏联sulian -塑料suliao -速率sulu -素描sumiao -肃穆sumu -损sun -孙sun -笋sun -荪sun -狲sun -飧sun -榫sun -隼sun -损害sunhai -损耗sunhao -损坏sunhuai -损伤sunshang -损失sunshi -孙子sunzi -所suo -缩suo -锁suo -索suo -莎*suo -蓑suo -梭suo -唆suo -琐suo -唢suo -嗦suo -嗍suo -娑suo -桫suo -挲*suo -睃suo -羧suo -所得suode -缩短suoduan -缩减suojian -锁链suolian -所能suoneng -索取suoqu -唆使suoshi -所属suoshu -琐碎suosui -所为suowei -所谓suowei -缩小suoxiao -缩写suoxie -琐屑suoxie -索性suoxing -所以suoyi -索引suoyin -缩影suoying -所有suoyou -所在suozai -所长suozhang -所至suozhi -梭子suozi -肃清suqing -苏区suqu -宿舍sushe -素数sushu -诉说sushuo -诉讼susong -速效suxiao -速写suxie -苏醒suxing -素养suyang -宿营suying -溯源suyuan -宿愿suyuan -夙愿suyuan -塑造suzao -速战suzhan -素质suzhi -苏州suzhou -苏维埃swa -税务局swj -手舞足蹈swzd -少先队sxd -身心健康sxjk -思想上sxs -山西省sxs -陕西省sxs -顺息万变sxwb -所向无敌sxwd -思想性sxx -商业部syb -说一不二sybe -收音机syj -使用价值syjz -所有权syq -沈阳市sys -实用性syx -十一月syy -所有制syz -私有制syz -时至今日szjr -三中全会szqh -始终如一szry -深圳四通szst -所作所为szsw -甚至于szy -他t -同t -它t -提t -题t -体t -图t -天t -头t -通t -条t -特t -土t -团t -统t -台t -她t -太t -套t -铁t -他ta -它ta -她ta -塔ta -踏ta -塌ta -獭ta -挞ta -蹋ta -拓*ta -嗒*ta -闼ta -溻ta -漯*ta -遢ta -榻ta -沓ta -铊ta -趿ta -鳎ta -踏步tabu -他的tade -它的tade -她的tade -塌方tafang -台tai -太tai -态tai -胎tai -抬tai -泰tai -苔tai -酞tai -汰tai -邰tai -薹tai -呔*tai -骀*tai -肽tai -炱tai -钛tai -跆tai -鲐tai -台北taibei -台词taici -态度taidu -台风taifeng -台阶taijie -太平taiping -泰然tairan -泰山taishan -态势taishi -太太taitai -抬头taitou -台湾taiwan -太阳taiyang -太原taiyuan -天安门tam -他们tamen -它们tamen -她们tamen -谈tan -碳tan -探tan -炭tan -弹*tan -坦tan -贪tan -滩tan -坍tan -摊tan -瘫tan -坛tan -檀tan -痰tan -潭tan -谭tan -毯tan -袒tan -叹tan -郯tan -澹tan -昙tan -忐tan -钽tan -锬tan -镡*tan -坦白tanbai -探测tance -探访tanfang -谈锋tanfeng -叹服tanfu -堂tang -糖tang -唐tang -塘tang -汤tang -搪tang -棠tang -膛tang -倘tang -躺tang -淌tang -趟tang -烫tang -傥tang -帑tang -溏tang -瑭tang -樘tang -铴tang -镗tang -耥tang -螗tang -螳tang -羰tang -醣tang -倘不tangbu -搪瓷tangci -弹弓tangong -倘若tangruo -搪塞tangsai -烫伤tangshang -堂堂tangtang -唐突tangtu -弹劾tanhe -袒护tanhu -谈话tanhua -瘫痪tanhuan -探究tanjiu -坦克tanke -贪婪tanlan -坦率tanlu -谈论tanlun -摊派tanpai -谈判tanpan -叹气tanqi -探亲tanqin -弹琴tanqin -坦然tanran -探索tansuo -探讨tantao -谈天tantian -探听tanting -贪图tantu -谈吐tantu -滩涂tantu -探望tanwang -探问tanwen -贪污tanwu -叹息tanxi -探险tanxian -谈心tanxin -弹性tanxing -探询tanxun -贪赃tanzang -套tao -讨tao -逃tao -陶tao -萄tao -桃tao -掏tao -涛tao -滔tao -绦tao -淘tao -鼗tao -叨*tao -啕tao -洮tao -韬tao -焘tao -饕tao -逃奔taoben -逃避taobi -逃兵taobing -逃窜taocuan -逃遁taodun -讨伐taofa -讨饭taofan -套购taogou -讨好taohao -讨还taohuan -讨价taojia -桃李taoli -韬略taolue -讨论taolun -逃命taoming -逃难taonan -逃跑taopao -淘气taoqi -逃生taosheng -淘汰taotai -滔滔taotao -逃脱taotuo -逃亡taowang -讨厌taoyan -陶冶taoye -桃子taozi -逃走taozou -陶醉taozui -踏青taqing -他人taren -踏实tashi -他说tashuo -他乡taxiang -挑拨离间tblj -台北市tbs -贪便宜tby -统筹兼顾tcjg -铁道部tdb -土地改革tdgg -同等学历tdxl -特te -忒te -忑te -慝*te -铽te -特别tebie -特产techan -特长techang -特出techu -特此teci -特大teda -特等tedeng -特地tedi -特点tedian -特定teding -特级teji -特技teji -特急teji -特将tejiang -特刊tekan -特快tekuai -特例teli -腾teng -疼teng -藤teng -誊teng -滕teng -疼爱tengai -腾达tengda -誊写tengxie -特派tepai -特区tequ -特权tequan -托儿所tes -特色tese -特使teshi -特殊teshu -特为tewei -特务tewu -特效texiao -特写texie -特性texing -特邀teyao -特意teyi -特有teyou -特约teyue -特征tezheng -特制tezhi -特种tezhong -突飞猛进tfmj -铁饭碗tfw -同甘共苦tggk -提货单thd -谈何容易thry -提ti -题ti -体ti -替ti -梯ti -惕ti -剔ti -踢ti -锑ti -蹄ti -啼ti -嚏ti -涕ti -剃ti -屉ti -倜ti -荑*ti -悌ti -逖ti -绨*ti -缇ti -鹈ti -裼ti -醍ti -天tian -田tian -添tian -填tian -甜tian -佃*tian -恬tian -舔tian -腆tian -掭tian -忝tian -阗tian -殄tian -畋tian -填报tianbao -天边tianbian -填表tianbiao -填补tianbu -天才tiancai -天长tianchang -填充tianchong -天地tiandi -田地tiandi -天鹅tiane -天府tianfu -天赋tianfu -天机tianji -天际tianji -添加tianjia -天津tianjin -恬静tianjing -天空tiankong -填空tiankong -天理tianli -天良tianliang -天亮tianliang -甜美tianmei -甜蜜tianmi -天明tianming -天平tianping -天气tianqi -天桥tianqiao -天然tianran -天壤tianrang -天色tianse -天上tianshang -天生tiansheng -天使tianshi -天堂tiantang -天体tianti -天天tiantian -甜头tiantou -天文tianwen -天下tianxia -天险tianxian -天仙tianxian -天性tianxing -天涯tianya -田野tianye -天真tianzhen -天职tianzhi -添置tianzhi -天资tianzi -条tiao -调*tiao -跳tiao -挑tiao -迢tiao -眺tiao -佻tiao -苕*tiao -祧tiao -窕tiao -蜩tiao -笤tiao -粜tiao -龆tiao -鲦tiao -髫tiao -挑拔tiaoba -跳动tiaodong -挑动tiaodong -挑逗tiaodou -跳高tiaogao -调和tiaohe -调剂tiaoji -条件tiaojian -调解tiaojie -调节tiaojie -条款tiaokuan -调理tiaoli -条理tiaoli -条例tiaoli -条令tiaoling -调配tiaopei -挑剔tiaoti -调停tiaoting -条文tiaowen -跳舞tiaowu -调戏tiaoxi -挑衅tiaoxin -挑选tiaoxuan -条约tiaoyue -挑战tiaozhan -调整tiaozheng -条子tiaozi -提拨tibo -题材ticai -体裁ticai -体操ticao -体察ticha -提倡tichang -提成ticheng -提出tichu -剔除tichu -题词tici -替代tidai -梯队tidui -铁tie -贴tie -帖tie -萜tie -餮tie -贴补tiebu -铁道tiedao -贴近tiejin -铁路tielu -贴切tieqie -贴身tieshen -铁证tiezheng -提法tifa -提防tifang -提纲tigang -提高tigao -体格tige -提供tigong -替换tihuan -体会tihui -提货tihuo -体积tiji -提价tijia -体力tili -体例tili -提炼tilian -体谅tiliang -体面timian -提名timing -题名timing -题目timu -听ting -停ting -庭ting -挺ting -廷ting -厅ting -烃ting -汀ting -亭ting -艇ting -莛ting -葶ting -婷ting -梃ting -町*ting -铤ting -蜓ting -霆ting -挺拔tingba -停办tingban -停泊tingbo -停产tingchan -听从tingcong -停顿tingdun -停工tinggong -挺括tinggua -听候tinghou -听话tinghua -停火tinghuo -听见tingjian -厅局tingju -听觉tingjue -停留tingliu -听凭tingping -听取tingqu -听任tingren -听说tingshuo -听信tingxin -厅长tingzhang -停止tingzhi -停职tingzhi -停滞tingzhi -听众tingzhong -提起tiqi -提前tiqian -提取tiqu -提升tisheng -提示tishi -体坛titan -体贴titie -提问tiwen -体温tiwen -体系tixi -体现tixian -体型tixing -提醒tixing -体验tiyan -提要tiyao -提议tiyi -体育tiyu -体制tizhi -体质tizhi -题字tizi -统计表tjb -条件反射tjfs -讨价还价tjhj -天津市tjs -条件下tjx -讨论会tlh -拖拉机tlj -他们的tmd -同盟会tmh -天南地北tndb -同tong -通tong -统tong -铜tong -痛tong -筒tong -童tong -桶tong -侗*tong -恫*tong -桐tong -酮tong -瞳tong -彤tong -捅tong -佟tong -仝tong -垌*tong -茼tong -嗵tong -峒*tong -恸tong -潼tong -砼tong -同伴tongban -同胞tongbao -通报tongbao -同辈tongbei -通病tongbing -同步tongbu -通常tongchang -通称tongcheng -统称tongcheng -痛斥tongchi -统筹tongchou -痛楚tongchu -同窗tongchuang -同道tongdao -通道tongdao -同等tongdeng -通电tongdian -通牒tongdie -通读tongdu -通告tonggao -统购tonggou -通过tongguo -通航tonghang -痛恨tonghen -同化tonghua -通话tonghua -童话tonghua -痛悔tonghui -通婚tonghun -统计tongji -通辑tongji -痛击tongji -同居tongju -痛苦tongku -痛哭tongku -痛快tongkuai -同僚tongliao -通令tongling -同盟tongmeng -同年tongnian -童年tongnian -同期tongqi -通气tongqi -同情tongqing -通融tongrong -同上tongshang -通商tongshang -同时tongshi -同事tongshi -统属tongshu -统帅tongshuai -通顺tongshun -通俗tongsu -通往tongwang -痛恶tongwu -痛惜tongxi -统辖tongxia -通向tongxiang -同乡tongxiang -统销tongxiao -通宵tongxiao -通晓tongxiao -同心tongxin -痛心tongxin -通信tongxin -同行tongxing -通行tongxing -同性tongxing -同学tongxue -通讯tongxun -同样tongyang -统一tongyi -同意tongyi -通用tongyong -通邮tongyou -统战tongzhan -同志tongzhi -统治tongzhi -通知tongzhi -头tou -投tou -透tou -偷tou -钭tou -骰tou -投案touan -头版touban -投奔touben -投标toubiao -投产touchan -透彻touche -头等toudeng -投放toufang -投机touji -投靠toukao -投篮toulan -偷懒toulan -头颅toulu -透露toulu -头面toumian -透明touming -头目toumu -头脑tounao -投票toupiao -透气touqi -投入touru -投身toushen -透视toushi -头痛toutong -偷闲touxian -投降touxiang -头绪touxu -投影touying -投掷touzhi -头子touzi -投资touzi -突破口tpk -太平洋tpy -通情达理tqdl -天气预报tqyb -突然袭击trxj -妥善处理tscl -通俗读物tsdw -挺身而出tsec -图书馆tsg -滔滔不绝ttbj -痛痛快快ttkk -团体赛tts -踏踏实实ttss -图tu -土tu -突tu -途tu -徒tu -凸tu -涂tu -吐tu -兔tu -屠tu -秃tu -堍tu -荼tu -菟tu -钍tu -酴tu -团tuan -湍tuan -抟tuan -彖tuan -疃tuan -图案tuan -湍急tuanji -团结tuanjie -团聚tuanju -湍流tuanliu -团体tuanti -团员tuanyuan -团圆tuanyuan -团长tuanzhang -突变tubian -图表tubiao -土产tuchan -突出tuchu -土地tudi -徒弟tudi -土匪tufei -土改tugai -涂改tugai -图画tuhua -土话tuhua -推tui -退tui -腿tui -颓tui -蜕tui -褪tui -忒*tui -煺tui -蜕变tuibian -退步tuibu -推测tuice -推迟tuichi -推崇tuichong -退出tuichu -推导tuidao -推动tuidong -推断tuiduan -推翻tuifan -颓废tuifei -推广tuiguang -退化tuihua -蜕化tuihua -退回tuihui -推荐tuijian -推进tuijin -推举tuiju -推开tuikai -推理tuili -推论tuilun -推敲tuiqiao -推却tuique -退却tuique -推让tuirang -退让tuirang -颓丧tuisang -退色tuise -推算tuisuan -退缩tuisuo -颓唐tuitang -推托tuituo -退伍tuiwu -推向tuixiang -推销tuixiao -推卸tuixie -推行tuixing -退休tuixiu -退学tuixue -推移tuiyi -退职tuizhi -突击tuji -图解tujie -途径tujing -徒劳tulao -图例tuli -吐露tulu -囤*tun -褪*tun -吞tun -屯tun -臀tun -氽tun -饨tun -暾tun -豚tun -吞并tunbing -吞没tunmo -吞吐tuntu -脱tuo -拖tuo -托tuo -妥tuo -椭tuo -舵*tuo -魄*tuo -鸵tuo -陀tuo -驮tuo -驼tuo -拓tuo -唾tuo -乇tuo -佗tuo -坨tuo -庹tuo -沱tuo -柝tuo -柁*tuo -橐tuo -砣tuo -铊*tuo -箨tuo -酡tuo -跎tuo -鼍tuo -驼背tuobei -拓补tuobu -脱出tuochu -妥当tuodang -脱轨tuogui -拓荒tuohuang -脱节tuojie -拖拉tuola -脱离tuoli -唾骂tuoma -唾弃tuoqi -妥善tuoshan -脱身tuoshen -妥协tuoxie -拖延tuoyan -唾液tuoye -图片tupian -突破tupo -突起tuqi -突然turan -徒然turan -土壤turang -屠杀tusha -徒手tushou -图书tushu -吐痰tutan -突围tuwei -突兀tuwu -图象tuxiang -图像tuxiang -图形tuxing -徒刑tuxing -图章tuzhang -图纸tuzhi -途中tuzhong -土著tuzhu -秃子tuzi -贪污盗窃twdq -台湾省tws -贪污受贿twsh -提心吊胆txdd -通讯社txs -同心同德txtd -同心协力txxl -推心置腹txzf -体育场tyc -体育锻炼tydl -体育馆tyg -腾云驾雾tyjw -太阳能tyn -太原市tys -天衣无缝tywf -通用性tyx -体育运动tyyd -团支部tzb -停滞不前tzbq -同志们tzm -天灾人祸tzrh -听之任之tzrz -通知书tzs -为w -我w -无w -问w -外w -五w -位w -物w -委w -完w -温w -万w -文w -往w -武w -务w -王w -围w -误w -晚w -瓦wa -挖wa -凹*wa -哇wa -蛙wa -洼wa -娃wa -袜wa -佤wa -娲wa -腽wa -外wai -歪wai -外币waibi -外边waibian -外表waibiao -外宾waibin -外部waibu -外传waichuan -外存waicun -外地waidi -外调waidiao -歪风waifeng -外观waiguan -外国waiguo -外行waihang -外汇waihui -外加waijia -外交waijiao -外界waijie -外景waijing -外科waike -外快waikuai -外流wailiu -外貌waimao -外贸waimao -外面waimian -外勤waiqin -歪曲waiqu -外商waishang -外伤waishang -外设waishe -外省waisheng -外甥waisheng -外事waishi -外围waiwei -外文waiwen -外线waixian -外销waixiao -歪斜waixie -外延waiyan -外因waiyin -外语waiyu -外援waiyuan -外在waizai -外债waizhai -外资waizi -瓦解wajie -挖掘wajue -挖苦waku -瓦砾wali -完wan -万wan -晚wan -弯wan -碗wan -顽wan -湾wan -挽wan -玩wan -蔓*wan -娩*wan -豌wan -丸wan -烷wan -皖wan -惋wan -宛wan -婉wan -腕wan -剜wan -芄wan -莞*wan -菀wan -纨wan -绾wan -琬wan -脘wan -畹wan -蜿wan -万般wanban -晚报wanbao -完备wanbei -完毕wanbi -完成wancheng -万代wandai -顽敌wandi -万吨wandun -万恶wane -万分wanfen -往wang -王wang -望wang -网wang -忘wang -妄wang -亡wang -旺wang -芒*wang -汪wang -枉wang -罔wang -尢wang -惘wang -辋wang -魍wang -往常wangchang -王朝wangchao -忘掉wangdiao -妄动wangdong -枉法wangfa -往返wangfan -枉费wangfei -往复wangfu -王国wangguo -亡国wangguo -往后wanghou -忘怀wanghuai -忘记wangji -旺季wangji -往来wanglai -网络wangluo -亡命wangming -往年wangnian -完工wangong -忘却wangque -枉然wangran -惘然wangran -往日wangri -旺盛wangsheng -往事wangshi -妄图wangtu -万古wangu -顽固wangu -往往wangwang -汪汪wangwang -忘我wangwo -往昔wangxi -妄想wangxiang -汪洋wangyang -望远wangyuan -王子wangzi -完好wanhao -晚会wanhui -挽回wanhui -晚婚wanhun -晚间wanjian -完结wanjie -挽救wanjiu -玩具wanju -顽抗wankang -完了wanle -挽力wanli -弯路wanlu -完美wanmei -万能wanneng -万年wannian -晚年wannian -玩弄wannong -晚期wanqi -顽强wanqiang -弯曲wanqu -完全wanquan -完善wanshan -晚上wanshang -玩赏wanshang -万事wanshi -万世wanshi -玩耍wanshua -万岁wansui -万万wanwan -万物wanwu -晚霞wanxia -万象wanxiang -玩笑wanxiao -万幸wanxing -婉言wanyan -万一wanyi -万元wanyuan -完整wanzheng -顽症wanzheng -万众wanzhong -宛转wanzhuan -瓦斯wasi -瓦特wate -娃娃wawa -外部设备wbsb -微不足道wbzd -无产阶级wcjj -微处理机wclj -无产者wcz -为wei -位wei -委wei -围wei -维wei -唯wei -卫wei -微wei -伟wei -未wei -威wei -危wei -尾wei -谓wei -喂wei -味wei -胃wei -魏wei -伪wei -遗*wei -违wei -韦wei -畏wei -纬wei -巍wei -桅wei -惟wei -潍wei -苇wei -萎wei -蔚wei -渭wei -尉wei -慰wei -偎wei -诿wei -隈wei -隗*wei -圩*wei -葳wei -薇wei -囗wei -帏wei -帷wei -崴wei -嵬wei -猥wei -猬wei -闱wei -沩wei -洧wei -涠wei -逶wei -娓wei -玮wei -韪wei -軎wei -炜wei -煨wei -痿wei -艉wei -鲔wei -尾巴weiba -违背weibei -未必weibi -威逼weibi -微波weibo -微薄weibo -未曾weiceng -未尝weichang -维持weichi -为此weici -伟大weida -味道weidao -纬度weidu -唯独weidu -巍峨weie -违法weifa -违反weifan -违犯weifan -威风weifeng -桅杆weigan -微观weiguan -危害weihai -为何weihe -维护weihu -危及weiji -微机weiji -危机weiji -危急weiji -围歼weijian -围剿weijiao -慰藉weijie -违禁weijin -未经weijing -畏惧weiju -违抗weikang -未可weike -唯恐weikong -惟恐weikong -胃口weikou -未来weilai -慰劳weilao -为了weile -威力weili -委靡weimi -未免weimian -微妙weimiao -帷幕weimu -危难weinan -畏难weinan -未能weineng -委派weipai -为期weiqi -畏怯weiqie -委曲weiqu -委屈weiqu -未然weiran -巍然weiran -围绕weirao -伟人weiren -委任weiren -微弱weiruo -威慑weishe -为生weisheng -卫生weisheng -尾声weisheng -卫士weishi -威势weishi -为首weishou -为数weishu -尾随weisui -未遂weisui -畏缩weisuo -萎缩weisuo -猥琐weisuo -委托weituo -委婉weiwan -危亡weiwang -巍巍weiwei -慰问weiwen -唯物weiwu -威武weiwu -微细weixi -威吓weixia -危险weixian -微小weixiao -微笑weixiao -威协weixie -威胁weixie -猥亵weixie -维新weixin -唯心weixin -违心weixin -威信weixin -微型weixing -卫星weixing -维修weixiu -威严weiyan -伟业weiye -唯一weiyi -位移weiyi -位于weiyu -谓语weiyu -委员weiyuan -为止weizhi -位置weizhi -未知weizhi -为重weizhong -为主weizhu -伪装weizhuang -问wen -温wen -文wen -稳wen -纹wen -闻wen -蚊wen -瘟wen -吻wen -紊wen -刎wen -阌wen -汶wen -璺wen -雯wen -文本wenben -瘟病wenbing -稳步wenbu -问答wenda -稳定wending -温度wendu -嗡weng -翁weng -瓮weng -蓊weng -蕹weng -稳固wengu -问好wenhao -温和wenhe -吻合wenhe -文化wenhua -文件wenjian -稳健wenjian -问津wenjin -文静wenjing -文具wenju -文科wenke -文盲wenmang -文明wenming -闻名wenming -温暖wennuan -文凭wenping -文人wenren -温柔wenrou -问世wenshi -文坛wentan -问题wenti -文体wenti -稳妥wentuo -文物wenwu -文献wenxian -文选wenxuan -文学wenxue -问讯wenxun -闻讯wenxun -文艺wenyi -瘟疫wenyi -文娱wenyu -文摘wenzhai -文章wenzhang -稳重wenzhong -文字wenzi -问罪wenzui -望而生畏wesw -闻风而动wfed -违法乱纪wflj -歪风邪气wfxq -温故知新wgzx -文化部whb -文汇报whb -文化馆whg -文化宫whg -武汉市whs -五湖四海whsh -忘乎所以whsy -问寒问暖whwn -文化娱乐whyl -玩忽职守whzs -外交部wjb -无纪律wjl -五讲四美wjsm -无拘无束wjws -无可奉告wkfg -无可非议wkfy -无可奈何wknh -乌鲁木齐wlmq -无理取闹wlqn -无论如何wlrh -物美价廉wmjl -误码率wml -文明礼貌wmlm -无名英雄wmyx -无能为力wnwl -我wo -握wo -窝wo -蜗wo -涡wo -沃wo -挝wo -卧wo -斡wo -倭wo -莴wo -喔wo -幄wo -渥wo -肟wo -硪wo -龌wo -窝藏wocang -卧床wochuang -我党wodang -卧倒wodao -我的wode -窝工wogong -我国woguo -我军wojun -我们women -窝囊wonang -我省wosheng -我校woxiao -为期不远wqby -无穷无尽wqwj -误入歧途wrqt -卫生部wsb -纹丝不动wsbd -万事大吉wsdj -万事俱备wsjb -为什么wsm -无所谓wsw -为所欲为wsyw -无所作为wszw -无wu -五wu -物wu -武wu -务wu -误wu -伍wu -舞wu -污wu -悟wu -雾wu -午wu -恶*wu -屋wu -乌wu -吴wu -亡*wu -诬wu -钨wu -巫wu -呜wu -芜wu -梧wu -吾wu -毋wu -捂wu -侮wu -坞wu -戊wu -晤wu -勿wu -兀wu -仵wu -阢wu -邬wu -圬wu -芴wu -唔wu -庑wu -怃wu -忤wu -浯wu -寤wu -迕wu -妩wu -婺wu -骛wu -杌wu -牾wu -於*wu -焐wu -鹉wu -鹜wu -痦wu -蜈wu -鋈wu -鼯wu -吾辈wubei -无比wubi -五笔wubi -务必wubi -舞弊wubi -无边wubian -无不wubu -五彩wucai -误差wucha -无常wuchang -无偿wuchang -舞场wuchang -武昌wuchang -无耻wuchi -无从wucong -武打wuda -舞蹈wudao -无敌wudi -舞动wudong -武斗wudou -武断wuduan -无法wufa -无妨wufang -无非wufei -武功wugong -污垢wugou -无故wugu -无关wuguan -五官wuguan -武官wuguan -无害wuhai -诬害wuhai -武汉wuhan -无何wuhe -乌黑wuhei -五湖wuhu -呜呼wuhu -误会wuhui -舞会wuhui -污秽wuhui -无及wuji -无机wuji -物价wujia -无间wujian -物件wujian -误解wujie -五届wujie -五金wujin -无愧wukui -无赖wulai -诬赖wulai -无理wuli -物理wuli -无礼wuli -物力wuli -武力wuli -无聊wuliao -无虑wulu -无论wulun -污蔑wumie -诬蔑wumie -无奈wunai -无能wuneng -毋宁wuning -务农wunong -物品wupin -无期wuqi -五七wuqi -武器wuqi -无情wuqing -无穷wuqiong -舞曲wuqu -无权wuquan -污染wuran -无任wuren -污辱wuru -侮辱wuru -物色wuse -无上wushang -误伤wushang -无声wusheng -午时wushi -务使wushi -无视wushi -误事wushi -务实wushi -无数wushu -武术wushu -无双wushuang -午睡wushui -五四wusi -无私wusi -舞台wutai -无题wuti -物体wuti -舞厅wuting -无为wuwei -无谓wuwei -无物wuwu -无暇wuxia -无限wuxian -诬陷wuxian -无效wuxiao -五星wuxing -午休wuxiu -无须wuxu -无需wuxu -务虚wuxu -午夜wuye -五一wuyi -无益wuyi -无疑wuyi -无垠wuyin -无用wuyong -毋庸wuyong -无余wuyu -无缘wuyuan -五月wuyue -物证wuzheng -无知wuzhi -物质wuzhi -武装wuzhuang -物资wuzi -兀自wuzi -误字wuzi -无罪wuzui -无微不至wwbz -唯物论wwl -卧薪尝胆wxcd -无线电wxd -微型机wxj -唯心论wxl -问心无愧wxwk -委员会wyh -无缘无故wywg -委员长wyz -误字率wzl -无足轻重wzqz -未知数wzs -完整无缺wzwq -学x -下x -行x -小x -线x -性x -新x -些x -想x -心x -向x -相x -系x -席x -现x -西x -修x -象x -先x -形x -心安理得xald -西安市xas -西半球xbq -相比之下xbzx -宣传部xcb -新陈代谢xcdx -新产品xcp -畜产品xcp -西城区xcq -喜出望外xcww -相对而言xdey -现代化xdh -想当然xdr -相对误差xdwc -先睹为快xdwk -形而上学xesx -显而易见xeyj -西方国家xfgj -消费品xfp -想方设法xfsf -先发制人xfzr -兴高采烈xgcl -新华社xhs -新华书店xhsd -系xi -席xi -西xi -习xi -细xi -吸xi -析xi -喜xi -洗xi -铣xi -稀xi -戏xi -隙xi -希xi -息xi -袭xi -锡xi -烯xi -牺xi -悉xi -惜xi -溪xi -腊*xi -栖*xi -昔xi -熙xi -硒xi -矽xi -晰xi -嘻xi -膝xi -夕xi -熄xi -汐xi -犀xi -檄xi -媳xi -僖xi -兮xi -隰xi -郗xi -茜*xi -菥xi -葸xi -蓰xi -奚xi -唏xi -徙xi -饩xi -阋xi -浠xi -淅xi -屣xi -嬉xi -玺xi -樨xi -曦xi -觋xi -欷xi -歙*xi -熹xi -禊xi -禧xi -皙xi -穸xi -裼*xi -蜥xi -螅xi -蟋xi -舄xi -舾xi -羲xi -粞xi -翕xi -醯xi -蹊*xi -鼷xi -下xia -夏xia -吓xia -狭xia -霞xia -唬*xia -瞎xia -虾xia -匣xia -辖xia -暇xia -峡xia -侠xia -厦xia -呷xia -狎xia -遐xia -瑕xia -柙xia -硖xia -瘕*xia -罅xia -黠xia -狭隘xiaai -下班xiaban -下辈xiabei -下边xiabian -下策xiace -下层xiaceng -下场xiachang -下沉xiachen -下次xiaci -瑕疵xiaci -下达xiada -吓倒xiadao -下等xiadeng -下毒xiadu -下发xiafa -下放xiafang -峡谷xiagu -霞光xiaguang -瞎话xiahua -喜爱xiai -下级xiaji -下集xiaji -夏季xiaji -下降xiajiang -侠客xiake -下来xialai -下联xialian -夏粮xialiang -下列xialie -下令xialing -下流xialiu -下落xialuo -下马xiama -厦门xiamen -下面xiamian -线xian -现xian -先xian -县xian -限xian -见*xian -显xian -鲜xian -献xian -险xian -陷xian -宪xian -纤xian -洗*xian -掀xian -弦xian -铣*xian -腺xian -锨xian -仙xian -咸xian -贤xian -衔xian -舷xian -闲xian -涎xian -嫌xian -馅xian -羡xian -冼xian -苋xian -莶xian -藓xian -岘xian -猃xian -暹xian -娴xian -氙xian -燹xian -祆xian -鹇xian -痫xian -蚬xian -筅xian -籼xian -酰xian -跣xian -跹xian -霰xian -西安xian -献宝xianbao -先辈xianbei -现场xianchang -现成xiancheng -县城xiancheng -献丑xianchou -献词xianci -现存xiancun -现代xiandai -先导xiandao -显得xiande -险地xiandi -限定xianding -限度xiandu -线段xianduan -限额xiane -险恶xiane -宪法xianfa -先锋xianfeng -险峰xianfeng -想xiang -向xiang -相xiang -象xiang -响xiang -项xiang -箱xiang -乡xiang -降*xiang -香xiang -像xiang -详xiang -橡xiang -享xiang -湘xiang -厢xiang -镶xiang -襄xiang -翔xiang -祥xiang -巷xiang -芗xiang -葙xiang -饷xiang -庠xiang -骧xiang -缃xiang -蟓xiang -鲞xiang -飨xiang -相爱xiangai -相比xiangbi -想必xiangbi -相差xiangcha -相称xiangcheng -相处xiangchu -相传xiangchuan -乡村xiangcun -相当xiangdang -向导xiangdao -相等xiangdeng -相对xiangdui -想法xiangfa -相反xiangfan -相仿xiangfang -相干xianggan -香港xianggang -相隔xiangge -相关xiangguan -相好xianghao -相互xianghu -相继xiangji -相加xiangjia -相见xiangjian -相减xiangjian -相交xiangjiao -橡胶xiangjiao -相近xiangjin -详尽xiangjin -巷口xiangkou -向来xianglai -相连xianglian -向量xiangliang -响亮xiangliang -相貌xiangmao -项目xiangmu -想念xiangnian -相片xiangpian -想起xiangqi -详情xiangqing -向上xiangshang -相声xiangsheng -响声xiangsheng -相识xiangshi -翔实xiangshi -享受xiangshou -相思xiangsi -相似xiangsi -香甜xiangtian -相同xiangtong -相投xiangtou -显贵xiangui -向往xiangwang -详细xiangxi -向下xiangxia -乡下xiangxia -象限xiangxian -想象xiangxiang -相信xiangxin -香烟xiangyan -相依xiangyi -相宜xiangyi -相应xiangying -相映xiangying -响应xiangying -享用xiangyong -相遇xiangyu -相约xiangyue -乡镇xiangzhen -象征xiangzheng -箱子xiangzi -陷害xianhai -显赫xianhe -鲜红xianhong -先后xianhou -鲜花xianhua -献花xianhua -闲话xianhua -贤惠xianhui -献计xianji -献技xianji -显见xianjian -衔接xianjie -先进xianjin -现金xianjin -险境xianjing -陷阱xianjing -现款xiankuan -现况xiankuang -先例xianli -献礼xianli -先烈xianlie -线路xianlu -显露xianlu -鲜美xianmei -鲜明xianming -贤明xianming -显目xianmu -羡慕xianmu -贤能xianneng -先期xianqi -掀起xianqi -限期xianqi -嫌弃xianqi -先前xianqian -先遣xianqian -险情xianqing -先驱xianqu -显然xianran -贤人xianren -闲人xianren -现任xianren -陷入xianru -闲散xiansan -献身xianshen -先生xiansheng -先是xianshi -现实xianshi -显示xianshi -娴熟xianshu -线索xiansuo -闲谈xiantan -险滩xiantan -先天xiantian -线条xiantiao -县委xianwei -纤维xianwei -显现xianxian -现象xianxiang -现行xianxing -鲜血xianxue -显眼xianyan -鲜艳xianyan -显要xianyao -险要xianyao -显耀xianyao -现役xianyi -嫌疑xianyi -现有xianyou -限于xianyu -闲杂xianza -现在xianzai -县长xianzhang -宪章xianzhang -限制xianzhi -先知xianzhi -闲置xianzhi -闲职xianzhi -显著xianzhu -现状xianzhuang -险阻xianzu -小xiao -消xiao -削xiao -效xiao -笑xiao -校xiao -销xiao -硝xiao -萧xiao -肖xiao -孝xiao -霄xiao -哮xiao -嚣xiao -宵xiao -淆xiao -晓xiao -啸xiao -哓xiao -崤xiao -潇xiao -逍xiao -骁xiao -绡xiao -枭xiao -枵xiao -蛸*xiao -筱xiao -箫xiao -魈xiao -小报xiaobao -小辈xiaobei -笑柄xiaobing -消沉xiaochen -消除xiaochu -消毒xiaodu -效法xiaofa -小贩xiaofan -消防xiaofang -消费xiaofei -校风xiaofeng -小鬼xiaogui -效果xiaoguo -小孩xiaohai -消耗xiaohao -消化xiaohua -笑话xiaohua -小惠xiaohui -销毁xiaohui -销魂xiaohun -消极xiaoji -削减xiaojian -小结xiaojie -小姐xiaojie -孝敬xiaojing -校刊xiaokan -小康xiaokang -效劳xiaolao -效力xiaoli -销路xiaolu -效率xiaolu -消灭xiaomie -消磨xiaomo -效能xiaoneng -消气xiaoqi -消遣xiaoqian -笑容xiaorong -削弱xiaoruo -潇洒xiaosa -校舍xiaoshe -小时xiaoshi -消失xiaoshi -消逝xiaoshi -消瘦xiaoshou -销售xiaoshou -小数xiaoshu -小说xiaoshuo -萧条xiaotiao -消息xiaoxi -肖像xiaoxiang -小心xiaoxin -枭雄xiaoxiong -小学xiaoxue -效验xiaoyan -逍遥xiaoyao -效益xiaoyi -效应xiaoying -校友xiaoyou -小于xiaoyu -校园xiaoyuan -销赃xiaozang -校长xiaozhang -嚣张xiaozhang -效忠xiaozhong -小组xiaozu -下情xiaqing -下去xiaqu -辖区xiaqu -下手xiashou -夏收xiashou -下属xiashu -下水xiashui -下台xiatai -夏天xiatian -下文xiawen -下午xiawu -下限xiaxian -下乡xiaxiang -遐想xiaxiang -狭义xiayi -下游xiayou -狭窄xiazhai -夏至xiazhi -夏种xiazhong -喜报xibao -细胞xibao -西北xibei -西边xibian -稀薄xibo -锡箔xibo -西餐xican -洗涤xidi -吸毒xidu -些xie -解*xie -写xie -斜xie -谢xie -协xie -械xie -叶*xie -血*xie -卸xie -屑xie -鞋xie -歇xie -邪xie -胁xie -蟹xie -泄xie -泻xie -契*xie -楔xie -蝎xie -挟xie -携xie -谐xie -懈xie -偕xie -亵xie -勰xie -燮xie -薤xie -撷xie -獬xie -廨xie -渫xie -瀣xie -邂xie -绁xie -缬xie -榭xie -榍xie -颉*xie -躞xie -写出xiechu -协从xiecong -携带xiedai -邪道xiedao -协调xiediao -协定xieding -亵渎xiedu -邪恶xiee -协和xiehe -谐和xiehe -协会xiehui -谢绝xiejue -协力xieli -泄漏xielou -邪路xielu -泄露xielu -泄密xiemi -邪念xienian -胁迫xiepo -邪气xieqi -协商xieshang -写生xiesheng -携手xieshou -邪说xieshuo -协同xietong -歇息xiexi -谢谢xiexie -协议xieyi -谐音xieyin -协约xieyue -写照xiezhao -协助xiezhu -鞋子xiezi -写作xiezuo -协作xiezuo -西方xifang -西风xifeng -西服xifu -吸附xifu -媳妇xifu -习惯xiguan -西汉xihan -稀罕xihan -希罕xihan -喜欢xihuan -袭击xiji -细节xijie -洗劫xijie -喜剧xiju -戏剧xiju -席卷xijuan -细菌xijun -犀利xili -系列xilie -奚落xiluo -熄灭ximie -新xin -心xin -信xin -锌xin -芯xin -辛xin -寻*xin -欣xin -薪xin -忻xin -衅xin -囟xin -馨xin -昕xin -歆xin -镡*xin -鑫xin -心爱xinai -西南xinan -新春xinchun -信贷xindai -心得xinde -心烦xinfan -心服xinfu -信服xinfu -行xing -性xing -形xing -型xing -星xing -兴xing -省*xing -醒xing -姓xing -幸xing -腥xing -猩xing -惺xing -刑xing -邢xing -杏xing -陉xing -荇xing -荥xing -擤xing -饧xing -悻xing -硎xing -心甘xingan -兴办xingban -性别xingbie -姓别xingbie -刑场xingchang -星辰xingchen -形成xingcheng -行程xingcheng -行动xingdong -幸而xinger -刑法xingfa -刑罚xingfa -兴奋xingfen -幸福xingfu -性格xingge -幸好xinghao -型号xinghao -行贿xinghui -星火xinghuo -性急xingji -形迹xingji -兴建xingjian -行径xingjing -行军xingjun -星空xingkong -幸亏xingkui -行李xingli -行旅xinglu -幸免xingmian -性命xingming -姓名xingming -醒目xingmu -性能xingneng -行期xingqi -兴起xingqi -星期xingqi -性情xingqing -星球xingqiu -兴趣xingqu -形容xingrong -行商xingshang -兴盛xingsheng -行使xingshi -行事xingshi -行驶xingshi -形式xingshi -幸事xingshi -刑事xingshi -形势xingshi -姓氏xingshi -行署xingshu -兴衰xingshuai -形态xingtai -形体xingti -兴亡xingwang -兴旺xingwang -行为xingwei -行文xingwen -醒悟xingwu -形象xingxiang -行销xingxiao -星星xingxing -行凶xingxiong -兴修xingxiu -行业xingye -星夜xingye -幸运xingyun -行政xingzheng -性质xingzhi -兴致xingzhi -形状xingzhuang -行走xingzou -信号xinhao -心狠xinhen -心慌xinhuang -信汇xinhui -细腻xini -西宁xining -心急xinji -信件xinjian -新疆xinjiang -新近xinjin -新居xinju -心坎xinkan -辛苦xinku -信赖xinlai -辛劳xinlao -心理xinli -心里xinli -心灵xinling -心目xinmu -信念xinnian -戏弄xinong -新奇xinqi -辛勤xinqin -心情xinqing -新区xinqu -新人xinren -信任xinren -欣赏xinshang -新生xinsheng -心声xinsheng -新事xinshi -新式xinshi -新书xinshu -薪水xinshui -心酸xinsuan -辛酸xinsuan -心疼xinteng -心田xintian -心跳xintiao -心头xintou -欣慰xinwei -新闻xinwen -心细xinxi -信息xinxi -欣喜xinxi -新鲜xinxian -心想xinxiang -信箱xinxiang -馨香xinxiang -信心xinxin -新型xinxing -新星xinxing -新兴xinxing -心虚xinxu -心血xinxue -信仰xinyang -心意xinyi -新异xinyi -新颖xinying -信用xinyong -新余xinyu -信誉xinyu -心愿xinyuan -心脏xinzang -新址xinzhi -心中xinzhong -雄xiong -胸xiong -兄xiong -凶xiong -熊xiong -匈xiong -汹xiong -芎xiong -雄辩xiongbian -雄兵xiongbing -凶残xiongcan -兄弟xiongdi -凶恶xionge -雄关xiongguan -凶狠xionghen -雄厚xionghou -胸怀xionghuai -雄健xiongjian -胸口xiongkou -熊猫xiongmao -凶猛xiongmeng -匈奴xiongnu -凶器xiongqi -凶杀xiongsha -雄师xiongshi -凶手xiongshou -胸膛xiongtang -雄伟xiongwei -雄心xiongxin -汹涌xiongyong -雄壮xiongzhuang -雄姿xiongzi -西欧xiou -习气xiqi -吸气xiqi -喜气xiqi -稀奇xiqi -希奇xiqi -喜庆xiqing -吸取xiqu -戏曲xiqu -昔日xiri -牺牲xisheng -西式xishi -喜事xishi -稀释xishi -吸收xishou -系数xishu -洗刷xishua -吸吮xishun -习俗xisu -习题xiti -西天xitian -系统xitong -修xiu -锈xiu -休xiu -袖xiu -秀xiu -朽xiu -宿*xiu -臭*xiu -羞xiu -嗅xiu -绣xiu -咻xiu -岫xiu -馐xiu -庥xiu -溴xiu -鸺xiu -貅xiu -髹xiu -修补xiubu -秀才xiucai -羞耻xiuchi -修辞xiuci -修订xiuding -修复xiufu -修改xiugai -修建xiujian -修剪xiujian -嗅觉xiujue -休克xiuke -羞愧xiukui -修理xiuli -秀丽xiuli -秀气xiuqi -羞辱xiuru -羞涩xiuse -修饰xiushi -休息xiuxi -休想xiuxiang -修养xiuyang -休养xiuyang -修造xiuzao -袖章xiuzhang -袖珍xiuzhen -修正xiuzheng -修筑xiuzhu -希望xiwang -席位xiwei -细微xiwei -西文xiwen -檄文xiwen -细小xixiao -细心xixin -悉心xixin -喜讯xixun -吸烟xiyan -西洋xiyang -西医xiyi -吸引xiyin -希有xiyou -戏院xiyuan -喜悦xiyue -西藏xizang -洗澡xizao -细则xize -细致xizhi -习作xizuo -下基层xjc -现阶段xjd -新技术xjs -献计献策xjxc -先见之明xjzm -兴利除弊xlcb -系列化xlh -稀里糊涂xlht -狭路相逢xlxf -畜牧业xmy -心满意足xmyz -西宁市xns -小朋友xpy -向前看xqk -喜气洋洋xqyy -先人后己xrhj -兴师动众xsdz -销售额xse -刑事犯罪xsfz -小时候xsh -新时期xsq -新生事物xssw -形式主义xszy -相提并论xtbl -续xu -许xu -须xu -需xu -序xu -虚xu -絮xu -畜xu -叙xu -蓄xu -绪xu -徐xu -墟xu -戌xu -嘘xu -酗xu -旭xu -恤xu -婿xu -吁*xu -诩xu -勖xu -圩xu -蓿xu -洫xu -浒*xu -溆xu -顼xu -栩xu -煦xu -砉*xu -盱xu -胥xu -糈xu -醑xu -选xuan -旋xuan -宣xuan -悬xuan -玄xuan -券*xuan -轩xuan -喧xuan -癣xuan -眩xuan -绚xuan -儇xuan -谖xuan -萱xuan -揎xuan -泫xuan -渲xuan -漩xuan -璇xuan -楦xuan -暄xuan -炫xuan -煊xuan -碹xuan -铉xuan -镟xuan -痃xuan -悬案xuanan -轩昂xuanang -选拔xuanba -宣布xuanbu -选材xuancai -选场xuanchang -宣称xuancheng -宣传xuanchuan -选定xuanding -宣读xuandu -宣告xuangao -选购xuangou -悬挂xuangua -玄乎xuanhu -喧哗xuanhua -选集xuanji -宣讲xuanjiang -选举xuanju -绚烂xuanlan -绚丽xuanli -选录xuanlu -旋律xuanlu -选民xuanmin -喧闹xuannao -悬念xuannian -选派xuanpai -宣判xuanpan -选配xuanpei -选票xuanpiao -选区xuanqu -选取xuanqu -喧嚷xuanrang -宣誓xuanshi -选手xuanshou -悬殊xuanshu -旋涡xuanwo -玄虚xuanxu -悬崖xuanya -宣言xuanyan -宣扬xuanyang -炫耀xuanyao -选用xuanyong -选择xuanze -宣战xuanzhan -选种xuanzhong -旋转xuanzhuan -许多xuduo -学xue -血xue -削*xue -雪xue -穴xue -靴xue -薛xue -谑xue -噱*xue -泶xue -踅xue -鳕xue -学报xuebao -学部xuebu -学潮xuechao -学费xuefei -学风xuefeng -学府xuefu -血汗xuehan -学好xuehao -学会xuehui -学籍xueji -血迹xueji -学科xueke -血泪xuelei -学历xueli -学龄xueling -学年xuenian -学派xuepai -学期xueqi -血肉xuerou -学生xuesheng -学时xueshi -学识xueshi -学士xueshi -学术xueshu -血书xueshu -学说xueshuo -血统xuetong -学徒xuetu -学位xuewei -学问xuewen -学习xuexi -血洗xuexi -学校xuexiao -血压xueya -学业xueye -血液xueye -学友xueyou -学员xueyuan -学院xueyuan -血晕xueyun -血战xuezhan -学者xuezhe -学制xuezhi -虚构xugou -序号xuhao -蓄积xuji -虚假xujia -叙旧xujiu -许可xuke -序列xulie -绪论xulun -虚名xuming -序幕xumu -畜牧xumu -训xun -旬xun -迅xun -讯xun -寻xun -循xun -巡xun -荤*xun -浚*xun -勋xun -熏xun -询xun -驯xun -殉xun -汛xun -逊xun -巽xun -郇*xun -埙xun -荀xun -蕈xun -薰xun -峋xun -徇xun -獯xun -恂xun -洵xun -浔xun -曛xun -窨*xun -醺xun -鲟xun -巡捕xunbu -巡查xuncha -寻常xunchang -驯服xunfu -殉国xunguo -巡航xunhang -循环xunhuan -巡回xunhui -虚拟xuni -寻机xunji -巡警xunjing -勋爵xunjue -训练xunlian -巡逻xunluo -迅猛xunmeng -寻求xunqiu -逊色xunse -巡视xunshi -徇私xunsi -迅速xunsu -熏陶xuntao -许诺xunuo -讯问xunwen -询问xunwen -寻衅xunxin -循序xunxu -勋章xunzhang -寻找xunzhao -殉职xunzhi -寻址xunzhi -需求xuqiu -序曲xuqu -虚荣xurong -虚弱xuruo -虚设xushe -叙事xushi -虚实xushi -序数xushu -虚数xushu -叙述xushu -叙说xushuo -虚伪xuwei -虚心xuxin -序言xuyan -需要xuyao -须臾xuyu -许愿xuyuan -须知xuzhi -宣武区xwq -信息处理xxcl -循序见进xxjj -辛辛苦苦xxkk -信息量xxl -熙熙攘攘xxrr -小学生xxs -欣欣向荣xxxr -小心翼翼xxyy -下一步xyb -胸有成竹xycz -洗衣机xyj -小意思xys -习以为常xywc -新颖性xyx -兴致勃勃xzbb -新中国xzg -行政区域xzqy -雪中送炭xzst -心中无数xzws -选择性xzx -心中有数xzys -行之有效xzyx -一y -有y -用y -要y -以y -于y -也y -样y -义y -与y -由y -压y -员y -月y -意y -又y -运y -原y -油y -验y -压ya -亚ya -呀ya -牙ya -芽ya -雅ya -蚜ya -鸭ya -匹*ya -押ya -鸦ya -丫ya -崖ya -衙ya -涯ya -哑ya -讶ya -伢ya -垭ya -揠ya -岈ya -迓ya -娅ya -琊ya -桠ya -氩ya -砑ya -睚ya -痖ya -哑巴yaba -牙齿yachi -压倒yadao -压服yafu -牙关yaguan -雅观yaguan -压价yajia -押金yajin -亚军yajun -压力yali -验yan -研yan -严yan -眼yan -言yan -盐yan -演yan -岩yan -沿yan -烟yan -延yan -掩yan -宴yan -炎yan -颜yan -燕yan -衍yan -铅*yan -焉yan -咽yan -阉yan -淹yan -蜒yan -阎yan -奄yan -艳yan -堰yan -厌yan -砚yan -雁yan -唁yan -彦yan -焰yan -谚yan -殷*yan -厣yan -赝yan -剡*yan -俨yan -偃yan -兖yan -谳yan -阽*yan -郾yan -鄢yan -芫*yan -菸yan -崦yan -恹yan -闫yan -阏yan -湮yan -滟yan -妍yan -嫣yan -琰yan -檐yan -晏yan -胭yan -腌*yan -焱yan -罨yan -筵yan -酽yan -魇yan -餍yan -鼹yan -沿岸yanan -严办yanban -掩蔽yanbi -演变yanbian -烟草yancao -延长yanchang -演唱yanchang -严惩yancheng -延迟yanchi -演出yanchu -唁电yandian -严冬yandong -厌恶yane -厌烦yanfan -样yang -养yang -氧yang -扬yang -洋yang -阳yang -羊yang -秧yang -央yang -杨yang -仰yang -殃yang -鸯yang -佯yang -疡yang -痒yang -漾yang -徉yang -怏yang -泱yang -炀yang -烊yang -恙yang -蛘yang -鞅yang -掩盖yangai -样板yangban -样本yangben -洋财yangcai -养成yangcheng -沿革yange -严格yange -阳光yangguang -洋行yanghang -养护yanghu -氧化yanghua -养料yangliao -杨柳yangliu -仰面yangmian -殃民yangmin -仰慕yangmu -样品yangpin -洋气yangqi -扬弃yangqi -央求yangqiu -养伤yangshang -样式yangshi -阳台yangtai -眼光yanguang -仰望yangwang -洋务yangwu -洋相yangxiang -扬言yangyan -样样yangyang -洋溢yangyi -养育yangyu -养殖yangzhi -样子yangzi -沿海yanhai -严寒yanhan -眼红yanhong -咽喉yanhou -掩护yanhu -眼花yanhua -延缓yanhuan -宴会yanhui -焰火yanhuo -演讲yanjiang -眼界yanjie -严禁yanjin -严谨yanjin -眼镜yanjing -眼睛yanjing -研究yanjiu -严峻yanjun -眼看yankan -严酷yanku -眼眶yankuang -眼泪yanlei -眼力yanli -严厉yanli -艳丽yanli -眼帘yanlian -眼亮yanliang -言路yanlu -沿路yanlu -言论yanlun -掩埋yanmai -严密yanmi -严明yanming -烟幕yanmu -延年yannian -延期yanqi -眼前yanqian -宴请yanqing -俨然yanran -炎热yanre -眼色yanse -颜色yanse -延伸yanshen -岩石yanshi -演示yanshi -掩饰yanshi -验收yanshou -严守yanshou -延寿yanshou -演说yanshuo -严肃yansu -演算yansuan -言谈yantan -研讨yantao -沿途yantu -阎王yanwang -延误yanwu -烟雾yanwu -宴席yanxi -筵席yanxi -演习yanxi -沿袭yanxi -眼下yanxia -沿线yanxian -言行yanxing -严刑yanxing -延续yanxu -艳阳yanyang -演义yanyi -演绎yanyi -掩映yanying -沿用yanyong -言语yanyu -演员yanyuan -厌战yanzhan -沿着yanzhe -验证yanzheng -研制yanzhi -严重yanzhong -演奏yanzou -要yao -药yao -约*yao -摇yao -腰yao -咬yao -邀yao -耀yao -陶*yao -侥*yao -疟yao -妖yao -瑶yao -尧yao -遥yao -窑yao -谣yao -姚yao -舀yao -钥*yao -夭yao -爻yao -吆yao -崾yao -徭yao -幺yao -珧yao -杳yao -轺yao -曜yao -肴yao -铫*yao -鹞yao -窈yao -繇yao -鳐yao -摇摆yaobai -腰包yaobao -要不yaobu -谣传yaochuan -要得yaode -要点yaodian -摇动yaodong -窑洞yaodong -遥感yaogan -妖怪yaoguai -要害yaohai -摇撼yaohan -摇晃yaohuang -要件yaojian -要紧yaojin -摇控yaokong -遥控yaokong -摇篮yaolan -要领yaoling -要么yaome -妖魔yaomo -要目yaomu -邀请yaoqing -要求yaoqiu -要塞yaosai -要是yaoshi -钥匙yaoshi -要素yaosu -窈窕yaotiao -摇头yaotou -要闻yaowen -药物yaowu -要挟yaoxie -耀眼yaoyan -谣言yaoyan -妖艳yaoyan -夭折yaozhe -要职yaozhi -鸦片yapian -压迫yapo -压强yaqiang -压缩yasuo -雅兴yaxing -压仰yayang -压抑yayi -压榨yazha -压制yazhi -雅致yazhi -亚洲yazhou -鸭子yazi -雅座yazuo -要不得ybd -一般的说ybds -一部分ybf -要不然ybr -要不是ybs -一般说来ybsl -要不要yby -一辈子ybz -一把抓ybz -用不着ybz -扬长避短ycbd -由此可见yckj -银川市ycs -与此同时ycts -有偿转让yczr -邮电部ydb -有道德ydd -邮电局ydj -一刀切ydq -运动员ydy -印度洋ydy -因地制宜ydzy -也ye -业ye -页ye -叶ye -液ye -夜ye -野ye -爷ye -冶ye -邪*ye -哗*ye -咽*ye -椰ye -噎ye -耶ye -掖ye -曳ye -腋ye -拽*ye -靥ye -谒ye -邺ye -揶ye -晔ye -烨ye -铘ye -夜餐yecan -野餐yecan -野火yehuo -业绩yeji -夜间yejian -冶金yejin -夜里yeli -冶练yelian -野蛮yeman -夜幕yemu -夜色yese -也是yeshi -夜市yeshi -野兽yeshou -液体yeti -野外yewai -夜晚yewan -业务yewu -夜校yexiao -野心yexin -野性yexing -也许yexu -幼儿园yey -爷爷yeye -野营yeying -业余yeyu -野战yezhan -叶子yezi -一方面yfm -一分为二yfwe -阳奉阴违yfyw -一概而论ygel -一国两制yglz -有根有据ygyj -严格要求ygyq -有何特长yhtc -银行帐号yhzh -炎黄子孙yhzs -一yi -以yi -义yi -意yi -已yi -移yi -医yi -议yi -依yi -易yi -乙yi -艺yi -益yi -异yi -宜yi -仪yi -亿yi -遗yi -伊yi -役yi -衣yi -疑yi -亦yi -谊yi -翼yi -译yi -抑yi -忆yi -疫yi -壹yi -揖yi -铱yi -颐yi -夷yi -胰yi -沂yi -姨yi -彝yi -椅yi -蚁yi -倚yi -矣yi -邑yi -屹yi -臆yi -逸yi -肄yi -裔yi -毅yi -溢yi -诣yi -翌yi -绎yi -刈yi -劓yi -仡*yi -佚yi -佾yi -诒yi -圯yi -埸yi -懿yi -苡yi -荑yi -薏yi -弈yi -奕yi -挹yi -弋yi -呓yi -咦yi -咿yi -嗌*yi -噫yi -峄yi -嶷yi -猗yi -饴yi -怿yi -怡yi -悒yi -漪yi -迤yi -驿yi -缢yi -殪yi -轶yi -贻yi -欹*yi -旖yi -熠yi -眙yi -钇yi -镒yi -镱yi -痍yi -瘗yi -癔yi -翊yi -蜴yi -舣yi -羿yi -翳yi -酏yi -黟yi -议案yian -疑案yian -一半yiban -一般yiban -一斑yiban -一边yibian -以便yibian -仪表yibiao -一并yibing -异步yibu -遗产yichan -异常yichang -议程yicheng -益处yichu -遗传yichuan -一次yici -依次yici -依从yicong -一代yidai -一带yidai -一旦yidan -一点yidian -一定yiding -议定yiding -移动yidong -一度yidu -遗毒yidu -一端yiduan -臆断yiduan -亿吨yidun -一发yifa -依法yifa -义愤yifen -衣服yifu -依附yifu -一概yigai -一个yige -一共yigong -议购yigou -已故yigu -一贯yiguan -异国yiguo -遗憾yihan -遗恨yihen -以后yihou -异化yihua -议会yihui -疑惑yihuo -以及yiji -异己yiji -遗迹yiji -议价yijia -意见yijian -移交yijiao -一届yijie -一经yijing -已经yijing -意境yijing -依旧yijiu -一举yiju -依据yiju -移居yiju -议决yijue -依靠yikao -倚靠yikao -一刻yike -医科yike -一块yikuai -以来yilai -依赖yilai -一览yilan -一例yili -毅力yili -屹立yili -一连yilian -意料yiliao -医疗yiliao -遗留yiliu -遗漏yilou -一律yilu -疑虑yilu -议论yilun -一面yimian -以免yimian -疫苗yimiao -移民yimin -因yin -引yin -阴yin -印yin -音yin -银yin -烟*yin -隐yin -饮yin -荫yin -茵yin -殷yin -姻yin -吟yin -淫yin -寅yin -尹yin -胤yin -鄞yin -圻*yin -垠yin -堙yin -茚yin -吲yin -喑yin -狺yin -夤yin -洇yin -湮*yin -氤yin -铟yin -瘾yin -窨yin -蚓yin -霪yin -龈yin -疑难yinan -阴暗yinan -隐蔽yinbi -音标yinbiao -隐藏yincang -阴沉yinchen -银川yinchuan -因此yinci -引导yindao -音调yindiao -印度yindu -引渡yindu -以内yinei -因而yiner -印发yinfa -音符yinfu -应ying -影ying -硬ying -营ying -英ying -映ying -迎ying -樱ying -婴ying -鹰ying -缨ying -莹ying -萤ying -荧ying -蝇ying -赢ying -盈ying -颖ying -嬴ying -郢ying -茔ying -荥*ying -莺ying -萦ying -蓥ying -撄ying -嘤ying -膺ying -滢ying -潆ying -瀛ying -瑛ying -璎ying -楹ying -媵ying -鹦ying -瘿ying -颍ying -罂ying -英镑yingbang -硬币yingbi -应变yingbian -映衬yingchen -应酬yingchou -迎春yingchun -应当yingdang -赢得yingde -婴儿yinger -营房yingfang -迎风yingfeng -应付yingfu -应该yinggai -英国yingguo -樱花yinghua -英魂yinghun -应急yingji -硬件yingjian -迎接yingjie -应届yingjie -英杰yingjie -营救yingjiu -英俊yingjun -盈亏yingkui -赢利yingli -盈利yingli -英烈yinglie -迎面yingmian -英明yingming -硬盘yingpan -影片yingpian -硬拼yingpin -影射yingshe -映射yingshe -樱桃yingtao -迎头yingtou -因果yinguo -影响yingxiang -硬性yingxing -英雄yingxiong -营养yingyang -应邀yingyao -营业yingye -应用yingyong -英勇yingyong -应有yingyou -英语yingyu -盈余yingyu -营造yingzao -应战yingzhan -迎战yingzhan -映照yingzhao -应征yingzheng -影子yingzi -英姿yingzi -银行yinhang -引号yinhao -殷红yinhong -隐患yinhuan -淫秽yinhui -阴魂yinhun -意念yinian -姨娘yiniang -阴极yinji -印鉴yinjian -引进yinjin -引力yinli -阴历yinli -阴凉yinliang -引路yinlu -隐瞒yinman -阴谋yinmou -银幕yinmu -隐慝yinni -银牌yinpai -引起yinqi -殷切yinqie -殷勤yinqin -引擎yinqing -引人yinren -饮食yinshi -印刷yinshua -饮水yinshui -因素yinsu -阴天yintian -引退yintui -因为yinwei -淫威yinwei -阴险yinxian -印象yinxiang -音响yinxiang -音信yinxin -因循yinxun -引言yinyan -阴影yinying -引用yinyong -引诱yinyou -阴雨yinyu -姻缘yinyuan -隐约yinyue -音乐yinyue -引证yinzheng -印证yinzheng -一片yipian -一瞥yipie -一起yiqi -一齐yiqi -义气yiqi -意气yiqi -仪器yiqi -遗弃yiqi -以前yiqian -一切yiqie -依然yiran -亦然yiran -毅然yiran -艺人yiren -宜人yiren -遗容yirong -以上yishang -一生yisheng -医生yisheng -一时yishi -一事yishi -意识yishi -议事yishi -逸事yishi -仪式yishi -医师yishi -医士yishi -遗失yishi -一手yishou -遗书yishu -艺术yishu -意思yisi -一体yiti -议题yiti -遗体yiti -一天yitian -一同yitong -异同yitong -一头yitou -意图yitu -疑团yituan -以外yiwai -意外yiwai -亿万yiwan -以往yiwang -遗忘yiwang -以为yiwei -意味yiwei -意文yiwen -疑问yiwen -译文yiwen -一无yiwu -义务yiwu -遗物yiwu -医务yiwu -贻误yiwu -一下yixia -以下yixia -一线yixian -一向yixiang -一项yixiang -意向yixiang -遗像yixiang -一些yixie -一心yixin -疑心yixin -异性yixing -医学yixue -一言yiyan -义演yiyan -遗言yiyan -一样yiyang -医药yiyao -意义yiyi -异议yiyi -义勇yiyong -易于yiyu -议员yiyuan -意愿yiyuan -医院yiyuan -亿元yiyuan -遗愿yiyuan -疑云yiyun -一再yizai -一早yizao -臆造yizao -依仗yizhang -仪仗yizhang -一朝yizhao -衣着yizhao -依照yizhao -一阵yizhen -一直yizhi -一致yizhi -以至yizhi -以致yizhi -意志yizhi -抑制yizhi -医治yizhi -抑止yizhi -移植yizhi -遗址yizhi -一种yizhong -遗嘱yizhu -研究会yjh -有纪律yjl -研究生yjs -研究所yjs -研究室yjs -养精畜锐yjxr -研究员yjy -拥军优属yjys -一技之长yjzc -一口气ykq -一览表ylb -以理服人ylfr -阅览室yls -有理想ylx -有利于yly -越来越yly -有目共睹ymgd -一目了然ymlr -有没有ymy -云南省yns -育*yo -哟yo -唷yo -用yong -勇yong -永yong -拥yong -涌yong -蛹yong -庸yong -佣yong -臃yong -痈yong -雍yong -踊yong -咏yong -泳yong -恿yong -俑yong -壅yong -墉yong -喁yong -慵yong -邕yong -镛yong -甬yong -鳙yong -饔yong -拥抱yongbao -永别yongbie -永不yongbu -用处yongchu -用度yongdu -用法yongfa -用费yongfei -勇敢yonggan -用功yonggong -永恒yongheng -用户yonghu -拥护yonghu -拥挤yongji -永久yongjiu -用具yongju -永诀yongjue -用力yongli -庸碌yonglu -勇猛yongmeng -用品yongpin -勇气yongqi -勇士yongshi -庸俗yongsu -咏叹yongtan -用途yongtu -涌现yongxian -用心yongxin -用意yongyi -拥有yongyou -用于yongyu -勇于yongyu -永远yongyuan -踊跃yongyue -有you -由you -又you -油you -右you -友you -优you -幼you -游you -尤you -诱you -犹you -幽you -悠you -忧you -邮you -铀you -酉you -佑you -釉you -卣you -攸you -侑you -莠you -莜you -莸you -尢*you -呦you -囿you -宥you -柚you -猷you -牖you -铕you -疣you -蚰you -蚴you -蝣you -蝤*you -繇*you -鱿you -黝you -鼬you -有碍youai -友爱youai -幽暗youan -友邦youbang -右边youbian -忧愁youchou -由此youci -有错youcuo -有待youdai -优待youdai -诱导youdao -有的youde -优等youdeng -有点youdian -邮电youdian -优点youdian -诱发youfa -有功yougong -有关youguan -有害youhai -友好youhao -优化youhua -油画youhua -幽会youhui -优惠youhui -诱惑youhuo -有机youji -游击youji -有劲youjin -幽静youjing -悠久youjiu -邮局youju -由来youlai -游览youlan -有劳youlao -有利youli -有力youli -游离youli -优良youliang -优劣youlie -幽灵youling -忧虑youlu -优美youmei -幼苗youmiao -有名youming -幽默youmo -右派youpai -诱骗youpian -邮票youpiao -尤其youqi -油漆youqi -友情youqing -右倾youqing -有趣youqu -油然youran -犹如youru -有色youse -优胜yousheng -有时youshi -有事youshi -有失youshi -优势youshi -有数youshu -油水youshui -有所yousuo -有望youwang -有为youwei -游戏youxi -有限youxian -优先youxian -悠闲youxian -有效youxiao -幼小youxiao -有些youxie -有心youxin -游行youxing -优秀youxiu -幽雅youya -悠扬youyang -又要youyao -有益youyi -优异youyi -友谊youyi -有用youyong -游泳youyong -有余youyu -由于youyu -犹豫youyu -忧郁youyu -悠远youyuan -优越youyue -有着youzhe -邮政youzheng -优质youzhi -幼稚youzhi -由衷youzhong -邮资youzi -有求必应yqby -以权谋私yqms -有气无力yqwl -迎刃而解yrej -因人而异yrey -与人为善yrws -引人注目yrzm -意识到ysd -艺术家ysj -因势利导ysld -印刷体yst -意识形态ysxt -衣食住行yszx -以身作则yszz -研讨会yth -一条龙ytl -一条心ytx -有条有理ytyl -于yu -与yu -育yu -鱼yu -雨yu -玉yu -余yu -遇yu -预yu -域yu -语yu -愈yu -渔yu -予yu -羽yu -愚yu -御yu -谷*yu -欲yu -宇yu -蔚*yu -尉*yu -迂yu -淤yu -盂yu -榆yu -虞yu -舆yu -俞yu -逾yu -愉yu -渝yu -隅yu -娱yu -屿yu -禹yu -芋yu -郁yu -吁yu -喻yu -峪yu -狱yu -誉yu -浴yu -寓yu -裕yu -豫yu -驭yu -粥*yu -禺yu -毓yu -伛yu -俣yu -谀yu -谕yu -萸yu -菀*yu -蓣yu -揄yu -圄yu -圉yu -嵛yu -狳yu -饫yu -馀yu -庾yu -阈yu -鬻yu -妪yu -妤yu -纡yu -瑜yu -昱yu -觎yu -腴yu -腧*yu -欤yu -於yu -煜yu -熨yu -燠yu -聿yu -钰yu -鹆yu -鹬yu -瘐yu -瘀yu -窬yu -窳yu -蜮yu -蝓yu -竽yu -臾yu -舁yu -雩yu -龉yu -员yuan -原yuan -圆yuan -源yuan -元yuan -远yuan -愿yuan -院yuan -缘yuan -援yuan -园yuan -怨yuan -鸳yuan -渊yuan -冤yuan -垣yuan -袁yuan -辕yuan -猿yuan -苑yuan -垸yuan -塬yuan -芫yuan -掾yuan -圜*yuan -沅yuan -媛yuan -瑗yuan -橼yuan -爰yuan -眢yuan -鸢yuan -螈yuan -箢yuan -鼋yuan -原本yuanben -渊博yuanbo -冤仇yuanchou -远大yuanda -元旦yuandan -园地yuandi -园丁yuanding -远东yuandong -远方yuanfang -缘分yuanfen -原告yuangao -原故yuangu -缘故yuangu -圆滑yuanhua -原籍yuanji -冤家yuanjia -元件yuanjian -远见yuanjian -远近yuanjin -远景yuanjing -援救yuanjiu -原来yuanlai -原理yuanli -原谅yuanliang -原料yuanliao -远虑yuanlu -圆满yuanman -远谋yuanmou -远期yuanqi -冤屈yuanqu -源泉yuanquan -原始yuanshi -远视yuanshi -元首yuanshou -元帅yuanshuai -元素yuansu -援外yuanwai -愿望yuanwang -冤枉yuanwang -原先yuanxian -远销yuanxiao -元宵yuanxiao -院校yuanxiao -原形yuanxing -怨言yuanyan -原野yuanye -愿意yuanyi -园艺yuanyi -原因yuanyin -援引yuanyin -原有yuanyou -缘由yuanyou -远游yuanyou -远远yuanyuan -渊源yuanyuan -元月yuanyue -原则yuanze -院长yuanzhang -远征yuanzheng -援助yuanzhu -原子yuanzi -院子yuanzi -预报yubao -预备yubei -愚笨yuben -余步yubu -预测yuce -愚蠢yuchun -遇到yudao -预定yuding -预订yuding -余毒yudu -月yue -说*yue -越yue -约yue -乐*yue -跃yue -曰yue -阅yue -钥yue -岳yue -粤yue -悦yue -龠yue -瀹yue -栎*yue -樾yue -刖yue -钺yue -月报yuebao -月初yuechu -月底yuedi -约定yueding -月度yuedu -阅读yuedu -乐队yuedui -约法yuefa -月份yuefen -月光yueguang -越轨yuegui -约会yuehui -越界yuejie -跃进yuejin -越境yuejing -阅览yuelan -阅历yueli -月亮yueliang -月末yuemo -约莫yuemo -越南yuenan -乐谱yuepu -乐器yueqi -月球yueqiu -乐曲yuequ -月色yuese -越是yueshi -约束yueshu -月台yuetai -乐团yuetuan -约有yueyou -乐章yuezhang -预防yufang -预风yufeng -预付yufu -预感yugan -预告yugao -预购yugou -遇害yuhai -宇航yuhang -与会yuhui -迂回yuhui -雨季yuji -预计yuji -遇见yujian -预见yujian -语句yuju -豫剧yuju -愉快yukuai -娱乐yule -鱼雷yulei -预料yuliao -雨露yulu -舆论yulun -愚昧yumei -育苗yumiao -预谋yumou -运yun -员*yun -云yun -匀yun -均*yun -允yun -孕yun -耘yun -郧yun -陨yun -蕴yun -酝yun -晕yun -韵yun -郓yun -芸yun -狁yun -恽yun -愠yun -纭yun -韫yun -殒yun -昀yun -氲yun -熨yun -遇难yunan -云彩yuncai -蕴藏yuncang -匀称yuncheng -运动yundong -熨斗yundou -云海yunhai -运河yunhe -韵律yunlu -陨落yunluo -云南yunnan -酝酿yunnian -允诺yunnuo -愚弄yunong -运气yunqi -运输yunshu -运算yunsuan -云梯yunti -运往yunwang -韵味yunwei -云雾yunwu -云霞yunxia -运行yunxing -允许yunxu -运用yunyong -孕育yunyu -运载yunzai -运转yunzhuan -与其yuqi -语气yuqi -预期yuqi -预审yushen -于是yushi -预示yushi -预售yushou -雨水yushui -预算yusuan -欲望yuwang -语文yuwen -预习yuxi -预先yuxian -遇险yuxian -预想yuxiang -预言yuyan -语言yuyan -寓言yuyan -预演yuyan -予以yuyi -寓于yuyu -愉悦yuyue -预兆yuzhao -预支yuzhi -宇宙yuzhou -有文化ywh -业务联系ywlx -意味着ywz -有限公司yxgs -一系列yxl -有效期yxq -医学院yxy -一心一意yxyy -游泳池yyc -营业额yye -夜以继日yyjr -应用科学yykx -一言堂yyt -引以为戒yywj -优越性yyx -营业员yyy -隐隐约约yyyy -运用自如yyzr -拥政爱民yzam -原子能yzn -已知数yzs -有助于yzy -言之有理yzyl -在z -这z -主z -中z -种z -着z -争z -战z -作z -正z -之z -制z -重z -组z -治z -只z -子z -自z -质z -指z -杂za -扎*za -咱za -匝za -砸za -咋za -咂za -在zai -再zai -载zai -栽zai -灾zai -仔*zai -哉zai -宰zai -崽zai -甾zai -再版zaiban -再不zaibu -在场zaichang -再度zaidu -宰割zaige -灾害zaihai -再好zaihao -在乎zaihu -灾荒zaihuang -再会zaihui -灾祸zaihuo -再见zaijian -在理zaili -灾民zaimin -灾难zainan -栽培zaipei -再起zaiqi -灾情zaiqing -灾区zaiqu -再三zaisan -在世zaishi -再说zaishuo -载体zaiti -在下zaixia -再现zaixian -宰相zaixiang -在意zaiyi -在于zaiyu -再造zaizao -再则zaize -在职zaizhi -再植zaizhi -杂技zaji -杂粮zaliang -杂乱zaluan -赞zan -咱zan -暂zan -攒zan -拶zan -瓒zan -昝zan -簪zan -糌zan -趱zan -錾zan -赞成zancheng -暂定zanding -藏*zang -脏zang -葬zang -赃zang -奘zang -驵zang -臧zang -赞歌zange -赃款zangkuan -葬送zangsong -赃物zangwu -藏族zangzu -杂念zanian -赞美zanmei -咱们zanmen -暂且zanqie -暂缺zanque -赞赏zanshang -暂时zanshi -赞颂zansong -赞叹zantan -暂停zanting -赞同zantong -暂行zanxing -赞扬zanyang -暂用zanyong -赞助zanzhu -造zao -早zao -遭zao -燥zao -凿zao -糟zao -枣zao -皂zao -藻zao -澡zao -蚤zao -躁zao -噪zao -灶zao -唣zao -早晨zaochen -造成zaocheng -凿穿zaochuan -造次zaoci -造词zaoci -遭到zaodao -早稻zaodao -造反zaofan -早饭zaofan -造福zaofu -糟糕zaogao -造化zaohua -造价zaojia -造就zaojiu -造林zaolin -早年zaonian -糟粕zaopo -早期zaoqi -早日zaori -早上zaoshang -遭受zaoshou -早衰zaoshuai -糟蹋zaota -早晚zaowan -造型zaoxing -遭殃zaoyang -造谣zaoyao -造诣zaoyi -早已zaoyi -噪音zaoyin -遭遇zaoyu -造字zaozi -杂谈zatan -杂文zawen -杂质zazhi -杂志zazhi -资本主义zbzy -资产阶级zcjj -增长率zcl -总参谋部zcmb -真才实学zcsx -自动化zdh -自动检测zdjc -自动检索zdjs -自动控制zdkz -主动权zdq -招待所zds -总的说来zdsl -主动性zdx -则ze -择ze -责ze -侧*ze -泽ze -咋*ze -仄ze -赜ze -啧ze -帻ze -迮ze -昃ze -笮ze -箦ze -舴ze -责备zebei -责成zecheng -责罚zefa -责怪zeguai -贼zei -责令zeling -责骂zema -怎zen -谮zen -增zeng -曾zeng -综*zeng -憎zeng -赠zeng -缯zeng -甑zeng -罾zeng -锃zeng -增补zengbu -增产zengchan -增长zengchang -增大zengda -增订zengding -增多zengduo -增高zenggao -憎恨zenghen -增加zengjia -增减zengjian -增进zengjin -增量zengliang -赠品zengpin -增强zengqiang -增删zengshan -增设zengshe -赠送zengsong -增添zengtian -赠言zengyan -增益zengyi -增援zengyuan -怎么zenme -怎奈zennai -怎样zenyang -责任zeren -责问zewen -总而言之zeyz -争分夺秒zfdm -针锋相对zfxd -自负盈亏zfyk -中关村zgc -自告奋勇zgfy -中国共产党zggd -总工会zgh -中国特色的zgtd -中国银行zgyh -自古以来zgyl -中国政府zgzf -中共中央zgzy -查*zha -扎zha -炸zha -闸zha -铡zha -轧zha -渣zha -蜡*zha -喳zha -札zha -眨zha -栅zha -榨zha -咋*zha -乍zha -诈zha -柞*zha -揸zha -吒zha -咤zha -哳zha -喋*zha -楂*zha -砟zha -痄zha -蚱zha -齄zha -炸弹zhadan -扎根zhagen -炸毁zhahui -寨zhai -侧*zhai -择*zhai -摘zhai -窄zhai -斋zhai -翟*zhai -祭*zhai -宅zhai -债zhai -砦zhai -瘵zhai -摘录zhailu -债权zhaiquan -债务zhaiwu -窄小zhaixiao -摘要zhaiyao -札记zhaji -战zhan -展zhan -站zhan -占zhan -粘*zhan -颤*zhan -瞻zhan -毡zhan -詹zhan -沾zhan -盏zhan -斩zhan -辗zhan -崭zhan -蘸zhan -栈zhan -湛zhan -绽zhan -谵zhan -搌zhan -旃zhan -战败zhanbai -战报zhanbao -战备zhanbei -战场zhanchang -展翅zhanchi -展出zhanchu -战地zhandi -战斗zhandou -战犯zhanfan -长*zhang -张zhang -章zhang -掌zhang -仗zhang -障zhang -胀zhang -涨zhang -账zhang -樟zhang -彰zhang -漳zhang -杖zhang -丈zhang -帐zhang -瘴zhang -仉zhang -鄣zhang -幛zhang -嶂zhang -獐zhang -嫜zhang -璋zhang -蟑zhang -障碍zhangai -站岗zhangang -长辈zhangbei -章程zhangcheng -长大zhangda -战歌zhange -章法zhangfa -帐房zhangfang -丈夫zhangfu -掌管zhangguan -帐号zhanghao -章节zhangjie -帐目zhangmu -战功zhangong -掌权zhangquan -张贴zhangtie -战鼓zhangu -沾光zhanguang -战国zhanguo -战果zhanguo -张望zhangwang -掌握zhangwo -张扬zhangyang -战壕zhanhao -战后zhanhou -战机zhanji -战绩zhanji -战局zhanju -占据zhanju -展开zhankai -战况zhankuang -展览zhanlan -占领zhanling -战略zhanlue -战马zhanma -展品zhanpin -战区zhanqu -沾染zhanran -战胜zhansheng -战时zhanshi -战事zhanshi -战士zhanshi -展示zhanshi -战术zhanshu -展望zhanwang -战线zhanxian -展现zhanxian -展销zhanxiao -崭新zhanxin -瞻仰zhanyang -战役zhanyi -占用zhanyong -占有zhanyou -战友zhanyou -站长zhanzhang -战争zhanzheng -着*zhao -照zhao -找zhao -招zhao -朝*zhao -召zhao -赵zhao -爪zhao -罩zhao -沼zhao -兆zhao -嘲*zhao -昭zhao -肇zhao -诏zhao -啁*zhao -棹zhao -钊zhao -笊zhao -照办zhaoban -照搬zhaoban -招标zhaobiao -照常zhaochang -照抄zhaochao -招待zhaodai -照发zhaofa -招工zhaogong -照顾zhaogu -招呼zhaohu -召唤zhaohuan -照会zhaohui -着急zhaoji -招集zhaoji -召集zhaoji -招架zhaojia -召开zhaokai -招考zhaokao -招揽zhaolan -着力zhaoli -照例zhaoli -照料zhaoliao -着落zhaoluo -着迷zhaomi -照明zhaoming -招聘zhaopin -朝气zhaoqi -招惹zhaore -照射zhaoshe -招生zhaosheng -着手zhaoshou -招手zhaoshou -招收zhaoshou -招贴zhaotie -朝夕zhaoxi -朝霞zhaoxia -着想zhaoxiang -照相zhaoxiang -昭雪zhaoxue -找寻zhaoxun -着眼zhaoyan -照样zhaoyang -照耀zhaoyao -照应zhaoying -招展zhaozhan -招致zhaozhi -着重zhaozhong -照着zhaozhuo -诈骗zhapian -榨取zhaqu -诈取zhaqu -扎实zhashi -炸药zhayao -渣滓zhazi -这zhe -着zhe -者zhe -折zhe -哲zhe -浙zhe -遮zhe -蛰zhe -辙zhe -锗zhe -蔗zhe -谪zhe -摺zhe -柘zhe -辄zhe -磔zhe -鹧zhe -褶zhe -蜇zhe -赭zhe -这般zheban -这边zhebian -这次zheci -遮挡zhedang -这点zhedian -折叠zhedie -折服zhefu -遮盖zhegai -这个zhege -折合zhehe -浙江zhejiang -折旧zhejiu -折扣zhekou -这里zheli -哲理zheli -这么zheme -折磨zhemo -真zhen -针zhen -阵zhen -镇zhen -振zhen -震zhen -珍zhen -诊zhen -斟zhen -甄zhen -砧zhen -臻zhen -贞zhen -侦zhen -枕zhen -疹zhen -圳zhen -蓁zhen -浈zhen -溱*zhen -缜zhen -桢zhen -椹*zhen -榛zhen -轸zhen -赈zhen -胗zhen -朕zhen -祯zhen -畛zhen -稹zhen -鸩zhen -箴zhen -珍爱zhenai -珍宝zhenbao -针砭zhenbian -珍藏zhencang -贞操zhencao -侦察zhencha -真诚zhencheng -震荡zhendang -阵地zhendi -真谛zhendi -震动zhendong -诊断zhenduan -针对zhendui -振奋zhenfen -争zheng -正zheng -政zheng -整zheng -证zheng -征zheng -蒸zheng -症zheng -丁*zheng -郑zheng -挣zheng -睁zheng -狰zheng -怔zheng -拯zheng -帧zheng -诤zheng -峥zheng -徵zheng -钲zheng -铮zheng -筝zheng -争霸zhengba -整备zhengbei -正比zhengbi -政变zhengbian -争辩zhengbian -整编zhengbian -征兵zhengbing -政策zhengce -正常zhengchang -争吵zhengchao -征程zhengcheng -争持zhengchi -正大zhengda -正当zhengdang -政党zhengdang -整党zhengdang -正道zhengdao -争端zhengduan -整顿zhengdun -争夺zhengduo -蒸发zhengfa -政法zhengfa -正反zhengfan -整风zhengfeng -政府zhengfu -征服zhengfu -整改zhenggai -整个zhengge -征购zhenggou -争光zhengguang -正规zhenggui -正轨zhenggui -正好zhenghao -政绩zhengji -征集zhengji -证件zhengjian -政见zhengjian -整洁zhengjie -政局zhengju -证据zhengju -正理zhengli -整理zhengli -正梁zhengliang -政令zhengling -争论zhenglun -政论zhenglun -正面zhengmian -争鸣zhengming -证明zhengming -正派zhengpai -征聘zhengpin -争气zhengqi -正气zhengqi -蒸气zhengqi -整齐zhengqi -正巧zhengqiao -征求zhengqiu -争取zhengqu -政权zhengquan -正确zhengque -证人zhengren -正是zhengshi -正式zhengshi -正视zhengshi -证实zhengshi -征收zhengshou -整数zhengshu -证书zhengshu -征税zhengshui -整套zhengtao -正题zhengti -政体zhengti -整体zhengti -整天zhengtian -征调zhengtiao -正统zhengtong -征途zhengtu -珍贵zhengui -政委zhengwei -正文zhengwen -征文zhengwen -政务zhengwu -争先zhengxian -政协zhengxie -整形zhengxing -整修zhengxiu -征询zhengxun -争艳zhengyan -正业zhengye -正义zhengyi -争议zhengyi -征用zhengyong -正月zhengyue -正在zhengzai -挣扎zhengzha -整整zhengzheng -正直zhengzhi -政治zhengzhi -争执zhengzhi -正中zhengzhong -郑重zhengzhong -郑州zhengzhou -症状zhengzhuang -正宗zhengzong -震撼zhenhan -侦缉zhenji -真假zhenjia -阵脚zhenjiao -贞节zhenjie -贞洁zhenjie -镇静zhenjing -震惊zhenjing -真空zhenkong -真理zhenli -诊疗zhenliao -珍品zhenpin -珍奇zhenqi -真切zhenqie -真情zhenqing -真确zhenque -真人zhenren -阵容zhenrong -真是zhenshi -真实zhenshi -阵势zhenshi -珍视zhenshi -侦探zhentan -阵亡zhenwang -珍惜zhenxi -阵线zhenxian -真相zhenxiang -振兴zhenxing -镇压zhenya -阵阵zhenzhen -真正zhenzheng -真知zhenzhi -真挚zhenzhi -珍重zhenzhong -珍珠zhenzhu -斟酌zhenzhuo -振作zhenzuo -这是zheshi -这时zheshi -折腾zheteng -这些zhexie -哲学zhexue -遮掩zheyan -这样zheyang -这种zhezhong -折中zhezhong -之zhi -制zhi -治zhi -只zhi -质zhi -指zhi -直zhi -支zhi -织zhi -止zhi -至zhi -置zhi -志zhi -值zhi -知zhi -识*zhi -执zhi -职zhi -植zhi -纸zhi -致zhi -枝zhi -殖zhi -脂zhi -智zhi -氏*zhi -肢zhi -秩zhi -址zhi -滞zhi -汁zhi -芝zhi -吱zhi -蜘zhi -侄zhi -趾zhi -旨zhi -挚zhi -掷zhi -帜zhi -峙zhi -稚zhi -炙zhi -痔zhi -窒zhi -卮zhi -陟zhi -郅zhi -埴zhi -芷zhi -摭zhi -帙zhi -徵*zhi -忮zhi -彘zhi -咫zhi -骘zhi -栉zhi -枳zhi -栀zhi -桎zhi -轵zhi -轾zhi -贽zhi -胝zhi -膣zhi -祉zhi -祗zhi -黹zhi -雉zhi -鸷zhi -痣zhi -蛭zhi -絷zhi -酯zhi -跖zhi -踬zhi -踯zhi -豸zhi -觯zhi -治安zhian -值班zhiban -植保zhibao -置备zhibei -质变zhibian -指标zhibiao -职别zhibie -支部zhibu -制裁zhicai -支撑zhicheng -职称zhicheng -支持zhichi -指出zhichu -支出zhichu -至此zhici -值此zhici -直达zhida -只当zhidang -直到zhidao -指导zhidao -知道zhidao -只得zhide -值得zhide -质地zhidi -指点zhidian -制定zhiding -指定zhiding -制订zhiding -制度zhidu -支队zhidui -至多zhiduo -知法zhifa -执法zhifa -制服zhifu -支付zhifu -职工zhigong -只顾zhigu -只管zhiguan -直观zhiguan -治国zhiguo -只好zhihao -之后zhihou -指挥zhihui -智慧zhihui -知己zhiji -指甲zhijia -之间zhijian -只见zhijian -指教zhijiao -直接zhijie -枝节zhijie -至今zhijin -直经zhijing -直径zhijing -止境zhijing -致敬zhijing -知觉zhijue -治理zhili -致力zhili -智力zhili -质量zhiliang -治疗zhiliao -指令zhiling -直流zhiliu -支流zhiliu -殖民zhimin -致命zhiming -指明zhiming -知名zhiming -智谋zhimou -指南zhinan -智囊zhinang -之内zhinei -只能zhineng -职能zhineng -智能zhineng -只怕zhipa -指派zhipai -支配zhipei -支票zhipiao -制品zhipin -志气zhiqi -之前zhiqian -支前zhiqian -值勤zhiqin -执勤zhiqin -知情zhiqing -知青zhiqing -智取zhiqu -志趣zhiqu -知趣zhiqu -职权zhiquan -值日zhiri -治丧zhisang -之上zhishang -直上zhishang -至上zhishang -至少zhishao -制胜zhisheng -之声zhisheng -只是zhishi -指使zhishi -支使zhishi -致使zhishi -知事zhishi -指示zhishi -知识zhishi -指数zhishu -支书zhishu -直属zhishu -植树zhishu -直爽zhishuang -治水zhishui -直说zhishuo -致死zhisi -之外zhiwai -指望zhiwang -职位zhiwei -质问zhiwen -植物zhiwu -职务zhiwu -窒息zhixi -之下zhixia -直线zhixian -指向zhixiang -志向zhixiang -知心zhixin -执行zhixing -只许zhixu -秩序zhixu -直言zhiyan -只要zhiyao -职业zhiye -致意zhiyi -旨意zhiyi -质疑zhiyi -指引zhiyin -知音zhiyin -只有zhiyou -至于zhiyu -置于zhiyu -智育zhiyu -职员zhiyuan -支援zhiyuan -志愿zhiyuan -制约zhiyue -制造zhizao -指责zhize -职责zhize -纸张zhizhang -职掌zhizhang -执照zhizhao -指正zhizheng -执政zhizheng -制止zhizhi -直至zhizhi -之中zhizhong -支助zhizhu -支柱zhizhu -知足zhizu -制作zhizuo -走后门zhm -中华民国zhmg -中华民族zhmz -中zhong -种zhong -重zhong -众zhong -钟zhong -终zhong -忠zhong -肿zhong -仲zhong -盅zhong -衷zhong -冢zhong -忪*zhong -锺zhong -螽zhong -舯zhong -踵zhong -钟爱zhongai -重办zhongban -重兵zhongbing -中部zhongbu -仲裁zhongcai -中层zhongceng -衷肠zhongchang -忠诚zhongcheng -重大zhongda -重担zhongdan -中等zhongdeng -种地zhongdi -重地zhongdi -重点zhongdian -终点zhongdian -中东zhongdong -中断zhongduan -终端zhongduan -中队zhongdui -众多zhongduo -重犯zhongfan -忠告zhonggao -中共zhonggong -中国zhongguo -忠厚zhonghou -中华zhonghua -中级zhongji -终极zhongji -重价zhongjia -中间zhongjian -中坚zhongjian -中奖zhongjiang -终结zhongjie -终究zhongjiu -终久zhongjiu -终局zhongju -中肯zhongken -种类zhonglei -中立zhongli -重量zhongliang -终了zhongliao -中流zhongliu -肿瘤zhongliu -中美zhongmei -众目zhongmu -中年zhongnian -终年zhongnian -中秋zhongqiu -重任zhongren -中日zhongri -终日zhongri -中伤zhongshang -重赏zhongshang -终身zhongshen -终生zhongsheng -重视zhongshi -忠实zhongshi -中枢zhongshu -众说zhongshuo -中苏zhongsu -终天zhongtian -中途zhongtu -重托zhongtuo -中外zhongwai -重围zhongwei -中文zhongwen -中午zhongwu -中西zhongxi -中心zhongxin -忠心zhongxin -衷心zhongxin -中性zhongxing -中学zhongxue -中旬zhongxun -忠言zhongyan -中央zhongyang -中药zhongyao -重要zhongyao -中医zhongyi -重用zhongyong -中庸zhongyong -中游zhongyou -终于zhongyu -忠于zhongyu -忠贞zhongzhen -中止zhongzhi -种植zhongzhi -终止zhongzhi -种种zhongzhong -中专zhongzhuan -种族zhongzu -轴zhou -周zhou -洲zhou -州zhou -皱zhou -骤zhou -舟zhou -诌zhou -粥zhou -肘zhou -帚zhou -咒zhou -宙zhou -昼zhou -荮zhou -啁zhou -妯zhou -纣zhou -绉zhou -胄zhou -碡zhou -籀zhou -繇*zhou -酎zhou -周到zhoudao -咒骂zhouma -周密zhoumi -周末zhoumo -周期zhouqi -周全zhouquan -周围zhouwei -周旋zhouxuan -昼夜zhouye -周折zhouzhe -周知zhouzhi -周转zhouzhuan -总后勤部zhqb -中华人民共和国zhrg -主zhu -注zhu -著zhu -住zhu -助zhu -猪zhu -铸zhu -属*zhu -株zhu -筑zhu -柱zhu -术*zhu -驻zhu -逐zhu -祝zhu -竹zhu -贮zhu -珠zhu -朱zhu -诸zhu -蛛zhu -诛zhu -烛zhu -煮zhu -拄zhu -瞩zhu -嘱zhu -蛀zhu -伫zhu -侏zhu -邾zhu -茱zhu -洙zhu -渚zhu -潴zhu -杼zhu -槠zhu -橥zhu -炷zhu -铢zhu -疰zhu -瘃zhu -褚*zhu -竺zhu -箸zhu -舳zhu -翥zhu -躅zhu -麈zhu -抓zhua -挝*zhua -抓好zhuahao -转*zhuai -曳*zhuai -拽zhuai -抓紧zhuajin -转zhuan -专zhuan -传*zhuan -砖zhuan -撰zhuan -赚zhuan -篆zhuan -啭zhuan -馔zhuan -沌*zhuan -颛zhuan -转变zhuanbian -转播zhuanbo -专长zhuanchang -专程zhuancheng -转达zhuanda -转发zhuanfa -装zhuang -状zhuang -壮zhuang -庄zhuang -撞zhuang -幢*zhuang -桩zhuang -妆zhuang -僮zhuang -奘*zhuang -转告zhuangao -装扮zhuangban -装备zhuangbei -壮大zhuangda -装订zhuangding -壮观zhuangguan -装甲zhuangjia -庄稼zhuangjia -庄嫁zhuangjia -壮举zhuangju -状况zhuangkuang -壮阔zhuangkuo -壮丽zhuangli -壮烈zhuanglie -装配zhuangpei -装饰zhuangshi -状态zhuangtai -装卸zhuangxie -庄严zhuangyan -庄园zhuangyuan -装运zhuangyun -装置zhuangzhi -壮志zhuangzhi -庄重zhuangzhong -转化zhuanhua -转换zhuanhuan -转给zhuanji -专家zhuanjia -专科zhuanke -专利zhuanli -专门zhuanmen -转让zhuanrang -专题zhuanti -转向zhuanxiang -专心zhuanxin -转眼zhuanyan -专业zhuanye -转移zhuanyi -专员zhuanyuan -转载zhuanzai -转折zhuanzhe -转正zhuanzheng -专政zhuanzheng -专制zhuanzhi -专职zhuanzhi -专注zhuanzhu -专著zhuanzhu -主办zhuban -逐步zhubu -贮藏zhucang -注册zhuce -助长zhuchang -主持zhuchi -主次zhuci -主导zhudao -注定zhuding -主动zhudong -主队zhudui -主犯zhufan -住房zhufang -祝福zhufu -嘱咐zhufu -逐个zhuge -主攻zhugong -助工zhugong -主管zhuguan -主观zhuguan -追zhui -锥zhui -椎zhui -赘zhui -坠zhui -缀zhui -惴zhui -骓zhui -缒zhui -追捕zhuibu -追查zhuicha -追悼zhuidao -追赶zhuigan -坠毁zhuihui -追加zhuijia -追究zhuijiu -追求zhuiqiu -追认zhuiren -追溯zhuisu -追随zhuisui -追问zhuiwen -追逐zhuizhu -追踪zhuizong -主机zhuji -主见zhujian -逐渐zhujian -主将zhujiang -主讲zhujiang -主教zhujiao -主角zhujiao -注解zhujie -祝酒zhujiu -主力zhuli -助理zhuli -株连zhulian -主粮zhuliang -主流zhuliu -驻留zhuliu -著名zhuming -主谋zhumou -注目zhumu -瞩目zhumu -准zhun -屯*zhun -谆zhun -肫zhun -窀zhun -准备zhunbei -逐年zhunian -准确zhunque -准绳zhunsheng -准时zhunshi -准许zhunxu -准则zhunze -着*zhuo -著*zhuo -捉zhuo -桌zhuo -缴*zhuo -拙zhuo -卓zhuo -琢zhuo -茁zhuo -酌zhuo -啄zhuo -灼zhuo -浊zhuo -倬zhuo -诼zhuo -擢zhuo -浞zhuo -涿zhuo -濯zhuo -棹*zhuo -焯zhuo -禚zhuo -斫zhuo -镯zhuo -拙劣zhuolie -琢磨zhuomo -捉弄zhuonong -酌情zhuoqing -卓越zhuoyue -茁壮zhuozhuang -主权zhuquan -主人zhuren -主任zhuren -诸如zhuru -注色zhuse -注视zhushi -柱石zhushi -注释zhushi -助手zhushou -主送zhusong -住宿zhusu -珠算zhusuan -主题zhuti -主体zhuti -逐条zhutiao -嘱托zhutuo -诸位zhuwei -主席zhuxi -注销zhuxiao -主要zhuyao -逐一zhuyi -主义zhuyi -主意zhuyi -注意zhuyi -祝愿zhuyuan -逐月zhuyue -主宰zhuzai -铸造zhuzao -驻扎zhuzha -住宅zhuzhai -主张zhuzhang -住址zhuzhi -注重zhuzhong -著作zhuzuo -子zi -自zi -资zi -字zi -紫zi -仔zi -籽zi -姿zi -吱*zi -兹zi -咨zi -滋zi -淄zi -孜zi -滓zi -渍zi -谘zi -茈*zi -呲*zi -嵫zi -姊zi -孳zi -缁zi -梓zi -辎zi -赀zi -恣zi -眦zi -锱zi -秭zi -耔zi -笫zi -粢zi -趑zi -觜zi -訾zi -龇zi -鲻zi -髭zi -自爱ziai -自白zibai -自卑zibei -资本ziben -资产zichan -滋长zichang -自称zicheng -自传zichuan -自从zicong -子弟zidi -字典zidian -自动zidong -自发zifa -自费zifei -自封zifeng -自负zifu -字符zifu -资格zige -字根zigen -自豪zihao -自给ziji -自己ziji -字迹ziji -字节zijie -资金zijin -自救zijiu -自居ziju -自觉zijue -字库ziku -自夸zikua -自理zili -资历zili -资料ziliao -自满ziman -自勉zimian -字母zimu -字幕zimu -子女zinu -自强ziqiang -自然ziran -滋润zirun -自杀zisha -自身zishen -姿势zishi -自述zishu -自私zisi -姿态zitai -字体ziti -字帖zitie -自卫ziwei -滋味ziwei -自问ziwen -自我ziwo -仔细zixi -自信zixin -自修zixiu -自叙zixu -自选zixuan -自学zixue -咨询zixun -滋养ziyang -自由ziyou -自愿ziyuan -资源ziyuan -自找zizhao -自治zizhi -自重zizhong -资助zizhu -自尊zizun -直截了当zjld -浙江省zjs -这就是说zjss -中纪委zjw -再接再厉zjzl -中联部zlb -专利法zlf -质量管理zlgl -自力更生zlgs -展览会zlh -智力开发zlkf -专利权zlq -知名人士zmrs -这么些zmx -这么样zmy -怎么样zmy -总zong -纵zong -宗zong -综zong -棕zong -鬃zong -踪zong -偬zong -枞zong -腙zong -粽zong -总部zongbu -总裁zongcai -总参zongcan -总队zongdui -总额zonge -总纲zonggang -总共zonggong -纵贯zongguan -总和zonghe -综合zonghe -纵横zongheng -总后zonghou -总计zongji -踪迹zongji -宗教zongjiao -总结zongjie -总局zongju -总括zongkuo -总理zongli -总论zonglun -宗派zongpai -纵情zongqing -纵深zongshen -总是zongshi -纵使zongshi -总数zongshu -总算zongsuan -总体zongti -总统zongtong -总务zongwu -踪影zongying -总帐zongzhang -总政zongzheng -总之zongzhi -宗旨zongzhi -走zou -邹zou -奏zou -揍zou -诹zou -陬zou -鄹zou -驺zou -鲰zou -走访zoufang -邹虹zouhong -走私zousi -奏效zouxiao -酌情处理zqcl -中青年zqn -朝气蓬勃zqpb -准确无误zqww -正确性zqx -诸如此类zrcl -责任感zrg -自然界zrj -主人翁zrw -责任心zrx -责任制zrz -再生产zsc -自上而下zsex -知识分子zsfz -这时候zsh -知识化zsh -株式会社zshs -总书记zsj -装饰品zsp -综上所述zsss -之所以zsy -自始至终zszz -众所周知zszz -座谈会zth -组zu -族zu -足zu -阻zu -祖zu -租zu -卒zu -诅zu -俎zu -菹zu -镞zu -阻碍zuai -钻zuan -赚*zuan -纂zuan -攥zuan -缵zuan -躜zuan -钻研zuanyan -组成zucheng -阻挡zudang -组阁zuge -足够zugou -祖国zuguo -组合zuhe -最zui -罪zui -嘴zui -堆*zui -咀*zui -醉zui -蕞zui -最初zuichu -最大zuida -最低zuidi -罪恶zuie -罪犯zuifan -最高zuigao -罪过zuiguo -最好zuihao -最后zuihou -最坏zuihuai -最佳zuijia -最近zuijin -嘴脸zuilian -罪名zuiming -罪孽zuinie -罪人zuiren -最先zuixian -最小zuixiao -最新zuixin -醉心zuixin -罪行zuixing -罪责zuize -罪证zuizheng -最终zuizhong -罪状zuizhuang -阻击zuji -租界zujie -租借zujie -阻拦zulan -阻力zuli -租赁zulin -尊zun -遵zun -撙zun -樽zun -鳟zun -阻挠zunao -遵从zuncong -尊贵zungui -尊敬zunjing -遵守zunshou -遵循zunxun -尊严zunyan -遵照zunzhao -尊重zunzhong -作zuo -做zuo -左zuo -座zuo -坐zuo -昨zuo -撮*zuo -凿*zuo -搓*zuo -琢*zuo -佐zuo -柞zuo -阼zuo -唑zuo -嘬zuo -怍zuo -胙zuo -祚zuo -笮*zuo -作案zuoan -作弊zuobi -左边zuobian -坐标zuobiao -做到zuodao -作法zuofa -做法zuofa -作废zuofei -作风zuofeng -做工zuogong -作怪zuoguai -做好zuohao -作家zuojia -作客zuoke -作乐zuole -作乱zuoluan -坐落zuoluo -左派zuopai -作品zuopin -左倾zuoqing -做人zuoren -昨日zuori -做事zuoshi -坐视zuoshi -座谈zuotan -昨天zuotian -昨晚zuowan -作为zuowei -座位zuowei -坐位zuowei -作文zuowen -作物zuowu -作业zuoye -昨夜zuoye -作用zuoyong -左右zuoyou -作战zuozhan -作者zuozhe -作证zuozheng -作主zuozhu -做主zuozhu -做作zuozuo -足球zuqiu -阻塞zuse -祖师zushi -祖先zuxian -组长zuzhang -组织zuzhi -阻止zuzhi -祖宗zuzong -中外合资zwhz -责无旁贷zwpd -中宣部zxb -自行车zxc -自下而上zxes -忠心耿耿zxgg -展销会zxh -照相机zxj -争先恐后zxkh -中学生zxs -主席团zxt -中小学zxx -自信心zxx -中央办公厅zybt -着眼点zyd -专业对口zydk -中央电视台zydt -中央各部委zygw -专业化zyh -专业户zyh -中央军委zyjw -座右铭zym -中央全会zyqh -中央人民广播电台zyrt -主要人员zyry -专业人员zyry -中央书记处zysc -中央委员会zywh -中央委员zywy -重要性zyx -主要原因zyyy -中央政治局zyzj -专业知识zyzs -中组部zzb -组织部zzb -政治部zzb -政治处zzc -转折点zzd -置之度外zzdw -政治局zzj -自治区zzq -蒸蒸日上zzrs -组织上zzs -郑州市zzs -组织性zzx -自尊心zzx -赵紫阳zzy -总政治部zzzb -喷码pm -优喷yp -科技kj -比洋by -公司gs -威诺巴赫wnbh -有限公司yxgz -股份公司gfgs -企业qy -标准bz -喷码机pmj -电线dx -电缆dl -电线电缆dxdl -电力电缆dldl -绝缘jy -绝缘层jyc -导体dt -导线dx -电力dl -通信tx -控制电缆kzdl -补偿电缆bcdl -屏蔽电缆pbdl -高温电缆gwdl -计算机电缆jsjdl -信号电缆xhdl -同轴电缆tzdl -耐火电缆nhdl -船用电缆cydl -铝合金电缆lhjdl -单股dg -多股dg -连接lj -电路dl -电器dq -型号xh -铜t -铝l -铅包qb -铝包qb -聚氯乙烯jlyx -电磁线dcx -北京市bj -东城区dcq -西城区xcq -崇文区cwq -宣武区xwq -朝阳区zyq -海淀区hdq -丰台区ftq -房山区fsq -通州区tzq -顺义区syq -昌平区cpq -大兴区txq -怀柔区hrq -平谷区pgq -门头沟区mtgq -石景山区sjsq -天津市tjs -和平区hpq -河东区hdq -河西区hxq -南开区nkq -河北区hbq -红桥区hqq -塘沽区tgq -汉沽区hgq -大港区tgq -东丽区dlq -西青区xqq -北辰区bcq -津南区jnq -武清区wqq -宝坻区bdq -河北省hbs -辛集市xjs -藁城市gcs -晋州市jzs -新乐市xls -鹿泉市lqs -唐山市tss -遵化市zhs -安市as -邯郸市hds -武安市was -邢台市xts -南宫市ngs -沙河市shs -保定市bds -涿州市zzs -定州市dzs -安国市ags -承德市cds -沧州市czs -泊头市bts -任丘市rqs -黄骅市hhs -河间市hjs -廊坊市lfs -霸州市bzs -三河市shs -衡水市hss -冀州市jzs -深州市szs -石家庄市sjzs -张家口市zjks -高碑店市gbds -秦皇岛市qhds -山西省sxs -太原市tys -古交市gjs -大同市dts -阳泉市yqs -长治市czs -潞城市lcs -晋城市jcs -高平市gps -朔州市szs -晋中市jzs -介休市jxs -运城市ycs -河津市hjs -永济市sjs -忻州市xzs -原平市yps -临汾市lfs -侯马市hms -霍州市hzs -吕梁市lls -孝义市xys -汾阳市fys -内蒙古自治区nmg -包头市bts -乌海市whs -赤峰市cfs -通辽市tls -根河市ghs -丰镇市fzs -辽宁省LNS -沈阳市sys -新民市xms -大连市dls -庄河市zhs -鞍山市ass -海城市hcs -抚顺市fss -本溪市bxs -丹东市dds -东港市dgs -凤城市fcs -锦州市jzs -凌海市lhs -北宁市bns -营口市yks -盖州市gzs -阜新市fxs -辽阳市lys -灯塔市dts -盘锦市pjs -铁岭市tls -开原市kys -朝阳市zys -凌源市lys -北票市bps -兴城市xcs -大石桥市dsqs -瓦房店市wfds -普兰店市plds -调兵山市dbss -葫芦岛市hlds -吉林省jls -长春市ccs -九台市jts -榆树市yss -德惠市dhs -吉林市jls -舒兰市sls -桦甸市hds -蛟河市jhs -磐石市pss -四平市sps -双辽市sls -辽源市lys -通化市ths -集安市jas -白山市bss -临江市ljs -松原市sys -白城市bcs -大安市das -洮南市tns -延吉市yjs -图们市tms -敦化市ghs -龙井市ljs -珲春市hcs -和龙市hls -公主岭市gzls -梅河口市mhks -黑龙江省hljs -阿城市acs -尚志市szs -双城市scs -五常市wcs -讷河市nhs -鹤岗市hgs -鸡西市jxs -密山市mss -虎林市hls -大庆市dqs -伊春市ycs -铁力市tls -宁安市nas -海林市hls -穆棱市mls -同江市tjs -富锦市fjs -黑河市hhs -北安市bas -绥化市shs -安达市ads -肇东市zds -海伦市hls -七台河市qths -双鸭山市syss -牡丹江市mdjs -佳木斯市jmss -绥芬河市sfhs -哈尔滨市hebs -齐齐哈尔市qqhes -五大连池市wdlcs -上海市shs -黄浦区hpq -卢湾区lwq -徐汇区xhq -长宁区cnq -静安区jaq -普陀区ptq -闸北区zbq -虹口区hkq -杨浦区ypq -宝山区bsq -闵行区mxq -嘉定区jdq -松江区sjq -金山区jsq -青浦区qpq -南汇区nhq -奉贤区fxq -崇明县浦东新区cmxpdxq -江苏省jss -南京市njs -无锡市wxs -江阴市jys -宜兴市yxs -徐州市xzs -邳州市pzs -新沂市xys -常州市czs -金坛市jts -溧阳市lys -苏州市szs -常熟市css -太仓市dcs -昆山市hss -吴江市wjs -南通市nns -如皋市rgs -通州市tzs -海门市hms -启东市qds -淮安市has -盐城市ycs -东台市dts -大丰市dfs -扬州市yzs -高邮市gys -江都市jds -仪征市yzs -镇江市zjs -丹阳市dys -扬中市yzs -句容市jrs -泰州市dzs -泰兴市dxs -姜堰市jys -靖江市jjs -兴化市xhs -宿迁市sqs -连云港市lygs -张家港市zjgs -浙江省zjs -杭州市hzs -建德市jds -富阳市fys -临安市las -宁波市nbx -余姚市yys -慈溪市cxs -奉化市fhs -温州市wzs -瑞安市ras -乐清市lqs -嘉兴市jxs -海宁市hns -平湖市phs -桐乡市txs -湖州市hzs -绍兴市sxs -诸暨市zjs -上虞市sys -嵊州市szs -金华市jhs -兰溪市lxs -义乌市yws -东阳市dys -永康市yks -衢州市qzs -江山市jss -舟山市zss -台州市tzs -临海市lhs -丽水市lss -龙泉市lqs -安徽省ahs -合肥市hfs -芜湖市whs -蚌埠市bbs -淮南市hns -淮北市hbs -铜陵市tls -安庆市aqs -桐城市tcs -黄山市hss -滁州市czs -天长市dcs -明光市mgs -阜阳市fys -界首市jss -宿州市szs -巢湖市chs -六安市las -亳州市hzs -池州市czs -宣城市ycs -宁国市ngs -马鞍山市mass -福建省fjs -福州市fjs -福清市fqs -长乐市cls -厦门市xms -莆田市pts -三明市sms -永安市yas -泉州市qzs -石狮市sss -晋江市jjs -南安市nas -漳州市zzs -龙海市lhs -南平市nps -建瓯市jos -邵武市sws -建阳市jys -龙岩市lys -漳平市zps -宁德市nds -福安市fas -福鼎市fds -武夷山市wyss -江西省jxs -南昌市ncs -乐平市lps -萍乡市pxs -九江市jjs -瑞昌市rcs -新余市xys -鹰潭市yts -贵溪市gxs -赣州市gzs -瑞金市rjs -南康市nks -吉安市jas -宜春市ycs -丰城市fcs -樟树市zss -高安市gas -抚州市fzs -上饶市srs -德兴市dxs -井冈山市jgss -景德镇市jdzs -山东省sds -济南市jns -章丘市zqs -青岛市qds -胶南市jns -胶州市jzs -平度市pds -莱西市lxs -即墨市jms -淄博市zbs -枣庄市zzs -滕州市tzs -烟台市yts -龙口市lks -莱阳市lys -莱州市lzs -招远市zys -蓬莱市pls -栖霞市qxs -海阳市hys -潍坊市wfs -青州市qzs -诸城市zcs -寿光市sgs -安丘市aqs -高密市gms -昌邑市cys -济宁市jns -曲阜市qfs -兖州市yzs -邹城市zcs -泰安市tas -新泰市xts -肥城市fcs -威海市whs -乳山市rss -文登市wds -荣成市rcs -日照市rzs -莱芜市lws -临沂市lys -德州市dzs -乐陵市lls -禹城市ycs -聊城市lcs -临清市lqs -滨州市bzs -菏泽市hzs -河南省hns -郑州市zzs -巩义市gys -新郑市xzs -新密市xms -登封市dfs -荥阳市xys -开封市kfs -洛阳市lys -偃师市yss -汝州市rzs -舞钢市wgs -安阳市ays -林州市lzs -新乡市xxs -卫辉市whs -辉县市hxs -焦作市jzs -沁阳市qys -孟州市mzs -濮阳市pys -许昌市xcs -禹州市yzs -长葛市cgs -漯河市lhs -义马市yms -灵宝市lbs -南阳市nys -邓州市dzs -商丘市sqs -永城市ycs -信阳市xys -周口市zks -项城市dcs -济源市jys -三门峡市smxs -平顶山市pdss -驻马店市zmds -湖北省hbs -武汉市whs -黄石市hss -大冶市dys -十堰市sys -荆州市jzs -洪湖市hhs -石首市sss -松滋市szs -宜昌市ycs -宜都市yds -当阳市dys -枝江市jjs -襄樊市xfs -枣阳市zys -宜城市ycs -鄂州市ezs -荆门市jms -钟祥市zxs -孝感市xgs -应城市ycs -安陆市als -汉川市hcs -黄冈市hgs -麻城市mcs -武穴市wxs -咸宁市xns -赤壁市cbs -随州市szs -广水市gss -仙桃市xts -天门市tms -潜江市qjs -恩施市ess -利川市lcs -丹江口市djks -老河口市lhks -神农架林区snjlq -湖南省hns -长沙市css -浏阳市lys -株洲市zzs -醴陵市lls -湘潭市xts -湘乡市xxs -韶山市sss -衡阳市hys -耒阳市lys -常宁市cns -邵阳市sys -武冈市wgs -岳阳市yys -临湘市lxs -汨罗市mls -常德市cds -津市市jss -益阳市yys -沅江市yjs -郴州市czs -资兴市zxs -永州市yzs -怀化市hhs -洪江市hjs -娄底市lds -涟源市lys -吉首市jss -冷水江市lsjs -张家界市zjjs -广东省gds -广州市gzs -从化市chs -增城市zcs -深圳市szs -珠海市zhs -汕头市sts -韶关市sgs -乐昌市lcs -南雄市nxs -佛山市fss -江门市jms -台山市tss -开平市kps -鹤山市hss -恩平市eps -湛江市zjs -廉江市ljs -雷州市lzs -吴川市wcs -茂名市mms -西昌市xcs -峨眉山市emss -都江堰市djys -攀枝花市pzhs -贵州省gzs -贵阳市gys -清镇市qzs -遵义市zys -赤水市css -仁怀市rhs -安顺市ass -毕节市bjs -兴义市xys -凯里市kls -都匀市dys -福泉市fqs -六盘水市lpss -六枝特区lztq -万山特区wstq -云南省yns -昆明市kms -安宁市ans -曲靖市qjs -宣威市xws -玉溪市yxs -保山市bss -昭通市zts -丽江市ljs -思茅市sms -临沧市lqs -个旧市gjs -开远市kys -景洪市jhs -楚雄市cxs -大理市dls -潞西市lxs -瑞丽市rls -西藏自治区xzzzq -拉萨市lss -陕西省sxs -西安市xas -铜川市tcs -宝鸡市bjs -咸阳市xys -渭南市wns -韩城市hcs -华阴市hys -延安市yas -汉中市azs -榆林市yls -安康市aks -商洛市sls -甘肃省gss -兰州市lzs -金昌市jcs -白银市bys -天水市tss -武威市wws -张掖市zys -平凉市pls -酒泉市jqs -玉门市yms -敦煌市dhs -庆阳市qys -定西市dxs -陇南市lns -临夏市lxs -合作市hzs -嘉峪关市jygs -青海省qhs -西宁市xns -德令哈市dlhs -格尔木市gems -宁夏回族自治区nxhzzzq -银川市ycs -灵武市lws -吴忠市wzs -固原市gys -中卫市zws -石嘴山市szss -青铜峡市qtxs -新疆维吾尔自治区xjwwezzq -喀什市kss -昌吉市cjs -阜康市fks -米泉市mqs -博乐市bls -伊宁市yns -奎屯市kts -塔城市tcs -乌苏市wss -石河子市shzs -阿拉尔市ales -五家渠市wjqs -吐鲁番市tlfs -阿克苏市akss -阿图什市atss -库尔勒市kels -阿勒泰市alts -乌鲁木齐市wlmqs -克拉玛依市klmys -图木舒克市tmsks -香港特别行政区 -中西区zxq -东区dq -观塘区gtq -南区nq -湾仔区wzq -离岛区ldq -葵青区kqq -北区bq -西贡区xgq -沙田区stq -屯门区tmq -大埔区dpq -荃湾区qwq -元朗区ylq -九龙城区jtcq -油尖旺区yjwq -深水埗区ssbq -黄大仙区hdxq -台湾省tws -台北市tbs -高雄市gxs -基隆市jls -台中市tzs -台南市tns -新竹市xzs -嘉义市jys -板桥市bqs -宜兰市yls -竹北市zbs -桃园市tys -苗栗市mls -丰原市fys -彰化市zhs -南投市nts -太保市tbs -斗六市dls -新营市xys -凤山市fss -屏东市pds -台东市tds -花莲市hls -马公市mgs +Šsw +šsw +Žzw +žzw +Œce +œce +aÀ +aÁ +aẢ +aà +aẠ +aÄ +aÅ +aeÆ +a +asá +afà +arả +axã +ajạ +awă +aaâ +aeă +äa +åa +aaâ +aa +Äa +Åa +Æae +AFÀ +ASÁ +ARẢ +AXà +AJẠ +AÄ +AÅ +AEÆ +AA +eÉ +eÈ +eẺ +eẼ +eẸ +eÊ +eË +esé +efè +erẻ +exẽ +ejẹ +eeê +ESÉ +EFÈ +ERẺ +EXẼ +EJẸ +EEÊ +eeÊ +EË +DDĐ +ddđ +ddĐ +íis +ìif +ỉir +ĩix +ịij +ÌIF +ÍIS +ỈIR +ĨIX +ỊIj +IIÎ +iÌ +iÍ +iỈ +iĨ +ij +iÎ +iÏ +nÑ +osó +ofò +orỏ +oxõ +ojọ +owơ +ooô +OSÓ +OFÒ +ORỎ +OXÕ +OJỌ +OWƠ +OEÒ +OOÔ +ooÔ +OÖ +ooÖ +oÓ +oÒ +oỎ +oÕ +oỌ +oƠ +oÒ +oÔ +usú +ufù +urủ +uxũ +ujụ +uwư +USÚ +UFÙ +URỦ +UXŨ +UJỤ +UWƯ +ÜU +ÛU +uÚ +uÙ +uỦ +uŨ +uỤ +uƯ +uÜ +uÛ +YFỲ +YSÝ +YRỶ +YXỸ +YJỴ +yỲ +yÝ +yỶ +yỸ +yỴ +yfỳ +ysý +yrỷ +yxỹ +ỵyj +安a +按a +爱a +阿a +暗a +啊a +埃a +碍a +凹a +奥a +岸a +矮a +案a +俺a +挨a +唉a +昂a +氨a +胺a +哎a +吖a +嗄a +腌a +锕a +安徽省ahs +爱ai +埃ai +碍ai +矮ai +挨ai +唉ai +哎ai +哀ai +皑ai +癌ai +蔼ai +艾ai +隘ai +呆*ai +捱ai +嗳ai +嗌ai +嫒ai +瑷ai +暧ai +砹ai +锿ai +霭ai +安an +按an +暗an +岸an +案an +俺an +氨an +胺an +鞍an +谙an +埯an +揞an +犴an +庵an +桉an +铵an +鹌an +黯an +昂ang +肮ang +盎ang +安徽anhui +凹ao +奥ao +敖ao +熬ao +翱ao +袄ao +傲ao +懊ao +澳ao +嚣*ao +坳ao +拗ao +嗷ao +岙ao +廒ao +遨ao +媪ao +骜ao +獒ao +聱ao +螯ao +鏊ao +鳌ao +鏖ao +不b +部b +本b +表b +把b +变b +比b +并b +别b +百b +报b +保b +病b +北b +被b +步b +边b +八b +办b +布b +把ba +八ba +吧ba +巴ba +拔ba +霸ba +罢ba +爸ba +坝ba +芭ba +捌ba +扒ba +叭ba +笆ba +疤ba +跋ba +靶ba +耙ba +茇ba +菝ba +岜ba +灞ba +钯ba +粑ba +鲅ba +魃ba +百bai +白bai +败bai +摆bai +伯*bai +柏bai +佰bai +拜bai +稗bai +捭bai +掰bai +办ban +半ban +板ban +班ban +般ban +版ban +拌ban +搬ban +斑ban +扳ban +伴ban +颁ban +扮ban +瓣ban +绊ban +阪ban +坂ban +钣ban +瘢ban +癍ban +舨ban +帮bang +棒bang +邦bang +榜bang +梆bang +膀bang +绑bang +磅bang +蚌bang +镑bang +傍bang +谤bang +蒡bang +浜bang +报bao +保bao +包bao +剥bao +薄bao +胞bao +暴bao +宝bao +饱bao +抱bao +爆bao +炮*bao +堡bao +刨*bao +苞bao +褒bao +雹bao +豹bao +鲍bao +曝*bao +瀑*bao +葆bao +孢bao +煲bao +鸨bao +褓bao +趵bao +龅bao +北bei +被bei +倍bei +备bei +背bei +辈bei +贝bei +杯bei +卑bei +臂*bei +悲bei +碑bei +钡bei +狈bei +惫bei +焙bei +孛bei +陂bei +邶bei +埤bei +萆bei +蓓bei +呗bei +悖bei +碚bei +鹎bei +褙bei +鐾bei +鞴bei +本ben +奔ben +苯ben +笨ben +夯*ben +畚ben +坌ben +贲ben +锛ben +本报benbao +奔波benbo +本部benbu +本厂benchang +奔驰benchi +本地bendi +奔放benfang +泵beng +崩beng +蚌*beng +绷beng +甭beng +蹦beng +迸beng +嘣beng +甏beng +比bi +必bi +避bi +闭bi +辟bi +笔bi +壁bi +臂bi +毕bi +彼bi +逼bi +币bi +鼻bi +蔽bi +秘*bi +鄙bi +碧bi +蓖bi +毙bi +毖bi +庇bi +痹bi +敝bi +弊bi +陛bi +拂*bi +泌*bi +匕bi +俾bi +埤*bi +芘*bi +荜bi +荸bi +萆*bi +薜bi +吡bi +哔bi +狴bi +庳bi +愎bi +滗bi +濞bi +弼bi +妣bi +婢bi +嬖bi +璧bi +贲*bi +睥*bi +畀bi +铋bi +秕bi +裨bi +筚bi +箅bi +篦bi +舭bi +襞bi +跸bi +髀bi +变bian +边bian +便bian +编bian +遍bian +辩bian +扁bian +辨bian +鞭bian +贬bian +卞bian +辫bian +匾bian +弁bian +苄bian +忭bian +汴bian +缏bian +飚bian +煸bian +砭bian +碥bian +窆bian +褊bian +蝙bian +笾bian +鳊bian +表biao +标biao +彪biao +膘biao +勺*biao +婊biao +骠biao +杓biao +飑biao +飙biao +镖biao +镳biao +瘭biao +裱biao +鳔biao +髟biao +别bie +鳖bie +憋bie +瘪bie +蹩bie +宾bin +彬bin +斌bin +濒bin +滨bin +摈bin +傧bin +豳bin +缤bin +玢bin +槟bin +殡bin +膑bin +镔bin +髌bin +鬓bin +并bing +病bing +兵bing +柄bing +冰bing +丙bing +饼bing +秉bing +炳bing +屏*bing +禀bing +邴bing +摒bing +槟*bing +波bo +播bo +剥*bo +伯bo +拨bo +薄*bo +博bo +勃bo +驳bo +玻bo +泊bo +柏*bo +卜*bo +菠bo +钵bo +搏bo +铂bo +箔bo +帛bo +舶bo +脖bo +膊bo +渤bo +魄*bo +孛*bo +亳bo +啵bo +饽bo +檗bo +掰*bo +擘bo +礴bo +钹bo +鹁bo +簸bo +趵*bo +跛bo +踣bo +不bu +部bu +步bu +布bu +补bu +捕bu +埔*bu +卜bu +堡*bu +哺bu +埠bu +簿bu +怖bu +卟bu +逋bu +瓿bu +晡bu +钚bu +钸bu +醭bu +不安buan +不比bubi +不必bubi +不变bubian +不便bubian +步兵bubing +步步bubu +不曾buceng +补偿buchang +不啻buchi +补充buchong +不错bucuo +不大buda +不待budai +不但budan +不当budang +不得bude +不等budeng +步调budiao +不动budong +不断buduan +不对budui +部队budui +不法bufa +补发bufa +步伐bufa +不凡bufan +不妨bufang +不分bufen +部分bufen +不服bufu +不符bufu +不该bugai +不敢bugan +不甘bugan +布告bugao +不够bugou +不顾bugu +不管buguan +不过buguo +不会buhui +补给buji +部件bujian +不借bujie +不尽bujin +不仅bujin +不禁bujin +布景bujing +不久bujiu +补救bujiu +布局buju +不堪bukan +不可buke +不快bukuai +不愧bukui +不理buli +不利buli +不良buliang +不料buliao +步履bulu +不论bulun +部落buluo +不满buman +部门bumen +不免bumian +不能buneng +不怕bupa +补品bupin +不平buping +步枪buqiang +不屈buqu +不然buran +不如buru +不少bushao +不是bushi +不识bushi +部首bushou +部属bushu +部署bushu +补贴butie +不同butong +不妥butuo +部位buwei +部委buwei +不问buwen +不惜buxi +补习buxi +部下buxia +不行buxing +不幸buxing +步行buxing +不朽buxiu +不许buxu +哺养buyang +不要buyao +不宜buyi +不用buyong +哺育buyu +不在buzai +部长buzhang +不振buzhen +不只buzhi +不止buzhi +不知buzhi +不致buzhi +布置buzhi +步骤buzhou +补助buzhu +捕捉buzhuo +步子buzi +不足buzu +博物馆bwg +产c +成c +出c +长c +从c +此c +常c +处c +车c +场c +传c +采c +层c +厂c +才c +次c +虫c +除c +查c +差c +擦ca +拆*ca +嚓ca +礤ca +采cai +才cai +材cai +菜cai +财cai +裁cai +彩cai +猜cai +睬cai +踩cai +蔡cai +参can +残can +蚕can +灿can +餐can +惭can +惨can +孱can +骖can +璨can +粲can +黪can +惨案canan +惨白canbai +残暴canbao +惨怛canda +残废canfei +藏cang +仓cang +苍cang +舱cang +沧cang +苍白cangbai +仓促cangcu +仓库cangku +苍老canglao +苍茫cangmang +藏匿cangni +苍穹cangqiong +沧桑cangsang +苍天cangtian +参观canguan +残骸canhai +残疾canji +参加canjia +参见canjian +残局canju +惨剧canju +参军canjun +参看cankan +参考cankao +残酷canku +惭愧cankui +灿烂canlan +参谋canmou +残缺canque +残忍canren +孱弱canruo +残杀cansha +残生cansheng +蚕食canshi +参数canshu +惨痛cantong +参与canyu +残余canyu +残月canyue +参阅canyue +参赞canzan +惨遭canzao +参战canzhan +参照canzhao +参政canzheng +惨重canzhong +草cao +槽cao +操cao +糙cao +曹cao +嘈cao +漕cao +螬cao +艚cao +草案caoan +草稿caogao +槽糕caogao +操劳caolao +操练caolian +草率caolu +草木caomu +草拟caoni +草签caoqian +操心caoxin +草原caoyuan +嘈杂caoza +操纵caozong +操作caozuo +差不多cbd +成本核算cbhs +出版社cbs +层出不穷ccbq +从长计议ccjy +存储器ccq +长春市ccs +成都市cds +测ce +策ce +侧ce +册ce +厕ce +恻ce +测定ceding +策动cedong +策反cefan +策划cehua +测量celiang +策略celue +侧面cemian +参*cen +岑cen +涔cen +涔涔cencen +层ceng +曾*ceng +蹭ceng +层层cengceng +层次cengci +曾经cengjing +测试ceshi +厕所cesuo +测验ceyan +侧重cezhong +出发点cfd +充分发挥cffh +唱高调cgd +从古到今cgdj +查cha +差cha +插cha +察cha +茶cha +叉cha +茬cha +碴cha +搽cha +岔cha +诧cha +刹*cha +喳*cha +嚓*cha +猹cha +馇cha +汊cha +姹cha +杈cha +楂cha +槎cha +檫cha +锸cha +镲cha +衩cha +查办chaban +差别chabie +差错chacuo +差点chadian +查对chadui +差额chae +查访chafang +察访chafang +查封chafeng +查获chahuo +差*chai +柴chai +拆chai +豺chai +侪chai +钗chai +瘥chai +虿chai +拆穿chaichuan +豺狼chailang +拆散chaisan +差使chaishi +拆卸chaixie +柴油chaiyou +差价chajia +差距chaju +察觉chajue +查看chakan +察看chakan +查考chakao +查明chaming +产chan +单*chan +铲chan +阐chan +搀chan +掺chan +蝉chan +馋chan +谗chan +缠chan +颤chan +冁chan +谄chan +蒇chan +廛chan +忏chan +潺chan +澶chan +孱*chan +羼chan +婵chan +骣chan +觇chan +禅chan +镡chan +蟾chan +躔chan +铲除chanchu +产地chandi +阐发chanfa +搀扶chanfu +长chang +常chang +场chang +厂chang +唱chang +肠chang +昌chang +倡chang +偿chang +畅chang +猖chang +尝chang +敞chang +裳*chang +倘*chang +伥chang +鬯chang +苌chang +菖chang +徜chang +怅chang +惝chang +阊chang +娼chang +嫦chang +昶chang +氅chang +鲳chang +长安changan +常常changchang +长城changcheng +长春changchun +畅达changda +倡导changdao +长度changdu +长短changduan +唱歌changge +常规changgui +长河changhe +场合changhe +偿还changhuan +厂家changjia +常见changjian +长江changjiang +长久changjiu +猖獗changjue +长空changkong +畅快changkuai +猖狂changkuang +场面changmian +长眠changmian +长年changnian +长篇changpian +长期changqi +长驱changqu +常任changren +长沙changsha +厂商changshang +常识changshi +尝试changshi +长寿changshou +常数changshu +场所changsuo +畅谈changtan +长途changtu +怅惘changwang +常委changwei +倘未changwei +常温changwen +常务changwu +畅想changxiang +畅销changxiao +倡议changyi +畅饮changyin +常用changyong +常有changyou +畅游changyou +长远changyuan +厂长changzhang +长征changzheng +厂址changzhi +常驻changzhu +婵娟chanjuan +蝉联chanlian +产量chanliang +缠绵chanmian +阐明chanming +产品chanpin +产权chanquan +缠绕chanrao +产生chansheng +禅师chanshi +阐述chanshu +产物chanwu +产销chanxiao +产业chanye +产值chanzhi +朝chao +超chao +潮chao +巢chao +抄chao +钞chao +嘲chao +吵chao +炒chao +绰*chao +剿*chao +怊chao +晁chao +焯*chao +耖chao +抄报chaobao +超产chaochan +超出chaochu +朝代chaodai +超额chaoe +嘲讽chaofeng +超过chaoguo +朝晖chaohui +超级chaoji +吵架chaojia +潮解chaojie +潮流chaoliu +抄录chaolu +吵闹chaonao +嘲弄chaonong +潮湿chaoshi +潮水chaoshui +抄送chaosong +超脱chaotuo +抄袭chaoxi +朝鲜chaoxian +嘲笑chaoxiao +巢穴chaoxue +朝阳chaoyang +朝野chaoye +超越chaoyue +超支chaozhi +查清chaqing +插曲chaqu +插入charu +查哨chashao +插手chashou +查收chashou +插图chatu +查问chawen +查询chaxun +茶叶chaye +差异chayi +查阅chayue +查证chazheng +岔子chazi +插足chazu +车che +彻che +尺*che +撤che +扯che +掣che +澈che +坼che +砗che +彻底chedi +车祸chehuo +车间chejian +车辆cheliang +陈chen +沉chen +称chen +衬chen +尘chen +臣chen +晨chen +沈*chen +郴chen +辰chen +忱chen +趁chen +伧chen +谌chen +谶chen +抻chen +嗔chen +宸chen +琛chen +榇chen +碜chen +龀chen +尘埃chenai +沉淀chendian +陈腐chenfu +沉浮chenfu +成cheng +程cheng +称cheng +城cheng +承cheng +乘cheng +呈cheng +盛*cheng +撑cheng +诚cheng +橙cheng +惩cheng +澄cheng +逞cheng +骋cheng +秤cheng +丞cheng +埕cheng +噌cheng +枨cheng +柽cheng +塍cheng +瞠cheng +铖cheng +铛cheng +裎cheng +蛏cheng +酲cheng +成败chengbai +承办chengban +惩办chengban +呈报chengbao +承包chengbao +成本chengben +成材chengcai +惩处chengchu +乘除chengchu +承担chengdan +承当chengdang +成都chengdu +程度chengdu +乘法chengfa +惩罚chengfa +成功chenggong +成规chenggui +成果chengguo +称号chenghao +称呼chenghu +成绩chengji +乘机chengji +成家chengjia +成见chengjian +成交chengjiao +承接chengjie +惩戒chengjie +成就chengjiu +乘客chengke +诚恳chengken +成立chengli +乘凉chengliang +成名chengming +成年chengnian +成批chengpi +成品chengpin +诚朴chengpu +逞强chengqiang +澄清chengqing +城区chengqu +成全chengquan +诚然chengran +成人chengren +承认chengren +成色chengse +成事chengshi +诚实chengshi +城市chengshi +承受chengshou +成熟chengshu +成为chengwei +称谓chengwei +成文chengwen +呈现chengxian +呈献chengxian +城乡chengxiang +成效chengxiao +称心chengxin +诚心chengxin +程序chengxu +乘虚chengxu +撑腰chengyao +诚意chengyi +成语chengyu +成员chengyuan +称赞chengzan +成长chengzhang +城镇chengzhen +称职chengzhi +诚挚chengzhi +趁机chenji +沉积chenji +陈迹chenji +沉浸chenjin +沉静chenjing +陈旧chenjiu +陈列chenlie +沉沦chenlun +沉闷chenmen +沉湎chenmian +沉默chenmo +沉溺chenni +陈设chenshe +陈述chenshu +陈说chenshuo +沉思chensi +沉痛chentong +衬托chentuo +沉吟chenyin +衬映chenying +趁早chenzao +沉重chenzhong +沉着chenzhuo +车皮chepi +扯皮chepi +撤退chetui +撤消chexiao +车站chezhan +撤职chezhi +持chi +尺chi +齿chi +吃chi +赤chi +池chi +迟chi +翅chi +斥chi +耻chi +痴chi +匙chi +弛chi +驰chi +侈chi +炽chi +傺chi +坻chi +墀chi +茌chi +叱chi +哧chi +啻chi +嗤chi +彳chi +饬chi +媸chi +敕chi +眵chi +鸱chi +瘛chi +褫chi +蚩chi +螭chi +笞chi +篪chi +豉chi +踟chi +魑chi +翅膀chibang +赤诚chicheng +驰骋chicheng +尺寸chicun +迟到chidao +赤道chidao +尺度chidu +迟钝chidun +吃喝chihe +迟缓chihuan +吃紧chijin +吃惊chijing +持久chijiu +吃苦chiku +吃亏chikui +吃力chili +炽烈chilie +齿轮chilun +持平chiping +痴情chiqing +炽热chire +耻辱chiru +池塘chitang +耻笑chixiao +赤心chixin +痴心chixin +迟疑chiyi +迟早chizao +斥责chize +叱咤chizha +持重chizhong +吃重chizhong +赤字chizi +催化剂chj +种*chong +虫chong +重*chong +充chong +冲chong +崇chong +涌*chong +宠chong +茺chong +忡chong +憧chong +铳chong +舂chong +艟chong +宠爱chongai +崇拜chongbai +充斥chongchi +冲刺chongci +冲淡chongdan +充当chongdang +重叠chongdie +冲动chongdong +宠儿chonger +充分chongfen +冲锋chongfeng +重复chongfu +崇高chonggao +重合chonghe +重婚chonghun +冲击chongji +重建chongjian +崇敬chongjing +憧憬chongjing +充满chongman +充沛chongpei +冲破chongpo +重庆chongqing +崇尚chongshang +重申chongshen +充实chongshi +冲刷chongshua +冲天chongtian +冲突chongtu +重温chongwen +冲洗chongxi +重新chongxin +重演chongyan +重印chongyin +充裕chongyu +充足chongzu +抽chou +仇chou +臭chou +酬chou +畴chou +踌chou +稠chou +愁chou +筹chou +绸chou +瞅chou +丑chou +俦chou +帱chou +惆chou +瘳chou +雠chou +筹办chouban +筹备choubei +惆怅chouchang +抽搐chouchu +踌躇chouchu +筹措choucuo +抽调choudiao +丑恶choue +仇恨chouhen +丑化chouhua +筹划chouhua +筹集chouji +筹建choujian +酬金choujin +抽空choukong +酬劳choulao +丑陋choulou +筹码chouma +稠密choumi +筹谋choumou +愁容chourong +抽象chouxiang +酬谢chouxie +抽噎chouye +出chu +处chu +除chu +初chu +础chu +触chu +楚chu +锄chu +储chu +畜*chu +橱chu +厨chu +躇chu +雏chu +滁chu +矗chu +搐chu +亍chu +刍chu +怵chu +憷chu +绌chu +杵chu +楮chu +樗chu +褚chu +蜍chu +蹰chu +黜chu +揣chuai +搋chuai +啜chuai +嘬*chuai +膪chuai +踹chuai +揣度chuaidu +揣摩chuaimo +传chuan +船chuan +穿chuan +串chuan +川chuan +椽chuan +喘chuan +舛chuan +遄chuan +巛chuan +氚chuan +钏chuan +舡chuan +传遍chuanbian +传标chuanbiao +传播chuanbo +船舶chuanbo +船埠chuanbu +穿插chuancha +传达chuanda +传单chuandan +传导chuandao +传递chuandi +床chuang +创chuang +窗chuang +闯chuang +疮chuang +幢chuang +怆chuang +创办chuangban +闯荡chuangdang +窗户chuanghu +创见chuangjian +创建chuangjian +闯劲chuangjin +创举chuangju +窗口chuangkou +创立chuangli +窗帘chuanglian +创始chuangshi +创新chuangxin +创业chuangye +创造chuangzao +创作chuangzuo +串联chuanlian +喘气chuanqi +传奇chuanqi +传染chuanran +传授chuanshou +传输chuanshu +传述chuanshu +传说chuanshuo +传送chuansong +传统chuantong +串通chuantong +喘息chuanxi +传讯chuanxun +传扬chuanyang +传阅chuanyue +传真chuanzhen +船只chuanzhi +穿着chuanzhuo +出版chuban +出榜chubang +储备chubei +出兵chubing +初步chubu +储藏chucang +出差chucha +出产chuchan +出场chuchang +出厂chuchang +处处chuchu +橱窗chuchuang +初次chuci +储存chucun +初等chudeng +出动chudong +触动chudong +出发chufa +触发chufa +除法chufa +处罚chufa +触犯chufan +出访chufang +除非chufei +处分chufen +出轨chugui +出海chuhai +吹chui +垂chui +锤chui +椎*chui +炊chui +捶chui +陲chui +棰chui +槌chui +吹棒chuibang +吹风chuifeng +吹拂chuifu +锤炼chuilian +吹牛chuiniu +垂青chuiqing +垂涎chuixian +吹嘘chuixu +垂直chuizhi +初级chuji +出击chuji +出界chujie +出境chujing +处境chujing +处决chujue +触觉chujue +除开chukai +出口chukou +出来chulai +除了chule +出力chuli +处理chuli +矗立chuli +初恋chulian +出笼chulong +出路chulu +出马chuma +出卖chumai +出面chumian +出名chuming +除名chuming +出没chumo +春chun +纯chun +醇chun +椿chun +唇chun +淳chun +蠢chun +莼chun +鹑chun +蝽chun +出纳chuna +春播chunbo +纯粹chuncui +纯度chundu +春分chunfen +春风chunfeng +春耕chungeng +春光chunguang +醇厚chunhou +春辉chunhui +春季chunji +春节chunjie +纯洁chunjie +纯净chunjing +纯利chunli +纯朴chunpu +春秋chunqiu +春色chunse +春笋chunsun +春天chuntian +处女chunu +触怒chunu +春意chunyi +纯真chunzhen +纯正chunzheng +戳chuo +绰chuo +啜*chuo +辍chuo +踔chuo +龊chuo +戳穿chuochuan +绰号chuohao +啜泣chuoqi +出品chupin +出奇chuqi +初期chuqi +出勤chuqin +出去chuqu +出让churang +出任churen +出入churu +出色chuse +出身chushen +出神chushen +出生chusheng +畜生chusheng +出事chushi +出世chushi +处世chushi +厨师chushi +出售chushou +处所chusuo +出庭chuting +锄头chutou +出土chutu +出外chuwai +除外chuwai +出席chuxi +出息chuxi +除夕chuxi +出现chuxian +初小chuxiao +雏形chuxing +储蓄chuxu +刍议chuyi +处于chuyu +初战chuzhan +处长chuzhang +出诊chuzhen +出征chuzheng +处置chuzhi +初中chuzhong +出租chuzu +此ci +次ci +刺ci +磁ci +雌ci +词ci +茨ci +疵ci +辞ci +慈ci +瓷ci +赐ci +伺*ci +兹*ci +茈ci +呲ci +祠ci +鹚ci +糍ci +慈爱ciai +辞别cibie +磁场cichang +磁带cidai +磁道cidao +此地cidi +词典cidian +辞典cidian +刺耳cier +词根cigen +刺骨cigu +此后cihou +词汇cihui +刺激ciji +赐教cijiao +此刻cike +刺客cike +词类cilei +辞令ciling +磁盘cipan +次品cipin +辞去ciqu +刺杀cisha +此时cishi +次数cishu +辞书cishu +词素cisu +祠堂citang +辞退citui +此外ciwai +慈祥cixiang +辞行cixing +词性cixing +雌雄cixiong +次序cixu +词序cixu +刺眼ciyan +次要ciyao +词语ciyu +赐予ciyu +此致cizhi +辞职cizhi +词缀cizhui +词组cizu +超级大国cjdg +参考书cks +参考消息ckxx +参考资料ckzl +触类旁通clpt +藏龙卧虎clwh +参谋长cmc +聪明才智cmcz +出谋划策cmhc +从难从严cncy +从cong +丛cong +聪cong +葱cong +囱cong +匆cong +苁cong +淙cong +骢cong +琮cong +璁cong +从此congci +匆匆congcong +匆促congcu +从而conger +从犯congfan +聪慧conghui +从来conglai +丛林conglin +匆忙congmang +聪明congming +从前congqian +从容congrong +从事congshi +丛书congshu +从速congsu +从新congxin +从严congyan +聪颖congying +葱郁congyu +从中congzhong +凑cou +楱cou +辏cou +腠cou +凑合couhe +凑巧couqiao +成品率cpl +成千上万cqsw +从容不迫crbp +承认错误crcw +趁热打铁crdt +措手不及csbj +出生率csl +长沙市css +炊事员csy +彻头彻尾ctcw +垂头丧气ctsq +粗cu +促cu +醋cu +簇cu +卒*cu +蔟cu +徂cu +猝cu +殂cu +酢cu +蹙cu +蹴cu +篡cuan +蹿cuan +窜cuan +攒*cuan +汆cuan +撺cuan +爨cuan +镩cuan +篡夺cuanduo +窜犯cuanfan +篡改cuangai +篡权cuanquan +粗暴cubao +粗糙cucao +粗犷cuguang +催cui +脆cui +淬cui +粹cui +摧cui +衰*cui +崔cui +瘁cui +翠cui +萃cui +啐cui +悴cui +璀cui +榱cui +毳cui +隹cui +摧残cuican +脆弱cuiruo +促进cujin +存cun +村cun +寸cun +蹲*cun +忖cun +皴cun +存储cunchu +存档cundang +存放cunfang +存款cunkuan +村落cunluo +存亡cunwang +存在cunzai +村镇cunzhen +村庄cunzhuang +村子cunzi +错cuo +措cuo +撮cuo +磋cuo +搓cuo +挫cuo +厝cuo +嵯cuo +脞cuo +锉cuo +矬cuo +痤cuo +瘥*cuo +鹾cuo +蹉cuo +错案cuoan +挫败cuobai +错处cuochu +措辞cuoci +错怪cuoguai +错过cuoguo +撮合cuohe +错觉cuojue +磋商cuoshang +挫伤cuoshang +措施cuoshi +错误cuowu +挫折cuozhe +错综cuozong +粗浅cuqian +促使cushi +粗俗cusu +粗心cuxin +粗壮cuzhuang +常委会cwh +崇文区cwq +常务委员会cwwh +乘务员cwy +诚心诚意cxcy +程序控制cxkz +程序设计cxsj +长远利益cyly +朝阳区cyq +财政部czb +错综复杂czfz +操之过急czgj +出租汽车czqc +此之外czw +财政危机czwj +创造性czx +操作系统czxt +操作员czy +持之以恒czyh +的d +大d +地d +动d +到d +对d +度d +多d +电d +党d +得d +定d +等d +斗d +当d +队d +都d +点d +代d +道d +大da +打da +达da +答da +搭da +塔*da +瘩da +耷da +哒da +嗒da +怛da +妲da +沓*da +疸da +褡da +笪da +靼da +鞑da +答案daan +打败dabai +大办daban +大半daban +打扮daban +答辩dabian +大伯dabo +大部dabu +达成dacheng +大胆dadan +搭档dadang +大道dadao +达到dadao +打倒dadao +大地dadi +大敌dadi +大抵dadi +打断daduan +大队dadui +大多daduo +大凡dafan +大夫dafu +大幅dafu +答复dafu +大概dagai +大纲dagang +大国daguo +大海dahai +大好dahao +大河dahe +大亨daheng +大会dahui +大*dai +代dai +带dai +待dai +袋dai +戴dai +呆dai +歹dai +傣dai +殆dai +贷dai +逮dai +怠dai +埭dai +甙dai +呔dai +岱dai +迨dai +骀dai +绐dai +玳dai +黛dai +呆板daiban +代表daibiao +逮捕daibu +逮逋daibu +代词daici +带动daidong +怠工daigong +代价daijia +贷款daikuan +带来dailai +代理daili +带领dailing +带路dailu +黛绿dailu +代码daima +怠慢daiman +待命daiming +代数daishu +代替daiti +带头daitou +歹徒daitu +待遇daiyu +呆滞daizhi +呆子daizi +打击daji +大家dajia +打搅dajiao +大街dajie +大捷dajie +打劫dajie +搭救dajiu +大局daju +答卷dajuan +打开dakai +耷拉dala +大力dali +大连dalian +大量daliang +打量daliang +大陆dalu +大略dalue +大妈dama +单dan +但dan +弹dan +担dan +石*dan +蛋dan +淡dan +胆dan +氮dan +丹dan +旦dan +耽dan +郸dan +掸dan +惮dan +诞dan +儋dan +萏dan +啖dan +澹*dan +殚dan +赕dan +眈dan +疸dan +瘅dan +聃dan +箪dan +大脑danao +担保danbao +单薄danbao +淡薄danbao +单产danchan +诞辰danchen +单纯danchun +单词danci +担当dandang +单调dandiao +单独dandu +单方danfang +担负danfu +党dang +当dang +档dang +挡dang +荡dang +谠dang +凼dang +菪dang +宕dang +砀dang +裆dang +单干dangan +胆敢dangan +档案dangan +当场dangchang +当初dangchu +当代dangdai +当地dangdi +单个dange +耽搁dange +党风dangfeng +党纲danggang +党纪dangji +党籍dangji +当即dangji +当家dangjia +当今dangjin +当局dangju +当量dangliang +当面dangmian +党内dangnei +当年dangnian +党派dangpai +当铺dangpu +当前dangqian +当然dangran +当日dangri +当时dangshi +当天dangtian +当头dangtou +党团dangtuan +当晚dangwan +党委dangwei +当先dangxian +党校dangxiao +当心dangxin +党性dangxing +荡漾dangyang +党员dangyuan +当月dangyue +党章dangzhang +当真dangzhen +党政dangzheng +当政dangzheng +当中dangzhong +当众dangzhong +当做dangzuo +单价danjia +担架danjia +胆量danliang +胆略danlue +淡漠danmo +胆怯danqie +丹青danqing +担任danren +单身danshen +诞生dansheng +但是danshi +胆识danshi +单体danti +丹田dantian +单位danwei +耽误danwu +单项danxiang +胆小danxiao +担心danxin +淡雅danya +弹药danyao +单一danyi +单元danyuan +但愿danyuan +单质danzhi +担子danzi +掸子danzi +单字danzi +到dao +道dao +导dao +刀dao +倒dao +稻dao +岛dao +捣dao +盗dao +蹈dao +祷dao +悼dao +叨dao +帱*dao +忉dao +氘dao +焘*dao +纛dao +倒闭daobi +到处daochu +悼词daoci +到达daoda +导弹daodan +道德daode +到底daodi +倒戈daoge +捣鬼daogui +捣毁daohui +到来daolai +到了daole +道理daoli +倒立daoli +道路daolu +捣乱daoluan +倒霉daomei +叨念daonian +道歉daoqian +刀枪daoqiang +盗窃daoqie +到时daoshi +导师daoshi +倒数daoshu +导体daoti +倒退daotui +导演daoyan +道义daoyi +盗用daoyong +岛屿daoyu +导致daozhi +大批dapi +大破dapo +打破dapo +大气daqi +大庆daqing +打扰darao +打扫dasao +大厦dasha +搭讪dashan +大赦dashe +大使dashi +大事dashi +大师dashi +大势dashi +大肆dasi +打算dasuan +大体dati +大厅dating +打听dating +大同datong +大小daxiao +大写daxie +答谢daxie +大选daxuan +大学daxue +大业daye +达因dayin +打印dayin +答应daying +大于dayu +大院dayuan +大约dayue +打仗dazhang +大致dazhi +大众dazhong +打字dazi +代办处dbc +得不偿失dbcs +大部分dbf +电报挂号dbgh +大不了dbl +大步流星dblx +对不起dbq +代表团dbt +电冰箱dbx +东城区dcq +到此为止dcwz +独创性dcx +调查研究dcyj +打成一片dcyp +打电话ddh +电动机ddj +对得起ddq +大多数dds +的de +得de +地*de +德de +底*de +锝de +得逞decheng +的当dedang +得当dedang +得到dedao +得分defen +德国deguo +得奖dejiang +得救dejiu +得了dele +得力deli +等deng +灯deng +登deng +邓deng +澄*deng +蹬deng +瞪deng +凳deng +噔deng +嶝deng +戥deng +磴deng +镫deng +簦deng +登场dengchang +等待dengdai +等到dengdao +灯光dengguang +等候denghou +等级dengji +登记dengji +等价dengjia +灯具dengju +登门dengmen +灯谜dengmi +登攀dengpan +登山dengshan +灯塔dengta +登台dengtai +等同dengtong +等闲dengxian +等于dengyu +登载dengzai +得胜desheng +得失deshi +得体deti +德行dexing +得以deyi +得意deyi +德育deyu +得志dezhi +得知dezhi +得罪dezui +大幅度dfd +多方面dfm +单方面dfm +电风扇dfs +大规模dgm +多功能dgn +大公无私dgws +帝国主义dgzy +电话号码dhhm +电化教育dhjy +大会堂dht +的*di +地di +第di +低di +敌di +底di +提*di +帝di +抵di +滴di +弟di +递di +堤di +迪di +笛di +狄di +涤di +翟di +嫡di +蒂di +缔di +氐di +籴di +诋di +谛di +邸di +坻*di +荻di +嘀di +娣di +绨di +柢di +棣di +觌di +砥di +碲di +睇di +镝di +羝di +骶di +嗲dia +电dian +点dian +垫dian +典dian +店dian +颠dian +淀dian +掂dian +滇dian +碘dian +靛dian +佃dian +甸dian +惦dian +奠dian +殿dian +阽dian +坫dian +巅dian +玷dian +钿dian +癜dian +癫dian +簟dian +踮dian +电报dianbao +点播dianbo +电场dianchang +电车dianche +电池dianchi +电传dianchuan +颠倒diandao +电灯diandeng +点滴diandi +奠定dianding +电动diandong +典范dianfan +淀粉dianfen +垫付dianfu +颠覆dianfu +电感diangan +典故diangu +电荷dianhe +电弧dianhu +电话dianhua +电汇dianhui +电机dianji +电极dianji +奠基dianji +惦记dianji +典籍dianji +点将dianjiang +电解dianjie +殿军dianjun +癫狂diankuang +电缆dianlan +电力dianli +电离dianli +典礼dianli +电流dianliu +电路dianlu +电脑diannao +电能dianneng +店铺dianpu +电气dianqi +电器dianqi +点燃dianran +电容dianrong +电扇dianshan +电视dianshi +电台diantai +电梯dianti +点头diantou +电网dianwang +电位dianwei +玷污dianwu +殿下dianxia +电线dianxian +癫痫dianxian +电信dianxin +典型dianxing +电讯dianxun +电压dianya +电影dianying +店员dianyuan +点阵dianzhen +点缀dianzhui +电子dianzi +点子dianzi +电阻dianzu +调diao +掉diao +吊diao +鸟*diao +碉diao +叼diao +雕diao +凋diao +刁diao +钓diao +铞diao +铫diao +貂diao +鲷diao +碉堡diaobao +凋敝diaobi +调查diaocha +吊车diaoche +调动diaodong +调度diaodu +钓饵diaoer +调换diaohuan +掉换diaohuan +雕刻diaoke +调令diaoling +刁难diaonan +调遣diaoqian +调任diaoren +雕塑diaosu +吊唁diaoyan +调用diaoyong +钓鱼diaoyu +调子diaozi +第八diba +地板diban +地步dibu +低沉dichen +抵触dichu +抵达dida +地带didai +低档didang +抵挡didang +地道didao +弟弟didi +地点didian +地段diduan +敌对didui +迭die +跌die +爹die +碟die +蝶die +谍die +叠die +垤die +堞die +揲die +喋die +牒die +瓞die +耋die +踮*die +蹀die +鲽die +迭起dieqi +第二dier +地方difang +低估digu +敌国diguo +帝国diguo +敌后dihou +诋毁dihui +低级diji +递加dijia +递减dijian +地窖dijiao +递交dijiao +缔交dijiao +缔结dijie +第九dijiu +敌军dijun +抵抗dikang +地牢dilao +地理dili +低劣dilie +第六diliu +低落diluo +地貌dimao +地面dimian +抵命diming +定ding +顶ding +钉ding +丁ding +订ding +盯ding +叮ding +鼎ding +锭ding +仃ding +啶ding +玎ding +腚ding +碇ding +町ding +铤*ding +疔ding +耵ding +酊ding +定案dingan +定产dingchan +丁当dingdang +顶点dingdian +定夺dingduo +定额dinge +顶峰dingfeng +顶锋dingfeng +定购dinggou +订购dinggou +订户dinghu +定货dinghuo +订货dinghuo +定价dingjia +定局dingju +定居dingju +定理dingli +订立dingli +鼎立dingli +定量dingliang +定律dinglu +定期dingqi +定然dingran +盯梢dingshao +定时dingshi +顶替dingti +定性dingxing +定型dingxing +定义dingyi +定语dingyu +定员dingyuan +订阅dingyue +订正dingzheng +叮嘱dingzhu +顶撞dingzhuang +钉子dingzi +嫡派dipai +地盘dipan +第七diqi +嫡亲diqin +敌情diqing +地球diqiu +地区diqu +的确dique +敌人diren +第三disan +地势dishi +第十dishi +滴水dishui +第四disi +地铁ditie +地图ditu +丢diu +铥diu +丢掉diudiao +丢脸diulian +丢失diushi +地位diwei +敌伪diwei +第五diwu +嫡系dixi +底细dixi +地下dixia +低下dixia +底下dixia +地形dixing +弟兄dixiong +第一diyi +敌意diyi +地域diyu +抵御diyu +缔造dizao +递增dizeng +地震dizhen +敌阵dizhen +地质dizhi +地址dizhi +抵制dizhi +底子dizi +弟子dizi +党纪国法djgf +当机立断djld +多劳多得dldd +大力发展dlfz +大力加强dljq +大力开展dlkz +独立自主dlzz +多面手dms +对内搞活dngh +多年来dnl +东南亚dny +动dong +东dong +冬dong +懂dong +洞dong +冻dong +董dong +栋dong +侗dong +恫dong +垌dong +咚dong +岽dong +峒dong +氡dong +胨dong +胴dong +硐dong +鸫dong +东北dongbei +东边dongbian +东部dongbu +洞察dongcha +动词dongci +动荡dongdang +懂得dongde +东方dongfang +东风dongfeng +动工donggong +东海donghai +恫吓donghe +动机dongji +冬季dongji +东家dongjia +冻结dongjie +动静dongjing +东京dongjing +动力dongli +动量dongliang +栋梁dongliang +动乱dongluan +动脉dongmai +东南dongnan +东欧dongou +动人dongren +动身dongshen +董事dongshi +动手dongshou +动态dongtai +冬天dongtian +动听dongting +动物dongwu +东西dongxi +洞悉dongxi +动向dongxiang +动心dongxin +东亚dongya +东洋dongyang +动摇dongyao +动用dongyong +动员dongyuan +动辄dongzhe +动作dongzuo +斗dou +都*dou +豆dou +读*dou +兜dou +抖dou +陡dou +逗dou +痘dou +蔸dou +窦dou +蚪dou +篼dou +兜风doufeng +逗号douhao +逗留douliu +斗室doushi +兜售doushou +斗争douzheng +斗志douzhi +斗智douzhi +抖嘴douzui +打破常规dpcg +地平线dpx +电器化dqh +待人接物drjw +第三产业dscy +第十二届dsej +大使馆dsg +到时候dsh +电视机dsj +多少年dsn +大失所望dssw +电视台dst +低三下四dsxs +第十一届dsyj +大踏步dtb +到头来dtl +大体上dts +大同小异dtxy +度du +都du +毒du +独du +读du +渡du +杜du +堵du +镀du +顿du +督du +犊du +睹du +赌du +肚du +妒du +芏du +嘟du +渎du +椟du +牍du +蠹du +笃du +髑du +黩du +断duan +端duan +段duan +短duan +锻duan +缎duan +椴duan +煅duan +簖duan +短波duanbo +短处duanchu +短促duancu +断定duanding +短短duanduan +断交duanjiao +断绝duanjue +锻练duanlian +锻炼duanlian +短路duanlu +段落duanluo +短评duanping +短期duanqi +短缺duanque +断然duanran +煅烧duanshao +断送duansong +短途duantu +端午duanwu +端详duanxiang +短小duanxiao +断言duanyan +端阳duanyang +短语duanyu +短暂duanzan +端正duanzheng +端庄duanzhuang +读报dubao +读本duben +赌博dubo +独裁ducai +毒草ducao +独唱duchang +独创duchuang +督促ducu +毒打duda +独到dudao +度过duguo +毒害duhai +毒化duhua +都会duhui +对dui +队dui +堆dui +敦*dui +兑dui +怼dui +憝dui +碓dui +对比duibi +队部duibu +对策duice +对称duichen +对此duici +对待duidai +对等duideng +对调duidiao +对方duifang +对付duifu +对话duihua +兑换duihuan +对讲duijiang +对抗duikang +对口duikou +对垒duilei +对立duili +对联duilian +队列duilie +对流duiliu +对面duimian +对内duinei +对偶duiou +对手duishou +对数duishu +对外duiwai +队伍duiwu +兑现duixian +对象duixiang +对应duiying +对于duiyu +队员duiyuan +堆栈duizhan +队长duizhang +对照duizhao +对证duizheng +对质duizhi +对峙duizhi +对准duizhun +镀金dujin +杜绝dujue +渡口dukou +都来dulai +独立duli +度量duliang +盾dun +吨dun +顿dun +蹲dun +敦dun +墩dun +囤dun +钝dun +遁dun +沌dun +炖dun +砘dun +礅dun +盹dun +镦dun +趸dun +蹲点dundian +顿号dunhao +囤积dunji +遁迹dunji +钝角dunjiao +顿时dunshi +敦实dunshi +多duo +度*duo +夺duo +朵duo +掇duo +哆duo +垛duo +躲duo +跺duo +舵duo +剁duo +惰duo +堕duo +驮*duo +咄duo +哚duo +沲duo +缍duo +柁duo +铎duo +裰duo +踱duo +多半duoban +躲避duobi +多变duobian +多边duobian +躲藏duocang +多次duoci +夺得duode +多端duoduan +多方duofang +躲开duokai +多亏duokui +夺魁duokui +堕落duoluo +多么duome +夺目duomu +多年duonian +多情duoqing +夺取duoqu +多少duoshao +多事duoshi +掇拾duoshi +舵手duoshou +多数duoshu +多谢duoxie +多心duoxin +惰性duoxing +多样duoyang +多余duoyu +多种duozhong +肚皮dupi +毒品dupin +毒气duqi +读取duqu +度日duri +读入duru +堵塞duse +毒蛇dushe +都是dushi +毒手dushou +读数dushu +读书dushu +毒素dusu +独特dute +读物duwu +毒药duyao +独占duzhan +读者duzhe +毒汁duzhi +渎职duzhi +赌注duzhu +杜撰duzhuan +独自duzi +党委会dwh +对外开放dwkf +敌我矛盾dwmd +对外贸易dwmy +大无畏dww +动物园dwy +当务之急dwzj +邓小平dxp +大学生dxs +大显身手dxss +大西洋dxy +大跃进dyj +打印机dyj +大有可为dykw +待业青年dyqn +掉以轻心dyqx +电影院dyy +大洋洲dyz +大有作为dyzw +党支部dzb +多种多样dzdy +党政机关dzjg +多种经营dzjy +断章取义dzqy +大自然dzr +德智体dzt +电子学dzx +党中央dzy +而e +二e +尔e +儿e +恶e +额e +恩e +俄e +耳e +饵e +蛾e +饿e +峨e +鹅e +讹e +娥e +厄e +扼e +遏e +鄂e +噩e +谔e +垩e +苊e +莪e +萼e +呃e +愕e +屙e +婀e +轭e +腭e +锇e +锷e +鹗e +颚e +鳄e +恶霸eba +恶毒edu +恶感egan +恶棍egun +噩耗ehao +恶化ehua +诶ei +二极管ejg +二进制ejz +恶劣elie +鹅毛emao +噩梦emeng +恶魔emo +耳目一新emyx +恩en +蒽en +摁en +恩爱enai +恩赐enci +恩典endian +恩惠enhui +恩情enqing +而er +二er +尔er +儿er +耳er +饵er +洱er +贰er +佴er +迩er +珥er +铒er +鸸er +鲕er +耳朵erduo +儿歌erge +耳光erguang +而后erhou +尔后erhou +二届erjie +而今erjin +而况erkuang +而且erqie +而是ershi +儿童ertong +儿戏erxi +而已eryi +耳语eryu +二月eryue +儿子erzi +扼杀esha +额外ewai +扼腕ewan +额外负担ewfd +恶习exi +恶心exin +恶性exing +恶性循环exxh +扼要eyao +厄运eyun +讹诈ezha +遏止ezhi +分f +发f +方f +法f +反f +放f +复f +风f +防f +非f +服f +肥f +副f +粉f +府f +夫f +负f +封f +富f +翻f +发fa +法fa +阀fa +乏fa +伐fa +罚fa +筏fa +珐fa +垡fa +砝fa +发报fabao +法宝fabao +发表fabiao +发布fabu +发财facai +发愁fachou +发出fachu +发达fada +发电fadian +法典fadian +法定fading +发动fadong +发放fafang +发奋fafen +发愤fafen +法官faguan +法规fagui +法国faguo +发慌fahuang +发挥fahui +发火fahuo +发给faji +发迹faji +法纪faji +发家fajia +发奖fajiang +发酵fajiao +罚金fajin +发觉fajue +发掘fajue +罚款fakuan +发狂fakuang +法郎falang +法令faling +法律falu +发落faluo +发明faming +反fan +翻fan +范fan +犯fan +饭fan +繁fan +泛fan +番fan +凡fan +烦fan +返fan +藩fan +帆fan +樊fan +矾fan +钒fan +贩fan +蕃fan +蘩fan +幡fan +梵fan +燔fan +畈fan +蹯fan +翻版fanban +反比fanbi +反驳fanbo +帆布fanbu +反常fanchang +范畴fanchou +犯愁fanchou +帆船fanchuan +饭店fandian +反动fandong +翻动fandong +反对fandui +繁多fanduo +反而faner +反复fanfu +方fang +放fang +防fang +访fang +房fang +纺fang +仿fang +妨fang +芳fang +肪fang +坊fang +邡fang +彷*fang +枋fang +钫fang +舫fang +鲂fang +妨碍fangai +方案fangan +反感fangan +防备fangbei +方便fangbian +防潮fangchao +方程fangcheng +放大fangda +放荡fangdang +防盗fangdao +方法fangfa +防范fangfan +防风fangfeng +防腐fangfu +仿佛fangfu +妨害fanghai +防护fanghu +防火fanghuo +放假fangjia +房间fangjian +方面fangmian +放牧fangmu +返工fangong +反攻fangong +放屁fangpi +放弃fangqi +防区fangqu +放任fangren +放哨fangshao +放射fangshe +方式fangshi +防守fangshou +放肆fangsi +放松fangsong +仿宋fangsong +翻滚fangun +方位fangwei +防卫fangwei +访问fangwen +房屋fangwu +放下fangxia +防线fangxian +方向fangxiang +芳香fangxiang +仿效fangxiao +放心fangxin +放行fangxing +方言fangyan +防疫fangyi +防御fangyu +仿造fangzao +仿照fangzhao +方针fangzhen +仿真fangzhen +防治fangzhi +仿制fangzhi +放置fangzhi +防止fangzhi +纺织fangzhi +房子fangzi +放纵fangzong +房租fangzu +番号fanhao +繁华fanhua +反悔fanhui +返回fanhui +反击fanji +反抗fankang +反馈fankui +泛滥fanlan +范例fanli +凡例fanli +翻脸fanlian +贩卖fanmai +繁忙fanmang +烦闷fanmen +反面fanmian +反目fanmu +烦恼fannao +反叛fanpan +犯人fanren +繁荣fanrong +反射fanshe +翻身fanshen +繁盛fansheng +凡是fanshi +凡事fanshi +繁琐fansuo +烦琐fansuo +翻腾fanteng +繁体fanti +饭桶fantong +发怒fanu +饭碗fanwan +范围fanwei +反问fanwen +反响fanxiang +返销fanxiao +反省fanxing +翻修fanxiu +繁衍fanyan +翻译fanyi +翻印fanyin +反应fanying +反映fanying +繁育fanyu +翻越fanyue +翻阅fanyue +贩运fanyun +繁杂fanza +烦燥fanzao +反正fanzheng +反之fanzhi +繁殖fanzhi +繁重fanzhong +贩子fanzi +犯罪fanzui +发起faqi +法权faquan +发射fashe +发生fasheng +发誓fashi +发售fashou +法庭fating +发现faxian +发泄faxie +发行faxing +发言fayan +发扬fayang +法医fayi +发育fayu +发源fayuan +法院fayuan +法则faze +发展fazhan +法制fazhi +法治fazhi +发作fazuo +奋不顾身fbgs +分崩离析fblx +副产品fcp +发电机fdj +发动机fdj +反动派fdp +分道扬镳fdyb +非fei +肥fei +飞fei +费fei +废fei +肺fei +沸fei +菲fei +匪fei +啡fei +诽fei +吠fei +芾fei +狒fei +悱fei +淝fei +妃fei +绯fei +榧fei +腓fei +斐fei +扉fei +镄fei +痱fei +蜚fei +篚fei +翡fei +霏fei +鲱fei +匪帮feibang +诽谤feibang +飞奔feiben +非常feichang +飞驰feichi +废除feichu +非但feidan +非得feide +沸点feidian +非法feifa +非凡feifan +肺腑feifu +绯红feihong +废话feihua +飞机feiji +飞溅feijian +费解feijie +费劲feijin +飞快feikuai +费力feili +肥料feiliao +废料feiliao +肥胖feipang +废品feipin +废弃feiqi +费神feishen +废水feishui +飞速feisu +沸腾feiteng +匪徒feitu +肥沃feiwo +废物feiwu +飞舞feiwu +飞翔feixiang +费心feixin +飞行feixing +废墟feixu +飞扬feiyang +扉页feiye +非议feiyi +费用feiyong +飞跃feiyue +肥皂feizao +飞涨feizhang +废止feizhi +非洲feizhou +妃子feizi +分fen +粉fen +奋fen +份fen +粪fen +纷fen +芬fen +愤fen +酚fen +吩fen +氛fen +坟fen +焚fen +汾fen +忿fen +偾fen +瀵fen +玢*fen +棼fen +鲼fen +鼢fen +分贝fenbei +分辩fenbian +分辨fenbian +粪便fenbian +分别fenbie +分部fenbu +分布fenbu +分册fence +分寸fencun +分担fendan +分得fende +分店fendian +奋斗fendou +分队fendui +分发fenfa +奋发fenfa +纷纷fenfen +吩咐fenfu +风feng +封feng +蜂feng +丰feng +缝feng +峰feng +锋feng +疯feng +奉feng +枫feng +烽feng +逢feng +冯feng +讽feng +凤feng +俸feng +酆feng +葑feng +唪feng +沣feng +砜feng +风暴fengbao +丰碑fengbei +封闭fengbi +风波fengbo +丰产fengchan +奉承fengcheng +讽刺fengci +封存fengcun +风度fengdu +分割fenge +分隔fenge +风发fengfa +风帆fengfan +丰富fengfu +奉告fenggao +风格fengge +奉公fenggong +风光fengguang +风寒fenghan +奉还fenghuan +凤凰fenghuang +烽火fenghuo +封建fengjian +风景fengjing +疯狂fengkuang +风浪fenglang +风力fengli +风流fengliu +丰满fengman +锋芒fengmang +风貌fengmao +奉命fengming +丰年fengnian +分工fengong +奉陪fengpei +风气fengqi +风情fengqing +风趣fengqu +奉劝fengquan +缝纫fengren +风骚fengsao +风沙fengsha +风尚fengshang +风声fengsheng +丰盛fengsheng +丰收fengshou +风霜fengshuang +风水fengshui +丰硕fengshuo +奉祀fengsi +风俗fengsu +封锁fengsuo +疯瘫fengtan +封条fengtiao +风头fengtou +分管fenguan +风味fengwei +缝隙fengxi +风险fengxian +奉献fengxian +风向fengxiang +风行fengxing +奉行fengxing +蜂拥fengyong +风云fengyun +风韵fengyun +风灾fengzai +疯子fengzi +风姿fengzi +分号fenhao +分毫fenhao +分红fenhong +粉红fenhong +分化fenhua +分会fenhui +焚毁fenhui +分级fenji +分解fenjie +分界fenjie +奋进fenjin +分居fenju +分开fenkai +愤慨fenkai +分类fenlei +分离fenli +奋力fenli +分量fenliang +分裂fenlie +纷乱fenluan +分娩fenmian +分秒fenmiao +分明fenming +粉末fenmo +坟墓fenmu +愤怒fennu +分派fenpai +分配fenpei +分批fenpi +分期fenqi +分歧fenqi +奋起fenqi +分清fenqing +分区fenqu +分散fensan +焚烧fenshao +分数fenshu +分说fenshuo +粉碎fensui +分摊fentan +粪土fentu +分外fenwai +氛围fenwei +分析fenxi +奋勇fenyong +分赃fenzang +奋战fenzhan +分支fenzhi +分子fenzi +分组fenzu +丰富多采ffdc +奋发图强fftq +反过来说fgls +反革命fgm +福建省fjs +封建主义fjzy +翻来覆去flfq +法律顾问flgw +分秒必争fmbz +发明创造fmcz +否fou +缶fou +否定fouding +否决foujue +否认fouren +否则fouze +费品率fpl +废寝忘食fqws +缝纫机frj +分水岭fsl +翻天复地ftfd +丰台区ftq +非同小可ftxk +繁体字ftz +复fu +服fu +副fu +府fu +夫fu +负fu +富fu +附fu +福fu +伏fu +符fu +幅fu +腐fu +浮fu +辅fu +付fu +腹fu +妇fu +孵fu +覆fu +扶fu +辐fu +傅fu +佛fu +缚fu +父fu +弗fu +甫fu +肤fu +氟fu +敷fu +拂fu +俘fu +涪fu +袱fu +抚fu +俯fu +釜fu +斧fu +脯fu +腑fu +赴fu +赋fu +阜fu +讣fu +咐fu +匐fu +凫fu +郛fu +芙fu +芾*fu +苻fu +茯fu +莩fu +菔fu +拊fu +呋fu +幞fu +怫fu +滏fu +艴fu +孚fu +驸fu +绂fu +绋fu +桴fu +赙fu +祓fu +砩fu +黻fu +黼fu +罘fu +稃fu +馥fu +蚨fu +蜉fu +蝠fu +蝮fu +麸fu +趺fu +跗fu +鲋fu +鳆fu +腐败fubai +复辟fubi +复查fucha +浮沉fuchen +扶持fuchi +付出fuchu +副词fuci +服从fucong +附带fudai +负担fudan +辅导fudao +浮雕fudiao +浮动fudong +幅度fudu +复发fufa +伏法fufa +夫妇fufu +覆盖fugai +讣告fugao +富贵fugui +符号fuhao +附和fuhe +符合fuhe +负荷fuhe +腐化fuhua +浮华fuhua +复活fuhuo +俘获fuhuo +伏击fuji +附加fujia +附件fujian +福建fujian +佛教fujiao +附近fujin +副刊fukan +俯瞰fukan +浮夸fukua +付款fukuan +腐烂fulan +福利fuli +浮力fuli +富丽fuli +妇联fulian +附录fulu +俘虏fulu +覆灭fumie +覆没fumo +父母fumu +富农funong +妇女funu +扶贫fupin +服气fuqi +福气fuqi +夫妻fuqi +付讫fuqi +肤浅fuqian +富强fuqiang +父亲fuqin +富饶furao +夫人furen +芙蓉furong +妇孺furu +负伤fushang +辐射fushe +复试fushi +腐蚀fushi +俯视fushi +副手fushou +复数fushu +负数fushu +附属fushu +富庶fushu +赋税fushui +伏特fute +覆亡fuwang +富翁fuweng +服务fuwu +复习fuxi +浮现fuxian +赋闲fuxian +浮想fuxiang +腐朽fuxiu +抚恤fuxu +敷衍fuyan +扶养fuyang +抚养fuyang +俯仰fuyang +副业fuye +服役fuyi +复印fuyin +富有fuyou +赋有fuyou +赋于fuyu +抚育fuyu +富裕fuyu +赋予fuyu +复员fuyuan +复原fuyuan +负约fuyue +复杂fuza +负载fuzai +附则fuze +负责fuze +负债fuzhai +付帐fuzhang +复制fuzhi +扶植fuzhi +附中fuzhong +福州fuzhou +抚州fuzhou +附注fuzhu +辅助fuzhu +扶助fuzhu +服装fuzhuang +附着fuzhuo +富足fuzu +辅佐fuzuo +服务部fwb +服务态度fwtd +服务员fwy +方兴未艾fxwa +奋勇当先fydx +翻一番fyf +风言风语fyfy +发扬光大fygd +复印机fyj +发言人fyr +风雨同舟fytz +房租费fzf +副总理fzl +纺织品fzp +福州市fzs +反作用fzy +副作用fzy +负责制fzz +发展中国家fzzj +个g +国g +工g +过g +高g +干g +关g +各g +革g +公g +根g +更g +改g +管g +光g +广g +果g +格g +共g +搞g +夹*ga +噶ga +嘎ga +胳*ga +尬ga +尕ga +尜ga +旮ga +钆ga +公安部gab +改gai +该gai +盖gai +概gai +钙gai +溉gai +芥*gai +丐gai +陔gai +垓gai +戤gai +赅gai +改变gaibian +改编gaibian +该当gaidang +改道gaidao +改动gaidong +改革gaige +改观gaiguan +改过gaiguo +改悔gaihui +改建gaijian +改进gaijin +概况gaikuang +概括gaikuo +改良gailiang +概率gailu +概论gailun +概貌gaimao +概念gainian +改期gaiqi +改善gaishan +概述gaishu +概叹gaitan +改天gaitian +改选gaixuan +概要gaiyao +改造gaizao +改正gaizheng +改装gaizhuang +改组gaizu +公安局gaj +干gan +杆gan +感gan +敢gan +赶gan +甘gan +肝gan +秆gan +柑gan +竿gan +赣gan +乾*gan +坩gan +苷gan +尴gan +擀gan +泔gan +淦gan +澉gan +绀gan +橄gan +旰gan +矸gan +疳gan +酐gan +干部ganbu +感触ganchu +干脆gancui +敢当gandang +甘当gandang +感到gandao +感动gandong +感恩ganen +刚gang +钢gang +缸gang +纲gang +岗gang +港gang +杠gang +冈gang +肛gang +扛*gang +戆gang +罡gang +筻gang +尴尬ganga +港澳gangao +刚才gangcai +钢材gangcai +刚刚ganggang +刚好ganghao +港口gangkou +纲领gangling +岗哨gangshao +钢铁gangtie +港湾gangwan +岗位gangwei +港务gangwu +刚要gangyao +纲要gangyao +刚毅gangyi +干旱ganhan +感化ganhua +干活ganhuo +肝火ganhuo +感激ganji +干劲ganjin +赶紧ganjin +干净ganjing +感觉ganjue +感慨gankai +甘苦ganku +赶快gankuai +赶忙ganmang +感冒ganmao +感情ganqing +感染ganran +干扰ganrao +干涉ganshe +干事ganshi +感受ganshou +甘肃gansu +感叹gantan +干线ganxian +感想ganxiang +敢想ganxiang +感谢ganxie +甘心ganxin +感性ganxing +感应ganying +敢于ganyu +干预ganyu +甘愿ganyuan +干燥ganzao +感召ganzhao +赣州ganzhou +敢做ganzuo +高gao +搞gao +告gao +稿gao +膏gao +篙gao +皋gao +羔gao +糕gao +镐gao +睾gao +诰gao +郜gao +藁gao +缟gao +槔gao +槁gao +杲gao +锆gao +高矮gaoai +高昂gaoang +告别gaobie +高产gaochan +高超gaochao +高潮gaochao +告成gaocheng +告辞gaoci +高大gaoda +高档gaodang +高等gaodeng +高地gaodi +高低gaodi +糕点gaodian +高度gaodu +告发gaofa +高峰gaofeng +高高gaogao +高歌gaoge +高贵gaogui +高喊gaohan +搞好gaohao +高呼gaohu +搞坏gaohuai +高级gaoji +告急gaoji +高价gaojia +高见gaojian +稿件gaojian +告捷gaojie +告诫gaojie +高龄gaoling +高楼gaolou +告密gaomi +高明gaoming +高能gaoneng +高攀gaopan +高频gaopin +高强gaoqiang +高山gaoshan +高尚gaoshang +高深gaoshen +告示gaoshi +高耸gaosong +高速gaosu +告诉gaosu +高温gaowen +高小gaoxiao +高校gaoxiao +高兴gaoxing +膏药gaoyao +高原gaoyuan +高涨gaozhang +高招gaozhao +高中gaozhong +告终gaozhong +告状gaozhuang +稿子gaozi +港澳同胞gatb +怪不得gbd +各部门gbm +各部委gbw +供不应求gbyq +故步自封gbzf +共产党gcd +共产党员gcdy +工程师gcs +顾此失彼gcsb +贯彻执行gczx +共产主义gczy +各地方gdf +各大军区gdjq +广东省gds +高档商品gdsp +各单位gdw +高等院校gdyx +固定资产gdzc +个ge +各ge +革ge +合*ge +格ge +割ge +歌ge +隔ge +盖*ge +哥ge +铬ge +阁ge +戈ge +葛ge +搁ge +鸽ge +胳ge +疙ge +蛤ge +咯*ge +屹*ge +鬲ge +仡ge +哿ge +圪ge +塥ge +嗝ge +纥*ge +搿ge +膈ge +硌ge +镉ge +袼ge +颌*ge +虼ge +舸ge +骼ge +隔壁gebi +戈壁gebi +个别gebie +歌唱gechang +各处gechu +革除gechu +疙瘩geda +各地gedi +格调gediao +隔断geduan +个个gege +各个gege +各国geguo +隔阂gehe +歌喉gehou +各级geji +各界gejie +格局geju +割据geju +隔绝gejue +各类gelei +隔离geli +割裂gelie +格律gelu +革命geming +隔膜gemo +给gei +根gen +跟gen +亘gen +茛gen +哏gen +艮gen +根本genben +根除genchu +根底gendi +更geng +耕geng +颈geng +庚geng +羹geng +埂geng +耿geng +梗geng +哽geng +赓geng +绠geng +鲠geng +耕地gengdi +更迭gengdie +更动gengdong +更多gengduo +更改genggai +梗概genggai +更高genggao +更换genghuan +更加gengjia +更为gengwei +颈项gengxiang +更新gengxin +哽咽gengyan +耕耘gengyun +更正gengzheng +耿直gengzhi +梗直gengzhi +耕种gengzhong +梗阻gengzu +耕作gengzuo +根基genji +根据genju +跟前genqian +跟随gensui +根源genyuan +根治genzhi +跟着genzhuo +根子genzi +跟踪genzong +搁浅geqian +歌曲gequ +个人geren +格式geshi +歌颂gesong +个体geti +格外gewai +各位gewei +歌舞gewu +阁下gexia +各项gexiang +革新gexin +个性gexing +格言geyan +各样geyang +歌咏geyong +搁置gezhi +各种gezhong +各族gezu +国防部gfb +各方面gfm +格格不入ggbr +归根到底ggdd +恭恭敬敬ggjj +滚瓜烂熟ggls +歌功颂德ggsd +共和国ghg +各行各业ghgy +干劲冲天gjct +各级党委gjdw +各级领导gjld +国家利益gjly +国计民生gjms +工具书gjs +各尽所能gjsn +国库券gkq +工矿企业gkqy +孤陋寡闻glgw +规律性glx +国民党gmd +革命化gmh +革命家gmj +国民经济gmjj +购买力gml +光明磊落gmll +光明日报gmrb +顾名思义gmsy +冠冕堂皇gmth +刮目相看gmxk +光明正大gmzd +工农兵gnb +国内外gnw +工农业gny +工gong +公gong +共gong +供gong +功gong +攻gong +红*gong +巩gong +贡gong +汞gong +宫gong +恭gong +龚gong +躬gong +弓gong +拱gong +珙gong +肱gong +蚣gong +觥gong +公安gongan +公报gongbao +工本gongben +公布gongbu +公差gongcha +公拆gongchai +工厂gongchang +功臣gongchen +工程gongcheng +共处gongchu +供词gongci +共存gongcun +公道gongdao +公德gongde +功德gongde +工地gongdi +公敌gongdi +宫殿gongdian +攻读gongdu +公费gongfei +公愤gongfen +工夫gongfu +功夫gongfu +公告gonggao +公共gonggong +巩固gonggu +公关gongguan +公害gonghai +公函gonghan +共和gonghe +工会gonghui +供给gongji +共计gongji +攻击gongji +功绩gongji +公家gongjia +公斤gongjin +恭敬gongjing +工具gongju +公开gongkai +功课gongke +公款gongkuan +功劳gonglao +公理gongli +公里gongli +公历gongli +公路gonglu +功率gonglu +公民gongmin +共鸣gongming +公墓gongmu +功能gongneng +工农gongnong +公判gongpan +公平gongping +公仆gongpu +供求gongqiu +工区gongqu +公然gongran +工人gongren +公认gongren +供认gongren +工伤gongshang +公社gongshe +公审gongshen +工时gongshi +公事gongshi +共事gongshi +公式gongshi +公署gongshu +公司gongsi +公私gongsi +公诉gongsu +宫廷gongting +共同gongtong +恭维gongwei +公文gongwen +公物gongwu +公务gongwu +恭喜gongxi +贡献gongxian +工效gongxiao +功效gongxiao +供销gongxiao +共性gongxing +工序gongxu +共需gongxu +功勋gongxun +供养gongyang +工业gongye +工艺gongyi +供应gongying +公用gongyong +共有gongyou +公元gongyuan +公园gongyuan +公约gongyue +公允gongyun +公债gongzhai +公章gongzhang +共振gongzhen +工整gongzheng +公正gongzheng +公证gongzheng +供职gongzhi +公众gongzhong +工资gongzi +工作gongzuo +够gou +构gou +沟gou +句*gou +狗gou +钩gou +勾gou +购gou +苟gou +垢gou +佝gou +诟gou +岣gou +遘gou +媾gou +缑gou +枸gou +觏gou +彀gou +笱gou +篝gou +鞲gou +构成goucheng +勾搭gouda +勾当goudang +媾和gouhe +沟壑gouhe +构件goujian +勾结goujie +购买goumai +苟且gouqie +构思gousi +沟通goutong +勾通goutong +构陷gouxian +勾销gouxiao +购销gouxiao +勾引gouyin +构造gouzao +购置gouzhi +钩子gouzi +国庆节gqj +共青团gqt +光荣榜grb +根深蒂固gsdg +瓜熟蒂落gsdl +公使馆gsg +各式各样gsgy +甘肃省gss +工商业gsy +个体户gth +改头换面gthm +高谈阔论gtkl +鼓gu +固gu +古gu +骨gu +故gu +顾gu +股gu +谷gu +估gu +雇gu +孤gu +姑gu +贾*gu +辜gu +菇gu +咕gu +箍gu +沽gu +蛊gu +嘏gu +诂gu +菰gu +呱gu +崮gu +汩gu +梏gu +轱gu +牯gu +牿gu +臌gu +毂gu +瞽gu +罟gu +钴gu +锢gu +鸪gu +鹄*gu +痼gu +蛄gu +酤gu +觚gu +鲴gu +鹘gu +挂gua +刮gua +瓜gua +括*gua +剐gua +寡gua +褂gua +卦gua +诖gua +呱gua +栝gua +胍gua +鸹gua +瓜分guafen +瓜葛guage +挂号guahao +怪guai +乖guai +拐guai +乖舛guaichuan +乖戾guaili +乖僻guaipi +乖巧guaiqiao +怪物guaiwu +怪异guaiyi +拐杖guaizhang +挂名guaming +关guan +管guan +观guan +官guan +灌guan +贯guan +惯guan +冠guan +馆guan +罐guan +棺guan +纶*guan +倌guan +莞guan +掼guan +涫guan +盥guan +鹳guan +矜guan +鳏guan +关闭guanbi +观测guance +观察guancha +贯彻guanche +贯穿guanchuan +管道guandao +官邸guandi +观点guandian +官方guanfang +光guang +广guang +逛guang +咣guang +犷guang +桄guang +胱guang +灌溉guangai +光标guangbiao +广播guangbo +广博guangbo +光彩guangcai +广场guangchang +光大guangda +广大guangda +广东guangdong +广度guangdu +广泛guangfan +广告guanggao +光顾guanggu +光滑guanghua +光辉guanghui +光景guangjing +广阔guangkuo +光芒guangmang +广袤guangmao +光明guangming +光盘guangpan +光谱guangpu +光荣guangrong +观光guanguang +广西guangxi +光线guangxian +广义guangyi +光阴guangyin +光涌guangyong +广州guangzhou +关怀guanhuai +挂念guanian +管家guanjia +关键guanjian +管教guanjiao +关节guanjie +冠军guanjun +关卡guanka +观看guankan +关口guankou +管理guanli +贯例guanli +惯例guanli +官吏guanli +关联guanlian +官僚guanliao +观摩guanmo +灌木guanmu +官能guanneng +观念guannian +关切guanqie +观赏guanshang +管事guanshi +管束guanshu +灌输guanshu +关税guanshui +官司guansi +贯通guantong +关头guantou +观望guanwang +关系guanxi +管辖guanxia +官衔guanxian +关心guanxin +惯性guanxing +关押guanya +惯用guanyong +关于guanyu +官员guanyuan +观战guanzhan +关照guanzhao +管制guanzhi +观止guanzhi +观众guanzhong +关注guanzhu +贯注guanzhu +馆子guanzi +挂失guashi +挂帅guashuai +鼓吹guchui +故此guci +古代gudai +孤单gudan +故地gudi +古典gudian +固定guding +鼓动gudong +股东gudong +古董gudong +孤独gudu +咕嘟gudu +孤儿guer +股份gufen +辜负gufu +骨干gugan +雇工gugong +故宫gugong +古怪guguai +蛊惑guhuo +规gui +贵gui +归gui +硅gui +鬼gui +轨gui +龟gui +桂gui +瑰gui +圭gui +闺gui +诡gui +癸gui +柜gui +跪gui +刽gui +傀*gui +炔*gui +匦gui +刿gui +庋gui +宄gui +妫gui +桧gui +炅gui +晷gui +皈gui +簋gui +鲑gui +鳜gui +诡辩guibian +贵宾guibin +归并guibing +规程guicheng +归档guidang +轨道guidao +规定guiding +归队guidui +规范guifan +规格guige +归公guigong +归功guigong +桂冠guiguan +归国guiguo +规划guihua +鬼话guihua +归还guihuan +诡计guiji +轨迹guiji +贵贱guijian +归咎guijiu +规矩guiju +瑰丽guili +鬼脸guilian +龟裂guilie +规律guilu +诡秘guimi +规模guimo +归纳guina +闺女guinu +规劝guiquan +贵人guiren +归属guishu +龟缩guisuo +柜台guitai +闺秀guixiu +归于guiyu +规则guize +规章guizhang +贵重guizhong +贵州guizhou +鬼子guizi +贵族guizu +归罪guizui +顾及guji +估计guji +古迹guji +顾忌guji +估价gujia +古今gujin +古旧gujiu +故旧gujiu +故居guju +顾客guke +孤苦guku +古老gulao +孤立guli +鼓励guli +估量guliang +顾虑gulu +估摸gumo +滚gun +辊gun +棍gun +衮gun +绲gun +磙gun +鲧gun +滚动gundong +姑娘guniang +雇农gunong +滚烫guntang +棍子gunzi +国guo +过guo +果guo +锅guo +郭guo +涡*guo +裹guo +馘guo +埚guo +掴guo +呙guo +帼guo +崞guo +猓guo +椁guo +虢guo +聒guo +蜾guo +蝈guo +过半guoban +国策guoce +国产guochan +过程guocheng +过错guocuo +过度guodu +过渡guodu +果断guoduan +国法guofa +国防guofang +过分guofen +果腹guofu +果敢guogan +国歌guoge +过关guoguan +过后guohou +国会guohui +国际guoji +国籍guoji +国家guojia +国界guojie +国境guojing +国库guoku +过来guolai +过量guoliang +过虑guolu +锅炉guolu +国民guomin +过目guomu +果木guomu +国难guonan +国内guonei +果皮guopi +果品guopin +国旗guoqi +过期guoqi +国情guoqing +国庆guoqing +过去guoqu +果然guoran +过少guoshao +过甚guoshen +过剩guosheng +过时guoshi +国事guoshi +过失guoshi +果实guoshi +过头guotou +国外guowai +国王guowang +过问guowen +国务guowu +过细guoxi +国药guoyao +国营guoying +过硬guoying +过于guoyu +果园guoyuan +果真guozhen +锅子guozi +顾盼gupan +孤僻gupi +股票gupiao +骨气guqi +姑且guqie +顾全guquan +固然guran +古人guren +骨肉gurou +故事gushi +股市gushi +固守gushou +估算gusuan +固体guti +骨头gutou +故土gutu +顾问guwen +古文guwen +谷物guwu +鼓舞guwu +姑息guxi +故乡guxiang +故意guyi +雇佣guyong +固有guyou +雇员guyuan +鼓掌guzhang +故障guzhang +固执guzhi +拐弯抹角gwmj +国务委员gwwy +国务院gwy +改邪归正gxgz +更新换代gxhd +各行其事gxqs +感性认识gxrs +广西壮族gxzz +工业化gyh +工艺流程gylc +工艺美术gyms +工业品gyp +工艺品gyp +贵阳市gys +公有制gyz +各种各样gzgy +工资级别gzjb +各族人民gzrm +工作上gzs +广州市gzs +贵州省gzs +各自为政gzwz +高瞻远瞩gzyz +高瞻远嘱gzyz +工作者gzz +和h +会h +后h +化h +好h +合h +还h +活h +很h +回h +号h +毫h +花h +或h +海h +话h +红h +火h +黄h +害h +哈ha +蛤*ha +虾*ha +铪ha +哈达hada +还hai +海hai +害hai +孩hai +骸hai +氦hai +亥hai +骇hai +嘿*hai +咳*hai +嗨hai +胲hai +醢hai +海岸haian +海拔haiba +海报haibao +害虫haichong +害处haichu +海岛haidao +海港haigang +海关haiguan +还好haihao +海疆haijiang +海军haijun +海浪hailang +海绵haimian +害怕haipa +海上haishang +还是haishi +海外haiwai +海湾haiwan +海峡haixia +海啸haixiao +害羞haixiu +海洋haiyang +还要haiyao +还有haiyou +海域haiyu +海员haiyuan +孩子haizi +含han +焊han +旱han +喊han +汉han +寒han +汗han +函han +韩han +酣han +憨han +邯han +涵han +罕han +翰han +撼han +捍han +憾han +悍han +邗han +菡han +撖han +阚han +瀚han +晗han +焓han +顸han +颔han +蚶han +鼾han +寒潮hanchao +寒带handai +行*hang +航hang +夯hang +杭hang +吭*hang +巷*hang +沆hang +绗hang +珩hang +颃hang +航标hangbiao +航程hangcheng +航船hangchuan +行当hangdang +航道hangdao +航海hanghai +行家hangjia +行距hangju +航空hangkong +行列hanglie +航路hanglu +航模hangmo +函购hangou +行情hangqing +航天hangtian +航线hangxian +航向hangxiang +航行hangxing +航运hangyun +杭州hangzhou +含糊hanhu +含混hanhun +旱季hanji +函件hanjian +罕见hanjian +汉奸hanjian +喊叫hanjiao +焊接hanjie +寒冷hanleng +翰林hanlin +寒流hanliu +函授hanshou +函数hanshu +酣睡hanshui +寒酸hansuan +捍卫hanwei +含蓄hanxu +寒暄hanxuan +涵养hanyang +含义hanyi +涵义hanyi +汉语hanyu +含冤hanyuan +旱灾hanzai +汉字hanzi +汉族hanzu +好hao +号hao +毫hao +耗hao +豪hao +郝hao +浩hao +镐*hao +壕hao +嚎hao +貉*hao +蒿hao +薅hao +嗥hao +嚆hao +濠hao +灏hao +昊hao +皓hao +颢hao +蚝hao +好比haobi +毫不haobu +号称haocheng +好处haochu +浩大haoda +好歹haodai +浩荡haodang +好的haode +浩繁haofan +耗费haofei +好感haogan +好汉haohan +豪华haohua +好坏haohuai +号角haojiao +耗竭haojie +豪杰haojie +浩劫haojie +好看haokan +毫厘haoli +号令haoling +号码haoma +豪迈haomai +毫毛haomao +毫米haomi +浩淼haomiao +好奇haoqi +豪强haoqiang +豪情haoqing +好人haoren +豪绅haoshen +毫升haosheng +好事haoshi +豪爽haoshuang +好似haosi +耗损haosun +号啕haotao +好听haoting +好玩haowan +毫无haowu +好象haoxiang +好些haoxie +好样haoyang +好意haoyi +号召haozhao +好转haozhuan +汇编程序hbcx +货币回笼hbhl +货币流通hblt +河北省hbs +湖北省hbs +汇编语言hbyy +或多或少hdhs +海淀区hdq +和he +合he +河he +何he +核he +赫he +荷he +褐he +喝he +贺he +呵he +禾he +吓*he +盒he +菏he +貉he +阂he +涸he +鹤he +诃he +劾he +壑he +嗬he +阖he +纥he +曷he +盍he +颌he +蚵he +翮he +和蔼heai +哈尔滨heb +合办heban +荷包hebao +河北hebei +何必hebi +合并hebing +哈尔滨市hebs +何不hebu +喝彩hecai +合唱hechang +何尝hechang +合成hecheng +呵斥hechi +何处hechu +河川hechuan +河床hechuang +贺词heci +何等hedeng +贺电hedian +核定heding +核对hedui +合法hefa +何妨hefang +合肥hefei +合格hege +和好hehao +赫赫hehe +合乎hehu +合伙hehuo +黑hei +嘿hei +黑暗heian +黑白heibai +黑帮heibang +嘿嘿heihei +黑人heiren +黑色heise +黑市heishi +黑夜heiye +合计heji +核计heji +和解hejie +合金hejin +何苦heku +何况hekuang +合理heli +合力heli +合流heliu +河流heliu +合谋hemou +和睦hemu +很hen +狠hen +痕hen +恨hen +河南henan +狠毒hendu +很多henduo +河内henei +行*heng +横heng +衡heng +恒heng +哼heng +亨heng +蘅heng +珩*heng +桁heng +横财hengcai +哼哧hengchi +横幅hengfu +横亘henggen +横贯hengguan +横祸henghuo +横加hengjia +衡量hengliang +横蛮hengman +横批hengpi +衡器hengqi +横扫hengsao +横竖hengshu +恒心hengxin +横行hengxing +恒星hengxing +很好henhao +贺年henian +痕迹henji +很快henkuai +狠心henxin +狠抓henzhua +和平heping +和气heqi +河渠hequ +赫然heran +河山heshan +和尚heshang +合适heshi +核实heshi +合算hesuan +核算hesuan +河滩hetan +合同hetong +贺喜hexi +和谐hexie +核心hexin +贺信hexin +和煦hexu +何以heyi +合影heying +合营heying +核准hezhun +合资hezi +赫兹hezi +合作hezuo +合法权益hfqy +合肥市hfs +宏观世界hgsj +化公为私hgws +好高务远hgwy +核工业部hgyb +海关总署hgzs +后顾之忧hgzy +呼和浩特hhht +轰轰烈烈hhll +换句话说hjhs +黄金时代hjsd +环境卫生hjws +后继有人hjyr +海枯石烂hksl +合理化hlh +糊里糊涂hlht +黑龙江hlj +汗流浃背hljb +汗马功劳hmgl +海南岛hnd +河南省hns +湖南省hns +红hong +洪hong +轰hong +烘hong +哄hong +虹hong +鸿hong +宏hong +弘hong +黉hong +訇hong +讧hong +荭hong +蕻hong +薨hong +闳hong +泓hong +红尘hongchen +轰动hongdong +洪都hongdu +洪峰hongfeng +鸿沟honggou +宏观hongguan +红光hongguang +红花honghua +红军hongjun +红利hongli +洪亮hongliang +轰隆honglong +弘论honglun +鸿毛hongmao +轰鸣hongming +哄骗hongpian +红旗hongqi +红人hongren +红色hongse +洪水hongshui +哄抬hongtai +宏图hongtu +宏伟hongwei +红星hongxing +弘扬hongyang +鸿运hongyun +红晕hongyun +轰炸hongzha +后hou +候hou +厚hou +侯hou +喉hou +猴hou +吼hou +堠hou +後hou +逅hou +瘊hou +篌hou +糇hou +鲎hou +骺hou +后备houbei +后辈houbei +后边houbian +厚薄houbo +候补houbu +后尘houchen +后代houdai +厚道houdao +厚度houdu +后盾houdun +后方houfang +后果houguo +后患houhuan +后悔houhui +后记houji +后进houjin +后劲houjin +后来houlai +喉咙houlong +后门houmen +后面houmian +后期houqi +后勤houqin +后人houren +喉舌houshe +厚实houshi +后嗣housi +后台houtai +后天houtian +后退houtui +后续houxu +候选houxuan +后裔houyi +后缀houzhui +和平共处hpgc +黄埔江hpj +后勤部hqb +何去何从hqhc +合情合理hqhl +好容易hry +好事多磨hsdm +胡思乱想hslx +航天工业部htgb +昏头昏脑hthn +欢天喜地htxd +和*hu +护hu +互hu +湖hu +呼hu +户hu +弧hu +乎hu +胡hu +糊hu +虎hu +忽hu +核*hu +瑚hu +戏*hu +壶hu +葫hu +蝴hu +狐hu +唬hu +沪hu +冱hu +唿hu +囫hu +岵hu +猢hu +怙hu +惚hu +浒hu +滹hu +琥hu +槲hu +轷hu +觳hu +烀hu +煳hu +戽hu +扈hu +祜hu +瓠hu +鹄hu +鹕hu +鹱hu +笏hu +醐hu +斛hu +化hua +花hua +话hua +划hua +滑hua +华hua +画hua +哗hua +猾hua +豁*hua +骅hua +桦hua +砉hua +铧hua +画报huabao +华北huabei +哗变huabian +话柄huabing +划拨huabo +划策huace +画册huace +华东huadong +花朵huaduo +花儿huaer +化肥huafei +花费huafei +划分huafen +化工huagong +华贵huagui +化合huahe +花卉huahui +坏huai +怀huai +划*huai +淮huai +槐huai +徊huai +踝huai +怀抱huaibao +淮北huaibei +坏处huaichu +怀古huaigu +淮海huaihai +怀恨huaihen +怀旧huaijiu +淮南huainan +怀念huainian +坏人huairen +坏事huaishi +怀疑huaiyi +怀着huaizhe +滑稽huaji +画家huajia +话剧huaju +哗啦huala +画廊hualang +华丽huali +画面huamian +化名huaming +还*huan +环huan +换huan +欢huan +缓huan +患huan +幻huan +焕huan +桓huan +唤huan +痪huan +豢huan +涣huan +宦huan +郇huan +奂huan +萑huan +擐huan +圜huan +獾huan +洹huan +浣huan +漶huan +寰huan +逭huan +缳huan +锾huan +鲩huan +鬟huan +华南huanan +欢畅huanchang +缓冲huanchong +幻灯huandeng +欢度huandu +焕发huanfa +黄huang +簧huang +荒huang +皇huang +慌huang +蝗huang +磺huang +凰huang +惶huang +煌huang +晃huang +幌huang +恍huang +谎huang +隍huang +徨huang +湟huang +潢huang +遑huang +璜huang +肓huang +癀huang +蟥huang +篁huang +鳇huang +磺胺huangan +皇朝huangchao +荒诞huangdan +晃荡huangdang +皇帝huangdi +荒废huangfei +黄海huanghai +黄河huanghe +恍惚huanghu +谎话huanghua +黄昏huanghun +黄金huangjin +皇历huangli +荒凉huangliang +荒乱huangluan +慌乱huangluan +慌忙huangmang +荒谬huangmiu +恍然huangran +黄色huangse +黄山huangshan +皇上huangshang +荒唐huangtang +环顾huangu +宦官huanguan +谎言huangyan +慌张huangzhang +幌子huangzi +缓和huanhe +欢呼huanhu +环环huanhuan +滑腻huani +花鸟huaniao +还给huanji +缓急huanji +还价huanjia +环节huanjie +环境huanjing +幻境huanjing +幻景huanjing +欢聚huanju +幻觉huanjue +欢乐huanle +缓慢huanman +患难huannan +唤起huanqi +缓期huanqi +欢庆huanqing +环球huanqiu +寰球huanqiu +换取huanqu +环绕huanrao +涣散huansan +欢声huansheng +环视huanshi +欢送huansong +换算huansuan +欢腾huanteng +欢喜huanxi +幻想huanxiang +欢笑huanxiao +欢心huanxin +欢欣huanxin +环行huanxing +缓刑huanxing +唤醒huanxing +幻影huanying +欢迎huanying +寰宇huanyu +还原huanyuan +患者huanzhe +滑坡huapo +花腔huaqiang +华侨huaqiao +划清huaqing +花圈huaquan +划拳huaquan +哗然huaran +华人huaren +花色huase +化身huashen +化石huashi +划算huasuan +话题huati +滑头huatou +花纹huawen +华夏huaxia +化纤huaxian +画像huaxiang +花絮huaxu +化学huaxue +画押huaya +化验huayan +花样huayang +华裔huayi +话音huayin +话语huayu +花园huayuan +画展huazhan +花招huazhao +华中huazhong +化装huazhuang +化妆huazhuang +湖北hubei +胡扯huche +弧度hudu +忽而huer +呼喊huhan +呼号huhao +呼唤huhuan +互惠huhui +会hui +回hui +灰hui +挥hui +辉hui +汇hui +毁hui +慧hui +恢hui +绘hui +惠hui +徽hui +溃*hui +堕*hui +徊*hui +蛔hui +悔hui +卉hui +晦hui +贿hui +秽hui +烩hui +讳hui +诲hui +诙hui +茴hui +荟hui +蕙hui +咴hui +哕hui +喙hui +隳hui +洄hui +浍hui +彗hui +缋hui +珲hui +桧*hui +晖hui +恚hui +虺hui +蟪hui +麾hui +灰暗huian +回报huibao +汇报huibao +回避huibi +汇编huibian +会场huichang +回潮huichao +灰尘huichen +回春huichun +荟萃huicui +回答huida +回荡huidang +回电huidian +汇兑huidui +挥发huifa +汇费huifei +会风huifeng +回复huifu +恢复huifu +悔改huigai +回顾huigu +惠顾huigu +悔过huiguo +会合huihe +回合huihe +汇合huihe +悔恨huihen +恢弘huihong +会话huihua +回话huihua +绘画huihua +毁坏huihuai +辉煌huihuang +挥霍huihuo +会集huiji +回击huiji +汇集huiji +回家huijia +会见huijian +会聚huiju +汇聚huiju +回扣huikou +汇款huikuan +回来huilai +回笼huilong +汇率huilu +贿赂huilu +会面huimian +毁灭huimie +回民huimin +汇票huipiao +回去huiqu +挥洒huisa +灰色huise +晦涩huise +回收huishou +回首huishou +会谈huitan +会堂huitang +会同huitong +回头huitou +回味huiwei +会晤huiwu +挥舞huiwu +悔悟huiwu +麾下huixia +回想huixiang +回响huixiang +诙谐huixie +灰心huixin +彗星huixing +会演huiyan +汇演huiyan +会议huiyi +回忆huiyi +回音huiyin +辉映huiying +会员huiyuan +会战huizhan +徽章huizhang +会诊huizhen +绘制huizhi +回转huizhuan +汇总huizong +回族huizu +户籍huji +呼叫hujiao +户口hukou +虎口hukou +护理huli +互利huli +护林hulin +呼噜hulu +胡乱huluan +忽略hulue +互勉humian +混hun +浑hun +荤hun +昏hun +婚hun +魂hun +诨hun +馄hun +阍hun +溷hun +湖南hunan +胡闹hunao +昏沉hunchen +混合hunhe +浑厚hunhou +昏黄hunhuang +混迹hunji +婚礼hunli +混乱hunluan +糊弄hunong +婚配hunpei +混入hunru +浑身hunshen +混同huntong +混淆hunxiao +婚姻hunyin +昏庸hunyong +混杂hunza +混帐hunzhang +混浊hunzhuo +浑浊hunzhuo +和*huo +活huo +或huo +火huo +货huo +获huo +伙huo +霍huo +豁huo +惑huo +祸huo +劐huo +藿huo +攉huo +嚯huo +夥huo +钬huo +锪huo +镬huo +耠huo +蠖huo +火把huoba +伙伴huoban +火暴huobao +货币huobi +火柴huochai +火车huoche +豁达huoda +获得huode +霍地huodi +活动huodong +伙房huofang +祸根huogen +祸害huohai +火候huohou +火化huohua +火花huohua +祸患huohuan +活活huohuo +伙计huoji +火箭huojian +火警huojing +火炬huoju +火坑huokeng +活力huoli +霍乱huoluan +活泼huopo +获取huoqu +豁然huoran +货色huose +火山huoshan +获胜huosheng +或是huoshi +伙食huoshi +祸首huoshou +伙同huotong +货物huowu +获悉huoxi +火线huoxian +活现huoxian +或许huoxu +火药huoyao +活页huoye +活跃huoyue +货运huoyun +火灾huozai +火葬huozang +或则huoze +或者huozhe +获准huozhun +湖泊hupo +忽然huran +呼声husheng +护士hushi +忽视hushi +湖水hushui +胡说hushuo +护送husong +胡同hutong +互通hutong +户头hutou +糊涂hutu +护卫huwei +呼吸huxi +互相huxiang +呼啸huxiao +虎穴huxue +护养huyang +呼应huying +呼吁huyu +护照huzhao +互助huzhu +毫无疑问hwyw +互相爱护hxah +横行霸道hxbd +互相帮助hxbz +欢欣鼓舞hxgw +候选人hxr +合作化hzh +杭州市hzs +化整为零hzwl +级j +就j +进j +加j +经j +家j +结j +阶j +间j +件j +及j +解j +较j +机j +军j +接j +教j +极j +九j +见j +基本国策jbgc +基本上jbs +据不完全统计jbwj +饥不择食jbzs +坚持不懈jcbx +集成电路jcdl +基础上jcs +绝大部分jdbf +坚定不移jdby +绝大多数jdds +鉴定会jdh +绝对化jdh +经得起jdq +见多识广jdsg +精打细算jdxs +接二连三jels +解放后jfh +解放军jfj +解放军报jfjb +解放前jfq +仅供参考jgck +机构改革jggg +坚固耐用jgny +襟怀坦白jhtb +计划性jhx +级ji +及ji +机ji +极ji +几ji +积ji +给ji +基ji +其*ji +记ji +己ji +期*ji +系*ji +革*ji +计ji +集ji +即ji +际ji +季ji +激ji +济ji +技ji +击ji +继ji +急ji +剂ji +既ji +纪ji +寄ji +挤ji +鸡ji +迹ji +绩ji +齐*ji +奇*ji +吉ji +脊ji +辑ji +籍ji +疾ji +肌ji +棘ji +畸ji +圾ji +稽ji +箕ji +饥ji +讥ji +姬ji +缉ji +汲ji +嫉ji +蓟ji +冀ji +伎ji +祭ji +悸ji +寂ji +忌ji +妓ji +藉ji +丌ji +亟ji +乩ji +剞ji +佶ji +偈ji +诘ji +墼ji +芨ji +芰ji +荠ji +蒺ji +蕺ji +掎ji +叽ji +咭ji +哜ji +唧ji +岌ji +嵴ji +洎ji +屐ji +骥ji +畿ji +玑ji +楫ji +殛ji +戟ji +戢ji +赍ji +觊ji +犄ji +齑ji +矶ji +羁ji +嵇ji +稷ji +瘠ji +虮ji +笈ji +笄ji +暨ji +跻ji +跽ji +霁ji +鲚ji +鲫ji +髻ji +麂ji +加jia +家jia +架jia +价jia +甲jia +夹jia +假jia +钾jia +贾jia +稼jia +驾jia +嘉jia +枷jia +佳jia +荚jia +颊jia +嫁jia +茄*jia +挟*jia +嘏*jia +伽jia +郏jia +葭jia +岬jia +浃jia +迦jia +珈jia +戛jia +胛jia +恝jia +铗jia +镓jia +痂jia +瘕jia +袷jia +蛱jia +笳jia +袈jia +跏jia +加班jiaban +甲板jiaban +加倍jiabei +甲虫jiachong +家畜jiachu +家当jiadang +家底jiadi +假定jiading +加法jiafa +家访jiafang +价格jiage +加工jiagong +佳话jiahua +家伙jiahuo +加急jiaji +嘉奖jiajiang +家教jiajiao +嫁接jiajie +佳节jiajie +假借jiajie +加紧jiajin +家境jiajing +家具jiaju +加剧jiaju +加快jiakuai +加仑jialun +加码jiama +假冒jiamao +家门jiamen +加密jiami +加冕jiamian +价目jiamu +间jian +件jian +见jian +建jian +坚jian +减jian +检jian +践jian +尖jian +简jian +碱jian +剪jian +艰jian +渐jian +肩jian +键jian +健jian +柬jian +鉴jian +剑jian +歼jian +监jian +兼jian +浅*jian +奸jian +箭jian +茧jian +舰jian +俭jian +笺jian +煎jian +缄jian +硷jian +拣jian +捡jian +荐jian +槛jian +贱jian +饯jian +溅jian +涧jian +僭jian +谏jian +谫jian +菅jian +蒹jian +搛jian +囝*jian +湔jian +蹇jian +謇jian +缣jian +枧jian +楗jian +戋jian +戬jian +牮jian +犍jian +毽jian +腱jian +睑jian +锏jian +鹣jian +裥jian +笕jian +翦jian +趼jian +踺jian +鲣jian +鞯jian +吉安jian +煎熬jianao +简报jianbao +渐变jianbian +简便jianbian +简编jianbian +鉴别jianbie +兼并jianbing +尖兵jianbing +剪裁jiancai +剪彩jiancai +检测jiance +检查jiancha +检察jiancha +监察jiancha +减产jianchan +建成jiancheng +简称jiancheng +坚持jianchi +简单jiandan +建党jiandang +减低jiandi +检点jiandian +间谍jiandie +坚定jianding +鉴定jianding +监督jiandu +间断jianduan +尖端jianduan +简短jianduan +舰队jiandui +健儿jianer +减法jianfa +肩负jianfu +将jiang +降jiang +讲jiang +强*jiang +江jiang +浆jiang +蒋jiang +奖jiang +疆jiang +僵jiang +姜jiang +桨jiang +匠jiang +酱jiang +茳jiang +洚jiang +绛jiang +缰jiang +犟jiang +礓jiang +耩jiang +糨jiang +豇jiang +奖杯jiangbei +疆场jiangchang +奖惩jiangcheng +僵持jiangchi +降低jiangdi +间隔jiange +讲稿jianggao +江湖jianghu +僵化jianghua +讲话jianghua +降级jiangji +降价jiangjia +讲解jiangjie +疆界jiangjie +将近jiangjin +奖金jiangjin +讲究jiangjiu +僵局jiangju +将军jiangjun +讲课jiangke +将来jianglai +讲理jiangli +奖励jiangli +降临jianglin +将领jiangling +降落jiangluo +江南jiangnan +奖品jiangpin +讲评jiangping +奖券jiangquan +江山jiangshan +讲师jiangshi +僵尸jiangshi +讲授jiangshou +讲述jiangshu +降水jiangshui +江苏jiangsu +讲台jiangtai +讲坛jiangtan +疆土jiangtu +坚固jiangu +兼顾jiangu +监管jianguan +建国jianguo +降温jiangwen +江西jiangxi +讲习jiangxi +匠心jiangxin +讲学jiangxue +讲演jiangyan +将要jiangyao +讲义jiangyi +僵硬jiangying +奖章jiangzhang +讲座jiangzuo +监护jianhu +简化jianhua +间或jianhuo +奸计jianji +歼击jianji +剪辑jianji +减价jianjia +渐渐jianjian +健将jianjiang +建交jianjiao +间接jianjie +见解jianjie +简介jianjie +简洁jianjie +简捷jianjie +渐进jianjin +监禁jianjin +检举jianju +艰巨jianju +坚决jianjue +健康jiankang +尖刻jianke +坚苦jianku +艰苦jianku +监牢jianlao +建立jianli +尖利jianli +简历jianli +简练jianlian +简陋jianlou +简略jianlue +健美jianmei +减免jianmian +歼灭jianmie +简明jianming +缄默jianmo +艰难jiannan +键盘jianpan +简拼jianpin +简朴jianpu +俭朴jianpu +坚强jianqiang +减轻jianqing +健全jianquan +兼任jianren +坚韧jianren +兼容jianrong +尖锐jianrui +减弱jianruo +艰涩jianse +鉴赏jianshang +减少jianshao +建设jianshe +艰深jianshen +见识jianshi +坚实jianshi +监视jianshi +建树jianshu +减速jiansu +检索jiansuo +践踏jianta +健谈jiantan +检讨jiantao +简体jianti +舰艇jianting +减退jiantui +健忘jianwang +间文jianwen +见闻jianwen +间隙jianxi +奸细jianxi +艰险jianxian +见效jianxiao +间歇jianxie +简写jianxie +坚信jianxin +艰辛jianxin +减刑jianxing +检修jianxiu +简讯jianxun +检验jianyan +简要jianyao +建议jianyi +坚毅jianyi +简易jianyi +奸淫jianyin +坚硬jianying +剪影jianying +鉴于jianyu +监狱jianyu +减员jianyuan +检阅jianyue +建造jianzao +简则jianze +坚贞jianzhen +监制jianzhi +简直jianzhi +兼职jianzhi +建筑jianzhu +简装jianzhuang +健壮jianzhuang +较jiao +教jiao +交jiao +角jiao +叫jiao +脚jiao +胶jiao +浇jiao +焦jiao +觉*jiao +校*jiao +搅jiao +酵jiao +郊jiao +铰jiao +窖jiao +椒jiao +礁jiao +骄jiao +娇jiao +嚼jiao +矫jiao +侥jiao +狡jiao +饺jiao +缴jiao +绞jiao +剿jiao +轿jiao +佼jiao +僬jiao +艽jiao +茭jiao +挢jiao +噍jiao +峤jiao +徼jiao +湫*jiao +姣jiao +敫jiao +皎jiao +鹪jiao +蛟jiao +醮jiao +跤jiao +鲛jiao +骄傲jiaoao +搅拌jiaoban +狡辩jiaobian +教材jiaocai +交叉jiaocha +教程jiaocheng +交错jiaocuo +较大jiaoda +交代jiaodai +交淡jiaodan +教导jiaodao +交点jiaodian +焦点jiaodian +校订jiaoding +角度jiaodu +校对jiaodui +较多jiaoduo +焦耳jiaoer +交锋jiaofeng +交付jiaofu +浇灌jiaoguan +娇贵jiaogui +叫喊jiaohan +较好jiaohao +叫好jiaohao +狡猾jiaohua +交换jiaohuan +叫唤jiaohuan +教诲jiaohui +缴获jiaohuo +交际jiaoji +矫健jiaojian +交接jiaojie +交界jiaojie +叫苦jiaoku +较快jiaokuai +教练jiaolian +较量jiaoliang +交流jiaoliu +搅乱jiaoluan +角落jiaoluo +叫骂jiaoma +剿灭jiaomie +酵母jiaomu +交纳jiaona +缴纳jiaona +娇嫩jiaonen +交配jiaopei +骄气jiaoqi +交情jiaoqing +郊区jiaoqu +叫嚷jiaorang +角色jiaose +交涉jiaoshe +教师jiaoshi +教授jiaoshou +教唆jiaosuo +脚踏jiaota +交谈jiaotan +教堂jiaotang +交替jiaoti +教条jiaotiao +交通jiaotong +郊外jiaowai +交往jiaowang +较为jiaowei +狡黠jiaoxia +叫嚣jiaoxiao +侥幸jiaoxing +绞刑jiaoxing +教学jiaoxue +教训jiaoxun +教养jiaoyang +骄阳jiaoyang +教益jiaoyi +交易jiaoyi +交谊jiaoyi +教育jiaoyu +教员jiaoyuan +狡诈jiaozha +校正jiaozheng +脚注jiaozhu +角逐jiaozhu +浇铸jiaozhu +校准jiaozhun +焦灼jiaozhuo +娇纵jiaozong +叫做jiaozuo +家谱jiapu +假期jiaqi +价钱jiaqian +加强jiaqiang +假日jiari +加入jiaru +假如jiaru +假若jiaruo +加上jiashang +假设jiashe +加深jiashen +假使jiashi +架势jiashi +驾驶jiashi +家属jiashu +假说jiashuo +加速jiasu +枷锁jiasuo +家庭jiating +家乡jiaxiang +假想jiaxiang +家业jiaye +加以jiayi +佳音jiayin +家用jiayong +加油jiayou +家园jiayuan +夹杂jiaza +加载jiazai +家长jiazhang +价值jiazhi +加重jiazhong +假装jiazhuang +嫁妆jiazhuang +架子jiazi +家族jiazu +击败jibai +羁绊jiban +几倍jibei +基本jiben +击毙jibi +级别jibie +疾病jibing +计策jice +基层jiceng +稽查jicha +机场jichang +集成jicheng +继承jicheng +计酬jichou +基础jichu +机床jichuang +几次jici +急促jicu +积存jicun +寄存jicun +极大jida +亟待jidai +激荡jidang +记得jide +基地jidi +机电jidian +极点jidian +基调jidiao +机动jidong +激动jidong +极度jidu +几度jidu +即度jidu +季度jidu +基督jidu +嫉妒jidu +忌妒jidu +极端jiduan +结jie +阶jie +解jie +接jie +节jie +家*jie +界jie +截jie +介jie +借jie +价*jie +届jie +街jie +揭jie +洁jie +杰jie +竭jie +皆jie +秸jie +劫jie +桔jie +捷jie +睫jie +姐jie +戒jie +藉jie +芥jie +疥jie +诫jie +楷*jie +偈*jie +讦jie +诘*jie +拮jie +喈jie +嗟jie +婕jie +孑jie +桀jie +碣jie +疖jie +颉jie +蚧jie +羯jie +鲒jie +骱jie +饥饿jie +结案jiean +洁白jiebai +接班jieban +捷报jiebao +戒备jiebei +结彩jiecai +节操jiecao +阶层jieceng +劫持jiechi +杰出jiechu +解除jiechu +接触jiechu +戒除jiechu +揭穿jiechuan +结存jiecun +解答jieda +接待jiedai +借贷jiedai +街道jiedao +解冻jiedong +阶段jieduan +截断jieduan +揭发jiefa +借方jiefang +解放jiefang +街坊jiefang +结构jiegou +解雇jiegu +借故jiegu +结果jieguo +结合jiehe +结核jiehe +结婚jiehun +阶级jieji +接见jiejian +节俭jiejian +借鉴jiejian +结交jiejiao +姐姐jiejie +接近jiejin +竭尽jiejin +结晶jiejing +捷径jiejing +洁净jiejing +解救jiejiu +结局jieju +解决jiejue +孑孓jiejue +解开jiekai +揭开jiekai +解渴jieke +接口jiekou +借口jiekou +借款jiekuan +竭力jieli +接连jielian +揭露jielu +戒律jielu +结论jielun +解闷jiemen +结盟jiemeng +界面jiemian +节目jiemu +揭幕jiemu +接纳jiena +解聘jiepin +解剖jiepou +节气jieqi +接洽jieqia +截取jiequ +既而jier +节日jieri +介入jieru +解散jiesan +介绍jieshao +节省jiesheng +届时jieshi +结实jieshi +解释jieshi +揭示jieshi +解手jieshou +接受jieshou +接收jieshou +结束jieshu +解说jieshuo +结算jiesuan +解体jieti +阶梯jieti +接替jieti +接头jietou +街头jietou +解脱jietuo +结尾jiewei +解围jiewei +接吻jiewen +解析jiexi +界线jiexian +界限jiexian +揭晓jiexiao +戒严jieyan +结业jieye +介意jieyi +接应jieying +结余jieyu +节约jieyue +结帐jiezhang +接着jiezhao +节制jiezhi +介质jiezhi +戒指jiezhi +借支jiezhi +截止jiezhi +借助jiezhu +节奏jiezou +杰作jiezuo +激发jifa +技法jifa +讥讽jifeng +几个jige +及格jige +技工jigong +记功jigong +机构jigou +叽咕jigu +机关jiguan +籍贯jiguan +极光jiguang +激光jiguang +记过jiguo +极好jihao +记号jihao +集合jihe +几何jihe +稽核jihe +几乎jihu +激化jihua +计划jihua +饥荒jihuang +机会jihui +集会jihui +击毁jihui +忌讳jihui +积极jiji +机件jijian +计件jijian +急件jijian +击剑jijian +即将jijiang +计较jijiao +季节jijie +急进jijin +基金jijin +机警jijing +即景jijing +寂静jijing +急救jijiu +积聚jiju +急剧jiju +急遽jiju +寄居jiju +季刊jikan +即刻jike +疾苦jiku +击溃jikui +积累jilei +极力jili +吉利jili +激励jili +伎俩jilia +计量jiliang +寂寥jiliao +激烈jilie +吉林jilin +机灵jiling +激流jiliu +记录jilu +纪律jilu +纪录jilu +辑录jilu +击落jiluo +急忙jimang +机密jimi +寂寞jimo +计谋jimou +进jin +金jin +近jin +紧jin +斤jin +今jin +尽jin +仅jin +劲jin +浸jin +禁jin +津jin +筋jin +锦jin +晋jin +巾jin +襟jin +谨jin +靳jin +烬jin +卺jin +荩jin +堇jin +噤jin +馑jin +廑jin +妗jin +缙jin +瑾jin +槿jin +赆jin +觐jin +衿jin +缉拿jina +济南jinan +禁闭jinbi +锦标jinbiao +进步jinbu +浸沉jinchen +进程jincheng +进出jinchu +紧凑jincou +近代jindai +劲敌jindi +进度jindu +金额jine +机能jineng +技能jineng +进而jiner +进犯jinfan +经jing +精jing +京jing +径jing +井jing +静jing +竟jing +晶jing +净jing +境jing +镜jing +景jing +警jing +劲*jing +茎jing +敬jing +惊jing +睛jing +竞jing +荆jing +兢jing +鲸jing +粳jing +痉jing +靖jing +刭jing +儆jing +阱jing +菁jing +獍jing +憬jing +泾jing +迳jing +弪jing +婧jing +肼jing +胫jing +腈jing +旌jing +靓*jing +敬爱jingai +警报jingbao +警备jingbei +精兵jingbing +精采jingcai +精彩jingcai +警察jingcha +经常jingchang +精粹jingcui +静电jingdian +经典jingdian +惊动jingdong +精度jingdu +经费jingfei +精干jinggan +竟敢jinggan +警告jinggao +经过jingguo +净化jinghua +精华jinghua +经济jingji +竞技jingji +荆棘jingji +精简jingjian +境界jingjie +警戒jingjie +经久jingjiu +惊恐jingkong +经理jingli +经历jingli +精力jingli +敬礼jingli +精练jinglian +精良jingliang +经络jingluo +精美jingmei +精密jingmi +精明jingming +进攻jingong +敬佩jingpei +精辟jingpi +景气jingqi +惊奇jingqi +精巧jingqiao +精确jingque +竟然jingran +竞赛jingsai +景色jingse +经商jingshang +精神jingshen +经手jingshou +经受jingshou +精髓jingsui +静态jingtai +惊叹jingtan +晶体jingti +警惕jingti +精通jingtong +镜头jingtou +筋骨jingu +禁锢jingu +尽管jinguan +巾帼jinguo +经委jingwei +警卫jingwei +敬畏jingwei +景物jingwu +精细jingxi +京戏jingxi +惊险jingxian +景象jingxiang +经销jingxiao +经心jingxin +精心jingxin +惊心jingxin +惊醒jingxing +竞选jingxuan +惊讶jingya +经验jingyan +敬仰jingyang +经营jingying +晶莹jingying +经由jingyou +境遇jingyu +精湛jingzhan +竞争jingzheng +精制jingzhi +径直jingzhi +精致jingzhi +静止jingzhi +净值jingzhi +竟址jingzhi +净重jingzhong +镜子jingzi +静坐jingzuo +近海jinhai +今后jinhou +近乎jinhu +进化jinhua +几年jinian +记念jinian +纪念jinian +晋级jinji +紧急jinji +近郊jinjiao +紧紧jinjin +仅仅jinjin +进军jinjun +进口jinkou +尽快jinkuai +近况jinkuang +进来jinlai +近来jinlai +尽力jinli +尽量jinliang +斤两jinliang +禁令jinling +劲旅jinlu +紧密jinmi +近年jinnian +今年jinnian +金牌jinpai +紧迫jinpo +近期jinqi +近前jinqian +金钱jinqian +尽情jinqing +进去jinqu +进取jinqu +禁区jinqu +近日jinri +今日jinri +金融jinrong +进入jinru +浸入jinru +谨慎jinshen +晋升jinsheng +今是jinshi +尽是jinshi +近视jinshi +金属jinshu +近似jinsi +紧缩jinsuo +今天jintian +津贴jintie +尽头jintou +劲头jintou +浸透jintou +进退jintui +今晚jinwan +今昔jinxi +尽心jinxin +进行jinxing +进修jinxiu +锦秀jinxiu +谨严jinyan +紧要jinyao +进展jinzhan +紧张jinzhang +今朝jinzhao +紧着jinzhe +禁止jinzhi +尽职jinzhi +进驻jinzhu +金子jinzi +炯jiong +窘jiong +迥jiong +炅*jiong +扃jiong +窘迫jiongpo +迥然jiongran +击破jipo +急迫jipo +及其jiqi +极其jiqi +激起jiqi +机器jiqi +机枪jiqiang +技巧jiqiao +急切jiqie +激情jiqing +汲取jiqu +集权jiquan +既然jiran +己任jiren +继任jiren +即日jiri +吉日jiri +肌肉jirou +极少jishao +寄生jisheng +即是jishi +及时jishi +几时jishi +计时jishi +即时jishi +即使jishi +记事jishi +基石jishi +集市jishi +级数jishu +基数jishu +计数jishu +记述jishu +技术jishu +祭祀jisi +激素jisu +急速jisu +计算jisuan +机体jiti +集体jiti +肌体jiti +几天jitian +集团jituan +寄托jituo +就jiu +九jiu +旧jiu +究jiu +久jiu +救jiu +酒jiu +纠jiu +揪jiu +玖jiu +韭jiu +灸jiu +厩jiu +臼jiu +舅jiu +咎jiu +疚jiu +僦jiu +啾jiu +阄jiu +柩jiu +桕jiu +鸠jiu +鹫jiu +赳jiu +鬏jiu +就餐jiucan +纠察jiucha +纠缠jiuchan +就此jiuci +就地jiudi +就范jiufan +纠纷jiufen +纠葛jiuge +救国jiuguo +救护jiuhu +救火jiuhuo +纠集jiuji +鸠集jiuji +救济jiuji +救急jiuji +九江jiujiang +九届jiujie +就近jiujin +酒精jiujing +究竟jiujing +救命jiuming +救生jiusheng +就是jiushi +就事jiushi +救亡jiuwang +久违jiuwei +酒窝jiuwo +酒席jiuxi +救险jiuxian +揪心jiuxin +救星jiuxing +就绪jiuxu +就学jiuxue +久仰jiuyang +就要jiuyao +就业jiuye +久远jiuyuan +九月jiuyue +救灾jiuzai +纠正jiuzheng +就职jiuzhi +救治jiuzhi +九洲jiuzhou +救助jiuzhu +极为jiwei +纪委jiwei +极限jixian +迹象jixiang +吉祥jixiang +讥笑jixiao +机械jixie +记性jixing +急性jixing +畸形jixing +即兴jixing +吉凶jixiong +几许jixu +积蓄jixu +继续jixu +记叙jixu +急需jixu +集训jixun +积压jiya +羁押jiya +给养jiyang +机要jiyao +纪要jiyao +给以jiyi +记忆jiyi +技艺jiyi +基因jiyin +急用jiyong +基于jiyu +急于jiyu +机遇jiyu +给予jiyu +寄予jiyu +觊觎jiyu +纪元jiyuan +集约jiyue +记载jizai +及早jizao +急躁jizao +激增jizeng +记帐jizhang +记者jizhe +集镇jizhen +机制jizhi +及至jizhi +机智jizhi +集中jizhong +击中jizhong +记住jizhu +基准jizhun +集资jizi +经济核算jjhs +聚精会神jjhs +将计就计jjjj +戒骄戒躁jjjz +近几年来jjnl +竭尽全力jjql +节假日jjr +积极性jjx +经济效益jjxy +兢兢业业jjyy +精简整编jjzb +叽叽喳喳jjzz +艰苦奋斗jkfd +尽可能jkn +教科书jks +俱乐部jlb +交流电jld +吉林省jls +价廉物美jlwm +纪律性jlx +纪念碑jnb +几年来jnl +近年来jnl +纪念品jnp +济南市jns +吉普车jpc +坚强不屈jqbq +奖勤罚懒jqfl +机器人jqr +急起直追jqzz +截然不同jrbt +兼容性jrx +积少成多jscd +金山公司jsgs +集思广益jsgy +精神焕发jshf +计算机jsj +尽善尽美jsjm +集市贸易jsmy +介绍人jsr +就是说jss +计算所jss +江苏省jss +举世闻名jswm +介绍信jsx +技术员jsy +计算中心jszx +交通部jtb +家庭出身jtcs +惊天动地jtdd +具体地说jtds +晶体管jtg +交通工具jtgj +脚踏实地jtsd +具体说来jtsl +具ju +据ju +局ju +举ju +车*ju +句ju +聚ju +距ju +巨ju +居ju +锯ju +剧ju +矩ju +拒ju +柜*ju +桔*ju +鞠ju +拘ju +狙ju +疽ju +驹ju +菊ju +咀ju +沮ju +踞ju +俱ju +惧ju +炬ju +倨ju +讵ju +苣ju +苴ju +莒ju +掬ju +遽ju +屦ju +琚ju +枸*ju +椐ju +榘ju +榉ju +橘ju +犋ju +飓ju +钜ju +锔ju +窭ju +裾ju +趄ju +醵ju +踽ju +龃ju +雎ju +瞿*ju +鞫ju +卷juan +捐juan +鹃juan +娟juan +倦juan +眷juan +绢juan +俊*juan +鄄juan +狷juan +涓juan +桊juan +蠲juan +锩juan +镌juan +隽juan +卷进juanjin +捐款juankuan +眷恋juanlian +眷念juannian +捐躯juanqu +卷入juanru +眷属juanshu +捐献juanxian +卷烟juanyan +卷帙juanzhi +捐助juanzhu +卷宗juanzong +举办juban +具备jubei +剧本juben +巨变jubian +局部jubu +拘捕jubu +剧场juchang +据此juci +巨大juda +举动judong +居多juduo +决jue +觉jue +绝jue +角*jue +脚*jue +掘jue +嚼*jue +撅jue +攫jue +抉jue +倔jue +爵jue +诀jue +厥jue +劂jue +谲jue +矍jue +蕨jue +嗟*jue +噘jue +噱jue +崛jue +獗jue +孓jue +珏jue +桷jue +橛jue +爝jue +镢jue +蹶jue +觖jue +巨额jue +诀别juebie +决不juebu +绝不juebu +决策juece +觉察juecha +觉得juede +决定jueding +决断jueduan +绝对juedui +绝迹jueji +倔强juejiang +绝交juejiao +绝径juejing +绝境juejing +绝句jueju +决裂juelie +绝路juelu +绝密juemi +绝妙juemiao +崛起jueqi +诀窍jueqiao +决赛juesai +绝食jueshi +决死juesi +决算juesuan +绝望juewang +爵位juewei +觉悟juewu +决心juexin +觉醒juexing +决议jueyi +绝缘jueyuan +抉择jueze +决战juezhan +绝招juezhao +绝症juezheng +巨幅jufu +居功jugong +鞠躬jugong +句号juhao +聚合juhe +聚会juhui +聚集juji +巨匠jujiang +拘谨jujin +拒绝jujue +咀嚼jujue +距离juli +举例juli +剧烈julie +拘留juliu +局面jumian +居民jumin +剧目jumu +军jun +均jun +菌jun +君jun +龟*jun +钧jun +峻jun +俊jun +竣jun +浚jun +郡jun +骏jun +捃jun +皲jun +筠jun +麇jun +军操juncao +君臣junchen +均等jundeng +军队jundui +军法junfa +军阀junfa +军服junfu +军港jungang +军工jungong +竣工jungong +均衡junheng +军火junhuo +拘泥juni +军机junji +军纪junji +军舰junjian +俊杰junjie +军垦junken +军粮junliang +军令junling +骏马junma +军民junmin +军旗junqi +峻峭junqiao +俊俏junqiao +军区junqu +军权junquan +军人junren +军事junshi +军师junshi +军属junshu +军团juntuan +军委junwei +军衔junxian +军校junxiao +军械junxie +军心junxin +俊秀junxiu +军需junxu +军训junxun +军医junyi +军营junying +军用junyong +军邮junyou +均匀junyun +军长junzhang +军政junzheng +君主junzhu +军装junzhuang +君子junzi +俱全juquan +居然juran +遽然juran +沮丧jusang +局势jushi +举手jushou +拘束jushu +据说jushuo +具体juti +剧团jutuan +据悉juxi +局限juxian +居心juxin +举行juxing +矩形juxing +巨型juxing +具有juyou +据有juyou +剧院juyuan +局长juzhang +剧照juzhao +举止juzhi +居中juzhong +剧终juzhong +巨著juzhu +居住juzhu +句子juzi +节外生枝jwsz +惊心动魄jxdp +继续革命jxgm +机械化jxh +江西省jxs +谨小慎微jxsw +局限性jxx +教育部jyb +进一步jyb +家用电器jydq +教育方针jyfz +家喻户晓jyhx +加以解决jyjj +记忆力jyl +精益求精jyqj +教研室jys +见义勇为jyyw +旧中国jzg +建筑物jzw +可k +开k +看k +克k +孔k +科k +口k +空k +苦k +快k +考k +刻k +靠k +况k +块k +困k +宽k +矿k +抗k +卡k +卡ka +喀ka +咖ka +咯ka +佧ka +咔ka +胩ka +喀嚓kacha +卡车kache +咖啡kafei +开kai +凯kai +揩kai +楷kai +慨kai +剀kai +垲kai +蒈kai +忾kai +恺kai +铠kai +锎kai +锴kai +开办kaiban +开遍kaibian +开采kaicai +开场kaichang +开车kaiche +开除kaichu +开创kaichuang +开导kaidao +开刀kaidao +开动kaidong +开端kaiduan +开发kaifa +开放kaifang +开封kaifeng +开赴kaifu +凯歌kaige +开关kaiguan +开航kaihang +开户kaihu +开花kaihua +开怀kaihuai +开荒kaihuang +开会kaihui +开掘kaijue +开垦kaiken +开口kaikou +开矿kaikuang +开阔kaikuo +开朗kailang +开郎kailang +开路kailu +开明kaiming +楷模kaimo +开幕kaimu +开炮kaipao +开辟kaipi +开启kaiqi +开枪kaiqiang +开窍kaiqiao +开设kaishe +开始kaishi +开庭kaiting +开头kaitou +开脱kaituo +开拓kaituo +开外kaiwai +开销kaixiao +开心kaixin +凯旋kaixuan +开学kaixue +开颜kaiyan +开业kaiye +开战kaizhan +开展kaizhan +开张kaizhang +开支kaizhi +看kan +刊kan +坎kan +槛*kan +堪kan +勘kan +砍kan +嵌*kan +侃kan +莰kan +阚*kan +戡kan +龛kan +瞰kan +勘测kance +勘察kancha +看出kanchu +看待kandai +看到kandao +刊登kandeng +看法kanfa +砍伐kanfa +抗kang +康kang +炕kang +慷kang +糠kang +扛kang +亢kang +伉kang +闶kang +钪kang +亢奋kangfen +康复kangfu +抗衡kangheng +抗击kangji +亢进kangjin +抗拒kangju +伉俪kangli +抗日kangri +看管kanguan +抗议kangyi +看见kanjian +坎坷kanke +看来kanlai +看齐kanqi +刊头kantou +看望kanwang +刊物kanwu +勘误kanwu +看样kanyang +刊载kanzai +考kao +靠kao +拷kao +烤kao +尻kao +栲kao +犒kao +铐kao +拷贝kaobei +靠边kaobian +考查kaocha +考察kaocha +考核kaohe +靠近kaojin +考究kaojiu +靠拢kaolong +考虑kaolu +考勤kaoqin +靠山kaoshan +考试kaoshi +考题kaoti +考验kaoyan +考证kaozheng +卡片kapian +看不惯kbg +看不起kbq +刻不容缓kbrh +开诚布公kcbg +矿产资源kczy +扩大化kdh +可ke +克ke +科ke +刻ke +客ke +壳ke +颗ke +棵ke +柯ke +呵*ke +坷ke +苛ke +磕ke +咳ke +渴ke +课ke +嗑ke +岢ke +恪ke +溘ke +骒ke +缂ke +珂ke +轲ke +氪ke +瞌ke +钶ke +锞ke +稞ke +疴ke +窠ke +颏ke +蝌ke +髁ke +可爱keai +科班keban +课本keben +可比kebi +刻薄kebo +可不kebu +客车keche +课程kecheng +可耻kechi +可恶kee +可风kefeng +可否kefou +克服kefu +可观keguan +客观keguan +可贵kegui +可好kehao +可恨kehen +刻划kehua +刻画kehua +克己keji +客机keji +科技keji +可见kejian +科教kejiao +可敬kejing +窠臼kejiu +科举keju +可靠kekao +苛刻keke +可口kekou +克扣kekou +刻苦keku +克拉kela +克朗kelang +颗粒keli +可怜kelian +科目kemu +肯ken +啃ken +垦ken +恳ken +裉ken +肯定kending +可能keneng +坑keng +吭keng +铿keng +坑道kengdao +坑害kenghai +铿锵kengqiang +恳切kenqie +恳求kenqiu +垦殖kenzhi +可怕kepa +磕碰kepeng +科普kepu +客气keqi +可亲keqin +可取kequ +客人keren +客商keshang +可是keshi +科室keshi +课堂ketang +客套ketao +课题keti +客体keti +客厅keting +磕头ketou +可望kewang +渴望kewang +可喜kexi +可惜kexi +可行kexing +科学kexue +科研keyan +可以keyi +可疑keyi +刻意keyi +科员keyuan +科长kezhang +可知kezhi +克制kezhi +狂风暴雨kfby +克己奉公kjfg +科技司kjs +苦口婆心kkpx +昆明市kms +可能性knx +孔kong +空kong +控kong +恐kong +倥kong +崆kong +箜kong +空白kongbai +恐怖kongbu +控拆kongchai +空洞kongdong +空额konge +空乏kongfa +控告konggao +空喊konghan +恐吓konghe +空话konghua +恐慌konghuang +空间kongjian +空降kongjiang +恐惧kongju +空军kongjun +空旷kongkuang +恐龙konglong +空虑konglu +恐怕kongpa +空气kongqi +空前kongqian +孔雀kongque +控诉kongsu +空谈kongtan +空头kongtou +空文kongwen +空隙kongxi +空闲kongxian +空想kongxiang +空虚kongxu +空运kongyun +控制kongzhi +空中kongzhong +口kou +扣kou +抠kou +寇kou +芤kou +蔻kou +叩kou +眍kou +筘kou +口岸kouan +叩拜koubai +口才koucai +扣除kouchu +口传kouchuan +口服koufu +口供kougong +口号kouhao +口红kouhong +口角koujiao +口径koujing +口诀koujue +口令kouling +扣留kouliu +口气kouqi +口腔kouqiang +口哨koushao +口试koushi +口述koushu +口头koutou +叩头koutou +口信kouxin +扣押kouya +口语kouyu +看起来kql +口若悬河krxh +口是心非ksxf +苦ku +库ku +枯ku +酷ku +哭ku +窟ku +裤ku +刳ku +堀ku +喾ku +绔ku +骷ku +跨kua +夸kua +垮kua +挎kua +胯kua +侉kua +跨步kuabu +夸大kuada +跨度kuadu +会*kuai +快kuai +块kuai +筷kuai +侩kuai +蒯kuai +郐kuai +哙kuai +狯kuai +浍*kuai +脍kuai +会计kuaiji +快乐kuaile +快速kuaisu +宽kuan +款kuan +髋kuan +宽敞kuanchang +宽绰kuanchuo +宽大kuanda +宽待kuandai +款待kuandai +宽度kuandu +况kuang +矿kuang +狂kuang +框kuang +匡kuang +筐kuang +眶kuang +旷kuang +诓kuang +诳kuang +邝kuang +圹kuang +夼kuang +哐kuang +纩kuang +贶kuang +矿藏kuangcang +矿产kuangchan +狂风kuangfeng +矿工kuanggong +旷工kuanggong +矿井kuangjing +框框kuangkuang +哐啷kuanglang +况且kuangqie +矿区kuangqu +矿泉kuangquan +狂热kuangre +矿山kuangshan +矿石kuangshi +框图kuangtu +宽广kuanguang +狂妄kuangwang +矿物kuangwu +旷野kuangye +宽宏kuanhong +宽厚kuanhou +宽阔kuankuo +宽容kuanrong +款式kuanshi +宽恕kuanshu +款项kuanxiang +宽心kuanxin +宽裕kuanyu +垮台kuatai +跨越kuayue +夸张kuazhang +裤衩kucha +库存kucun +哭喊kuhan +奎kui +溃kui +馈kui +亏kui +盔kui +岿kui +窥kui +葵kui +魁kui +傀kui +愧kui +馗kui +匮kui +夔kui +隗kui +蒉kui +揆kui +喹kui +喟kui +悝kui +愦kui +逵kui +暌kui +睽kui +聩kui +蝰kui +篑kui +跬kui +亏本kuiben +窥测kuice +亏待kuidai +愧疚kuijiu +亏空kuikong +亏损kuisun +魁梧kuiwu +溃疡kuiyang +枯竭kujie +库仑kulun +苦闷kumen +枯木kumu +困kun +昆kun +坤kun +捆kun +悃kun +阃kun +琨kun +锟kun +醌kun +鲲kun +髡kun +苦难kunan +苦恼kunao +困厄kune +困乏kunfa +困惑kunhuo +困境kunjing +困苦kunku +昆明kunming +困难kunnan +扩kuo +括kuo +适*kuo +阔kuo +廓kuo +栝*kuo +蛞kuo +阔别kuobie +扩充kuochong +阔绰kuochuo +扩大kuoda +括号kuohao +扩建kuojian +阔气kuoqi +扩展kuozhan +扩张kuozhang +哭泣kuqi +酷暑kushu +苦头kutou +苦维kuwei +枯萎kuwei +酷刑kuxing +苦于kuyu +枯燥kuzao +可想而知kxez +科学家kxj +科学技术kxjs +可行性kxx +科学院kxy +科研部kyb +开源节流kyjl +看样子kyz +了l +来l +量l +理l +路l +里l +论l +两l +利l +领l +流l +力l +立l +料l +连l +老l +六l +轮l +类l +列l +拉la +落*la +啦la +蜡la +腊la +蓝la +垃la +喇la +辣la +剌la +邋la +旯la +砬la +瘌la +喇叭laba +来lai +赖lai +莱lai +崃lai +徕lai +涞lai +濑lai +赉lai +睐lai +铼lai +癞lai +籁lai +来宾laibin +来到laidao +来犯laifan +来访laifang +来函laihan +来回laihui +来历laili +来临lailin +赖皮laipi +来日lairi +来势laishi +来头laitou +来往laiwang +来信laixin +来源laiyuan +来者laizhe +来自laizi +癞子laizi +辣椒lajiao +拉拢lalong +喇嘛lama +腊梅lamei +兰lan +烂lan +蓝lan +览lan +栏lan +婪lan +拦lan +篮lan +阑lan +澜lan +谰lan +揽lan +懒lan +缆lan +滥lan +岚lan +漤lan +榄lan +斓lan +罱lan +镧lan +褴lan +蓝本lanben +懒怠landai +滥调landiao +懒惰landuo +浪lang +朗lang +郎lang +狼lang +琅lang +榔lang +廊lang +莨lang +蒗lang +啷lang +阆lang +锒lang +稂lang +螂lang +栏杆langan +狼狈langbei +浪潮langchao +浪荡langdang +朗读langdu +浪费langfei +狼藉langji +浪漫langman +朗诵langsong +郎中langzhong +兰花lanhua +拦截lanjie +烂漫lanman +懒散lansan +蓝色lanse +缆绳lansheng +烂熟lanshu +蓝天lantian +蓝图lantu +阑尾lanwei +拦腰lanyao +滥用lanyong +兰州lanzhou +老lao +劳lao +落*lao +牢lao +涝lao +捞lao +络*lao +佬lao +姥lao +酪lao +烙lao +潦*lao +唠lao +崂lao +栳lao +铑lao +铹lao +痨lao +耢lao +醪lao +老板laoban +老伴laoban +老本laoben +劳动laodong +牢固laogu +老汉laohan +老化laohua +牢记laoji +劳驾laojia +牢靠laokao +劳苦laoku +牢牢laolao +劳累laolei +劳力laoli +老练laolian +牢笼laolong +劳模laomo +老年laonian +老人laoren +牢骚laosao +老少laoshao +老是laoshi +老实laoshi +老师laoshi +老乡laoxiang +老爷laoye +烙印laoyin +劳支laozhi +劳资laozi +劳作laozuo +腊月layue +狼狈不堪lbbk +力不从心lbcx +来不及lbj +来不了lbl +了不起lbq +劳动保险ldbx +来得及ldj +劳动量ldl +劳动力ldl +灵丹妙药ldmy +拉丁美洲ldmz +劳动者ldz +劳动致富ldzf +了le +乐le +勒le +肋le +仂le +叻le +泐le +鳓le +乐观leguan +类lei +雷lei +累lei +勒*lei +垒lei +泪lei +镭lei +蕾lei +磊lei +儡lei +擂lei +肋lei +羸lei +诔lei +嘞lei +嫘lei +缧lei +檑lei +耒lei +酹lei +类别leibie +类次leici +雷达leida +雷管leiguan +泪痕leihen +泪花leihua +累积leiji +累计leiji +累进leijin +磊落leiluo +累年leinian +类似leisi +擂台leitai +雷同leitong +类推leitui +类型leixing +雷雨leiyu +累月leiyue +累赘leizhui +勒令leling +冷leng +棱leng +楞leng +塄leng +愣leng +冷藏lengcang +冷淡lengdan +冷宫lenggong +棱角lengjiao +冷静lengjing +冷落lengluo +冷门lengmen +冷漠lengmo +冷暖lengnuan +冷僻lengpi +冷气lengqi +冷却lengque +冷水lengshui +冷遇lengyu +乐趣lequ +勒索lesuo +乐意leyi +乐园leyuan +两个文明lgwm +拉关系lgx +联合国lhg +联合会lhh +两回事lhs +联合体lht +理li +里li +利li +力li +立li +离li +例li +历li +粒li +厘li +礼li +李li +隶li +黎li +璃li +励li +犁li +梨li +丽li +厉li +篱li +狸li +漓li +鲤li +莉li +荔li +吏li +栗li +砾li +傈li +俐li +痢li +沥li +哩li +鬲*li +俪li +俚li +郦li +坜li +苈li +莅li +蓠li +藜li +呖li +唳li +喱li +猁li +悝*li +溧li +澧li +逦li +娌li +嫠li +骊li +缡li +枥li +栎li +轹li +戾li +砺li +詈li +罹li +锂li +鹂li +疠li +疬li +蛎li +蜊li +蠡li +笠li +篥li +粝li +醴li +跞li +雳li +鲡li +鳢li +黧li +俩lia +连lian +联lian +练lian +炼lian +脸lian +链lian +莲lian +镰lian +廉lian +怜lian +涟lian +帘lian +敛lian +恋lian +蔹lian +奁lian +潋lian +濂lian +琏lian +楝lian +殓lian +臁lian +裢lian +裣lian +蠊lian +鲢lian +立案lian +恋爱lianai +联邦lianbang +练兵lianbing +联播lianbo +练达lianda +连队liandui +量liang +两liang +粮liang +良liang +亮liang +梁liang +凉liang +辆liang +粱liang +晾liang +谅liang +墚liang +莨*liang +椋liang +踉liang +靓liang +魉liang +炼钢liangang +两半liangban +量变liangbian +两边liangbian +两便liangbian +两侧liangce +两次liangci +两地liangdi +两点liangdian +量度liangdu +良方liangfang +两广liangguang +良好lianghao +两极liangji +良机liangji +谅解liangjie +量具liangju +凉快liangkuai +两立liangli +两面liangmian +练功liangong +两栖liangqi +两讫liangqi +两全liangquan +粮食liangshi +两手liangshou +凉爽liangshuang +亮堂liangtang +两条liangtiao +两头liangtou +连贯lianguan +联贯lianguan +亮相liangxiang +良心liangxin +两性liangxing +量刑liangxing +两样liangyang +粮油liangyou +良缘liangyuan +粮站liangzhan +两者liangzhe +两重liangzhong +良种liangzhong +量子liangzi +联合lianhe +联欢lianhuan +廉价lianjia +联结lianjie +连接lianjie +联接lianjie +廉洁lianjie +联军lianjun +连累lianlei +联络lianluo +连忙lianmang +联盟lianmeng +怜悯lianmin +连年liannian +脸谱lianpu +连日lianri +炼乳lianru +联赛liansai +脸色lianse +连锁liansuo +练武lianwu +联系lianxi +练习lianxi +怜惜lianxi +联想lianxiang +连续lianxu +涟漪lianyi +联姻lianyin +联营lianying +炼油lianyou +联运lianyun +连载lianzai +了*liao +料liao +疗liao +辽liao +僚liao +撩liao +聊liao +燎liao +寥liao +潦liao +撂liao +镣liao +廖liao +蓼liao +尥liao +嘹liao +獠liao +寮liao +缭liao +钌liao +鹩liao +撩拨liaobo +潦草liaocao +疗程liaocheng +料到liaodao +潦倒liaodao +料定liaoding +了结liaojie +了解liaojie +辽阔liaokuo +料理liaoli +寥寥liaoliao +寥落liaoluo +辽宁liaoning +了却liaoque +了事liaoshi +聊天liaotian +料想liaoxiang +疗养liaoyang +礼拜libai +利弊libi +里边libian +理财licai +理睬licai +立场lichang +里程licheng +历程licheng +立春lichun +历次lici +历代lidai +理当lidang +立冬lidong +列lie +裂lie +烈lie +劣lie +猎lie +冽lie +埒lie +捩lie +咧lie +洌lie +趔lie +躐lie +鬣lie +裂变liebian +列车lieche +列出liechu +列岛liedao +裂缝liefeng +列国lieguo +烈火liehuo +劣迹lieji +列举lieju +裂开liekai +裂口liekou +列宁liening +猎奇lieqi +列强lieqiang +猎取liequ +烈日lieri +列入lieru +劣绅lieshen +烈士lieshi +劣势lieshi +烈属lieshu +裂纹liewen +列席liexi +烈性liexing +立法lifa +立方lifang +礼服lifu +立功ligong +利害lihai +厉害lihai +理化lihua +礼花lihua +理会lihui +离婚lihun +立即liji +理解lijie +礼节lijie +历届lijie +力矩liju +离开likai +理科like +立刻like +理亏likui +历来lilai +历历lili +力量liliang +利率lilu +理论lilun +立论lilun +礼貌limao +里面limian +利民limin +黎民limin +黎明liming +林lin +磷lin +临lin +邻lin +淋lin +麟lin +琳lin +霖lin +鳞lin +凛lin +赁lin +吝lin +蔺lin +啉lin +嶙lin +廪lin +懔lin +遴lin +檩lin +辚lin +膦lin +瞵lin +粼lin +躏lin +淋巴linba +临别linbie +淋病linbing +林场linchang +临床linchuang +临到lindao +领ling +另ling +零ling +令ling +灵ling +岭ling +铃ling +龄ling +凌ling +棱*ling +陵ling +拎ling +玲ling +菱ling +伶ling +羚ling +酃ling +苓ling +呤ling +囹ling +泠ling +绫ling +柃ling +棂ling +瓴ling +聆ling +蛉ling +翎ling +鲮ling +令爱lingai +凌晨lingchen +灵丹lingdan +领导lingdao +领地lingdi +零点lingdian +领队lingdui +灵感linggan +领海linghai +领航linghang +领会linghui +灵魂linghun +灵活linghuo +灵机lingji +零件lingjian +领教lingjiao +灵杰lingjie +领空lingkong +凌空lingkong +玲珑linglong +零乱lingluan +凌乱lingluan +领略linglue +灵敏lingmin +陵墓lingmu +灵巧lingqiao +领取lingqu +令人lingren +凌辱lingru +零散lingsan +领事lingshi +领受lingshou +领司lingsi +零碎lingsui +灵堂lingtang +零头lingtou +领土lingtu +磷光linguang +另外lingwai +领悟lingwu +领先lingxian +领衔lingxian +零星lingxing +领袖lingxiu +另选lingxuan +灵验lingyan +领域lingyu +令尊lingzun +磷火linhuo +历年linian +临界linjie +临近linjin +邻近linjin +邻里linli +淋漓linli +凛冽linlie +临摹linmo +里弄linong +鳞伤linshang +临时linshi +临死linsi +吝惜linxi +临行linxing +林业linye +临战linzhan +临终linzhong +礼炮lipao +李鹏lipeng +礼品lipin +力气liqi +离奇liqi +力求liqiu +立秋liqiu +历任liren +例如liru +利润lirun +离散lisan +理事lishi +历史lishi +隶属lishu +礼堂litang +立体liti +例题liti +力图litu +流liu +六liu +留liu +刘liu +硫liu +柳liu +陆*liu +馏liu +瘤liu +溜liu +琉liu +榴liu +碌*liu +浏liu +遛liu +骝liu +绺liu +旒liu +熘liu +锍liu +镏liu +鹨liu +鎏liu +留步liubu +流产liuchan +流畅liuchang +流程liucheng +流传liuchuan +流窜liucuan +流动liudong +流毒liudu +流放liufang +六届liujie +浏览liulan +流利liuli +留恋liulian +流露liulu +流落liuluo +流氓liumang +留念liunian +流失liushi +流逝liushi +流体liuti +流通liutong +流亡liuwang +流泻liuxie +留心liuxin +流行liuxing +流星liuxing +留学liuxue +流血liuxue +流言liuyan +留言liuyan +留洋liuyang +留影liuying +留用liuyong +流域liuyu +六月liuyue +流转liuzhuan +例外liwai +礼物liwu +利息lixi +立夏lixia +理想lixiang +立新lixin +离心lixin +理性lixing +力行lixing +厉行lixing +离休lixiu +立意liyi +利益liyi +离异liyi +利用liyong +理由liyou +力争lizheng +立正lizheng +理智lizhi +立志lizhi +离职lizhi +例子lizi +粒子lizi +立足lizu +屡见不鲜ljbx +两极分化ljfh +逻辑设计ljsj +逻辑思维ljsw +逻辑性ljx +灵机一动ljyd +落落大方lldf +拦路虎llh +来龙去脉llqm +零零碎碎llss +来来往往llww +联绵不断lmbd +灵敏度lmd +辽宁省lns +列宁主义lnzy +龙long +垄long +弄*long +笼long +隆long +聋long +咙long +窿long +拢long +陇long +垅long +茏long +泷long +珑long +栊long +胧long +砻long +癃long +隆冬longdong +垄断longduan +隆隆longlong +笼络longluo +笼统longtong +笼罩longzhao +隆重longzhong +漏lou +露*lou +楼lou +娄lou +搂lou +篓lou +陋lou +偻lou +蒌lou +喽lou +嵝lou +镂lou +瘘lou +耧lou +蝼lou +髅lou +漏洞loudong +漏斗loudou +镂空loukong +漏网louwang +来日方长lrfc +来人来函lrlh +了如指掌lrzz +理所当然lsdr +连锁反应lsfy +领事馆lsg +理事会lsh +力所能及lsnj +拉萨市lss +流水线lsx +良师益友lsyy +路lu +六*lu +率lu +露lu +绿lu +炉lu +律lu +虑lu +滤lu +陆lu +氯lu +鲁lu +铝lu +录lu +旅lu +卢lu +吕lu +芦lu +颅lu +庐lu +掳lu +卤lu +虏lu +麓lu +碌lu +赂lu +鹿lu +潞lu +禄lu +戮lu +驴lu +侣lu +履lu +屡lu +缕lu +垆lu +蓼*lu +撸lu +噜lu +闾lu +泸lu +渌lu +漉lu +逯lu +璐lu +栌lu +榈lu +橹lu +轳lu +辂lu +辘lu +氇lu +胪lu +膂lu +镥lu +稆lu +鸬lu +鹭lu +褛lu +簏lu +舻lu +鲈lu +卵luan +乱luan +峦luan +挛luan +孪luan +滦luan +脔luan +娈luan +栾luan +鸾luan +銮luan +卵巢luanchao +乱伦luanlun +乱子luanzi +旅伴luban +路标lubiao +路程lucheng +旅程lucheng +露出luchu +屡次luci +陆地ludi +露底ludi +旅店ludian +略lue +掠lue +锊lue +掠夺lueduo +旅费lufei +露骨lugu +旅馆luguan +路过luguo +绿化luhua +炉火luhuo +路径lujing +路局luju +陆军lujun +旅客luke +履历luli +率领luling +鲁莽lumang +露面lumian +论lun +轮lun +伦lun +抡lun +仑lun +沦lun +纶lun +囵lun +论处lunchu +轮船lunchuan +论点lundian +论调lundiao +伦敦lundun +轮换lunhuan +论据lunju +轮廓lunkuo +论理lunli +伦理lunli +轮流lunliu +论述lunshu +轮胎luntai +论坛luntan +沦为lunwei +论文lunwen +沦陷lunxian +轮训lunxun +论战lunzhan +论正lunzheng +论证lunzheng +轮轴lunzhou +论著lunzhu +落luo +罗luo +螺luo +洛luo +络luo +逻luo +咯*luo +烙*luo +萝luo +锣luo +箩luo +骡luo +裸luo +骆luo +倮luo +蠃luo +荦luo +捋luo +摞luo +猡luo +泺luo +漯luo +珞luo +椤luo +脶luo +硌*luo +镙luo +瘰luo +雒luo +萝卜luobu +落成luocheng +螺钉luoding +罗汉luohan +落后luohou +落户luohu +逻辑luoji +落空luokong +落款luokuan +箩筐luokuang +罗列luolie +罗马luoma +螺母luomu +罗盘luopan +落泊luopo +落实luoshi +螺栓luoshuan +裸体luoti +骆驼luotuo +罗网luowang +螺纹luowen +落伍luowu +落选luoxuan +螺旋luoxuan +络绎luoyi +录取luqu +路人luren +绿色luse +庐山lushan +旅社lushe +律师lushi +露天lutian +路途lutu +旅途lutu +路线luxian +率先luxian +录像luxiang +旅行luxing +履行luxing +陆续luxu +录音luyin +绿荫luyin +录用luyong +旅游luyou +绿洲luzhou +露珠luzhu +路子luzi +炉子luzi +另行安排lxap +例行公事lxgs +联系人lxr +留学生lxs +另行通知lxtz +林业部lyb +老一辈lyb +另一方面lyfm +劳逸结合lyjh +利用率lyl +老一套lyt +留有余地lyyd +来者不拒lzbj +立足点lzd +老中青lzq +理直气壮lzqz +兰州市lzs +两重性lzx +面m +命m +们m +民m +毛m +没m +米m +明m +马m +么m +每m +门m +名m +磨m +美m +密m +苗m +满m +亩m +目m +呒m +马ma +么*ma +麻ma +吗ma +妈ma +骂ma +嘛ma +码ma +摩*ma +抹*ma +玛ma +蚂ma +唛ma +犸ma +嬷ma +杩ma +蟆ma +马鞍maan +麻痹mabi +马达mada +麻烦mafan +麻纺mafang +马虎mahu +麦mai +脉mai +卖mai +买mai +埋mai +迈mai +劢mai +荬mai +霾mai +买办maiban +脉搏maibo +迈步maibu +埋藏maicang +脉冲maichong +脉动maidong +埋伏maifu +卖国maiguo +脉络mailuo +买卖maimai +卖命maiming +埋没maimo +卖弄mainong +埋头maitou +卖淫maiyin +埋怨maiyuan +埋葬maizang +买帐maizhang +卖座maizuo +马力mali +麻利mali +马路malu +妈妈mama +麻木mamu +满man +慢man +曼man +漫man +蔓man +瞒man +馒man +蛮man +谩man +墁man +幔man +缦man +熳man +镘man +颟man +螨man +鳗man +鞔man +漫长manchang +忙mang +芒mang +盲mang +茫mang +氓mang +莽mang +邙mang +漭mang +硭mang +蟒mang +忙碌manglu +莽莽mangmang +盲目mangmu +茫然mangran +盲人mangren +忙于mangyu +莽原mangyuan +蛮横manheng +漫画manhua +满怀manhuai +谩骂manma +满目manmu +满腔manqiang +蔓延manyan +满意manyi +满载manzai +满足manzu +毛mao +矛mao +冒mao +貌mao +贸mao +帽mao +猫mao +茅mao +锚mao +铆mao +卯mao +茂mao +袤mao +茆mao +峁mao +泖mao +瑁mao +昴mao +牦mao +耄mao +旄mao +懋mao +瞀mao +蟊mao +髦mao +毛病maobing +毛糙maocao +冒充maochong +铆钉maoding +矛盾maodun +冒犯maofan +毛纺maofang +冒号maohao +冒尖maojian +冒进maojin +茅坑maokeng +毛利maoli +冒昧maomei +茂密maomi +冒牌maopai +毛坯maopi +贸然maoran +茂盛maosheng +冒失maoshi +矛头maotou +冒险maoxian +贸易maoyi +冒雨maoyu +毛重maozhong +帽子maozi +马上mashang +马桶matong +码头matou +马戏maxi +麻醉mazui +免不了mbl +明辨是非mbsf +满不在乎mbzh +默不作声mbzs +满城风雨mcfy +目的地mdd +目瞪口呆mdkd +描淡写mdx +么me +麽me +秘而不宣mebx +没mei +每mei +美mei +煤mei +霉mei +酶mei +梅mei +妹mei +眉mei +玫mei +枚mei +媒mei +镁mei +昧mei +寐mei +媚mei +糜*mei +谜*mei +莓mei +嵋mei +猸mei +浼mei +湄mei +楣mei +镅mei +鹛mei +袂mei +魅mei +每次meici +每当meidang +美德meide +没法meifa +每逢meifeng +每个meige +美观meiguan +玫瑰meigui +美国meiguo +美好meihao +美化meihua +媒介meijie +眉睫meijie +枚举meiju +煤矿meikuang +霉烂meilan +魅力meili +美丽meili +美满meiman +眉毛meimao +美貌meimao +妹妹meimei +美妙meimiao +眉目meimu +每年meinian +煤气meiqi +每人meiren +每日meiri +美容meirong +眉梢meishao +每时meishi +美术meishu +媒妁meishuo +煤炭meitan +每天meitian +煤田meitian +美学meixue +没有meiyou +煤油meiyou +美元meiyuan +每月meiyue +没治meizhi +每周meizhou +们men +门men +闷men +扪men +焖men +懑men +钔men +门房menfang +孟meng +猛meng +蒙meng +盟meng +梦meng +萌meng +锰meng +氓*meng +檬meng +勐meng +甍meng +瞢meng +懵meng +朦meng +礞meng +虻meng +蜢meng +蠓meng +艋meng +艨meng +蒙蔽mengbi +萌发mengfa +蒙古menggu +盟国mengguo +梦幻menghuan +蒙混menghun +梦见mengjian +猛进mengjin +梦境mengjing +猛烈menglie +蒙胧menglong +蒙昧mengmei +猛然mengran +萌生mengsheng +猛士mengshi +蒙受mengshou +梦想mengxiang +梦乡mengxiang +猛醒mengxing +萌芽mengya +盟友mengyou +盟约mengyue +猛增mengzeng +门户menhu +门路menlu +门牌menpai +门票menpiao +闷气menqi +门诊menzhen +名副其实mfqs +眉飞色舞mfsw +没关系mgx +蒙古族mgz +蒙混过关mhgg +米mi +密mi +迷mi +蜜mi +秘mi +眯mi +醚mi +靡mi +糜mi +谜mi +弥mi +觅mi +泌mi +幂mi +芈mi +谧mi +蘼mi +咪mi +嘧mi +猕mi +汨mi +宓mi +弭mi +脒mi +祢mi +敉mi +糸mi +縻mi +麋mi +面mian +棉mian +免mian +绵mian +眠mian +冕mian +勉mian +娩mian +缅mian +沔mian +渑mian +湎mian +腼mian +眄mian +面部mianbu +免除mianchu +免得miande +面对miandui +面额miane +棉花mianhua +缅怀mianhuai +面积mianji +面具mianju +面孔miankong +勉励mianli +面临mianlin +面貌mianmao +面面mianmian +绵绵mianmian +面目mianmu +面庞mianpang +面前mianqian +勉强mianqiang +面容mianrong +面色mianse +棉纱miansha +面授mianshou +免税mianshui +面谈miantan +面向mianxiang +免刑mianxing +棉絮mianxu +绵延mianyan +面议mianyi +免疫mianyi +面罩mianzhao +免职mianzhi +面子mianzi +苗miao +秒miao +描miao +庙miao +妙miao +瞄miao +藐miao +渺miao +喵miao +邈miao +缈miao +缪miao +杪miao +淼miao +眇miao +鹋miao +秒表miaobiao +描绘miaohui +妙龄miaoling +渺茫miaomang +描摹miaomo +藐视miaoshi +描述miaoshu +苗条miaotiao +苗头miaotou +描写miaoxie +瞄准miaozhun +弥补mibu +谜底midi +密度midu +灭mie +蔑mie +乜*mie +咩mie +蠛mie +篾mie +灭火miehuo +灭迹mieji +灭绝miejue +灭口miekou +蔑视mieshi +灭亡miewang +密封mifeng +蜜蜂mifeng +眯缝mifeng +迷航mihang +迷糊mihu +迷惑mihuo +密集miji +密件mijian +迷津mijin +秘诀mijue +糜烂milan +迷恋milian +密令miling +迷路milu +密码mima +迷漫miman +弥漫miman +秘密mimi +汨汨mimi +谜面mimian +密谋mimou +民min +敏min +抿min +皿min +悯min +闽min +苠min +岷min +闵min +泯min +缗min +玟min +珉min +愍min +黾min +鳘min +民办minban +民兵minbing +民法minfa +民愤minfen +民风minfeng +命ming +明ming +名ming +鸣ming +螟ming +盟*ming +铭ming +冥ming +茗ming +溟ming +暝ming +瞑ming +酩ming +敏感mingan +明白mingbai +名册mingce +名称mingcheng +明处mingchu +名次mingci +名词mingci +名单mingdan +明灯mingdeng +民歌minge +名额minge +名贵minggui +铭记mingji +名家mingjia +铭刻mingke +明快mingkuai +明朗minglang +名利mingli +明亮mingliang +明了mingliao +命令mingling +名流mingliu +明码mingma +明媚mingmei +明明mingming +名目mingmu +明年mingnian +名牌mingpai +名片mingpian +名气mingqi +明确mingque +明人mingren +名人mingren +名胜mingsheng +名声mingsheng +名堂mingtang +明天mingtian +名望mingwang +明文mingwen +明细mingxi +明显mingxian +鸣谢mingxie +明星mingxing +名言mingyan +名义mingyi +名誉mingyu +命运mingyun +明知mingzhi +明智mingzhi +明珠mingzhu +名著mingzhu +名字mingzi +民航minhang +民间minjian +敏捷minjie +民警minjing +民情minqing +敏锐minrui +民事minshi +民心minxin +民意minyi +民用minyong +民运minyun +民政minzheng +民众minzhong +民主minzhu +民族minzu +密切miqie +迷人miren +迷失mishi +秘书mishu +密探mitan +迷途mitu +谬miu +谬论miulun +谬误miuwu +迷惘miwang +迷雾miwu +迷信mixin +密友miyou +谜语miyu +蜜月miyue +马克思mks +眉开眼笑mkyx +马列主义mlzy +满面春风mmcf +马马虎虎mmhh +面面俱到mmjd +莫名其妙mmqm +默默无闻mmww +明目张胆mmzd +无*mo +磨mo +没*mo +万*mo +末mo +模mo +膜mo +摸mo +墨mo +摩mo +脉*mo +莫mo +抹mo +冒*mo +默mo +貉*mo +嘿*mo +摹mo +蘑mo +魔mo +沫mo +漠mo +寞mo +陌mo +谟mo +茉mo +蓦mo +馍mo +嫫mo +殁mo +镆mo +秣mo +瘼mo +耱mo +貊mo +貘mo +默哀moai +莫不mobu +磨擦moca +摩擦moca +磨蹭moceng +莫大moda +磨刀modao +摩登modeng +摸底modi +模范mofan +模仿mofang +摹仿mofang +莫非mofei +魔鬼mogui +模糊mohu +墨迹moji +模块mokuai +磨砺moli +磨练molian +末了moliao +末路molu +没落moluo +磨灭momie +默默momo +磨难monan +模拟moni +摹拟moni +末期moqi +默契moqi +默然moran +漠然moran +默认moren +末日mori +莫如moru +抹杀mosha +抹煞mosha +末梢moshao +陌生mosheng +模式moshi +没收moshou +魔术moshu +磨损mosun +摸索mosuo +模特mote +摩托motuo +某mou +谋mou +牟mou +侔mou +哞mou +缪*mou +眸mou +蛑mou +蝥mou +鍪mou +某地moudi +某个mouge +谋害mouhai +谋划mouhua +某军moujun +牟利mouli +谋略moulue +谋求mouqiu +牟取mouqu +谋杀mousha +谋生mousheng +某些mouxie +末尾mowei +默写moxie +模型moxing +默许moxu +模样moyang +魔掌mozhang +模子mozi +妙趣横生mqhs +门市部msb +名胜古迹msgj +妙手回春mshc +莫斯科msk +没什么msm +每时每刻msmk +秘书长msz +没事找事mszs +摩托车mtc +埋头工作mtgz +埋头苦干mtkg +亩mu +目mu +木mu +母mu +墓mu +模*mu +幕mu +牧mu +姆mu +穆mu +姥*mu +牟*mu +拇mu +牡mu +暮mu +募mu +慕mu +睦mu +仫mu +坶mu +苜mu +沐mu +毪mu +钼mu +母爱muai +墓碑mubei +目标mubiao +木材mucai +牧草mucao +目测muce +牧场muchang +目次muci +牡丹mudan +目的mudi +牧歌muge +目光muguang +幕后muhou +目击muji +募集muji +木刻muke +木料muliao +幕僚muliao +目录mulu +牧民mumin +木讷mune +木偶muou +目前muqian +母亲muqin +牧区muqu +木然muran +暮色muse +牧师mushi +目送musong +牧童mutong +牧业muye +沐浴muyu +民意测验mycy +贸易市场mysc +贸易协定myxd +民政部mzb +美中不足mzbz +毛泽东mzd +满载而归mzeg +明知故犯mzgf +毛织品mzp +目中无人mzwr +毛主席mzx +年n +能n +内n +那n +农n +你n +南n +难n +呢n +女n +泥n +哪n +拿n +念n +牛n +宁n +脑n +粘n +尼n +纳n +嗯n +那na +南na +哪na +拿na +纳na +呢*na +钠na +呐na +娜na +捺na +肭na +镎na +衲na +那边nabian +纳粹nacui +哪儿naer +那个nage +哪个nage +呐喊nahan +哪会nahui +耐nai +哪*nai +奶nai +乃nai +氖nai +奈nai +鼐nai +艿nai +萘nai +柰nai +耐烦naifan +奈何naihe +耐久naijiu +耐劳nailao +奶奶nainai +耐心naixin +耐性naixing +耐用naiyong +奶油naiyou +乃至naizhi +那里nali +哪里nali +那么name +南nan +难nan +男nan +喃nan +囝nan +囡nan +楠nan +腩nan +蝻nan +赧nan +难办nanban +南北nanbei +南边nanbian +难产nanchan +南昌nanchang +难处nanchu +难道nandao +难得nande +难点nandian +难度nandu +哪能naneng +南方nanfang +南非nanfei +难分nanfen +南风nanfeng +囊nang +攮nang +囔nang +馕nang +曩nang +囊括nangkuo +难怪nanguai +难关nanguan +南国nanguo +难过nanguo +南海nanhai +南货nanhuo +南极nanji +难解nanjie +南京nanjing +难看nankan +难堪nankan +南面nanmian +难免nanmian +难民nanmin +南宁nanning +男女nannu +赧然nanran +男人nanren +难色nanse +难事nanshi +难受nanshou +难说nanshuo +难题nanti +难听nanting +难为nanwei +男性nanxing +南亚nanya +南洋nanyang +难以nanyi +难友nanyou +难于nanyu +脑nao +闹nao +努*nao +挠nao +恼nao +淖nao +孬nao +垴nao +呶nao +猱nao +瑙nao +硇nao +铙nao +蛲nao +脑袋naodai +脑海naohai +恼火naohuo +脑筋naojin +闹剧naoju +闹事naoshi +哪怕napa +纳入naru +那时nashi +拿手nashou +纳税nashui +那些naxie +哪些naxie +纳新naxin +那样nayang +哪样nayang +那种nazhong +年产量ncl +农产品ncp +南昌市ncs +难道说nds +呢ne +哪*ne +呐*ne +讷ne +内nei +那*nei +哪*nei +馁nei +内部neibu +内存neicun +内地neidi +内阁neige +内涵neihan +内行neihang +内奸neijian +内疚neijiu +内科neike +内乱neiluan +内幕neimu +内勤neiqin +内容neirong +内外neiwai +内销neixiao +内心neixin +内因neiyin +内应neiying +内在neizai +嫩nen +恁nen +能neng +能动nengdong +能否nengfou +能干nenggan +能够nenggou +能力nengli +能量nengliang +能耐nengnai +能人nengren +能手nengshou +能源nengyuan +能者nengzhe +农副产品nfcp +年富力强nflq +能工巧匠ngqj +你ni +泥ni +尼ni +呢*ni +逆ni +拟ni +尿ni +妮ni +霓ni +倪ni +匿ni +腻ni +溺ni +伲ni +坭ni +猊ni +怩ni +昵ni +旎ni +祢*ni +慝ni +睨ni +铌ni +鲵ni +年nian +念nian +粘nian +蔫nian +拈nian +碾nian +撵nian +捻nian +酿nian +廿nian +埝nian +辇nian +黏nian +鲇nian +鲶nian +年初nianchu +年代niandai +念叨niandao +年底niandi +年度niandu +年份nianfen +娘niang +年华nianhua +年画nianhua +年级nianji +年纪nianji +年鉴nianjian +年来nianlai +年利nianli +年历nianli +拈量nianliang +年龄nianling +年迈nianmai +年年niannian +年青nianqing +年轻nianqing +年岁niansui +年头niantou +念头niantou +年限nianxian +年月nianyue +酿造nianzao +年终nianzhong +尿niao +鸟niao +溺*niao +茑niao +嬲niao +脲niao +袅niao +鸟瞰niaokan +逆差nicha +你处nichu +你的nide +拟定niding +拟订niding +镍nie +啮nie +涅nie +捏nie +聂nie +孽nie +镊nie +乜nie +陧nie +蘖nie +嗫nie +颞nie +臬nie +蹑nie +捏造niezao +腻烦nifan +泥浆nijiang +逆境nijing +泥坑nikeng +逆流niliu +你们nimen +您nin +宁ning +凝ning +拧ning +柠ning +狞ning +泞ning +佞ning +苎ning +咛ning +甯ning +聍ning +凝固ninggu +凝结ningjie +宁静ningjing +凝聚ningju +宁可ningke +宁肯ningken +宁日ningri +凝视ningshi +凝望ningwang +宁夏ningxia +宁愿ningyuan +泥泞nining +泥塑nisu +牛niu +扭niu +钮niu +纽niu +拗*niu +狃niu +忸niu +妞niu +纽带niudai +牛犊niudu +纽扣niukou +纽约niuyue +扭转niuzhuan +腻味niwei +你我niwo +拟议niyi +泥沼nizhao +逆转nizhuan +难解难分njnf +南京市njs +南极洲njz +扭亏为盈nkwy +脑力劳动nlld +年老体弱nltr +内蒙古nmg +农贸市场nmsc +那么些nmx +那么样nmy +念念不忘nnbw +难能可贵nnkg +南宁市nns +农nong +弄nong +浓nong +脓nong +侬nong +哝nong +脓包nongbao +农村nongcun +浓度nongdu +农妇nongfu +浓厚nonghou +农会nonghui +农活nonghuo +农具nongju +农历nongli +农林nonglin +农忙nongmang +农民nongmin +弄清nongqing +农时nongshi +农药nongyao +农业nongye +农艺nongyi +浓郁nongyu +耨nou +年轻化nqh +年轻人nqr +那时候nsh +能说会道nshd +南斯拉夫nslf +能上能下nsnx +逆水行舟nsxz +农田水利ntsl +女nu +奴nu +努nu +怒nu +弩nu +胬nu +孥nu +驽nu +恧nu +钕nu +衄nu +暖nuan +暖和nuanhe +暖流nuanliu +暖气nuanqi +奴婢nubi +奴才nucai +虐nue +虐待nuedai +虐疾nueji +女儿nuer +女工nugong +怒吼nuhou +奴化nuhua +怒火nuhuo +努力nuli +奴隶nuli +诺nuo +娜*nuo +挪nuo +懦nuo +糯nuo +傩nuo +搦nuo +喏nuo +锘nuo +挪用nuoyong +奴仆nupu +女人nuren +女色nuse +女士nushi +女性nuxing +女婿nuxu +女子nuzi +能文能武nwnw +弄虚作假nxzj +农作物nzw +你争我夺nzwd +欧o +偶o +哦o +鸥o +殴o +藕o +呕o +沤o +讴o +噢o +怄o +瓯o +耦o +偶然性orx +区*ou +欧ou +偶ou +鸥ou +殴ou +藕ou +呕ou +沤ou +讴ou +怄ou +瓯ou +耦ou +殴打ouda +偶尔ouer +讴歌ouge +偶合ouhe +耦合ouhe +欧姆oumu +怄气ouqi +偶然ouran +藕色ouse +偶数oushu +呕吐outu +欧阳ouyang +欧洲ouzhou +批p +平p +判p +配p +片p +派p +破p +排p +品p +皮p +喷p +盘p +偏p +评p +怕p +培p +普p +贫p +跑p +炮p +怕pa +派pa +爬pa +帕pa +扒*pa +耙*pa +啪pa +趴pa +琶pa +葩pa +杷pa +钯*pa +筢pa +派pai +排pai +拍pai +牌pai +迫*pai +哌pai +徘pai +湃pai +俳pai +蒎pai +排版paiban +拍板paiban +排比paibi +派别paibie +排场paichang +排斥paichi +排除paichu +排队paidui +牌号paihao +徘徊paihuai +排挤paiji +牌价paijia +排列pailie +拍卖paimai +派遣paiqian +排球paiqiu +派生paisheng +派头paitou +排外paiwai +排泄paixie +排演paiyan +牌照paizhao +判pan +盘pan +叛pan +番*pan +潘pan +攀pan +磐pan +盼pan +畔pan +胖pan +拚*pan +爿pan +泮pan +袢pan +襻pan +蟠pan +蹒pan +叛变panbian +判别panbie +盘缠panchan +盘存pancun +叛党pandang +攀登pandeng +盘点pandian +判定panding +判断panduan +攀附panfu +旁pang +膀*pang +磅*pang +乓pang +庞pang +耪pang +胖pang +彷pang +滂pang +逄pang +螃pang +旁边pangbian +庞大pangda +盘亘pangen +旁观pangguan +旁听pangting +旁通pangtong +滂沱pangtuo +庞杂pangza +盘踞panju +判决panjue +叛乱panluan +判明panming +叛逆panni +盘算pansuan +蟠桃pantao +叛徒pantu +盼望panwang +判刑panxing +盘旋panxuan +跑pao +炮pao +刨pao +抛pao +泡pao +咆pao +袍pao +匏pao +狍pao +庖pao +脬pao +疱pao +炮兵paobing +跑步paobu +炮弹paodan +跑道paodao +抛光paoguang +炮火paohuo +炮击paoji +抛锚paomao +泡沫paomo +抛弃paoqi +炮手paoshou +炮台paotai +炮艇paoting +咆哮paoxiao +泡影paoying +炮仗paozhang +炮制paozhi +怕死pasi +疲惫不堪pbbk +迫不急待pbjd +破除迷信pcmx +平等互利pdhl +配pei +培pei +陪pei +胚pei +呸pei +裴pei +赔pei +佩pei +沛pei +辔pei +帔pei +旆pei +锫pei +醅pei +霈pei +陪伴peiban +配备peibei +赔本peiben +赔偿peichang +陪衬peichen +配方peifang +佩服peifu +配合peihe +配给peiji +配件peijian +配角peijiao +赔款peikuan +赔礼peili +配偶peiou +陪审peishen +陪送peisong +胚胎peitai +配套peitao +陪同peitong +培训peixun +培养peiyang +配音peiyin +培育peiyu +配乐peiyue +陪葬peizang +配制peizhi +配置peizhi +培植peizhi +喷pen +盆pen +湓pen +盆地pendi +碰peng +棚peng +蓬peng +朋peng +捧peng +膨peng +砰peng +抨peng +烹peng +澎peng +彭peng +硼peng +篷peng +鹏peng +堋peng +嘭peng +怦peng +蟛peng +碰杯pengbei +碰壁pengbi +蓬勃pengbo +捧场pengchang +抨击pengji +蓬莱penglai +蓬乱pengluan +澎湃pengpai +烹饪pengren +硼砂pengsha +蓬松pengsong +烹调pengtiao +朋友pengyou +膨胀pengzhang +喷溅penjian +盆景penjing +喷射penshe +喷嚏penti +平方公里pfgl +平分秋色pfqs +批pi +皮pi +坏*pi +否*pi +辟*pi +坯pi +脾pi +疲pi +砒pi +霹pi +披pi +劈pi +琵pi +毗pi +啤pi +匹pi +痞pi +僻pi +屁pi +譬pi +丕pi +仳pi +陂*pi +陴pi +邳pi +郫pi +圮pi +埤*pi +鼙pi +芘pi +擗pi +吡*pi +噼pi +庀pi +淠pi +媲pi +纰pi +枇pi +甓pi +睥pi +罴pi +铍pi +癖pi +裨*pi +疋pi +蚍pi +蜱pi +貔pi +片pian +偏pian +便*pian +篇pian +骗pian +扁*pian +谝pian +骈pian +缏*pian +犏pian +胼pian +翩pian +蹁pian +偏差piancha +片断pianduan +片段pianduan +偏废pianfei +篇幅pianfu +偏激pianji +偏见pianjian +骗局pianju +片刻pianke +偏离pianli +片面pianmian +偏旁pianpang +偏僻pianpi +偏颇pianpo +骗取pianqu +骗人pianren +骗术pianshu +偏袒piantan +翩跹pianxian +偏向pianxiang +偏移pianyi +便宜pianyi +篇章pianzhang +骗子pianzi +票piao +漂piao +朴*piao +飘piao +瓢piao +剽piao +莩*piao +嘌piao +嫖piao +骠*piao +缥piao +殍piao +瞟piao +螵piao +漂泊piaobo +票房piaofang +漂浮piaofu +票价piaojia +票据piaoju +漂亮piaoliang +漂流piaoliu +飘流piaoliu +飘落piaoluo +票面piaomian +飘渺piaomiao +飘泊piaopo +剽窃piaoqie +飘然piaoran +飘散piaosan +飘扬piaoyang +飘游piaoyou +疲惫pibei +批驳pibo +撇pie +瞥pie +丿pie +苤pie +氕pie +批发pifa +批复pifu +皮肤pifu +皮革pige +屁股pigu +疲倦pijuan +疲劳pilao +纰漏pilou +披露pilu +品pin +贫pin +频pin +拼pin +苹pin +聘pin +拚pin +姘pin +嫔pin +榀pin +牝pin +颦pin +品尝pinchang +频传pinchuan +拼凑pincou +频带pindai +频道pindao +品德pinde +贫乏pinfa +频繁pinfan +平ping +评ping +瓶ping +凭ping +苹ping +冯*ping +乒ping +坪ping +萍ping +屏ping +俜ping +娉ping +枰ping +鲆ping +平安pingan +评比pingbi +屏蔽pingbi +平常pingchang +平川pingchuan +平淡pingdan +平等pingdeng +平地pingdi +平定pingding +评定pingding +品格pinge +平反pingfan +平凡pingfan +平方pingfang +平分pingfen +评分pingfen +评功pinggong +平衡pingheng +评级pingji +平价pingjia +评价pingjia +评奖pingjiang +凭借pingjie +平静pingjing +平均pingjun +平空pingkong +凭空pingkong +评理pingli +评论pinglun +平面pingmian +平民pingmin +屏幕pingmu +评判pingpan +乒乓pingpang +平平pingping +平壤pingrang +平日pingri +平时pingshi +平手pingshou +评说pingshuo +平素pingsu +平坦pingtan +乒坛pingtan +平稳pingwen +平息pingxi +萍乡pingxiang +平行pingxing +平易pingyi +评议pingyi +平庸pingyong +平原pingyuan +平仄pingze +屏障pingzhang +凭着pingzhe +平整pingzheng +凭证pingzheng +评注pingzhu +贫寒pinhan +品级pinji +贫困pinkun +频率pinlu +品貌pinmao +拼命pinming +品名pinming +品评pinping +聘请pinqing +贫穷pinqiong +聘任pinren +聘书pinshu +拼写pinxie +品行pinxing +品性pinxing +拼音pinyin +品质pinzhi +品种pinzhong +批判pipan +匹配pipei +批评piping +脾气piqi +譬如piru +疲软piruan +批示pishi +脾胃piwei +脾性pixing +辟谣piyao +批语piyu +批阅piyue +批注pizhu +批准pizhun +平均数pjs +披荆斩棘pjzj +评论员ply +跑马观花pmgh +破po +迫po +坡po +泼po +繁*po +朴*po +泊*po +颇po +婆po +魄po +粕po +叵po +陂*po +鄱po +泺*po +珀po +攴po +钋po +钷po +钹*po +皤po +笸po +破案poan +破产pochan +破除pochu +坡度podu +泼妇pofu +破格poge +迫害pohai +破坏pohuai +破获pohuo +迫近pojin +破旧pojiu +泼辣pola +破烂polan +魄力poli +破例poli +破裂polie +破灭pomie +迫切poqie +迫使poshi +破碎posui +破损posun +破土potu +剖pou +裒pou +掊pou +剖解poujie +剖析pouxi +破绽pozhan +蓬蓬勃勃ppbb +普普通通pptt +旁若无人prwr +普通话pth +抛头露面ptlm +普pu +谱pu +扑pu +埔pu +铺pu +暴*pu +葡pu +朴pu +蒲pu +堡*pu +脯*pu +仆pu +莆pu +菩pu +圃pu +浦pu +曝pu +瀑pu +匍pu +噗pu +溥pu +濮pu +璞pu +氆pu +镤pu +镨pu +蹼pu +普遍pubian +普查pucha +扑哧puchi +扑打puda +铺盖pugai +普及puji +铺平puping +仆人puren +菩萨pusa +铺设pushe +朴实pushi +朴素pusu +葡萄putao +普通putong +扑通putong +铺位puwei +谱写puxie +普选puxuan +铺张puzhang +普照puzhao +朴直puzhi +平易近人pyjr +拼音字母pyzm +铺张浪费pzlf +起q +前q +其q +去q +气q +全q +期q +群q +情q +区q +强q +切q +取q +七q +求q +清q +确q +权q +且q +青q +亲爱的qad +情报所qbs +千百万qbw +千变万化qbwh +取长补短qcbd +千锤百炼qcbl +恰到好处qdhc +全党全军和全国qdqg +取而代之qedz +轻而易举qeyj +千方百计qfbj +清规戒律qgjl +勤工俭学qgjx +旗鼓相当qgxd +轻工业qgy +轻工业部qgyb +勤工助学qgzx +权衡利弊qhlb +骑虎难下qhnx +青海省qhs +青红皂白qhzb +起qi +其qi +气qi +期qi +七qi +器qi +齐qi +奇qi +汽qi +企qi +漆qi +欺qi +旗qi +畦qi +启qi +弃qi +歧qi +稽*qi +缉*qi +栖qi +戚qi +妻qi +凄qi +柒qi +沏qi +棋qi +崎qi +脐qi +祈qi +祁qi +骑qi +岂qi +乞qi +契qi +砌qi +迄qi +泣qi +讫qi +亟*qi +亓qi +俟qi +圻qi +芑qi +芪qi +荠*qi +萁qi +萋qi +葺qi +蕲qi +嘁qi +屺qi +岐qi +岖*qi +汔qi +淇qi +骐qi +绮qi +琪qi +琦qi +杞qi +桤qi +槭qi +耆qi +欹qi +祺qi +憩qi +碛qi +颀qi +蛴qi +蜞qi +綦qi +綮qi +蹊qi +鳍qi +麒qi +卡*qia +恰qia +掐qia +洽qia +伽*qia +葜qia +袷*qia +髂qia +恰当qiadang +恰好qiahao +前qian +千qian +钱qian +浅qian +签qian +迁qian +铅qian +潜qian +牵qian +钳qian +纤*qian +谴qian +扦qian +钎qian +仟qian +谦qian +乾qian +黔qian +遣qian +堑qian +嵌qian +欠qian +歉qian +倩qian +佥qian +阡qian +芊qian +芡qian +茜qian +荨qian +掮qian +岍qian +悭qian +慊qian +骞qian +搴qian +褰qian +缱qian +椠qian +犍*qian +肷qian +愆qian +钤qian +虔qian +箬qian +箝qian +前辈qianbei +前边qianbian +浅薄qianbo +钱财qiancai +欠产qianchan +前程qiancheng +签到qiandao +前敌qiandi +签订qianding +签发qianfa +遣返qianfan +前方qianfang +强qiang +将*qiang +枪qiang +抢qiang +墙qiang +腔qiang +呛qiang +羌qiang +蔷qiang +戕qiang +嫱qiang +樯qiang +戗qiang +炝qiang +锖qiang +锵qiang +镪qiang +襁qiang +蜣qiang +羟qiang +跄qiang +墙壁qiangbi +枪毙qiangbi +强辩qiangbian +强大qiangda +枪弹qiangdan +强盗qiangdao +强调qiangdiao +腔调qiangdiao +强度qiangdu +抢夺qiangduo +强攻qianggong +强国qiangguo +强化qianghua +强加qiangjia +强奸qiangjian +抢劫qiangjie +强劲qiangjin +抢救qiangjiu +枪决qiangjue +强烈qianglie +强迫qiangpo +强权qiangquan +强弱qiangruo +枪杀qiangsha +强盛qiangsheng +千古qiangu +牵挂qiangua +蔷薇qiangwei +抢险qiangxian +强行qiangxing +强硬qiangying +强占qiangzhan +强者qiangzhe +强制qiangzhi +枪支qiangzhi +强壮qiangzhuang +前后qianhou +前进qianjin +前景qianjing +迁就qianjiu +歉疚qianjiu +迁居qianju +乾坤qiankun +千里qianli +前例qianli +潜力qianli +牵连qianlian +前列qianlie +浅陋qianlou +前面qianmian +签名qianming +前年qiannian +前期qianqi +千秋qianqiu +前驱qianqu +欠缺qianque +前人qianren +前任qianren +纤弱qianruo +前哨qianshao +牵涉qianshe +歉收qianshou +签署qianshu +遣送qiansong +前提qianti +前天qiantian +欠条qiantiao +前途qiantu +千瓦qianwa +千万qianwan +前往qianwang +前夕qianxi +纤细qianxi +前线qianxian +浅显qianxian +谦虚qianxu +谦逊qianxun +前言qianyan +前沿qianyan +前夜qianye +歉意qianyi +迁移qianyi +牵引qianyin +潜在qianzai +谴责qianze +前者qianzhe +签证qianzheng +牵制qianzhi +钳制qianzhi +签字qianzi +前奏qianzou +桥qiao +瞧qiao +壳*qiao +巧qiao +敲qiao +乔qiao +蕉qiao +橇qiao +锹qiao +悄qiao +侨qiao +鞘qiao +撬qiao +翘qiao +峭qiao +俏qiao +窍qiao +雀*qiao +劁qiao +诮qiao +谯qiao +荞qiao +峤*qiao +愀qiao +憔qiao +缲*qiao +樵qiao +硗qiao +跷qiao +鞒qiao +侨胞qiaobao +桥墩qiaodun +巧计qiaoji +瞧见qiaojian +侨居qiaoju +桥梁qiaoliang +窍门qiaomen +巧妙qiaomiao +桥牌qiaopai +乔迁qiaoqian +悄然qiaoran +侨务qiaowu +敲诈qiaozha +恰似qiasi +洽谈qiatan +岂不qibu +起步qibu +器材qicai +奇才qicai +凄惨qican +起草qicao +汽车qiche +骑车qiche +启程qicheng +起初qichu +凄楚qichu +其次qici +期待qidai +脐带qidai +岂但qidan +启迪qidi +起点qidian +启动qidong +气度qidu +切qie +且qie +砌*qie +茄qie +怯qie +窃qie +伽*qie +郄qie +惬qie +慊*qie +妾qie +挈qie +锲qie +箧qie +窃案qiean +切断qieduan +切合qiehe +窃据qieju +窃取qiequ +怯弱qieruo +切身qieshen +切实qieshi +切题qieti +窃听qieting +切削qiexiao +惬意qieyi +启发qifa +起飞qifei +岂非qifei +气愤qifen +气氛qifen +欺负qifu +气概qigai +乞丐qigai +岂敢qigan +气功qigong +奇怪qiguai +器官qiguan +旗号qihao +漆黑qihei +气候qihou +期货qihuo +契机qiji +奇迹qiji +期间qijian +起见qijian +器件qijian +七届qijie +迄今qijin +起来qilai +凄凉qiliang +欺凌qiling +气流qiliu +歧路qilu +起码qima +骑马qima +启蒙qimeng +奇妙qimiao +器皿qimin +亲qin +侵qin +勤qin +秦qin +钦qin +琴qin +芹qin +擒qin +禽qin +寝qin +沁qin +芩qin +揿qin +吣qin +嗪qin +噙qin +廑*qin +溱qin +檎qin +锓qin +矜*qin +覃qin +螓qin +衾qin +亲爱qinai +亲笔qinbi +岂能qineng +侵犯qinfan +勤奋qinfen +情qing +清qing +青qing +轻qing +倾qing +请qing +亲*qing +庆qing +氢qing +晴qing +卿qing +擎qing +氰qing +顷qing +苘qing +圊qing +檠qing +磬qing +蜻qing +罄qing +箐qing +綮*qing +謦qing +鲭qing +黥qing +清白qingbai +青白qingbai +情报qingbao +情操qingcao +青草qingcao +清查qingcha +清除qingchu +清楚qingchu +青春qingchun +青翠qingcui +清单qingdan +倾倒qingdao +清点qingdian +情调qingdiao +轻浮qingfu +青工qinggong +青海qinghai +庆贺qinghe +清华qinghua +情怀qinghuai +清还qinghuan +请假qingjia +请柬qingjian +请教qingjiao +情节qingjie +清洁qingjie +情景qingjing +顷刻qingke +晴空qingkong +轻快qingkuai +情况qingkuang +青睐qinglai +晴朗qinglang +情理qingli +清理qingli +轻率qinglu +轻蔑qingmie +青年qingnian +氢气qingqi +轻巧qingqiao +请求qingqiu +情趣qingqu +青山qingshan +请示qingshi +清爽qingshuang +青松qingsong +轻松qingsong +倾诉qingsu +青天qingtian +晴天qingtian +倾听qingting +倾吐qingtu +请问qingwen +倾向qingxiang +倾销qingxiao +情形qingxing +清醒qingxing +情绪qingxu +情谊qingyi +轻易qingyi +轻盈qingying +情愿qingyuan +请愿qingyuan +请战qingzhan +轻重qingzhong +倾注qingzhu +庆祝qingzhu +请罪qingzui +侵害qinhai +勤俭qinjian +亲近qinjin +亲眷qinjuan +勤快qinkuai +勤劳qinlao +亲历qinli +亲临qinlin +侵略qinlue +亲密qinmi +勤勉qinmian +钦佩qinpei +亲戚qinqi +亲切qinqie +亲热qinre +亲人qinren +侵入qinru +亲身qinshen +侵蚀qinshi +寝室qinshi +亲手qinshou +亲属qinshu +侵吞qintun +勤务qinwu +亲信qinxin +亲眼qinyan +亲友qinyou +侵占qinzhan +亲自qinzi +穷qiong +琼qiong +邛qiong +茕qiong +穹qiong +蛩qiong +筇qiong +跫qiong +銎qiong +穷国qiongguo +穷苦qiongku +穷困qiongkun +穹隆qionglong +穷期qiongqi +穷人qiongren +穷途qiongtu +气派qipai +欺骗qipian +气魄qipo +乞求qiqiu +崎岖qiqu +齐全qiquan +凄然qiran +起色qise +气色qise +其实qishi +起始qishi +启事qishi +气势qishi +启示qishi +歧视qishi +奇数qishu +汽水qishui +起诉qisu +其他qita +其它qita +奇特qite +气体qiti +汽艇qiting +企图qitu +歧途qitu +求qiu +球qiu +秋qiu +丘qiu +仇*qiu +龟*qiu +邱qiu +囚qiu +酋qiu +泅qiu +俅qiu +巯qiu +犰qiu +湫qiu +逑qiu +遒qiu +楸qiu +赇qiu +虬qiu +蚯qiu +蝤qiu +裘qiu +糗qiu +鳅qiu +鼽qiu +秋播qiubo +球场qiuchang +囚犯qiufan +秋风qiufeng +秋季qiuji +求教qiujiao +囚禁qiujin +求救qiujiu +丘陵qiuling +秋千qiuqian +求情qiuqing +求全qiuquan +秋色qiuse +求实qiushi +秋收qiushou +秋天qiutian +求学qiuxue +求战qiuzhan +求证qiuzheng +求知qiuzhi +求助qiuzhu +期望qiwang +气味qiwei +气温qiwen +奇闻qiwen +欺侮qiwu +气息qixi +栖息qixi +起先qixian +期限qixian +气象qixiang +器械qixie +齐心qixin +气压qiya +欺压qiya +气焰qiyan +企业qiye +起义qiyi +歧义qiyi +起因qiyin +启用qiyong +汽油qiyou +其余qiyu +起源qiyuan +七月qiyue +契约qiyue +欺诈qizha +气质qizhi +旗帜qizhi +其中qizhong +器重qizhong +旗子qizi +妻子qizi +勤俭建国qjjg +勤俭节约qjjy +迄今为止qjwz +取决于qjy +千钧一发qjyf +旗开得胜qkds +全力以赴qlyf +勤劳致富qlzf +千里之行qlzx +亲密无间qmwj +青年人qnr +千篇一律qpyl +清清楚楚qqcc +勤勤恳恳qqkk +切切实实qqss +确确实实qqss +恰恰相反qqxf +求全责备qqzb +恰如其分qrqf +欺人之谈qrzt +七手八脚qsbj +全神贯注qsgz +全世界qsj +切实可行qskx +切身利益qsly +青少年qsn +前所未闻qsww +前所未有qswy +气势汹汹qsxx +齐头并进qtbj +奇谈怪论qtgl +千头万绪qtwx +前提下qtx +去qu +区qu +取qu +曲qu +且*qu +渠qu +屈qu +趋qu +驱qu +趣qu +蛆qu +躯qu +娶qu +龋qu +戌*qu +诎qu +劬qu +苣*qu +蕖qu +蘧qu +岖qu +衢qu +阒qu +璩qu +觑qu +氍qu +朐qu +祛qu +磲qu +鸲qu +癯qu +蛐qu +蠼qu +麴qu +瞿qu +黢qu +全quan +权quan +圈quan +劝quan +泉quan +醛quan +颧quan +痊quan +拳quan +犬quan +券quan +诠quan +荃quan +悛quan +绻quan +辁quan +畎quan +铨quan +蜷quan +筌quan +鬈quan +全部quanbu +全党quandang +劝导quandao +蜷伏quanfu +劝告quangao +全国quanguo +权衡quanheng +全会quanhui +拳击quanji +劝解quanjie +全局quanju +全军quanjun +全力quanli +权利quanli +权力quanli +全貌quanmao +全面quanmian +劝勉quanmian +全民quanmin +全能quanneng +全年quannian +全盘quanpan +全拼quanpin +全球quanqiu +蜷曲quanqu +全权quanquan +全然quanran +全胜quansheng +权术quanshu +泉水quanshui +劝说quanshuo +圈套quantao +全体quanti +拳头quantou +权威quanwei +劝慰quanwei +全文quanwen +全县quanxian +权限quanxian +全校quanxiao +权益quanyi +权宜quanyi +劝诱quanyou +痊愈quanyu +劝止quanzhi +劝阻quanzu +区别qubie +屈才qucai +驱除quchu +取代qudai +渠道qudao +取得qude +取缔qudi +曲调qudiao +驱动qudong +确que +却que +缺que +炔que +瘸que +鹊que +榷que +雀que +阕que +阙que +悫que +确保quebao +缺点quedian +确定queding +缺乏quefa +缺口quekou +确立queli +确切queqie +确认queren +缺少queshao +缺省quesheng +确实queshi +缺席quexi +缺陷quexian +确信quexin +确凿quezao +瘸子quezi +区分qufen +屈服qufu +躯干qugan +区划quhua +曲解qujie +取经qujing +取决qujue +躯壳quke +取乐qule +群qun +裙qun +逡qun +裙带qundai +群岛qundao +去年qunian +群众qunzhong +区区ququ +屈辱quru +驱散qusan +取舍qushe +取胜qusheng +去世qushi +驱使qushi +趋势qushi +躯体quti +区位quwei +区委quwei +趣味quwei +区县quxian +去向quxiang +趋向quxiang +取消quxiao +取信quxin +曲艺quyi +区域quyu +区长quzhang +曲折quzhe +屈指quzhi +驱逐quzhu +曲子quzi +奇形怪状qxgz +全心全意qxqy +气象台qxt +气象万千qxwq +齐心协力qxxl +岂有此理qycl +前因后果qyhg +情有可原qyky +强有力qyl +求之不得qzbd +取之不尽qzbj +轻重缓急qzhj +气壮山河qzsh +千真万确qzwq +人r +如r +日r +认r +入r +任r +热r +然r +容r +让r +润r +弱r +燃r +染r +壤r +绕r +仁r +溶r +刃r +仍r +然ran +燃ran +染ran +冉ran +苒ran +蚺ran +髯ran +燃点randian +然而raner +让rang +壤rang +嚷rang +瓤rang +攘rang +禳rang +穰rang +让步rangbu +让位rangwei +让贤rangxian +然后ranhou +燃料ranliao +染料ranliao +冉冉ranran +燃烧ranshao +绕rao +扰rao +饶rao +荛rao +娆rao +桡rao +扰乱raoluan +如此而已rcey +人才济济rcjj +热re +若*re +惹re +热爱reai +热潮rechao +热忱rechen +热诚recheng +热带redai +热火rehuo +热量reliang +热烈relie +人ren +认ren +任ren +仁ren +刃ren +忍ren +壬ren +韧ren +妊ren +纫ren +仞ren +荏ren +葚ren +饪ren +轫ren +稔ren +衽ren +热闹renao +人才rencai +人次renci +仁慈renci +认错rencuo +人大renda +韧带rendai +人道rendao +认得rende +认定rending +人防renfang +仍reng +扔reng +扔掉rengdiao +人格renge +仍旧rengjiu +人工rengong +认购rengou +仍然rengran +任何renhe +人家renjia +人间renjian +人杰renjie +认可renke +人口renkou +人类renlei +人力renli +人们renmen +任免renmian +人民renmin +任命renming +忍耐rennai +任凭renping +任期renqi +认清renqing +人权renquan +荏苒renran +忍让renrang +人人renren +人参renshen +人生rensheng +人事renshi +人士renshi +认识renshi +人手renshou +忍受renshou +认输renshu +忍痛rentong +人为renwei +认为renwei +人物renwu +任务renwu +人心renxin +忍心renxin +人选renxuan +任意renyi +仁义renyi +任用renyong +人员renyuan +认帐renzhang +认真renzhen +人质renzhi +任职renzhi +认罪renzui +认作renzuo +热切reqie +热情reqing +惹事reshi +热线rexian +热心rexin +热血rexue +人工合成rghc +热火朝天rhct +如虎添翼rhty +日ri +日报ribao +日本riben +日产richan +日常richang +日程richeng +日光riguang +日后rihou +日记riji +日久rijiu +日历rili +日落riluo +日内rinei +日期riqi +日夜riye +日益riyi +日用riyong +日照rizhao +日中rizhong +日子rizi +软件包rjb +人杰地灵rjdl +人尽其才rjqc +如饥似渴rjsk +日久天长rjtc +任劳任怨rlry +热泪盈眶rlyk +人民币rmb +人民代表大会rmdh +人民日报rmrb +燃眉之急rmzj +容rong +溶rong +荣rong +熔rong +融rong +绒rong +戎rong +茸rong +蓉rong +冗rong +嵘rong +狨rong +榕rong +肜rong +蝾rong +熔点rongdian +容光rongguang +融合ronghe +溶化ronghua +熔化ronghua +融化ronghua +融会ronghui +荣获ronghuo +容积rongji +溶解rongjie +容量rongliang +戎马rongma +容貌rongmao +容纳rongna +融洽rongqia +容忍rongren +荣辱rongru +容身rongshen +绒线rongxian +荣幸rongxing +容许rongxu +荣耀rongyao +溶液rongye +容易rongyi +荣誉rongyu +溶质rongzhi +肉rou +揉rou +柔rou +糅rou +蹂rou +鞣rou +柔和rouhe +肉麻rouma +柔软rouruan +肉体routi +任人为贤rrwx +日日夜夜rryy +人生观rsg +认识论rsl +惹事生非rssf +如上所述rsss +如ru +入ru +儒ru +乳ru +茹ru +蠕ru +孺ru +辱ru +汝ru +褥ru +蓐ru +薷ru +嚅ru +洳ru +溽ru +濡ru +缛ru +铷ru +襦ru +颥ru +软ruan +阮ruan +朊ruan +软骨ruangu +软件ruanjian +软禁ruanjin +软盘ruanpan +如常ruchang +如此ruci +入党rudang +蠕动rudong +乳房rufang +如果ruguo +如何ruhe +瑞rui +锐rui +蕊rui +芮rui +蕤rui +枘rui +睿rui +蚋rui +锐利ruili +瑞雪ruixue +锐意ruiyi +儒家rujia +如今rujin +辱骂ruma +入门rumen +入迷rumi +润run +闰run +润滑runhua +弱ruo +若ruo +偌ruo +弱点ruodian +若干ruogan +若是ruoshi +弱小ruoxiao +如期ruqi +入侵ruqin +如若ruruo +儒生rusheng +入手rushou +如同rutong +如下ruxia +入选ruxuan +如意ruyi +如愿ruyuan +入帐ruzhang +人武部rwb +若无其事rwqs +人言可畏rykw +日用品ryp +若有所思ryss +人之长情rzcq +是s +上s +时s +生s +说s +社s +深s +水s +所s +三s +十s +使s +事s +数s +四s +实s +少s +式s +山s +手s +撒sa +萨sa +洒sa +卅sa +仨sa +挲sa +脎sa +飒sa +撒谎sahuang +塞sai +思*sai +赛sai +腮sai +鳃sai +噻sai +赛车saiche +塞子saizi +撒娇sajiao +三san +散san +叁san +伞san +馓san +毵san +糁san +散步sanbu +散布sanbu +散发sanfa +三废sanfei +桑sang +丧sang +嗓sang +搡sang +磉sang +颡sang +丧命sangming +丧失sangshi +三国sanguo +三好sanhao +散会sanhui +三角sanjiao +三届sanjie +散失sanshi +散文sanwen +三月sanyue +扫sao +梢*sao +搔sao +骚sao +嫂sao +埽sao +缫sao +缲sao +臊sao +瘙sao +鳋sao +扫除saochu +扫荡saodang +扫地saodi +骚动saodong +骚乱saoluan +扫描saomiao +扫墓saomu +骚扰saorao +瘙痒saoyang +扫帚saozhou +洒脱satuo +说不定sbd +舍不得sbd +说不过去sbgq +说不来sbl +数不胜数sbss +素不相识sbxs +身不由己sbyj +上层建筑scjz +生产力scl +生产率scl +水产品scp +四川省scs +市场调节sctj +市场信息scxx +生动活泼sdhp +山东省sds +水电站sdz +色se +塞*se +瑟se +涩se +啬se +铯se +穑se +视而不见sebj +色彩secai +色调sediao +色盲semang +森sen +僧seng +僧侣senglu +森林senlin +森严senyan +色情seqing +瑟瑟sese +十二月sey +色泽seze +司法部sfb +赏罚分明sffm +说服力sfl +手风琴sfq +三番五次sfwc +四个现代化sgxh +手工业sgy +沙sha +杀sha +砂sha +啥sha +纱sha +莎sha +刹sha +傻sha +煞sha +杉sha +厦*sha +唼sha +嗄*sha +挲*sha +歃sha +铩sha +痧sha +裟sha +霎sha +鲨sha +煞白shabai +刹车shache +煞车shache +沙发shafa +傻瓜shagua +沙皇shahuang +色*shai +筛shai +晒shai +晒台shaitai +砂烬shajin +沙龙shalong +沙漠shamo +山shan +单*shan +闪shan +善shan +珊shan +扇shan +陕shan +掸*shan +苫shan +杉shan +删shan +煽shan +衫shan +擅shan +赡shan +膳shan +汕shan +缮shan +栅*shan +剡shan +讪shan +鄯shan +埏shan +芟shan +潸shan +姗shan +嬗shan +骟shan +膻shan +禅*shan +钐shan +疝shan +蟮shan +舢shan +跚shan +鳝shan +刹那shana +山坳shanao +陕北shanbei +擅长shanchang +删除shanchu +山川shanchuan +山地shandi +闪电shandian +扇动shandong +煽动shandong +山东shandong +山峰shanfeng +上shang +商shang +伤shang +尚shang +汤*shang +墒shang +赏shang +晌shang +裳shang +垧shang +绱shang +殇shang +熵shang +觞shang +删改shangai +山岗shangang +山冈shangang +上班shangban +上报shangbao +上边shangbian +商标shangbiao +上部shangbu +上策shangce +上层shangceng +商场shangchang +上次shangci +赏赐shangci +上当shangdang +上等shangdeng +上帝shangdi +商店shangdian +上调shangdiao +商定shangding +上访shangfang +伤感shanggan +上告shanggao +赏光shangguang +上海shanghai +伤害shanghai +商行shanghang +上级shangji +上集shangji +上进shangjin +上空shangkong +上来shanglai +商量shangliang +上流shangliu +上门shangmen +上面shangmian +上年shangnian +山沟shangou +商品shangpin +商洽shangqia +上前shangqian +尚且shangqie +上去shangqu +商榷shangque +商人shangren +上任shangren +上山shangshan +上升shangsheng +赏识shangshi +上述shangshu +上司shangsi +上诉shangsu +商谈shangtan +商讨shangtao +闪光shanguang +上文shangwen +上午shangwu +商务shangwu +上下shangxia +上限shangxian +伤心shangxin +上旬shangxun +上演shangyan +商业shangye +商议shangyi +上映shangying +上游shangyou +上涨shangzhang +上阵shangzhen +山河shanhe +善后shanhou +删节shanjie +善良shanliang +山林shanlin +山岭shanling +山脉shanmai +杉木shanmu +山区shanqu +扇区shanqu +山水shanshui +闪烁shanshuo +山头shantou +山西shanxi +陕西shanxi +赡养shanyang +闪耀shanyao +善意shanyi +善于shanyu +善战shanzhan +擅自shanzi +少shao +烧shao +稍shao +绍shao +召*shao +哨shao +梢shao +鞘*shao +捎shao +芍shao +勺shao +韶shao +邵shao +劭shao +苕shao +潲shao +杓*shao +蛸shao +筲shao +艄shao +哨兵shaobing +艄公shaogong +烧毁shaohui +少见shaojian +哨卡shaoka +少量shaoliang +少年shaonian +少女shaonu +烧伤shaoshang +少数shaoshu +哨所shaosuo +稍微shaowei +少许shaoxu +稍许shaoxu +少爷shaoye +少有shaoyou +少于shaoyu +少壮shaozhuang +沙哑shaya +砂眼shayan +傻子shazi +社she +设she +射she +摄she +舌she +折*she +涉she +舍she +蛇she +奢she +赊she +赦she +慑she +厍she +佘she +摺*she +猞she +滠she +歙she +畲she +麝she +设备shebei +射程shecheng +奢侈shechi +舍得shede +设法shefa +慑服shefu +赊购shegou +奢华shehua +社会shehui +社稷sheji +涉及sheji +设计sheji +射击sheji +舍己sheji +社交shejiao +设立sheli +涉猎shelie +社论shelun +深shen +身shen +神shen +什*shen +伸shen +参*shen +甚shen +渗shen +沈shen +肾shen +审shen +申shen +慎shen +砷shen +呻shen +娠shen +绅shen +婶shen +诜shen +谂shen +莘shen +葚*shen +哂shen +渖shen +椹shen +胂shen +矧shen +蜃shen +深奥shenao +申报shenbao +身边shenbian +申辩shenbian +身材shencai +审查shencha +深沉shenchen +深处shenchu +审处shenchu +审定shending +深度shendu +甚而shener +身分shenfen +身份shenfen +生sheng +胜sheng +声sheng +省sheng +升sheng +盛sheng +绳sheng +剩sheng +圣sheng +牲sheng +乘*sheng +甥sheng +嵊sheng +渑*sheng +晟sheng +眚sheng +笙sheng +生财shengcai +生产shengchan +生成shengcheng +牲畜shengchu +生存shengcun +盛大shengda +省得shengde +胜地shengdi +盛典shengdian +声调shengdiao +生动shengdong +省份shengfen +胜负shengfu +省府shengfu +生根shenggen +升华shenghua +省会shenghui +盛会shenghui +生活shenghuo +生机shengji +生计shengji +升级shengji +圣洁shengjie +圣经shengjing +盛开shengkai +牲口shengkou +盛况shengkuang +生理shengli +胜利shengli +省力shengli +省略shenglue +生命shengming +声明shengming +盛名shengming +生怕shengpa +生僻shengpi +生平shengping +升旗shengqi +生前shengqian +升迁shengqian +盛情shengqing +生趣shengqu +省去shengqu +胜任shengren +生日shengri +省事shengshi +盛事shengshi +声势shengshi +生疏shengshu +生死shengsi +胜似shengsi +胜诉shengsu +绳索shengsuo +生态shengtai +声讨shengtao +声望shengwang +省委shengwei +生物shengwu +生息shengxi +剩下shengxia +盛夏shengxia +圣贤shengxian +生效shengxiao +生肖shengxiao +盛行shengxing +生涯shengya +生意shengyi +声音shengyin +生于shengyu +生育shengyu +胜于shengyu +声誉shengyu +剩余shengyu +声援shengyuan +生长shengzhang +省长shengzhang +声张shengzhang +胜仗shengzhang +生殖shengzhi +圣旨shengzhi +盛装shengzhuang +审核shenhe +深厚shenhou +深化shenhua +神话shenhua +甚或shenhuo +审计shenji +神经shenjing +深刻shenke +审理shenli +什么shenme +审美shenmei +神秘shenmi +申明shenming +审判shenpan +身旁shenpang +审批shenpi +神气shenqi +神奇shenqi +深浅shenqian +深切shenqie +深情shenqing +申请shenqing +身躯shenqu +深入shenru +渗入shenru +神圣shensheng +身世shenshi +绅士shenshi +伸手shenshou +申述shenshu +神速shensu +申诉shensu +伸缩shensuo +神态shentai +身体shenti +神通shentong +渗透shentou +审问shenwen +神仙shenxian +审讯shenxun +沈阳shenyang +审议shenyi +呻吟shenyin +身影shenying +深远shenyuan +申冤shenyuan +审阅shenyue +深造shenzao +伸张shenzhang +深圳shenzhen +甚至shenzhi +深重shenzhong +慎重shenzhong +神州shenzhou +舍弃sheqi +赊欠sheqian +设施sheshi +社团shetuan +奢望shewang +射线shexian +涉嫌shexian +设想shexiang +赊销shexiao +设宴sheyan +摄影sheying +社员sheyuan +社长shezhang +设置shezhi +涉足shezu +社会公德shgd +是shi +时shi +十shi +使shi +事shi +实shi +式shi +识shi +世shi +试shi +石shi +什shi +示shi +市shi +史shi +师shi +始shi +施shi +士shi +势shi +湿shi +适shi +食shi +失shi +视shi +室shi +氏shi +似*shi +蚀shi +诗shi +释shi +殖*shi +拾shi +饰shi +驶shi +匙*shi +狮shi +尸shi +虱shi +矢shi +屎shi +柿shi +拭shi +誓shi +逝shi +嗜shi +噬shi +仕shi +侍shi +恃shi +嘘*shi +峙*shi +谥shi +埘shi +莳shi +蓍shi +弑shi +轼shi +贳shi +炻shi +铈shi +螫shi +舐shi +筮shi +酾shi +豕shi +鲥shi +鲺shi +失败shibai +势必shibi +事变shibian +师表shibiao +识别shibie +失策shice +史册shice +视察shicha +时常shichang +失常shichang +市场shichang +时辰shichen +失传shichuan +侍从shicong +时代shidai +世代shidai +适当shidang +是的shide +实地shidi +试点shidian +失调shidiao +失掉shidiao +事端shiduan +拾掇shiduo +时而shier +示范shifan +师范shifan +施放shifang +释放shifang +是非shifei +时分shifen +十分shifen +侍奉shifeng +是否shifou +师傅shifu +实干shigan +是个shige +诗歌shige +施工shigong +事故shigu +世故shigu +尸骨shigu +使馆shiguan +时光shiguang +嗜好shihao +适合shihe +时候shihou +事后shihou +侍候shihou +使唤shihuan +实惠shihui +失火shihuo +时机shiji +事迹shiji +实际shiji +世纪shiji +试剂shiji +史籍shiji +施加shijia +市价shijia +时间shijian +事件shijian +世间shijian +实践shijian +视角shijiao +市郊shijiao +使节shijie +十届shijie +世界shijie +使劲shijin +市井shijing +时局shiju +视觉shijue +时刻shike +石刻shike +市侩shikuai +实况shikuang +事理shili +实力shili +事例shili +势利shili +失利shili +势力shili +视力shili +示例shili +失恋shilian +适量shiliang +矢量shiliang +拾零shiling +失灵shiling +适龄shiling +时髦shimao +失密shimi +市民shimin +使命shiming +市内shinei +室内shinei +诗篇shipian +食品shipin +视频shipin +识破shipo +时期shiqi +事前shiqian +失窃shiqie +事情shiqing +实情shiqing +时区shiqu +时取shiqu +失去shiqu +市区shiqu +诗人shiren +市容shirong +湿润shirun +示弱shiruo +失散shisan +失色shise +施舍shishe +师生shisheng +失声shisheng +时时shishi +时事shishi +适时shishi +事实shishi +失事shishi +实施shishi +失实shishi +逝世shishi +史诗shishi +失势shishi +誓师shishi +尸首shishou +失守shishou +实数shishu +施属shishu +世俗shisu +失算shisuan +事态shitai +试探shitan +食堂shitang +实体shiti +尸体shiti +石头shitou +势头shitou +师团shituan +十万shiwan +失望shiwang +市委shiwei +示威shiwei +时务shiwu +事物shiwu +事务shiwu +实物shiwu +食物shiwu +饰物shiwu +失误shiwu +实习shixi +事先shixian +视线shixian +实现shixian +试想shixiang +事项shixiang +实效shixiao +试销shixiao +失信shixin +实行shixing +试行shixing +施行shixing +失修shixiu +实学shixue +史学shixue +实验shiyan +试验shiyan +食言shiyan +誓言shiyan +式样shiyang +事业shiye +实业shiye +失业shiye +视野shiye +时宜shiyi +事宜shiyi +示意shiyi +诗意shiyi +适宜shiyi +释疑shiyi +适应shiying +使用shiyong +实用shiyong +试用shiyong +适用shiyong +事由shiyou +石油shiyou +誓由shiyou +适于shiyu +誓愿shiyuan +十月shiyue +失约shiyue +实在shizai +实战shizhan +施展shizhan +市长shizhang +师长shizhang +使者shizhe +侍者shizhe +失真shizhen +市镇shizhen +市政shizheng +试制shizhi +实质shizhi +市制shizhi +食指shizhi +失职shizhi +适中shizhong +示众shizhong +始终shizhong +时装shizhuang +师资shizi +十足shizu +实足shizu +失足shizu +始祖shizu +手shou +受shou +收shou +首shou +守shou +熟*shou +授shou +寿shou +兽shou +售shou +瘦shou +狩shou +绶shou +艏shou +守备shoubei +手表shoubiao +收兵shoubing +收藏shoucang +手册shouce +首倡shouchang +寿辰shouchen +收成shoucheng +首创shouchuang +首次shouci +收存shoucun +寿诞shoudan +受到shoudao +守敌shoudi +首度shoudu +首都shoudu +手段shouduan +守法shoufa +首犯shoufan +收复shoufu +首府shoufu +手感shougan +手稿shougao +收割shouge +收购shougou +受害shouhai +守候shouhou +守护shouhu +收回shouhui +受贿shouhui +收获shouhuo +收集shouji +售价shoujia +受奖shoujiang +授奖shoujiang +手脚shoujiao +收缴shoujiao +首届shoujie +守旧shoujiu +收据shouju +授课shouke +受理shouli +收敛shoulian +首领shouling +收留shouliu +收录shoulu +收买shoumai +授命shouming +寿命shouming +首脑shounao +首批shoupi +授权shouquan +收容shourong +收入shouru +手软shouruan +瘦弱shouruo +首饰shoushi +手术shoushu +收缩shousuo +收条shoutiao +收听shouting +收尾shouwei +首尾shouwei +首先shouxian +首相shouxiang +瘦小shouxiao +收效shouxiao +手续shouxu +瘦削shouxue +收养shouyang +首要shouyao +受益shouyi +收益shouyi +兽医shouyi +受用shouyong +授予shouyu +守则shouze +首长shouzhang +收支shouzhi +生活上shs +上海市shs +数shu +书shu +树shu +属shu +术shu +输shu +述shu +熟shu +束shu +鼠shu +疏shu +殊shu +舒shu +蔬shu +薯shu +叔shu +署shu +枢shu +梳shu +抒shu +淑shu +赎shu +孰shu +暑shu +曙shu +蜀shu +黍shu +戍shu +竖shu +墅shu +庶shu +漱shu +恕shu +俞*shu +丨shu +倏shu +塾shu +菽shu +摅shu +沭shu +澍shu +姝shu +纾shu +毹shu +腧shu +殳shu +秫shu +刷shua +耍shua +唰shua +衰shuai +帅shuai +摔shuai +甩shuai +蟀shuai +衰败shuaibai +摔打shuaida +摔交shuaijiao +衰竭shuaijie +衰老shuailao +衰弱shuairuo +衰退shuaitui +衰亡shuaiwang +耍赖shualai +栓shuan +拴shuan +闩shuan +涮shuan +双shuang +霜shuang +爽shuang +泷*shuang +孀shuang +双边shuangbian +双方shuangfang +爽口shuangkou +爽快shuangkuai +爽朗shuanglang +双拼shuangpin +双重shuangzhong +耍弄shuanong +刷洗shuaxi +刷新shuaxin +书报shubao +书本shuben +蔬菜shucai +舒畅shuchang +输出shuchu +树丛shucong +疏导shudao +书店shudian +数额shue +抒发shufa +书法shufa +舒服shufu +束缚shufu +曙光shuguang +蜀汉shuhan +疏忽shuhu +倏忽shuhu +书画shuhua +水shui +说*shui +谁shui +睡shui +税shui +水稻shuidao +水电shuidian +水分shuifen +水果shuiguo +水火shuihuo +水晶shuijing +水库shuiku +水利shuili +水流shuiliu +睡眠shuimian +水平shuiping +税收shuishou +税务shuiwu +水下shuixia +水性shuixing +水源shuiyuan +水灾shuizai +谁知shuizhi +书记shuji +书籍shuji +暑假shujia +数据shuju +书刊shukan +数理shuli +树立shuli +竖立shuli +熟练shulian +数量shuliang +数列shulie +疏漏shulou +数落shuluo +数码shuma +书面shumian +庶民shumin +数目shumu +书目shumu +树木shumu +顺shun +吮shun +瞬shun +舜shun +顺便shunbian +顺差shuncha +顺次shunci +顺从shuncong +顺当shundang +顺道shundao +顺风shunfeng +枢纽shuniu +顺利shunli +顺路shunlu +瞬时shunshi +顺势shunshi +顺心shunxin +顺序shunxu +顺应shunying +顺着shunzhuo +说shuo +数*shuo +硕shuo +朔shuo +烁shuo +蒴shuo +搠shuo +妁shuo +槊shuo +铄shuo +说到shuodao +说道shuodao +说动shuodong +说法shuofa +说服shuofu +硕果shuoguo +说话shuohua +说教shuojiao +说明shuoming +说情shuoqing +硕士shuoshi +述评shuping +署期shuqi +暑期shuqi +抒情shuqing +熟人shuren +输入shuru +疏散shusan +属实shushi +熟识shushi +舒适shushi +束手shushou +叔叔shushu +数说shushuo +述说shushuo +输送shusong +疏松shusong +舒坦shutan +疏通shutong +熟悉shuxi +属相shuxiang +舒心shuxin +书信shuxin +属性shuxing +数学shuxue +属于shuyu +术语shuyu +疏远shuyuan +舒展shuzhan +数值shuzhi +树脂shuzhi +梳妆shuzhuang +数字shuzi +赎罪shuzui +售货员shy +社会主义shzy +四si +思si +死si +斯si +丝si +似si +司si +饲si +食*si +私si +厕*si +撕si +嘶si +肆si +寺si +嗣si +伺si +巳si +厮si +俟*si +兕si +厶si +咝si +汜si +泗si +澌si +姒si +驷si +缌si +祀si +锶si +鸶si +耜si +蛳si +笥si +死板siban +四边sibian +死别sibie +思潮sichao +丝绸sichou +四处sichu +四川sichuan +死党sidang +死敌sidi +司法sifa +四方sifang +四海sihai +丝毫sihao +嗣后sihou +似乎sihu +四化sihua +死缓sihuan +撕毁sihui +死活sihuo +四季siji +司机siji +私交sijiao +四届sijie +思考sikao +私利sili +私了siliao +司令siling +思路silu +四面simian +思念sinian +私念sinian +死去siqu +私人siren +死伤sishang +私事sishi +死尸sishi +死水sishui +思索sisuo +四体siti +私吞situn +死亡siwang +思维siwei +斯文siwen +私下sixia +思想sixiang +四项sixiang +死心sixin +私心sixin +肆行sixing +死刑sixing +私有siyou +私欲siyu +寺院siyuan +四月siyue +死者sizhe +四周sizhou +私自sizi +死罪sizui +拾金不昧sjbm +身经百战sjbz +书记处sjc +世界观sjg +舍己救人sjjr +数据库sjk +省军区sjq +杀鸡取蛋sjqd +实际上sjs +设计所sjs +试金石sjs +舍己为人sjwr +设计院sjy +随机应变sjyb +十进制sjz +石家庄sjz +适可而止skez +数理化slh +收录机slj +十六进制sljz +三令五申slws +司令员sly +四面八方smbf +手忙脚乱smjl +生命力sml +说明书sms +什么样smy +深谋远虑smyl +数目字smz +松song +送song +宋song +颂song +耸song +怂song +讼song +诵song +凇song +菘song +崧song +嵩song +忪song +悚song +淞song +竦song +松绑songbang +送别songbie +松弛songchi +松动songdong +颂歌songge +松劲songjin +松快songkuai +耸立songli +送礼songli +松散songsan +松涛songtao +松懈songxie +颂扬songyang +怂恿songyong +送葬songzang +送终songzhong +搜sou +艘sou +擞sou +嗽sou +叟sou +薮sou +嗖sou +嗾sou +馊sou +溲sou +飕sou +瞍sou +锼sou +螋sou +搜查soucha +搜集souji +搜索sousuo +搜寻souxun +售票处spc +食品工业spgy +水平线spx +生气勃勃sqbb +诗情画意sqhy +盛气凌人sqlr +山穷水尽sqsj +十全十美sqsm +首屈一指sqyz +四人帮srb +损人利己srlj +深入浅出srqc +似是而非ssef +时时刻刻sskk +姗姗来迟sslc +实事求是ssqs +事实上sss +随时随地sssd +善始善终sssz +顺水推舟sstz +四通公司stgs +四通集团stjt +身体力行stlx +生态平衡stph +素su +速su +苏su +塑su +缩su +俗su +诉su +宿su +肃su +酥su +粟su +僳su +溯su +夙su +谡su +蔌su +嗉su +愫su +涑su +簌su +觫su +稣su +算suan +酸suan +蒜suan +狻suan +酸楚suanchu +算法suanfa +算计suanji +算了suanle +算盘suanpan +算术suanshu +酸疼suanteng +酸痛suantong +素材sucai +速成sucheng +苏丹sudan +速度sudu +俗话suhua +随sui +穗sui +碎sui +虽sui +岁sui +尿*sui +隋sui +绥sui +髓sui +遂sui +隧sui +祟sui +谇sui +荽sui +濉sui +邃sui +燧sui +眭sui +睢sui +随笔suibi +随便suibian +随处suichu +随从suicong +随地suidi +随和suihe +随后suihou +随机suiji +随即suiji +虽然suiran +随身suishen +随时suishi +随手suishou +岁数suishu +虽说suishuo +随同suitong +随心suixin +随行suixing +随意suiyi +遂意suiyi +岁月suiyue +虽则suize +随着suizhe +诉苦suku +苏联sulian +塑料suliao +速率sulu +素描sumiao +肃穆sumu +损sun +孙sun +笋sun +荪sun +狲sun +飧sun +榫sun +隼sun +损害sunhai +损耗sunhao +损坏sunhuai +损伤sunshang +损失sunshi +孙子sunzi +所suo +缩suo +锁suo +索suo +莎*suo +蓑suo +梭suo +唆suo +琐suo +唢suo +嗦suo +嗍suo +娑suo +桫suo +挲*suo +睃suo +羧suo +所得suode +缩短suoduan +缩减suojian +锁链suolian +所能suoneng +索取suoqu +唆使suoshi +所属suoshu +琐碎suosui +所为suowei +所谓suowei +缩小suoxiao +缩写suoxie +琐屑suoxie +索性suoxing +所以suoyi +索引suoyin +缩影suoying +所有suoyou +所在suozai +所长suozhang +所至suozhi +梭子suozi +肃清suqing +苏区suqu +宿舍sushe +素数sushu +诉说sushuo +诉讼susong +速效suxiao +速写suxie +苏醒suxing +素养suyang +宿营suying +溯源suyuan +宿愿suyuan +夙愿suyuan +塑造suzao +速战suzhan +素质suzhi +苏州suzhou +苏维埃swa +税务局swj +手舞足蹈swzd +少先队sxd +身心健康sxjk +思想上sxs +山西省sxs +陕西省sxs +顺息万变sxwb +所向无敌sxwd +思想性sxx +商业部syb +说一不二sybe +收音机syj +使用价值syjz +所有权syq +沈阳市sys +实用性syx +十一月syy +所有制syz +私有制syz +时至今日szjr +三中全会szqh +始终如一szry +深圳四通szst +所作所为szsw +甚至于szy +他t +同t +它t +提t +题t +体t +图t +天t +头t +通t +条t +特t +土t +团t +统t +台t +她t +太t +套t +铁t +他ta +它ta +她ta +塔ta +踏ta +塌ta +獭ta +挞ta +蹋ta +拓*ta +嗒*ta +闼ta +溻ta +漯*ta +遢ta +榻ta +沓ta +铊ta +趿ta +鳎ta +踏步tabu +他的tade +它的tade +她的tade +塌方tafang +台tai +太tai +态tai +胎tai +抬tai +泰tai +苔tai +酞tai +汰tai +邰tai +薹tai +呔*tai +骀*tai +肽tai +炱tai +钛tai +跆tai +鲐tai +台北taibei +台词taici +态度taidu +台风taifeng +台阶taijie +太平taiping +泰然tairan +泰山taishan +态势taishi +太太taitai +抬头taitou +台湾taiwan +太阳taiyang +太原taiyuan +天安门tam +他们tamen +它们tamen +她们tamen +谈tan +碳tan +探tan +炭tan +弹*tan +坦tan +贪tan +滩tan +坍tan +摊tan +瘫tan +坛tan +檀tan +痰tan +潭tan +谭tan +毯tan +袒tan +叹tan +郯tan +澹tan +昙tan +忐tan +钽tan +锬tan +镡*tan +坦白tanbai +探测tance +探访tanfang +谈锋tanfeng +叹服tanfu +堂tang +糖tang +唐tang +塘tang +汤tang +搪tang +棠tang +膛tang +倘tang +躺tang +淌tang +趟tang +烫tang +傥tang +帑tang +溏tang +瑭tang +樘tang +铴tang +镗tang +耥tang +螗tang +螳tang +羰tang +醣tang +倘不tangbu +搪瓷tangci +弹弓tangong +倘若tangruo +搪塞tangsai +烫伤tangshang +堂堂tangtang +唐突tangtu +弹劾tanhe +袒护tanhu +谈话tanhua +瘫痪tanhuan +探究tanjiu +坦克tanke +贪婪tanlan +坦率tanlu +谈论tanlun +摊派tanpai +谈判tanpan +叹气tanqi +探亲tanqin +弹琴tanqin +坦然tanran +探索tansuo +探讨tantao +谈天tantian +探听tanting +贪图tantu +谈吐tantu +滩涂tantu +探望tanwang +探问tanwen +贪污tanwu +叹息tanxi +探险tanxian +谈心tanxin +弹性tanxing +探询tanxun +贪赃tanzang +套tao +讨tao +逃tao +陶tao +萄tao +桃tao +掏tao +涛tao +滔tao +绦tao +淘tao +鼗tao +叨*tao +啕tao +洮tao +韬tao +焘tao +饕tao +逃奔taoben +逃避taobi +逃兵taobing +逃窜taocuan +逃遁taodun +讨伐taofa +讨饭taofan +套购taogou +讨好taohao +讨还taohuan +讨价taojia +桃李taoli +韬略taolue +讨论taolun +逃命taoming +逃难taonan +逃跑taopao +淘气taoqi +逃生taosheng +淘汰taotai +滔滔taotao +逃脱taotuo +逃亡taowang +讨厌taoyan +陶冶taoye +桃子taozi +逃走taozou +陶醉taozui +踏青taqing +他人taren +踏实tashi +他说tashuo +他乡taxiang +挑拨离间tblj +台北市tbs +贪便宜tby +统筹兼顾tcjg +铁道部tdb +土地改革tdgg +同等学历tdxl +特te +忒te +忑te +慝*te +铽te +特别tebie +特产techan +特长techang +特出techu +特此teci +特大teda +特等tedeng +特地tedi +特点tedian +特定teding +特级teji +特技teji +特急teji +特将tejiang +特刊tekan +特快tekuai +特例teli +腾teng +疼teng +藤teng +誊teng +滕teng +疼爱tengai +腾达tengda +誊写tengxie +特派tepai +特区tequ +特权tequan +托儿所tes +特色tese +特使teshi +特殊teshu +特为tewei +特务tewu +特效texiao +特写texie +特性texing +特邀teyao +特意teyi +特有teyou +特约teyue +特征tezheng +特制tezhi +特种tezhong +突飞猛进tfmj +铁饭碗tfw +同甘共苦tggk +提货单thd +谈何容易thry +提ti +题ti +体ti +替ti +梯ti +惕ti +剔ti +踢ti +锑ti +蹄ti +啼ti +嚏ti +涕ti +剃ti +屉ti +倜ti +荑*ti +悌ti +逖ti +绨*ti +缇ti +鹈ti +裼ti +醍ti +天tian +田tian +添tian +填tian +甜tian +佃*tian +恬tian +舔tian +腆tian +掭tian +忝tian +阗tian +殄tian +畋tian +填报tianbao +天边tianbian +填表tianbiao +填补tianbu +天才tiancai +天长tianchang +填充tianchong +天地tiandi +田地tiandi +天鹅tiane +天府tianfu +天赋tianfu +天机tianji +天际tianji +添加tianjia +天津tianjin +恬静tianjing +天空tiankong +填空tiankong +天理tianli +天良tianliang +天亮tianliang +甜美tianmei +甜蜜tianmi +天明tianming +天平tianping +天气tianqi +天桥tianqiao +天然tianran +天壤tianrang +天色tianse +天上tianshang +天生tiansheng +天使tianshi +天堂tiantang +天体tianti +天天tiantian +甜头tiantou +天文tianwen +天下tianxia +天险tianxian +天仙tianxian +天性tianxing +天涯tianya +田野tianye +天真tianzhen +天职tianzhi +添置tianzhi +天资tianzi +条tiao +调*tiao +跳tiao +挑tiao +迢tiao +眺tiao +佻tiao +苕*tiao +祧tiao +窕tiao +蜩tiao +笤tiao +粜tiao +龆tiao +鲦tiao +髫tiao +挑拔tiaoba +跳动tiaodong +挑动tiaodong +挑逗tiaodou +跳高tiaogao +调和tiaohe +调剂tiaoji +条件tiaojian +调解tiaojie +调节tiaojie +条款tiaokuan +调理tiaoli +条理tiaoli +条例tiaoli +条令tiaoling +调配tiaopei +挑剔tiaoti +调停tiaoting +条文tiaowen +跳舞tiaowu +调戏tiaoxi +挑衅tiaoxin +挑选tiaoxuan +条约tiaoyue +挑战tiaozhan +调整tiaozheng +条子tiaozi +提拨tibo +题材ticai +体裁ticai +体操ticao +体察ticha +提倡tichang +提成ticheng +提出tichu +剔除tichu +题词tici +替代tidai +梯队tidui +铁tie +贴tie +帖tie +萜tie +餮tie +贴补tiebu +铁道tiedao +贴近tiejin +铁路tielu +贴切tieqie +贴身tieshen +铁证tiezheng +提法tifa +提防tifang +提纲tigang +提高tigao +体格tige +提供tigong +替换tihuan +体会tihui +提货tihuo +体积tiji +提价tijia +体力tili +体例tili +提炼tilian +体谅tiliang +体面timian +提名timing +题名timing +题目timu +听ting +停ting +庭ting +挺ting +廷ting +厅ting +烃ting +汀ting +亭ting +艇ting +莛ting +葶ting +婷ting +梃ting +町*ting +铤ting +蜓ting +霆ting +挺拔tingba +停办tingban +停泊tingbo +停产tingchan +听从tingcong +停顿tingdun +停工tinggong +挺括tinggua +听候tinghou +听话tinghua +停火tinghuo +听见tingjian +厅局tingju +听觉tingjue +停留tingliu +听凭tingping +听取tingqu +听任tingren +听说tingshuo +听信tingxin +厅长tingzhang +停止tingzhi +停职tingzhi +停滞tingzhi +听众tingzhong +提起tiqi +提前tiqian +提取tiqu +提升tisheng +提示tishi +体坛titan +体贴titie +提问tiwen +体温tiwen +体系tixi +体现tixian +体型tixing +提醒tixing +体验tiyan +提要tiyao +提议tiyi +体育tiyu +体制tizhi +体质tizhi +题字tizi +统计表tjb +条件反射tjfs +讨价还价tjhj +天津市tjs +条件下tjx +讨论会tlh +拖拉机tlj +他们的tmd +同盟会tmh +天南地北tndb +同tong +通tong +统tong +铜tong +痛tong +筒tong +童tong +桶tong +侗*tong +恫*tong +桐tong +酮tong +瞳tong +彤tong +捅tong +佟tong +仝tong +垌*tong +茼tong +嗵tong +峒*tong +恸tong +潼tong +砼tong +同伴tongban +同胞tongbao +通报tongbao +同辈tongbei +通病tongbing +同步tongbu +通常tongchang +通称tongcheng +统称tongcheng +痛斥tongchi +统筹tongchou +痛楚tongchu +同窗tongchuang +同道tongdao +通道tongdao +同等tongdeng +通电tongdian +通牒tongdie +通读tongdu +通告tonggao +统购tonggou +通过tongguo +通航tonghang +痛恨tonghen +同化tonghua +通话tonghua +童话tonghua +痛悔tonghui +通婚tonghun +统计tongji +通辑tongji +痛击tongji +同居tongju +痛苦tongku +痛哭tongku +痛快tongkuai +同僚tongliao +通令tongling +同盟tongmeng +同年tongnian +童年tongnian +同期tongqi +通气tongqi +同情tongqing +通融tongrong +同上tongshang +通商tongshang +同时tongshi +同事tongshi +统属tongshu +统帅tongshuai +通顺tongshun +通俗tongsu +通往tongwang +痛恶tongwu +痛惜tongxi +统辖tongxia +通向tongxiang +同乡tongxiang +统销tongxiao +通宵tongxiao +通晓tongxiao +同心tongxin +痛心tongxin +通信tongxin +同行tongxing +通行tongxing +同性tongxing +同学tongxue +通讯tongxun +同样tongyang +统一tongyi +同意tongyi +通用tongyong +通邮tongyou +统战tongzhan +同志tongzhi +统治tongzhi +通知tongzhi +头tou +投tou +透tou +偷tou +钭tou +骰tou +投案touan +头版touban +投奔touben +投标toubiao +投产touchan +透彻touche +头等toudeng +投放toufang +投机touji +投靠toukao +投篮toulan +偷懒toulan +头颅toulu +透露toulu +头面toumian +透明touming +头目toumu +头脑tounao +投票toupiao +透气touqi +投入touru +投身toushen +透视toushi +头痛toutong +偷闲touxian +投降touxiang +头绪touxu +投影touying +投掷touzhi +头子touzi +投资touzi +突破口tpk +太平洋tpy +通情达理tqdl +天气预报tqyb +突然袭击trxj +妥善处理tscl +通俗读物tsdw +挺身而出tsec +图书馆tsg +滔滔不绝ttbj +痛痛快快ttkk +团体赛tts +踏踏实实ttss +图tu +土tu +突tu +途tu +徒tu +凸tu +涂tu +吐tu +兔tu +屠tu +秃tu +堍tu +荼tu +菟tu +钍tu +酴tu +团tuan +湍tuan +抟tuan +彖tuan +疃tuan +图案tuan +湍急tuanji +团结tuanjie +团聚tuanju +湍流tuanliu +团体tuanti +团员tuanyuan +团圆tuanyuan +团长tuanzhang +突变tubian +图表tubiao +土产tuchan +突出tuchu +土地tudi +徒弟tudi +土匪tufei +土改tugai +涂改tugai +图画tuhua +土话tuhua +推tui +退tui +腿tui +颓tui +蜕tui +褪tui +忒*tui +煺tui +蜕变tuibian +退步tuibu +推测tuice +推迟tuichi +推崇tuichong +退出tuichu +推导tuidao +推动tuidong +推断tuiduan +推翻tuifan +颓废tuifei +推广tuiguang +退化tuihua +蜕化tuihua +退回tuihui +推荐tuijian +推进tuijin +推举tuiju +推开tuikai +推理tuili +推论tuilun +推敲tuiqiao +推却tuique +退却tuique +推让tuirang +退让tuirang +颓丧tuisang +退色tuise +推算tuisuan +退缩tuisuo +颓唐tuitang +推托tuituo +退伍tuiwu +推向tuixiang +推销tuixiao +推卸tuixie +推行tuixing +退休tuixiu +退学tuixue +推移tuiyi +退职tuizhi +突击tuji +图解tujie +途径tujing +徒劳tulao +图例tuli +吐露tulu +囤*tun +褪*tun +吞tun +屯tun +臀tun +氽tun +饨tun +暾tun +豚tun +吞并tunbing +吞没tunmo +吞吐tuntu +脱tuo +拖tuo +托tuo +妥tuo +椭tuo +舵*tuo +魄*tuo +鸵tuo +陀tuo +驮tuo +驼tuo +拓tuo +唾tuo +乇tuo +佗tuo +坨tuo +庹tuo +沱tuo +柝tuo +柁*tuo +橐tuo +砣tuo +铊*tuo +箨tuo +酡tuo +跎tuo +鼍tuo +驼背tuobei +拓补tuobu +脱出tuochu +妥当tuodang +脱轨tuogui +拓荒tuohuang +脱节tuojie +拖拉tuola +脱离tuoli +唾骂tuoma +唾弃tuoqi +妥善tuoshan +脱身tuoshen +妥协tuoxie +拖延tuoyan +唾液tuoye +图片tupian +突破tupo +突起tuqi +突然turan +徒然turan +土壤turang +屠杀tusha +徒手tushou +图书tushu +吐痰tutan +突围tuwei +突兀tuwu +图象tuxiang +图像tuxiang +图形tuxing +徒刑tuxing +图章tuzhang +图纸tuzhi +途中tuzhong +土著tuzhu +秃子tuzi +贪污盗窃twdq +台湾省tws +贪污受贿twsh +提心吊胆txdd +通讯社txs +同心同德txtd +同心协力txxl +推心置腹txzf +体育场tyc +体育锻炼tydl +体育馆tyg +腾云驾雾tyjw +太阳能tyn +太原市tys +天衣无缝tywf +通用性tyx +体育运动tyyd +团支部tzb +停滞不前tzbq +同志们tzm +天灾人祸tzrh +听之任之tzrz +通知书tzs +为w +我w +无w +问w +外w +五w +位w +物w +委w +完w +温w +万w +文w +往w +武w +务w +王w +围w +误w +晚w +瓦wa +挖wa +凹*wa +哇wa +蛙wa +洼wa +娃wa +袜wa +佤wa +娲wa +腽wa +外wai +歪wai +外币waibi +外边waibian +外表waibiao +外宾waibin +外部waibu +外传waichuan +外存waicun +外地waidi +外调waidiao +歪风waifeng +外观waiguan +外国waiguo +外行waihang +外汇waihui +外加waijia +外交waijiao +外界waijie +外景waijing +外科waike +外快waikuai +外流wailiu +外貌waimao +外贸waimao +外面waimian +外勤waiqin +歪曲waiqu +外商waishang +外伤waishang +外设waishe +外省waisheng +外甥waisheng +外事waishi +外围waiwei +外文waiwen +外线waixian +外销waixiao +歪斜waixie +外延waiyan +外因waiyin +外语waiyu +外援waiyuan +外在waizai +外债waizhai +外资waizi +瓦解wajie +挖掘wajue +挖苦waku +瓦砾wali +完wan +万wan +晚wan +弯wan +碗wan +顽wan +湾wan +挽wan +玩wan +蔓*wan +娩*wan +豌wan +丸wan +烷wan +皖wan +惋wan +宛wan +婉wan +腕wan +剜wan +芄wan +莞*wan +菀wan +纨wan +绾wan +琬wan +脘wan +畹wan +蜿wan +万般wanban +晚报wanbao +完备wanbei +完毕wanbi +完成wancheng +万代wandai +顽敌wandi +万吨wandun +万恶wane +万分wanfen +往wang +王wang +望wang +网wang +忘wang +妄wang +亡wang +旺wang +芒*wang +汪wang +枉wang +罔wang +尢wang +惘wang +辋wang +魍wang +往常wangchang +王朝wangchao +忘掉wangdiao +妄动wangdong +枉法wangfa +往返wangfan +枉费wangfei +往复wangfu +王国wangguo +亡国wangguo +往后wanghou +忘怀wanghuai +忘记wangji +旺季wangji +往来wanglai +网络wangluo +亡命wangming +往年wangnian +完工wangong +忘却wangque +枉然wangran +惘然wangran +往日wangri +旺盛wangsheng +往事wangshi +妄图wangtu +万古wangu +顽固wangu +往往wangwang +汪汪wangwang +忘我wangwo +往昔wangxi +妄想wangxiang +汪洋wangyang +望远wangyuan +王子wangzi +完好wanhao +晚会wanhui +挽回wanhui +晚婚wanhun +晚间wanjian +完结wanjie +挽救wanjiu +玩具wanju +顽抗wankang +完了wanle +挽力wanli +弯路wanlu +完美wanmei +万能wanneng +万年wannian +晚年wannian +玩弄wannong +晚期wanqi +顽强wanqiang +弯曲wanqu +完全wanquan +完善wanshan +晚上wanshang +玩赏wanshang +万事wanshi +万世wanshi +玩耍wanshua +万岁wansui +万万wanwan +万物wanwu +晚霞wanxia +万象wanxiang +玩笑wanxiao +万幸wanxing +婉言wanyan +万一wanyi +万元wanyuan +完整wanzheng +顽症wanzheng +万众wanzhong +宛转wanzhuan +瓦斯wasi +瓦特wate +娃娃wawa +外部设备wbsb +微不足道wbzd +无产阶级wcjj +微处理机wclj +无产者wcz +为wei +位wei +委wei +围wei +维wei +唯wei +卫wei +微wei +伟wei +未wei +威wei +危wei +尾wei +谓wei +喂wei +味wei +胃wei +魏wei +伪wei +遗*wei +违wei +韦wei +畏wei +纬wei +巍wei +桅wei +惟wei +潍wei +苇wei +萎wei +蔚wei +渭wei +尉wei +慰wei +偎wei +诿wei +隈wei +隗*wei +圩*wei +葳wei +薇wei +囗wei +帏wei +帷wei +崴wei +嵬wei +猥wei +猬wei +闱wei +沩wei +洧wei +涠wei +逶wei +娓wei +玮wei +韪wei +軎wei +炜wei +煨wei +痿wei +艉wei +鲔wei +尾巴weiba +违背weibei +未必weibi +威逼weibi +微波weibo +微薄weibo +未曾weiceng +未尝weichang +维持weichi +为此weici +伟大weida +味道weidao +纬度weidu +唯独weidu +巍峨weie +违法weifa +违反weifan +违犯weifan +威风weifeng +桅杆weigan +微观weiguan +危害weihai +为何weihe +维护weihu +危及weiji +微机weiji +危机weiji +危急weiji +围歼weijian +围剿weijiao +慰藉weijie +违禁weijin +未经weijing +畏惧weiju +违抗weikang +未可weike +唯恐weikong +惟恐weikong +胃口weikou +未来weilai +慰劳weilao +为了weile +威力weili +委靡weimi +未免weimian +微妙weimiao +帷幕weimu +危难weinan +畏难weinan +未能weineng +委派weipai +为期weiqi +畏怯weiqie +委曲weiqu +委屈weiqu +未然weiran +巍然weiran +围绕weirao +伟人weiren +委任weiren +微弱weiruo +威慑weishe +为生weisheng +卫生weisheng +尾声weisheng +卫士weishi +威势weishi +为首weishou +为数weishu +尾随weisui +未遂weisui +畏缩weisuo +萎缩weisuo +猥琐weisuo +委托weituo +委婉weiwan +危亡weiwang +巍巍weiwei +慰问weiwen +唯物weiwu +威武weiwu +微细weixi +威吓weixia +危险weixian +微小weixiao +微笑weixiao +威协weixie +威胁weixie +猥亵weixie +维新weixin +唯心weixin +违心weixin +威信weixin +微型weixing +卫星weixing +维修weixiu +威严weiyan +伟业weiye +唯一weiyi +位移weiyi +位于weiyu +谓语weiyu +委员weiyuan +为止weizhi +位置weizhi +未知weizhi +为重weizhong +为主weizhu +伪装weizhuang +问wen +温wen +文wen +稳wen +纹wen +闻wen +蚊wen +瘟wen +吻wen +紊wen +刎wen +阌wen +汶wen +璺wen +雯wen +文本wenben +瘟病wenbing +稳步wenbu +问答wenda +稳定wending +温度wendu +嗡weng +翁weng +瓮weng +蓊weng +蕹weng +稳固wengu +问好wenhao +温和wenhe +吻合wenhe +文化wenhua +文件wenjian +稳健wenjian +问津wenjin +文静wenjing +文具wenju +文科wenke +文盲wenmang +文明wenming +闻名wenming +温暖wennuan +文凭wenping +文人wenren +温柔wenrou +问世wenshi +文坛wentan +问题wenti +文体wenti +稳妥wentuo +文物wenwu +文献wenxian +文选wenxuan +文学wenxue +问讯wenxun +闻讯wenxun +文艺wenyi +瘟疫wenyi +文娱wenyu +文摘wenzhai +文章wenzhang +稳重wenzhong +文字wenzi +问罪wenzui +望而生畏wesw +闻风而动wfed +违法乱纪wflj +歪风邪气wfxq +温故知新wgzx +文化部whb +文汇报whb +文化馆whg +文化宫whg +武汉市whs +五湖四海whsh +忘乎所以whsy +问寒问暖whwn +文化娱乐whyl +玩忽职守whzs +外交部wjb +无纪律wjl +五讲四美wjsm +无拘无束wjws +无可奉告wkfg +无可非议wkfy +无可奈何wknh +乌鲁木齐wlmq +无理取闹wlqn +无论如何wlrh +物美价廉wmjl +误码率wml +文明礼貌wmlm +无名英雄wmyx +无能为力wnwl +我wo +握wo +窝wo +蜗wo +涡wo +沃wo +挝wo +卧wo +斡wo +倭wo +莴wo +喔wo +幄wo +渥wo +肟wo +硪wo +龌wo +窝藏wocang +卧床wochuang +我党wodang +卧倒wodao +我的wode +窝工wogong +我国woguo +我军wojun +我们women +窝囊wonang +我省wosheng +我校woxiao +为期不远wqby +无穷无尽wqwj +误入歧途wrqt +卫生部wsb +纹丝不动wsbd +万事大吉wsdj +万事俱备wsjb +为什么wsm +无所谓wsw +为所欲为wsyw +无所作为wszw +无wu +五wu +物wu +武wu +务wu +误wu +伍wu +舞wu +污wu +悟wu +雾wu +午wu +恶*wu +屋wu +乌wu +吴wu +亡*wu +诬wu +钨wu +巫wu +呜wu +芜wu +梧wu +吾wu +毋wu +捂wu +侮wu +坞wu +戊wu +晤wu +勿wu +兀wu +仵wu +阢wu +邬wu +圬wu +芴wu +唔wu +庑wu +怃wu +忤wu +浯wu +寤wu +迕wu +妩wu +婺wu +骛wu +杌wu +牾wu +於*wu +焐wu +鹉wu +鹜wu +痦wu +蜈wu +鋈wu +鼯wu +吾辈wubei +无比wubi +五笔wubi +务必wubi +舞弊wubi +无边wubian +无不wubu +五彩wucai +误差wucha +无常wuchang +无偿wuchang +舞场wuchang +武昌wuchang +无耻wuchi +无从wucong +武打wuda +舞蹈wudao +无敌wudi +舞动wudong +武斗wudou +武断wuduan +无法wufa +无妨wufang +无非wufei +武功wugong +污垢wugou +无故wugu +无关wuguan +五官wuguan +武官wuguan +无害wuhai +诬害wuhai +武汉wuhan +无何wuhe +乌黑wuhei +五湖wuhu +呜呼wuhu +误会wuhui +舞会wuhui +污秽wuhui +无及wuji +无机wuji +物价wujia +无间wujian +物件wujian +误解wujie +五届wujie +五金wujin +无愧wukui +无赖wulai +诬赖wulai +无理wuli +物理wuli +无礼wuli +物力wuli +武力wuli +无聊wuliao +无虑wulu +无论wulun +污蔑wumie +诬蔑wumie +无奈wunai +无能wuneng +毋宁wuning +务农wunong +物品wupin +无期wuqi +五七wuqi +武器wuqi +无情wuqing +无穷wuqiong +舞曲wuqu +无权wuquan +污染wuran +无任wuren +污辱wuru +侮辱wuru +物色wuse +无上wushang +误伤wushang +无声wusheng +午时wushi +务使wushi +无视wushi +误事wushi +务实wushi +无数wushu +武术wushu +无双wushuang +午睡wushui +五四wusi +无私wusi +舞台wutai +无题wuti +物体wuti +舞厅wuting +无为wuwei +无谓wuwei +无物wuwu +无暇wuxia +无限wuxian +诬陷wuxian +无效wuxiao +五星wuxing +午休wuxiu +无须wuxu +无需wuxu +务虚wuxu +午夜wuye +五一wuyi +无益wuyi +无疑wuyi +无垠wuyin +无用wuyong +毋庸wuyong +无余wuyu +无缘wuyuan +五月wuyue +物证wuzheng +无知wuzhi +物质wuzhi +武装wuzhuang +物资wuzi +兀自wuzi +误字wuzi +无罪wuzui +无微不至wwbz +唯物论wwl +卧薪尝胆wxcd +无线电wxd +微型机wxj +唯心论wxl +问心无愧wxwk +委员会wyh +无缘无故wywg +委员长wyz +误字率wzl +无足轻重wzqz +未知数wzs +完整无缺wzwq +学x +下x +行x +小x +线x +性x +新x +些x +想x +心x +向x +相x +系x +席x +现x +西x +修x +象x +先x +形x +心安理得xald +西安市xas +西半球xbq +相比之下xbzx +宣传部xcb +新陈代谢xcdx +新产品xcp +畜产品xcp +西城区xcq +喜出望外xcww +相对而言xdey +现代化xdh +想当然xdr +相对误差xdwc +先睹为快xdwk +形而上学xesx +显而易见xeyj +西方国家xfgj +消费品xfp +想方设法xfsf +先发制人xfzr +兴高采烈xgcl +新华社xhs +新华书店xhsd +系xi +席xi +西xi +习xi +细xi +吸xi +析xi +喜xi +洗xi +铣xi +稀xi +戏xi +隙xi +希xi +息xi +袭xi +锡xi +烯xi +牺xi +悉xi +惜xi +溪xi +腊*xi +栖*xi +昔xi +熙xi +硒xi +矽xi +晰xi +嘻xi +膝xi +夕xi +熄xi +汐xi +犀xi +檄xi +媳xi +僖xi +兮xi +隰xi +郗xi +茜*xi +菥xi +葸xi +蓰xi +奚xi +唏xi +徙xi +饩xi +阋xi +浠xi +淅xi +屣xi +嬉xi +玺xi +樨xi +曦xi +觋xi +欷xi +歙*xi +熹xi +禊xi +禧xi +皙xi +穸xi +裼*xi +蜥xi +螅xi +蟋xi +舄xi +舾xi +羲xi +粞xi +翕xi +醯xi +蹊*xi +鼷xi +下xia +夏xia +吓xia +狭xia +霞xia +唬*xia +瞎xia +虾xia +匣xia +辖xia +暇xia +峡xia +侠xia +厦xia +呷xia +狎xia +遐xia +瑕xia +柙xia +硖xia +瘕*xia +罅xia +黠xia +狭隘xiaai +下班xiaban +下辈xiabei +下边xiabian +下策xiace +下层xiaceng +下场xiachang +下沉xiachen +下次xiaci +瑕疵xiaci +下达xiada +吓倒xiadao +下等xiadeng +下毒xiadu +下发xiafa +下放xiafang +峡谷xiagu +霞光xiaguang +瞎话xiahua +喜爱xiai +下级xiaji +下集xiaji +夏季xiaji +下降xiajiang +侠客xiake +下来xialai +下联xialian +夏粮xialiang +下列xialie +下令xialing +下流xialiu +下落xialuo +下马xiama +厦门xiamen +下面xiamian +线xian +现xian +先xian +县xian +限xian +见*xian +显xian +鲜xian +献xian +险xian +陷xian +宪xian +纤xian +洗*xian +掀xian +弦xian +铣*xian +腺xian +锨xian +仙xian +咸xian +贤xian +衔xian +舷xian +闲xian +涎xian +嫌xian +馅xian +羡xian +冼xian +苋xian +莶xian +藓xian +岘xian +猃xian +暹xian +娴xian +氙xian +燹xian +祆xian +鹇xian +痫xian +蚬xian +筅xian +籼xian +酰xian +跣xian +跹xian +霰xian +西安xian +献宝xianbao +先辈xianbei +现场xianchang +现成xiancheng +县城xiancheng +献丑xianchou +献词xianci +现存xiancun +现代xiandai +先导xiandao +显得xiande +险地xiandi +限定xianding +限度xiandu +线段xianduan +限额xiane +险恶xiane +宪法xianfa +先锋xianfeng +险峰xianfeng +想xiang +向xiang +相xiang +象xiang +响xiang +项xiang +箱xiang +乡xiang +降*xiang +香xiang +像xiang +详xiang +橡xiang +享xiang +湘xiang +厢xiang +镶xiang +襄xiang +翔xiang +祥xiang +巷xiang +芗xiang +葙xiang +饷xiang +庠xiang +骧xiang +缃xiang +蟓xiang +鲞xiang +飨xiang +相爱xiangai +相比xiangbi +想必xiangbi +相差xiangcha +相称xiangcheng +相处xiangchu +相传xiangchuan +乡村xiangcun +相当xiangdang +向导xiangdao +相等xiangdeng +相对xiangdui +想法xiangfa +相反xiangfan +相仿xiangfang +相干xianggan +香港xianggang +相隔xiangge +相关xiangguan +相好xianghao +相互xianghu +相继xiangji +相加xiangjia +相见xiangjian +相减xiangjian +相交xiangjiao +橡胶xiangjiao +相近xiangjin +详尽xiangjin +巷口xiangkou +向来xianglai +相连xianglian +向量xiangliang +响亮xiangliang +相貌xiangmao +项目xiangmu +想念xiangnian +相片xiangpian +想起xiangqi +详情xiangqing +向上xiangshang +相声xiangsheng +响声xiangsheng +相识xiangshi +翔实xiangshi +享受xiangshou +相思xiangsi +相似xiangsi +香甜xiangtian +相同xiangtong +相投xiangtou +显贵xiangui +向往xiangwang +详细xiangxi +向下xiangxia +乡下xiangxia +象限xiangxian +想象xiangxiang +相信xiangxin +香烟xiangyan +相依xiangyi +相宜xiangyi +相应xiangying +相映xiangying +响应xiangying +享用xiangyong +相遇xiangyu +相约xiangyue +乡镇xiangzhen +象征xiangzheng +箱子xiangzi +陷害xianhai +显赫xianhe +鲜红xianhong +先后xianhou +鲜花xianhua +献花xianhua +闲话xianhua +贤惠xianhui +献计xianji +献技xianji +显见xianjian +衔接xianjie +先进xianjin +现金xianjin +险境xianjing +陷阱xianjing +现款xiankuan +现况xiankuang +先例xianli +献礼xianli +先烈xianlie +线路xianlu +显露xianlu +鲜美xianmei +鲜明xianming +贤明xianming +显目xianmu +羡慕xianmu +贤能xianneng +先期xianqi +掀起xianqi +限期xianqi +嫌弃xianqi +先前xianqian +先遣xianqian +险情xianqing +先驱xianqu +显然xianran +贤人xianren +闲人xianren +现任xianren +陷入xianru +闲散xiansan +献身xianshen +先生xiansheng +先是xianshi +现实xianshi +显示xianshi +娴熟xianshu +线索xiansuo +闲谈xiantan +险滩xiantan +先天xiantian +线条xiantiao +县委xianwei +纤维xianwei +显现xianxian +现象xianxiang +现行xianxing +鲜血xianxue +显眼xianyan +鲜艳xianyan +显要xianyao +险要xianyao +显耀xianyao +现役xianyi +嫌疑xianyi +现有xianyou +限于xianyu +闲杂xianza +现在xianzai +县长xianzhang +宪章xianzhang +限制xianzhi +先知xianzhi +闲置xianzhi +闲职xianzhi +显著xianzhu +现状xianzhuang +险阻xianzu +小xiao +消xiao +削xiao +效xiao +笑xiao +校xiao +销xiao +硝xiao +萧xiao +肖xiao +孝xiao +霄xiao +哮xiao +嚣xiao +宵xiao +淆xiao +晓xiao +啸xiao +哓xiao +崤xiao +潇xiao +逍xiao +骁xiao +绡xiao +枭xiao +枵xiao +蛸*xiao +筱xiao +箫xiao +魈xiao +小报xiaobao +小辈xiaobei +笑柄xiaobing +消沉xiaochen +消除xiaochu +消毒xiaodu +效法xiaofa +小贩xiaofan +消防xiaofang +消费xiaofei +校风xiaofeng +小鬼xiaogui +效果xiaoguo +小孩xiaohai +消耗xiaohao +消化xiaohua +笑话xiaohua +小惠xiaohui +销毁xiaohui +销魂xiaohun +消极xiaoji +削减xiaojian +小结xiaojie +小姐xiaojie +孝敬xiaojing +校刊xiaokan +小康xiaokang +效劳xiaolao +效力xiaoli +销路xiaolu +效率xiaolu +消灭xiaomie +消磨xiaomo +效能xiaoneng +消气xiaoqi +消遣xiaoqian +笑容xiaorong +削弱xiaoruo +潇洒xiaosa +校舍xiaoshe +小时xiaoshi +消失xiaoshi +消逝xiaoshi +消瘦xiaoshou +销售xiaoshou +小数xiaoshu +小说xiaoshuo +萧条xiaotiao +消息xiaoxi +肖像xiaoxiang +小心xiaoxin +枭雄xiaoxiong +小学xiaoxue +效验xiaoyan +逍遥xiaoyao +效益xiaoyi +效应xiaoying +校友xiaoyou +小于xiaoyu +校园xiaoyuan +销赃xiaozang +校长xiaozhang +嚣张xiaozhang +效忠xiaozhong +小组xiaozu +下情xiaqing +下去xiaqu +辖区xiaqu +下手xiashou +夏收xiashou +下属xiashu +下水xiashui +下台xiatai +夏天xiatian +下文xiawen +下午xiawu +下限xiaxian +下乡xiaxiang +遐想xiaxiang +狭义xiayi +下游xiayou +狭窄xiazhai +夏至xiazhi +夏种xiazhong +喜报xibao +细胞xibao +西北xibei +西边xibian +稀薄xibo +锡箔xibo +西餐xican +洗涤xidi +吸毒xidu +些xie +解*xie +写xie +斜xie +谢xie +协xie +械xie +叶*xie +血*xie +卸xie +屑xie +鞋xie +歇xie +邪xie +胁xie +蟹xie +泄xie +泻xie +契*xie +楔xie +蝎xie +挟xie +携xie +谐xie +懈xie +偕xie +亵xie +勰xie +燮xie +薤xie +撷xie +獬xie +廨xie +渫xie +瀣xie +邂xie +绁xie +缬xie +榭xie +榍xie +颉*xie +躞xie +写出xiechu +协从xiecong +携带xiedai +邪道xiedao +协调xiediao +协定xieding +亵渎xiedu +邪恶xiee +协和xiehe +谐和xiehe +协会xiehui +谢绝xiejue +协力xieli +泄漏xielou +邪路xielu +泄露xielu +泄密xiemi +邪念xienian +胁迫xiepo +邪气xieqi +协商xieshang +写生xiesheng +携手xieshou +邪说xieshuo +协同xietong +歇息xiexi +谢谢xiexie +协议xieyi +谐音xieyin +协约xieyue +写照xiezhao +协助xiezhu +鞋子xiezi +写作xiezuo +协作xiezuo +西方xifang +西风xifeng +西服xifu +吸附xifu +媳妇xifu +习惯xiguan +西汉xihan +稀罕xihan +希罕xihan +喜欢xihuan +袭击xiji +细节xijie +洗劫xijie +喜剧xiju +戏剧xiju +席卷xijuan +细菌xijun +犀利xili +系列xilie +奚落xiluo +熄灭ximie +新xin +心xin +信xin +锌xin +芯xin +辛xin +寻*xin +欣xin +薪xin +忻xin +衅xin +囟xin +馨xin +昕xin +歆xin +镡*xin +鑫xin +心爱xinai +西南xinan +新春xinchun +信贷xindai +心得xinde +心烦xinfan +心服xinfu +信服xinfu +行xing +性xing +形xing +型xing +星xing +兴xing +省*xing +醒xing +姓xing +幸xing +腥xing +猩xing +惺xing +刑xing +邢xing +杏xing +陉xing +荇xing +荥xing +擤xing +饧xing +悻xing +硎xing +心甘xingan +兴办xingban +性别xingbie +姓别xingbie +刑场xingchang +星辰xingchen +形成xingcheng +行程xingcheng +行动xingdong +幸而xinger +刑法xingfa +刑罚xingfa +兴奋xingfen +幸福xingfu +性格xingge +幸好xinghao +型号xinghao +行贿xinghui +星火xinghuo +性急xingji +形迹xingji +兴建xingjian +行径xingjing +行军xingjun +星空xingkong +幸亏xingkui +行李xingli +行旅xinglu +幸免xingmian +性命xingming +姓名xingming +醒目xingmu +性能xingneng +行期xingqi +兴起xingqi +星期xingqi +性情xingqing +星球xingqiu +兴趣xingqu +形容xingrong +行商xingshang +兴盛xingsheng +行使xingshi +行事xingshi +行驶xingshi +形式xingshi +幸事xingshi +刑事xingshi +形势xingshi +姓氏xingshi +行署xingshu +兴衰xingshuai +形态xingtai +形体xingti +兴亡xingwang +兴旺xingwang +行为xingwei +行文xingwen +醒悟xingwu +形象xingxiang +行销xingxiao +星星xingxing +行凶xingxiong +兴修xingxiu +行业xingye +星夜xingye +幸运xingyun +行政xingzheng +性质xingzhi +兴致xingzhi +形状xingzhuang +行走xingzou +信号xinhao +心狠xinhen +心慌xinhuang +信汇xinhui +细腻xini +西宁xining +心急xinji +信件xinjian +新疆xinjiang +新近xinjin +新居xinju +心坎xinkan +辛苦xinku +信赖xinlai +辛劳xinlao +心理xinli +心里xinli +心灵xinling +心目xinmu +信念xinnian +戏弄xinong +新奇xinqi +辛勤xinqin +心情xinqing +新区xinqu +新人xinren +信任xinren +欣赏xinshang +新生xinsheng +心声xinsheng +新事xinshi +新式xinshi +新书xinshu +薪水xinshui +心酸xinsuan +辛酸xinsuan +心疼xinteng +心田xintian +心跳xintiao +心头xintou +欣慰xinwei +新闻xinwen +心细xinxi +信息xinxi +欣喜xinxi +新鲜xinxian +心想xinxiang +信箱xinxiang +馨香xinxiang +信心xinxin +新型xinxing +新星xinxing +新兴xinxing +心虚xinxu +心血xinxue +信仰xinyang +心意xinyi +新异xinyi +新颖xinying +信用xinyong +新余xinyu +信誉xinyu +心愿xinyuan +心脏xinzang +新址xinzhi +心中xinzhong +雄xiong +胸xiong +兄xiong +凶xiong +熊xiong +匈xiong +汹xiong +芎xiong +雄辩xiongbian +雄兵xiongbing +凶残xiongcan +兄弟xiongdi +凶恶xionge +雄关xiongguan +凶狠xionghen +雄厚xionghou +胸怀xionghuai +雄健xiongjian +胸口xiongkou +熊猫xiongmao +凶猛xiongmeng +匈奴xiongnu +凶器xiongqi +凶杀xiongsha +雄师xiongshi +凶手xiongshou +胸膛xiongtang +雄伟xiongwei +雄心xiongxin +汹涌xiongyong +雄壮xiongzhuang +雄姿xiongzi +西欧xiou +习气xiqi +吸气xiqi +喜气xiqi +稀奇xiqi +希奇xiqi +喜庆xiqing +吸取xiqu +戏曲xiqu +昔日xiri +牺牲xisheng +西式xishi +喜事xishi +稀释xishi +吸收xishou +系数xishu +洗刷xishua +吸吮xishun +习俗xisu +习题xiti +西天xitian +系统xitong +修xiu +锈xiu +休xiu +袖xiu +秀xiu +朽xiu +宿*xiu +臭*xiu +羞xiu +嗅xiu +绣xiu +咻xiu +岫xiu +馐xiu +庥xiu +溴xiu +鸺xiu +貅xiu +髹xiu +修补xiubu +秀才xiucai +羞耻xiuchi +修辞xiuci +修订xiuding +修复xiufu +修改xiugai +修建xiujian +修剪xiujian +嗅觉xiujue +休克xiuke +羞愧xiukui +修理xiuli +秀丽xiuli +秀气xiuqi +羞辱xiuru +羞涩xiuse +修饰xiushi +休息xiuxi +休想xiuxiang +修养xiuyang +休养xiuyang +修造xiuzao +袖章xiuzhang +袖珍xiuzhen +修正xiuzheng +修筑xiuzhu +希望xiwang +席位xiwei +细微xiwei +西文xiwen +檄文xiwen +细小xixiao +细心xixin +悉心xixin +喜讯xixun +吸烟xiyan +西洋xiyang +西医xiyi +吸引xiyin +希有xiyou +戏院xiyuan +喜悦xiyue +西藏xizang +洗澡xizao +细则xize +细致xizhi +习作xizuo +下基层xjc +现阶段xjd +新技术xjs +献计献策xjxc +先见之明xjzm +兴利除弊xlcb +系列化xlh +稀里糊涂xlht +狭路相逢xlxf +畜牧业xmy +心满意足xmyz +西宁市xns +小朋友xpy +向前看xqk +喜气洋洋xqyy +先人后己xrhj +兴师动众xsdz +销售额xse +刑事犯罪xsfz +小时候xsh +新时期xsq +新生事物xssw +形式主义xszy +相提并论xtbl +续xu +许xu +须xu +需xu +序xu +虚xu +絮xu +畜xu +叙xu +蓄xu +绪xu +徐xu +墟xu +戌xu +嘘xu +酗xu +旭xu +恤xu +婿xu +吁*xu +诩xu +勖xu +圩xu +蓿xu +洫xu +浒*xu +溆xu +顼xu +栩xu +煦xu +砉*xu +盱xu +胥xu +糈xu +醑xu +选xuan +旋xuan +宣xuan +悬xuan +玄xuan +券*xuan +轩xuan +喧xuan +癣xuan +眩xuan +绚xuan +儇xuan +谖xuan +萱xuan +揎xuan +泫xuan +渲xuan +漩xuan +璇xuan +楦xuan +暄xuan +炫xuan +煊xuan +碹xuan +铉xuan +镟xuan +痃xuan +悬案xuanan +轩昂xuanang +选拔xuanba +宣布xuanbu +选材xuancai +选场xuanchang +宣称xuancheng +宣传xuanchuan +选定xuanding +宣读xuandu +宣告xuangao +选购xuangou +悬挂xuangua +玄乎xuanhu +喧哗xuanhua +选集xuanji +宣讲xuanjiang +选举xuanju +绚烂xuanlan +绚丽xuanli +选录xuanlu +旋律xuanlu +选民xuanmin +喧闹xuannao +悬念xuannian +选派xuanpai +宣判xuanpan +选配xuanpei +选票xuanpiao +选区xuanqu +选取xuanqu +喧嚷xuanrang +宣誓xuanshi +选手xuanshou +悬殊xuanshu +旋涡xuanwo +玄虚xuanxu +悬崖xuanya +宣言xuanyan +宣扬xuanyang +炫耀xuanyao +选用xuanyong +选择xuanze +宣战xuanzhan +选种xuanzhong +旋转xuanzhuan +许多xuduo +学xue +血xue +削*xue +雪xue +穴xue +靴xue +薛xue +谑xue +噱*xue +泶xue +踅xue +鳕xue +学报xuebao +学部xuebu +学潮xuechao +学费xuefei +学风xuefeng +学府xuefu +血汗xuehan +学好xuehao +学会xuehui +学籍xueji +血迹xueji +学科xueke +血泪xuelei +学历xueli +学龄xueling +学年xuenian +学派xuepai +学期xueqi +血肉xuerou +学生xuesheng +学时xueshi +学识xueshi +学士xueshi +学术xueshu +血书xueshu +学说xueshuo +血统xuetong +学徒xuetu +学位xuewei +学问xuewen +学习xuexi +血洗xuexi +学校xuexiao +血压xueya +学业xueye +血液xueye +学友xueyou +学员xueyuan +学院xueyuan +血晕xueyun +血战xuezhan +学者xuezhe +学制xuezhi +虚构xugou +序号xuhao +蓄积xuji +虚假xujia +叙旧xujiu +许可xuke +序列xulie +绪论xulun +虚名xuming +序幕xumu +畜牧xumu +训xun +旬xun +迅xun +讯xun +寻xun +循xun +巡xun +荤*xun +浚*xun +勋xun +熏xun +询xun +驯xun +殉xun +汛xun +逊xun +巽xun +郇*xun +埙xun +荀xun +蕈xun +薰xun +峋xun +徇xun +獯xun +恂xun +洵xun +浔xun +曛xun +窨*xun +醺xun +鲟xun +巡捕xunbu +巡查xuncha +寻常xunchang +驯服xunfu +殉国xunguo +巡航xunhang +循环xunhuan +巡回xunhui +虚拟xuni +寻机xunji +巡警xunjing +勋爵xunjue +训练xunlian +巡逻xunluo +迅猛xunmeng +寻求xunqiu +逊色xunse +巡视xunshi +徇私xunsi +迅速xunsu +熏陶xuntao +许诺xunuo +讯问xunwen +询问xunwen +寻衅xunxin +循序xunxu +勋章xunzhang +寻找xunzhao +殉职xunzhi +寻址xunzhi +需求xuqiu +序曲xuqu +虚荣xurong +虚弱xuruo +虚设xushe +叙事xushi +虚实xushi +序数xushu +虚数xushu +叙述xushu +叙说xushuo +虚伪xuwei +虚心xuxin +序言xuyan +需要xuyao +须臾xuyu +许愿xuyuan +须知xuzhi +宣武区xwq +信息处理xxcl +循序见进xxjj +辛辛苦苦xxkk +信息量xxl +熙熙攘攘xxrr +小学生xxs +欣欣向荣xxxr +小心翼翼xxyy +下一步xyb +胸有成竹xycz +洗衣机xyj +小意思xys +习以为常xywc +新颖性xyx +兴致勃勃xzbb +新中国xzg +行政区域xzqy +雪中送炭xzst +心中无数xzws +选择性xzx +心中有数xzys +行之有效xzyx +一y +有y +用y +要y +以y +于y +也y +样y +义y +与y +由y +压y +员y +月y +意y +又y +运y +原y +油y +验y +压ya +亚ya +呀ya +牙ya +芽ya +雅ya +蚜ya +鸭ya +匹*ya +押ya +鸦ya +丫ya +崖ya +衙ya +涯ya +哑ya +讶ya +伢ya +垭ya +揠ya +岈ya +迓ya +娅ya +琊ya +桠ya +氩ya +砑ya +睚ya +痖ya +哑巴yaba +牙齿yachi +压倒yadao +压服yafu +牙关yaguan +雅观yaguan +压价yajia +押金yajin +亚军yajun +压力yali +验yan +研yan +严yan +眼yan +言yan +盐yan +演yan +岩yan +沿yan +烟yan +延yan +掩yan +宴yan +炎yan +颜yan +燕yan +衍yan +铅*yan +焉yan +咽yan +阉yan +淹yan +蜒yan +阎yan +奄yan +艳yan +堰yan +厌yan +砚yan +雁yan +唁yan +彦yan +焰yan +谚yan +殷*yan +厣yan +赝yan +剡*yan +俨yan +偃yan +兖yan +谳yan +阽*yan +郾yan +鄢yan +芫*yan +菸yan +崦yan +恹yan +闫yan +阏yan +湮yan +滟yan +妍yan +嫣yan +琰yan +檐yan +晏yan +胭yan +腌*yan +焱yan +罨yan +筵yan +酽yan +魇yan +餍yan +鼹yan +沿岸yanan +严办yanban +掩蔽yanbi +演变yanbian +烟草yancao +延长yanchang +演唱yanchang +严惩yancheng +延迟yanchi +演出yanchu +唁电yandian +严冬yandong +厌恶yane +厌烦yanfan +样yang +养yang +氧yang +扬yang +洋yang +阳yang +羊yang +秧yang +央yang +杨yang +仰yang +殃yang +鸯yang +佯yang +疡yang +痒yang +漾yang +徉yang +怏yang +泱yang +炀yang +烊yang +恙yang +蛘yang +鞅yang +掩盖yangai +样板yangban +样本yangben +洋财yangcai +养成yangcheng +沿革yange +严格yange +阳光yangguang +洋行yanghang +养护yanghu +氧化yanghua +养料yangliao +杨柳yangliu +仰面yangmian +殃民yangmin +仰慕yangmu +样品yangpin +洋气yangqi +扬弃yangqi +央求yangqiu +养伤yangshang +样式yangshi +阳台yangtai +眼光yanguang +仰望yangwang +洋务yangwu +洋相yangxiang +扬言yangyan +样样yangyang +洋溢yangyi +养育yangyu +养殖yangzhi +样子yangzi +沿海yanhai +严寒yanhan +眼红yanhong +咽喉yanhou +掩护yanhu +眼花yanhua +延缓yanhuan +宴会yanhui +焰火yanhuo +演讲yanjiang +眼界yanjie +严禁yanjin +严谨yanjin +眼镜yanjing +眼睛yanjing +研究yanjiu +严峻yanjun +眼看yankan +严酷yanku +眼眶yankuang +眼泪yanlei +眼力yanli +严厉yanli +艳丽yanli +眼帘yanlian +眼亮yanliang +言路yanlu +沿路yanlu +言论yanlun +掩埋yanmai +严密yanmi +严明yanming +烟幕yanmu +延年yannian +延期yanqi +眼前yanqian +宴请yanqing +俨然yanran +炎热yanre +眼色yanse +颜色yanse +延伸yanshen +岩石yanshi +演示yanshi +掩饰yanshi +验收yanshou +严守yanshou +延寿yanshou +演说yanshuo +严肃yansu +演算yansuan +言谈yantan +研讨yantao +沿途yantu +阎王yanwang +延误yanwu +烟雾yanwu +宴席yanxi +筵席yanxi +演习yanxi +沿袭yanxi +眼下yanxia +沿线yanxian +言行yanxing +严刑yanxing +延续yanxu +艳阳yanyang +演义yanyi +演绎yanyi +掩映yanying +沿用yanyong +言语yanyu +演员yanyuan +厌战yanzhan +沿着yanzhe +验证yanzheng +研制yanzhi +严重yanzhong +演奏yanzou +要yao +药yao +约*yao +摇yao +腰yao +咬yao +邀yao +耀yao +陶*yao +侥*yao +疟yao +妖yao +瑶yao +尧yao +遥yao +窑yao +谣yao +姚yao +舀yao +钥*yao +夭yao +爻yao +吆yao +崾yao +徭yao +幺yao +珧yao +杳yao +轺yao +曜yao +肴yao +铫*yao +鹞yao +窈yao +繇yao +鳐yao +摇摆yaobai +腰包yaobao +要不yaobu +谣传yaochuan +要得yaode +要点yaodian +摇动yaodong +窑洞yaodong +遥感yaogan +妖怪yaoguai +要害yaohai +摇撼yaohan +摇晃yaohuang +要件yaojian +要紧yaojin +摇控yaokong +遥控yaokong +摇篮yaolan +要领yaoling +要么yaome +妖魔yaomo +要目yaomu +邀请yaoqing +要求yaoqiu +要塞yaosai +要是yaoshi +钥匙yaoshi +要素yaosu +窈窕yaotiao +摇头yaotou +要闻yaowen +药物yaowu +要挟yaoxie +耀眼yaoyan +谣言yaoyan +妖艳yaoyan +夭折yaozhe +要职yaozhi +鸦片yapian +压迫yapo +压强yaqiang +压缩yasuo +雅兴yaxing +压仰yayang +压抑yayi +压榨yazha +压制yazhi +雅致yazhi +亚洲yazhou +鸭子yazi +雅座yazuo +要不得ybd +一般的说ybds +一部分ybf +要不然ybr +要不是ybs +一般说来ybsl +要不要yby +一辈子ybz +一把抓ybz +用不着ybz +扬长避短ycbd +由此可见yckj +银川市ycs +与此同时ycts +有偿转让yczr +邮电部ydb +有道德ydd +邮电局ydj +一刀切ydq +运动员ydy +印度洋ydy +因地制宜ydzy +也ye +业ye +页ye +叶ye +液ye +夜ye +野ye +爷ye +冶ye +邪*ye +哗*ye +咽*ye +椰ye +噎ye +耶ye +掖ye +曳ye +腋ye +拽*ye +靥ye +谒ye +邺ye +揶ye +晔ye +烨ye +铘ye +夜餐yecan +野餐yecan +野火yehuo +业绩yeji +夜间yejian +冶金yejin +夜里yeli +冶练yelian +野蛮yeman +夜幕yemu +夜色yese +也是yeshi +夜市yeshi +野兽yeshou +液体yeti +野外yewai +夜晚yewan +业务yewu +夜校yexiao +野心yexin +野性yexing +也许yexu +幼儿园yey +爷爷yeye +野营yeying +业余yeyu +野战yezhan +叶子yezi +一方面yfm +一分为二yfwe +阳奉阴违yfyw +一概而论ygel +一国两制yglz +有根有据ygyj +严格要求ygyq +有何特长yhtc +银行帐号yhzh +炎黄子孙yhzs +一yi +以yi +义yi +意yi +已yi +移yi +医yi +议yi +依yi +易yi +乙yi +艺yi +益yi +异yi +宜yi +仪yi +亿yi +遗yi +伊yi +役yi +衣yi +疑yi +亦yi +谊yi +翼yi +译yi +抑yi +忆yi +疫yi +壹yi +揖yi +铱yi +颐yi +夷yi +胰yi +沂yi +姨yi +彝yi +椅yi +蚁yi +倚yi +矣yi +邑yi +屹yi +臆yi +逸yi +肄yi +裔yi +毅yi +溢yi +诣yi +翌yi +绎yi +刈yi +劓yi +仡*yi +佚yi +佾yi +诒yi +圯yi +埸yi +懿yi +苡yi +荑yi +薏yi +弈yi +奕yi +挹yi +弋yi +呓yi +咦yi +咿yi +嗌*yi +噫yi +峄yi +嶷yi +猗yi +饴yi +怿yi +怡yi +悒yi +漪yi +迤yi +驿yi +缢yi +殪yi +轶yi +贻yi +欹*yi +旖yi +熠yi +眙yi +钇yi +镒yi +镱yi +痍yi +瘗yi +癔yi +翊yi +蜴yi +舣yi +羿yi +翳yi +酏yi +黟yi +议案yian +疑案yian +一半yiban +一般yiban +一斑yiban +一边yibian +以便yibian +仪表yibiao +一并yibing +异步yibu +遗产yichan +异常yichang +议程yicheng +益处yichu +遗传yichuan +一次yici +依次yici +依从yicong +一代yidai +一带yidai +一旦yidan +一点yidian +一定yiding +议定yiding +移动yidong +一度yidu +遗毒yidu +一端yiduan +臆断yiduan +亿吨yidun +一发yifa +依法yifa +义愤yifen +衣服yifu +依附yifu +一概yigai +一个yige +一共yigong +议购yigou +已故yigu +一贯yiguan +异国yiguo +遗憾yihan +遗恨yihen +以后yihou +异化yihua +议会yihui +疑惑yihuo +以及yiji +异己yiji +遗迹yiji +议价yijia +意见yijian +移交yijiao +一届yijie +一经yijing +已经yijing +意境yijing +依旧yijiu +一举yiju +依据yiju +移居yiju +议决yijue +依靠yikao +倚靠yikao +一刻yike +医科yike +一块yikuai +以来yilai +依赖yilai +一览yilan +一例yili +毅力yili +屹立yili +一连yilian +意料yiliao +医疗yiliao +遗留yiliu +遗漏yilou +一律yilu +疑虑yilu +议论yilun +一面yimian +以免yimian +疫苗yimiao +移民yimin +因yin +引yin +阴yin +印yin +音yin +银yin +烟*yin +隐yin +饮yin +荫yin +茵yin +殷yin +姻yin +吟yin +淫yin +寅yin +尹yin +胤yin +鄞yin +圻*yin +垠yin +堙yin +茚yin +吲yin +喑yin +狺yin +夤yin +洇yin +湮*yin +氤yin +铟yin +瘾yin +窨yin +蚓yin +霪yin +龈yin +疑难yinan +阴暗yinan +隐蔽yinbi +音标yinbiao +隐藏yincang +阴沉yinchen +银川yinchuan +因此yinci +引导yindao +音调yindiao +印度yindu +引渡yindu +以内yinei +因而yiner +印发yinfa +音符yinfu +应ying +影ying +硬ying +营ying +英ying +映ying +迎ying +樱ying +婴ying +鹰ying +缨ying +莹ying +萤ying +荧ying +蝇ying +赢ying +盈ying +颖ying +嬴ying +郢ying +茔ying +荥*ying +莺ying +萦ying +蓥ying +撄ying +嘤ying +膺ying +滢ying +潆ying +瀛ying +瑛ying +璎ying +楹ying +媵ying +鹦ying +瘿ying +颍ying +罂ying +英镑yingbang +硬币yingbi +应变yingbian +映衬yingchen +应酬yingchou +迎春yingchun +应当yingdang +赢得yingde +婴儿yinger +营房yingfang +迎风yingfeng +应付yingfu +应该yinggai +英国yingguo +樱花yinghua +英魂yinghun +应急yingji +硬件yingjian +迎接yingjie +应届yingjie +英杰yingjie +营救yingjiu +英俊yingjun +盈亏yingkui +赢利yingli +盈利yingli +英烈yinglie +迎面yingmian +英明yingming +硬盘yingpan +影片yingpian +硬拼yingpin +影射yingshe +映射yingshe +樱桃yingtao +迎头yingtou +因果yinguo +影响yingxiang +硬性yingxing +英雄yingxiong +营养yingyang +应邀yingyao +营业yingye +应用yingyong +英勇yingyong +应有yingyou +英语yingyu +盈余yingyu +营造yingzao +应战yingzhan +迎战yingzhan +映照yingzhao +应征yingzheng +影子yingzi +英姿yingzi +银行yinhang +引号yinhao +殷红yinhong +隐患yinhuan +淫秽yinhui +阴魂yinhun +意念yinian +姨娘yiniang +阴极yinji +印鉴yinjian +引进yinjin +引力yinli +阴历yinli +阴凉yinliang +引路yinlu +隐瞒yinman +阴谋yinmou +银幕yinmu +隐慝yinni +银牌yinpai +引起yinqi +殷切yinqie +殷勤yinqin +引擎yinqing +引人yinren +饮食yinshi +印刷yinshua +饮水yinshui +因素yinsu +阴天yintian +引退yintui +因为yinwei +淫威yinwei +阴险yinxian +印象yinxiang +音响yinxiang +音信yinxin +因循yinxun +引言yinyan +阴影yinying +引用yinyong +引诱yinyou +阴雨yinyu +姻缘yinyuan +隐约yinyue +音乐yinyue +引证yinzheng +印证yinzheng +一片yipian +一瞥yipie +一起yiqi +一齐yiqi +义气yiqi +意气yiqi +仪器yiqi +遗弃yiqi +以前yiqian +一切yiqie +依然yiran +亦然yiran +毅然yiran +艺人yiren +宜人yiren +遗容yirong +以上yishang +一生yisheng +医生yisheng +一时yishi +一事yishi +意识yishi +议事yishi +逸事yishi +仪式yishi +医师yishi +医士yishi +遗失yishi +一手yishou +遗书yishu +艺术yishu +意思yisi +一体yiti +议题yiti +遗体yiti +一天yitian +一同yitong +异同yitong +一头yitou +意图yitu +疑团yituan +以外yiwai +意外yiwai +亿万yiwan +以往yiwang +遗忘yiwang +以为yiwei +意味yiwei +意文yiwen +疑问yiwen +译文yiwen +一无yiwu +义务yiwu +遗物yiwu +医务yiwu +贻误yiwu +一下yixia +以下yixia +一线yixian +一向yixiang +一项yixiang +意向yixiang +遗像yixiang +一些yixie +一心yixin +疑心yixin +异性yixing +医学yixue +一言yiyan +义演yiyan +遗言yiyan +一样yiyang +医药yiyao +意义yiyi +异议yiyi +义勇yiyong +易于yiyu +议员yiyuan +意愿yiyuan +医院yiyuan +亿元yiyuan +遗愿yiyuan +疑云yiyun +一再yizai +一早yizao +臆造yizao +依仗yizhang +仪仗yizhang +一朝yizhao +衣着yizhao +依照yizhao +一阵yizhen +一直yizhi +一致yizhi +以至yizhi +以致yizhi +意志yizhi +抑制yizhi +医治yizhi +抑止yizhi +移植yizhi +遗址yizhi +一种yizhong +遗嘱yizhu +研究会yjh +有纪律yjl +研究生yjs +研究所yjs +研究室yjs +养精畜锐yjxr +研究员yjy +拥军优属yjys +一技之长yjzc +一口气ykq +一览表ylb +以理服人ylfr +阅览室yls +有理想ylx +有利于yly +越来越yly +有目共睹ymgd +一目了然ymlr +有没有ymy +云南省yns +育*yo +哟yo +唷yo +用yong +勇yong +永yong +拥yong +涌yong +蛹yong +庸yong +佣yong +臃yong +痈yong +雍yong +踊yong +咏yong +泳yong +恿yong +俑yong +壅yong +墉yong +喁yong +慵yong +邕yong +镛yong +甬yong +鳙yong +饔yong +拥抱yongbao +永别yongbie +永不yongbu +用处yongchu +用度yongdu +用法yongfa +用费yongfei +勇敢yonggan +用功yonggong +永恒yongheng +用户yonghu +拥护yonghu +拥挤yongji +永久yongjiu +用具yongju +永诀yongjue +用力yongli +庸碌yonglu +勇猛yongmeng +用品yongpin +勇气yongqi +勇士yongshi +庸俗yongsu +咏叹yongtan +用途yongtu +涌现yongxian +用心yongxin +用意yongyi +拥有yongyou +用于yongyu +勇于yongyu +永远yongyuan +踊跃yongyue +有you +由you +又you +油you +右you +友you +优you +幼you +游you +尤you +诱you +犹you +幽you +悠you +忧you +邮you +铀you +酉you +佑you +釉you +卣you +攸you +侑you +莠you +莜you +莸you +尢*you +呦you +囿you +宥you +柚you +猷you +牖you +铕you +疣you +蚰you +蚴you +蝣you +蝤*you +繇*you +鱿you +黝you +鼬you +有碍youai +友爱youai +幽暗youan +友邦youbang +右边youbian +忧愁youchou +由此youci +有错youcuo +有待youdai +优待youdai +诱导youdao +有的youde +优等youdeng +有点youdian +邮电youdian +优点youdian +诱发youfa +有功yougong +有关youguan +有害youhai +友好youhao +优化youhua +油画youhua +幽会youhui +优惠youhui +诱惑youhuo +有机youji +游击youji +有劲youjin +幽静youjing +悠久youjiu +邮局youju +由来youlai +游览youlan +有劳youlao +有利youli +有力youli +游离youli +优良youliang +优劣youlie +幽灵youling +忧虑youlu +优美youmei +幼苗youmiao +有名youming +幽默youmo +右派youpai +诱骗youpian +邮票youpiao +尤其youqi +油漆youqi +友情youqing +右倾youqing +有趣youqu +油然youran +犹如youru +有色youse +优胜yousheng +有时youshi +有事youshi +有失youshi +优势youshi +有数youshu +油水youshui +有所yousuo +有望youwang +有为youwei +游戏youxi +有限youxian +优先youxian +悠闲youxian +有效youxiao +幼小youxiao +有些youxie +有心youxin +游行youxing +优秀youxiu +幽雅youya +悠扬youyang +又要youyao +有益youyi +优异youyi +友谊youyi +有用youyong +游泳youyong +有余youyu +由于youyu +犹豫youyu +忧郁youyu +悠远youyuan +优越youyue +有着youzhe +邮政youzheng +优质youzhi +幼稚youzhi +由衷youzhong +邮资youzi +有求必应yqby +以权谋私yqms +有气无力yqwl +迎刃而解yrej +因人而异yrey +与人为善yrws +引人注目yrzm +意识到ysd +艺术家ysj +因势利导ysld +印刷体yst +意识形态ysxt +衣食住行yszx +以身作则yszz +研讨会yth +一条龙ytl +一条心ytx +有条有理ytyl +于yu +与yu +育yu +鱼yu +雨yu +玉yu +余yu +遇yu +预yu +域yu +语yu +愈yu +渔yu +予yu +羽yu +愚yu +御yu +谷*yu +欲yu +宇yu +蔚*yu +尉*yu +迂yu +淤yu +盂yu +榆yu +虞yu +舆yu +俞yu +逾yu +愉yu +渝yu +隅yu +娱yu +屿yu +禹yu +芋yu +郁yu +吁yu +喻yu +峪yu +狱yu +誉yu +浴yu +寓yu +裕yu +豫yu +驭yu +粥*yu +禺yu +毓yu +伛yu +俣yu +谀yu +谕yu +萸yu +菀*yu +蓣yu +揄yu +圄yu +圉yu +嵛yu +狳yu +饫yu +馀yu +庾yu +阈yu +鬻yu +妪yu +妤yu +纡yu +瑜yu +昱yu +觎yu +腴yu +腧*yu +欤yu +於yu +煜yu +熨yu +燠yu +聿yu +钰yu +鹆yu +鹬yu +瘐yu +瘀yu +窬yu +窳yu +蜮yu +蝓yu +竽yu +臾yu +舁yu +雩yu +龉yu +员yuan +原yuan +圆yuan +源yuan +元yuan +远yuan +愿yuan +院yuan +缘yuan +援yuan +园yuan +怨yuan +鸳yuan +渊yuan +冤yuan +垣yuan +袁yuan +辕yuan +猿yuan +苑yuan +垸yuan +塬yuan +芫yuan +掾yuan +圜*yuan +沅yuan +媛yuan +瑗yuan +橼yuan +爰yuan +眢yuan +鸢yuan +螈yuan +箢yuan +鼋yuan +原本yuanben +渊博yuanbo +冤仇yuanchou +远大yuanda +元旦yuandan +园地yuandi +园丁yuanding +远东yuandong +远方yuanfang +缘分yuanfen +原告yuangao +原故yuangu +缘故yuangu +圆滑yuanhua +原籍yuanji +冤家yuanjia +元件yuanjian +远见yuanjian +远近yuanjin +远景yuanjing +援救yuanjiu +原来yuanlai +原理yuanli +原谅yuanliang +原料yuanliao +远虑yuanlu +圆满yuanman +远谋yuanmou +远期yuanqi +冤屈yuanqu +源泉yuanquan +原始yuanshi +远视yuanshi +元首yuanshou +元帅yuanshuai +元素yuansu +援外yuanwai +愿望yuanwang +冤枉yuanwang +原先yuanxian +远销yuanxiao +元宵yuanxiao +院校yuanxiao +原形yuanxing +怨言yuanyan +原野yuanye +愿意yuanyi +园艺yuanyi +原因yuanyin +援引yuanyin +原有yuanyou +缘由yuanyou +远游yuanyou +远远yuanyuan +渊源yuanyuan +元月yuanyue +原则yuanze +院长yuanzhang +远征yuanzheng +援助yuanzhu +原子yuanzi +院子yuanzi +预报yubao +预备yubei +愚笨yuben +余步yubu +预测yuce +愚蠢yuchun +遇到yudao +预定yuding +预订yuding +余毒yudu +月yue +说*yue +越yue +约yue +乐*yue +跃yue +曰yue +阅yue +钥yue +岳yue +粤yue +悦yue +龠yue +瀹yue +栎*yue +樾yue +刖yue +钺yue +月报yuebao +月初yuechu +月底yuedi +约定yueding +月度yuedu +阅读yuedu +乐队yuedui +约法yuefa +月份yuefen +月光yueguang +越轨yuegui +约会yuehui +越界yuejie +跃进yuejin +越境yuejing +阅览yuelan +阅历yueli +月亮yueliang +月末yuemo +约莫yuemo +越南yuenan +乐谱yuepu +乐器yueqi +月球yueqiu +乐曲yuequ +月色yuese +越是yueshi +约束yueshu +月台yuetai +乐团yuetuan +约有yueyou +乐章yuezhang +预防yufang +预风yufeng +预付yufu +预感yugan +预告yugao +预购yugou +遇害yuhai +宇航yuhang +与会yuhui +迂回yuhui +雨季yuji +预计yuji +遇见yujian +预见yujian +语句yuju +豫剧yuju +愉快yukuai +娱乐yule +鱼雷yulei +预料yuliao +雨露yulu +舆论yulun +愚昧yumei +育苗yumiao +预谋yumou +运yun +员*yun +云yun +匀yun +均*yun +允yun +孕yun +耘yun +郧yun +陨yun +蕴yun +酝yun +晕yun +韵yun +郓yun +芸yun +狁yun +恽yun +愠yun +纭yun +韫yun +殒yun +昀yun +氲yun +熨yun +遇难yunan +云彩yuncai +蕴藏yuncang +匀称yuncheng +运动yundong +熨斗yundou +云海yunhai +运河yunhe +韵律yunlu +陨落yunluo +云南yunnan +酝酿yunnian +允诺yunnuo +愚弄yunong +运气yunqi +运输yunshu +运算yunsuan +云梯yunti +运往yunwang +韵味yunwei +云雾yunwu +云霞yunxia +运行yunxing +允许yunxu +运用yunyong +孕育yunyu +运载yunzai +运转yunzhuan +与其yuqi +语气yuqi +预期yuqi +预审yushen +于是yushi +预示yushi +预售yushou +雨水yushui +预算yusuan +欲望yuwang +语文yuwen +预习yuxi +预先yuxian +遇险yuxian +预想yuxiang +预言yuyan +语言yuyan +寓言yuyan +预演yuyan +予以yuyi +寓于yuyu +愉悦yuyue +预兆yuzhao +预支yuzhi +宇宙yuzhou +有文化ywh +业务联系ywlx +意味着ywz +有限公司yxgs +一系列yxl +有效期yxq +医学院yxy +一心一意yxyy +游泳池yyc +营业额yye +夜以继日yyjr +应用科学yykx +一言堂yyt +引以为戒yywj +优越性yyx +营业员yyy +隐隐约约yyyy +运用自如yyzr +拥政爱民yzam +原子能yzn +已知数yzs +有助于yzy +言之有理yzyl +在z +这z +主z +中z +种z +着z +争z +战z +作z +正z +之z +制z +重z +组z +治z +只z +子z +自z +质z +指z +杂za +扎*za +咱za +匝za +砸za +咋za +咂za +在zai +再zai +载zai +栽zai +灾zai +仔*zai +哉zai +宰zai +崽zai +甾zai +再版zaiban +再不zaibu +在场zaichang +再度zaidu +宰割zaige +灾害zaihai +再好zaihao +在乎zaihu +灾荒zaihuang +再会zaihui +灾祸zaihuo +再见zaijian +在理zaili +灾民zaimin +灾难zainan +栽培zaipei +再起zaiqi +灾情zaiqing +灾区zaiqu +再三zaisan +在世zaishi +再说zaishuo +载体zaiti +在下zaixia +再现zaixian +宰相zaixiang +在意zaiyi +在于zaiyu +再造zaizao +再则zaize +在职zaizhi +再植zaizhi +杂技zaji +杂粮zaliang +杂乱zaluan +赞zan +咱zan +暂zan +攒zan +拶zan +瓒zan +昝zan +簪zan +糌zan +趱zan +錾zan +赞成zancheng +暂定zanding +藏*zang +脏zang +葬zang +赃zang +奘zang +驵zang +臧zang +赞歌zange +赃款zangkuan +葬送zangsong +赃物zangwu +藏族zangzu +杂念zanian +赞美zanmei +咱们zanmen +暂且zanqie +暂缺zanque +赞赏zanshang +暂时zanshi +赞颂zansong +赞叹zantan +暂停zanting +赞同zantong +暂行zanxing +赞扬zanyang +暂用zanyong +赞助zanzhu +造zao +早zao +遭zao +燥zao +凿zao +糟zao +枣zao +皂zao +藻zao +澡zao +蚤zao +躁zao +噪zao +灶zao +唣zao +早晨zaochen +造成zaocheng +凿穿zaochuan +造次zaoci +造词zaoci +遭到zaodao +早稻zaodao +造反zaofan +早饭zaofan +造福zaofu +糟糕zaogao +造化zaohua +造价zaojia +造就zaojiu +造林zaolin +早年zaonian +糟粕zaopo +早期zaoqi +早日zaori +早上zaoshang +遭受zaoshou +早衰zaoshuai +糟蹋zaota +早晚zaowan +造型zaoxing +遭殃zaoyang +造谣zaoyao +造诣zaoyi +早已zaoyi +噪音zaoyin +遭遇zaoyu +造字zaozi +杂谈zatan +杂文zawen +杂质zazhi +杂志zazhi +资本主义zbzy +资产阶级zcjj +增长率zcl +总参谋部zcmb +真才实学zcsx +自动化zdh +自动检测zdjc +自动检索zdjs +自动控制zdkz +主动权zdq +招待所zds +总的说来zdsl +主动性zdx +则ze +择ze +责ze +侧*ze +泽ze +咋*ze +仄ze +赜ze +啧ze +帻ze +迮ze +昃ze +笮ze +箦ze +舴ze +责备zebei +责成zecheng +责罚zefa +责怪zeguai +贼zei +责令zeling +责骂zema +怎zen +谮zen +增zeng +曾zeng +综*zeng +憎zeng +赠zeng +缯zeng +甑zeng +罾zeng +锃zeng +增补zengbu +增产zengchan +增长zengchang +增大zengda +增订zengding +增多zengduo +增高zenggao +憎恨zenghen +增加zengjia +增减zengjian +增进zengjin +增量zengliang +赠品zengpin +增强zengqiang +增删zengshan +增设zengshe +赠送zengsong +增添zengtian +赠言zengyan +增益zengyi +增援zengyuan +怎么zenme +怎奈zennai +怎样zenyang +责任zeren +责问zewen +总而言之zeyz +争分夺秒zfdm +针锋相对zfxd +自负盈亏zfyk +中关村zgc +自告奋勇zgfy +中国共产党zggd +总工会zgh +中国特色的zgtd +中国银行zgyh +自古以来zgyl +中国政府zgzf +中共中央zgzy +查*zha +扎zha +炸zha +闸zha +铡zha +轧zha +渣zha +蜡*zha +喳zha +札zha +眨zha +栅zha +榨zha +咋*zha +乍zha +诈zha +柞*zha +揸zha +吒zha +咤zha +哳zha +喋*zha +楂*zha +砟zha +痄zha +蚱zha +齄zha +炸弹zhadan +扎根zhagen +炸毁zhahui +寨zhai +侧*zhai +择*zhai +摘zhai +窄zhai +斋zhai +翟*zhai +祭*zhai +宅zhai +债zhai +砦zhai +瘵zhai +摘录zhailu +债权zhaiquan +债务zhaiwu +窄小zhaixiao +摘要zhaiyao +札记zhaji +战zhan +展zhan +站zhan +占zhan +粘*zhan +颤*zhan +瞻zhan +毡zhan +詹zhan +沾zhan +盏zhan +斩zhan +辗zhan +崭zhan +蘸zhan +栈zhan +湛zhan +绽zhan +谵zhan +搌zhan +旃zhan +战败zhanbai +战报zhanbao +战备zhanbei +战场zhanchang +展翅zhanchi +展出zhanchu +战地zhandi +战斗zhandou +战犯zhanfan +长*zhang +张zhang +章zhang +掌zhang +仗zhang +障zhang +胀zhang +涨zhang +账zhang +樟zhang +彰zhang +漳zhang +杖zhang +丈zhang +帐zhang +瘴zhang +仉zhang +鄣zhang +幛zhang +嶂zhang +獐zhang +嫜zhang +璋zhang +蟑zhang +障碍zhangai +站岗zhangang +长辈zhangbei +章程zhangcheng +长大zhangda +战歌zhange +章法zhangfa +帐房zhangfang +丈夫zhangfu +掌管zhangguan +帐号zhanghao +章节zhangjie +帐目zhangmu +战功zhangong +掌权zhangquan +张贴zhangtie +战鼓zhangu +沾光zhanguang +战国zhanguo +战果zhanguo +张望zhangwang +掌握zhangwo +张扬zhangyang +战壕zhanhao +战后zhanhou +战机zhanji +战绩zhanji +战局zhanju +占据zhanju +展开zhankai +战况zhankuang +展览zhanlan +占领zhanling +战略zhanlue +战马zhanma +展品zhanpin +战区zhanqu +沾染zhanran +战胜zhansheng +战时zhanshi +战事zhanshi +战士zhanshi +展示zhanshi +战术zhanshu +展望zhanwang +战线zhanxian +展现zhanxian +展销zhanxiao +崭新zhanxin +瞻仰zhanyang +战役zhanyi +占用zhanyong +占有zhanyou +战友zhanyou +站长zhanzhang +战争zhanzheng +着*zhao +照zhao +找zhao +招zhao +朝*zhao +召zhao +赵zhao +爪zhao +罩zhao +沼zhao +兆zhao +嘲*zhao +昭zhao +肇zhao +诏zhao +啁*zhao +棹zhao +钊zhao +笊zhao +照办zhaoban +照搬zhaoban +招标zhaobiao +照常zhaochang +照抄zhaochao +招待zhaodai +照发zhaofa +招工zhaogong +照顾zhaogu +招呼zhaohu +召唤zhaohuan +照会zhaohui +着急zhaoji +招集zhaoji +召集zhaoji +招架zhaojia +召开zhaokai +招考zhaokao +招揽zhaolan +着力zhaoli +照例zhaoli +照料zhaoliao +着落zhaoluo +着迷zhaomi +照明zhaoming +招聘zhaopin +朝气zhaoqi +招惹zhaore +照射zhaoshe +招生zhaosheng +着手zhaoshou +招手zhaoshou +招收zhaoshou +招贴zhaotie +朝夕zhaoxi +朝霞zhaoxia +着想zhaoxiang +照相zhaoxiang +昭雪zhaoxue +找寻zhaoxun +着眼zhaoyan +照样zhaoyang +照耀zhaoyao +照应zhaoying +招展zhaozhan +招致zhaozhi +着重zhaozhong +照着zhaozhuo +诈骗zhapian +榨取zhaqu +诈取zhaqu +扎实zhashi +炸药zhayao +渣滓zhazi +这zhe +着zhe +者zhe +折zhe +哲zhe +浙zhe +遮zhe +蛰zhe +辙zhe +锗zhe +蔗zhe +谪zhe +摺zhe +柘zhe +辄zhe +磔zhe +鹧zhe +褶zhe +蜇zhe +赭zhe +这般zheban +这边zhebian +这次zheci +遮挡zhedang +这点zhedian +折叠zhedie +折服zhefu +遮盖zhegai +这个zhege +折合zhehe +浙江zhejiang +折旧zhejiu +折扣zhekou +这里zheli +哲理zheli +这么zheme +折磨zhemo +真zhen +针zhen +阵zhen +镇zhen +振zhen +震zhen +珍zhen +诊zhen +斟zhen +甄zhen +砧zhen +臻zhen +贞zhen +侦zhen +枕zhen +疹zhen +圳zhen +蓁zhen +浈zhen +溱*zhen +缜zhen +桢zhen +椹*zhen +榛zhen +轸zhen +赈zhen +胗zhen +朕zhen +祯zhen +畛zhen +稹zhen +鸩zhen +箴zhen +珍爱zhenai +珍宝zhenbao +针砭zhenbian +珍藏zhencang +贞操zhencao +侦察zhencha +真诚zhencheng +震荡zhendang +阵地zhendi +真谛zhendi +震动zhendong +诊断zhenduan +针对zhendui +振奋zhenfen +争zheng +正zheng +政zheng +整zheng +证zheng +征zheng +蒸zheng +症zheng +丁*zheng +郑zheng +挣zheng +睁zheng +狰zheng +怔zheng +拯zheng +帧zheng +诤zheng +峥zheng +徵zheng +钲zheng +铮zheng +筝zheng +争霸zhengba +整备zhengbei +正比zhengbi +政变zhengbian +争辩zhengbian +整编zhengbian +征兵zhengbing +政策zhengce +正常zhengchang +争吵zhengchao +征程zhengcheng +争持zhengchi +正大zhengda +正当zhengdang +政党zhengdang +整党zhengdang +正道zhengdao +争端zhengduan +整顿zhengdun +争夺zhengduo +蒸发zhengfa +政法zhengfa +正反zhengfan +整风zhengfeng +政府zhengfu +征服zhengfu +整改zhenggai +整个zhengge +征购zhenggou +争光zhengguang +正规zhenggui +正轨zhenggui +正好zhenghao +政绩zhengji +征集zhengji +证件zhengjian +政见zhengjian +整洁zhengjie +政局zhengju +证据zhengju +正理zhengli +整理zhengli +正梁zhengliang +政令zhengling +争论zhenglun +政论zhenglun +正面zhengmian +争鸣zhengming +证明zhengming +正派zhengpai +征聘zhengpin +争气zhengqi +正气zhengqi +蒸气zhengqi +整齐zhengqi +正巧zhengqiao +征求zhengqiu +争取zhengqu +政权zhengquan +正确zhengque +证人zhengren +正是zhengshi +正式zhengshi +正视zhengshi +证实zhengshi +征收zhengshou +整数zhengshu +证书zhengshu +征税zhengshui +整套zhengtao +正题zhengti +政体zhengti +整体zhengti +整天zhengtian +征调zhengtiao +正统zhengtong +征途zhengtu +珍贵zhengui +政委zhengwei +正文zhengwen +征文zhengwen +政务zhengwu +争先zhengxian +政协zhengxie +整形zhengxing +整修zhengxiu +征询zhengxun +争艳zhengyan +正业zhengye +正义zhengyi +争议zhengyi +征用zhengyong +正月zhengyue +正在zhengzai +挣扎zhengzha +整整zhengzheng +正直zhengzhi +政治zhengzhi +争执zhengzhi +正中zhengzhong +郑重zhengzhong +郑州zhengzhou +症状zhengzhuang +正宗zhengzong +震撼zhenhan +侦缉zhenji +真假zhenjia +阵脚zhenjiao +贞节zhenjie +贞洁zhenjie +镇静zhenjing +震惊zhenjing +真空zhenkong +真理zhenli +诊疗zhenliao +珍品zhenpin +珍奇zhenqi +真切zhenqie +真情zhenqing +真确zhenque +真人zhenren +阵容zhenrong +真是zhenshi +真实zhenshi +阵势zhenshi +珍视zhenshi +侦探zhentan +阵亡zhenwang +珍惜zhenxi +阵线zhenxian +真相zhenxiang +振兴zhenxing +镇压zhenya +阵阵zhenzhen +真正zhenzheng +真知zhenzhi +真挚zhenzhi +珍重zhenzhong +珍珠zhenzhu +斟酌zhenzhuo +振作zhenzuo +这是zheshi +这时zheshi +折腾zheteng +这些zhexie +哲学zhexue +遮掩zheyan +这样zheyang +这种zhezhong +折中zhezhong +之zhi +制zhi +治zhi +只zhi +质zhi +指zhi +直zhi +支zhi +织zhi +止zhi +至zhi +置zhi +志zhi +值zhi +知zhi +识*zhi +执zhi +职zhi +植zhi +纸zhi +致zhi +枝zhi +殖zhi +脂zhi +智zhi +氏*zhi +肢zhi +秩zhi +址zhi +滞zhi +汁zhi +芝zhi +吱zhi +蜘zhi +侄zhi +趾zhi +旨zhi +挚zhi +掷zhi +帜zhi +峙zhi +稚zhi +炙zhi +痔zhi +窒zhi +卮zhi +陟zhi +郅zhi +埴zhi +芷zhi +摭zhi +帙zhi +徵*zhi +忮zhi +彘zhi +咫zhi +骘zhi +栉zhi +枳zhi +栀zhi +桎zhi +轵zhi +轾zhi +贽zhi +胝zhi +膣zhi +祉zhi +祗zhi +黹zhi +雉zhi +鸷zhi +痣zhi +蛭zhi +絷zhi +酯zhi +跖zhi +踬zhi +踯zhi +豸zhi +觯zhi +治安zhian +值班zhiban +植保zhibao +置备zhibei +质变zhibian +指标zhibiao +职别zhibie +支部zhibu +制裁zhicai +支撑zhicheng +职称zhicheng +支持zhichi +指出zhichu +支出zhichu +至此zhici +值此zhici +直达zhida +只当zhidang +直到zhidao +指导zhidao +知道zhidao +只得zhide +值得zhide +质地zhidi +指点zhidian +制定zhiding +指定zhiding +制订zhiding +制度zhidu +支队zhidui +至多zhiduo +知法zhifa +执法zhifa +制服zhifu +支付zhifu +职工zhigong +只顾zhigu +只管zhiguan +直观zhiguan +治国zhiguo +只好zhihao +之后zhihou +指挥zhihui +智慧zhihui +知己zhiji +指甲zhijia +之间zhijian +只见zhijian +指教zhijiao +直接zhijie +枝节zhijie +至今zhijin +直经zhijing +直径zhijing +止境zhijing +致敬zhijing +知觉zhijue +治理zhili +致力zhili +智力zhili +质量zhiliang +治疗zhiliao +指令zhiling +直流zhiliu +支流zhiliu +殖民zhimin +致命zhiming +指明zhiming +知名zhiming +智谋zhimou +指南zhinan +智囊zhinang +之内zhinei +只能zhineng +职能zhineng +智能zhineng +只怕zhipa +指派zhipai +支配zhipei +支票zhipiao +制品zhipin +志气zhiqi +之前zhiqian +支前zhiqian +值勤zhiqin +执勤zhiqin +知情zhiqing +知青zhiqing +智取zhiqu +志趣zhiqu +知趣zhiqu +职权zhiquan +值日zhiri +治丧zhisang +之上zhishang +直上zhishang +至上zhishang +至少zhishao +制胜zhisheng +之声zhisheng +只是zhishi +指使zhishi +支使zhishi +致使zhishi +知事zhishi +指示zhishi +知识zhishi +指数zhishu +支书zhishu +直属zhishu +植树zhishu +直爽zhishuang +治水zhishui +直说zhishuo +致死zhisi +之外zhiwai +指望zhiwang +职位zhiwei +质问zhiwen +植物zhiwu +职务zhiwu +窒息zhixi +之下zhixia +直线zhixian +指向zhixiang +志向zhixiang +知心zhixin +执行zhixing +只许zhixu +秩序zhixu +直言zhiyan +只要zhiyao +职业zhiye +致意zhiyi +旨意zhiyi +质疑zhiyi +指引zhiyin +知音zhiyin +只有zhiyou +至于zhiyu +置于zhiyu +智育zhiyu +职员zhiyuan +支援zhiyuan +志愿zhiyuan +制约zhiyue +制造zhizao +指责zhize +职责zhize +纸张zhizhang +职掌zhizhang +执照zhizhao +指正zhizheng +执政zhizheng +制止zhizhi +直至zhizhi +之中zhizhong +支助zhizhu +支柱zhizhu +知足zhizu +制作zhizuo +走后门zhm +中华民国zhmg +中华民族zhmz +中zhong +种zhong +重zhong +众zhong +钟zhong +终zhong +忠zhong +肿zhong +仲zhong +盅zhong +衷zhong +冢zhong +忪*zhong +锺zhong +螽zhong +舯zhong +踵zhong +钟爱zhongai +重办zhongban +重兵zhongbing +中部zhongbu +仲裁zhongcai +中层zhongceng +衷肠zhongchang +忠诚zhongcheng +重大zhongda +重担zhongdan +中等zhongdeng +种地zhongdi +重地zhongdi +重点zhongdian +终点zhongdian +中东zhongdong +中断zhongduan +终端zhongduan +中队zhongdui +众多zhongduo +重犯zhongfan +忠告zhonggao +中共zhonggong +中国zhongguo +忠厚zhonghou +中华zhonghua +中级zhongji +终极zhongji +重价zhongjia +中间zhongjian +中坚zhongjian +中奖zhongjiang +终结zhongjie +终究zhongjiu +终久zhongjiu +终局zhongju +中肯zhongken +种类zhonglei +中立zhongli +重量zhongliang +终了zhongliao +中流zhongliu +肿瘤zhongliu +中美zhongmei +众目zhongmu +中年zhongnian +终年zhongnian +中秋zhongqiu +重任zhongren +中日zhongri +终日zhongri +中伤zhongshang +重赏zhongshang +终身zhongshen +终生zhongsheng +重视zhongshi +忠实zhongshi +中枢zhongshu +众说zhongshuo +中苏zhongsu +终天zhongtian +中途zhongtu +重托zhongtuo +中外zhongwai +重围zhongwei +中文zhongwen +中午zhongwu +中西zhongxi +中心zhongxin +忠心zhongxin +衷心zhongxin +中性zhongxing +中学zhongxue +中旬zhongxun +忠言zhongyan +中央zhongyang +中药zhongyao +重要zhongyao +中医zhongyi +重用zhongyong +中庸zhongyong +中游zhongyou +终于zhongyu +忠于zhongyu +忠贞zhongzhen +中止zhongzhi +种植zhongzhi +终止zhongzhi +种种zhongzhong +中专zhongzhuan +种族zhongzu +轴zhou +周zhou +洲zhou +州zhou +皱zhou +骤zhou +舟zhou +诌zhou +粥zhou +肘zhou +帚zhou +咒zhou +宙zhou +昼zhou +荮zhou +啁zhou +妯zhou +纣zhou +绉zhou +胄zhou +碡zhou +籀zhou +繇*zhou +酎zhou +周到zhoudao +咒骂zhouma +周密zhoumi +周末zhoumo +周期zhouqi +周全zhouquan +周围zhouwei +周旋zhouxuan +昼夜zhouye +周折zhouzhe +周知zhouzhi +周转zhouzhuan +总后勤部zhqb +中华人民共和国zhrg +主zhu +注zhu +著zhu +住zhu +助zhu +猪zhu +铸zhu +属*zhu +株zhu +筑zhu +柱zhu +术*zhu +驻zhu +逐zhu +祝zhu +竹zhu +贮zhu +珠zhu +朱zhu +诸zhu +蛛zhu +诛zhu +烛zhu +煮zhu +拄zhu +瞩zhu +嘱zhu +蛀zhu +伫zhu +侏zhu +邾zhu +茱zhu +洙zhu +渚zhu +潴zhu +杼zhu +槠zhu +橥zhu +炷zhu +铢zhu +疰zhu +瘃zhu +褚*zhu +竺zhu +箸zhu +舳zhu +翥zhu +躅zhu +麈zhu +抓zhua +挝*zhua +抓好zhuahao +转*zhuai +曳*zhuai +拽zhuai +抓紧zhuajin +转zhuan +专zhuan +传*zhuan +砖zhuan +撰zhuan +赚zhuan +篆zhuan +啭zhuan +馔zhuan +沌*zhuan +颛zhuan +转变zhuanbian +转播zhuanbo +专长zhuanchang +专程zhuancheng +转达zhuanda +转发zhuanfa +装zhuang +状zhuang +壮zhuang +庄zhuang +撞zhuang +幢*zhuang +桩zhuang +妆zhuang +僮zhuang +奘*zhuang +转告zhuangao +装扮zhuangban +装备zhuangbei +壮大zhuangda +装订zhuangding +壮观zhuangguan +装甲zhuangjia +庄稼zhuangjia +庄嫁zhuangjia +壮举zhuangju +状况zhuangkuang +壮阔zhuangkuo +壮丽zhuangli +壮烈zhuanglie +装配zhuangpei +装饰zhuangshi +状态zhuangtai +装卸zhuangxie +庄严zhuangyan +庄园zhuangyuan +装运zhuangyun +装置zhuangzhi +壮志zhuangzhi +庄重zhuangzhong +转化zhuanhua +转换zhuanhuan +转给zhuanji +专家zhuanjia +专科zhuanke +专利zhuanli +专门zhuanmen +转让zhuanrang +专题zhuanti +转向zhuanxiang +专心zhuanxin +转眼zhuanyan +专业zhuanye +转移zhuanyi +专员zhuanyuan +转载zhuanzai +转折zhuanzhe +转正zhuanzheng +专政zhuanzheng +专制zhuanzhi +专职zhuanzhi +专注zhuanzhu +专著zhuanzhu +主办zhuban +逐步zhubu +贮藏zhucang +注册zhuce +助长zhuchang +主持zhuchi +主次zhuci +主导zhudao +注定zhuding +主动zhudong +主队zhudui +主犯zhufan +住房zhufang +祝福zhufu +嘱咐zhufu +逐个zhuge +主攻zhugong +助工zhugong +主管zhuguan +主观zhuguan +追zhui +锥zhui +椎zhui +赘zhui +坠zhui +缀zhui +惴zhui +骓zhui +缒zhui +追捕zhuibu +追查zhuicha +追悼zhuidao +追赶zhuigan +坠毁zhuihui +追加zhuijia +追究zhuijiu +追求zhuiqiu +追认zhuiren +追溯zhuisu +追随zhuisui +追问zhuiwen +追逐zhuizhu +追踪zhuizong +主机zhuji +主见zhujian +逐渐zhujian +主将zhujiang +主讲zhujiang +主教zhujiao +主角zhujiao +注解zhujie +祝酒zhujiu +主力zhuli +助理zhuli +株连zhulian +主粮zhuliang +主流zhuliu +驻留zhuliu +著名zhuming +主谋zhumou +注目zhumu +瞩目zhumu +准zhun +屯*zhun +谆zhun +肫zhun +窀zhun +准备zhunbei +逐年zhunian +准确zhunque +准绳zhunsheng +准时zhunshi +准许zhunxu +准则zhunze +着*zhuo +著*zhuo +捉zhuo +桌zhuo +缴*zhuo +拙zhuo +卓zhuo +琢zhuo +茁zhuo +酌zhuo +啄zhuo +灼zhuo +浊zhuo +倬zhuo +诼zhuo +擢zhuo +浞zhuo +涿zhuo +濯zhuo +棹*zhuo +焯zhuo +禚zhuo +斫zhuo +镯zhuo +拙劣zhuolie +琢磨zhuomo +捉弄zhuonong +酌情zhuoqing +卓越zhuoyue +茁壮zhuozhuang +主权zhuquan +主人zhuren +主任zhuren +诸如zhuru +注色zhuse +注视zhushi +柱石zhushi +注释zhushi +助手zhushou +主送zhusong +住宿zhusu +珠算zhusuan +主题zhuti +主体zhuti +逐条zhutiao +嘱托zhutuo +诸位zhuwei +主席zhuxi +注销zhuxiao +主要zhuyao +逐一zhuyi +主义zhuyi +主意zhuyi +注意zhuyi +祝愿zhuyuan +逐月zhuyue +主宰zhuzai +铸造zhuzao +驻扎zhuzha +住宅zhuzhai +主张zhuzhang +住址zhuzhi +注重zhuzhong +著作zhuzuo +子zi +自zi +资zi +字zi +紫zi +仔zi +籽zi +姿zi +吱*zi +兹zi +咨zi +滋zi +淄zi +孜zi +滓zi +渍zi +谘zi +茈*zi +呲*zi +嵫zi +姊zi +孳zi +缁zi +梓zi +辎zi +赀zi +恣zi +眦zi +锱zi +秭zi +耔zi +笫zi +粢zi +趑zi +觜zi +訾zi +龇zi +鲻zi +髭zi +自爱ziai +自白zibai +自卑zibei +资本ziben +资产zichan +滋长zichang +自称zicheng +自传zichuan +自从zicong +子弟zidi +字典zidian +自动zidong +自发zifa +自费zifei +自封zifeng +自负zifu +字符zifu +资格zige +字根zigen +自豪zihao +自给ziji +自己ziji +字迹ziji +字节zijie +资金zijin +自救zijiu +自居ziju +自觉zijue +字库ziku +自夸zikua +自理zili +资历zili +资料ziliao +自满ziman +自勉zimian +字母zimu +字幕zimu +子女zinu +自强ziqiang +自然ziran +滋润zirun +自杀zisha +自身zishen +姿势zishi +自述zishu +自私zisi +姿态zitai +字体ziti +字帖zitie +自卫ziwei +滋味ziwei +自问ziwen +自我ziwo +仔细zixi +自信zixin +自修zixiu +自叙zixu +自选zixuan +自学zixue +咨询zixun +滋养ziyang +自由ziyou +自愿ziyuan +资源ziyuan +自找zizhao +自治zizhi +自重zizhong +资助zizhu +自尊zizun +直截了当zjld +浙江省zjs +这就是说zjss +中纪委zjw +再接再厉zjzl +中联部zlb +专利法zlf +质量管理zlgl +自力更生zlgs +展览会zlh +智力开发zlkf +专利权zlq +知名人士zmrs +这么些zmx +这么样zmy +怎么样zmy +总zong +纵zong +宗zong +综zong +棕zong +鬃zong +踪zong +偬zong +枞zong +腙zong +粽zong +总部zongbu +总裁zongcai +总参zongcan +总队zongdui +总额zonge +总纲zonggang +总共zonggong +纵贯zongguan +总和zonghe +综合zonghe +纵横zongheng +总后zonghou +总计zongji +踪迹zongji +宗教zongjiao +总结zongjie +总局zongju +总括zongkuo +总理zongli +总论zonglun +宗派zongpai +纵情zongqing +纵深zongshen +总是zongshi +纵使zongshi +总数zongshu +总算zongsuan +总体zongti +总统zongtong +总务zongwu +踪影zongying +总帐zongzhang +总政zongzheng +总之zongzhi +宗旨zongzhi +走zou +邹zou +奏zou +揍zou +诹zou +陬zou +鄹zou +驺zou +鲰zou +走访zoufang +邹虹zouhong +走私zousi +奏效zouxiao +酌情处理zqcl +中青年zqn +朝气蓬勃zqpb +准确无误zqww +正确性zqx +诸如此类zrcl +责任感zrg +自然界zrj +主人翁zrw +责任心zrx +责任制zrz +再生产zsc +自上而下zsex +知识分子zsfz +这时候zsh +知识化zsh +株式会社zshs +总书记zsj +装饰品zsp +综上所述zsss +之所以zsy +自始至终zszz +众所周知zszz +座谈会zth +组zu +族zu +足zu +阻zu +祖zu +租zu +卒zu +诅zu +俎zu +菹zu +镞zu +阻碍zuai +钻zuan +赚*zuan +纂zuan +攥zuan +缵zuan +躜zuan +钻研zuanyan +组成zucheng +阻挡zudang +组阁zuge +足够zugou +祖国zuguo +组合zuhe +最zui +罪zui +嘴zui +堆*zui +咀*zui +醉zui +蕞zui +最初zuichu +最大zuida +最低zuidi +罪恶zuie +罪犯zuifan +最高zuigao +罪过zuiguo +最好zuihao +最后zuihou +最坏zuihuai +最佳zuijia +最近zuijin +嘴脸zuilian +罪名zuiming +罪孽zuinie +罪人zuiren +最先zuixian +最小zuixiao +最新zuixin +醉心zuixin +罪行zuixing +罪责zuize +罪证zuizheng +最终zuizhong +罪状zuizhuang +阻击zuji +租界zujie +租借zujie +阻拦zulan +阻力zuli +租赁zulin +尊zun +遵zun +撙zun +樽zun +鳟zun +阻挠zunao +遵从zuncong +尊贵zungui +尊敬zunjing +遵守zunshou +遵循zunxun +尊严zunyan +遵照zunzhao +尊重zunzhong +作zuo +做zuo +左zuo +座zuo +坐zuo +昨zuo +撮*zuo +凿*zuo +搓*zuo +琢*zuo +佐zuo +柞zuo +阼zuo +唑zuo +嘬zuo +怍zuo +胙zuo +祚zuo +笮*zuo +作案zuoan +作弊zuobi +左边zuobian +坐标zuobiao +做到zuodao +作法zuofa +做法zuofa +作废zuofei +作风zuofeng +做工zuogong +作怪zuoguai +做好zuohao +作家zuojia +作客zuoke +作乐zuole +作乱zuoluan +坐落zuoluo +左派zuopai +作品zuopin +左倾zuoqing +做人zuoren +昨日zuori +做事zuoshi +坐视zuoshi +座谈zuotan +昨天zuotian +昨晚zuowan +作为zuowei +座位zuowei +坐位zuowei +作文zuowen +作物zuowu +作业zuoye +昨夜zuoye +作用zuoyong +左右zuoyou +作战zuozhan +作者zuozhe +作证zuozheng +作主zuozhu +做主zuozhu +做作zuozuo +足球zuqiu +阻塞zuse +祖师zushi +祖先zuxian +组长zuzhang +组织zuzhi +阻止zuzhi +祖宗zuzong +中外合资zwhz +责无旁贷zwpd +中宣部zxb +自行车zxc +自下而上zxes +忠心耿耿zxgg +展销会zxh +照相机zxj +争先恐后zxkh +中学生zxs +主席团zxt +中小学zxx +自信心zxx +中央办公厅zybt +着眼点zyd +专业对口zydk +中央电视台zydt +中央各部委zygw +专业化zyh +专业户zyh +中央军委zyjw +座右铭zym +中央全会zyqh +中央人民广播电台zyrt +主要人员zyry +专业人员zyry +中央书记处zysc +中央委员会zywh +中央委员zywy +重要性zyx +主要原因zyyy +中央政治局zyzj +专业知识zyzs +中组部zzb +组织部zzb +政治部zzb +政治处zzc +转折点zzd +置之度外zzdw +政治局zzj +自治区zzq +蒸蒸日上zzrs +组织上zzs +郑州市zzs +组织性zzx +自尊心zzx +赵紫阳zzy +总政治部zzzb +喷码pm +优喷yp +科技kj +比洋by +公司gs +威诺巴赫wnbh +有限公司yxgz +股份公司gfgs +企业qy +标准bz +喷码机pmj +电线dx +电缆dl +电线电缆dxdl +电力电缆dldl +绝缘jy +绝缘层jyc +导体dt +导线dx +电力dl +通信tx +控制电缆kzdl +补偿电缆bcdl +屏蔽电缆pbdl +高温电缆gwdl +计算机电缆jsjdl +信号电缆xhdl +同轴电缆tzdl +耐火电缆nhdl +船用电缆cydl +铝合金电缆lhjdl +单股dg +多股dg +连接lj +电路dl +电器dq +型号xh +铜t +铝l +铅包qb +铝包qb +聚氯乙烯jlyx +电磁线dcx +北京市bj +东城区dcq +西城区xcq +崇文区cwq +宣武区xwq +朝阳区zyq +海淀区hdq +丰台区ftq +房山区fsq +通州区tzq +顺义区syq +昌平区cpq +大兴区txq +怀柔区hrq +平谷区pgq +门头沟区mtgq +石景山区sjsq +天津市tjs +和平区hpq +河东区hdq +河西区hxq +南开区nkq +河北区hbq +红桥区hqq +塘沽区tgq +汉沽区hgq +大港区tgq +东丽区dlq +西青区xqq +北辰区bcq +津南区jnq +武清区wqq +宝坻区bdq +河北省hbs +辛集市xjs +藁城市gcs +晋州市jzs +新乐市xls +鹿泉市lqs +唐山市tss +遵化市zhs +安市as +邯郸市hds +武安市was +邢台市xts +南宫市ngs +沙河市shs +保定市bds +涿州市zzs +定州市dzs +安国市ags +承德市cds +沧州市czs +泊头市bts +任丘市rqs +黄骅市hhs +河间市hjs +廊坊市lfs +霸州市bzs +三河市shs +衡水市hss +冀州市jzs +深州市szs +石家庄市sjzs +张家口市zjks +高碑店市gbds +秦皇岛市qhds +山西省sxs +太原市tys +古交市gjs +大同市dts +阳泉市yqs +长治市czs +潞城市lcs +晋城市jcs +高平市gps +朔州市szs +晋中市jzs +介休市jxs +运城市ycs +河津市hjs +永济市sjs +忻州市xzs +原平市yps +临汾市lfs +侯马市hms +霍州市hzs +吕梁市lls +孝义市xys +汾阳市fys +内蒙古自治区nmg +包头市bts +乌海市whs +赤峰市cfs +通辽市tls +根河市ghs +丰镇市fzs +辽宁省LNS +沈阳市sys +新民市xms +大连市dls +庄河市zhs +鞍山市ass +海城市hcs +抚顺市fss +本溪市bxs +丹东市dds +东港市dgs +凤城市fcs +锦州市jzs +凌海市lhs +北宁市bns +营口市yks +盖州市gzs +阜新市fxs +辽阳市lys +灯塔市dts +盘锦市pjs +铁岭市tls +开原市kys +朝阳市zys +凌源市lys +北票市bps +兴城市xcs +大石桥市dsqs +瓦房店市wfds +普兰店市plds +调兵山市dbss +葫芦岛市hlds +吉林省jls +长春市ccs +九台市jts +榆树市yss +德惠市dhs +吉林市jls +舒兰市sls +桦甸市hds +蛟河市jhs +磐石市pss +四平市sps +双辽市sls +辽源市lys +通化市ths +集安市jas +白山市bss +临江市ljs +松原市sys +白城市bcs +大安市das +洮南市tns +延吉市yjs +图们市tms +敦化市ghs +龙井市ljs +珲春市hcs +和龙市hls +公主岭市gzls +梅河口市mhks +黑龙江省hljs +阿城市acs +尚志市szs +双城市scs +五常市wcs +讷河市nhs +鹤岗市hgs +鸡西市jxs +密山市mss +虎林市hls +大庆市dqs +伊春市ycs +铁力市tls +宁安市nas +海林市hls +穆棱市mls +同江市tjs +富锦市fjs +黑河市hhs +北安市bas +绥化市shs +安达市ads +肇东市zds +海伦市hls +七台河市qths +双鸭山市syss +牡丹江市mdjs +佳木斯市jmss +绥芬河市sfhs +哈尔滨市hebs +齐齐哈尔市qqhes +五大连池市wdlcs +上海市shs +黄浦区hpq +卢湾区lwq +徐汇区xhq +长宁区cnq +静安区jaq +普陀区ptq +闸北区zbq +虹口区hkq +杨浦区ypq +宝山区bsq +闵行区mxq +嘉定区jdq +松江区sjq +金山区jsq +青浦区qpq +南汇区nhq +奉贤区fxq +崇明县浦东新区cmxpdxq +江苏省jss +南京市njs +无锡市wxs +江阴市jys +宜兴市yxs +徐州市xzs +邳州市pzs +新沂市xys +常州市czs +金坛市jts +溧阳市lys +苏州市szs +常熟市css +太仓市dcs +昆山市hss +吴江市wjs +南通市nns +如皋市rgs +通州市tzs +海门市hms +启东市qds +淮安市has +盐城市ycs +东台市dts +大丰市dfs +扬州市yzs +高邮市gys +江都市jds +仪征市yzs +镇江市zjs +丹阳市dys +扬中市yzs +句容市jrs +泰州市dzs +泰兴市dxs +姜堰市jys +靖江市jjs +兴化市xhs +宿迁市sqs +连云港市lygs +张家港市zjgs +浙江省zjs +杭州市hzs +建德市jds +富阳市fys +临安市las +宁波市nbx +余姚市yys +慈溪市cxs +奉化市fhs +温州市wzs +瑞安市ras +乐清市lqs +嘉兴市jxs +海宁市hns +平湖市phs +桐乡市txs +湖州市hzs +绍兴市sxs +诸暨市zjs +上虞市sys +嵊州市szs +金华市jhs +兰溪市lxs +义乌市yws +东阳市dys +永康市yks +衢州市qzs +江山市jss +舟山市zss +台州市tzs +临海市lhs +丽水市lss +龙泉市lqs +安徽省ahs +合肥市hfs +芜湖市whs +蚌埠市bbs +淮南市hns +淮北市hbs +铜陵市tls +安庆市aqs +桐城市tcs +黄山市hss +滁州市czs +天长市dcs +明光市mgs +阜阳市fys +界首市jss +宿州市szs +巢湖市chs +六安市las +亳州市hzs +池州市czs +宣城市ycs +宁国市ngs +马鞍山市mass +福建省fjs +福州市fjs +福清市fqs +长乐市cls +厦门市xms +莆田市pts +三明市sms +永安市yas +泉州市qzs +石狮市sss +晋江市jjs +南安市nas +漳州市zzs +龙海市lhs +南平市nps +建瓯市jos +邵武市sws +建阳市jys +龙岩市lys +漳平市zps +宁德市nds +福安市fas +福鼎市fds +武夷山市wyss +江西省jxs +南昌市ncs +乐平市lps +萍乡市pxs +九江市jjs +瑞昌市rcs +新余市xys +鹰潭市yts +贵溪市gxs +赣州市gzs +瑞金市rjs +南康市nks +吉安市jas +宜春市ycs +丰城市fcs +樟树市zss +高安市gas +抚州市fzs +上饶市srs +德兴市dxs +井冈山市jgss +景德镇市jdzs +山东省sds +济南市jns +章丘市zqs +青岛市qds +胶南市jns +胶州市jzs +平度市pds +莱西市lxs +即墨市jms +淄博市zbs +枣庄市zzs +滕州市tzs +烟台市yts +龙口市lks +莱阳市lys +莱州市lzs +招远市zys +蓬莱市pls +栖霞市qxs +海阳市hys +潍坊市wfs +青州市qzs +诸城市zcs +寿光市sgs +安丘市aqs +高密市gms +昌邑市cys +济宁市jns +曲阜市qfs +兖州市yzs +邹城市zcs +泰安市tas +新泰市xts +肥城市fcs +威海市whs +乳山市rss +文登市wds +荣成市rcs +日照市rzs +莱芜市lws +临沂市lys +德州市dzs +乐陵市lls +禹城市ycs +聊城市lcs +临清市lqs +滨州市bzs +菏泽市hzs +河南省hns +郑州市zzs +巩义市gys +新郑市xzs +新密市xms +登封市dfs +荥阳市xys +开封市kfs +洛阳市lys +偃师市yss +汝州市rzs +舞钢市wgs +安阳市ays +林州市lzs +新乡市xxs +卫辉市whs +辉县市hxs +焦作市jzs +沁阳市qys +孟州市mzs +濮阳市pys +许昌市xcs +禹州市yzs +长葛市cgs +漯河市lhs +义马市yms +灵宝市lbs +南阳市nys +邓州市dzs +商丘市sqs +永城市ycs +信阳市xys +周口市zks +项城市dcs +济源市jys +三门峡市smxs +平顶山市pdss +驻马店市zmds +湖北省hbs +武汉市whs +黄石市hss +大冶市dys +十堰市sys +荆州市jzs +洪湖市hhs +石首市sss +松滋市szs +宜昌市ycs +宜都市yds +当阳市dys +枝江市jjs +襄樊市xfs +枣阳市zys +宜城市ycs +鄂州市ezs +荆门市jms +钟祥市zxs +孝感市xgs +应城市ycs +安陆市als +汉川市hcs +黄冈市hgs +麻城市mcs +武穴市wxs +咸宁市xns +赤壁市cbs +随州市szs +广水市gss +仙桃市xts +天门市tms +潜江市qjs +恩施市ess +利川市lcs +丹江口市djks +老河口市lhks +神农架林区snjlq +湖南省hns +长沙市css +浏阳市lys +株洲市zzs +醴陵市lls +湘潭市xts +湘乡市xxs +韶山市sss +衡阳市hys +耒阳市lys +常宁市cns +邵阳市sys +武冈市wgs +岳阳市yys +临湘市lxs +汨罗市mls +常德市cds +津市市jss +益阳市yys +沅江市yjs +郴州市czs +资兴市zxs +永州市yzs +怀化市hhs +洪江市hjs +娄底市lds +涟源市lys +吉首市jss +冷水江市lsjs +张家界市zjjs +广东省gds +广州市gzs +从化市chs +增城市zcs +深圳市szs +珠海市zhs +汕头市sts +韶关市sgs +乐昌市lcs +南雄市nxs +佛山市fss +江门市jms +台山市tss +开平市kps +鹤山市hss +恩平市eps +湛江市zjs +廉江市ljs +雷州市lzs +吴川市wcs +茂名市mms +西昌市xcs +峨眉山市emss +都江堰市djys +攀枝花市pzhs +贵州省gzs +贵阳市gys +清镇市qzs +遵义市zys +赤水市css +仁怀市rhs +安顺市ass +毕节市bjs +兴义市xys +凯里市kls +都匀市dys +福泉市fqs +六盘水市lpss +六枝特区lztq +万山特区wstq +云南省yns +昆明市kms +安宁市ans +曲靖市qjs +宣威市xws +玉溪市yxs +保山市bss +昭通市zts +丽江市ljs +思茅市sms +临沧市lqs +个旧市gjs +开远市kys +景洪市jhs +楚雄市cxs +大理市dls +潞西市lxs +瑞丽市rls +西藏自治区xzzzq +拉萨市lss +陕西省sxs +西安市xas +铜川市tcs +宝鸡市bjs +咸阳市xys +渭南市wns +韩城市hcs +华阴市hys +延安市yas +汉中市azs +榆林市yls +安康市aks +商洛市sls +甘肃省gss +兰州市lzs +金昌市jcs +白银市bys +天水市tss +武威市wws +张掖市zys +平凉市pls +酒泉市jqs +玉门市yms +敦煌市dhs +庆阳市qys +定西市dxs +陇南市lns +临夏市lxs +合作市hzs +嘉峪关市jygs +青海省qhs +西宁市xns +德令哈市dlhs +格尔木市gems +宁夏回族自治区nxhzzzq +银川市ycs +灵武市lws +吴忠市wzs +固原市gys +中卫市zws +石嘴山市szss +青铜峡市qtxs +新疆维吾尔自治区xjwwezzq +喀什市kss +昌吉市cjs +阜康市fks +米泉市mqs +博乐市bls +伊宁市yns +奎屯市kts +塔城市tcs +乌苏市wss +石河子市shzs +阿拉尔市ales +五家渠市wjqs +吐鲁番市tlfs +阿克苏市akss +阿图什市atss +库尔勒市kels +阿勒泰市alts +乌鲁木齐市wlmqs +克拉玛依市klmys +图木舒克市tmsks +香港特别行政区 +中西区zxq +东区dq +观塘区gtq +南区nq +湾仔区wzq +离岛区ldq +葵青区kqq +北区bq +西贡区xgq +沙田区stq +屯门区tmq +大埔区dpq +荃湾区qwq +元朗区ylq +九龙城区jtcq +油尖旺区yjwq +深水埗区ssbq +黄大仙区hdxq +台湾省tws +台北市tbs +高雄市gxs +基隆市jls +台中市tzs +台南市tns +新竹市xzs +嘉义市jys +板桥市bqs +宜兰市yls +竹北市zbs +桃园市tys +苗栗市mls +丰原市fys +彰化市zhs +南投市nts +太保市tbs +斗六市dls +新营市xys +凤山市fss +屏东市pds +台东市tds +花莲市hls +马公市mgs diff --git a/conf/addrset.txt b/conf/addrset.txt index e292a45..7c400b2 100644 --- a/conf/addrset.txt +++ b/conf/addrset.txt @@ -1,17 +1,17 @@ -A680,256 -A780,384 -A900,512 -AB00,640 -BC00,3200 -CD00,1024 -BC00,320 -BE00,320 -B500,9216 -B200,9216 -B800,240 -B900,320 -BA00,400 -C000,256 -e000,4096 -F,39995 -12,23976 +A680,256 +A780,384 +A900,512 +AB00,640 +BC00,3200 +CD00,1024 +BC00,320 +BE00,320 +B500,9216 +B200,9216 +B800,240 +B900,320 +BA00,400 +C000,256 +e000,4096 +F,39995 +12,23976 diff --git a/conf/config.ini b/conf/config.ini index a2ff1d9..34ad14d 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -1,12 +1,12 @@ -[logging] -fileName=/home/plg/loginfo/ -minLevel=DEBUG -bufferSize=0 -maxSize=200000 -maxBackups=20 -;timestampFormat=dd.MM.yyyy hh:mm:ss.zzz -timestampFormat=yyyy-MM-dd hh:mm:ss.zzz -;msgFormat={timestamp} {typeNr} {type} {msg} -;msgFormat={timestamp} {typeNr} {type} {thread} {msg} -msgFormat={timestamp} {typeNr} {type} {function} @{line} {msg} - +[logging] +fileName=/home/plg/loginfo/ +minLevel=DEBUG +bufferSize=0 +maxSize=200000 +maxBackups=20 +;timestampFormat=dd.MM.yyyy hh:mm:ss.zzz +timestampFormat=yyyy-MM-dd hh:mm:ss.zzz +;msgFormat={timestamp} {typeNr} {type} {msg} +;msgFormat={timestamp} {typeNr} {type} {thread} {msg} +msgFormat={timestamp} {typeNr} {type} {function} @{line} {msg} + diff --git a/conf/fast_128k_7dot_dac.txt b/conf/fast_128k_7dot_dac.txt index adaa7bd..4538bc5 100644 --- a/conf/fast_128k_7dot_dac.txt +++ b/conf/fast_128k_7dot_dac.txt @@ -1,128 +1,128 @@ -0,0,0,0,0,0,0,0,0 -900,0,0,0,0,0,0,0,0 -0,1050,0,0,0,0,0,0,0 -920,1240,0,0,0,0,0,0,0 -0,0,1240,0,0,0,0,0,0 -940,0,1350,0,0,0,0,0,0 -0,1050,1400,0,0,0,0,0,0 -950,1280,1460,0,0,0,0,0,0 -0,0,0,1380,0,0,0,0,0 -920,0,0,1510,0,0,0,0,0 -0,1050,0,1510,0,0,0,0,0 -950,1280,0,1600,0,0,0,0,0 -0,0,1220,1600,0,0,0,0,0 -940,0,1380,1600,0,0,0,0,0 -0,1050,1400,1600,0,0,0,0,0 -950,1290,1490,1630,0,0,0,0,0 -0,0,0,0,1550,0,0,0,0 -950,0,0,0,1670,0,0,0,0 -0,1050,0,0,1700,0,0,0,0 -950,1280,0,0,1730,0,0,0,0 -0,0,1240,0,1730,0,0,0,0 -940,0,1400,1,1600,0,0,0,0 -0,1050,1400,1,1600,0,0,0,0 -930,1280,1480,1,1600,0,0,0,0 -0,0,0,5460,1600,0,0,0,0 -950,0,0,5626,1620,0,0,0,0 -0,1070,0,5626,1620,0,0,0,0 -940,1280,0,5696,1620,0,0,0,0 -0,0,1260,5706,1620,0,0,0,0 -950,0,1400,5746,1620,0,0,0,0 -0,1070,1440,5746,1620,0,0,0,0 -950,1290,1480,5746,1620,0,0,0,0 -0,0,0,0,0,1700,0,0,0 -940,0,0,0,0,1830,0,0,0 -0,1050,0,0,0,1840,0,0,0 -940,1260,0,0,0,1760,0,0,0 -0,0,1240,0,0,1880,0,0,0 -940,0,1380,0,1,1780,0,0,0 -0,1060,1400,0,1,1780,0,0,0 -940,1260,1440,0,1,1780,0,0,0 -0,0,0,1400,1,1780,0,0,0 -940,0,0,1500,1,1780,0,0,0 -0,1060,0,1540,1,1780,0,0,0 -940,1280,0,1600,1,1780,0,0,0 -0,0,1240,1600,1,1780,0,0,0 -940,0,1400,1640,1,1780,0,0,0 -0,1060,1430,1640,1,1780,0,0,0 -940,1260,1480,1660,1,1780,0,0,0 -0,0,0,0,5646,1780,0,0,0 -940,0,0,0,5796,1800,0,0,0 -0,1060,0,0,5796,1800,0,0,0 -940,1260,0,0,5856,1800,0,0,0 -0,0,1240,0,5856,1800,0,0,0 -940,0,1400,0,5866,1800,0,0,0 -0,1060,1420,0,5866,1800,0,0,0 -940,1280,1480,0,5876,1800,0,0,0 -0,0,0,1390,5876,1800,0,0,0 -940,0,0,1540,5896,1800,0,0,0 -0,1050,0,1540,5896,1800,0,0,0 -940,1260,0,1660,5916,1800,0,0,0 -0,0,1240,1660,5916,1800,0,0,0 -950,0,1400,1670,5926,1800,0,0,0 -0,1060,1420,1670,5926,1800,0,0,0 -950,1260,1460,1670,5926,1800,0,0,0 -0,0,0,0,0,0,1830,0,0 -930,0,0,0,0,0,1830,0,0 -0,1050,0,0,0,0,1950,0,0 -940,1280,0,0,0,0,1980,0,0 -0,0,1240,0,0,0,1980,0,0 -940,0,1380,0,0,0,2000,0,0 -0,1060,1420,0,0,0,2000,0,0 -940,1260,1440,0,0,0,2000,0,0 -0,0,0,1390,0,0,2000,0,0 -940,0,0,1530,0,0,2000,0,0 -0,1060,0,1540,0,0,2000,0,0 -940,1260,0,1600,0,1,1870,0,0 -0,0,1240,1620,0,0,2000,0,0 -940,0,1410,1620,0,1,1900,0,0 -0,1060,1420,1620,0,1,1900,0,0 -940,1260,1460,1640,0,1,1900,0,0 -0,0,0,0,1570,1,1900,0,0 -950,0,0,0,1700,1,1900,0,0 -0,1060,0,0,1710,1,1900,0,0 -940,1280,0,0,1750,1,1900,0,0 -0,0,1260,0,1750,1,1900,0,0 -940,0,1400,0,1770,1,1900,0,0 -0,1060,1420,0,1770,1,1900,0,0 -950,1280,1480,0,1810,1,1900,0,0 -0,0,0,1400,1800,1,1910,0,0 -950,0,0,1560,1830,1,1920,0,0 -0,1060,0,1580,1830,1,1920,0,0 -940,1280,0,1630,1830,1,1920,0,0 -0,0,1260,1630,1830,1,1920,0,0 -950,0,1420,1650,1840,1,1920,0,0 -0,1070,1430,1650,1840,1,1920,0,0 -950,1280,1480,1680,1850,1,1920,0,0 -0,0,0,0,0,5776,1930,0,0 -940,0,0,0,0,5896,1930,0,0 -0,1070,0,0,1,5816,1930,0,0 -950,1280,0,0,1,5836,1930,0,0 -0,0,1240,0,1,5836,1930,0,0 -950,0,1380,0,1,5836,1930,0,0 -0,1070,1420,0,1,5836,1930,0,0 -950,1280,1480,0,1,5836,1930,0,0 -0,0,0,1480,1,5876,1930,0,0 -940,0,0,1550,1,5876,1930,0,0 -0,1070,0,1550,1,5876,1930,0,0 -940,1280,0,1620,1,5876,1930,0,0 -0,0,1240,1620,1,5876,1930,0,0 -940,0,1380,1620,1,5876,1930,0,0 -0,1070,1440,1660,1,5876,1930,0,0 -950,1290,1490,1680,1,1780,2080,0,0 -0,0,0,0,5656,5876,1930,0,0 -950,0,0,1,5676,5876,1930,0,0 -0,1070,0,1,5676,5876,1930,0,0 -940,1280,0,1,1580,6036,1930,0,0 -0,0,1240,1,1580,6036,1930,0,0 -940,0,1400,1,1580,6036,1930,0,0 -0,1060,1440,1,1580,6036,1930,0,0 -950,1280,1480,0,1780,6056,1930,0,0 -0,0,0,1420,1790,6056,1930,0,0 -950,0,1,1400,1770,6056,1930,0,0 -0,1070,1,1400,1770,6056,1930,0,0 -950,1280,0,1630,1850,6091,1940,0,0 -0,0,1290,1650,1850,6091,1940,0,0 -950,0,1400,1670,1850,6091,1940,0,0 -0,1100,1460,1670,1850,6091,1940,0,0 +0,0,0,0,0,0,0,0,0 +900,0,0,0,0,0,0,0,0 +0,1050,0,0,0,0,0,0,0 +920,1240,0,0,0,0,0,0,0 +0,0,1240,0,0,0,0,0,0 +940,0,1350,0,0,0,0,0,0 +0,1050,1400,0,0,0,0,0,0 +950,1280,1460,0,0,0,0,0,0 +0,0,0,1380,0,0,0,0,0 +920,0,0,1510,0,0,0,0,0 +0,1050,0,1510,0,0,0,0,0 +950,1280,0,1600,0,0,0,0,0 +0,0,1220,1600,0,0,0,0,0 +940,0,1380,1600,0,0,0,0,0 +0,1050,1400,1600,0,0,0,0,0 +950,1290,1490,1630,0,0,0,0,0 +0,0,0,0,1550,0,0,0,0 +950,0,0,0,1670,0,0,0,0 +0,1050,0,0,1700,0,0,0,0 +950,1280,0,0,1730,0,0,0,0 +0,0,1240,0,1730,0,0,0,0 +940,0,1400,1,1600,0,0,0,0 +0,1050,1400,1,1600,0,0,0,0 +930,1280,1480,1,1600,0,0,0,0 +0,0,0,5460,1600,0,0,0,0 +950,0,0,5626,1620,0,0,0,0 +0,1070,0,5626,1620,0,0,0,0 +940,1280,0,5696,1620,0,0,0,0 +0,0,1260,5706,1620,0,0,0,0 +950,0,1400,5746,1620,0,0,0,0 +0,1070,1440,5746,1620,0,0,0,0 +950,1290,1480,5746,1620,0,0,0,0 +0,0,0,0,0,1700,0,0,0 +940,0,0,0,0,1830,0,0,0 +0,1050,0,0,0,1840,0,0,0 +940,1260,0,0,0,1760,0,0,0 +0,0,1240,0,0,1880,0,0,0 +940,0,1380,0,1,1780,0,0,0 +0,1060,1400,0,1,1780,0,0,0 +940,1260,1440,0,1,1780,0,0,0 +0,0,0,1400,1,1780,0,0,0 +940,0,0,1500,1,1780,0,0,0 +0,1060,0,1540,1,1780,0,0,0 +940,1280,0,1600,1,1780,0,0,0 +0,0,1240,1600,1,1780,0,0,0 +940,0,1400,1640,1,1780,0,0,0 +0,1060,1430,1640,1,1780,0,0,0 +940,1260,1480,1660,1,1780,0,0,0 +0,0,0,0,5646,1780,0,0,0 +940,0,0,0,5796,1800,0,0,0 +0,1060,0,0,5796,1800,0,0,0 +940,1260,0,0,5856,1800,0,0,0 +0,0,1240,0,5856,1800,0,0,0 +940,0,1400,0,5866,1800,0,0,0 +0,1060,1420,0,5866,1800,0,0,0 +940,1280,1480,0,5876,1800,0,0,0 +0,0,0,1390,5876,1800,0,0,0 +940,0,0,1540,5896,1800,0,0,0 +0,1050,0,1540,5896,1800,0,0,0 +940,1260,0,1660,5916,1800,0,0,0 +0,0,1240,1660,5916,1800,0,0,0 +950,0,1400,1670,5926,1800,0,0,0 +0,1060,1420,1670,5926,1800,0,0,0 +950,1260,1460,1670,5926,1800,0,0,0 +0,0,0,0,0,0,1830,0,0 +930,0,0,0,0,0,1830,0,0 +0,1050,0,0,0,0,1950,0,0 +940,1280,0,0,0,0,1980,0,0 +0,0,1240,0,0,0,1980,0,0 +940,0,1380,0,0,0,2000,0,0 +0,1060,1420,0,0,0,2000,0,0 +940,1260,1440,0,0,0,2000,0,0 +0,0,0,1390,0,0,2000,0,0 +940,0,0,1530,0,0,2000,0,0 +0,1060,0,1540,0,0,2000,0,0 +940,1260,0,1600,0,1,1870,0,0 +0,0,1240,1620,0,0,2000,0,0 +940,0,1410,1620,0,1,1900,0,0 +0,1060,1420,1620,0,1,1900,0,0 +940,1260,1460,1640,0,1,1900,0,0 +0,0,0,0,1570,1,1900,0,0 +950,0,0,0,1700,1,1900,0,0 +0,1060,0,0,1710,1,1900,0,0 +940,1280,0,0,1750,1,1900,0,0 +0,0,1260,0,1750,1,1900,0,0 +940,0,1400,0,1770,1,1900,0,0 +0,1060,1420,0,1770,1,1900,0,0 +950,1280,1480,0,1810,1,1900,0,0 +0,0,0,1400,1800,1,1910,0,0 +950,0,0,1560,1830,1,1920,0,0 +0,1060,0,1580,1830,1,1920,0,0 +940,1280,0,1630,1830,1,1920,0,0 +0,0,1260,1630,1830,1,1920,0,0 +950,0,1420,1650,1840,1,1920,0,0 +0,1070,1430,1650,1840,1,1920,0,0 +950,1280,1480,1680,1850,1,1920,0,0 +0,0,0,0,0,5776,1930,0,0 +940,0,0,0,0,5896,1930,0,0 +0,1070,0,0,1,5816,1930,0,0 +950,1280,0,0,1,5836,1930,0,0 +0,0,1240,0,1,5836,1930,0,0 +950,0,1380,0,1,5836,1930,0,0 +0,1070,1420,0,1,5836,1930,0,0 +950,1280,1480,0,1,5836,1930,0,0 +0,0,0,1480,1,5876,1930,0,0 +940,0,0,1550,1,5876,1930,0,0 +0,1070,0,1550,1,5876,1930,0,0 +940,1280,0,1620,1,5876,1930,0,0 +0,0,1240,1620,1,5876,1930,0,0 +940,0,1380,1620,1,5876,1930,0,0 +0,1070,1440,1660,1,5876,1930,0,0 +950,1290,1490,1680,1,1780,2080,0,0 +0,0,0,0,5656,5876,1930,0,0 +950,0,0,1,5676,5876,1930,0,0 +0,1070,0,1,5676,5876,1930,0,0 +940,1280,0,1,1580,6036,1930,0,0 +0,0,1240,1,1580,6036,1930,0,0 +940,0,1400,1,1580,6036,1930,0,0 +0,1060,1440,1,1580,6036,1930,0,0 +950,1280,1480,0,1780,6056,1930,0,0 +0,0,0,1420,1790,6056,1930,0,0 +950,0,1,1400,1770,6056,1930,0,0 +0,1070,1,1400,1770,6056,1930,0,0 +950,1280,0,1630,1850,6091,1940,0,0 +0,0,1290,1650,1850,6091,1940,0,0 +950,0,1400,1670,1850,6091,1940,0,0 +0,1100,1460,1670,1850,6091,1940,0,0 960,1320,1570,1760,1980,1,1940,0,0 \ No newline at end of file diff --git a/conf/fast_128k_9dot_dac.txt b/conf/fast_128k_9dot_dac.txt index f689f95..32bab75 100644 --- a/conf/fast_128k_9dot_dac.txt +++ b/conf/fast_128k_9dot_dac.txt @@ -1,512 +1,512 @@ -0,0,0,0,0,0,0,0,0 -950,0,0,0,0,0,0,0,0 -0,1070,0,0,0,0,0,0,0 -970,1300,0,0,0,0,0,0,0 -0,0,1240,0,0,0,0,0,0 -970,0,1410,0,0,0,0,0,0 -0,1090,1450,0,0,0,0,0,0 -970,1320,1500,0,0,0,0,0,0 -0,0,0,1440,0,0,0,0,0 -970,0,0,1540,0,0,0,0,0 -0,1090,0,1560,0,0,0,0,0 -970,1320,0,1630,0,0,0,0,0 -0,0,1250,1630,0,0,0,0,0 -970,0,1430,1660,0,0,0,0,0 -0,1090,1460,1660,0,0,0,0,0 -990,1340,1540,1700,0,0,0,0,0 -0,0,0,0,1580,0,0,0,0 -970,0,0,0,1700,0,0,0,0 -0,1090,0,0,1700,0,0,0,0 -970,1320,0,0,1770,0,0,0,0 -0,0,1300,0,1770,0,0,0,0 -970,0,1430,0,1770,0,0,0,0 -0,1090,1460,0,1800,0,0,0,0 -990,1340,1540,0,1830,0,0,0,0 -0,0,0,1440,1830,0,0,0,0 -970,0,0,1560,1830,0,0,0,0 -0,1090,0,1590,1830,0,0,0,0 -990,1340,0,1650,1840,0,0,0,0 -0,0,1300,1680,1840,0,0,0,0 -990,0,1440,1680,1840,0,0,0,0 -0,1120,1480,1680,1840,0,0,0,0 -990,1340,1540,1720,1860,0,0,0,0 -0,0,0,0,0,1720,0,0,0 -970,0,0,0,0,1860,0,0,0 -0,1090,0,0,0,1860,0,0,0 -990,1340,0,0,0,1900,0,0,0 -0,0,1300,0,0,1900,0,0,0 -990,0,1430,0,0,1900,0,0,0 -0,1090,1460,0,0,1920,0,0,0 -990,1340,1540,0,0,1920,0,0,0 -0,0,0,1440,0,1920,0,0,0 -990,0,0,1600,0,1940,0,0,0 -0,1120,0,1600,0,1940,0,0,0 -990,1320,0,1660,0,1940,0,0,0 -0,0,1260,1660,0,1960,0,0,0 -990,0,1460,1700,0,1960,0,0,0 -0,1120,1480,1700,0,1980,0,0,0 -990,1340,1540,1720,0,1980,0,0,0 -0,0,0,0,1570,1980,0,0,0 -990,0,0,0,1710,2010,0,0,0 -0,1120,0,0,1730,2010,0,0,0 -990,1340,0,0,1800,2010,0,0,0 -0,0,1260,0,1780,2010,0,0,0 -990,0,1460,0,1820,2010,0,0,0 -0,1120,1500,0,1830,2010,0,0,0 -990,1340,1540,0,1850,2020,0,0,0 -0,0,0,1480,1880,2020,0,0,0 -990,0,0,1600,1880,2020,0,0,0 -0,1120,0,1620,1880,2020,0,0,0 -990,1340,0,1670,1880,2020,0,0,0 -0,0,1280,1670,1880,2020,0,0,0 -990,0,1440,1710,5976,1820,0,0,0 -0,1120,1500,1740,5976,1820,0,0,0 -990,1340,1540,1740,5976,1820,0,0,0 -0,0,0,0,0,0,1820,0,0 -970,0,0,0,0,0,1960,0,0 -0,1120,0,0,0,0,1980,0,0 -990,1320,0,0,0,0,2020,0,0 -0,0,1260,0,0,0,2020,0,0 -990,0,1440,0,0,0,2060,0,0 -0,1120,1500,0,0,0,2060,0,0 -990,1340,1540,0,0,0,2060,0,0 -0,0,0,1480,0,0,2060,0,0 -990,0,0,1580,0,0,2080,0,0 -0,1120,0,1620,0,0,2080,0,0 -990,1320,0,1680,0,0,2080,0,0 -0,0,1260,1680,0,0,2080,0,0 -990,0,1480,1700,0,0,2100,0,0 -0,1120,1500,1700,0,0,2100,0,0 -990,1340,1540,1720,0,0,2100,0,0 -0,0,0,0,1700,1,1940,0,0 -990,0,0,0,1740,1,1940,0,0 -0,1120,0,0,1760,1,1940,0,0 -990,1320,0,0,1780,1,1940,0,0 -0,0,1320,0,1800,1,1940,0,0 -990,0,1480,0,1830,1,1940,0,0 -0,1120,1500,0,1840,1,1940,0,0 -990,1340,1540,0,1860,1,1940,0,0 -0,0,0,1440,1860,1,1940,0,0 -990,0,0,1580,1860,1,1940,0,0 -0,1120,0,1600,1860,1,1940,0,0 -990,1320,0,1660,1860,1,1940,0,0 -0,0,1240,1660,1860,1,1940,0,0 -990,1,1320,1660,1860,1,1940,0,0 -0,1120,1500,1660,1860,1,1940,0,0 -990,1340,1540,1660,1860,1,1940,0,0 -0,0,0,0,0,5776,1940,0,0 -990,0,0,0,0,5956,1940,0,0 -0,1120,0,0,0,5956,1940,0,0 -990,1320,0,0,0,5996,1940,0,0 -0,0,1240,0,0,5996,1940,0,0 -990,0,1440,0,0,5996,1940,0,0 -0,1120,1500,0,0,5996,1940,0,0 -990,1340,1540,0,0,5996,1940,0,0 -0,0,0,1440,0,5996,1940,0,0 -990,0,0,1600,0,5996,1940,0,0 -0,1120,0,1630,0,5996,1940,0,0 -990,1320,0,1650,0,5996,1940,0,0 -0,0,1240,1660,0,5996,1940,0,0 -990,0,1460,1660,0,5996,1940,0,0 -0,1120,1500,1680,0,5996,1940,0,0 -990,1340,1540,1680,0,5996,1940,0,0 -0,0,0,0,5656,5876,1940,0,0 -990,0,0,0,5676,5876,1940,0,0 -0,1120,0,0,5676,5876,1940,0,0 -990,1320,0,1,1580,6036,1940,0,0 -0,0,1240,1,1580,6036,1940,0,0 -990,0,1460,1,1580,6036,1940,0,0 -0,1120,1500,1,1580,6036,1940,0,0 -990,1340,1540,1,1600,6036,1940,0,0 -0,0,0,1420,1800,6056,1940,0,0 -990,0,1,1400,1700,6065,1940,0,0 -0,1120,1,1460,1700,6065,1940,0,0 -990,1320,1,1500,1700,6065,1940,0,0 -0,0,1320,1660,1860,6091,1940,0,0 -990,0,1400,1680,1860,6091,1940,0,0 -0,1120,1480,1680,1880,6091,1940,0,0 -990,1340,1540,1680,1880,6091,1940,0,0 -0,0,0,0,0,0,0,2000,0 -990,0,0,0,0,0,0,2000,0 -0,1120,0,0,0,0,0,2000,0 -990,1320,0,0,0,0,0,2000,0 -0,0,1240,0,0,0,0,2000,0 -990,0,1440,0,0,0,0,2180,0 -0,1120,1500,0,0,0,0,2180,0 -990,1340,1540,0,0,0,0,2180,0 -0,0,0,1400,0,0,0,2180,0 -990,0,0,1560,0,0,0,2180,0 -0,1120,0,1600,0,0,0,2180,0 -990,1320,0,1660,0,0,0,2180,0 -0,0,1240,1680,0,0,0,2180,0 -990,0,1440,1680,0,0,0,2200,0 -0,1120,1500,1680,0,0,0,2200,0 -990,1340,1540,1700,0,0,0,2200,0 -0,0,0,0,1600,0,0,2200,0 -990,0,0,0,1720,0,0,2200,0 -0,1120,0,0,1720,0,0,2200,0 -990,1320,0,0,1740,0,0,2200,0 -0,0,1240,0,1760,0,0,2200,0 -990,0,1480,0,1780,0,0,2200,0 -0,1120,1500,0,1780,0,1,2040,0 -990,1340,1540,0,1820,0,1,2040,0 -0,0,0,1420,1840,0,1,2040,0 -990,0,0,1560,1860,0,1,2040,0 -0,1120,0,1600,1880,0,1,2040,0 -990,1320,0,1620,1900,0,1,2040,0 -0,0,1240,1660,1900,0,1,2040,0 -990,0,1440,1680,1900,0,1,2040,0 -0,1120,1500,1700,1900,0,1,2040,0 -990,1340,1540,1720,1900,0,1,2040,0 -0,0,0,0,0,1720,1,2040,0 -990,0,0,0,0,1880,1,2040,0 -0,1120,0,0,0,1880,1,2040,0 -990,1320,0,0,0,1900,1,2040,0 -0,0,1240,0,0,1900,1,2040,0 -990,0,1480,0,0,1900,1,2040,0 -0,1120,1500,0,0,1900,1,2040,0 -990,1340,1540,0,0,1900,1,2040,0 -0,0,0,1400,0,1980,1,2040,0 -990,0,0,1600,0,1980,1,2040,0 -0,1120,0,1600,0,1980,1,2040,0 -990,1320,0,1660,0,1980,1,2040,0 -0,0,1260,1660,0,1980,1,2040,0 -990,0,1440,1700,0,1980,1,2040,0 -0,1120,1500,1700,0,1980,1,2040,0 -990,1340,1540,1720,0,1980,1,2040,0 -0,0,0,0,1600,2040,1,2040,0 -990,0,0,0,1740,2040,1,2080,0 -0,1120,0,0,1800,2040,1,2080,0 -990,1320,0,0,1800,2040,1,2080,0 -0,0,1260,0,1800,2040,1,2080,0 -990,0,1440,0,1880,2040,1,2080,0 -0,1120,1500,0,1880,2040,1,2080,0 -990,1340,1540,0,1880,2040,1,2080,0 -0,0,0,1440,1880,2040,1,2080,0 -990,0,0,1620,1880,2040,1,2080,0 -0,1120,0,1640,1880,2040,1,2080,0 -990,1320,0,1660,1880,2040,1,2080,0 -0,0,1260,1680,1880,2040,1,2080,0 -990,0,1460,1680,1880,2040,1,2080,0 -0,1120,1500,1680,1880,2040,1,2080,0 -990,1340,1540,1680,1880,2040,1,2080,0 -0,0,0,0,0,0,5900,2080,0 -990,0,0,0,0,0,6040,2080,0 -0,1120,0,0,0,0,6040,2080,0 -990,1320,0,0,0,0,6040,2080,0 -0,0,1260,0,0,0,6040,2080,0 -990,0,1440,0,0,0,6040,2080,0 -0,1120,1500,0,0,0,6040,2080,0 -990,1340,1540,0,0,0,6040,2080,0 -0,0,0,1440,0,0,6040,2080,0 -990,0,0,1580,0,1,5960,2120,0 -0,1120,0,1600,0,1,5960,2120,0 -990,1320,0,1640,0,1,5960,2120,0 -0,0,1260,1660,0,1,5960,2120,0 -990,0,1440,1660,0,1,6020,2120,0 -0,1120,1500,1700,0,1,6020,2120,0 -990,1340,1540,1720,0,1,6020,2120,0 -0,0,0,0,1600,1,6020,2120,0 -990,0,0,0,1740,1,6020,2120,0 -0,1120,0,0,1760,1,6020,2120,0 -990,1320,0,0,1800,1,6020,2120,0 -0,0,1260,0,1800,1,6020,2120,0 -990,0,1440,0,1800,1,6020,2120,0 -0,1120,1500,0,1800,1,6020,2120,0 -990,1340,1540,0,1800,1,6020,2120,0 -0,0,0,1400,1820,1,6020,2120,0 -990,0,0,1560,1860,1,6020,2120,0 -0,1120,0,1580,1860,1,6020,2120,0 -990,1320,0,1620,1860,1,6020,2120,0 -0,0,1260,1660,1860,1,6020,2120,0 -990,0,1440,5800,1860,1,6020,2120,0 -0,1120,1500,5800,1860,1,6020,2120,0 -990,1340,1540,5820,1860,1,6020,2120,0 -0,0,0,0,0,5790,6020,2120,0 -990,0,0,0,0,5860,6020,2120,0 -0,1120,0,0,0,5880,6020,2120,0 -990,1320,0,0,0,5900,6020,2120,0 -0,0,1260,0,0,5920,6020,2120,0 -990,0,1440,0,0,5940,6020,2120,0 -0,1120,1500,0,0,5960,6020,2120,0 -990,1340,1540,0,0,5980,6020,2120,0 -0,0,0,1380,1,5840,6020,2120,0 -990,0,0,1540,1,5840,6020,2120,0 -0,1120,0,1560,1,5840,6020,2120,0 -990,1320,0,1580,1,5840,6020,2120,0 -0,0,1260,1660,1,5840,6020,2120,0 -990,0,1420,1660,1,5840,6020,2120,0 -0,1120,1500,1700,1,5840,6020,2120,0 -990,1340,1540,1720,1,5840,6020,2120,0 -0,0,0,0,5600,5840,6020,2120,0 -990,0,0,1,5680,5900,6060,2120,0 -0,1120,0,1,5680,5900,6060,2120,0 -990,1320,0,1,5680,5900,6060,2120,0 -0,0,1260,1,5680,5900,6060,2120,0 -990,0,1440,1,5680,5900,6060,2120,0 -0,1120,1500,1,5680,5900,6060,2120,0 -990,1340,1540,1,5680,5900,6060,2120,0 -0,0,0,5520,5760,5900,6060,2120,0 -990,0,0,5640,5780,5900,6100,2120,0 -0,1120,0,5680,5780,5900,6100,2120,0 -990,1320,0,5680,5780,5900,6100,2120,0 -0,0,5430,5680,5780,5900,6100,2120,0 -990,1,5460,5680,5780,5900,6100,2120,0 -0,5216,5460,5680,5780,5900,6100,2120,0 -990,1360,1640,1860,2020,2180,1,2100,0 -0,0,0,0,0,0,0,0,2100 -990,0,0,0,0,0,0,0,2100 -0,1120,0,0,0,0,0,0,2220 -990,1320,0,0,0,0,0,0,2260 -0,0,1260,0,0,0,0,0,2260 -990,0,1440,0,0,0,0,0,2300 -0,1120,1500,0,0,0,0,0,2300 -990,1340,1540,0,0,0,0,0,2300 -0,0,0,1420,0,0,0,0,2300 -990,0,0,1580,0,0,0,0,2300 -0,1120,0,1600,0,0,0,0,2300 -990,1320,0,1660,0,0,0,1,2200 -0,0,1260,1660,0,0,0,1,2200 -990,0,1440,1680,0,0,0,1,2200 -0,1120,1500,1700,0,0,0,1,2200 -990,1340,1540,1720,0,0,0,1,2200 -0,0,0,0,1480,0,0,1,2200 -990,0,0,0,1740,0,0,1,2200 -0,1120,0,0,1760,0,0,1,2200 -990,1320,0,0,1780,0,0,1,2200 -0,0,1260,0,1800,0,0,1,2200 -990,0,1440,0,1820,0,0,1,2200 -0,1120,1500,0,1840,0,0,1,2200 -990,1340,1540,0,1860,0,0,1,2200 -0,0,0,1440,1860,0,0,1,2200 -990,0,0,1620,1880,0,0,1,2200 -0,1120,0,1620,1880,0,0,1,2200 -990,1320,0,1660,1880,0,0,1,2200 -0,0,1260,1680,1880,0,0,1,2200 -990,0,1460,1700,1880,0,0,1,2200 -0,1120,1500,1720,1880,0,0,1,2200 -990,1340,1540,1740,1880,0,0,1,2200 -0,0,0,0,0,1740,0,1,2200 -990,0,0,0,0,1860,0,1,2200 -0,1120,0,0,0,1860,0,1,2200 -990,1320,0,0,0,1880,0,1,2200 -0,0,1260,0,0,1880,0,1,2200 -990,0,1440,0,0,1960,0,1,2200 -0,1120,1500,0,0,1960,0,1,2200 -990,1340,1540,0,0,1960,0,1,2200 -0,0,0,1440,0,1960,0,1,2200 -990,0,0,1580,0,1980,0,1,2200 -0,1120,0,1600,0,1980,0,1,2200 -990,1320,0,1660,0,1980,0,1,2200 -0,0,1260,1660,0,1980,0,1,2200 -990,0,1440,1680,0,2020,0,1,2200 -0,1120,1500,1700,0,2020,0,1,2200 -990,1340,1540,1720,0,2020,0,1,2200 -0,0,0,0,1580,2040,0,1,2200 -990,0,0,0,5820,1860,0,1,2200 -0,1120,0,0,5860,1860,0,1,2200 -990,1320,0,0,5880,1860,0,1,2200 -0,0,1260,0,5900,1860,0,1,2200 -990,0,1440,0,5920,1860,0,1,2200 -0,1120,1500,0,5920,1860,0,1,2200 -990,1340,1540,0,5920,1860,0,1,2200 -0,0,0,1400,5940,1860,0,1,2200 -990,0,0,1600,5940,1860,0,1,2200 -0,1120,0,1620,5940,1860,0,1,2200 -990,1320,0,1640,5940,1860,0,1,2200 -0,0,1260,1660,5960,1860,0,1,2200 -990,0,1420,1680,5960,1860,0,1,2200 -0,1120,1500,1700,5960,1860,0,1,2200 -990,1340,1540,1720,5960,1860,0,1,2200 -0,0,0,0,0,0,1880,1,2200 -990,0,0,0,0,0,2020,1,2200 -0,1120,0,0,0,0,2020,1,2200 -990,1320,0,0,0,0,2060,1,2200 -0,0,1260,0,0,0,2060,1,2200 -990,0,1440,0,0,0,2080,1,2200 -0,1120,1500,0,0,0,2080,1,2200 -990,1340,1540,0,0,0,2080,1,2200 -0,0,0,1440,0,0,2080,1,2200 -990,0,0,1580,0,0,2080,1,2200 -0,1120,0,1620,0,0,2080,1,2200 -990,1320,0,1640,0,0,2080,1,2200 -0,0,1260,1660,0,0,2080,1,2200 -990,0,1440,1680,0,0,2120,1,2200 -0,1120,1500,1700,0,0,2120,1,2200 -990,1340,1540,1720,0,0,2120,1,2200 -0,0,0,0,1600,0,2120,1,2200 -990,0,0,0,1800,0,2160,1,2200 -0,1120,0,0,1820,0,2160,1,2200 -990,1320,0,0,1860,0,2160,1,2200 -0,0,1260,0,1860,0,2160,1,2200 -990,0,1460,0,1860,0,2160,1,2200 -0,1120,1500,0,1860,0,2160,1,2200 -990,1340,1540,0,1860,0,2160,1,2200 -0,0,0,1420,1860,0,2160,1,2200 -990,0,0,1580,1860,1,2000,1,2200 -0,1120,0,1600,1860,1,2000,1,2200 -990,1320,0,1660,1860,1,2000,1,2200 -0,0,1260,1660,1860,1,2000,1,2200 -990,0,1460,1700,1900,1,2000,1,2200 -0,1120,1500,1760,1900,1,2000,1,2200 -990,1340,1540,1780,1900,1,2000,1,2200 -0,0,0,0,0,5840,2000,1,2200 -990,0,0,0,1,5870,2000,1,2200 -0,1120,0,0,1,5870,2000,1,2200 -990,1320,0,0,1,5870,2000,1,2220 -0,0,1260,0,1,5870,2000,1,2220 -990,0,1480,0,1,5880,2000,1,2220 -0,1120,1500,0,1,5880,2000,1,2220 -990,1340,1540,0,1,5900,2000,1,2220 -0,0,0,1440,1,5900,2000,1,2220 -990,0,0,1600,1,5900,2000,1,2220 -0,1120,0,1600,1,5900,2000,1,2220 -990,1340,0,1660,1,5920,2000,1,2220 -0,0,1260,1660,1,5920,2000,1,2220 -990,0,1480,1700,1,5920,2000,1,2220 -0,1120,1500,1720,1,5920,2000,1,2220 -990,1340,1540,1740,1,5920,2000,1,2220 -0,0,0,0,5680,5920,2000,1,2220 -990,0,0,1,5700,5920,2000,1,2220 -0,1120,0,1,5700,5920,2000,1,2220 -990,1320,0,1,5700,5920,2000,1,2220 -0,0,1260,1,5700,5920,2000,1,2220 -990,0,1480,1,5700,5920,2000,1,2220 -0,1120,1500,1,5700,5920,2000,1,2220 -990,1340,1540,1,5740,5920,2000,1,2220 -0,0,0,5500,5740,5920,2000,1,2220 -990,0,1,5560,5780,5920,2000,1,2220 -0,1120,1,5560,5780,5920,2000,1,2220 -990,1320,1,5580,5780,5920,2000,1,2220 -0,0,5360,5580,5780,5920,2000,1,2220 -990,1,5420,5620,5780,5960,2020,1,2240 -0,5126,5460,5620,5780,5960,2020,1,2240 -990,5420,5460,5640,5820,5980,2020,1,2240 -0,0,0,0,0,0,0,6080,2260 -990,0,0,0,0,0,1,6100,2240 -0,1120,0,0,0,0,1,6100,2240 -990,1320,0,0,0,0,1,6120,2240 -0,0,1260,0,0,0,1,6120,2240 -990,0,1440,0,0,0,1,6120,2240 -0,1120,1500,0,0,0,1,6120,2240 -990,1340,1540,0,0,0,1,6120,2240 -0,0,0,1440,0,0,1,6120,2240 -990,0,0,1620,0,0,1,6120,2240 -0,1120,0,1620,0,0,1,6120,2240 -990,1320,0,1660,0,0,1,6120,2240 -0,0,1260,1660,0,0,1,6120,2240 -990,0,1440,1680,0,0,1,6120,2240 -0,1120,1500,1700,0,0,1,6120,2240 -990,1340,1540,1740,0,0,1,6120,2240 -0,0,0,0,1600,0,1,6120,2240 -990,0,0,0,1740,0,1,6120,2240 -0,1120,0,0,1760,0,1,6120,2240 -990,1320,0,0,1800,0,1,6120,2240 -0,0,1260,0,1800,0,1,6120,2240 -990,0,1460,0,1840,0,1,6120,2240 -0,1120,1500,0,1860,0,1,6120,2240 -990,1340,1540,0,1880,0,1,6140,2240 -0,0,0,1440,1880,0,1,6140,2240 -990,0,0,1600,1880,0,1,6140,2240 -0,1120,0,1620,1880,0,1,6140,2240 -990,1320,0,1660,1880,0,1,6140,2240 -0,0,1260,1660,1880,0,1,6140,2240 -990,0,1460,1700,1900,0,1,6140,2240 -0,1120,1500,1700,1900,0,1,6140,2240 -990,1340,1540,1710,1900,0,1,6140,2240 -0,0,0,0,0,1720,1,6140,2240 -990,0,0,0,0,1920,1,6140,2240 -0,1120,0,0,0,1920,1,6140,2240 -990,1340,0,0,0,1940,1,6140,2240 -0,0,1260,0,0,1940,1,6140,2240 -990,0,1440,0,0,2000,1,6140,2240 -0,1120,1500,0,0,2000,1,6140,2240 -990,1340,1540,0,0,2020,1,6140,2240 -0,0,0,1440,0,2020,1,6140,2240 -990,0,0,1600,0,2020,1,6140,2240 -0,1120,0,1620,0,2020,1,6140,2240 -990,1320,0,1660,0,2020,1,6140,2240 -0,0,1260,1660,0,2020,1,6140,2240 -990,0,1440,1700,0,2020,1,6140,2240 -0,1120,1500,1700,0,2020,1,6140,2240 -990,1340,1540,1740,0,2020,1,6140,2240 -0,0,0,0,1560,2020,1,6140,2240 -990,0,0,0,1700,2020,1,6140,2240 -0,1120,0,0,1720,2020,1,6140,2240 -990,1340,0,0,1780,2020,1,6140,2240 -0,0,1260,0,1780,2020,1,6140,2240 -990,0,1440,0,1820,2020,1,6140,2240 -0,1120,1500,0,1820,2020,1,6140,2240 -990,1340,1540,1,1660,2020,1,6140,2240 -0,0,0,5540,5786,1800,1,6140,2240 -990,0,1,5560,5776,1820,1,6200,2240 -0,1120,1,5560,5776,1820,1,6200,2240 -990,1320,1,5560,5776,1840,1,6200,2240 -0,0,5356,5570,5776,1840,1,6200,2240 -990,1,5396,5600,5786,1840,1,6200,2240 -0,5200,5435,5600,5786,1840,1,6200,2240 -990,5390,5435,5600,5786,1840,1,6200,2240 -0,0,0,0,0,0,10076,10286,2180 -990,0,0,0,0,1,5971,6220,2240 -0,1120,0,0,0,1,5971,6220,2240 -990,1320,0,0,0,1,5971,6220,2240 -0,0,1260,0,0,1,5971,6220,2240 -990,0,1440,0,0,1,5989,6220,2240 -0,1120,1500,0,0,1,5989,6220,2240 -990,1340,1540,0,0,1,5999,6220,2240 -0,0,0,1440,0,1,5999,6220,2240 -990,0,0,1580,0,1,5999,6220,2240 -0,1120,0,1600,0,1,5999,6220,2240 -990,1320,0,1660,0,1,6011,6220,2240 -0,0,1260,1660,0,1,6011,6220,2240 -990,0,1440,1680,0,1,6011,6220,2240 -0,1120,1500,1700,0,1,6011,6220,2240 -990,1340,1540,1740,0,1,6019,6220,2240 -0,0,0,0,1600,1,6019,6220,2240 -990,0,0,0,1780,1,6019,6220,2240 -0,1120,0,0,1780,1,6019,6220,2240 -990,1320,0,0,1820,1,6019,6220,2240 -0,0,1260,0,1820,1,6019,6220,2240 -990,0,1440,0,1820,1,6019,6220,2240 -0,1120,1500,0,1820,1,6019,6220,2240 -990,1340,1540,0,1860,1,6019,6220,2240 -0,0,0,1400,1860,1,6019,6220,2240 -990,0,0,1600,1860,1,6019,6220,2240 -0,1120,0,1600,1860,1,6019,6220,2240 -990,1340,0,1640,1860,1,6029,6220,2240 -0,0,1260,1660,1860,1,6029,6220,2240 -990,0,1440,1700,1860,1,6029,6220,2240 -0,1120,1480,1700,1860,1,6029,6220,2240 -990,1350,1570,1720,1920,1,6029,6220,2240 -0,0,0,0,0,9920,6029,6220,2240 -990,0,0,0,1,5810,6029,6220,2240 -0,1120,0,0,1,5810,6029,6220,2240 -990,1340,0,0,1,5820,6029,6220,2240 -0,0,1260,0,1,5820,6029,6220,2240 -990,0,1440,0,1,5820,6029,6220,2240 -0,1120,1500,0,1,5820,6029,6220,2240 -990,1340,1540,0,1,5840,6029,6220,2240 -0,0,0,1440,1,5820,6029,6220,2240 -990,0,0,1600,1,5820,6029,6220,2240 -0,1120,0,1600,1,5820,6029,6220,2240 -990,1320,0,1660,1,5820,6029,6220,2240 -0,0,1260,1660,1,5820,6029,6220,2240 -990,0,1440,1680,1,5820,6029,6220,2240 -0,1120,1500,1700,1,5820,6029,6220,2240 -990,1340,1540,1720,1,5820,6029,6220,2240 -0,0,0,0,5580,5820,6029,6220,2240 -990,0,0,1,5620,5820,6029,6220,2240 -0,1120,0,1,5620,5820,6029,6220,2240 -990,1320,0,1,5640,5820,6029,6220,2240 -0,0,1260,1,5640,5820,6029,6220,2240 -990,0,1440,1,5640,5820,6029,6220,2240 -0,1120,1500,1,5640,5820,6029,6220,2240 -990,1340,1540,1,5660,5820,6029,6220,2240 -0,0,0,5400,5660,5820,6029,6220,2240 -990,0,1,5460,5660,5820,6029,6220,2240 -0,1120,1,5460,5660,5820,6029,6220,2240 -990,1340,1,5460,5660,5820,6029,6220,2240 -0,0,0,5460,5660,5820,6029,6220,2240 -990,0,1,5460,5660,5820,6029,6220,2240 -0,1120,1,5460,5660,5820,6029,6220,2240 +0,0,0,0,0,0,0,0,0 +950,0,0,0,0,0,0,0,0 +0,1070,0,0,0,0,0,0,0 +970,1300,0,0,0,0,0,0,0 +0,0,1240,0,0,0,0,0,0 +970,0,1410,0,0,0,0,0,0 +0,1090,1450,0,0,0,0,0,0 +970,1320,1500,0,0,0,0,0,0 +0,0,0,1440,0,0,0,0,0 +970,0,0,1540,0,0,0,0,0 +0,1090,0,1560,0,0,0,0,0 +970,1320,0,1630,0,0,0,0,0 +0,0,1250,1630,0,0,0,0,0 +970,0,1430,1660,0,0,0,0,0 +0,1090,1460,1660,0,0,0,0,0 +990,1340,1540,1700,0,0,0,0,0 +0,0,0,0,1580,0,0,0,0 +970,0,0,0,1700,0,0,0,0 +0,1090,0,0,1700,0,0,0,0 +970,1320,0,0,1770,0,0,0,0 +0,0,1300,0,1770,0,0,0,0 +970,0,1430,0,1770,0,0,0,0 +0,1090,1460,0,1800,0,0,0,0 +990,1340,1540,0,1830,0,0,0,0 +0,0,0,1440,1830,0,0,0,0 +970,0,0,1560,1830,0,0,0,0 +0,1090,0,1590,1830,0,0,0,0 +990,1340,0,1650,1840,0,0,0,0 +0,0,1300,1680,1840,0,0,0,0 +990,0,1440,1680,1840,0,0,0,0 +0,1120,1480,1680,1840,0,0,0,0 +990,1340,1540,1720,1860,0,0,0,0 +0,0,0,0,0,1720,0,0,0 +970,0,0,0,0,1860,0,0,0 +0,1090,0,0,0,1860,0,0,0 +990,1340,0,0,0,1900,0,0,0 +0,0,1300,0,0,1900,0,0,0 +990,0,1430,0,0,1900,0,0,0 +0,1090,1460,0,0,1920,0,0,0 +990,1340,1540,0,0,1920,0,0,0 +0,0,0,1440,0,1920,0,0,0 +990,0,0,1600,0,1940,0,0,0 +0,1120,0,1600,0,1940,0,0,0 +990,1320,0,1660,0,1940,0,0,0 +0,0,1260,1660,0,1960,0,0,0 +990,0,1460,1700,0,1960,0,0,0 +0,1120,1480,1700,0,1980,0,0,0 +990,1340,1540,1720,0,1980,0,0,0 +0,0,0,0,1570,1980,0,0,0 +990,0,0,0,1710,2010,0,0,0 +0,1120,0,0,1730,2010,0,0,0 +990,1340,0,0,1800,2010,0,0,0 +0,0,1260,0,1780,2010,0,0,0 +990,0,1460,0,1820,2010,0,0,0 +0,1120,1500,0,1830,2010,0,0,0 +990,1340,1540,0,1850,2020,0,0,0 +0,0,0,1480,1880,2020,0,0,0 +990,0,0,1600,1880,2020,0,0,0 +0,1120,0,1620,1880,2020,0,0,0 +990,1340,0,1670,1880,2020,0,0,0 +0,0,1280,1670,1880,2020,0,0,0 +990,0,1440,1710,5976,1820,0,0,0 +0,1120,1500,1740,5976,1820,0,0,0 +990,1340,1540,1740,5976,1820,0,0,0 +0,0,0,0,0,0,1820,0,0 +970,0,0,0,0,0,1960,0,0 +0,1120,0,0,0,0,1980,0,0 +990,1320,0,0,0,0,2020,0,0 +0,0,1260,0,0,0,2020,0,0 +990,0,1440,0,0,0,2060,0,0 +0,1120,1500,0,0,0,2060,0,0 +990,1340,1540,0,0,0,2060,0,0 +0,0,0,1480,0,0,2060,0,0 +990,0,0,1580,0,0,2080,0,0 +0,1120,0,1620,0,0,2080,0,0 +990,1320,0,1680,0,0,2080,0,0 +0,0,1260,1680,0,0,2080,0,0 +990,0,1480,1700,0,0,2100,0,0 +0,1120,1500,1700,0,0,2100,0,0 +990,1340,1540,1720,0,0,2100,0,0 +0,0,0,0,1700,1,1940,0,0 +990,0,0,0,1740,1,1940,0,0 +0,1120,0,0,1760,1,1940,0,0 +990,1320,0,0,1780,1,1940,0,0 +0,0,1320,0,1800,1,1940,0,0 +990,0,1480,0,1830,1,1940,0,0 +0,1120,1500,0,1840,1,1940,0,0 +990,1340,1540,0,1860,1,1940,0,0 +0,0,0,1440,1860,1,1940,0,0 +990,0,0,1580,1860,1,1940,0,0 +0,1120,0,1600,1860,1,1940,0,0 +990,1320,0,1660,1860,1,1940,0,0 +0,0,1240,1660,1860,1,1940,0,0 +990,1,1320,1660,1860,1,1940,0,0 +0,1120,1500,1660,1860,1,1940,0,0 +990,1340,1540,1660,1860,1,1940,0,0 +0,0,0,0,0,5776,1940,0,0 +990,0,0,0,0,5956,1940,0,0 +0,1120,0,0,0,5956,1940,0,0 +990,1320,0,0,0,5996,1940,0,0 +0,0,1240,0,0,5996,1940,0,0 +990,0,1440,0,0,5996,1940,0,0 +0,1120,1500,0,0,5996,1940,0,0 +990,1340,1540,0,0,5996,1940,0,0 +0,0,0,1440,0,5996,1940,0,0 +990,0,0,1600,0,5996,1940,0,0 +0,1120,0,1630,0,5996,1940,0,0 +990,1320,0,1650,0,5996,1940,0,0 +0,0,1240,1660,0,5996,1940,0,0 +990,0,1460,1660,0,5996,1940,0,0 +0,1120,1500,1680,0,5996,1940,0,0 +990,1340,1540,1680,0,5996,1940,0,0 +0,0,0,0,5656,5876,1940,0,0 +990,0,0,0,5676,5876,1940,0,0 +0,1120,0,0,5676,5876,1940,0,0 +990,1320,0,1,1580,6036,1940,0,0 +0,0,1240,1,1580,6036,1940,0,0 +990,0,1460,1,1580,6036,1940,0,0 +0,1120,1500,1,1580,6036,1940,0,0 +990,1340,1540,1,1600,6036,1940,0,0 +0,0,0,1420,1800,6056,1940,0,0 +990,0,1,1400,1700,6065,1940,0,0 +0,1120,1,1460,1700,6065,1940,0,0 +990,1320,1,1500,1700,6065,1940,0,0 +0,0,1320,1660,1860,6091,1940,0,0 +990,0,1400,1680,1860,6091,1940,0,0 +0,1120,1480,1680,1880,6091,1940,0,0 +990,1340,1540,1680,1880,6091,1940,0,0 +0,0,0,0,0,0,0,2000,0 +990,0,0,0,0,0,0,2000,0 +0,1120,0,0,0,0,0,2000,0 +990,1320,0,0,0,0,0,2000,0 +0,0,1240,0,0,0,0,2000,0 +990,0,1440,0,0,0,0,2180,0 +0,1120,1500,0,0,0,0,2180,0 +990,1340,1540,0,0,0,0,2180,0 +0,0,0,1400,0,0,0,2180,0 +990,0,0,1560,0,0,0,2180,0 +0,1120,0,1600,0,0,0,2180,0 +990,1320,0,1660,0,0,0,2180,0 +0,0,1240,1680,0,0,0,2180,0 +990,0,1440,1680,0,0,0,2200,0 +0,1120,1500,1680,0,0,0,2200,0 +990,1340,1540,1700,0,0,0,2200,0 +0,0,0,0,1600,0,0,2200,0 +990,0,0,0,1720,0,0,2200,0 +0,1120,0,0,1720,0,0,2200,0 +990,1320,0,0,1740,0,0,2200,0 +0,0,1240,0,1760,0,0,2200,0 +990,0,1480,0,1780,0,0,2200,0 +0,1120,1500,0,1780,0,1,2040,0 +990,1340,1540,0,1820,0,1,2040,0 +0,0,0,1420,1840,0,1,2040,0 +990,0,0,1560,1860,0,1,2040,0 +0,1120,0,1600,1880,0,1,2040,0 +990,1320,0,1620,1900,0,1,2040,0 +0,0,1240,1660,1900,0,1,2040,0 +990,0,1440,1680,1900,0,1,2040,0 +0,1120,1500,1700,1900,0,1,2040,0 +990,1340,1540,1720,1900,0,1,2040,0 +0,0,0,0,0,1720,1,2040,0 +990,0,0,0,0,1880,1,2040,0 +0,1120,0,0,0,1880,1,2040,0 +990,1320,0,0,0,1900,1,2040,0 +0,0,1240,0,0,1900,1,2040,0 +990,0,1480,0,0,1900,1,2040,0 +0,1120,1500,0,0,1900,1,2040,0 +990,1340,1540,0,0,1900,1,2040,0 +0,0,0,1400,0,1980,1,2040,0 +990,0,0,1600,0,1980,1,2040,0 +0,1120,0,1600,0,1980,1,2040,0 +990,1320,0,1660,0,1980,1,2040,0 +0,0,1260,1660,0,1980,1,2040,0 +990,0,1440,1700,0,1980,1,2040,0 +0,1120,1500,1700,0,1980,1,2040,0 +990,1340,1540,1720,0,1980,1,2040,0 +0,0,0,0,1600,2040,1,2040,0 +990,0,0,0,1740,2040,1,2080,0 +0,1120,0,0,1800,2040,1,2080,0 +990,1320,0,0,1800,2040,1,2080,0 +0,0,1260,0,1800,2040,1,2080,0 +990,0,1440,0,1880,2040,1,2080,0 +0,1120,1500,0,1880,2040,1,2080,0 +990,1340,1540,0,1880,2040,1,2080,0 +0,0,0,1440,1880,2040,1,2080,0 +990,0,0,1620,1880,2040,1,2080,0 +0,1120,0,1640,1880,2040,1,2080,0 +990,1320,0,1660,1880,2040,1,2080,0 +0,0,1260,1680,1880,2040,1,2080,0 +990,0,1460,1680,1880,2040,1,2080,0 +0,1120,1500,1680,1880,2040,1,2080,0 +990,1340,1540,1680,1880,2040,1,2080,0 +0,0,0,0,0,0,5900,2080,0 +990,0,0,0,0,0,6040,2080,0 +0,1120,0,0,0,0,6040,2080,0 +990,1320,0,0,0,0,6040,2080,0 +0,0,1260,0,0,0,6040,2080,0 +990,0,1440,0,0,0,6040,2080,0 +0,1120,1500,0,0,0,6040,2080,0 +990,1340,1540,0,0,0,6040,2080,0 +0,0,0,1440,0,0,6040,2080,0 +990,0,0,1580,0,1,5960,2120,0 +0,1120,0,1600,0,1,5960,2120,0 +990,1320,0,1640,0,1,5960,2120,0 +0,0,1260,1660,0,1,5960,2120,0 +990,0,1440,1660,0,1,6020,2120,0 +0,1120,1500,1700,0,1,6020,2120,0 +990,1340,1540,1720,0,1,6020,2120,0 +0,0,0,0,1600,1,6020,2120,0 +990,0,0,0,1740,1,6020,2120,0 +0,1120,0,0,1760,1,6020,2120,0 +990,1320,0,0,1800,1,6020,2120,0 +0,0,1260,0,1800,1,6020,2120,0 +990,0,1440,0,1800,1,6020,2120,0 +0,1120,1500,0,1800,1,6020,2120,0 +990,1340,1540,0,1800,1,6020,2120,0 +0,0,0,1400,1820,1,6020,2120,0 +990,0,0,1560,1860,1,6020,2120,0 +0,1120,0,1580,1860,1,6020,2120,0 +990,1320,0,1620,1860,1,6020,2120,0 +0,0,1260,1660,1860,1,6020,2120,0 +990,0,1440,5800,1860,1,6020,2120,0 +0,1120,1500,5800,1860,1,6020,2120,0 +990,1340,1540,5820,1860,1,6020,2120,0 +0,0,0,0,0,5790,6020,2120,0 +990,0,0,0,0,5860,6020,2120,0 +0,1120,0,0,0,5880,6020,2120,0 +990,1320,0,0,0,5900,6020,2120,0 +0,0,1260,0,0,5920,6020,2120,0 +990,0,1440,0,0,5940,6020,2120,0 +0,1120,1500,0,0,5960,6020,2120,0 +990,1340,1540,0,0,5980,6020,2120,0 +0,0,0,1380,1,5840,6020,2120,0 +990,0,0,1540,1,5840,6020,2120,0 +0,1120,0,1560,1,5840,6020,2120,0 +990,1320,0,1580,1,5840,6020,2120,0 +0,0,1260,1660,1,5840,6020,2120,0 +990,0,1420,1660,1,5840,6020,2120,0 +0,1120,1500,1700,1,5840,6020,2120,0 +990,1340,1540,1720,1,5840,6020,2120,0 +0,0,0,0,5600,5840,6020,2120,0 +990,0,0,1,5680,5900,6060,2120,0 +0,1120,0,1,5680,5900,6060,2120,0 +990,1320,0,1,5680,5900,6060,2120,0 +0,0,1260,1,5680,5900,6060,2120,0 +990,0,1440,1,5680,5900,6060,2120,0 +0,1120,1500,1,5680,5900,6060,2120,0 +990,1340,1540,1,5680,5900,6060,2120,0 +0,0,0,5520,5760,5900,6060,2120,0 +990,0,0,5640,5780,5900,6100,2120,0 +0,1120,0,5680,5780,5900,6100,2120,0 +990,1320,0,5680,5780,5900,6100,2120,0 +0,0,5430,5680,5780,5900,6100,2120,0 +990,1,5460,5680,5780,5900,6100,2120,0 +0,5216,5460,5680,5780,5900,6100,2120,0 +990,1360,1640,1860,2020,2180,1,2100,0 +0,0,0,0,0,0,0,0,2100 +990,0,0,0,0,0,0,0,2100 +0,1120,0,0,0,0,0,0,2220 +990,1320,0,0,0,0,0,0,2260 +0,0,1260,0,0,0,0,0,2260 +990,0,1440,0,0,0,0,0,2300 +0,1120,1500,0,0,0,0,0,2300 +990,1340,1540,0,0,0,0,0,2300 +0,0,0,1420,0,0,0,0,2300 +990,0,0,1580,0,0,0,0,2300 +0,1120,0,1600,0,0,0,0,2300 +990,1320,0,1660,0,0,0,1,2200 +0,0,1260,1660,0,0,0,1,2200 +990,0,1440,1680,0,0,0,1,2200 +0,1120,1500,1700,0,0,0,1,2200 +990,1340,1540,1720,0,0,0,1,2200 +0,0,0,0,1480,0,0,1,2200 +990,0,0,0,1740,0,0,1,2200 +0,1120,0,0,1760,0,0,1,2200 +990,1320,0,0,1780,0,0,1,2200 +0,0,1260,0,1800,0,0,1,2200 +990,0,1440,0,1820,0,0,1,2200 +0,1120,1500,0,1840,0,0,1,2200 +990,1340,1540,0,1860,0,0,1,2200 +0,0,0,1440,1860,0,0,1,2200 +990,0,0,1620,1880,0,0,1,2200 +0,1120,0,1620,1880,0,0,1,2200 +990,1320,0,1660,1880,0,0,1,2200 +0,0,1260,1680,1880,0,0,1,2200 +990,0,1460,1700,1880,0,0,1,2200 +0,1120,1500,1720,1880,0,0,1,2200 +990,1340,1540,1740,1880,0,0,1,2200 +0,0,0,0,0,1740,0,1,2200 +990,0,0,0,0,1860,0,1,2200 +0,1120,0,0,0,1860,0,1,2200 +990,1320,0,0,0,1880,0,1,2200 +0,0,1260,0,0,1880,0,1,2200 +990,0,1440,0,0,1960,0,1,2200 +0,1120,1500,0,0,1960,0,1,2200 +990,1340,1540,0,0,1960,0,1,2200 +0,0,0,1440,0,1960,0,1,2200 +990,0,0,1580,0,1980,0,1,2200 +0,1120,0,1600,0,1980,0,1,2200 +990,1320,0,1660,0,1980,0,1,2200 +0,0,1260,1660,0,1980,0,1,2200 +990,0,1440,1680,0,2020,0,1,2200 +0,1120,1500,1700,0,2020,0,1,2200 +990,1340,1540,1720,0,2020,0,1,2200 +0,0,0,0,1580,2040,0,1,2200 +990,0,0,0,5820,1860,0,1,2200 +0,1120,0,0,5860,1860,0,1,2200 +990,1320,0,0,5880,1860,0,1,2200 +0,0,1260,0,5900,1860,0,1,2200 +990,0,1440,0,5920,1860,0,1,2200 +0,1120,1500,0,5920,1860,0,1,2200 +990,1340,1540,0,5920,1860,0,1,2200 +0,0,0,1400,5940,1860,0,1,2200 +990,0,0,1600,5940,1860,0,1,2200 +0,1120,0,1620,5940,1860,0,1,2200 +990,1320,0,1640,5940,1860,0,1,2200 +0,0,1260,1660,5960,1860,0,1,2200 +990,0,1420,1680,5960,1860,0,1,2200 +0,1120,1500,1700,5960,1860,0,1,2200 +990,1340,1540,1720,5960,1860,0,1,2200 +0,0,0,0,0,0,1880,1,2200 +990,0,0,0,0,0,2020,1,2200 +0,1120,0,0,0,0,2020,1,2200 +990,1320,0,0,0,0,2060,1,2200 +0,0,1260,0,0,0,2060,1,2200 +990,0,1440,0,0,0,2080,1,2200 +0,1120,1500,0,0,0,2080,1,2200 +990,1340,1540,0,0,0,2080,1,2200 +0,0,0,1440,0,0,2080,1,2200 +990,0,0,1580,0,0,2080,1,2200 +0,1120,0,1620,0,0,2080,1,2200 +990,1320,0,1640,0,0,2080,1,2200 +0,0,1260,1660,0,0,2080,1,2200 +990,0,1440,1680,0,0,2120,1,2200 +0,1120,1500,1700,0,0,2120,1,2200 +990,1340,1540,1720,0,0,2120,1,2200 +0,0,0,0,1600,0,2120,1,2200 +990,0,0,0,1800,0,2160,1,2200 +0,1120,0,0,1820,0,2160,1,2200 +990,1320,0,0,1860,0,2160,1,2200 +0,0,1260,0,1860,0,2160,1,2200 +990,0,1460,0,1860,0,2160,1,2200 +0,1120,1500,0,1860,0,2160,1,2200 +990,1340,1540,0,1860,0,2160,1,2200 +0,0,0,1420,1860,0,2160,1,2200 +990,0,0,1580,1860,1,2000,1,2200 +0,1120,0,1600,1860,1,2000,1,2200 +990,1320,0,1660,1860,1,2000,1,2200 +0,0,1260,1660,1860,1,2000,1,2200 +990,0,1460,1700,1900,1,2000,1,2200 +0,1120,1500,1760,1900,1,2000,1,2200 +990,1340,1540,1780,1900,1,2000,1,2200 +0,0,0,0,0,5840,2000,1,2200 +990,0,0,0,1,5870,2000,1,2200 +0,1120,0,0,1,5870,2000,1,2200 +990,1320,0,0,1,5870,2000,1,2220 +0,0,1260,0,1,5870,2000,1,2220 +990,0,1480,0,1,5880,2000,1,2220 +0,1120,1500,0,1,5880,2000,1,2220 +990,1340,1540,0,1,5900,2000,1,2220 +0,0,0,1440,1,5900,2000,1,2220 +990,0,0,1600,1,5900,2000,1,2220 +0,1120,0,1600,1,5900,2000,1,2220 +990,1340,0,1660,1,5920,2000,1,2220 +0,0,1260,1660,1,5920,2000,1,2220 +990,0,1480,1700,1,5920,2000,1,2220 +0,1120,1500,1720,1,5920,2000,1,2220 +990,1340,1540,1740,1,5920,2000,1,2220 +0,0,0,0,5680,5920,2000,1,2220 +990,0,0,1,5700,5920,2000,1,2220 +0,1120,0,1,5700,5920,2000,1,2220 +990,1320,0,1,5700,5920,2000,1,2220 +0,0,1260,1,5700,5920,2000,1,2220 +990,0,1480,1,5700,5920,2000,1,2220 +0,1120,1500,1,5700,5920,2000,1,2220 +990,1340,1540,1,5740,5920,2000,1,2220 +0,0,0,5500,5740,5920,2000,1,2220 +990,0,1,5560,5780,5920,2000,1,2220 +0,1120,1,5560,5780,5920,2000,1,2220 +990,1320,1,5580,5780,5920,2000,1,2220 +0,0,5360,5580,5780,5920,2000,1,2220 +990,1,5420,5620,5780,5960,2020,1,2240 +0,5126,5460,5620,5780,5960,2020,1,2240 +990,5420,5460,5640,5820,5980,2020,1,2240 +0,0,0,0,0,0,0,6080,2260 +990,0,0,0,0,0,1,6100,2240 +0,1120,0,0,0,0,1,6100,2240 +990,1320,0,0,0,0,1,6120,2240 +0,0,1260,0,0,0,1,6120,2240 +990,0,1440,0,0,0,1,6120,2240 +0,1120,1500,0,0,0,1,6120,2240 +990,1340,1540,0,0,0,1,6120,2240 +0,0,0,1440,0,0,1,6120,2240 +990,0,0,1620,0,0,1,6120,2240 +0,1120,0,1620,0,0,1,6120,2240 +990,1320,0,1660,0,0,1,6120,2240 +0,0,1260,1660,0,0,1,6120,2240 +990,0,1440,1680,0,0,1,6120,2240 +0,1120,1500,1700,0,0,1,6120,2240 +990,1340,1540,1740,0,0,1,6120,2240 +0,0,0,0,1600,0,1,6120,2240 +990,0,0,0,1740,0,1,6120,2240 +0,1120,0,0,1760,0,1,6120,2240 +990,1320,0,0,1800,0,1,6120,2240 +0,0,1260,0,1800,0,1,6120,2240 +990,0,1460,0,1840,0,1,6120,2240 +0,1120,1500,0,1860,0,1,6120,2240 +990,1340,1540,0,1880,0,1,6140,2240 +0,0,0,1440,1880,0,1,6140,2240 +990,0,0,1600,1880,0,1,6140,2240 +0,1120,0,1620,1880,0,1,6140,2240 +990,1320,0,1660,1880,0,1,6140,2240 +0,0,1260,1660,1880,0,1,6140,2240 +990,0,1460,1700,1900,0,1,6140,2240 +0,1120,1500,1700,1900,0,1,6140,2240 +990,1340,1540,1710,1900,0,1,6140,2240 +0,0,0,0,0,1720,1,6140,2240 +990,0,0,0,0,1920,1,6140,2240 +0,1120,0,0,0,1920,1,6140,2240 +990,1340,0,0,0,1940,1,6140,2240 +0,0,1260,0,0,1940,1,6140,2240 +990,0,1440,0,0,2000,1,6140,2240 +0,1120,1500,0,0,2000,1,6140,2240 +990,1340,1540,0,0,2020,1,6140,2240 +0,0,0,1440,0,2020,1,6140,2240 +990,0,0,1600,0,2020,1,6140,2240 +0,1120,0,1620,0,2020,1,6140,2240 +990,1320,0,1660,0,2020,1,6140,2240 +0,0,1260,1660,0,2020,1,6140,2240 +990,0,1440,1700,0,2020,1,6140,2240 +0,1120,1500,1700,0,2020,1,6140,2240 +990,1340,1540,1740,0,2020,1,6140,2240 +0,0,0,0,1560,2020,1,6140,2240 +990,0,0,0,1700,2020,1,6140,2240 +0,1120,0,0,1720,2020,1,6140,2240 +990,1340,0,0,1780,2020,1,6140,2240 +0,0,1260,0,1780,2020,1,6140,2240 +990,0,1440,0,1820,2020,1,6140,2240 +0,1120,1500,0,1820,2020,1,6140,2240 +990,1340,1540,1,1660,2020,1,6140,2240 +0,0,0,5540,5786,1800,1,6140,2240 +990,0,1,5560,5776,1820,1,6200,2240 +0,1120,1,5560,5776,1820,1,6200,2240 +990,1320,1,5560,5776,1840,1,6200,2240 +0,0,5356,5570,5776,1840,1,6200,2240 +990,1,5396,5600,5786,1840,1,6200,2240 +0,5200,5435,5600,5786,1840,1,6200,2240 +990,5390,5435,5600,5786,1840,1,6200,2240 +0,0,0,0,0,0,10076,10286,2180 +990,0,0,0,0,1,5971,6220,2240 +0,1120,0,0,0,1,5971,6220,2240 +990,1320,0,0,0,1,5971,6220,2240 +0,0,1260,0,0,1,5971,6220,2240 +990,0,1440,0,0,1,5989,6220,2240 +0,1120,1500,0,0,1,5989,6220,2240 +990,1340,1540,0,0,1,5999,6220,2240 +0,0,0,1440,0,1,5999,6220,2240 +990,0,0,1580,0,1,5999,6220,2240 +0,1120,0,1600,0,1,5999,6220,2240 +990,1320,0,1660,0,1,6011,6220,2240 +0,0,1260,1660,0,1,6011,6220,2240 +990,0,1440,1680,0,1,6011,6220,2240 +0,1120,1500,1700,0,1,6011,6220,2240 +990,1340,1540,1740,0,1,6019,6220,2240 +0,0,0,0,1600,1,6019,6220,2240 +990,0,0,0,1780,1,6019,6220,2240 +0,1120,0,0,1780,1,6019,6220,2240 +990,1320,0,0,1820,1,6019,6220,2240 +0,0,1260,0,1820,1,6019,6220,2240 +990,0,1440,0,1820,1,6019,6220,2240 +0,1120,1500,0,1820,1,6019,6220,2240 +990,1340,1540,0,1860,1,6019,6220,2240 +0,0,0,1400,1860,1,6019,6220,2240 +990,0,0,1600,1860,1,6019,6220,2240 +0,1120,0,1600,1860,1,6019,6220,2240 +990,1340,0,1640,1860,1,6029,6220,2240 +0,0,1260,1660,1860,1,6029,6220,2240 +990,0,1440,1700,1860,1,6029,6220,2240 +0,1120,1480,1700,1860,1,6029,6220,2240 +990,1350,1570,1720,1920,1,6029,6220,2240 +0,0,0,0,0,9920,6029,6220,2240 +990,0,0,0,1,5810,6029,6220,2240 +0,1120,0,0,1,5810,6029,6220,2240 +990,1340,0,0,1,5820,6029,6220,2240 +0,0,1260,0,1,5820,6029,6220,2240 +990,0,1440,0,1,5820,6029,6220,2240 +0,1120,1500,0,1,5820,6029,6220,2240 +990,1340,1540,0,1,5840,6029,6220,2240 +0,0,0,1440,1,5820,6029,6220,2240 +990,0,0,1600,1,5820,6029,6220,2240 +0,1120,0,1600,1,5820,6029,6220,2240 +990,1320,0,1660,1,5820,6029,6220,2240 +0,0,1260,1660,1,5820,6029,6220,2240 +990,0,1440,1680,1,5820,6029,6220,2240 +0,1120,1500,1700,1,5820,6029,6220,2240 +990,1340,1540,1720,1,5820,6029,6220,2240 +0,0,0,0,5580,5820,6029,6220,2240 +990,0,0,1,5620,5820,6029,6220,2240 +0,1120,0,1,5620,5820,6029,6220,2240 +990,1320,0,1,5640,5820,6029,6220,2240 +0,0,1260,1,5640,5820,6029,6220,2240 +990,0,1440,1,5640,5820,6029,6220,2240 +0,1120,1500,1,5640,5820,6029,6220,2240 +990,1340,1540,1,5660,5820,6029,6220,2240 +0,0,0,5400,5660,5820,6029,6220,2240 +990,0,1,5460,5660,5820,6029,6220,2240 +0,1120,1,5460,5660,5820,6029,6220,2240 +990,1340,1,5460,5660,5820,6029,6220,2240 +0,0,0,5460,5660,5820,6029,6220,2240 +990,0,1,5460,5660,5820,6029,6220,2240 +0,1120,1,5460,5660,5820,6029,6220,2240 1020,1400,1660,1860,2060,2240,2350,1,2250 \ No newline at end of file diff --git a/conf/normal_128k_7dot_dac.txt b/conf/normal_128k_7dot_dac.txt index bada3d8..6e75b41 100644 --- a/conf/normal_128k_7dot_dac.txt +++ b/conf/normal_128k_7dot_dac.txt @@ -1,128 +1,128 @@ -0,0,0,0,0,0,0,0,0 -970,0,0,0,0,0,0,0,0 -0,1115,0,0,0,0,0,0,0 -5066,1180,0,0,0,0,0,0,0 -0,0,1245,0,0,0,0,0,0 -970,1,1310,0,0,0,0,0,0 -0,5211,1340,0,0,0,0,0,0 -5086,5296,1340,0,0,0,0,0,0 -0,0,0,1385,0,0,0,0,0 -970,1,0,1430,0,0,0,0,0 -0,1120,1,1450,0,0,0,0,0 -5076,1200,1,1460,0,0,0,0,0 -0,0,5356,1490,0,0,0,0,0 -980,1,5416,1490,0,0,0,0,0 -0,5256,5456,1480,0,0,0,0,0 -5086,5316,5456,1480,0,0,0,0,0 -0,0,0,0,1535,0,0,0,0 -980,1,0,0,1560,0,0,0,0 -0,1140,1,0,1580,0,0,0,0 -5076,1200,1,0,1580,0,0,0,0 -0,0,1275,1,1585,0,0,0,0 -980,1,1310,1,1585,0,0,0,0 -0,5246,1360,1,1585,0,0,0,0 -5076,5296,1360,1,1620,0,0,0,0 -0,0,0,5521,1645,0,0,0,0 -980,1,0,5546,1635,0,0,0,0 -0,1140,1,5566,1635,0,0,0,0 -5076,1200,1,5576,1635,0,0,0,0 -0,0,5406,5626,1635,0,0,0,0 -980,1,5436,5616,1635,0,0,0,0 -0,5276,5476,5596,1635,0,0,0,0 -5086,5316,5456,5596,1635,0,0,0,0 -0,0,0,0,0,1680,0,0,0 -980,1,0,0,0,1700,0,0,0 -0,1130,1,0,0,1700,0,0,0 -5076,1200,1,0,0,1720,0,0,0 -0,0,1280,1,0,1720,0,0,0 -980,1,1315,1,0,1720,0,0,0 -0,5236,1360,1,0,1740,0,0,0 -5086,5296,1360,1,0,1750,0,0,0 -0,0,0,1430,1,1750,0,0,0 -980,1,0,1460,1,1750,0,0,0 -0,1140,1,1470,1,1750,0,0,0 -5076,1200,1,1480,1,1750,0,0,0 -0,0,5396,1500,1,1760,0,0,0 -980,1,5426,1510,1,1760,0,0,0 -0,5256,5456,1510,1,1760,0,0,0 -5076,5316,5456,1510,1,1770,0,0,0 -0,0,0,0,5666,1780,0,0,0 -980,1,0,0,5676,1780,0,0,0 -0,1130,1,0,5686,1780,0,0,0 -5076,1200,1,0,5696,1780,0,0,0 -0,0,1290,1,5716,1780,0,0,0 -980,1,1330,1,5756,1780,0,0,0 -0,5236,1360,1,5756,1780,0,0,0 -5076,5296,1360,1,5756,1780,0,0,0 -0,0,0,5526,5746,1780,0,0,0 -980,1,0,5556,5756,1780,0,0,0 -0,1130,1,5586,5756,1780,0,0,0 -5076,1200,1,5586,5756,1780,0,0,0 -0,0,5386,5601,5756,1780,0,0,0 -980,1,5436,5601,5756,1780,0,0,0 -0,5246,5466,5601,5756,1780,0,0,0 -5086,5306,5476,5601,5756,1780,0,0,0 -0,0,0,0,0,0,1810,0,0 -980,1,0,0,0,0,1810,0,0 -0,1130,1,0,0,0,1840,0,0 -5076,1200,1,0,0,0,1840,0,0 -0,0,1290,1,0,0,1850,0,0 -980,1,1330,1,0,0,1850,0,0 -0,5231,1360,1,0,0,1850,0,0 -5076,5296,1360,1,0,0,1850,0,0 -0,0,0,1410,1,0,1850,0,0 -980,1,0,1440,1,0,1860,0,0 -0,1135,1,1470,1,0,1860,0,0 -5076,1200,1,1480,1,0,1870,0,0 -0,0,5381,1505,1,0,1870,0,0 -980,1,5416,1510,1,0,1870,0,0 -0,5236,5456,1510,1,0,1870,0,0 -5086,5296,5456,1510,1,0,1880,0,0 -0,0,0,0,1550,1,1880,0,0 -980,1,0,0,1570,1,1880,0,0 -0,1130,1,0,1590,1,1880,0,0 -5076,1200,1,0,1610,1,1890,0,0 -0,0,1300,1,1620,1,1890,0,0 -980,1,1330,1,1620,1,1890,0,0 -0,5236,1360,1,1630,1,1890,0,0 -5076,5296,1360,1,1640,1,1890,0,0 -0,0,0,5506,1640,1,1900,0,0 -980,1,0,5546,1640,1,1900,0,0 -0,1135,1,5556,1640,1,1900,0,0 -5076,1200,1,5556,1640,1,1900,0,0 -0,0,5386,5596,1640,1,1900,0,0 -980,1,5436,5606,1650,1,1910,0,0 -0,5226,5456,5606,1650,1,1910,0,0 -5086,5306,5466,5606,1650,1,1910,0,0 -0,0,0,0,0,5791,1910,0,0 -980,1,0,0,0,5816,1910,0,0 -0,1130,1,0,0,5816,1910,0,0 -5076,1200,1,0,0,5816,1910,0,0 -0,0,1290,1,0,5816,1910,0,0 -990,1,1320,1,0,5816,1910,0,0 -0,5226,1360,1,0,5836,1910,0,0 -5086,5306,1360,1,0,5836,1910,0,0 -0,0,0,1420,1,5846,1910,0,0 -980,1,0,1450,1,5846,1910,0,0 -0,1130,1,1450,1,5846,1910,0,0 -5076,1200,1,1480,1,5866,1910,0,0 -0,0,5386,1480,1,5866,1910,0,0 -980,1,5426,1510,1,5876,1920,0,0 -0,5236,5476,1510,1,5886,1920,0,0 -5086,5306,5456,1510,1,5886,1920,0,0 -0,0,0,0,5641,5886,1920,0,0 -980,1,0,0,5646,5886,1920,0,0 -0,1130,1,0,5676,5886,1920,0,0 -5076,1200,1,0,5696,5886,1920,0,0 -0,0,1290,1,5706,5896,1920,0,0 -980,1,1310,1,5706,5896,1920,0,0 -0,5226,1350,1,5706,5896,1920,0,0 -5086,5306,1350,1,5706,5896,1920,0,0 -0,0,0,5506,5736,5896,1920,0,0 -980,1,0,5526,5736,5896,1920,0,0 -0,1130,1,5546,5736,5896,1920,0,0 -5076,1200,1,5546,5736,5896,1920,0,0 -0,0,5386,5586,5736,5896,1920,0,0 -980,1,5406,5586,5736,5896,1920,0,0 -0,5226,5456,5606,5756,5896,1920,0,0 +0,0,0,0,0,0,0,0,0 +970,0,0,0,0,0,0,0,0 +0,1115,0,0,0,0,0,0,0 +5066,1180,0,0,0,0,0,0,0 +0,0,1245,0,0,0,0,0,0 +970,1,1310,0,0,0,0,0,0 +0,5211,1340,0,0,0,0,0,0 +5086,5296,1340,0,0,0,0,0,0 +0,0,0,1385,0,0,0,0,0 +970,1,0,1430,0,0,0,0,0 +0,1120,1,1450,0,0,0,0,0 +5076,1200,1,1460,0,0,0,0,0 +0,0,5356,1490,0,0,0,0,0 +980,1,5416,1490,0,0,0,0,0 +0,5256,5456,1480,0,0,0,0,0 +5086,5316,5456,1480,0,0,0,0,0 +0,0,0,0,1535,0,0,0,0 +980,1,0,0,1560,0,0,0,0 +0,1140,1,0,1580,0,0,0,0 +5076,1200,1,0,1580,0,0,0,0 +0,0,1275,1,1585,0,0,0,0 +980,1,1310,1,1585,0,0,0,0 +0,5246,1360,1,1585,0,0,0,0 +5076,5296,1360,1,1620,0,0,0,0 +0,0,0,5521,1645,0,0,0,0 +980,1,0,5546,1635,0,0,0,0 +0,1140,1,5566,1635,0,0,0,0 +5076,1200,1,5576,1635,0,0,0,0 +0,0,5406,5626,1635,0,0,0,0 +980,1,5436,5616,1635,0,0,0,0 +0,5276,5476,5596,1635,0,0,0,0 +5086,5316,5456,5596,1635,0,0,0,0 +0,0,0,0,0,1680,0,0,0 +980,1,0,0,0,1700,0,0,0 +0,1130,1,0,0,1700,0,0,0 +5076,1200,1,0,0,1720,0,0,0 +0,0,1280,1,0,1720,0,0,0 +980,1,1315,1,0,1720,0,0,0 +0,5236,1360,1,0,1740,0,0,0 +5086,5296,1360,1,0,1750,0,0,0 +0,0,0,1430,1,1750,0,0,0 +980,1,0,1460,1,1750,0,0,0 +0,1140,1,1470,1,1750,0,0,0 +5076,1200,1,1480,1,1750,0,0,0 +0,0,5396,1500,1,1760,0,0,0 +980,1,5426,1510,1,1760,0,0,0 +0,5256,5456,1510,1,1760,0,0,0 +5076,5316,5456,1510,1,1770,0,0,0 +0,0,0,0,5666,1780,0,0,0 +980,1,0,0,5676,1780,0,0,0 +0,1130,1,0,5686,1780,0,0,0 +5076,1200,1,0,5696,1780,0,0,0 +0,0,1290,1,5716,1780,0,0,0 +980,1,1330,1,5756,1780,0,0,0 +0,5236,1360,1,5756,1780,0,0,0 +5076,5296,1360,1,5756,1780,0,0,0 +0,0,0,5526,5746,1780,0,0,0 +980,1,0,5556,5756,1780,0,0,0 +0,1130,1,5586,5756,1780,0,0,0 +5076,1200,1,5586,5756,1780,0,0,0 +0,0,5386,5601,5756,1780,0,0,0 +980,1,5436,5601,5756,1780,0,0,0 +0,5246,5466,5601,5756,1780,0,0,0 +5086,5306,5476,5601,5756,1780,0,0,0 +0,0,0,0,0,0,1810,0,0 +980,1,0,0,0,0,1810,0,0 +0,1130,1,0,0,0,1840,0,0 +5076,1200,1,0,0,0,1840,0,0 +0,0,1290,1,0,0,1850,0,0 +980,1,1330,1,0,0,1850,0,0 +0,5231,1360,1,0,0,1850,0,0 +5076,5296,1360,1,0,0,1850,0,0 +0,0,0,1410,1,0,1850,0,0 +980,1,0,1440,1,0,1860,0,0 +0,1135,1,1470,1,0,1860,0,0 +5076,1200,1,1480,1,0,1870,0,0 +0,0,5381,1505,1,0,1870,0,0 +980,1,5416,1510,1,0,1870,0,0 +0,5236,5456,1510,1,0,1870,0,0 +5086,5296,5456,1510,1,0,1880,0,0 +0,0,0,0,1550,1,1880,0,0 +980,1,0,0,1570,1,1880,0,0 +0,1130,1,0,1590,1,1880,0,0 +5076,1200,1,0,1610,1,1890,0,0 +0,0,1300,1,1620,1,1890,0,0 +980,1,1330,1,1620,1,1890,0,0 +0,5236,1360,1,1630,1,1890,0,0 +5076,5296,1360,1,1640,1,1890,0,0 +0,0,0,5506,1640,1,1900,0,0 +980,1,0,5546,1640,1,1900,0,0 +0,1135,1,5556,1640,1,1900,0,0 +5076,1200,1,5556,1640,1,1900,0,0 +0,0,5386,5596,1640,1,1900,0,0 +980,1,5436,5606,1650,1,1910,0,0 +0,5226,5456,5606,1650,1,1910,0,0 +5086,5306,5466,5606,1650,1,1910,0,0 +0,0,0,0,0,5791,1910,0,0 +980,1,0,0,0,5816,1910,0,0 +0,1130,1,0,0,5816,1910,0,0 +5076,1200,1,0,0,5816,1910,0,0 +0,0,1290,1,0,5816,1910,0,0 +990,1,1320,1,0,5816,1910,0,0 +0,5226,1360,1,0,5836,1910,0,0 +5086,5306,1360,1,0,5836,1910,0,0 +0,0,0,1420,1,5846,1910,0,0 +980,1,0,1450,1,5846,1910,0,0 +0,1130,1,1450,1,5846,1910,0,0 +5076,1200,1,1480,1,5866,1910,0,0 +0,0,5386,1480,1,5866,1910,0,0 +980,1,5426,1510,1,5876,1920,0,0 +0,5236,5476,1510,1,5886,1920,0,0 +5086,5306,5456,1510,1,5886,1920,0,0 +0,0,0,0,5641,5886,1920,0,0 +980,1,0,0,5646,5886,1920,0,0 +0,1130,1,0,5676,5886,1920,0,0 +5076,1200,1,0,5696,5886,1920,0,0 +0,0,1290,1,5706,5896,1920,0,0 +980,1,1310,1,5706,5896,1920,0,0 +0,5226,1350,1,5706,5896,1920,0,0 +5086,5306,1350,1,5706,5896,1920,0,0 +0,0,0,5506,5736,5896,1920,0,0 +980,1,0,5526,5736,5896,1920,0,0 +0,1130,1,5546,5736,5896,1920,0,0 +5076,1200,1,5546,5736,5896,1920,0,0 +0,0,5386,5586,5736,5896,1920,0,0 +980,1,5406,5586,5736,5896,1920,0,0 +0,5226,5456,5606,5756,5896,1920,0,0 5096,5316,5456,5606,5756,5906,1940,0,0 \ No newline at end of file diff --git a/conf/normal_128k_9dot_dac.txt b/conf/normal_128k_9dot_dac.txt index 9d4869c..5de4d39 100644 --- a/conf/normal_128k_9dot_dac.txt +++ b/conf/normal_128k_9dot_dac.txt @@ -1,512 +1,512 @@ -0,0,0,0,0,0,0,0,0 -960,0,0,0,0,0,0,0,0 -0,1100,0,0,0,0,0,0,0 -980,1280,0,0,0,0,0,0,0 -0,0,1250,0,0,0,0,0,0 -980,0,1390,0,0,0,0,0,0 -0,1130,1440,0,0,0,0,0,0 -980,1320,1480,0,0,0,0,0,0 -0,0,0,1400,0,0,0,0,0 -980,0,0,1510,0,0,0,0,0 -0,1130,0,1530,0,0,0,0,0 -980,1320,0,1580,0,0,0,0,0 -0,0,1260,1580,0,0,0,0,0 -980,1,1300,1580,0,0,0,0,0 -0,5246,5446,1460,0,0,0,0,0 -5076,5296,5446,1460,0,0,0,0,0 -0,0,0,0,1520,0,0,0,0 -980,0,0,0,1620,0,0,0,0 -0,1130,0,0,1640,0,0,0,0 -980,1320,0,0,1690,0,0,0,0 -0,0,1280,0,1680,0,0,0,0 -1000,0,1430,1,1570,0,0,0,0 -0,1090,1460,1,1570,0,0,0,0 -990,1340,1540,1,1580,0,0,0,0 -0,0,0,5496,1600,0,0,0,0 -970,0,1,5546,1600,0,0,0,0 -0,1140,1,5546,1600,0,0,0,0 -1000,1320,1,5546,1600,0,0,0,0 -0,0,5346,5566,1600,0,0,0,0 -1000,1,5416,5586,1600,0,0,0,0 -0,5226,5446,5586,1600,0,0,0,0 -5076,5286,5446,5586,1600,0,0,0,0 -0,0,0,0,0,1640,0,0,0 -980,0,0,0,0,1760,0,0,0 -0,1130,0,0,0,1780,0,0,0 -980,1320,0,0,1,1680,0,0,0 -0,0,1280,0,0,1800,0,0,0 -980,0,1420,0,1,1680,0,0,0 -0,1130,1460,0,1,1680,0,0,0 -1000,1320,1480,0,1,1680,0,0,0 -0,0,0,1380,1,1680,0,0,0 -980,0,0,1540,1,1700,0,0,0 -0,1130,0,1580,1,1700,0,0,0 -1000,1320,0,1620,1,1700,0,0,0 -0,0,5346,1480,1,1700,0,0,0 -980,1,5386,1480,1,1700,0,0,0 -0,5246,5446,1480,1,1700,0,0,0 -5076,5296,5446,1480,1,1700,0,0,0 -0,0,0,0,5616,1740,0,0,0 -980,0,0,1,5636,1740,0,0,0 -0,1130,0,1,5646,1740,0,0,0 -1000,1320,0,1,5656,1740,0,0,0 -0,0,1280,1,5666,1740,0,0,0 -980,0,1420,1,5676,1740,0,0,0 -0,1130,1460,1,5676,1740,0,0,0 -1000,1320,1480,1,5676,1740,0,0,0 -0,0,0,5498,5726,1740,0,0,0 -980,0,1,5526,5706,1740,0,0,0 -0,1130,1,5526,5706,1740,0,0,0 -1000,1320,1,5526,5706,1740,0,0,0 -0,0,5356,5576,5706,1740,0,0,0 -980,1,5406,5576,5726,1740,0,0,0 -0,5216,5416,5576,5726,1740,0,0,0 -5076,5296,5446,5576,5726,1740,0,0,0 -0,0,0,0,0,0,1760,0,0 -980,0,0,0,0,1,1780,0,0 -0,1130,0,0,0,1,1790,0,0 -1000,1320,0,0,0,1,1800,0,0 -0,0,1280,0,0,1,1800,0,0 -980,0,1420,0,0,1,1820,0,0 -0,1130,1460,0,0,1,1820,0,0 -1000,1320,1480,0,0,1,1820,0,0 -0,0,0,1400,0,1,1820,0,0 -980,0,0,1540,0,1,1820,0,0 -0,1130,0,1560,0,1,1820,0,0 -1000,1320,0,1610,0,1,1830,0,0 -0,0,1280,1620,0,1,1830,0,0 -980,1,5386,1480,0,1,1840,0,0 -0,5246,5446,1480,0,1,1840,0,0 -5076,5296,5446,1480,0,1,1840,0,0 -0,0,0,0,1540,1,1860,0,0 -980,0,0,0,1690,1,1840,0,0 -0,1130,0,0,1700,1,1840,0,0 -1000,1320,0,0,1730,1,1840,0,0 -0,0,1280,0,1730,1,1850,0,0 -980,0,1420,1,1580,1,1850,0,0 -0,1130,1460,1,1580,1,1850,0,0 -1000,1320,1480,1,1580,1,1850,0,0 -0,0,0,5486,1600,1,1850,0,0 -980,0,1,5516,1610,1,1850,0,0 -0,1130,1,5526,1610,1,1850,0,0 -1000,1320,1,5546,1610,1,1850,0,0 -0,0,5326,5586,1610,1,1850,0,0 -980,1,5396,5596,1630,1,1850,0,0 -0,5246,5446,5596,1630,1,1850,0,0 -5076,5296,5446,5596,1630,1,1850,0,0 -0,0,0,0,0,5776,1880,0,0 -980,0,0,0,1,5796,1880,0,0 -0,1130,0,0,1,5796,1880,0,0 -1000,1320,0,0,1,5796,1880,0,0 -0,0,1280,0,1,5796,1880,0,0 -980,0,1430,0,1,5796,1880,0,0 -0,1130,1470,0,1,5796,1880,0,0 -1000,1320,1490,0,1,5796,1880,0,0 -0,0,0,1400,1,5796,1880,0,0 -980,0,0,1600,1,5796,1880,0,0 -0,1130,0,1620,1,5806,1880,0,0 -1000,1320,0,1640,1,5816,1880,0,0 -0,0,1290,1660,1,5816,1880,0,0 -980,1,5396,1500,1,5826,1890,0,0 -0,5246,5446,1500,1,5826,1890,0,0 -5076,5296,5446,1500,1,5826,1890,0,0 -0,0,0,0,5616,5846,1890,0,0 -980,0,0,1,5646,5866,1900,0,0 -0,1130,0,1,5656,5866,1900,0,0 -1000,1320,0,1,5666,5866,1900,0,0 -0,0,1280,1,5666,5866,1900,0,0 -980,0,1430,1,5686,5876,1900,0,0 -0,1120,1470,1,5696,5876,1900,0,0 -1000,1320,1490,1,5706,5876,1900,0,0 -0,0,0,5466,5706,5876,1900,0,0 -980,0,1,5536,5746,5896,1900,0,0 -0,1130,1,5546,5746,5896,1900,0,0 -1000,1320,1,5566,5746,5896,1900,0,0 -0,0,5366,5596,5746,5896,1900,0,0 -980,1,5396,5596,5746,5896,1900,0,0 -0,5206,5446,5596,5746,5896,1900,0,0 -5076,5296,5446,5596,5746,5896,1900,0,0 -0,0,0,0,0,0,0,1920,0 -980,0,0,0,0,0,1,1920,0 -0,1130,0,0,0,0,1,1930,0 -1000,1320,0,0,0,0,1,1940,0 -0,0,1280,0,0,0,1,1940,0 -980,0,1410,0,0,0,1,1940,0 -0,1130,1460,0,0,0,1,1940,0 -1000,1320,1490,0,0,0,1,1940,0 -0,0,0,1390,0,0,1,1940,0 -980,0,0,1540,0,0,1,1950,0 -0,1130,0,1560,0,0,1,1950,0 -1000,1320,0,1600,0,0,1,1950,0 -0,0,1280,1620,0,0,1,1960,0 -980,1,5386,1480,0,0,1,1960,0 -0,5246,5446,1480,0,0,1,1960,0 -5076,5296,5446,1480,0,0,1,1960,0 -0,0,0,0,1540,0,1,1960,0 -980,0,0,1,1540,0,1,1960,0 -0,1130,0,1,1550,0,1,1960,0 -1000,1320,0,1,1560,0,1,1960,0 -0,0,1280,1,1580,0,1,1960,0 -980,0,1420,1,1590,0,1,1960,0 -0,1130,1460,1,1600,0,1,1960,0 -1000,1320,1490,1,1620,0,1,1960,0 -0,0,0,5496,1640,0,1,1960,0 -980,0,1,5516,1620,0,1,1960,0 -0,1130,1,5526,1620,0,1,1960,0 -1000,1320,1,5526,1620,0,1,1960,0 -0,0,5246,5536,1620,0,1,1960,0 -980,1,5386,5596,1620,0,1,1970,0 -0,5206,5446,5596,1620,0,1,1970,0 -5076,5296,5446,5596,1620,0,1,1970,0 -0,0,0,0,0,1660,1,1970,0 -980,0,0,0,1,1700,1,1980,0 -0,1130,0,0,1,1700,1,1980,0 -1000,1320,0,0,1,1700,1,1980,0 -0,0,1280,0,1,1710,1,1980,0 -980,0,1430,0,1,1720,1,1980,0 -0,1130,1470,0,1,1720,1,1980,0 -1000,1320,1490,0,1,1720,1,1980,0 -0,0,0,1420,1,1720,1,1980,0 -980,0,1,1430,1,1720,1,1980,0 -0,1130,1,1460,1,1720,1,1980,0 -1000,1320,1,1480,1,1720,1,1980,0 -0,0,5356,1480,1,1720,1,1980,0 -990,1,5386,1480,1,1730,1,1990,0 -0,5246,5446,1480,1,1730,1,1990,0 -5076,5296,5446,1480,1,1730,1,1990,0 -0,0,0,0,5616,1750,1,1990,0 -980,0,0,1,5636,1760,1,1990,0 -0,1130,0,1,5646,1760,1,1990,0 -1000,1320,0,1,5666,1760,1,1990,0 -0,0,1280,1,5666,1760,1,1990,0 -980,0,1430,1,5666,1760,1,1990,0 -0,1130,1470,1,5666,1760,1,1990,0 -1000,1320,1490,1,5696,1780,1,1990,0 -0,0,0,5496,5706,1770,1,1990,0 -980,0,1,5516,5706,1780,1,2020,0 -0,1130,1,5526,5716,1780,1,2020,0 -1000,1320,1,5546,5726,1780,1,2020,0 -0,0,5356,5546,5726,1780,1,2020,0 -980,1,5396,5596,5746,1780,1,2020,0 -0,5206,5446,5596,5746,1780,1,2020,0 -5076,5296,5446,5596,5746,1780,1,2020,0 -0,0,0,0,0,0,5896,2020,0 -980,0,0,0,0,1,5886,2020,0 -0,1120,0,0,0,1,5896,2020,0 -1000,1320,0,0,0,1,5896,2020,0 -0,0,1280,0,0,1,5896,2020,0 -980,0,1430,0,0,1,5946,2020,0 -0,1130,1470,0,0,1,5946,2020,0 -1000,1320,1490,0,0,1,5956,2020,0 -0,0,0,1400,0,1,5946,2020,0 -980,0,1,1430,0,1,5956,2030,0 -0,1140,1,1450,0,1,5956,2030,0 -1000,1320,1,1460,0,1,5956,2030,0 -0,0,5366,1480,0,1,5956,2030,0 -980,1,5386,1480,0,1,5956,2030,0 -0,5246,5446,1480,0,1,5956,2030,0 -5076,5296,5446,1480,0,1,5956,2030,0 -0,0,0,0,1580,1,5956,2030,0 -980,0,0,1,1590,1,5976,2050,0 -0,1140,0,1,1600,1,5976,2050,0 -1000,1320,0,1,1600,1,5976,2050,0 -0,0,1300,1,1600,1,5976,2050,0 -980,0,1440,1,1610,1,5976,2050,0 -0,1140,1480,1,1620,1,5976,2050,0 -1000,1330,1500,1,1620,1,5976,2050,0 -0,0,0,5496,1620,1,5976,2050,0 -980,0,1,5526,1620,1,5996,2050,0 -0,1140,1,5546,1630,1,5996,2050,0 -1000,1330,1,5546,1630,1,5996,2050,0 -0,0,5346,5586,1630,1,5996,2050,0 -980,1,5386,5596,1630,1,5996,2050,0 -0,5246,5446,5596,1630,1,5996,2050,0 -5076,5296,5446,5596,1630,1,5996,2050,0 -0,0,0,0,0,5766,6006,2050,0 -980,0,0,0,1,5806,6006,2050,0 -0,1140,0,0,1,5806,6006,2050,0 -1000,1320,0,0,1,5816,6006,2050,0 -0,0,1280,0,1,5806,6006,2050,0 -980,0,1440,0,1,5816,6006,2050,0 -0,1140,1480,0,1,5826,6006,2050,0 -1000,1320,1490,0,1,5826,6006,2050,0 -0,0,0,1430,1,5826,6006,2050,0 -980,0,1,1450,1,5826,6006,2050,0 -0,1140,1,1460,1,5836,6006,2050,0 -1000,1320,1,1480,1,5846,6006,2050,0 -0,0,5366,1500,1,5846,6006,2050,0 -980,1,5406,1500,1,5866,6026,2050,0 -0,5246,5446,1500,1,5866,6026,2050,0 -5076,5296,5446,1500,1,5866,6026,2050,0 -0,0,0,0,5626,5886,6026,2050,0 -980,0,0,1,5676,5886,6026,2050,0 -0,1140,0,1,5676,5886,6026,2050,0 -1000,1320,0,1,5696,5886,6026,2050,0 -0,0,1290,1,5696,5886,6026,2050,0 -980,0,1440,1,5696,5896,6026,2050,0 -0,1140,1480,1,5696,5896,6026,2050,0 -1000,1320,1500,1,5716,5896,6026,2050,0 -0,0,0,5466,5716,5896,6026,2050,0 -980,0,1,5516,5726,5896,6026,2050,0 -0,1140,1,5526,5726,5896,6026,2050,0 -1000,1320,1,5566,5726,5896,6026,2050,0 -0,0,5356,5566,5726,5896,6026,2050,0 -980,1,5376,5566,5726,5896,6026,2050,0 -0,5246,5446,5566,5726,5896,6026,2050,0 -5076,5296,5446,5566,5726,5896,6026,2050,0 -0,0,0,0,0,0,0,0,2040 -980,0,0,0,0,0,0,1,2050 -0,1130,0,0,0,0,0,1,2060 -1000,1320,0,0,0,0,0,1,2070 -0,0,1280,0,0,0,0,1,2070 -980,0,1420,0,0,0,0,1,2070 -0,1130,1470,0,0,0,0,1,2070 -1000,1320,1490,0,0,0,0,1,2070 -0,0,0,1400,0,0,0,1,2070 -980,0,0,1530,0,0,0,1,2080 -0,1130,0,1570,0,0,0,1,2080 -1000,1320,0,1610,0,0,0,1,2090 -0,0,1280,1630,0,0,0,1,2080 -980,1,5386,1480,0,0,0,1,2090 -0,5246,5446,1480,0,0,0,1,2090 -5076,5296,5446,1490,0,0,0,1,2090 -0,0,0,0,1530,0,0,1,2090 -980,0,0,1,1550,0,0,1,2090 -0,1130,0,1,1560,0,0,1,2090 -1000,1320,0,1,1580,0,0,1,2090 -0,0,1280,1,1580,0,0,1,2090 -980,0,1430,1,1580,0,0,1,2090 -0,1130,1470,1,1590,0,0,1,2090 -1000,1320,1490,1,1600,0,0,1,2090 -0,0,0,5496,1620,0,0,1,2090 -980,0,1,5536,1620,0,0,1,2100 -0,1130,1,5546,1620,0,0,1,2100 -1000,1320,1,5566,1620,0,0,1,2100 -0,0,5366,5586,1620,0,0,1,2100 -980,1,5376,5566,1620,0,0,1,2100 -0,5246,5446,5566,1620,0,0,1,2100 -5096,5296,5446,5566,1620,0,0,1,2100 -0,0,0,0,0,1660,0,1,2100 -980,0,0,0,1,1670,0,1,2100 -0,1130,0,0,1,1680,0,1,2100 -1000,1320,0,0,1,1700,0,1,2100 -0,0,1280,0,1,1700,0,1,2100 -980,0,1430,0,1,1710,0,1,2110 -0,1130,1470,0,1,1720,0,1,2110 -1000,1320,1490,0,1,1730,0,1,2110 -0,0,0,1400,1,1720,0,1,2110 -980,0,1,1420,1,1720,0,1,2110 -0,1130,1,1440,1,1720,0,1,2110 -1000,1320,1,1460,1,1730,0,1,2110 -0,0,5346,1460,1,1730,0,1,2110 -980,1,5386,1480,1,1740,0,1,2120 -0,5246,5446,1480,1,1740,0,1,2120 -5076,5296,5446,1500,1,1740,0,1,2120 -0,0,0,0,5616,1740,0,1,2120 -980,0,0,1,5626,1750,0,1,2120 -0,1130,0,1,5636,1750,0,1,2120 -1000,1320,0,1,5656,1750,0,1,2120 -0,0,1280,1,5666,1750,0,1,2120 -980,0,1440,1,5666,1750,0,1,2120 -0,1130,1480,1,5666,1750,0,1,2120 -1000,1320,1490,1,5686,1750,0,1,2120 -0,0,0,5486,5726,1750,0,1,2120 -980,0,1,5496,5726,1750,0,1,2130 -0,1140,1,5526,5726,1750,0,1,2130 -1000,1320,1,5546,5726,1760,0,1,2130 -0,0,5356,5576,5726,1760,0,1,2130 -980,1,5376,5566,5726,1760,0,1,2130 -0,5246,5446,5566,5726,1760,0,1,2130 -5076,5296,5446,5566,5726,1760,0,1,2130 -0,0,0,0,0,0,1810,1,2130 -980,0,0,0,0,1,1820,1,2130 -0,1130,0,0,0,1,1820,1,2130 -1000,1320,0,0,0,1,1830,1,2130 -0,0,1280,0,0,1,1830,1,2130 -980,0,1430,0,0,1,1830,1,2130 -0,1130,1470,0,0,1,1830,1,2130 -1000,1320,1490,0,0,1,1830,1,2130 -0,0,0,1400,0,1,1830,1,2130 -980,0,1,1420,0,1,1850,1,2130 -0,1130,1,1440,0,1,1850,1,2130 -1000,1320,1,1460,0,1,1850,1,2130 -0,0,5346,1460,0,1,1850,1,2130 -980,1,5386,1480,0,1,1860,1,2130 -0,5246,5446,1480,0,1,1860,1,2130 -5076,5296,5446,1500,0,1,1870,1,2130 -0,0,0,0,1530,1,1860,1,2130 -980,0,0,1,1560,1,1870,1,2130 -0,1130,0,1,1570,1,1870,1,2130 -1000,1320,0,1,1580,1,1870,1,2130 -0,0,1280,1,1580,1,1870,1,2130 -980,0,1430,1,1600,1,1880,1,2140 -0,1130,1470,1,1610,1,1880,1,2140 -1000,1320,1490,1,1610,1,1880,1,2140 -0,0,0,5486,1620,1,1880,1,2140 -980,0,1,5516,1620,1,1890,1,2140 -0,1130,1,5536,1620,1,1890,1,2140 -1000,1320,1,5566,1620,1,1890,1,2140 -0,0,5366,5586,1620,1,1890,1,2140 -980,1,5376,5566,1630,1,1900,1,2140 -0,5246,5466,5566,1630,1,1900,1,2140 -5076,5296,5446,5566,1630,1,1900,1,2140 -0,0,0,0,0,5376,1900,1,2140 -980,0,0,0,1,5776,1900,1,2150 -0,1130,0,0,1,5796,1900,1,2150 -1000,1320,0,0,1,5796,1900,1,2150 -0,0,1280,0,1,5796,1900,1,2150 -980,0,1440,0,1,5796,1900,1,2150 -0,1130,1480,0,1,5806,1900,1,2150 -1000,1320,1500,0,1,5806,1900,1,2150 -0,0,0,1430,1,5806,1900,1,2150 -980,0,1,1450,1,5806,1910,1,2160 -0,1130,1,1460,1,5806,1910,1,2160 -1000,1320,1,1470,1,5816,1910,1,2160 -0,0,5346,1480,1,5816,1910,1,2160 -980,1,5386,1480,1,5816,1910,1,2160 -0,5246,5446,1480,1,5816,1910,1,2160 -5076,5296,5446,1500,1,5816,1910,1,2160 -0,0,0,0,5586,5836,1910,1,2160 -980,0,0,1,5626,5836,1910,1,2160 -0,1140,0,1,5636,5836,1910,1,2160 -1000,1320,0,1,5646,5836,1910,1,2160 -0,0,1290,1,5646,5836,1910,1,2160 -980,0,1430,1,5646,5836,1910,1,2160 -0,1140,1480,1,5656,5836,1910,1,2160 -1000,1320,1500,1,5686,5836,1910,1,2160 -0,0,0,5446,5686,5836,1910,1,2160 -980,0,1,5516,5716,5856,1920,1,2160 -0,1140,1,5536,5716,5856,1920,1,2160 -1000,1320,1,5566,5726,5856,1920,1,2160 -0,0,5366,5586,5736,5856,1920,1,2160 -980,1,5376,5566,5726,5856,1930,1,2170 -0,5246,5446,5566,5726,5856,1930,1,2170 -5076,5296,5446,5566,5726,5856,1930,1,2170 -0,0,0,0,0,0,0,6046,2170 -980,0,0,0,0,0,1,6076,2180 -0,1130,0,0,0,0,1,6086,2180 -1000,1320,0,0,0,0,1,6086,2180 -0,0,1280,0,0,0,1,6086,2180 -980,0,1420,0,0,0,1,6086,2180 -0,1130,1470,0,0,0,1,6086,2180 -1000,1320,1490,0,0,0,1,6086,2180 -0,0,0,1400,0,0,1,6086,2180 -980,0,1,1420,0,0,1,6086,2180 -0,1130,1,1440,0,0,1,6086,2180 -1000,1320,1,1460,0,0,1,6086,2180 -0,0,5346,1460,0,0,1,6086,2180 -980,1,5386,1480,0,0,1,6096,2180 -0,5246,5446,1480,0,0,1,6096,2180 -5076,5296,5446,1500,0,0,1,6096,2180 -0,0,0,0,1540,0,1,6096,2180 -980,0,0,1,1570,0,1,6106,2180 -0,1130,0,1,1580,0,1,6106,2180 -1000,1320,0,1,1600,0,1,6106,2180 -0,0,1280,1,1600,0,1,6106,2180 -980,0,1430,1,1600,0,1,6106,2180 -0,1130,1470,1,1600,0,1,6106,2180 -1000,1320,1490,1,1610,0,1,6106,2180 -0,0,0,5486,1610,0,1,6106,2180 -980,0,1,5526,1620,0,1,6106,2180 -0,1130,1,5546,1620,0,1,6106,2180 -1000,1320,1,5546,1630,0,1,6106,2180 -0,0,5346,5586,1630,0,1,6106,2180 -980,1,5376,5566,1630,0,1,6116,2180 -0,5246,5446,5566,1630,0,1,6116,2180 -5076,5296,5446,5566,1630,0,1,6116,2180 -0,0,0,0,0,1700,1,6116,2180 -980,0,0,0,1,1720,1,6116,2180 -0,1130,0,0,1,1730,1,6116,2180 -1000,1320,0,0,1,1730,1,6116,2180 -0,0,1280,0,1,1730,1,6116,2180 -980,0,1430,0,1,1740,1,6116,2180 -0,1130,1470,0,1,1740,1,6116,2180 -1000,1320,1490,0,1,1740,1,6116,2180 -0,0,0,1430,1,1740,1,6116,2180 -980,0,1,1430,1,1740,1,6116,2180 -0,1130,1,1450,1,1740,1,6116,2180 -1000,1320,1,1460,1,1740,1,6116,2180 -0,0,5366,1470,1,1740,1,6116,2180 -980,1,5386,1480,1,1750,1,6116,2180 -0,5246,5446,1480,1,1750,1,6116,2180 -5076,5296,5446,1500,1,1750,1,6116,2180 -0,0,0,0,5616,1750,1,6116,2180 -980,0,0,1,5616,1770,1,6126,2190 -0,1130,0,1,5636,1770,1,6126,2190 -1000,1320,0,1,5646,1770,1,6126,2190 -0,0,1280,1,5646,1770,1,6126,2190 -980,0,1430,1,5646,1770,1,6126,2190 -0,1130,1480,1,5666,1770,1,6126,2190 -1000,1320,1500,1,5686,1770,1,6126,2190 -0,0,0,5446,5686,1770,1,6126,2190 -980,0,1,5516,5716,1770,1,6126,2190 -0,1130,1,5536,5726,1770,1,6126,2190 -1000,1320,1,5566,5726,1770,1,6126,2190 -0,0,5366,5586,5736,1770,1,6126,2190 -980,1,5376,5566,5726,1780,1,6136,2190 -0,5246,5446,5566,5726,1780,1,6136,2190 -5076,5296,5446,5566,5726,1780,1,6136,2190 -0,0,0,0,0,0,5886,6136,2190 -980,0,0,0,0,1,5906,6156,2190 -0,1130,0,0,0,1,5916,6156,2190 -1000,1320,0,0,0,1,5936,6156,2190 -0,0,1280,0,0,1,5916,6156,2190 -980,0,1430,0,0,1,5946,6176,2190 -0,1130,1470,0,0,1,5956,6176,2190 -1000,1320,1490,0,0,1,5956,6176,2190 -0,0,0,1420,0,1,5966,6176,2190 -980,0,1,1430,0,1,5966,6166,2190 -0,1130,1,1450,0,1,5966,6166,2190 -1000,1320,1,1460,0,1,5966,6166,2190 -0,0,5366,1470,0,1,5966,6166,2190 -980,1,5376,1480,0,1,5966,6166,2190 -0,5246,5446,1480,0,1,5966,6166,2190 -5076,5296,5446,1500,0,1,5966,6166,2190 -0,0,0,0,1580,1,5966,6166,2190 -980,0,0,1,1600,1,5976,6166,2190 -0,1130,0,1,1600,1,5976,6166,2190 -1000,1320,0,1,1600,1,5976,6166,2190 -0,0,1280,1,1600,1,5976,6166,2190 -980,0,1430,1,1600,1,5976,6166,2190 -0,1130,1480,1,1600,1,5976,6166,2190 -1000,1320,1490,1,1610,1,5976,6166,2190 -0,0,0,5446,1620,1,5976,6166,2190 -980,0,1,5526,1620,1,5986,6166,2190 -0,1130,1,5546,1620,1,5986,6166,2190 -1000,1320,1,5546,1630,1,5986,6166,2190 -0,0,5346,5566,1630,1,5986,6166,2190 -980,1,5376,5566,1630,1,5986,6166,2190 -0,5246,5446,5566,1630,1,5986,6166,2190 -5076,5296,5446,5566,1630,1,5986,6166,2190 -0,0,0,0,0,9876,10080,10240,2160 -980,0,0,0,1,5776,6016,6166,2190 -0,1130,0,0,1,5786,6016,6166,2190 -1000,1320,0,0,1,5796,6016,6166,2190 -0,0,1280,0,1,5786,6016,6166,2190 -980,0,1440,0,1,5796,6016,6166,2190 -0,1130,1480,0,1,5796,6016,6166,2190 -1000,1320,1490,0,1,5796,6016,6166,2190 -0,0,0,1430,1,5796,6016,6166,2190 -980,0,1,1430,1,5796,6016,6166,2190 -0,1130,1,1450,1,5796,6016,6166,2190 -1000,1320,1,1460,1,5796,6016,6166,2190 -0,0,5366,1470,1,5816,6016,6166,2190 -980,1,5376,1480,1,5826,6016,6166,2200 -0,5246,5446,1480,1,5836,6016,6166,2200 -5076,5296,5446,1500,1,5836,6016,6166,2200 -0,0,0,0,9736,5836,6016,6166,2200 -980,0,0,1,9736,5846,6016,6166,2200 -0,1130,0,1,9736,5846,6016,6166,2200 -1000,1320,0,1,9736,5846,6016,6166,2200 -0,0,1290,1,9736,5846,6016,6166,2200 -980,0,1440,1,9756,5846,6016,6166,2200 -0,1130,1480,1,9756,5846,6016,6166,2200 -1000,1320,1500,1,9756,5846,6016,6166,2200 -0,0,0,9586,1,5746,5986,6146,2200 -980,0,1,9576,5666,5866,6016,6166,2210 -0,1130,1,9586,5666,5866,6016,6166,2210 -1000,1320,1,9596,5666,5866,6016,6166,2210 -0,0,9486,1,5626,5846,6016,6166,2210 -980,1,5386,5566,5726,5866,6016,6166,2210 -0,5246,1,5436,5666,5856,6006,6166,2210 +0,0,0,0,0,0,0,0,0 +960,0,0,0,0,0,0,0,0 +0,1100,0,0,0,0,0,0,0 +980,1280,0,0,0,0,0,0,0 +0,0,1250,0,0,0,0,0,0 +980,0,1390,0,0,0,0,0,0 +0,1130,1440,0,0,0,0,0,0 +980,1320,1480,0,0,0,0,0,0 +0,0,0,1400,0,0,0,0,0 +980,0,0,1510,0,0,0,0,0 +0,1130,0,1530,0,0,0,0,0 +980,1320,0,1580,0,0,0,0,0 +0,0,1260,1580,0,0,0,0,0 +980,1,1300,1580,0,0,0,0,0 +0,5246,5446,1460,0,0,0,0,0 +5076,5296,5446,1460,0,0,0,0,0 +0,0,0,0,1520,0,0,0,0 +980,0,0,0,1620,0,0,0,0 +0,1130,0,0,1640,0,0,0,0 +980,1320,0,0,1690,0,0,0,0 +0,0,1280,0,1680,0,0,0,0 +1000,0,1430,1,1570,0,0,0,0 +0,1090,1460,1,1570,0,0,0,0 +990,1340,1540,1,1580,0,0,0,0 +0,0,0,5496,1600,0,0,0,0 +970,0,1,5546,1600,0,0,0,0 +0,1140,1,5546,1600,0,0,0,0 +1000,1320,1,5546,1600,0,0,0,0 +0,0,5346,5566,1600,0,0,0,0 +1000,1,5416,5586,1600,0,0,0,0 +0,5226,5446,5586,1600,0,0,0,0 +5076,5286,5446,5586,1600,0,0,0,0 +0,0,0,0,0,1640,0,0,0 +980,0,0,0,0,1760,0,0,0 +0,1130,0,0,0,1780,0,0,0 +980,1320,0,0,1,1680,0,0,0 +0,0,1280,0,0,1800,0,0,0 +980,0,1420,0,1,1680,0,0,0 +0,1130,1460,0,1,1680,0,0,0 +1000,1320,1480,0,1,1680,0,0,0 +0,0,0,1380,1,1680,0,0,0 +980,0,0,1540,1,1700,0,0,0 +0,1130,0,1580,1,1700,0,0,0 +1000,1320,0,1620,1,1700,0,0,0 +0,0,5346,1480,1,1700,0,0,0 +980,1,5386,1480,1,1700,0,0,0 +0,5246,5446,1480,1,1700,0,0,0 +5076,5296,5446,1480,1,1700,0,0,0 +0,0,0,0,5616,1740,0,0,0 +980,0,0,1,5636,1740,0,0,0 +0,1130,0,1,5646,1740,0,0,0 +1000,1320,0,1,5656,1740,0,0,0 +0,0,1280,1,5666,1740,0,0,0 +980,0,1420,1,5676,1740,0,0,0 +0,1130,1460,1,5676,1740,0,0,0 +1000,1320,1480,1,5676,1740,0,0,0 +0,0,0,5498,5726,1740,0,0,0 +980,0,1,5526,5706,1740,0,0,0 +0,1130,1,5526,5706,1740,0,0,0 +1000,1320,1,5526,5706,1740,0,0,0 +0,0,5356,5576,5706,1740,0,0,0 +980,1,5406,5576,5726,1740,0,0,0 +0,5216,5416,5576,5726,1740,0,0,0 +5076,5296,5446,5576,5726,1740,0,0,0 +0,0,0,0,0,0,1760,0,0 +980,0,0,0,0,1,1780,0,0 +0,1130,0,0,0,1,1790,0,0 +1000,1320,0,0,0,1,1800,0,0 +0,0,1280,0,0,1,1800,0,0 +980,0,1420,0,0,1,1820,0,0 +0,1130,1460,0,0,1,1820,0,0 +1000,1320,1480,0,0,1,1820,0,0 +0,0,0,1400,0,1,1820,0,0 +980,0,0,1540,0,1,1820,0,0 +0,1130,0,1560,0,1,1820,0,0 +1000,1320,0,1610,0,1,1830,0,0 +0,0,1280,1620,0,1,1830,0,0 +980,1,5386,1480,0,1,1840,0,0 +0,5246,5446,1480,0,1,1840,0,0 +5076,5296,5446,1480,0,1,1840,0,0 +0,0,0,0,1540,1,1860,0,0 +980,0,0,0,1690,1,1840,0,0 +0,1130,0,0,1700,1,1840,0,0 +1000,1320,0,0,1730,1,1840,0,0 +0,0,1280,0,1730,1,1850,0,0 +980,0,1420,1,1580,1,1850,0,0 +0,1130,1460,1,1580,1,1850,0,0 +1000,1320,1480,1,1580,1,1850,0,0 +0,0,0,5486,1600,1,1850,0,0 +980,0,1,5516,1610,1,1850,0,0 +0,1130,1,5526,1610,1,1850,0,0 +1000,1320,1,5546,1610,1,1850,0,0 +0,0,5326,5586,1610,1,1850,0,0 +980,1,5396,5596,1630,1,1850,0,0 +0,5246,5446,5596,1630,1,1850,0,0 +5076,5296,5446,5596,1630,1,1850,0,0 +0,0,0,0,0,5776,1880,0,0 +980,0,0,0,1,5796,1880,0,0 +0,1130,0,0,1,5796,1880,0,0 +1000,1320,0,0,1,5796,1880,0,0 +0,0,1280,0,1,5796,1880,0,0 +980,0,1430,0,1,5796,1880,0,0 +0,1130,1470,0,1,5796,1880,0,0 +1000,1320,1490,0,1,5796,1880,0,0 +0,0,0,1400,1,5796,1880,0,0 +980,0,0,1600,1,5796,1880,0,0 +0,1130,0,1620,1,5806,1880,0,0 +1000,1320,0,1640,1,5816,1880,0,0 +0,0,1290,1660,1,5816,1880,0,0 +980,1,5396,1500,1,5826,1890,0,0 +0,5246,5446,1500,1,5826,1890,0,0 +5076,5296,5446,1500,1,5826,1890,0,0 +0,0,0,0,5616,5846,1890,0,0 +980,0,0,1,5646,5866,1900,0,0 +0,1130,0,1,5656,5866,1900,0,0 +1000,1320,0,1,5666,5866,1900,0,0 +0,0,1280,1,5666,5866,1900,0,0 +980,0,1430,1,5686,5876,1900,0,0 +0,1120,1470,1,5696,5876,1900,0,0 +1000,1320,1490,1,5706,5876,1900,0,0 +0,0,0,5466,5706,5876,1900,0,0 +980,0,1,5536,5746,5896,1900,0,0 +0,1130,1,5546,5746,5896,1900,0,0 +1000,1320,1,5566,5746,5896,1900,0,0 +0,0,5366,5596,5746,5896,1900,0,0 +980,1,5396,5596,5746,5896,1900,0,0 +0,5206,5446,5596,5746,5896,1900,0,0 +5076,5296,5446,5596,5746,5896,1900,0,0 +0,0,0,0,0,0,0,1920,0 +980,0,0,0,0,0,1,1920,0 +0,1130,0,0,0,0,1,1930,0 +1000,1320,0,0,0,0,1,1940,0 +0,0,1280,0,0,0,1,1940,0 +980,0,1410,0,0,0,1,1940,0 +0,1130,1460,0,0,0,1,1940,0 +1000,1320,1490,0,0,0,1,1940,0 +0,0,0,1390,0,0,1,1940,0 +980,0,0,1540,0,0,1,1950,0 +0,1130,0,1560,0,0,1,1950,0 +1000,1320,0,1600,0,0,1,1950,0 +0,0,1280,1620,0,0,1,1960,0 +980,1,5386,1480,0,0,1,1960,0 +0,5246,5446,1480,0,0,1,1960,0 +5076,5296,5446,1480,0,0,1,1960,0 +0,0,0,0,1540,0,1,1960,0 +980,0,0,1,1540,0,1,1960,0 +0,1130,0,1,1550,0,1,1960,0 +1000,1320,0,1,1560,0,1,1960,0 +0,0,1280,1,1580,0,1,1960,0 +980,0,1420,1,1590,0,1,1960,0 +0,1130,1460,1,1600,0,1,1960,0 +1000,1320,1490,1,1620,0,1,1960,0 +0,0,0,5496,1640,0,1,1960,0 +980,0,1,5516,1620,0,1,1960,0 +0,1130,1,5526,1620,0,1,1960,0 +1000,1320,1,5526,1620,0,1,1960,0 +0,0,5246,5536,1620,0,1,1960,0 +980,1,5386,5596,1620,0,1,1970,0 +0,5206,5446,5596,1620,0,1,1970,0 +5076,5296,5446,5596,1620,0,1,1970,0 +0,0,0,0,0,1660,1,1970,0 +980,0,0,0,1,1700,1,1980,0 +0,1130,0,0,1,1700,1,1980,0 +1000,1320,0,0,1,1700,1,1980,0 +0,0,1280,0,1,1710,1,1980,0 +980,0,1430,0,1,1720,1,1980,0 +0,1130,1470,0,1,1720,1,1980,0 +1000,1320,1490,0,1,1720,1,1980,0 +0,0,0,1420,1,1720,1,1980,0 +980,0,1,1430,1,1720,1,1980,0 +0,1130,1,1460,1,1720,1,1980,0 +1000,1320,1,1480,1,1720,1,1980,0 +0,0,5356,1480,1,1720,1,1980,0 +990,1,5386,1480,1,1730,1,1990,0 +0,5246,5446,1480,1,1730,1,1990,0 +5076,5296,5446,1480,1,1730,1,1990,0 +0,0,0,0,5616,1750,1,1990,0 +980,0,0,1,5636,1760,1,1990,0 +0,1130,0,1,5646,1760,1,1990,0 +1000,1320,0,1,5666,1760,1,1990,0 +0,0,1280,1,5666,1760,1,1990,0 +980,0,1430,1,5666,1760,1,1990,0 +0,1130,1470,1,5666,1760,1,1990,0 +1000,1320,1490,1,5696,1780,1,1990,0 +0,0,0,5496,5706,1770,1,1990,0 +980,0,1,5516,5706,1780,1,2020,0 +0,1130,1,5526,5716,1780,1,2020,0 +1000,1320,1,5546,5726,1780,1,2020,0 +0,0,5356,5546,5726,1780,1,2020,0 +980,1,5396,5596,5746,1780,1,2020,0 +0,5206,5446,5596,5746,1780,1,2020,0 +5076,5296,5446,5596,5746,1780,1,2020,0 +0,0,0,0,0,0,5896,2020,0 +980,0,0,0,0,1,5886,2020,0 +0,1120,0,0,0,1,5896,2020,0 +1000,1320,0,0,0,1,5896,2020,0 +0,0,1280,0,0,1,5896,2020,0 +980,0,1430,0,0,1,5946,2020,0 +0,1130,1470,0,0,1,5946,2020,0 +1000,1320,1490,0,0,1,5956,2020,0 +0,0,0,1400,0,1,5946,2020,0 +980,0,1,1430,0,1,5956,2030,0 +0,1140,1,1450,0,1,5956,2030,0 +1000,1320,1,1460,0,1,5956,2030,0 +0,0,5366,1480,0,1,5956,2030,0 +980,1,5386,1480,0,1,5956,2030,0 +0,5246,5446,1480,0,1,5956,2030,0 +5076,5296,5446,1480,0,1,5956,2030,0 +0,0,0,0,1580,1,5956,2030,0 +980,0,0,1,1590,1,5976,2050,0 +0,1140,0,1,1600,1,5976,2050,0 +1000,1320,0,1,1600,1,5976,2050,0 +0,0,1300,1,1600,1,5976,2050,0 +980,0,1440,1,1610,1,5976,2050,0 +0,1140,1480,1,1620,1,5976,2050,0 +1000,1330,1500,1,1620,1,5976,2050,0 +0,0,0,5496,1620,1,5976,2050,0 +980,0,1,5526,1620,1,5996,2050,0 +0,1140,1,5546,1630,1,5996,2050,0 +1000,1330,1,5546,1630,1,5996,2050,0 +0,0,5346,5586,1630,1,5996,2050,0 +980,1,5386,5596,1630,1,5996,2050,0 +0,5246,5446,5596,1630,1,5996,2050,0 +5076,5296,5446,5596,1630,1,5996,2050,0 +0,0,0,0,0,5766,6006,2050,0 +980,0,0,0,1,5806,6006,2050,0 +0,1140,0,0,1,5806,6006,2050,0 +1000,1320,0,0,1,5816,6006,2050,0 +0,0,1280,0,1,5806,6006,2050,0 +980,0,1440,0,1,5816,6006,2050,0 +0,1140,1480,0,1,5826,6006,2050,0 +1000,1320,1490,0,1,5826,6006,2050,0 +0,0,0,1430,1,5826,6006,2050,0 +980,0,1,1450,1,5826,6006,2050,0 +0,1140,1,1460,1,5836,6006,2050,0 +1000,1320,1,1480,1,5846,6006,2050,0 +0,0,5366,1500,1,5846,6006,2050,0 +980,1,5406,1500,1,5866,6026,2050,0 +0,5246,5446,1500,1,5866,6026,2050,0 +5076,5296,5446,1500,1,5866,6026,2050,0 +0,0,0,0,5626,5886,6026,2050,0 +980,0,0,1,5676,5886,6026,2050,0 +0,1140,0,1,5676,5886,6026,2050,0 +1000,1320,0,1,5696,5886,6026,2050,0 +0,0,1290,1,5696,5886,6026,2050,0 +980,0,1440,1,5696,5896,6026,2050,0 +0,1140,1480,1,5696,5896,6026,2050,0 +1000,1320,1500,1,5716,5896,6026,2050,0 +0,0,0,5466,5716,5896,6026,2050,0 +980,0,1,5516,5726,5896,6026,2050,0 +0,1140,1,5526,5726,5896,6026,2050,0 +1000,1320,1,5566,5726,5896,6026,2050,0 +0,0,5356,5566,5726,5896,6026,2050,0 +980,1,5376,5566,5726,5896,6026,2050,0 +0,5246,5446,5566,5726,5896,6026,2050,0 +5076,5296,5446,5566,5726,5896,6026,2050,0 +0,0,0,0,0,0,0,0,2040 +980,0,0,0,0,0,0,1,2050 +0,1130,0,0,0,0,0,1,2060 +1000,1320,0,0,0,0,0,1,2070 +0,0,1280,0,0,0,0,1,2070 +980,0,1420,0,0,0,0,1,2070 +0,1130,1470,0,0,0,0,1,2070 +1000,1320,1490,0,0,0,0,1,2070 +0,0,0,1400,0,0,0,1,2070 +980,0,0,1530,0,0,0,1,2080 +0,1130,0,1570,0,0,0,1,2080 +1000,1320,0,1610,0,0,0,1,2090 +0,0,1280,1630,0,0,0,1,2080 +980,1,5386,1480,0,0,0,1,2090 +0,5246,5446,1480,0,0,0,1,2090 +5076,5296,5446,1490,0,0,0,1,2090 +0,0,0,0,1530,0,0,1,2090 +980,0,0,1,1550,0,0,1,2090 +0,1130,0,1,1560,0,0,1,2090 +1000,1320,0,1,1580,0,0,1,2090 +0,0,1280,1,1580,0,0,1,2090 +980,0,1430,1,1580,0,0,1,2090 +0,1130,1470,1,1590,0,0,1,2090 +1000,1320,1490,1,1600,0,0,1,2090 +0,0,0,5496,1620,0,0,1,2090 +980,0,1,5536,1620,0,0,1,2100 +0,1130,1,5546,1620,0,0,1,2100 +1000,1320,1,5566,1620,0,0,1,2100 +0,0,5366,5586,1620,0,0,1,2100 +980,1,5376,5566,1620,0,0,1,2100 +0,5246,5446,5566,1620,0,0,1,2100 +5096,5296,5446,5566,1620,0,0,1,2100 +0,0,0,0,0,1660,0,1,2100 +980,0,0,0,1,1670,0,1,2100 +0,1130,0,0,1,1680,0,1,2100 +1000,1320,0,0,1,1700,0,1,2100 +0,0,1280,0,1,1700,0,1,2100 +980,0,1430,0,1,1710,0,1,2110 +0,1130,1470,0,1,1720,0,1,2110 +1000,1320,1490,0,1,1730,0,1,2110 +0,0,0,1400,1,1720,0,1,2110 +980,0,1,1420,1,1720,0,1,2110 +0,1130,1,1440,1,1720,0,1,2110 +1000,1320,1,1460,1,1730,0,1,2110 +0,0,5346,1460,1,1730,0,1,2110 +980,1,5386,1480,1,1740,0,1,2120 +0,5246,5446,1480,1,1740,0,1,2120 +5076,5296,5446,1500,1,1740,0,1,2120 +0,0,0,0,5616,1740,0,1,2120 +980,0,0,1,5626,1750,0,1,2120 +0,1130,0,1,5636,1750,0,1,2120 +1000,1320,0,1,5656,1750,0,1,2120 +0,0,1280,1,5666,1750,0,1,2120 +980,0,1440,1,5666,1750,0,1,2120 +0,1130,1480,1,5666,1750,0,1,2120 +1000,1320,1490,1,5686,1750,0,1,2120 +0,0,0,5486,5726,1750,0,1,2120 +980,0,1,5496,5726,1750,0,1,2130 +0,1140,1,5526,5726,1750,0,1,2130 +1000,1320,1,5546,5726,1760,0,1,2130 +0,0,5356,5576,5726,1760,0,1,2130 +980,1,5376,5566,5726,1760,0,1,2130 +0,5246,5446,5566,5726,1760,0,1,2130 +5076,5296,5446,5566,5726,1760,0,1,2130 +0,0,0,0,0,0,1810,1,2130 +980,0,0,0,0,1,1820,1,2130 +0,1130,0,0,0,1,1820,1,2130 +1000,1320,0,0,0,1,1830,1,2130 +0,0,1280,0,0,1,1830,1,2130 +980,0,1430,0,0,1,1830,1,2130 +0,1130,1470,0,0,1,1830,1,2130 +1000,1320,1490,0,0,1,1830,1,2130 +0,0,0,1400,0,1,1830,1,2130 +980,0,1,1420,0,1,1850,1,2130 +0,1130,1,1440,0,1,1850,1,2130 +1000,1320,1,1460,0,1,1850,1,2130 +0,0,5346,1460,0,1,1850,1,2130 +980,1,5386,1480,0,1,1860,1,2130 +0,5246,5446,1480,0,1,1860,1,2130 +5076,5296,5446,1500,0,1,1870,1,2130 +0,0,0,0,1530,1,1860,1,2130 +980,0,0,1,1560,1,1870,1,2130 +0,1130,0,1,1570,1,1870,1,2130 +1000,1320,0,1,1580,1,1870,1,2130 +0,0,1280,1,1580,1,1870,1,2130 +980,0,1430,1,1600,1,1880,1,2140 +0,1130,1470,1,1610,1,1880,1,2140 +1000,1320,1490,1,1610,1,1880,1,2140 +0,0,0,5486,1620,1,1880,1,2140 +980,0,1,5516,1620,1,1890,1,2140 +0,1130,1,5536,1620,1,1890,1,2140 +1000,1320,1,5566,1620,1,1890,1,2140 +0,0,5366,5586,1620,1,1890,1,2140 +980,1,5376,5566,1630,1,1900,1,2140 +0,5246,5466,5566,1630,1,1900,1,2140 +5076,5296,5446,5566,1630,1,1900,1,2140 +0,0,0,0,0,5376,1900,1,2140 +980,0,0,0,1,5776,1900,1,2150 +0,1130,0,0,1,5796,1900,1,2150 +1000,1320,0,0,1,5796,1900,1,2150 +0,0,1280,0,1,5796,1900,1,2150 +980,0,1440,0,1,5796,1900,1,2150 +0,1130,1480,0,1,5806,1900,1,2150 +1000,1320,1500,0,1,5806,1900,1,2150 +0,0,0,1430,1,5806,1900,1,2150 +980,0,1,1450,1,5806,1910,1,2160 +0,1130,1,1460,1,5806,1910,1,2160 +1000,1320,1,1470,1,5816,1910,1,2160 +0,0,5346,1480,1,5816,1910,1,2160 +980,1,5386,1480,1,5816,1910,1,2160 +0,5246,5446,1480,1,5816,1910,1,2160 +5076,5296,5446,1500,1,5816,1910,1,2160 +0,0,0,0,5586,5836,1910,1,2160 +980,0,0,1,5626,5836,1910,1,2160 +0,1140,0,1,5636,5836,1910,1,2160 +1000,1320,0,1,5646,5836,1910,1,2160 +0,0,1290,1,5646,5836,1910,1,2160 +980,0,1430,1,5646,5836,1910,1,2160 +0,1140,1480,1,5656,5836,1910,1,2160 +1000,1320,1500,1,5686,5836,1910,1,2160 +0,0,0,5446,5686,5836,1910,1,2160 +980,0,1,5516,5716,5856,1920,1,2160 +0,1140,1,5536,5716,5856,1920,1,2160 +1000,1320,1,5566,5726,5856,1920,1,2160 +0,0,5366,5586,5736,5856,1920,1,2160 +980,1,5376,5566,5726,5856,1930,1,2170 +0,5246,5446,5566,5726,5856,1930,1,2170 +5076,5296,5446,5566,5726,5856,1930,1,2170 +0,0,0,0,0,0,0,6046,2170 +980,0,0,0,0,0,1,6076,2180 +0,1130,0,0,0,0,1,6086,2180 +1000,1320,0,0,0,0,1,6086,2180 +0,0,1280,0,0,0,1,6086,2180 +980,0,1420,0,0,0,1,6086,2180 +0,1130,1470,0,0,0,1,6086,2180 +1000,1320,1490,0,0,0,1,6086,2180 +0,0,0,1400,0,0,1,6086,2180 +980,0,1,1420,0,0,1,6086,2180 +0,1130,1,1440,0,0,1,6086,2180 +1000,1320,1,1460,0,0,1,6086,2180 +0,0,5346,1460,0,0,1,6086,2180 +980,1,5386,1480,0,0,1,6096,2180 +0,5246,5446,1480,0,0,1,6096,2180 +5076,5296,5446,1500,0,0,1,6096,2180 +0,0,0,0,1540,0,1,6096,2180 +980,0,0,1,1570,0,1,6106,2180 +0,1130,0,1,1580,0,1,6106,2180 +1000,1320,0,1,1600,0,1,6106,2180 +0,0,1280,1,1600,0,1,6106,2180 +980,0,1430,1,1600,0,1,6106,2180 +0,1130,1470,1,1600,0,1,6106,2180 +1000,1320,1490,1,1610,0,1,6106,2180 +0,0,0,5486,1610,0,1,6106,2180 +980,0,1,5526,1620,0,1,6106,2180 +0,1130,1,5546,1620,0,1,6106,2180 +1000,1320,1,5546,1630,0,1,6106,2180 +0,0,5346,5586,1630,0,1,6106,2180 +980,1,5376,5566,1630,0,1,6116,2180 +0,5246,5446,5566,1630,0,1,6116,2180 +5076,5296,5446,5566,1630,0,1,6116,2180 +0,0,0,0,0,1700,1,6116,2180 +980,0,0,0,1,1720,1,6116,2180 +0,1130,0,0,1,1730,1,6116,2180 +1000,1320,0,0,1,1730,1,6116,2180 +0,0,1280,0,1,1730,1,6116,2180 +980,0,1430,0,1,1740,1,6116,2180 +0,1130,1470,0,1,1740,1,6116,2180 +1000,1320,1490,0,1,1740,1,6116,2180 +0,0,0,1430,1,1740,1,6116,2180 +980,0,1,1430,1,1740,1,6116,2180 +0,1130,1,1450,1,1740,1,6116,2180 +1000,1320,1,1460,1,1740,1,6116,2180 +0,0,5366,1470,1,1740,1,6116,2180 +980,1,5386,1480,1,1750,1,6116,2180 +0,5246,5446,1480,1,1750,1,6116,2180 +5076,5296,5446,1500,1,1750,1,6116,2180 +0,0,0,0,5616,1750,1,6116,2180 +980,0,0,1,5616,1770,1,6126,2190 +0,1130,0,1,5636,1770,1,6126,2190 +1000,1320,0,1,5646,1770,1,6126,2190 +0,0,1280,1,5646,1770,1,6126,2190 +980,0,1430,1,5646,1770,1,6126,2190 +0,1130,1480,1,5666,1770,1,6126,2190 +1000,1320,1500,1,5686,1770,1,6126,2190 +0,0,0,5446,5686,1770,1,6126,2190 +980,0,1,5516,5716,1770,1,6126,2190 +0,1130,1,5536,5726,1770,1,6126,2190 +1000,1320,1,5566,5726,1770,1,6126,2190 +0,0,5366,5586,5736,1770,1,6126,2190 +980,1,5376,5566,5726,1780,1,6136,2190 +0,5246,5446,5566,5726,1780,1,6136,2190 +5076,5296,5446,5566,5726,1780,1,6136,2190 +0,0,0,0,0,0,5886,6136,2190 +980,0,0,0,0,1,5906,6156,2190 +0,1130,0,0,0,1,5916,6156,2190 +1000,1320,0,0,0,1,5936,6156,2190 +0,0,1280,0,0,1,5916,6156,2190 +980,0,1430,0,0,1,5946,6176,2190 +0,1130,1470,0,0,1,5956,6176,2190 +1000,1320,1490,0,0,1,5956,6176,2190 +0,0,0,1420,0,1,5966,6176,2190 +980,0,1,1430,0,1,5966,6166,2190 +0,1130,1,1450,0,1,5966,6166,2190 +1000,1320,1,1460,0,1,5966,6166,2190 +0,0,5366,1470,0,1,5966,6166,2190 +980,1,5376,1480,0,1,5966,6166,2190 +0,5246,5446,1480,0,1,5966,6166,2190 +5076,5296,5446,1500,0,1,5966,6166,2190 +0,0,0,0,1580,1,5966,6166,2190 +980,0,0,1,1600,1,5976,6166,2190 +0,1130,0,1,1600,1,5976,6166,2190 +1000,1320,0,1,1600,1,5976,6166,2190 +0,0,1280,1,1600,1,5976,6166,2190 +980,0,1430,1,1600,1,5976,6166,2190 +0,1130,1480,1,1600,1,5976,6166,2190 +1000,1320,1490,1,1610,1,5976,6166,2190 +0,0,0,5446,1620,1,5976,6166,2190 +980,0,1,5526,1620,1,5986,6166,2190 +0,1130,1,5546,1620,1,5986,6166,2190 +1000,1320,1,5546,1630,1,5986,6166,2190 +0,0,5346,5566,1630,1,5986,6166,2190 +980,1,5376,5566,1630,1,5986,6166,2190 +0,5246,5446,5566,1630,1,5986,6166,2190 +5076,5296,5446,5566,1630,1,5986,6166,2190 +0,0,0,0,0,9876,10080,10240,2160 +980,0,0,0,1,5776,6016,6166,2190 +0,1130,0,0,1,5786,6016,6166,2190 +1000,1320,0,0,1,5796,6016,6166,2190 +0,0,1280,0,1,5786,6016,6166,2190 +980,0,1440,0,1,5796,6016,6166,2190 +0,1130,1480,0,1,5796,6016,6166,2190 +1000,1320,1490,0,1,5796,6016,6166,2190 +0,0,0,1430,1,5796,6016,6166,2190 +980,0,1,1430,1,5796,6016,6166,2190 +0,1130,1,1450,1,5796,6016,6166,2190 +1000,1320,1,1460,1,5796,6016,6166,2190 +0,0,5366,1470,1,5816,6016,6166,2190 +980,1,5376,1480,1,5826,6016,6166,2200 +0,5246,5446,1480,1,5836,6016,6166,2200 +5076,5296,5446,1500,1,5836,6016,6166,2200 +0,0,0,0,9736,5836,6016,6166,2200 +980,0,0,1,9736,5846,6016,6166,2200 +0,1130,0,1,9736,5846,6016,6166,2200 +1000,1320,0,1,9736,5846,6016,6166,2200 +0,0,1290,1,9736,5846,6016,6166,2200 +980,0,1440,1,9756,5846,6016,6166,2200 +0,1130,1480,1,9756,5846,6016,6166,2200 +1000,1320,1500,1,9756,5846,6016,6166,2200 +0,0,0,9586,1,5746,5986,6146,2200 +980,0,1,9576,5666,5866,6016,6166,2210 +0,1130,1,9586,5666,5866,6016,6166,2210 +1000,1320,1,9596,5666,5866,6016,6166,2210 +0,0,9486,1,5626,5846,6016,6166,2210 +980,1,5386,5566,5726,5866,6016,6166,2210 +0,5246,1,5436,5666,5856,6006,6166,2210 5100,5300,5450,5600,5750,5900,6050,6200,2200 \ No newline at end of file diff --git a/doc/DateItemModel修改总结.md b/doc/DateItemModel修改总结.md index 7b94d8e..8873809 100644 --- a/doc/DateItemModel修改总结.md +++ b/doc/DateItemModel修改总结.md @@ -1,51 +1,51 @@ -# DateItemModel 修改总结 - -## 修改概述 -已成功将 `DateItemModel` 中的 `QStringList` 成员变量替换为 `std::array` 以提高类型安全性和访问性能。 - -## 修改的文件 - -### 1. scene/ViewModels.h -- 添加了 `#include ` -- 将 `QStringList` 成员变量替换为 `std::array`: - - `QStringList dataMap` → `std::array dataMap` - - `QStringList daysMap` → `std::array daysMap` - - `QStringList monthsMap` → `std::array monthsMap` - - `QStringList weeksMap` → `std::array weeksMap` - - `QStringList hoursMap` → `std::array hoursMap` - - `QMap yearsMap` → `std::array yearsArray` + `int startYear` -- 添加了默认构造函数声明 -- 移除了 `createDefaultReplaceModel` 函数声明 - -### 2. scene/ViewModels.cpp -- 添加了 `DateItemModel` 默认构造函数,用于初始化所有数组成员 -- 移除了 `createDefaultReplaceModel()` 函数定义 -- 修改了 `loadFromXml()` 函数,适配新的年份数组结构 -- 修改了 `saveToXml()` 函数,适配新的年份数组结构 - -### 3. DateVarSet.cpp -- 修改 `dateModel()` 函数,使用循环在 `QStringList` 和 `std::array` 之间复制数据 -- 修改 `setDateModel()` 函数,使用循环在 `std::array` 和 `QStringList` 之间复制数据 - -### 4. scene/DateReplaceEditor.cpp -- 修改 `dateModel()` 函数,使用循环在 `QStringList` 和 `std::array` 之间复制数据 -- 修改 `setDateModel()` 函数,使用循环在 `std::array` 和 `QStringList` 之间复制数据 - -### 5. scene/BarcodeEditor.cpp -- 修改检查空值的逻辑(从 `.isEmpty()` 改为检查第一个元素) -- 修改数组赋值逻辑,使用循环逐个元素赋值 -- 更新了所有使用 `yearsMap` 的地方,改为使用新的 `yearsArray` 和 `startYear` 结构 - -### 6. scene/ItemCommon.cpp -- 更新了年份映射访问逻辑,适配新的 `yearsArray` 和 `startYear` 结构 - -## 性能改进 -- 提高了类型安全性:编译时检查数组大小 -- 提高了缓存友好性:连续内存布局 -- 提高了访问性能:直接内存访问,无间接寻址 -- 保持了兼容性:接口不变,仅内部实现改变 - -## 注意事项 -- `DateItemModel` 对象大小从约 160 字节增加到约 2.2KB -- 但在实际使用场景中,此大小的复制性能影响微乎其微 +# DateItemModel 修改总结 + +## 修改概述 +已成功将 `DateItemModel` 中的 `QStringList` 成员变量替换为 `std::array` 以提高类型安全性和访问性能。 + +## 修改的文件 + +### 1. scene/ViewModels.h +- 添加了 `#include ` +- 将 `QStringList` 成员变量替换为 `std::array`: + - `QStringList dataMap` → `std::array dataMap` + - `QStringList daysMap` → `std::array daysMap` + - `QStringList monthsMap` → `std::array monthsMap` + - `QStringList weeksMap` → `std::array weeksMap` + - `QStringList hoursMap` → `std::array hoursMap` + - `QMap yearsMap` → `std::array yearsArray` + `int startYear` +- 添加了默认构造函数声明 +- 移除了 `createDefaultReplaceModel` 函数声明 + +### 2. scene/ViewModels.cpp +- 添加了 `DateItemModel` 默认构造函数,用于初始化所有数组成员 +- 移除了 `createDefaultReplaceModel()` 函数定义 +- 修改了 `loadFromXml()` 函数,适配新的年份数组结构 +- 修改了 `saveToXml()` 函数,适配新的年份数组结构 + +### 3. DateVarSet.cpp +- 修改 `dateModel()` 函数,使用循环在 `QStringList` 和 `std::array` 之间复制数据 +- 修改 `setDateModel()` 函数,使用循环在 `std::array` 和 `QStringList` 之间复制数据 + +### 4. scene/DateReplaceEditor.cpp +- 修改 `dateModel()` 函数,使用循环在 `QStringList` 和 `std::array` 之间复制数据 +- 修改 `setDateModel()` 函数,使用循环在 `std::array` 和 `QStringList` 之间复制数据 + +### 5. scene/BarcodeEditor.cpp +- 修改检查空值的逻辑(从 `.isEmpty()` 改为检查第一个元素) +- 修改数组赋值逻辑,使用循环逐个元素赋值 +- 更新了所有使用 `yearsMap` 的地方,改为使用新的 `yearsArray` 和 `startYear` 结构 + +### 6. scene/ItemCommon.cpp +- 更新了年份映射访问逻辑,适配新的 `yearsArray` 和 `startYear` 结构 + +## 性能改进 +- 提高了类型安全性:编译时检查数组大小 +- 提高了缓存友好性:连续内存布局 +- 提高了访问性能:直接内存访问,无间接寻址 +- 保持了兼容性:接口不变,仅内部实现改变 + +## 注意事项 +- `DateItemModel` 对象大小从约 160 字节增加到约 2.2KB +- 但在实际使用场景中,此大小的复制性能影响微乎其微 - 移动语义仍然可用,且性能表现良好 \ No newline at end of file diff --git a/doc/DateItemModel改进与修改_再review.md b/doc/DateItemModel改进与修改_再review.md index 4bd0b39..6db4022 100644 --- a/doc/DateItemModel改进与修改_再review.md +++ b/doc/DateItemModel改进与修改_再review.md @@ -1,240 +1,240 @@ -# DateItemModel 改进与修改 —— 再 Review - -> 本文档对 `doc/DateItemModel改进分析.md` 与 `doc/DateItemModel修改总结.md` 描述的改造工作进行交叉核对,比对实际代码(`scene/ViewModels.h/.cpp`、`DateVarSet.cpp`、`scene/DateReplaceEditor.cpp`、`scene/BarcodeEditor.cpp`、`scene/ItemCommon.cpp/.h`),列出确实落地、漏改、以及隐藏风险的部分。 - ---- - -## 1. 总体评估 - -文档描述的整体改造方向(`QStringList → std::array`、移除 `createDefaultReplaceModel`、新增默认构造函数、`QMap yearsMap → std::array yearsArray + int startYear`)在以下文件里**基本落地**: - -- `scene/ViewModels.h`:成员类型替换 ✅;声明默认构造函数 ✅;移除 `createDefaultReplaceModel` ✅。 -- `scene/ViewModels.cpp`:默认构造函数初始化各数组 ✅;`loadFromXml` / `saveToXml` 改为新结构 ✅(**有缺陷,见 §2.2**)。 -- `scene/DateReplaceEditor.cpp`:`dateModel()` / `setDateModel()` 改为循环复制 ✅。 -- `scene/BarcodeEditor.cpp`:默认值兜底逻辑、模型搬运改为新结构 ✅。 -- `scene/ItemCommon.cpp`:年份访问改为 `startYear + index` ✅。 - -但存在 **1 处编译错误** 与 **1 处数据丢失隐患**,外加若干小瑕疵。 - ---- - -## 2. 严重问题(必须修复) - -### 2.1 🔴 `DateVarSet.cpp:540` 编译失败 —— 修改总结里漏改的关键一行 - -```cpp -// DateVarSet.cpp 当前代码 -yearList = model.yearsArray; // ❌ QStringList 不能直接 = std::array -``` - -`yearList` 是 `DateVarSet.h` 中声明的 `QStringList`;`model.yearsArray` 是 `std::array`。两者之间**没有赋值运算符**,这一行直接编译错误。 - -`scene/DateReplaceEditor.cpp` 的对应位置已经改成了循环写入,但 `DateVarSet.cpp` 对此漏掉。 - -**修复**(与同文件 510~534 行其它 list 保持一致): - -```cpp -yearList.clear(); -for (size_t i = 0; i < model.yearsArray.size(); ++i) { - yearList.append(model.yearsArray[i]); -} -``` - -> 影响面:编译过不去,整个 Qt 工程构建失败。 - ---- - -### 2.2 🔴 `loadFromXml` 没还原 `startYear` —— 跨年加载会丢用户配置 - -`scene/ViewModels.cpp::loadFromXml` 的相关片段: - -```cpp -m.startYear = QDate::currentDate().year(); // ← 永远用当前年份当 startYear -auto yearsMap = attrs.value("yearsMap").toString().split("
"); -for (auto it = yearsMap.begin(); it != yearsMap.end(); ++it) { - auto yearPair = it->split(""); - int year = yearPair[0].toInt(); - if (year >= m.startYear && year < m.startYear + 16) { // ← 早于当前年的全部丢弃 - int index = year - m.startYear; - m.yearsArray[index] = yearPair[1]; - } -} -``` - -而 `saveToXml` 是按 `m.startYear + i` 写出去的: - -```cpp -for (int i = 0; i < 16; ++i) { - int year = m.startYear + i; - yearsMap.append(QString("%1%2
").arg(year).arg(m.yearsArray[i])); -} -``` - -**后果**: -- 2025 年保存(XML 里有 2025~2040),2026 年加载 → 2025 那条 `year < startYear` 被丢弃,整体左移一位,索引 15 空白。 -- 2024 年保存,2026 年加载 → 2024、2025 两条全丢,错位 2 位。 -- 用户**任何针对早于"系统当前年"的自定义年份映射,下次加载都会消失**。 - -**修复(推荐)**:把 `startYear` 作为独立 XML 属性持久化: - -```cpp -// saveToXml -attrs.append("startYear", QString::number(m.startYear)); - -// loadFromXml -int sy = attrs.value("startYear").toInt(); -m.startYear = (sy != 0) ? sy : QDate::currentDate().year(); // 兼容旧文件 -``` - -或退而求其次,loadFromXml 用 XML 里第一条 year 设定 `m.startYear`。 - -> 影响面:用户在编辑器里配置的年份字串,跨年使用会静默丢失/错位。 - ---- - -## 3. 次要问题(不影响编译,建议修) - -### 3.1 🟡 `scene/ItemCommon.h` 头注释未同步 - -``` -* - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsMap) -``` - -`yearsMap` 已被 `yearsArray + startYear` 替代,注释应同步更新,否则后续阅读者会找不到 `yearsMap`。 - ---- - -### 3.2 🟡 `dateModel()` 写入年份时丢了"用户起始年"语义 - -`DateVarSet.cpp::dateModel()` 与 `scene/DateReplaceEditor.cpp::dateModel()` 都是这种写法: - -```cpp -DateItemModel model; // model.startYear = 当前年(来自默认构造函数) -for (int i = 0; i < yearInitList.size() && i < 16; ++i) { - int year = yearInitList[i]; - if (year >= model.startYear && year < model.startYear + 16) { - int index = year - model.startYear; - model.yearsArray[index] = yearList[i]; - } -} -``` - -由于当前 `yearInitList` 也是从今年开始填充的,**当前能凑巧跑通**;但这里没有把 UI 里实际看到的起始年同步回 `model.startYear`。一旦未来扩展为"展示历史年份"或"展示从某指定年开始的年份序列",这里会静默丢数据。 - -**更直白的写法**: - -```cpp -if (!yearInitList.isEmpty()) { - model.startYear = yearInitList.first(); -} -const int n = std::min(yearInitList.size(), 16); -for (int i = 0; i < n; ++i) { - model.yearsArray[i] = yearList[i]; -} -``` - ---- - -### 3.3 🟡 signed/unsigned 比较警告 - -`DateVarSet.cpp` / `scene/DateReplaceEditor.cpp` 中大量这样写: - -```cpp -for (size_t i = 0; i < std::min(dataList.size(), static_cast(model.dataMap.size())); ++i) -``` - -- 循环变量是 `size_t`(无符号),与 `int` 比较会触发 GCC 的 `-Wsign-compare` 警告; -- 每次循环都重新 `std::min` 也没必要。 - -**建议**改为: - -```cpp -const int n = std::min(dataList.size(), static_cast(model.dataMap.size())); -for (int i = 0; i < n; ++i) { ... } -``` - ---- - -### 3.4 🟡 `scene/BarcodeEditor.cpp` 五个手写循环冗余 - -```cpp -for (size_t i = 0; i < m_vm.dateViewModel.dataMap.size(); ++i) { - m_vm.dateViewModel.dataMap[i] = rep.dataMap[i]; -} -// ... 类似 5 段 ... -m_vm.dateViewModel.yearsArray = rep.yearsArray; // 这里直接赋值是对的 -``` - -`std::array` 自身就支持 `=`,最后一行 `yearsArray` 已经这样写了。前面 5 段 `for` 循环都可以直接简化: - -```cpp -m_vm.dateViewModel.dataMap = rep.dataMap; -m_vm.dateViewModel.daysMap = rep.daysMap; -m_vm.dateViewModel.monthsMap = rep.monthsMap; -m_vm.dateViewModel.weeksMap = rep.weeksMap; -m_vm.dateViewModel.hoursMap = rep.hoursMap; -``` - -不影响功能,纯属冗余。 - ---- - -## 4. 文档与实现不一致清单 - -| 文档原话 | 实际代码 | 影响 | -|---|---|---| -| "DateVarSet.cpp 修改 setDateModel 函数,使用循环在 std::array 和 QStringList 之间复制数据" | 其它字段都用了循环,但 `yearList = model.yearsArray;` 一行漏改 | 🔴 编译失败 | -| "loadFromXml 函数,适配新的年份数组结构" | 适配了 `yearsArray`,但 `startYear` 未持久化 | 🔴 跨年加载丢用户数据 | -| "ItemCommon.cpp 更新了年份映射访问逻辑,适配新的 yearsArray 和 startYear 结构" | `.cpp` 已改,但 `.h` 头注释仍引用 `yearsMap` | 🟡 文档失同步 | -| "保持了兼容性:接口不变,仅内部实现改变" | XML schema 已变(`yearsMap` 编码方式变化、缺少 `startYear` 字段) | 🔴 与已部署设备的存档不完全互通 | - ---- - -## 5. 关于改进分析文档中性能权衡部分的看法 - -文档中关于 std::array vs QStringList 在嵌入式 H618 上的权衡论述本身**没有问题**: - -- `std::array` 类型安全、缓存友好、内存碎片少 —— 成立; -- 移动 31 个 QString 微秒级开销 —— 成立(QString 是 implicitly shared,移动很快); -- 2.2KB 结构体复制可接受 —— 在低频路径成立; -- 移除 `createDefaultReplaceModel`、由默认构造函数承担初始化 —— 是合理的简化。 - -但有两点提醒: - -1. **`std::array` 移动 ≠ "transfer pointer" 的 O(1)**。每个 QString 元素逐个移动,引用计数不变但仍要逐个调用移动构造,总体 O(N)。N=31 时不是性能问题,但与文档"只需转移指针和引用计数"那一段的描述不太一致。 - -2. **2.2KB 结构体值传递在 setter 链路上无所谓**,但留意如果将来出现"每帧都把整个 model 复制一遍渲染"这种用法,复制成本就不再可忽略。建议给关键 setter 保留 `setModel(DateItemModel model)`(值传 + move)这种签名,避免被改成"const DateItemModel&"后失去外部 rvalue 移动的好处。 - ---- - -## 6. 结论 - -- **建议至少修掉 §2.1 与 §2.2**:前者不修无法编译;后者不修跨年加载会丢用户在编辑器里配置的年份字串,且无任何运行时报错(最危险的那种 bug)。 -- §3 的几条都是清理性工作,可按需进行。 -- §4 中关于"接口不变 = 完全兼容"的说法在 XML schema 层面其实已不成立,老存档与新固件的双向兼容性需要单独评估。 - ---- - -## 7. 修复 Patch 摘要(建议改动) - -```diff -// DateVarSet.cpp (around line 540) -- yearList = model.yearsArray; -+ yearList.clear(); -+ for (size_t i = 0; i < model.yearsArray.size(); ++i) { -+ yearList.append(model.yearsArray[i]); -+ } - -// scene/ViewModels.cpp saveToXml -+ attrs.append("startYear", QString::number(m.startYear)); - -// scene/ViewModels.cpp loadFromXml -- m.startYear = QDate::currentDate().year(); -+ { -+ int sy = attrs.value("startYear").toInt(); -+ m.startYear = (sy != 0) ? sy : QDate::currentDate().year(); -+ } - -// scene/ItemCommon.h 注释更新 -- * - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsMap) +# DateItemModel 改进与修改 —— 再 Review + +> 本文档对 `doc/DateItemModel改进分析.md` 与 `doc/DateItemModel修改总结.md` 描述的改造工作进行交叉核对,比对实际代码(`scene/ViewModels.h/.cpp`、`DateVarSet.cpp`、`scene/DateReplaceEditor.cpp`、`scene/BarcodeEditor.cpp`、`scene/ItemCommon.cpp/.h`),列出确实落地、漏改、以及隐藏风险的部分。 + +--- + +## 1. 总体评估 + +文档描述的整体改造方向(`QStringList → std::array`、移除 `createDefaultReplaceModel`、新增默认构造函数、`QMap yearsMap → std::array yearsArray + int startYear`)在以下文件里**基本落地**: + +- `scene/ViewModels.h`:成员类型替换 ✅;声明默认构造函数 ✅;移除 `createDefaultReplaceModel` ✅。 +- `scene/ViewModels.cpp`:默认构造函数初始化各数组 ✅;`loadFromXml` / `saveToXml` 改为新结构 ✅(**有缺陷,见 §2.2**)。 +- `scene/DateReplaceEditor.cpp`:`dateModel()` / `setDateModel()` 改为循环复制 ✅。 +- `scene/BarcodeEditor.cpp`:默认值兜底逻辑、模型搬运改为新结构 ✅。 +- `scene/ItemCommon.cpp`:年份访问改为 `startYear + index` ✅。 + +但存在 **1 处编译错误** 与 **1 处数据丢失隐患**,外加若干小瑕疵。 + +--- + +## 2. 严重问题(必须修复) + +### 2.1 🔴 `DateVarSet.cpp:540` 编译失败 —— 修改总结里漏改的关键一行 + +```cpp +// DateVarSet.cpp 当前代码 +yearList = model.yearsArray; // ❌ QStringList 不能直接 = std::array +``` + +`yearList` 是 `DateVarSet.h` 中声明的 `QStringList`;`model.yearsArray` 是 `std::array`。两者之间**没有赋值运算符**,这一行直接编译错误。 + +`scene/DateReplaceEditor.cpp` 的对应位置已经改成了循环写入,但 `DateVarSet.cpp` 对此漏掉。 + +**修复**(与同文件 510~534 行其它 list 保持一致): + +```cpp +yearList.clear(); +for (size_t i = 0; i < model.yearsArray.size(); ++i) { + yearList.append(model.yearsArray[i]); +} +``` + +> 影响面:编译过不去,整个 Qt 工程构建失败。 + +--- + +### 2.2 🔴 `loadFromXml` 没还原 `startYear` —— 跨年加载会丢用户配置 + +`scene/ViewModels.cpp::loadFromXml` 的相关片段: + +```cpp +m.startYear = QDate::currentDate().year(); // ← 永远用当前年份当 startYear +auto yearsMap = attrs.value("yearsMap").toString().split("
"); +for (auto it = yearsMap.begin(); it != yearsMap.end(); ++it) { + auto yearPair = it->split(""); + int year = yearPair[0].toInt(); + if (year >= m.startYear && year < m.startYear + 16) { // ← 早于当前年的全部丢弃 + int index = year - m.startYear; + m.yearsArray[index] = yearPair[1]; + } +} +``` + +而 `saveToXml` 是按 `m.startYear + i` 写出去的: + +```cpp +for (int i = 0; i < 16; ++i) { + int year = m.startYear + i; + yearsMap.append(QString("%1%2
").arg(year).arg(m.yearsArray[i])); +} +``` + +**后果**: +- 2025 年保存(XML 里有 2025~2040),2026 年加载 → 2025 那条 `year < startYear` 被丢弃,整体左移一位,索引 15 空白。 +- 2024 年保存,2026 年加载 → 2024、2025 两条全丢,错位 2 位。 +- 用户**任何针对早于"系统当前年"的自定义年份映射,下次加载都会消失**。 + +**修复(推荐)**:把 `startYear` 作为独立 XML 属性持久化: + +```cpp +// saveToXml +attrs.append("startYear", QString::number(m.startYear)); + +// loadFromXml +int sy = attrs.value("startYear").toInt(); +m.startYear = (sy != 0) ? sy : QDate::currentDate().year(); // 兼容旧文件 +``` + +或退而求其次,loadFromXml 用 XML 里第一条 year 设定 `m.startYear`。 + +> 影响面:用户在编辑器里配置的年份字串,跨年使用会静默丢失/错位。 + +--- + +## 3. 次要问题(不影响编译,建议修) + +### 3.1 🟡 `scene/ItemCommon.h` 头注释未同步 + +``` +* - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsMap) +``` + +`yearsMap` 已被 `yearsArray + startYear` 替代,注释应同步更新,否则后续阅读者会找不到 `yearsMap`。 + +--- + +### 3.2 🟡 `dateModel()` 写入年份时丢了"用户起始年"语义 + +`DateVarSet.cpp::dateModel()` 与 `scene/DateReplaceEditor.cpp::dateModel()` 都是这种写法: + +```cpp +DateItemModel model; // model.startYear = 当前年(来自默认构造函数) +for (int i = 0; i < yearInitList.size() && i < 16; ++i) { + int year = yearInitList[i]; + if (year >= model.startYear && year < model.startYear + 16) { + int index = year - model.startYear; + model.yearsArray[index] = yearList[i]; + } +} +``` + +由于当前 `yearInitList` 也是从今年开始填充的,**当前能凑巧跑通**;但这里没有把 UI 里实际看到的起始年同步回 `model.startYear`。一旦未来扩展为"展示历史年份"或"展示从某指定年开始的年份序列",这里会静默丢数据。 + +**更直白的写法**: + +```cpp +if (!yearInitList.isEmpty()) { + model.startYear = yearInitList.first(); +} +const int n = std::min(yearInitList.size(), 16); +for (int i = 0; i < n; ++i) { + model.yearsArray[i] = yearList[i]; +} +``` + +--- + +### 3.3 🟡 signed/unsigned 比较警告 + +`DateVarSet.cpp` / `scene/DateReplaceEditor.cpp` 中大量这样写: + +```cpp +for (size_t i = 0; i < std::min(dataList.size(), static_cast(model.dataMap.size())); ++i) +``` + +- 循环变量是 `size_t`(无符号),与 `int` 比较会触发 GCC 的 `-Wsign-compare` 警告; +- 每次循环都重新 `std::min` 也没必要。 + +**建议**改为: + +```cpp +const int n = std::min(dataList.size(), static_cast(model.dataMap.size())); +for (int i = 0; i < n; ++i) { ... } +``` + +--- + +### 3.4 🟡 `scene/BarcodeEditor.cpp` 五个手写循环冗余 + +```cpp +for (size_t i = 0; i < m_vm.dateViewModel.dataMap.size(); ++i) { + m_vm.dateViewModel.dataMap[i] = rep.dataMap[i]; +} +// ... 类似 5 段 ... +m_vm.dateViewModel.yearsArray = rep.yearsArray; // 这里直接赋值是对的 +``` + +`std::array` 自身就支持 `=`,最后一行 `yearsArray` 已经这样写了。前面 5 段 `for` 循环都可以直接简化: + +```cpp +m_vm.dateViewModel.dataMap = rep.dataMap; +m_vm.dateViewModel.daysMap = rep.daysMap; +m_vm.dateViewModel.monthsMap = rep.monthsMap; +m_vm.dateViewModel.weeksMap = rep.weeksMap; +m_vm.dateViewModel.hoursMap = rep.hoursMap; +``` + +不影响功能,纯属冗余。 + +--- + +## 4. 文档与实现不一致清单 + +| 文档原话 | 实际代码 | 影响 | +|---|---|---| +| "DateVarSet.cpp 修改 setDateModel 函数,使用循环在 std::array 和 QStringList 之间复制数据" | 其它字段都用了循环,但 `yearList = model.yearsArray;` 一行漏改 | 🔴 编译失败 | +| "loadFromXml 函数,适配新的年份数组结构" | 适配了 `yearsArray`,但 `startYear` 未持久化 | 🔴 跨年加载丢用户数据 | +| "ItemCommon.cpp 更新了年份映射访问逻辑,适配新的 yearsArray 和 startYear 结构" | `.cpp` 已改,但 `.h` 头注释仍引用 `yearsMap` | 🟡 文档失同步 | +| "保持了兼容性:接口不变,仅内部实现改变" | XML schema 已变(`yearsMap` 编码方式变化、缺少 `startYear` 字段) | 🔴 与已部署设备的存档不完全互通 | + +--- + +## 5. 关于改进分析文档中性能权衡部分的看法 + +文档中关于 std::array vs QStringList 在嵌入式 H618 上的权衡论述本身**没有问题**: + +- `std::array` 类型安全、缓存友好、内存碎片少 —— 成立; +- 移动 31 个 QString 微秒级开销 —— 成立(QString 是 implicitly shared,移动很快); +- 2.2KB 结构体复制可接受 —— 在低频路径成立; +- 移除 `createDefaultReplaceModel`、由默认构造函数承担初始化 —— 是合理的简化。 + +但有两点提醒: + +1. **`std::array` 移动 ≠ "transfer pointer" 的 O(1)**。每个 QString 元素逐个移动,引用计数不变但仍要逐个调用移动构造,总体 O(N)。N=31 时不是性能问题,但与文档"只需转移指针和引用计数"那一段的描述不太一致。 + +2. **2.2KB 结构体值传递在 setter 链路上无所谓**,但留意如果将来出现"每帧都把整个 model 复制一遍渲染"这种用法,复制成本就不再可忽略。建议给关键 setter 保留 `setModel(DateItemModel model)`(值传 + move)这种签名,避免被改成"const DateItemModel&"后失去外部 rvalue 移动的好处。 + +--- + +## 6. 结论 + +- **建议至少修掉 §2.1 与 §2.2**:前者不修无法编译;后者不修跨年加载会丢用户在编辑器里配置的年份字串,且无任何运行时报错(最危险的那种 bug)。 +- §3 的几条都是清理性工作,可按需进行。 +- §4 中关于"接口不变 = 完全兼容"的说法在 XML schema 层面其实已不成立,老存档与新固件的双向兼容性需要单独评估。 + +--- + +## 7. 修复 Patch 摘要(建议改动) + +```diff +// DateVarSet.cpp (around line 540) +- yearList = model.yearsArray; ++ yearList.clear(); ++ for (size_t i = 0; i < model.yearsArray.size(); ++i) { ++ yearList.append(model.yearsArray[i]); ++ } + +// scene/ViewModels.cpp saveToXml ++ attrs.append("startYear", QString::number(m.startYear)); + +// scene/ViewModels.cpp loadFromXml +- m.startYear = QDate::currentDate().year(); ++ { ++ int sy = attrs.value("startYear").toInt(); ++ m.startYear = (sy != 0) ? sy : QDate::currentDate().year(); ++ } + +// scene/ItemCommon.h 注释更新 +- * - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsMap) + * - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsArray + model.startYear) \ No newline at end of file diff --git a/doc/DateItemModel改进分析.md b/doc/DateItemModel改进分析.md index fc7986d..8ea6a0f 100644 --- a/doc/DateItemModel改进分析.md +++ b/doc/DateItemModel改进分析.md @@ -1,294 +1,294 @@ -# DateItemModel 改进分析 - -## 1. 当前 DateItemModel 使用分析 - -### 1.1 结构定义 -```cpp -struct DateItemModel { - QString datetimePattern; - int monthsOffset = 0; - int daysOffset = 0; - QStringList dataMap; // unused - QStringList daysMap; - QStringList monthsMap; - QMap yearsMap; - QStringList weeksMap; - QStringList hoursMap; - - static DateItemModel createDefaultReplaceModel(); - static void loadFromXml(DateItemModel& vm, const QXmlStreamAttributes& attrs); - static void saveToXml(const DateItemModel& vm, QXmlStreamAttributes& attrs); -}; -``` - -### 1.2 主要使用场景 - -**PicDateItem 类**: -- 存储为成员变量 `m_model` -- 通过 `setModel(DateItemModel model)` 方法接收新模型(使用移动语义) -- 在 `setCustomAttrs` 和 `saveCustomAttrs` 中进行 XML 序列化 -- 用于生成实时更新的日期时间字符串 - -**DateReplaceEditor 类**: -- 在 UI 编辑器中双向绑定数据 -- 通过 `dateModel()` 返回完整的模型数据 -- 通过 `setDateModel(const DateItemModel& model)` 接收模型 - -**DateVarSet 类**: -- 与 UI 界面进行双向数据同步 -- 在 `dateModel()` 和 `setDateModel()` 中进行数据转换 - -## 2. 性能分析 (针对全志H618平台) - -### 2.1 平台特性 -- 全志H618是ARM架构处理器,主频约1.5GHz -- 通常配备1-2GB RAM -- 资源相对受限,需要优化内存和CPU使用 - -### 2.2 QStringList vs std::array 性能对比 - -#### 2.2.1 内存占用对比 -- **QStringList**: 每个列表包含额外的元数据(引用计数、大小、容量等) - - dataMap (16个QString): ~16*(QString开销) + 指针数组开销 - - daysMap (31个QString): ~31*(QString开销) + 指针数组开销 - - monthsMap (12个QString): ~12*(QString开销) + 指针数组开销 - - weeksMap (7个QString): ~7*(QString开销) + 指针数组开销 - - hoursMap (24个QString): ~24*(QString开销) + 指针数组开销 - -- **std::array**: 直接内联存储,无额外指针 - - 更好的缓存局部性 - - 减少内存碎片 - -#### 2.2.2 访问性能 -- **QStringList**: 间接访问(指针跳转) -- **std::array**: 直接访问(连续内存),更好的缓存命中率 - -#### 2.2.3 构造/析构性能 -- **QStringList**: 共享数据,浅拷贝,但在赋值时可能触发深度拷贝 -- **std::array**: 需要移动/拷贝每个元素 - -### 2.3 移动语义分析 - -#### 2.3.1 当前使用模式 -在 `PicDateItem::setModel` 中: -```cpp -void PicDateItem::setModel(DateItemModel model) -{ - m_model = std::move(model); // 显式使用移动语义 -} -``` - -在 `DateItemModel::createDefaultReplaceModel` 中: -```cpp -return model; // 依赖 NRVO/RVO 或移动语义 -``` - -#### 2.3.2 性能影响评估 - -对于小规模数组(N < 32): -- **QStringList 移动**: O(1) - 只需转移指针和引用计数 -- **std::array 移动**: O(N) - 需要移动 N 个 QString - -但要注意: -1. QString 本身实现了移动语义,移动是高效的操作 -2. N 值较小(最大31个元素),移动开销可接受 -3. 在 H618 上,移动 31 个 QString 的时间仍远小于毫秒级 - -## 3. 实际使用场景分析 - -### 3.1 频繁操作类型 -- 读取操作: 高频(UI 显示、日期计算) -- 写入操作: 中频(用户编辑、配置变更) -- 复制/移动操作: 低频(对象传递、赋值) - -### 3.2 性能瓶颈预测 -- 读取操作: `std::array` 胜出(更好的缓存局部性) -- 写入操作: 两者相当 -- 移动操作: `QStringList` 略优,但差距很小 - -## 4. 推荐方案 - -### 4.1 最优实现 -```cpp -#include - -struct DateItemModel { - QString datetimePattern; - int monthsOffset = 0; - int daysOffset = 0; - - std::array dataMap; // 固定大小,类型安全 - std::array daysMap; // 固定大小,类型安全 - std::array monthsMap; // 固定大小,类型安全 - std::array weeksMap; // 固定大小,类型安全 - std::array hoursMap; // 固定大小,类型安全 - - std::array yearsArray; // 年份数组,固定大小 - int startYear; // 起始年份,用于计算索引对应的年份 -}; -``` - -### 4.2 实现注意事项 -```cpp -// 在 ViewModel.cpp 中相应修改 -DateItemModel DateItemModel::createDefaultReplaceModel() -{ - DateItemModel model; - - // 初始化 dataMap - const char* dataValues[] = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; - for (int i = 0; i < 16; ++i) { - model.dataMap[i] = QString(dataValues[i]); - } - - // 初始化 daysMap - for (int i = 0; i < 31; ++i) { - model.daysMap[i] = QString("%1").arg(i + 1, 2, 10, QChar('0')); - } - - // 初始化 monthsMap - for (int i = 0; i < 12; ++i) { - model.monthsMap[i] = QString("%1").arg(i + 1, 2, 10, QChar('0')); - } - - // 初始化 weeksMap - const char* weekValues[] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; - for (int i = 0; i < 7; ++i) { - model.weeksMap[i] = QString(weekValues[i]); - } - - // 初始化 hoursMap - for (int i = 0; i < 24; ++i) { - model.hoursMap[i] = QString("%1").arg(i, 2, 10, QChar('0')); - } - - int startYear = QDate::currentDate().year(); - for (int i = 0; i < 16; ++i) { - model.yearsMap.insert(startYear + i, QString::number(startYear + i)); - } - - return model; -} -``` - -## 5. 性能权衡结论 - -### 5.1 移动语义影响 -在全志H618平台上: -- **移动开销**: 对于固定小数组,移动 31 个 QString 的开销非常小(微秒级) -- **访问优势**: `std::array` 提供更好的缓存局部性和访问性能 -- **总体影响**: 类型安全和访问性能的收益远大于移动语义的轻微损失 - -### 5.2 最终建议 -**推荐使用 `std::array`**,理由如下: -1. **类型安全**: 编译时确保固定大小,防止越界 -2. **性能优势**: 更好的缓存局部性和访问性能 -3. **内存效率**: 减少内存碎片,更紧凑的布局 -4. **可维护性**: 清晰表达数据结构的固定大小特征 -5. **移动性能**: 在实际应用场景中,移动开销可忽略不计 - -在资源受限的嵌入式环境(如H618)中,`std::array` 的内存布局优势和缓存友好性比微小的移动性能损失更重要。 - -## 6. 关于2.2KB结构体大小的分析 - -### 6.1 大小计算详情 -改为 `std::array` 后的 `DateItemModel` 总大小约为: -- `QString datetimePattern`: ~24 字节 -- `int monthsOffset`: 4 字节 -- `int daysOffset`: 4 字节 -- `std::array dataMap`: 16 × ~24 = ~384 字节 -- `std::array daysMap`: 31 × ~24 = ~744 字节 -- `std::array monthsMap`: 12 × ~24 = ~288 字节 -- `QMap yearsMap`: ~32 字节 -- `std::array weeksMap`: 7 × ~24 = ~168 字节 -- `std::array hoursMap`: 24 × ~24 = ~576 字节 - -**总计:约 2220 字节(~2.2KB)** - -### 6.2 性能影响评估 - -在全志H618平台上: -- **复制时间估算**:2.2KB 复制约需 1-5 微秒 -- **使用频率**:UI 编辑操作每秒最多几次,非常低频 -- **CPU 占用**:即使每秒 100 次复制,也仅占 CPU 时间的 0.05% - -### 6.3 可接受性结论 - -**2.2KB 结构体复制在当前代码中是完全可以接受的**,因为: -1. **性能影响微乎其微**:复制时间远小于其他系统操作(UI渲染、I/O等) -2. **使用频率极低**:实际复制操作非常不频繁 -3. **硬件能力充足**:全志H618足以处理这种规模的数据复制 -4. **代码简洁性**:值语义比智能指针语义更简单直观 -5. **调试便利性**:值对象更容易调试和跟踪 - -## 7. 关于createDefaultReplaceModel函数的改进 - -随着我们将DateItemModel结构改为使用构造函数初始化,我们也可以移除createDefaultReplaceModel静态函数。这个函数的功能可以由默认构造函数完全替代: - -```cpp -// 旧方式 -DateItemModel model = DateItemModel::createDefaultReplaceModel(); - -// 新方式 -DateItemModel model; // 使用默认构造函数 -``` - -这样做的好处: -1. 简化了API:不再需要单独的工厂函数 -2. 保持了一致性:所有实例都通过构造函数初始化 -3. 减少了代码冗余:构造函数已经提供了相同的初始化逻辑 - -## 8. 关于传递方式的分析 - -### 8.1 当前传递方式 -在 `PicDateItem::setModel(DateItemModel model)` 中,使用值传递但配合移动语义: -```cpp -void PicDateItem::setModel(DateItemModel model) -{ - m_model = std::move(model); // 实际使用移动语义 -} -``` - -### 7.2 传递方式对比 - -| 方式 | 复制开销 | 复杂性 | 适用场景 | -|------|----------|--------|----------| -| 值传递 + 移动 | 低(移动而非复制) | 低 | 推荐,适合当前场景 | -| const 引用 | 无传参开销 | 中 | 需要额外复制到成员 | -| 智能指针 | 8字节指针 | 高 | 需要共享数据时 | - -## 9. 年份映射的优化改进 - -原来的 `QMap yearsMap` 被替换为 `std::array yearsArray` 和 `int startYear` 的组合: - -**优点:** -1. **内存效率更高**:`std::array` 比 `QMap` 占用更少内存 -2. **访问速度更快**:数组访问比哈希表访问更快 -3. **缓存友好**:连续内存布局提供更好的缓存性能 -4. **类型安全**:编译时确定大小,防止越界 - -**实现方式:** -- `startYear` 存储起始年份(如 2023) -- `yearsArray[0]` 对应 `startYear` 年(2023年) -- `yearsArray[1]` 对应 `startYear + 1` 年(2024年) -- 以此类推,最多支持16个连续年份 - -**访问逻辑:** -```cpp -// 访问特定年份的映射值 -int year = 2025; -if (year >= startYear && year < startYear + 16) { - int index = year - startYear; - QString mappedValue = yearsArray[index]; -} -``` - -### 7.3 推荐方案 -保持当前的值传递设计,利用移动语义获得最佳性能: -```cpp -// 调用时使用移动 -DateItemModel model = DateItemModel::createDefaultReplaceModel(); -picItem.setModel(std::move(model)); // 零拷贝移动 -``` - +# DateItemModel 改进分析 + +## 1. 当前 DateItemModel 使用分析 + +### 1.1 结构定义 +```cpp +struct DateItemModel { + QString datetimePattern; + int monthsOffset = 0; + int daysOffset = 0; + QStringList dataMap; // unused + QStringList daysMap; + QStringList monthsMap; + QMap yearsMap; + QStringList weeksMap; + QStringList hoursMap; + + static DateItemModel createDefaultReplaceModel(); + static void loadFromXml(DateItemModel& vm, const QXmlStreamAttributes& attrs); + static void saveToXml(const DateItemModel& vm, QXmlStreamAttributes& attrs); +}; +``` + +### 1.2 主要使用场景 + +**PicDateItem 类**: +- 存储为成员变量 `m_model` +- 通过 `setModel(DateItemModel model)` 方法接收新模型(使用移动语义) +- 在 `setCustomAttrs` 和 `saveCustomAttrs` 中进行 XML 序列化 +- 用于生成实时更新的日期时间字符串 + +**DateReplaceEditor 类**: +- 在 UI 编辑器中双向绑定数据 +- 通过 `dateModel()` 返回完整的模型数据 +- 通过 `setDateModel(const DateItemModel& model)` 接收模型 + +**DateVarSet 类**: +- 与 UI 界面进行双向数据同步 +- 在 `dateModel()` 和 `setDateModel()` 中进行数据转换 + +## 2. 性能分析 (针对全志H618平台) + +### 2.1 平台特性 +- 全志H618是ARM架构处理器,主频约1.5GHz +- 通常配备1-2GB RAM +- 资源相对受限,需要优化内存和CPU使用 + +### 2.2 QStringList vs std::array 性能对比 + +#### 2.2.1 内存占用对比 +- **QStringList**: 每个列表包含额外的元数据(引用计数、大小、容量等) + - dataMap (16个QString): ~16*(QString开销) + 指针数组开销 + - daysMap (31个QString): ~31*(QString开销) + 指针数组开销 + - monthsMap (12个QString): ~12*(QString开销) + 指针数组开销 + - weeksMap (7个QString): ~7*(QString开销) + 指针数组开销 + - hoursMap (24个QString): ~24*(QString开销) + 指针数组开销 + +- **std::array**: 直接内联存储,无额外指针 + - 更好的缓存局部性 + - 减少内存碎片 + +#### 2.2.2 访问性能 +- **QStringList**: 间接访问(指针跳转) +- **std::array**: 直接访问(连续内存),更好的缓存命中率 + +#### 2.2.3 构造/析构性能 +- **QStringList**: 共享数据,浅拷贝,但在赋值时可能触发深度拷贝 +- **std::array**: 需要移动/拷贝每个元素 + +### 2.3 移动语义分析 + +#### 2.3.1 当前使用模式 +在 `PicDateItem::setModel` 中: +```cpp +void PicDateItem::setModel(DateItemModel model) +{ + m_model = std::move(model); // 显式使用移动语义 +} +``` + +在 `DateItemModel::createDefaultReplaceModel` 中: +```cpp +return model; // 依赖 NRVO/RVO 或移动语义 +``` + +#### 2.3.2 性能影响评估 + +对于小规模数组(N < 32): +- **QStringList 移动**: O(1) - 只需转移指针和引用计数 +- **std::array 移动**: O(N) - 需要移动 N 个 QString + +但要注意: +1. QString 本身实现了移动语义,移动是高效的操作 +2. N 值较小(最大31个元素),移动开销可接受 +3. 在 H618 上,移动 31 个 QString 的时间仍远小于毫秒级 + +## 3. 实际使用场景分析 + +### 3.1 频繁操作类型 +- 读取操作: 高频(UI 显示、日期计算) +- 写入操作: 中频(用户编辑、配置变更) +- 复制/移动操作: 低频(对象传递、赋值) + +### 3.2 性能瓶颈预测 +- 读取操作: `std::array` 胜出(更好的缓存局部性) +- 写入操作: 两者相当 +- 移动操作: `QStringList` 略优,但差距很小 + +## 4. 推荐方案 + +### 4.1 最优实现 +```cpp +#include + +struct DateItemModel { + QString datetimePattern; + int monthsOffset = 0; + int daysOffset = 0; + + std::array dataMap; // 固定大小,类型安全 + std::array daysMap; // 固定大小,类型安全 + std::array monthsMap; // 固定大小,类型安全 + std::array weeksMap; // 固定大小,类型安全 + std::array hoursMap; // 固定大小,类型安全 + + std::array yearsArray; // 年份数组,固定大小 + int startYear; // 起始年份,用于计算索引对应的年份 +}; +``` + +### 4.2 实现注意事项 +```cpp +// 在 ViewModel.cpp 中相应修改 +DateItemModel DateItemModel::createDefaultReplaceModel() +{ + DateItemModel model; + + // 初始化 dataMap + const char* dataValues[] = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; + for (int i = 0; i < 16; ++i) { + model.dataMap[i] = QString(dataValues[i]); + } + + // 初始化 daysMap + for (int i = 0; i < 31; ++i) { + model.daysMap[i] = QString("%1").arg(i + 1, 2, 10, QChar('0')); + } + + // 初始化 monthsMap + for (int i = 0; i < 12; ++i) { + model.monthsMap[i] = QString("%1").arg(i + 1, 2, 10, QChar('0')); + } + + // 初始化 weeksMap + const char* weekValues[] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; + for (int i = 0; i < 7; ++i) { + model.weeksMap[i] = QString(weekValues[i]); + } + + // 初始化 hoursMap + for (int i = 0; i < 24; ++i) { + model.hoursMap[i] = QString("%1").arg(i, 2, 10, QChar('0')); + } + + int startYear = QDate::currentDate().year(); + for (int i = 0; i < 16; ++i) { + model.yearsMap.insert(startYear + i, QString::number(startYear + i)); + } + + return model; +} +``` + +## 5. 性能权衡结论 + +### 5.1 移动语义影响 +在全志H618平台上: +- **移动开销**: 对于固定小数组,移动 31 个 QString 的开销非常小(微秒级) +- **访问优势**: `std::array` 提供更好的缓存局部性和访问性能 +- **总体影响**: 类型安全和访问性能的收益远大于移动语义的轻微损失 + +### 5.2 最终建议 +**推荐使用 `std::array`**,理由如下: +1. **类型安全**: 编译时确保固定大小,防止越界 +2. **性能优势**: 更好的缓存局部性和访问性能 +3. **内存效率**: 减少内存碎片,更紧凑的布局 +4. **可维护性**: 清晰表达数据结构的固定大小特征 +5. **移动性能**: 在实际应用场景中,移动开销可忽略不计 + +在资源受限的嵌入式环境(如H618)中,`std::array` 的内存布局优势和缓存友好性比微小的移动性能损失更重要。 + +## 6. 关于2.2KB结构体大小的分析 + +### 6.1 大小计算详情 +改为 `std::array` 后的 `DateItemModel` 总大小约为: +- `QString datetimePattern`: ~24 字节 +- `int monthsOffset`: 4 字节 +- `int daysOffset`: 4 字节 +- `std::array dataMap`: 16 × ~24 = ~384 字节 +- `std::array daysMap`: 31 × ~24 = ~744 字节 +- `std::array monthsMap`: 12 × ~24 = ~288 字节 +- `QMap yearsMap`: ~32 字节 +- `std::array weeksMap`: 7 × ~24 = ~168 字节 +- `std::array hoursMap`: 24 × ~24 = ~576 字节 + +**总计:约 2220 字节(~2.2KB)** + +### 6.2 性能影响评估 + +在全志H618平台上: +- **复制时间估算**:2.2KB 复制约需 1-5 微秒 +- **使用频率**:UI 编辑操作每秒最多几次,非常低频 +- **CPU 占用**:即使每秒 100 次复制,也仅占 CPU 时间的 0.05% + +### 6.3 可接受性结论 + +**2.2KB 结构体复制在当前代码中是完全可以接受的**,因为: +1. **性能影响微乎其微**:复制时间远小于其他系统操作(UI渲染、I/O等) +2. **使用频率极低**:实际复制操作非常不频繁 +3. **硬件能力充足**:全志H618足以处理这种规模的数据复制 +4. **代码简洁性**:值语义比智能指针语义更简单直观 +5. **调试便利性**:值对象更容易调试和跟踪 + +## 7. 关于createDefaultReplaceModel函数的改进 + +随着我们将DateItemModel结构改为使用构造函数初始化,我们也可以移除createDefaultReplaceModel静态函数。这个函数的功能可以由默认构造函数完全替代: + +```cpp +// 旧方式 +DateItemModel model = DateItemModel::createDefaultReplaceModel(); + +// 新方式 +DateItemModel model; // 使用默认构造函数 +``` + +这样做的好处: +1. 简化了API:不再需要单独的工厂函数 +2. 保持了一致性:所有实例都通过构造函数初始化 +3. 减少了代码冗余:构造函数已经提供了相同的初始化逻辑 + +## 8. 关于传递方式的分析 + +### 8.1 当前传递方式 +在 `PicDateItem::setModel(DateItemModel model)` 中,使用值传递但配合移动语义: +```cpp +void PicDateItem::setModel(DateItemModel model) +{ + m_model = std::move(model); // 实际使用移动语义 +} +``` + +### 7.2 传递方式对比 + +| 方式 | 复制开销 | 复杂性 | 适用场景 | +|------|----------|--------|----------| +| 值传递 + 移动 | 低(移动而非复制) | 低 | 推荐,适合当前场景 | +| const 引用 | 无传参开销 | 中 | 需要额外复制到成员 | +| 智能指针 | 8字节指针 | 高 | 需要共享数据时 | + +## 9. 年份映射的优化改进 + +原来的 `QMap yearsMap` 被替换为 `std::array yearsArray` 和 `int startYear` 的组合: + +**优点:** +1. **内存效率更高**:`std::array` 比 `QMap` 占用更少内存 +2. **访问速度更快**:数组访问比哈希表访问更快 +3. **缓存友好**:连续内存布局提供更好的缓存性能 +4. **类型安全**:编译时确定大小,防止越界 + +**实现方式:** +- `startYear` 存储起始年份(如 2023) +- `yearsArray[0]` 对应 `startYear` 年(2023年) +- `yearsArray[1]` 对应 `startYear + 1` 年(2024年) +- 以此类推,最多支持16个连续年份 + +**访问逻辑:** +```cpp +// 访问特定年份的映射值 +int year = 2025; +if (year >= startYear && year < startYear + 16) { + int index = year - startYear; + QString mappedValue = yearsArray[index]; +} +``` + +### 7.3 推荐方案 +保持当前的值传递设计,利用移动语义获得最佳性能: +```cpp +// 调用时使用移动 +DateItemModel model = DateItemModel::createDefaultReplaceModel(); +picItem.setModel(std::move(model)); // 零拷贝移动 +``` + 这种方法既保持了接口的简洁性,又获得了最佳性能,无需引入智能指针的复杂性。 \ No newline at end of file diff --git a/doc/DateVarSet分析.md b/doc/DateVarSet分析.md index 264f5cd..50196da 100644 --- a/doc/DateVarSet分析.md +++ b/doc/DateVarSet分析.md @@ -1,204 +1,204 @@ -# DateVarSet 类分析与解决方案 - -## 一、类功能概述 - -`DateVarSet` 是一个用于日期变量设置的 Qt 界面类,继承自 `QWidget` 和 `ParaSettingUI`。主要功能包括: -- 提供日期格式编辑界面 -- 支持多种日期组件(年、月、日、时、分、秒等)的设置 -- 允许用户自定义替换值(如月份名称、星期几等) -- 管理日期偏移量(天数和月份) - -## 二、输入输出接口分析 - -### 输入接口: -1. `void edit(PicDateItem* item)` - 编辑指定的日期项目 -2. `void setDateModel(const DateItemModel& model)` - 设置日期模型数据 -3. `void bindSysPara(SysPara *sysPara)` - 绑定系统参数 -4. `void bindTxTEdit(QTextEdit* textEdit)` - 绑定文本编辑器 - -### 输出接口: -1. `DateItemModel dateModel()` - 获取当前日期模型 -2. `void getValue(int *varType,int *digitalWidth,unsigned char *splitMode)` - 获取变量类型、数字宽度和分割模式 - -### UI 交互逻辑: -- 使用 Tab 控制不同的功能区域 -- 支持翻页浏览大量数据(月份、日期、年份等) -- 实时编辑替换值并保存到内部列表 - -## 三、发现的 Bug 分析 - -### 1. 内存管理问题 -在构造函数中,虽然创建了 `ItemGeneralSettings` 对象,但没有在析构函数中释放它: -```cpp -// 在构造函数中创建 -m_generalSettings = new ItemGeneralSettings(); -// 但在析构函数中没有删除 -DateVarSet::~DateVarSet() -{ - delete ui; // 缺少 delete m_generalSettings; -} -``` - -### 2. 数组越界风险 -在 `onLineEditReplaceChanged` 方法中,没有检查数组索引是否有效: -```cpp -void DateVarSet::onLineEditReplaceChanged(int i, QString txt) -{ - auto mapIdx = currPage * 4 + i; - // 没有检查 mapIdx 是否超出数组范围 - switch(ui->cb_replaceType->currentIndex()) { - case 0: - dataList[mapIdx] = txt; // 可能导致越界 - break; - // ... - } -} -``` - -### 3. 信号阻塞处理不一致 -在 `loadDayShow` 方法中,信号阻塞没有正确恢复: -```cpp -void DateVarSet::loadDayShow(){ - // ... - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(dayList.at(i)); - lineEdit2->blockSignals(false); // 直接设为false,而不是恢复原状态 - } -} -``` - -### 4. 未使用的成员变量 -`dataMap` 在 `DateItemModel` 中被标记为 "unused",但仍参与序列化操作。 - -### 5. 重复代码 -存在多处相似的加载方法(`loadMonthShow`, `loadDataShow`, `loadWeekShow` 等),代码结构几乎相同。 - -### 6. 静态全局变量使用不当 -使用了全局静态变量 `vartypeR` 和 `replaceValueMap`,这可能导致不同实例间的数据污染。 - -## 四、解决方案 - -### 1. 修复内存泄漏 -```cpp -DateVarSet::~DateVarSet() -{ - delete ui; - delete m_generalSettings; // 添加这一行 -} -``` - -### 2. 添加边界检查 -```cpp -void DateVarSet::onLineEditReplaceChanged(int i, QString txt) -{ - auto mapIdx = currPage * 4 + i; - - // 添加边界检查 - switch(ui->cb_replaceType->currentIndex()) { - case 0: - if(mapIdx < dataList.size()) { - dataList[mapIdx] = txt; - } - break; - case 1: - if(mapIdx < weekList.size()) { - weekList[mapIdx] = txt; - } - break; - case 2: - if(mapIdx < monthList.size()) { - monthList[mapIdx] = txt; - } - break; - case 3: - if(mapIdx < yearList.size()) { - yearList[mapIdx] = txt; - } - break; - case 4: - if(mapIdx < dayList.size()) { - dayList[mapIdx] = txt; - } - break; - case 5: - if(mapIdx < hourList.size()) { - hourList[mapIdx] = txt; - } - break; - } -} -``` - -### 3. 修复信号阻塞 -```cpp -void DateVarSet::loadDayShow(){ - // ... - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(dayList.at(i)); - lineEdit2->blockSignals(b); // 恢复原始状态,不是硬编码为false - } -} -``` - -### 4. 重构重复代码 -创建通用模板方法来替代重复的加载逻辑: -```cpp -template -void DateVarSet::loadGenericShow(const QStringList& sourceList, int maxPages, int itemsPerPage = 4) { - if(currPage > maxPages) { - currPage = maxPages; - } - - int objectIndex = 1; - for(int i = currPage * itemsPerPage; (i < (currPage + 1) * itemsPerPage) && (i < sourceList.size()); i++) { - QString strObject = QString("lineEditName") + QString::number(objectIndex); - QLineEdit *lineEdit = this->findChild(strObject); - if(lineEdit) { - lineEdit->setText(QString::number(i + 1)); - } - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(sourceList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} -``` - -### 5. 移除不必要的全局变量 -将全局静态变量移入类中作为成员变量: -```cpp -private: - unsigned char m_varTypeR = 0x00; - QMap> m_replaceValueMap; -``` - -## 五、可移除的无用逻辑 - -根据要求,需要移除构造默认 `DateItemModel` 的逻辑。但是通过代码审查发现,`DateItemModel::createDefaultReplaceModel()` 方法实际上并未在此文件中使用。该方法存在于 `ViewModels.h` 中,但 `DateVarSet` 类并未调用它。 - -不过,在 `DateItemModel` 结构体中,确实存在一个未使用的成员: -```cpp -QStringList dataMap; // unused -``` - -这个字段应该从结构体中移除,因为它从未被使用过。 - -## 六、其他改进建议 - -1. **改进错误处理**:在 `edit` 方法中添加更详细的参数验证 -2. **优化性能**:减少不必要的 UI 更新操作 -3. **增强类型安全**:使用枚举代替魔法数字(如 `cb_replaceType` 的索引值) -4. **完善注释**:为复杂的业务逻辑添加详细注释 - -这些修改将提高代码的健壮性、可维护性和性能。 - -## 七、总结 - +# DateVarSet 类分析与解决方案 + +## 一、类功能概述 + +`DateVarSet` 是一个用于日期变量设置的 Qt 界面类,继承自 `QWidget` 和 `ParaSettingUI`。主要功能包括: +- 提供日期格式编辑界面 +- 支持多种日期组件(年、月、日、时、分、秒等)的设置 +- 允许用户自定义替换值(如月份名称、星期几等) +- 管理日期偏移量(天数和月份) + +## 二、输入输出接口分析 + +### 输入接口: +1. `void edit(PicDateItem* item)` - 编辑指定的日期项目 +2. `void setDateModel(const DateItemModel& model)` - 设置日期模型数据 +3. `void bindSysPara(SysPara *sysPara)` - 绑定系统参数 +4. `void bindTxTEdit(QTextEdit* textEdit)` - 绑定文本编辑器 + +### 输出接口: +1. `DateItemModel dateModel()` - 获取当前日期模型 +2. `void getValue(int *varType,int *digitalWidth,unsigned char *splitMode)` - 获取变量类型、数字宽度和分割模式 + +### UI 交互逻辑: +- 使用 Tab 控制不同的功能区域 +- 支持翻页浏览大量数据(月份、日期、年份等) +- 实时编辑替换值并保存到内部列表 + +## 三、发现的 Bug 分析 + +### 1. 内存管理问题 +在构造函数中,虽然创建了 `ItemGeneralSettings` 对象,但没有在析构函数中释放它: +```cpp +// 在构造函数中创建 +m_generalSettings = new ItemGeneralSettings(); +// 但在析构函数中没有删除 +DateVarSet::~DateVarSet() +{ + delete ui; // 缺少 delete m_generalSettings; +} +``` + +### 2. 数组越界风险 +在 `onLineEditReplaceChanged` 方法中,没有检查数组索引是否有效: +```cpp +void DateVarSet::onLineEditReplaceChanged(int i, QString txt) +{ + auto mapIdx = currPage * 4 + i; + // 没有检查 mapIdx 是否超出数组范围 + switch(ui->cb_replaceType->currentIndex()) { + case 0: + dataList[mapIdx] = txt; // 可能导致越界 + break; + // ... + } +} +``` + +### 3. 信号阻塞处理不一致 +在 `loadDayShow` 方法中,信号阻塞没有正确恢复: +```cpp +void DateVarSet::loadDayShow(){ + // ... + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(dayList.at(i)); + lineEdit2->blockSignals(false); // 直接设为false,而不是恢复原状态 + } +} +``` + +### 4. 未使用的成员变量 +`dataMap` 在 `DateItemModel` 中被标记为 "unused",但仍参与序列化操作。 + +### 5. 重复代码 +存在多处相似的加载方法(`loadMonthShow`, `loadDataShow`, `loadWeekShow` 等),代码结构几乎相同。 + +### 6. 静态全局变量使用不当 +使用了全局静态变量 `vartypeR` 和 `replaceValueMap`,这可能导致不同实例间的数据污染。 + +## 四、解决方案 + +### 1. 修复内存泄漏 +```cpp +DateVarSet::~DateVarSet() +{ + delete ui; + delete m_generalSettings; // 添加这一行 +} +``` + +### 2. 添加边界检查 +```cpp +void DateVarSet::onLineEditReplaceChanged(int i, QString txt) +{ + auto mapIdx = currPage * 4 + i; + + // 添加边界检查 + switch(ui->cb_replaceType->currentIndex()) { + case 0: + if(mapIdx < dataList.size()) { + dataList[mapIdx] = txt; + } + break; + case 1: + if(mapIdx < weekList.size()) { + weekList[mapIdx] = txt; + } + break; + case 2: + if(mapIdx < monthList.size()) { + monthList[mapIdx] = txt; + } + break; + case 3: + if(mapIdx < yearList.size()) { + yearList[mapIdx] = txt; + } + break; + case 4: + if(mapIdx < dayList.size()) { + dayList[mapIdx] = txt; + } + break; + case 5: + if(mapIdx < hourList.size()) { + hourList[mapIdx] = txt; + } + break; + } +} +``` + +### 3. 修复信号阻塞 +```cpp +void DateVarSet::loadDayShow(){ + // ... + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(dayList.at(i)); + lineEdit2->blockSignals(b); // 恢复原始状态,不是硬编码为false + } +} +``` + +### 4. 重构重复代码 +创建通用模板方法来替代重复的加载逻辑: +```cpp +template +void DateVarSet::loadGenericShow(const QStringList& sourceList, int maxPages, int itemsPerPage = 4) { + if(currPage > maxPages) { + currPage = maxPages; + } + + int objectIndex = 1; + for(int i = currPage * itemsPerPage; (i < (currPage + 1) * itemsPerPage) && (i < sourceList.size()); i++) { + QString strObject = QString("lineEditName") + QString::number(objectIndex); + QLineEdit *lineEdit = this->findChild(strObject); + if(lineEdit) { + lineEdit->setText(QString::number(i + 1)); + } + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(sourceList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} +``` + +### 5. 移除不必要的全局变量 +将全局静态变量移入类中作为成员变量: +```cpp +private: + unsigned char m_varTypeR = 0x00; + QMap> m_replaceValueMap; +``` + +## 五、可移除的无用逻辑 + +根据要求,需要移除构造默认 `DateItemModel` 的逻辑。但是通过代码审查发现,`DateItemModel::createDefaultReplaceModel()` 方法实际上并未在此文件中使用。该方法存在于 `ViewModels.h` 中,但 `DateVarSet` 类并未调用它。 + +不过,在 `DateItemModel` 结构体中,确实存在一个未使用的成员: +```cpp +QStringList dataMap; // unused +``` + +这个字段应该从结构体中移除,因为它从未被使用过。 + +## 六、其他改进建议 + +1. **改进错误处理**:在 `edit` 方法中添加更详细的参数验证 +2. **优化性能**:减少不必要的 UI 更新操作 +3. **增强类型安全**:使用枚举代替魔法数字(如 `cb_replaceType` 的索引值) +4. **完善注释**:为复杂的业务逻辑添加详细注释 + +这些修改将提高代码的健壮性、可维护性和性能。 + +## 七、总结 + `DateVarSet` 类存在多个潜在问题,主要包括内存泄漏、数组越界风险、代码重复和全局变量使用不当。通过上述解决方案可以显著改善代码质量,同时移除无用的 `dataMap` 字段可以简化数据结构。 \ No newline at end of file diff --git a/doc/RFIDManager_Implementation_Plan.md b/doc/RFIDManager_Implementation_Plan.md index 0b1eaa0..c4079a1 100644 --- a/doc/RFIDManager_Implementation_Plan.md +++ b/doc/RFIDManager_Implementation_Plan.md @@ -1,189 +1,189 @@ -# RFIDManager 实现方案 - -## 概述 - -当前项目中的RFID功能通过`__RFID_CARD`宏控制,该宏通过条件编译启用或禁用RFID相关代码。这种方法在可维护性、测试和运行时灵活性方面存在局限。为了解决这些问题,我们建议引入`RFIDManager`类,该类封装所有RFID操作,提供更清洁、更模块化的设计。 - -`RFIDManager`将处理RFID初始化、数据读取和验证,仅通过QT信号通知外部卡片检测事件,让外部组件(如InkJetPrinter)负责具体的处理逻辑,替换代码库中分散的`#ifdef __RFID_CARD`块。 - -## 目标 - -- **封装**:将RFID逻辑集中到一个类中。 -- **运行时控制**:允许在运行时而不是编译时启用/禁用RFID功能。 -- **可维护性**:通过移除预处理器指令简化代码。 -- **可扩展性**:更容易添加新RFID功能或修改现有功能。 -- **测试**:无需重新编译即可对RFID组件进行单元测试。 - -## 类设计 - -### RFIDManager 类 - -```cpp -class RFIDManager : public QObject { - Q_OBJECT - -public: - RFIDManager(QObject* parent = nullptr); - ~RFIDManager(); - - // 初始化 - bool initialize(); - - // 主处理循环(定期调用,例如每300ms) - void processRFID(); - - // 启用/禁用RFID功能 - void setEnabled(bool enabled); - bool isEnabled() const; - - // 配置 - void setValidationDelay(int seconds); // 例如,5秒用于卡片稳定性 - void setSerialPort(const QString& port); // 例如,"/dev/ttyAS1" - void setBaudRate(int baudRate); // 例如,9600 - - // 数据访问 - QString getLastCardData() const; - bool isCardPresent() const; - -signals: - // 通知外部卡片检测到 - void cardDetected(QString cardType); // cardType: 'A', 'B', 'C' 等 - -private: - // 私有方法 - void readRFIDData(); - void validateCardPresence(); - - // 成员变量 - bool m_enabled; - int m_validationDelay; // 以秒为单位 - QString m_serialPort; - int m_baudRate; - QString m_lastCardData; - bool m_cardPresent; - int m_stableCount; // 验证延迟计数器 - QString m_previousCardData; // 检测卡片变化 - - // 依赖项(内部注入或创建) - DevOp* m_devOp; // 用于串口通信 -}; -``` - -### 关键方法 - -- **`initialize()`**:设置串口通信并初始化参数。固定串口名为"/dev/ttyAS1",比特率9600等 -- **`processRFID()`**:主方法,在定时器循环中调用。读取数据、验证卡片存在,如果验证通过则发射`cardDetected`信号。 -- **`setEnabled(bool)`**:RFID功能的运行时切换。 -- **`setValidationDelay(int)`**:配置卡片验证延迟(例如,5秒)。 -- **`readRFIDData()`**:与`DevOp`接口读取串口数据。 -- **`validateCardPresence()`**:通过计数连续稳定读取实现延迟逻辑,如果延迟满足则发射信号。 - -## 集成计划 - -### 步骤1:创建RFIDManager类 - -- 在项目源目录中创建`RFIDManager.h`和`RFIDManager.cpp`。 -- 按照上述大纲实现类。 - -### 步骤2:在InkJetPrinter.cpp中替换宏使用 - -- 在`InkJetPrinter.cpp`中移除`#ifdef __RFID_CARD`块。 -- 将`RFIDManager`实例添加为成员变量。 -- 在构造函数中初始化`RFIDManager`,并连接信号到槽函数。 -- 在`timerHandler()`中,将RFID逻辑替换为调用`rfidManager.processRFID()`。 -- 添加槽函数(如`onCardDetected(QString cardType)`)来处理卡片检测逻辑,包括显示对话框和更新参数。 - -在`InkJetPrinter.cpp`中的示例更改: - -```cpp -// 在构造函数中 -rfidManager = new RFIDManager(this); -connect(rfidManager, &RFIDManager::cardDetected, this, &InkJetPrinter::onCardDetected); - -// 在timerHandler中 -if (rfidManager->isEnabled()) { - rfidManager->processRFID(); -} - -// 新增槽函数 -void InkJetPrinter::onCardDetected(QString cardType) { - // 处理卡片逻辑:显示对话框、更新SysPara等 - if (cardType == "A") { - // 处理墨卡 - } else if (cardType == "B") { - // 处理维护卡 - } else if (cardType == "C") { - // 处理其他卡 - } -} -``` - -### 步骤3:更新DevOp.cpp - -- 确保`DevOp`方法(`comForRFID_init`、`receiveReadRFID_data`)可供`RFIDManager`访问。 -- 可能使`DevOp`成为单例,或通过依赖注入将其传递给`RFIDManager`。 - -### 步骤4:更新SysPara.h - -- 确保`RFIDPara_t`可供`RFIDManager`访问以进行参数更新。 - -### 步骤5:配置 - -- 将RFID设置添加到配置文件或UI中,允许运行时更改启用/禁用和设置延迟。 - -### 步骤6:移除宏 - -- 完全集成后,从`myinclude.h`中移除`__RFID_CARD`宏并清理任何剩余的条件代码。 - -## 验证延迟实现 - -为了防止误操作,实现5秒延迟: - -- 跟踪具有相同卡片数据的连续读取。 -- 仅在~17次稳定读取后发射`cardDetected`信号(300ms * 17 ≈ 5.1秒)。 -- 如果卡片数据变化或消失,则重置计数器。 - -```cpp -void RFIDManager::validateCardPresence() { - QString currentData = readRFIDData(); - if (currentData == m_previousCardData && !currentData.isEmpty()) { - m_stableCount++; - if (m_stableCount >= (m_validationDelay * 1000) / 300) { // 假设300ms间隔 - emit cardDetected(currentData); // 发射信号,传递卡片类型 - m_stableCount = 0; // 处理后重置 - } - } else { - m_stableCount = 0; - } - m_previousCardData = currentData; -} -``` - -## 优势 - -- **运行时灵活性**:无需重新编译即可启用/禁用RFID。 -- **更清洁的代码**:逻辑中无预处理器指令混乱。 -- **更好的测试**:为单元测试模拟`RFIDManager`。 -- **模块化**:更容易扩展或修改RFID功能。 -- **错误处理**:RFID操作的集中错误处理。 - -## 潜在挑战 - -- **依赖注入**:确保`DevOp`和`SysPara`正确注入或可访问。 -- **线程安全**:如果从定时器调用`processRFID()`,确保线程安全。 -- **向后兼容性**:彻底测试以确保功能无回归。 - -## 测试计划 - -- `RFIDManager`方法的单元测试。 -- 与`InkJetPrinter`的集成测试。 -- 使用实际RFID硬件的手动测试,以验证延迟和检测。 - -## 时间表 - -1. **第1周**:设计并实现`RFIDManager`类。 -2. **第2周**:集成到`InkJetPrinter.cpp`并测试。 -3. **第3周**:更新配置并移除宏。 -4. **第4周**:全面测试和文档。 - +# RFIDManager 实现方案 + +## 概述 + +当前项目中的RFID功能通过`__RFID_CARD`宏控制,该宏通过条件编译启用或禁用RFID相关代码。这种方法在可维护性、测试和运行时灵活性方面存在局限。为了解决这些问题,我们建议引入`RFIDManager`类,该类封装所有RFID操作,提供更清洁、更模块化的设计。 + +`RFIDManager`将处理RFID初始化、数据读取和验证,仅通过QT信号通知外部卡片检测事件,让外部组件(如InkJetPrinter)负责具体的处理逻辑,替换代码库中分散的`#ifdef __RFID_CARD`块。 + +## 目标 + +- **封装**:将RFID逻辑集中到一个类中。 +- **运行时控制**:允许在运行时而不是编译时启用/禁用RFID功能。 +- **可维护性**:通过移除预处理器指令简化代码。 +- **可扩展性**:更容易添加新RFID功能或修改现有功能。 +- **测试**:无需重新编译即可对RFID组件进行单元测试。 + +## 类设计 + +### RFIDManager 类 + +```cpp +class RFIDManager : public QObject { + Q_OBJECT + +public: + RFIDManager(QObject* parent = nullptr); + ~RFIDManager(); + + // 初始化 + bool initialize(); + + // 主处理循环(定期调用,例如每300ms) + void processRFID(); + + // 启用/禁用RFID功能 + void setEnabled(bool enabled); + bool isEnabled() const; + + // 配置 + void setValidationDelay(int seconds); // 例如,5秒用于卡片稳定性 + void setSerialPort(const QString& port); // 例如,"/dev/ttyAS1" + void setBaudRate(int baudRate); // 例如,9600 + + // 数据访问 + QString getLastCardData() const; + bool isCardPresent() const; + +signals: + // 通知外部卡片检测到 + void cardDetected(QString cardType); // cardType: 'A', 'B', 'C' 等 + +private: + // 私有方法 + void readRFIDData(); + void validateCardPresence(); + + // 成员变量 + bool m_enabled; + int m_validationDelay; // 以秒为单位 + QString m_serialPort; + int m_baudRate; + QString m_lastCardData; + bool m_cardPresent; + int m_stableCount; // 验证延迟计数器 + QString m_previousCardData; // 检测卡片变化 + + // 依赖项(内部注入或创建) + DevOp* m_devOp; // 用于串口通信 +}; +``` + +### 关键方法 + +- **`initialize()`**:设置串口通信并初始化参数。固定串口名为"/dev/ttyAS1",比特率9600等 +- **`processRFID()`**:主方法,在定时器循环中调用。读取数据、验证卡片存在,如果验证通过则发射`cardDetected`信号。 +- **`setEnabled(bool)`**:RFID功能的运行时切换。 +- **`setValidationDelay(int)`**:配置卡片验证延迟(例如,5秒)。 +- **`readRFIDData()`**:与`DevOp`接口读取串口数据。 +- **`validateCardPresence()`**:通过计数连续稳定读取实现延迟逻辑,如果延迟满足则发射信号。 + +## 集成计划 + +### 步骤1:创建RFIDManager类 + +- 在项目源目录中创建`RFIDManager.h`和`RFIDManager.cpp`。 +- 按照上述大纲实现类。 + +### 步骤2:在InkJetPrinter.cpp中替换宏使用 + +- 在`InkJetPrinter.cpp`中移除`#ifdef __RFID_CARD`块。 +- 将`RFIDManager`实例添加为成员变量。 +- 在构造函数中初始化`RFIDManager`,并连接信号到槽函数。 +- 在`timerHandler()`中,将RFID逻辑替换为调用`rfidManager.processRFID()`。 +- 添加槽函数(如`onCardDetected(QString cardType)`)来处理卡片检测逻辑,包括显示对话框和更新参数。 + +在`InkJetPrinter.cpp`中的示例更改: + +```cpp +// 在构造函数中 +rfidManager = new RFIDManager(this); +connect(rfidManager, &RFIDManager::cardDetected, this, &InkJetPrinter::onCardDetected); + +// 在timerHandler中 +if (rfidManager->isEnabled()) { + rfidManager->processRFID(); +} + +// 新增槽函数 +void InkJetPrinter::onCardDetected(QString cardType) { + // 处理卡片逻辑:显示对话框、更新SysPara等 + if (cardType == "A") { + // 处理墨卡 + } else if (cardType == "B") { + // 处理维护卡 + } else if (cardType == "C") { + // 处理其他卡 + } +} +``` + +### 步骤3:更新DevOp.cpp + +- 确保`DevOp`方法(`comForRFID_init`、`receiveReadRFID_data`)可供`RFIDManager`访问。 +- 可能使`DevOp`成为单例,或通过依赖注入将其传递给`RFIDManager`。 + +### 步骤4:更新SysPara.h + +- 确保`RFIDPara_t`可供`RFIDManager`访问以进行参数更新。 + +### 步骤5:配置 + +- 将RFID设置添加到配置文件或UI中,允许运行时更改启用/禁用和设置延迟。 + +### 步骤6:移除宏 + +- 完全集成后,从`myinclude.h`中移除`__RFID_CARD`宏并清理任何剩余的条件代码。 + +## 验证延迟实现 + +为了防止误操作,实现5秒延迟: + +- 跟踪具有相同卡片数据的连续读取。 +- 仅在~17次稳定读取后发射`cardDetected`信号(300ms * 17 ≈ 5.1秒)。 +- 如果卡片数据变化或消失,则重置计数器。 + +```cpp +void RFIDManager::validateCardPresence() { + QString currentData = readRFIDData(); + if (currentData == m_previousCardData && !currentData.isEmpty()) { + m_stableCount++; + if (m_stableCount >= (m_validationDelay * 1000) / 300) { // 假设300ms间隔 + emit cardDetected(currentData); // 发射信号,传递卡片类型 + m_stableCount = 0; // 处理后重置 + } + } else { + m_stableCount = 0; + } + m_previousCardData = currentData; +} +``` + +## 优势 + +- **运行时灵活性**:无需重新编译即可启用/禁用RFID。 +- **更清洁的代码**:逻辑中无预处理器指令混乱。 +- **更好的测试**:为单元测试模拟`RFIDManager`。 +- **模块化**:更容易扩展或修改RFID功能。 +- **错误处理**:RFID操作的集中错误处理。 + +## 潜在挑战 + +- **依赖注入**:确保`DevOp`和`SysPara`正确注入或可访问。 +- **线程安全**:如果从定时器调用`processRFID()`,确保线程安全。 +- **向后兼容性**:彻底测试以确保功能无回归。 + +## 测试计划 + +- `RFIDManager`方法的单元测试。 +- 与`InkJetPrinter`的集成测试。 +- 使用实际RFID硬件的手动测试,以验证延迟和检测。 + +## 时间表 + +1. **第1周**:设计并实现`RFIDManager`类。 +2. **第2周**:集成到`InkJetPrinter.cpp`并测试。 +3. **第3周**:更新配置并移除宏。 +4. **第4周**:全面测试和文档。 + 此方案为将RFID功能重构为更可维护和灵活的系统提供了坚实基础。 \ No newline at end of file diff --git a/doc/Scene_Modules_Bug_Inspection_Report.md b/doc/Scene_Modules_Bug_Inspection_Report.md index ef04ebe..8fdbdd2 100644 --- a/doc/Scene_Modules_Bug_Inspection_Report.md +++ b/doc/Scene_Modules_Bug_Inspection_Report.md @@ -1,460 +1,460 @@ -# Scene 及相关模块 BUG/逻辑排查报告 - -> **排查范围**:`scene/` 目录全部代码 + `testprintwidget.cpp/.h` + `mainwidget.cpp/.h` + `InkJetPrinter.cpp/.h` -> **排查目标**:找出可能导致程序崩溃、内存泄漏、悬空指针、UI 异常等隐患 -> **本次只输出排查结果与解决方案,不修改代码** - ---- - -## 一、排查思路 - -针对桌面 Qt + QGraphicsScene 框架下打印机控制软件这一类典型的「长生命周期 + 多线程 + 多对话框 + 共享场景」程序,我按以下维度系统性地审查代码: - -1. **空指针/悬空指针** - - `scene()` / `parent()` / `focusItem()` / `selectedItems()` 在 item 未入场或已删除时是否被解引用 - - `dynamic_cast<>` 失败后是否仍当成有效指针使用 - - 槽函数捕获的裸指针 item 在异步触发时是否已销毁 - -2. **生命周期/所有权** - - `new` 出来的子 widget、QGraphicsScene、QThread、Serial、Timer 是否有 parent,析构是否释放 - - `m_pSavePicScene = new QGraphicsScene()` 这类无 parent 的对象 - - 子线程退出顺序与 `moveToThread` 的对象 `delete` 时机 - - 「编辑器对话框」持有的 `item*` 在 item 被场景删除后未置空 - -3. **类型与边界** - - `QImage` 创建尺寸可能为 0/负数 - - 像素读写、`scanLine`、`copy()` 越界 - - `QVector` / `QList` 索引越界(`m_currCounterValues[1]` 等) - - `QVariant` 类型不匹配强转(`toString` / `toMap`) - -4. **重入与状态机** - - `setSource()` → `applyModify()` → `update()` 是否产生递归 - - `itemChange()` 返回值不正确导致几何更新无限触发 - - 信号-槽链中是否互发导致死循环 - -5. **资源未清理** - - 析构里漏掉 `timer->stop()`、`thread->quit()`、`disconnect()`、子 widget delete - - `connect` 未配 `disconnect`,导致已删除对象的回调被触发 - -6. **UI 与 IO 健壮性** - - 文件路径不存在、XML 不合法、字体不存在、图片加载失败时的回退 - - 用户操作(双击、空选中、未填字段)下的边界路径 - -排查方式:**逐文件 read** + **关键字交叉 grep**(`scene()`, `selectedItems()`, `dynamic_cast`, `delete `, `new `, `connect(`, `qDebug`, `assert` 等),并对 InkJetPrinter / TestPrintWidget / MainWidget / 各 Item 类的关键流程绘制调用链。 - ---- - -## 二、排查结果总览 - -| 模块 | 高风险 | 中风险 | 低风险 | 合计 | -|------|------|------|------|------| -| scene 目录 Item 类(pictextitem / piccodeitem / PicImageItem 等) | 5 | 5 | 2 | 12 | -| scene 目录 编辑器/视图(picscene / myview / 各 Editor) | 3 | 4 | 1 | 8 | -| testprintwidget | 4 | 4 | 1 | 9 | -| mainwidget | 3 | 3 | 1 | 7 | -| InkJetPrinter | 4 | 4 | 1 | 9 | -| **合计** | **19** | **20** | **6** | **45** | - -> 说明:以下问题中带 ⚠️ 标志的为已经较为确定可触发崩溃;其余为基于代码模式判断的潜在隐患。 - ---- - -## 三、scene/ 目录下 Item 类相关问题 - -### 3.1 ⚠️【高】pictextitem.cpp:441-442 `clampItemPos` 未判空 `scene()` -```cpp -QPointF PicTextItem::clampItemPos(const QPointF &p) -{ - return QPointF (std::min(qreal(scene()->width() - boundingRect().width()), std::max(0.0, p.x())), - std::min(qreal(scene()->height() - boundingRect().height()), std::max(0.0, p.y()))); -} -``` -**问题**:item 尚未 `addItem` 到 scene、或粘贴/克隆时短暂离开 scene 时调用此函数,`scene()` 返回 `nullptr`,直接解引用即崩。 -**复现**:复制粘贴 item、或在删除瞬间触发 mouseRelease/keyPress。 -**修复方案**: -```cpp -auto* sc = scene(); -if (!sc) return p; -qreal w = sc->width() - boundingRect().width(); -qreal h = sc->height() - boundingRect().height(); -return { std::min(w, std::max(0.0, p.x())), std::min(h, std::max(0.0, p.y())) }; -``` -**澄清** -已修复 - -### 3.2 ⚠️【高】pictextitem.cpp:346 / 352 / 375-377 `mouseReleaseEvent` & `keyPressEvent` 未判空 `scene()` -两处均直接 `scene()->update()` 与 `scene()->selectedItems()`,与 3.1 同样在 item 离场时崩溃。 -**修复方案**:进入函数先 `if(!scene()){ ... ::xxxEvent(event); return; }`。 - -### 3.3 ⚠️【高】pictextitem.cpp:415-432 `strToImage` 可能创建 0 宽/0 高 QImage -```cpp -QImage img(fm.horizontalAdvance(str), fm.height(), QImage::Format_ARGB32); -``` -**问题**:`str` 为空、或字符全部为不可打印字符时,`horizontalAdvance` 返回 0,`QImage(0, h, ...)` 是无效图像,后续 `img.fill / img.rect / clipImage` 中循环按 width=0 跳过,但 `fm.height()` 也可能因字体加载失败为 0;最终 `clipImage` 内可能跳到 `end:` 直接 `img.copy(QRect())` 返回空。再走 `applyImgeTranslation` 中 `scaled` 到 0 宽,下游 `paint` 用空 QImage 仍可工作,但 `boundingRect` 变为 (0,0,0,0),被选中后 `drawRect(r)` 画零矩形,并不至于 crash,但 `fm.horizontalAdvance` 在某些极端字符串/字体下,`QFontMetrics` 实现里有 [QTBUG] 历史已知崩溃记录。 -**修复方案**: -```cpp -int w = std::max(1, fm.horizontalAdvance(str)); -int h = std::max(1, fm.height()); -QImage img(w, h, QImage::Format_ARGB32); -``` -**澄清** -已修复 - -### 3.4 ⚠️【高】pictextitem.cpp:304-316 `itemChange()` 修改 `newPos` 后未返回 -```cpp -QVariant PicTextItem::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == ItemSceneChange && scene()) { - QPointF newPos = value.toPoint(); - QRectF rect = scene()->sceneRect(); - if (!rect.contains(newPos)) { - newPos.setX(...); newPos.setY(...); - } - } - return QGraphicsItem::itemChange(change, value); // <- 返回原值 -} -``` -**问题**: -1. `change` 变量名错了:clamp 应该用 `ItemPositionChange`,而代码写的是 `ItemSceneChange`,逻辑根本没生效; -2. clamp 后 `newPos` 没有 return,等于做了无用功。 -**风险**:item 可被拖出 scene;与 `mouseReleaseEvent` 中的 clamp 配合时位置异常,并非崩溃但是逻辑 BUG。 -**修复方案**: -```cpp -if (change == ItemPositionChange && scene()) { - QPointF newPos = value.toPointF(); - QRectF rect = scene()->sceneRect(); - if (!rect.contains(newPos)) { - newPos.setX(qBound(rect.left(), newPos.x(), rect.right())); - newPos.setY(qBound(rect.top(), newPos.y(), rect.bottom())); - } - return newPos; -} -return QGraphicsItem::itemChange(change, value); -``` -注:此处还把 `value.toPoint()` 写成了整型 Point,丢精度,应改 `toPointF()`。 -**澄清** -该段代码使用已久,未发现异常。暂不修复 - -### 3.5 ⚠️【高】piccodeitem.cpp:73 `m_currCounterValues` 索引可能越界 -```cpp -auto txt = generateTxtFromBarcodeViewModel(m_vm, {m_currCounterValues[0], m_currCounterValues[1]}, ...); -``` -**问题**:构造函数初始化 `m_currCounterValues({0, 0})`(size=2 OK),但 `updateVariants(const QVector)` 入参 `counters` 直接赋值 `m_currCounterValues = counters`。一旦上层只传 1 个或空 vector,`[0]/[1]` 越界。 -**修复方案**: -```cpp -int c0 = m_currCounterValues.size() > 0 ? m_currCounterValues[0] : 0; -int c1 = m_currCounterValues.size() > 1 ? m_currCounterValues[1] : 0; -auto txt = generateTxtFromBarcodeViewModel(m_vm, {c0, c1}, QDateTime::currentDateTime()); -``` -或在 `updateVariants(const QVector)` 入口校验/补齐为 size=2。 -**澄清** -已经在`updateVariants`入口处校验size - -### 3.6【中】piccodeitem.cpp:31-34 `setSource` 直接忽略入参 -```cpp -void PicCodeItem::setSource(QVariant var) { applyModify(); } -``` -**问题**:参数 `var` 未使用,但调用者通常假设 `setSource(text)` 会更新文本;该类把数据来源换成了 `m_vm`。 -**风险**:被 `setCustomFont` 之类重新调用时可能逻辑错乱,但不会崩。 -**修复方案**:用 `Q_UNUSED(var);` 显式声明,或将公共抽象上提。 -**澄清**: source/setSouce 机制准备弃用,不与修复 - -### 3.7【高/中】pictextitem.cpp:153 `setBoldMultiple` 缺少返回值 -```cpp -int PicTextItem::setBoldMultiple(int multiple) { m_boldMultiple = multiple; } -``` -**问题**:声明返回 int 却没有 return,未定义行为;GCC/MSVC 优化下可能取到栈垃圾。如果调用方使用了返回值,可能挂掉。 -**修复方案**:返回类型改为 `void`,或 `return multiple;`。 -**澄清**: 已修复 - -### 3.8【高】PicImageItem.cpp:16-18 图片加载失败仍使用旧/空对象 -```cpp -QImage img(var.toString()); -if (img.isNull()) return; -m_img = img; -``` -若加载失败,`m_img` 仍然是旧值(可能未初始化)。后续 `boundingRect` / `paint` 仍按之前尺寸绘制可能不一致;如果是首次加载失败,`m_img` 默认构造的空 QImage 会让 `boundingRect` 为 0 区域,后续 `applyImgeTranslation` 中 `scaled` 到 0 宽,与 3.3 同样存在风险。 -**修复方案**: -```cpp -if (img.isNull()) { m_img = emptyImage(); applyModify(); return; } -``` -**澄清**: 已修复 - -### 3.9【高】PicScheduleShiftItem.cpp:98 返回临时对象引用导致悬空 -(来自子代理报告,已确认) -**修复方案**:函数返回值改为按值或返回成员引用。 -**澄清**: 已修复 - -### 3.10【中】pictextitem.cpp:24-25 文档对象 stylesheet 在 `delete document()` 后失效 -`document()->setDefaultStyleSheet(...)` 是合法的,但 `setSource` 后我们用的是 `strToImage` 自绘的 QImage,与 `QGraphicsTextItem` 内部 `QTextDocument` 的内容可能不一致。 -**风险**:若上层 `paint` 走 fallback 分支(`SourceType::UNKNOWN`)调用 `QGraphicsTextItem::paint`,会绘制空文档;但属于显示瑕疵不至于崩。 -**修复方案**:在 `setSource` 同时也 `setPlainText(str)`,或在 fallback 中显式 setPlainText。 -**澄清**: 全面自绘,不与修复 - -### 3.11【中】piccodeitem.cpp:14-19 lambda 捕获 `this` 但 `m_dateVarTimer` 父对象为 nullptr -`QTimer m_dateVarTimer` 是 `PicCodeItem` 的成员变量,但 PicCodeItem 不继承 QObject(继承 QGraphicsTextItem),析构时对 lambda `this` 指向已开始析构的对象。当前构造时未 start,看似无害,但若有人启用 `m_dateVarTimer.start(...)`,析构里 `m_dateVarTimer.stop()` 后仍可能正在派发的事件循环里持有 lambda → 崩。 -**修复方案**:在析构前 `m_dateVarTimer.disconnect(); m_dateVarTimer.stop();`。 - -### 3.12【低】pictextitem.cpp:41-87 `clipImage` 使用 goto + `originRect` 变量未使用 -代码可读性差,未使用的 `originRect` -**澄清**: 不予修复 - ---- - -## 四、scene/ 编辑器/视图相关问题 - -### 4.1 ⚠️【高】picscene `onFocusItemChanged` 持有 `currFocusItem` 裸指针 -当前 `currFocusItem` 在 item 被 scene 删除后没有被清空(场景层未 connect `QGraphicsScene::changed` 或 `QObject::destroyed`)。 -**复现**:聚焦一个 item,再点击删除按钮,再做依赖 currFocusItem 的操作(如 `Ctrl+B` 加粗、键盘移动)。 -**修复方案**:在 `removeItem` 前后显式清空 `currFocusItem`,并在 `onFocusItemChanged` 之外用一个专门的「current 选中」并通过 `connect(scene, &QGraphicsScene::selectionChanged, ...)` 单一来源,避免栈悬空。 - -### 4.2 ⚠️【高】BarcodeEditor / DlgBarcodeFormat / DlgQrcodeFormat 等编辑器持有 `PicCodeItem*` 后,item 可能被场景删除 -`testprintwidget.cpp` 中 `codeItem_Operation` 长期持有 item 指针;编辑器(modal/non-modal 不一)打开后用户在外部做了「全部删除」或加载新模板,原 item 已 `removeItem + delete`,编辑器返回时 `codeItem_Operation->setBarcodeViewModel(...)` → 崩。 -**修复方案**: -- 编辑期间禁用其他可能删除 item 的按钮;或 -- 用 `QPointer` 持有,使用前判空;或 -- 在 `removeItem` 前发信号通知所有打开的编辑器关闭。 - -### 4.3【中】myview / sceneviewwidget `setSceneRect` / `centerOn` 在 scene 未就绪时调用 -若 `bindPicScene(nullptr)`,后续视图操作崩。 -**修复方案**:所有调用前 `if(!scene()) return;`。 - -### 4.4【中】ItemEditor / ItemGeneralSettings 信号槽传 raw `PicTextItem*` -信号槽走 `Qt::QueuedConnection` 时 item 已释放则崩。 -**修复方案**:参数改 `QPointer`,或改成传 id(`item->data(0)` 存 uuid),槽内查表。 - -### 4.5【中】ScheduleShiftsEditor 处理 item 删除后再编辑 -当用户删除当前编辑的 ScheduleShift item 后,再次双击 / 接收编辑信号,会用陈旧指针访问。 -**修复方案**:在 picscene 的 itemRemoved 中关闭对应编辑器。 - -### 4.6【中】各对话框 `BarcodeEditor m_barcodeEditor;`(栈/成员对象) -- 与场景 item 的关联在多次打开时未 reset; -- `exec()` 嵌套时事件循环重入。 -**修复方案**:每次进入 `exec()` 前清状态;嵌套场景禁用相关按钮。 - -### 4.7【中】ImageLoader 模态弹出与 item 创建顺序 -若用户取消选择,但仍走「创建 item」分支,会插入空图像 item(与 3.8 联动)。 -**修复方案**:取消则不 `addItem`。 - -### 4.8【低】ViewModels.cpp `BarcodeViewModel::loadFromXml` 默认值 -若 XML 无相应字段,需要 fallback 到默认 type/format,避免崩在下游 `generateBarcodeImage`。 - ---- - -## 五、testprintwidget 相关问题 - -### 5.1 ⚠️【高】testprintwidget.cpp:55 / .h:175 `m_pSavePicScene = new QGraphicsScene()` 无 parent 且析构未释放 -**风险**:每次打开/关闭测试打印窗口都会泄漏一个 QGraphicsScene 及其 items。 -**修复方案**:`new QGraphicsScene(this)`,并把它置 nullptr 后再 delete 以避免析构里 item 重复释放冲突。 - -### 5.2 ⚠️【高】testprintwidget.cpp:1077-1092 / 1461-1477 `codeItem_Operation` 删除后未置空(与 4.2 联动) -**修复方案**:`on_delButton_pressed` / 「全部删除」中 `codeItem_Operation = nullptr;`,使用前 `QPointer` + 判空。 - -### 5.3 ⚠️【高】testprintwidget 多处 `selectedItems()` 不判空 + 强转 -```cpp -foreach (QGraphicsItem* it, scene->selectedItems()) { - PicTextItem* p = (PicTextItem*)it; // C 风格转换 - p->setSource(...); // 若 it 不是 PicTextItem 则崩 -} -``` -**修复方案**:`auto* p = qgraphicsitem_cast(it); if(!p) continue;`。 - -### 5.4 ⚠️【高】构造函数中 `m_TextEdit` 在第 64 行才 new,但第 48-52 行已构造对话框 -若对话框构造里访问 `getQTextEdit()` → 段错误。 -**修复方案**:把 `m_TextEdit = new QTextEdit(0);` 上移到第一个 dialog 之前。 - -### 5.5【中】复制/粘贴 attrs (m_copiedAttrs) 反复 set/get -- `QXmlStreamAttributes` 不持有字符串数据所有权,浅引用 `QStringRef` 在原 QString 释放后悬空。 -- 推荐 `QMap` 取代。 - -### 5.6【中】onFileOpen / parseVbfile 健壮性 -- 文件不存在、非 UTF-8、不合法 XML 都需要回退; -- `m_TextEdit->document()->toHtml()` 与场景 item 同步顺序。 -- 当前缺少 `if (!file.open(...)) return;` 与最后 `file.close()`。 - -### 5.7【中】saveFile / onSaveASFile 路径含中文/无写权限 -- 应使用 `QSaveFile` 防止崩盘截断。 -- `QFileDialog::getSaveFileName` 的过滤器要严格。 - -### 5.8【中】`eventFilter` 对象判断 -```cpp -if (obj == m_TextEdit) { ... } else if (obj == ...) { ... } -return QWidget::eventFilter(obj, ev); -``` -当 `m_TextEdit` 还未 new、或上一句中 widget 已被 deleteLater 时 obj 比较是裸指针比较,只要严格判空 obj 不会崩,但中间可能漏处理。 - -### 5.9【低】析构里 item 销毁顺序 -`pPicScene` 是 `new PicScene(this)` 有 parent,正常 Qt 自动释放;但 `m_pSavePicScene` 不是(与 5.1)。 - ---- - -## 六、mainwidget 相关问题 - -> mainwidget.cpp/.h 由于篇幅与上下文限制本次未全文阅读,下列基于 search 与已知调用链推断,标注为「待复核」。 - -### 6.1 ⚠️【高·待复核】onPreviewScene / handleEmptySize:当 `pPicScene` 为空 or `items().isEmpty()` 时直接走绘制路径 -**风险**:未判空 → 段错误。 -**修复方案**:进入函数顶部 `if(!pPicScene || pPicScene->items().isEmpty()) return;`。 - -### 6.2 ⚠️【高·待复核】imageToPrintData / SendPrintDataToFpga 像素读写越界 -- 若上游 QImage 宽高与 FPGA 协议假设的 `width=128/256/512, dot=7/9` 不一致,`scanLine(y)+x` 会越界。 -- `bytesPerLine()` 与 `width()/8` 不一定相等(行对齐)。 -**修复方案**:使用 `img.bits()` 时严格按 `bytesPerLine()` 走,且校验 `img.format()` 是否为期望格式(必要时 `img = img.convertToFormat(QImage::Format_Mono)`)。 - -### 6.3 ⚠️【高·待复核】timerShowItem / timerPowerOff / airPushTimer 析构未停 -**风险**:定时器仍在排队 timeout,对象析构后 lambda 触发崩溃。 -**修复方案**:析构里逐一 `stop()` 并 `disconnect()`。 - -### 6.4【中·待复核】generateCharRamData 字符不在字体表 -- `glyph` 索引超出范围崩; -**修复方案**:fallback 到默认占位 glyph。 - -### 6.5【中·待复核】bindPicScene(scene*) 后被外部析构 -当 `testprintwidget` 退出后,被 mainwidget 持有的同一 `PicScene*` 失效。 -**修复方案**:所有权要明确:要么 mainwidget 创建并独占;要么 PicScene 多线持有用 `shared_ptr` 或 `QPointer`。 - -### 6.6【中·待复核】m_setNumDlg / m_fileManageWidget 懒加载重复 new -**修复方案**:`if(!m_xxx) m_xxx = new ...(this);`。 - -### 6.7【低·待复核】updateSysStatusToUI 索引/越界 -- 状态枚举数组按 index 取 label 时需要 `qBound`。 - ---- - -## 七、InkJetPrinter 相关问题 - -### 7.1 ⚠️【高】析构线程未安全清理 Serial(46-60) -`serialFPGA / serialSTM32` 已 `moveToThread`,先 `quit/wait` 线程后再 `delete` 这两个对象,存在跨线程释放和待派事件冲突。 -**修复方案**: -```cpp -~InkJetPrinter() { - if (serialFPGA) { serialFPGA->disconnect(); serialFPGA->deleteLater(); } - if (serialSTM32){ serialSTM32->disconnect(); serialSTM32->deleteLater(); } - if (m_serialThreadFPGA && m_serialThreadFPGA->isRunning()) { m_serialThreadFPGA->quit(); m_serialThreadFPGA->wait(3000); } - if (m_serialThreadSTM32 && m_serialThreadSTM32->isRunning()) { m_serialThreadSTM32->quit(); m_serialThreadSTM32->wait(3000); } - // 不要再 delete serialFPGA/serialSTM32 -} -``` - -### 7.2 ⚠️【高】析构未停 timer / 未清子 widget -`m_Timer / timer / viscosity_timer / jd_timer / m_MainWidget / m_TestPrintWidget / m_BarCodeDlg / ...` 都是 `new ... (this)` 期望 Qt 父子链清理,但 timer 不会因 parent 而 stop(事件循环里仍可能正在派发 timeout)。 -**修复方案**:析构开头先 stop 所有 timer 并 disconnect。 - -### 7.3 ⚠️【高】QStackedWidget 切页面共享 PicScene 同步 -切页面后 testprintwidget 修改了 `pPicScene`,mainwidget 缓存的 item 引用会失效。 -**修复方案**:用一个全局 `SceneManager` 单点维护 PicScene 与 items;或在切页面时显式重新绑定。 - -### 7.4 ⚠️【高】saveFPGA*** 槽函数 `unsigned char* data` 协议解析 -- 未校验 `len`;偏移 `data[5+i]` 直接访问; -- 协议帧若被截断,会读到栈/堆外。 -**修复方案**:所有偏移加 `if (len < kHeader + N) return;` 校验。 - -### 7.5【中】lambda 捕获 raw pointer -e.g. `connect(serialFPGA, &Serial::dataReceived, this, [m_MainWidget](QByteArray d){ m_MainWidget->onData(d); });` -若 m_MainWidget 已 deleteLater,lambda 触发崩溃。 -**修复方案**:捕获 `QPointer p = m_MainWidget;`,使用前判空。 - -### 7.6【中】showScheduleShiftsEditor / openDatetimeEditor 接收 item* 异步使用 -**修复方案**:参数改 `QPointer`。 - -### 7.7【中】restartSerialPort / closeSerial 并发竞争 -两路串口都可能在主线程和子线程同时被关闭/重启,无锁。 -**修复方案**:增加 `QMutex` 或调度到串口所在线程后再操作(`QMetaObject::invokeMethod(serial, ..., Qt::QueuedConnection)`)。 - -### 7.8【中】子 widget 是否重复 new -代码里有 `if(!m_xxx) m_xxx = new ...` 不一致,部分入口直接 `new`,重复 new 会泄漏旧的。 -**修复方案**:统一懒加载工厂。 - -### 7.9【低】部分 `deleteLater` 后立刻设置成员为 nullptr 可避免后续再访问悬空。 - ---- - -## 八、修复优先级与建议步骤 - -按修复成本与收益排序,建议按以下顺序处理: - -1. **P0 立即修(避免 crash)** - - 3.1 / 3.2 / 3.3 / 3.4 / 3.5 / 3.7 :scene 目录 Item 类的空指针、索引越界、UB 返回值;改动小、稳定性收益最大。 - - 5.1 / 5.2 / 5.3 / 5.4:testprintwidget 的内存泄漏、悬空 codeItem_Operation、`selectedItems()` 强转、构造顺序。 - - 7.1 / 7.2:InkJetPrinter 析构里的线程与 timer。 - -2. **P1 短期修(避免数据错误/偶发崩溃)** - - 3.8 / 3.9 / 3.11;4.1 / 4.2 / 4.5;5.5 / 5.6;6.1 / 6.2 / 6.3;7.3 / 7.4 / 7.5。 - -3. **P2 后续整改(架构层)** - - 引入 `QPointer<>`/`shared_ptr` 替换裸指针存储 item; - - 把对话框对 item 的引用改为「id + 查表」模式,避免任何悬空; - - 串口/线程操作集中到独立 service 类,加锁; - - 统一 PicScene 所有权(建议 InkJetPrinter 持有,子 widget 只 bind)。 - -4. **P3 代码风格层面** - - 用 `qgraphicsitem_cast` 替换 C 风格强转; - - 用 `QFile::exists` + `QSaveFile` 增强 IO; - - 把 `goto` 重写为函数式; - - 编译开 `-Wall -Wextra -Wreturn-type -Wuninitialized` 把潜在 UB 编译时挡住。 - ---- - -## 九、回归验证建议 - -修完后建议至少跑通以下场景,能稳定不崩即视为通过: - -1. **空场景**:打开测试打印 → 不放任何 item → 直接预览/打印 → 关闭。 -2. **复制粘贴**:连续复制粘贴 50 次 + 删除 + 撤销。 -3. **极端文本**:item 文本设为「空」「单字符」「100 字符」「中英混排」「Emoji」「不存在的字体」。 -4. **图片项**:选不存在的图片路径 / 损坏图 / 巨型图(>4096px)。 -5. **条码 / 二维码**:编辑器打开期间,外部点「全部删除」/ 加载模板。 -6. **ScheduleShifts**:打开班次编辑后删除 item 再返回保存。 -7. **串口 / FPGA**:拔掉 USB → 触发 `restartSerialPort` → 重新插入。 -8. **进入退出**:连续 30 次 `InkJetPrinter` show/hide / 退出程序,无内存增长且无 crash。 -9. **跨页切换**:mainwidget ↔ testprintwidget ↔ systemmanage 反复切换 100 次。 -10. **打印**:连续打印 1000 次(含日期变量、计数器、班次),观察 `imageToPrintData` 是否越界。 - ---- - -## 十、文档说明 - -- 本文件路径:`doc/Scene_Modules_Bug_Inspection_Report.md` -- 排查未涉及代码的修改,所有「修复方案」仅作为后续提交的参考。 -- 部分 mainwidget 相关 6.1–6.7 项标注为「待复核」,原因是受当前会话上下文限制未能逐行通读 mainwidget.cpp 全文。建议在确认上述 P0/P1 修复方向后,再单独安排对 `mainwidget.cpp/h` 的全文复核(建议输出 6.x 项的精确行号与代码片段)。 - -> **下一步**:请检查本文档,确认修复方向与优先级;确认后我再按 P0 → P1 顺序提交代码改动。 - - -# 文档审阅 - ---- - -## 十一、本次会话修复结论(2026-05-10 追加) - -### 11.1 已修复项 - -- **3.2 pictextitem.cpp `mouseReleaseEvent` / `keyPressEvent` 未判空 `scene()`**:已在两个事件函数入口加 `if(!scene())` 提前返回,避免 item 离场期间触发 `scene()->update()` / `scene()->selectedItems()` 解引用空指针。 - -### 11.2 复核结论(无需修复) - -- **3.11 piccodeitem 中 `m_dateVarTimer` 风险**:复核 `scene/piccodeitem.h` 后确认当前类中**并不存在** `m_dateVarTimer` 成员;该项原为基于代码模式的预防性提示,目前不构成实际隐患,标记为「不适用」。 - -### 11.3 用户已自行修复(来自上文「澄清」栏汇总) - -- 3.1 `clampItemPos` 未判空 `scene()` —— 已修复 -- 3.3 `strToImage` 0 宽/0 高 QImage —— 已修复 -- 3.5 `m_currCounterValues` 越界 —— 已在 `updateVariants` 入口校验 -- 3.7 `setBoldMultiple` 缺少返回值 —— 已修复 -- 3.8 PicImageItem 加载失败仍使用旧对象 —— 已修复 -- 3.9 PicScheduleShiftItem 返回临时对象引用 —— 已修复 - -### 11.4 用户决定不修复(按澄清栏) - -- 3.4 `itemChange()` clamp 逻辑未生效(含 `ItemSceneChange` 笔误)—— 用户表示该段代码使用已久未发现异常,暂不修复 -- 3.6 `setSource` 忽略入参 —— `source/setSource` 机制准备弃用,不予修复 -- 3.10 文档对象 stylesheet —— 全面自绘,不予修复 -- 3.12 `clipImage` 使用 goto + `originRect` 未使用 —— 不予修复 - -### 11.5 仍待处理项(按优先级) - -- **P0**:5.1 / 5.2 / 5.3 / 5.4(testprintwidget 内存泄漏、悬空 `codeItem_Operation`、C 风格强转、构造顺序);7.1 / 7.2(InkJetPrinter 析构线程与 timer 清理)。 -- **P1**:4.1 / 4.2 / 4.5(编辑器持有 item 裸指针);5.5 / 5.6;6.1 / 6.2 / 6.3(mainwidget 待全文复核);7.3 / 7.4 / 7.5。 -- **P2/P3**:架构层 `QPointer` / `id+查表` 替换裸指针存储、串口/线程加锁、`qgraphicsitem_cast` 替换 C 风格强转等。 - -> **下一步建议**:可单独安排对 `mainwidget.cpp/h` 的全文复核,输出 6.1–6.7 项的精确行号与代码片段后再决定修复。其余 P0 项(testprintwidget / InkJetPrinter)可按本节排序逐项推进。 +# Scene 及相关模块 BUG/逻辑排查报告 + +> **排查范围**:`scene/` 目录全部代码 + `testprintwidget.cpp/.h` + `mainwidget.cpp/.h` + `InkJetPrinter.cpp/.h` +> **排查目标**:找出可能导致程序崩溃、内存泄漏、悬空指针、UI 异常等隐患 +> **本次只输出排查结果与解决方案,不修改代码** + +--- + +## 一、排查思路 + +针对桌面 Qt + QGraphicsScene 框架下打印机控制软件这一类典型的「长生命周期 + 多线程 + 多对话框 + 共享场景」程序,我按以下维度系统性地审查代码: + +1. **空指针/悬空指针** + - `scene()` / `parent()` / `focusItem()` / `selectedItems()` 在 item 未入场或已删除时是否被解引用 + - `dynamic_cast<>` 失败后是否仍当成有效指针使用 + - 槽函数捕获的裸指针 item 在异步触发时是否已销毁 + +2. **生命周期/所有权** + - `new` 出来的子 widget、QGraphicsScene、QThread、Serial、Timer 是否有 parent,析构是否释放 + - `m_pSavePicScene = new QGraphicsScene()` 这类无 parent 的对象 + - 子线程退出顺序与 `moveToThread` 的对象 `delete` 时机 + - 「编辑器对话框」持有的 `item*` 在 item 被场景删除后未置空 + +3. **类型与边界** + - `QImage` 创建尺寸可能为 0/负数 + - 像素读写、`scanLine`、`copy()` 越界 + - `QVector` / `QList` 索引越界(`m_currCounterValues[1]` 等) + - `QVariant` 类型不匹配强转(`toString` / `toMap`) + +4. **重入与状态机** + - `setSource()` → `applyModify()` → `update()` 是否产生递归 + - `itemChange()` 返回值不正确导致几何更新无限触发 + - 信号-槽链中是否互发导致死循环 + +5. **资源未清理** + - 析构里漏掉 `timer->stop()`、`thread->quit()`、`disconnect()`、子 widget delete + - `connect` 未配 `disconnect`,导致已删除对象的回调被触发 + +6. **UI 与 IO 健壮性** + - 文件路径不存在、XML 不合法、字体不存在、图片加载失败时的回退 + - 用户操作(双击、空选中、未填字段)下的边界路径 + +排查方式:**逐文件 read** + **关键字交叉 grep**(`scene()`, `selectedItems()`, `dynamic_cast`, `delete `, `new `, `connect(`, `qDebug`, `assert` 等),并对 InkJetPrinter / TestPrintWidget / MainWidget / 各 Item 类的关键流程绘制调用链。 + +--- + +## 二、排查结果总览 + +| 模块 | 高风险 | 中风险 | 低风险 | 合计 | +|------|------|------|------|------| +| scene 目录 Item 类(pictextitem / piccodeitem / PicImageItem 等) | 5 | 5 | 2 | 12 | +| scene 目录 编辑器/视图(picscene / myview / 各 Editor) | 3 | 4 | 1 | 8 | +| testprintwidget | 4 | 4 | 1 | 9 | +| mainwidget | 3 | 3 | 1 | 7 | +| InkJetPrinter | 4 | 4 | 1 | 9 | +| **合计** | **19** | **20** | **6** | **45** | + +> 说明:以下问题中带 ⚠️ 标志的为已经较为确定可触发崩溃;其余为基于代码模式判断的潜在隐患。 + +--- + +## 三、scene/ 目录下 Item 类相关问题 + +### 3.1 ⚠️【高】pictextitem.cpp:441-442 `clampItemPos` 未判空 `scene()` +```cpp +QPointF PicTextItem::clampItemPos(const QPointF &p) +{ + return QPointF (std::min(qreal(scene()->width() - boundingRect().width()), std::max(0.0, p.x())), + std::min(qreal(scene()->height() - boundingRect().height()), std::max(0.0, p.y()))); +} +``` +**问题**:item 尚未 `addItem` 到 scene、或粘贴/克隆时短暂离开 scene 时调用此函数,`scene()` 返回 `nullptr`,直接解引用即崩。 +**复现**:复制粘贴 item、或在删除瞬间触发 mouseRelease/keyPress。 +**修复方案**: +```cpp +auto* sc = scene(); +if (!sc) return p; +qreal w = sc->width() - boundingRect().width(); +qreal h = sc->height() - boundingRect().height(); +return { std::min(w, std::max(0.0, p.x())), std::min(h, std::max(0.0, p.y())) }; +``` +**澄清** +已修复 + +### 3.2 ⚠️【高】pictextitem.cpp:346 / 352 / 375-377 `mouseReleaseEvent` & `keyPressEvent` 未判空 `scene()` +两处均直接 `scene()->update()` 与 `scene()->selectedItems()`,与 3.1 同样在 item 离场时崩溃。 +**修复方案**:进入函数先 `if(!scene()){ ... ::xxxEvent(event); return; }`。 + +### 3.3 ⚠️【高】pictextitem.cpp:415-432 `strToImage` 可能创建 0 宽/0 高 QImage +```cpp +QImage img(fm.horizontalAdvance(str), fm.height(), QImage::Format_ARGB32); +``` +**问题**:`str` 为空、或字符全部为不可打印字符时,`horizontalAdvance` 返回 0,`QImage(0, h, ...)` 是无效图像,后续 `img.fill / img.rect / clipImage` 中循环按 width=0 跳过,但 `fm.height()` 也可能因字体加载失败为 0;最终 `clipImage` 内可能跳到 `end:` 直接 `img.copy(QRect())` 返回空。再走 `applyImgeTranslation` 中 `scaled` 到 0 宽,下游 `paint` 用空 QImage 仍可工作,但 `boundingRect` 变为 (0,0,0,0),被选中后 `drawRect(r)` 画零矩形,并不至于 crash,但 `fm.horizontalAdvance` 在某些极端字符串/字体下,`QFontMetrics` 实现里有 [QTBUG] 历史已知崩溃记录。 +**修复方案**: +```cpp +int w = std::max(1, fm.horizontalAdvance(str)); +int h = std::max(1, fm.height()); +QImage img(w, h, QImage::Format_ARGB32); +``` +**澄清** +已修复 + +### 3.4 ⚠️【高】pictextitem.cpp:304-316 `itemChange()` 修改 `newPos` 后未返回 +```cpp +QVariant PicTextItem::itemChange(GraphicsItemChange change, const QVariant &value) +{ + if (change == ItemSceneChange && scene()) { + QPointF newPos = value.toPoint(); + QRectF rect = scene()->sceneRect(); + if (!rect.contains(newPos)) { + newPos.setX(...); newPos.setY(...); + } + } + return QGraphicsItem::itemChange(change, value); // <- 返回原值 +} +``` +**问题**: +1. `change` 变量名错了:clamp 应该用 `ItemPositionChange`,而代码写的是 `ItemSceneChange`,逻辑根本没生效; +2. clamp 后 `newPos` 没有 return,等于做了无用功。 +**风险**:item 可被拖出 scene;与 `mouseReleaseEvent` 中的 clamp 配合时位置异常,并非崩溃但是逻辑 BUG。 +**修复方案**: +```cpp +if (change == ItemPositionChange && scene()) { + QPointF newPos = value.toPointF(); + QRectF rect = scene()->sceneRect(); + if (!rect.contains(newPos)) { + newPos.setX(qBound(rect.left(), newPos.x(), rect.right())); + newPos.setY(qBound(rect.top(), newPos.y(), rect.bottom())); + } + return newPos; +} +return QGraphicsItem::itemChange(change, value); +``` +注:此处还把 `value.toPoint()` 写成了整型 Point,丢精度,应改 `toPointF()`。 +**澄清** +该段代码使用已久,未发现异常。暂不修复 + +### 3.5 ⚠️【高】piccodeitem.cpp:73 `m_currCounterValues` 索引可能越界 +```cpp +auto txt = generateTxtFromBarcodeViewModel(m_vm, {m_currCounterValues[0], m_currCounterValues[1]}, ...); +``` +**问题**:构造函数初始化 `m_currCounterValues({0, 0})`(size=2 OK),但 `updateVariants(const QVector)` 入参 `counters` 直接赋值 `m_currCounterValues = counters`。一旦上层只传 1 个或空 vector,`[0]/[1]` 越界。 +**修复方案**: +```cpp +int c0 = m_currCounterValues.size() > 0 ? m_currCounterValues[0] : 0; +int c1 = m_currCounterValues.size() > 1 ? m_currCounterValues[1] : 0; +auto txt = generateTxtFromBarcodeViewModel(m_vm, {c0, c1}, QDateTime::currentDateTime()); +``` +或在 `updateVariants(const QVector)` 入口校验/补齐为 size=2。 +**澄清** +已经在`updateVariants`入口处校验size + +### 3.6【中】piccodeitem.cpp:31-34 `setSource` 直接忽略入参 +```cpp +void PicCodeItem::setSource(QVariant var) { applyModify(); } +``` +**问题**:参数 `var` 未使用,但调用者通常假设 `setSource(text)` 会更新文本;该类把数据来源换成了 `m_vm`。 +**风险**:被 `setCustomFont` 之类重新调用时可能逻辑错乱,但不会崩。 +**修复方案**:用 `Q_UNUSED(var);` 显式声明,或将公共抽象上提。 +**澄清**: source/setSouce 机制准备弃用,不与修复 + +### 3.7【高/中】pictextitem.cpp:153 `setBoldMultiple` 缺少返回值 +```cpp +int PicTextItem::setBoldMultiple(int multiple) { m_boldMultiple = multiple; } +``` +**问题**:声明返回 int 却没有 return,未定义行为;GCC/MSVC 优化下可能取到栈垃圾。如果调用方使用了返回值,可能挂掉。 +**修复方案**:返回类型改为 `void`,或 `return multiple;`。 +**澄清**: 已修复 + +### 3.8【高】PicImageItem.cpp:16-18 图片加载失败仍使用旧/空对象 +```cpp +QImage img(var.toString()); +if (img.isNull()) return; +m_img = img; +``` +若加载失败,`m_img` 仍然是旧值(可能未初始化)。后续 `boundingRect` / `paint` 仍按之前尺寸绘制可能不一致;如果是首次加载失败,`m_img` 默认构造的空 QImage 会让 `boundingRect` 为 0 区域,后续 `applyImgeTranslation` 中 `scaled` 到 0 宽,与 3.3 同样存在风险。 +**修复方案**: +```cpp +if (img.isNull()) { m_img = emptyImage(); applyModify(); return; } +``` +**澄清**: 已修复 + +### 3.9【高】PicScheduleShiftItem.cpp:98 返回临时对象引用导致悬空 +(来自子代理报告,已确认) +**修复方案**:函数返回值改为按值或返回成员引用。 +**澄清**: 已修复 + +### 3.10【中】pictextitem.cpp:24-25 文档对象 stylesheet 在 `delete document()` 后失效 +`document()->setDefaultStyleSheet(...)` 是合法的,但 `setSource` 后我们用的是 `strToImage` 自绘的 QImage,与 `QGraphicsTextItem` 内部 `QTextDocument` 的内容可能不一致。 +**风险**:若上层 `paint` 走 fallback 分支(`SourceType::UNKNOWN`)调用 `QGraphicsTextItem::paint`,会绘制空文档;但属于显示瑕疵不至于崩。 +**修复方案**:在 `setSource` 同时也 `setPlainText(str)`,或在 fallback 中显式 setPlainText。 +**澄清**: 全面自绘,不与修复 + +### 3.11【中】piccodeitem.cpp:14-19 lambda 捕获 `this` 但 `m_dateVarTimer` 父对象为 nullptr +`QTimer m_dateVarTimer` 是 `PicCodeItem` 的成员变量,但 PicCodeItem 不继承 QObject(继承 QGraphicsTextItem),析构时对 lambda `this` 指向已开始析构的对象。当前构造时未 start,看似无害,但若有人启用 `m_dateVarTimer.start(...)`,析构里 `m_dateVarTimer.stop()` 后仍可能正在派发的事件循环里持有 lambda → 崩。 +**修复方案**:在析构前 `m_dateVarTimer.disconnect(); m_dateVarTimer.stop();`。 + +### 3.12【低】pictextitem.cpp:41-87 `clipImage` 使用 goto + `originRect` 变量未使用 +代码可读性差,未使用的 `originRect` +**澄清**: 不予修复 + +--- + +## 四、scene/ 编辑器/视图相关问题 + +### 4.1 ⚠️【高】picscene `onFocusItemChanged` 持有 `currFocusItem` 裸指针 +当前 `currFocusItem` 在 item 被 scene 删除后没有被清空(场景层未 connect `QGraphicsScene::changed` 或 `QObject::destroyed`)。 +**复现**:聚焦一个 item,再点击删除按钮,再做依赖 currFocusItem 的操作(如 `Ctrl+B` 加粗、键盘移动)。 +**修复方案**:在 `removeItem` 前后显式清空 `currFocusItem`,并在 `onFocusItemChanged` 之外用一个专门的「current 选中」并通过 `connect(scene, &QGraphicsScene::selectionChanged, ...)` 单一来源,避免栈悬空。 + +### 4.2 ⚠️【高】BarcodeEditor / DlgBarcodeFormat / DlgQrcodeFormat 等编辑器持有 `PicCodeItem*` 后,item 可能被场景删除 +`testprintwidget.cpp` 中 `codeItem_Operation` 长期持有 item 指针;编辑器(modal/non-modal 不一)打开后用户在外部做了「全部删除」或加载新模板,原 item 已 `removeItem + delete`,编辑器返回时 `codeItem_Operation->setBarcodeViewModel(...)` → 崩。 +**修复方案**: +- 编辑期间禁用其他可能删除 item 的按钮;或 +- 用 `QPointer` 持有,使用前判空;或 +- 在 `removeItem` 前发信号通知所有打开的编辑器关闭。 + +### 4.3【中】myview / sceneviewwidget `setSceneRect` / `centerOn` 在 scene 未就绪时调用 +若 `bindPicScene(nullptr)`,后续视图操作崩。 +**修复方案**:所有调用前 `if(!scene()) return;`。 + +### 4.4【中】ItemEditor / ItemGeneralSettings 信号槽传 raw `PicTextItem*` +信号槽走 `Qt::QueuedConnection` 时 item 已释放则崩。 +**修复方案**:参数改 `QPointer`,或改成传 id(`item->data(0)` 存 uuid),槽内查表。 + +### 4.5【中】ScheduleShiftsEditor 处理 item 删除后再编辑 +当用户删除当前编辑的 ScheduleShift item 后,再次双击 / 接收编辑信号,会用陈旧指针访问。 +**修复方案**:在 picscene 的 itemRemoved 中关闭对应编辑器。 + +### 4.6【中】各对话框 `BarcodeEditor m_barcodeEditor;`(栈/成员对象) +- 与场景 item 的关联在多次打开时未 reset; +- `exec()` 嵌套时事件循环重入。 +**修复方案**:每次进入 `exec()` 前清状态;嵌套场景禁用相关按钮。 + +### 4.7【中】ImageLoader 模态弹出与 item 创建顺序 +若用户取消选择,但仍走「创建 item」分支,会插入空图像 item(与 3.8 联动)。 +**修复方案**:取消则不 `addItem`。 + +### 4.8【低】ViewModels.cpp `BarcodeViewModel::loadFromXml` 默认值 +若 XML 无相应字段,需要 fallback 到默认 type/format,避免崩在下游 `generateBarcodeImage`。 + +--- + +## 五、testprintwidget 相关问题 + +### 5.1 ⚠️【高】testprintwidget.cpp:55 / .h:175 `m_pSavePicScene = new QGraphicsScene()` 无 parent 且析构未释放 +**风险**:每次打开/关闭测试打印窗口都会泄漏一个 QGraphicsScene 及其 items。 +**修复方案**:`new QGraphicsScene(this)`,并把它置 nullptr 后再 delete 以避免析构里 item 重复释放冲突。 + +### 5.2 ⚠️【高】testprintwidget.cpp:1077-1092 / 1461-1477 `codeItem_Operation` 删除后未置空(与 4.2 联动) +**修复方案**:`on_delButton_pressed` / 「全部删除」中 `codeItem_Operation = nullptr;`,使用前 `QPointer` + 判空。 + +### 5.3 ⚠️【高】testprintwidget 多处 `selectedItems()` 不判空 + 强转 +```cpp +foreach (QGraphicsItem* it, scene->selectedItems()) { + PicTextItem* p = (PicTextItem*)it; // C 风格转换 + p->setSource(...); // 若 it 不是 PicTextItem 则崩 +} +``` +**修复方案**:`auto* p = qgraphicsitem_cast(it); if(!p) continue;`。 + +### 5.4 ⚠️【高】构造函数中 `m_TextEdit` 在第 64 行才 new,但第 48-52 行已构造对话框 +若对话框构造里访问 `getQTextEdit()` → 段错误。 +**修复方案**:把 `m_TextEdit = new QTextEdit(0);` 上移到第一个 dialog 之前。 + +### 5.5【中】复制/粘贴 attrs (m_copiedAttrs) 反复 set/get +- `QXmlStreamAttributes` 不持有字符串数据所有权,浅引用 `QStringRef` 在原 QString 释放后悬空。 +- 推荐 `QMap` 取代。 + +### 5.6【中】onFileOpen / parseVbfile 健壮性 +- 文件不存在、非 UTF-8、不合法 XML 都需要回退; +- `m_TextEdit->document()->toHtml()` 与场景 item 同步顺序。 +- 当前缺少 `if (!file.open(...)) return;` 与最后 `file.close()`。 + +### 5.7【中】saveFile / onSaveASFile 路径含中文/无写权限 +- 应使用 `QSaveFile` 防止崩盘截断。 +- `QFileDialog::getSaveFileName` 的过滤器要严格。 + +### 5.8【中】`eventFilter` 对象判断 +```cpp +if (obj == m_TextEdit) { ... } else if (obj == ...) { ... } +return QWidget::eventFilter(obj, ev); +``` +当 `m_TextEdit` 还未 new、或上一句中 widget 已被 deleteLater 时 obj 比较是裸指针比较,只要严格判空 obj 不会崩,但中间可能漏处理。 + +### 5.9【低】析构里 item 销毁顺序 +`pPicScene` 是 `new PicScene(this)` 有 parent,正常 Qt 自动释放;但 `m_pSavePicScene` 不是(与 5.1)。 + +--- + +## 六、mainwidget 相关问题 + +> mainwidget.cpp/.h 由于篇幅与上下文限制本次未全文阅读,下列基于 search 与已知调用链推断,标注为「待复核」。 + +### 6.1 ⚠️【高·待复核】onPreviewScene / handleEmptySize:当 `pPicScene` 为空 or `items().isEmpty()` 时直接走绘制路径 +**风险**:未判空 → 段错误。 +**修复方案**:进入函数顶部 `if(!pPicScene || pPicScene->items().isEmpty()) return;`。 + +### 6.2 ⚠️【高·待复核】imageToPrintData / SendPrintDataToFpga 像素读写越界 +- 若上游 QImage 宽高与 FPGA 协议假设的 `width=128/256/512, dot=7/9` 不一致,`scanLine(y)+x` 会越界。 +- `bytesPerLine()` 与 `width()/8` 不一定相等(行对齐)。 +**修复方案**:使用 `img.bits()` 时严格按 `bytesPerLine()` 走,且校验 `img.format()` 是否为期望格式(必要时 `img = img.convertToFormat(QImage::Format_Mono)`)。 + +### 6.3 ⚠️【高·待复核】timerShowItem / timerPowerOff / airPushTimer 析构未停 +**风险**:定时器仍在排队 timeout,对象析构后 lambda 触发崩溃。 +**修复方案**:析构里逐一 `stop()` 并 `disconnect()`。 + +### 6.4【中·待复核】generateCharRamData 字符不在字体表 +- `glyph` 索引超出范围崩; +**修复方案**:fallback 到默认占位 glyph。 + +### 6.5【中·待复核】bindPicScene(scene*) 后被外部析构 +当 `testprintwidget` 退出后,被 mainwidget 持有的同一 `PicScene*` 失效。 +**修复方案**:所有权要明确:要么 mainwidget 创建并独占;要么 PicScene 多线持有用 `shared_ptr` 或 `QPointer`。 + +### 6.6【中·待复核】m_setNumDlg / m_fileManageWidget 懒加载重复 new +**修复方案**:`if(!m_xxx) m_xxx = new ...(this);`。 + +### 6.7【低·待复核】updateSysStatusToUI 索引/越界 +- 状态枚举数组按 index 取 label 时需要 `qBound`。 + +--- + +## 七、InkJetPrinter 相关问题 + +### 7.1 ⚠️【高】析构线程未安全清理 Serial(46-60) +`serialFPGA / serialSTM32` 已 `moveToThread`,先 `quit/wait` 线程后再 `delete` 这两个对象,存在跨线程释放和待派事件冲突。 +**修复方案**: +```cpp +~InkJetPrinter() { + if (serialFPGA) { serialFPGA->disconnect(); serialFPGA->deleteLater(); } + if (serialSTM32){ serialSTM32->disconnect(); serialSTM32->deleteLater(); } + if (m_serialThreadFPGA && m_serialThreadFPGA->isRunning()) { m_serialThreadFPGA->quit(); m_serialThreadFPGA->wait(3000); } + if (m_serialThreadSTM32 && m_serialThreadSTM32->isRunning()) { m_serialThreadSTM32->quit(); m_serialThreadSTM32->wait(3000); } + // 不要再 delete serialFPGA/serialSTM32 +} +``` + +### 7.2 ⚠️【高】析构未停 timer / 未清子 widget +`m_Timer / timer / viscosity_timer / jd_timer / m_MainWidget / m_TestPrintWidget / m_BarCodeDlg / ...` 都是 `new ... (this)` 期望 Qt 父子链清理,但 timer 不会因 parent 而 stop(事件循环里仍可能正在派发 timeout)。 +**修复方案**:析构开头先 stop 所有 timer 并 disconnect。 + +### 7.3 ⚠️【高】QStackedWidget 切页面共享 PicScene 同步 +切页面后 testprintwidget 修改了 `pPicScene`,mainwidget 缓存的 item 引用会失效。 +**修复方案**:用一个全局 `SceneManager` 单点维护 PicScene 与 items;或在切页面时显式重新绑定。 + +### 7.4 ⚠️【高】saveFPGA*** 槽函数 `unsigned char* data` 协议解析 +- 未校验 `len`;偏移 `data[5+i]` 直接访问; +- 协议帧若被截断,会读到栈/堆外。 +**修复方案**:所有偏移加 `if (len < kHeader + N) return;` 校验。 + +### 7.5【中】lambda 捕获 raw pointer +e.g. `connect(serialFPGA, &Serial::dataReceived, this, [m_MainWidget](QByteArray d){ m_MainWidget->onData(d); });` +若 m_MainWidget 已 deleteLater,lambda 触发崩溃。 +**修复方案**:捕获 `QPointer p = m_MainWidget;`,使用前判空。 + +### 7.6【中】showScheduleShiftsEditor / openDatetimeEditor 接收 item* 异步使用 +**修复方案**:参数改 `QPointer`。 + +### 7.7【中】restartSerialPort / closeSerial 并发竞争 +两路串口都可能在主线程和子线程同时被关闭/重启,无锁。 +**修复方案**:增加 `QMutex` 或调度到串口所在线程后再操作(`QMetaObject::invokeMethod(serial, ..., Qt::QueuedConnection)`)。 + +### 7.8【中】子 widget 是否重复 new +代码里有 `if(!m_xxx) m_xxx = new ...` 不一致,部分入口直接 `new`,重复 new 会泄漏旧的。 +**修复方案**:统一懒加载工厂。 + +### 7.9【低】部分 `deleteLater` 后立刻设置成员为 nullptr 可避免后续再访问悬空。 + +--- + +## 八、修复优先级与建议步骤 + +按修复成本与收益排序,建议按以下顺序处理: + +1. **P0 立即修(避免 crash)** + - 3.1 / 3.2 / 3.3 / 3.4 / 3.5 / 3.7 :scene 目录 Item 类的空指针、索引越界、UB 返回值;改动小、稳定性收益最大。 + - 5.1 / 5.2 / 5.3 / 5.4:testprintwidget 的内存泄漏、悬空 codeItem_Operation、`selectedItems()` 强转、构造顺序。 + - 7.1 / 7.2:InkJetPrinter 析构里的线程与 timer。 + +2. **P1 短期修(避免数据错误/偶发崩溃)** + - 3.8 / 3.9 / 3.11;4.1 / 4.2 / 4.5;5.5 / 5.6;6.1 / 6.2 / 6.3;7.3 / 7.4 / 7.5。 + +3. **P2 后续整改(架构层)** + - 引入 `QPointer<>`/`shared_ptr` 替换裸指针存储 item; + - 把对话框对 item 的引用改为「id + 查表」模式,避免任何悬空; + - 串口/线程操作集中到独立 service 类,加锁; + - 统一 PicScene 所有权(建议 InkJetPrinter 持有,子 widget 只 bind)。 + +4. **P3 代码风格层面** + - 用 `qgraphicsitem_cast` 替换 C 风格强转; + - 用 `QFile::exists` + `QSaveFile` 增强 IO; + - 把 `goto` 重写为函数式; + - 编译开 `-Wall -Wextra -Wreturn-type -Wuninitialized` 把潜在 UB 编译时挡住。 + +--- + +## 九、回归验证建议 + +修完后建议至少跑通以下场景,能稳定不崩即视为通过: + +1. **空场景**:打开测试打印 → 不放任何 item → 直接预览/打印 → 关闭。 +2. **复制粘贴**:连续复制粘贴 50 次 + 删除 + 撤销。 +3. **极端文本**:item 文本设为「空」「单字符」「100 字符」「中英混排」「Emoji」「不存在的字体」。 +4. **图片项**:选不存在的图片路径 / 损坏图 / 巨型图(>4096px)。 +5. **条码 / 二维码**:编辑器打开期间,外部点「全部删除」/ 加载模板。 +6. **ScheduleShifts**:打开班次编辑后删除 item 再返回保存。 +7. **串口 / FPGA**:拔掉 USB → 触发 `restartSerialPort` → 重新插入。 +8. **进入退出**:连续 30 次 `InkJetPrinter` show/hide / 退出程序,无内存增长且无 crash。 +9. **跨页切换**:mainwidget ↔ testprintwidget ↔ systemmanage 反复切换 100 次。 +10. **打印**:连续打印 1000 次(含日期变量、计数器、班次),观察 `imageToPrintData` 是否越界。 + +--- + +## 十、文档说明 + +- 本文件路径:`doc/Scene_Modules_Bug_Inspection_Report.md` +- 排查未涉及代码的修改,所有「修复方案」仅作为后续提交的参考。 +- 部分 mainwidget 相关 6.1–6.7 项标注为「待复核」,原因是受当前会话上下文限制未能逐行通读 mainwidget.cpp 全文。建议在确认上述 P0/P1 修复方向后,再单独安排对 `mainwidget.cpp/h` 的全文复核(建议输出 6.x 项的精确行号与代码片段)。 + +> **下一步**:请检查本文档,确认修复方向与优先级;确认后我再按 P0 → P1 顺序提交代码改动。 + + +# 文档审阅 + +--- + +## 十一、本次会话修复结论(2026-05-10 追加) + +### 11.1 已修复项 + +- **3.2 pictextitem.cpp `mouseReleaseEvent` / `keyPressEvent` 未判空 `scene()`**:已在两个事件函数入口加 `if(!scene())` 提前返回,避免 item 离场期间触发 `scene()->update()` / `scene()->selectedItems()` 解引用空指针。 + +### 11.2 复核结论(无需修复) + +- **3.11 piccodeitem 中 `m_dateVarTimer` 风险**:复核 `scene/piccodeitem.h` 后确认当前类中**并不存在** `m_dateVarTimer` 成员;该项原为基于代码模式的预防性提示,目前不构成实际隐患,标记为「不适用」。 + +### 11.3 用户已自行修复(来自上文「澄清」栏汇总) + +- 3.1 `clampItemPos` 未判空 `scene()` —— 已修复 +- 3.3 `strToImage` 0 宽/0 高 QImage —— 已修复 +- 3.5 `m_currCounterValues` 越界 —— 已在 `updateVariants` 入口校验 +- 3.7 `setBoldMultiple` 缺少返回值 —— 已修复 +- 3.8 PicImageItem 加载失败仍使用旧对象 —— 已修复 +- 3.9 PicScheduleShiftItem 返回临时对象引用 —— 已修复 + +### 11.4 用户决定不修复(按澄清栏) + +- 3.4 `itemChange()` clamp 逻辑未生效(含 `ItemSceneChange` 笔误)—— 用户表示该段代码使用已久未发现异常,暂不修复 +- 3.6 `setSource` 忽略入参 —— `source/setSource` 机制准备弃用,不予修复 +- 3.10 文档对象 stylesheet —— 全面自绘,不予修复 +- 3.12 `clipImage` 使用 goto + `originRect` 未使用 —— 不予修复 + +### 11.5 仍待处理项(按优先级) + +- **P0**:5.1 / 5.2 / 5.3 / 5.4(testprintwidget 内存泄漏、悬空 `codeItem_Operation`、C 风格强转、构造顺序);7.1 / 7.2(InkJetPrinter 析构线程与 timer 清理)。 +- **P1**:4.1 / 4.2 / 4.5(编辑器持有 item 裸指针);5.5 / 5.6;6.1 / 6.2 / 6.3(mainwidget 待全文复核);7.3 / 7.4 / 7.5。 +- **P2/P3**:架构层 `QPointer` / `id+查表` 替换裸指针存储、串口/线程加锁、`qgraphicsitem_cast` 替换 C 风格强转等。 + +> **下一步建议**:可单独安排对 `mainwidget.cpp/h` 的全文复核,输出 6.1–6.7 项的精确行号与代码片段后再决定修复。其余 P0 项(testprintwidget / InkJetPrinter)可按本节排序逐项推进。 diff --git a/mainwidget.h b/mainwidget.h index 4c05937..6a4ce78 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -1,245 +1,245 @@ -#ifndef MainWidget_H -#define MainWidget_H - -#define MDTFLAG 0xff00FF10 -#define QRFLAG 0xff00FF20 -#define BARFLAG 0xff00FF30 -#define MMVAR 1 -#define MAX_ALLOW_VISICOSITY_OVERFLOW_NUM 120 //连续超那么多次,会被认为粘度故障 - -#define EXPIRY_VARI_RECONISE 0x0000FF -#define RECICLARNUMBER 22 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "scene/picscene.h" -#include "LogInfo.h" - -// 包含UI自动生成的头文件 -#include "ui_MainWidget.h" - -#include "fileManage/FileManageWidget.h" - -#include "setnumdlg.h" - -class MainWidget : public QWidget -{ - Q_OBJECT - -public: - MainWidget(QWidget* parent = nullptr); - ~MainWidget(); - - void bindSysPara(SysPara *SysPara); - - /** - * @brief 生成打印内容,并发送打印内容到 FPGA - * - * @param pPicScene 包含打印内容的场景 - * @return 成功返回true,否则false,查看日志 - */ - bool generatePrintContent(PicScene* pPicScene); - - /** - * @brief 重新生成打印内容,所用场景是由调用 generatePrintContent 时设置的,generatePrintContent 也会调用此函数 - * - */ - void onPreviewScene(); - - // 260420 hlp:场景为空时,渲染空场景并刷新界面 - void handleEmptySize(); - - QString strWarring,strTitle; - bool m_2sFlag; - bool printintFlag; //判断当前是否在打印 - bool startPrintingFlag; - - bool pushButtonFlag; - - // 单独更新时间类图元 byons@2026年4月11日 - - /** - * @brief 更新时间类图元到FPGA print 数据 - * @return 返回需要更新的区域 - * @remark 判断返回值用于决定是否SendPrintDataToFpga - */ - QList variableItemsUpdate(); - - /** - * @brief 向FPGA print 数据缓冲区写入image - * @return 返回总计写入的点阵数量,返回 0 没有写入任何点阵 - * @param img 要写入的image - * @param startX 起始x坐标 - * @param startY 起始y坐标 - */ - int imageToPrintData(QImage& img, int startX, int startY); - - void generateCharRamData(); - void setRunStatus(QString str); - void enablePrintButton(bool); - int getCurrPrintStatus(); - - // 回收槽开启按钮状态设置 - void setReclaimOpenBtnStatus(bool enable); - - // 回收槽关闭按钮状态设置 - void setReclaimCloseBtnStatus(bool enable); - - void flashReclaimOpenBtn(); - - void stopFlashReclaimOpenBtn(); - - PicScene* currScene() const { - return pPicScene; - } - - /** - * @brief 设置回收槽开关状态 - * @param isOpen true:开;false:关 - * @param rate 回收槽开启程度,0~100; - */ - void setReclaimStatus(bool isOpen, int rate = 0); - - void updateSysStatusToUI(); //重载 - //Mainwindow获取机器总状态 - DevStatusLightType m_stateColor = DEV_STATUS_GREEN; - //DEV_STATUS_GREEN:正常 - QString m_stateStr = "正常"; - bool checkRed(AlarmStatus &status); - bool checkYellow(AlarmStatus &status); - void updateGeneralState(AlarmStatus status); - - - void updateTotalCnt(int en); - int calculateMaxSpeed(int backup); - int getMaxSpeedCalcPara(); - - QTimer *timerShowItem,*timerPowerOff; - - void SendPrintDataToFpga(unsigned char alterEnable, bool isUpdate = false); - - void updatePrintDisplayLabel(); - - void RefreshStatusLight(); - bool updatePhaseIndicatorLight(); - - bool flagOfClearHighVltageWarnning; - - AlarmStatus alarmStatus; - -// void mouseDoubleClickEvent(QMouseEvent *event) override; - -private: - // UI对象 - Ui::MainWidget ui; - SysPara *sysPara = nullptr; - - // 控件成员变量(关联UI控件) - QPushButton* m_EditBtn; - QPushButton* m_AddBtn; - QPushButton* m_MainBtn; - QPushButton* m_ManageBtn; - QPushButton* m_MsgBtn; - QPushButton* m_CloseBtn; - QPushButton* m_StopBtn; - QPushButton* m_StartBtn; - QPushButton* m_ToolBtn; - QToolButton* m_RightBtn; - QToolButton* m_LeftBtn; - PrintTextDisplay* m_PrintDisplay; - - int r_ExpiryDay; - QTimer *airPushTimer; - - PicScene *pPicScene = nullptr; - QGraphicsView *view; - - FileManageWidget *m_fileManageWidget = nullptr; - - int dlgMyWarringShowDlyCnt; - - SetNumDlg* m_setNumDlg = nullptr; - - //------自定义双击------ - QPoint m_lastClickPos; - qint64 m_lastClickTime = 0; - const int m_doubleClickDistance = 25; // 自定义距离阈值(像素) - const int m_doubleClickInterval = 500; // 自定义时间阈值(毫秒) - void mousePressEvent(QMouseEvent *event) override; - void handleDoubleClick(QMouseEvent *event); - bool isInExpandedRect(QWidget* widget, const QPoint& globalPos, int expandSize); - //-------------------- -public slots: - void powerOffConfirmed(); - void on_m_StartBtn_clicked(); - void on_m_StopBtn_clicked(); - void sendPowerOffCmd(); - void checkForPowerOff(); - void _on_pushButtonPowerOff_pressed(bool notice); - - void onLabelFaultRusumePressed(); - - void UpdateUIVersion(); - - void on_m_RightBtn_clicked(); - - void on_m_LeftBtn_clicked(); - -private: - void init(); -// void SendPrintDataToFpga(unsigned char); - void reclaimTanOpen(); - - void initSheet(); - - void updateNozzleStateMarquee(const QString& str); - void stopNozzleStateMarquee(); - bool eventFilter(QObject *watched, QEvent *event) override; - - bool m_reclaimFlashState = false; - - QTimer* m_reclaimOpenBtnFlashTimer = nullptr; - - QTimer* m_nozzleStateMarqueeTimer = nullptr; - QString m_nozzleStateFullText; - int m_nozzleStateMarqueeOffsetPx = 0; - int m_nozzleStateMarqueeTextWidth = 0; - int m_nozzleStateMarqueeGapPx = 0; - bool m_nozzleStateMarqueeEnabled = false; - - // 高亮切换 - void changeHighLight(bool isStart); -private slots: - void airPushingProcess(); - void buttonClickedSlot(); - - void on_m_ManageBtn_clicked(); - - void slt_setNum(); - - void slt_clearCnt(); - - void onReclaimOpenBtnFlashTimerTimeout(); - - void onNozzleStateMarqueeTimeout(); - -signals: - void sendButtonClickedSignal(int index); - void setDisableAll(); - void CloseJd(); - void showVserionInfo(QString); - - void repeatInitedPid(); - void clearPressureFault(); - - void newFileAcquired(); -}; - +#ifndef MainWidget_H +#define MainWidget_H + +#define MDTFLAG 0xff00FF10 +#define QRFLAG 0xff00FF20 +#define BARFLAG 0xff00FF30 +#define MMVAR 1 +#define MAX_ALLOW_VISICOSITY_OVERFLOW_NUM 120 //连续超那么多次,会被认为粘度故障 + +#define EXPIRY_VARI_RECONISE 0x0000FF +#define RECICLARNUMBER 22 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "scene/picscene.h" +#include "LogInfo.h" + +// 包含UI自动生成的头文件 +#include "ui_MainWidget.h" + +#include "fileManage/FileManageWidget.h" + +#include "setnumdlg.h" + +class MainWidget : public QWidget +{ + Q_OBJECT + +public: + MainWidget(QWidget* parent = nullptr); + ~MainWidget(); + + void bindSysPara(SysPara *SysPara); + + /** + * @brief 生成打印内容,并发送打印内容到 FPGA + * + * @param pPicScene 包含打印内容的场景 + * @return 成功返回true,否则false,查看日志 + */ + bool generatePrintContent(PicScene* pPicScene); + + /** + * @brief 重新生成打印内容,所用场景是由调用 generatePrintContent 时设置的,generatePrintContent 也会调用此函数 + * + */ + void onPreviewScene(); + + // 260420 hlp:场景为空时,渲染空场景并刷新界面 + void handleEmptySize(); + + QString strWarring,strTitle; + bool m_2sFlag; + bool printintFlag; //判断当前是否在打印 + bool startPrintingFlag; + + bool pushButtonFlag; + + // 单独更新时间类图元 byons@2026年4月11日 + + /** + * @brief 更新时间类图元到FPGA print 数据 + * @return 返回需要更新的区域 + * @remark 判断返回值用于决定是否SendPrintDataToFpga + */ + QList variableItemsUpdate(); + + /** + * @brief 向FPGA print 数据缓冲区写入image + * @return 返回总计写入的点阵数量,返回 0 没有写入任何点阵 + * @param img 要写入的image + * @param startX 起始x坐标 + * @param startY 起始y坐标 + */ + int imageToPrintData(QImage& img, int startX, int startY); + + void generateCharRamData(); + void setRunStatus(QString str); + void enablePrintButton(bool); + int getCurrPrintStatus(); + + // 回收槽开启按钮状态设置 + void setReclaimOpenBtnStatus(bool enable); + + // 回收槽关闭按钮状态设置 + void setReclaimCloseBtnStatus(bool enable); + + void flashReclaimOpenBtn(); + + void stopFlashReclaimOpenBtn(); + + PicScene* currScene() const { + return pPicScene; + } + + /** + * @brief 设置回收槽开关状态 + * @param isOpen true:开;false:关 + * @param rate 回收槽开启程度,0~100; + */ + void setReclaimStatus(bool isOpen, int rate = 0); + + void updateSysStatusToUI(); //重载 + //Mainwindow获取机器总状态 + DevStatusLightType m_stateColor = DEV_STATUS_GREEN; + //DEV_STATUS_GREEN:正常 + QString m_stateStr = "正常"; + bool checkRed(AlarmStatus &status); + bool checkYellow(AlarmStatus &status); + void updateGeneralState(AlarmStatus status); + + + void updateTotalCnt(int en); + int calculateMaxSpeed(int backup); + int getMaxSpeedCalcPara(); + + QTimer *timerShowItem,*timerPowerOff; + + void SendPrintDataToFpga(unsigned char alterEnable, bool isUpdate = false); + + void updatePrintDisplayLabel(); + + void RefreshStatusLight(); + bool updatePhaseIndicatorLight(); + + bool flagOfClearHighVltageWarnning; + + AlarmStatus alarmStatus; + +// void mouseDoubleClickEvent(QMouseEvent *event) override; + +private: + // UI对象 + Ui::MainWidget ui; + SysPara *sysPara = nullptr; + + // 控件成员变量(关联UI控件) + QPushButton* m_EditBtn; + QPushButton* m_AddBtn; + QPushButton* m_MainBtn; + QPushButton* m_ManageBtn; + QPushButton* m_MsgBtn; + QPushButton* m_CloseBtn; + QPushButton* m_StopBtn; + QPushButton* m_StartBtn; + QPushButton* m_ToolBtn; + QToolButton* m_RightBtn; + QToolButton* m_LeftBtn; + PrintTextDisplay* m_PrintDisplay; + + int r_ExpiryDay; + QTimer *airPushTimer; + + PicScene *pPicScene = nullptr; + QGraphicsView *view; + + FileManageWidget *m_fileManageWidget = nullptr; + + int dlgMyWarringShowDlyCnt; + + SetNumDlg* m_setNumDlg = nullptr; + + //------自定义双击------ + QPoint m_lastClickPos; + qint64 m_lastClickTime = 0; + const int m_doubleClickDistance = 25; // 自定义距离阈值(像素) + const int m_doubleClickInterval = 500; // 自定义时间阈值(毫秒) + void mousePressEvent(QMouseEvent *event) override; + void handleDoubleClick(QMouseEvent *event); + bool isInExpandedRect(QWidget* widget, const QPoint& globalPos, int expandSize); + //-------------------- +public slots: + void powerOffConfirmed(); + void on_m_StartBtn_clicked(); + void on_m_StopBtn_clicked(); + void sendPowerOffCmd(); + void checkForPowerOff(); + void _on_pushButtonPowerOff_pressed(bool notice); + + void onLabelFaultRusumePressed(); + + void UpdateUIVersion(); + + void on_m_RightBtn_clicked(); + + void on_m_LeftBtn_clicked(); + +private: + void init(); +// void SendPrintDataToFpga(unsigned char); + void reclaimTanOpen(); + + void initSheet(); + + void updateNozzleStateMarquee(const QString& str); + void stopNozzleStateMarquee(); + bool eventFilter(QObject *watched, QEvent *event) override; + + bool m_reclaimFlashState = false; + + QTimer* m_reclaimOpenBtnFlashTimer = nullptr; + + QTimer* m_nozzleStateMarqueeTimer = nullptr; + QString m_nozzleStateFullText; + int m_nozzleStateMarqueeOffsetPx = 0; + int m_nozzleStateMarqueeTextWidth = 0; + int m_nozzleStateMarqueeGapPx = 0; + bool m_nozzleStateMarqueeEnabled = false; + + // 高亮切换 + void changeHighLight(bool isStart); +private slots: + void airPushingProcess(); + void buttonClickedSlot(); + + void on_m_ManageBtn_clicked(); + + void slt_setNum(); + + void slt_clearCnt(); + + void onReclaimOpenBtnFlashTimerTimeout(); + + void onNozzleStateMarqueeTimeout(); + +signals: + void sendButtonClickedSignal(int index); + void setDisableAll(); + void CloseJd(); + void showVserionInfo(QString); + + void repeatInitedPid(); + void clearPressureFault(); + + void newFileAcquired(); +}; + #endif // MainWidget_H \ No newline at end of file diff --git a/modbus/demo.c b/modbus/demo.c index a8be9bb..bae6fde 100644 --- a/modbus/demo.c +++ b/modbus/demo.c @@ -1,284 +1,284 @@ -/* - * FreeModbus Libary: Linux Demo Application - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: demo.c,v 1.2 2006/10/12 08:12:06 wolti Exp $ - */ - -/* ----------------------- Standard includes --------------------------------*/ -#include -#include -#include -#include -#include -#include -#include - -#include "demo.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define PROG "freemodbus" - -#define REG_INPUT_START 1000 -#define REG_INPUT_NREGS 10 -#define REG_HOLDING_START 2000 -#define REG_HOLDING_NREGS 130 - -/* ----------------------- Static variables ---------------------------------*/ -static USHORT usRegInputStart = REG_INPUT_START; -USHORT* usRegInputBuf; -static USHORT usRegHoldingStart = REG_HOLDING_START; -USHORT* usRegHoldingBuf; - -static pthread_mutex_t xLock = PTHREAD_MUTEX_INITIALIZER; -static BOOL bDoExit; - -/* ----------------------- Static functions ---------------------------------*/ -static BOOL bCreatePollingThread( void ); -//static enum ThreadState eGetPollingThreadState( void ); -//static void vSetPollingThreadState( enum ThreadState eNewState ); -static void *pvPollingThread( void *pvParameter ); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL -bSetSignal( int iSignalNr, void ( *pSigHandler ) ( int ) ) -{ - BOOL bResult; - struct sigaction xNewSig, xOldSig; - - xNewSig.sa_handler = pSigHandler; - sigemptyset( &xNewSig.sa_mask ); - xNewSig.sa_flags = 0; - if( sigaction( iSignalNr, &xNewSig, &xOldSig ) != 0 ) - { - bResult = FALSE; - } - else - { - bResult = TRUE; - } - return bResult; -} - -void -vSigShutdown( int xSigNr ) -{ - switch ( xSigNr ) - { - case SIGQUIT: - case SIGINT: - case SIGTERM: - vSetPollingThreadState( SHUTDOWN ); - bDoExit = TRUE; - } -} - -BOOL -active_modbus( USHORT* mPara, USHORT* mStatus, USHORT port_num) -{ - int iExitCode = EXIT_SUCCESS; -// CHAR cCh; - - const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC }; - usRegHoldingBuf = mPara; - usRegInputBuf = mStatus; - if( !bSetSignal( SIGQUIT, vSigShutdown ) || - !bSetSignal( SIGINT, vSigShutdown ) || !bSetSignal( SIGTERM, vSigShutdown ) ) - { - fprintf( stderr, "%s: can't install signal handlers: %s!\n", PROG, strerror( errno ) ); - iExitCode = EXIT_FAILURE; - } - else if( eMBInit( MB_RTU, 0x0A, port_num, 38400, MB_PAR_EVEN ) != MB_ENOERR ) - { - fprintf( stderr, "%s: can't initialize modbus stack!\n", PROG ); - iExitCode = EXIT_FAILURE; - } - else if( eMBSetSlaveID( 0x34, TRUE, ucSlaveID, 3 ) != MB_ENOERR ) - { - fprintf( stderr, "%s: can't set slave id!\n", PROG ); - iExitCode = EXIT_FAILURE; - } - else - { - vSetPollingThreadState( STOPPED ); - - if( bCreatePollingThread( ) != TRUE ) - { - iExitCode = EXIT_FAILURE; - vMBPortLog( MB_LOG_DEBUG, "active_modbus", "Can't start protocol stack! Already running?\n"); - } - } - - return iExitCode; -} - -BOOL -bCreatePollingThread( void ) -{ - BOOL bResult; - pthread_t xThread; - - if( eGetPollingThreadState( ) == STOPPED ) - { - if( pthread_create( &xThread, NULL, pvPollingThread, NULL ) != 0 ) - { - bResult = FALSE; - } - else - { - bResult = TRUE; - } - } - else - { - bResult = FALSE; - } - - return bResult; -} - -void * -pvPollingThread( void *pvParameter ) -{ - vSetPollingThreadState( RUNNING ); - - if( eMBEnable( ) == MB_ENOERR ) - { - do - { -// vMBPortLog( MB_LOG_DEBUG, "usRegInputBuf[0]", "%d\n", usRegInputBuf[0]); - if( eMBPoll( ) != MB_ENOERR ) - break; -// usRegInputBuf[0] = ( USHORT ) rand( ); - } - while( eGetPollingThreadState( ) != SHUTDOWN ); - } - - ( void )eMBDisable( ); - - vSetPollingThreadState( STOPPED ); - - return 0; -} - -enum ThreadState -eGetPollingThreadState( ) -{ - enum ThreadState eCurState; - - ( void )pthread_mutex_lock( &xLock ); - eCurState = ePollThreadState; - ( void )pthread_mutex_unlock( &xLock ); - - return eCurState; -} - -void -vSetPollingThreadState( enum ThreadState eNewState ) -{ - ( void )pthread_mutex_lock( &xLock ); - ePollThreadState = eNewState; - ( void )pthread_mutex_unlock( &xLock ); -} - -eMBErrorCode -eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -{ - eMBErrorCode eStatus = MB_ENOERR; - int iRegIndex; - - vMBPortLog( MB_LOG_DEBUG, "eMBRegInputCB", "exe\n"); - if( ( usAddress >= REG_INPUT_START ) - && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) - { - iRegIndex = ( int )( usAddress - usRegInputStart ); - while( usNRegs > 0 ) - { - *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 ); - *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF ); - iRegIndex++; - usNRegs--; - } - } - else - { - eStatus = MB_ENOREG; - } - - return eStatus; -} - -void CallProcessCommands(int index); - -eMBErrorCode -eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) -{ - eMBErrorCode eStatus = MB_ENOERR; - int iRegIndex; - - vMBPortLog( MB_LOG_DEBUG, "eMBRegHoldingCB", "exe\n"); - if( ( usAddress >= REG_HOLDING_START ) && - ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) - { - iRegIndex = ( int )( usAddress - usRegHoldingStart ); - switch ( eMode ) - { - /* Pass current register values to the protocol stack. */ - case MB_REG_READ: - while( usNRegs > 0 ) - { - *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] >> 8 ); - *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] & 0xFF ); - iRegIndex++; - usNRegs--; - } - break; - - /* Update current register values with new values from the - * protocol stack. */ - case MB_REG_WRITE: - while( usNRegs > 0 ) - { - usRegHoldingBuf[iRegIndex - 1] = *pucRegBuffer++ << 8; - usRegHoldingBuf[iRegIndex - 1] |= *pucRegBuffer++; - vMBPortLog( MB_LOG_DEBUG, "eMBRegHoldingCB", "usRegHoldingBuf[%d] %d\n",iRegIndex - 1, usRegHoldingBuf[iRegIndex - 1]); - CallProcessCommands(iRegIndex); - iRegIndex++; - usNRegs--; - - } - } - } - else - { - eStatus = MB_ENOREG; - } - return eStatus; -} - - -eMBErrorCode -eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) -{ - return MB_ENOREG; -} - -eMBErrorCode -eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -{ - return MB_ENOREG; -} +/* + * FreeModbus Libary: Linux Demo Application + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: demo.c,v 1.2 2006/10/12 08:12:06 wolti Exp $ + */ + +/* ----------------------- Standard includes --------------------------------*/ +#include +#include +#include +#include +#include +#include +#include + +#include "demo.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define PROG "freemodbus" + +#define REG_INPUT_START 1000 +#define REG_INPUT_NREGS 10 +#define REG_HOLDING_START 2000 +#define REG_HOLDING_NREGS 130 + +/* ----------------------- Static variables ---------------------------------*/ +static USHORT usRegInputStart = REG_INPUT_START; +USHORT* usRegInputBuf; +static USHORT usRegHoldingStart = REG_HOLDING_START; +USHORT* usRegHoldingBuf; + +static pthread_mutex_t xLock = PTHREAD_MUTEX_INITIALIZER; +static BOOL bDoExit; + +/* ----------------------- Static functions ---------------------------------*/ +static BOOL bCreatePollingThread( void ); +//static enum ThreadState eGetPollingThreadState( void ); +//static void vSetPollingThreadState( enum ThreadState eNewState ); +static void *pvPollingThread( void *pvParameter ); + +/* ----------------------- Start implementation -----------------------------*/ +BOOL +bSetSignal( int iSignalNr, void ( *pSigHandler ) ( int ) ) +{ + BOOL bResult; + struct sigaction xNewSig, xOldSig; + + xNewSig.sa_handler = pSigHandler; + sigemptyset( &xNewSig.sa_mask ); + xNewSig.sa_flags = 0; + if( sigaction( iSignalNr, &xNewSig, &xOldSig ) != 0 ) + { + bResult = FALSE; + } + else + { + bResult = TRUE; + } + return bResult; +} + +void +vSigShutdown( int xSigNr ) +{ + switch ( xSigNr ) + { + case SIGQUIT: + case SIGINT: + case SIGTERM: + vSetPollingThreadState( SHUTDOWN ); + bDoExit = TRUE; + } +} + +BOOL +active_modbus( USHORT* mPara, USHORT* mStatus, USHORT port_num) +{ + int iExitCode = EXIT_SUCCESS; +// CHAR cCh; + + const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC }; + usRegHoldingBuf = mPara; + usRegInputBuf = mStatus; + if( !bSetSignal( SIGQUIT, vSigShutdown ) || + !bSetSignal( SIGINT, vSigShutdown ) || !bSetSignal( SIGTERM, vSigShutdown ) ) + { + fprintf( stderr, "%s: can't install signal handlers: %s!\n", PROG, strerror( errno ) ); + iExitCode = EXIT_FAILURE; + } + else if( eMBInit( MB_RTU, 0x0A, port_num, 38400, MB_PAR_EVEN ) != MB_ENOERR ) + { + fprintf( stderr, "%s: can't initialize modbus stack!\n", PROG ); + iExitCode = EXIT_FAILURE; + } + else if( eMBSetSlaveID( 0x34, TRUE, ucSlaveID, 3 ) != MB_ENOERR ) + { + fprintf( stderr, "%s: can't set slave id!\n", PROG ); + iExitCode = EXIT_FAILURE; + } + else + { + vSetPollingThreadState( STOPPED ); + + if( bCreatePollingThread( ) != TRUE ) + { + iExitCode = EXIT_FAILURE; + vMBPortLog( MB_LOG_DEBUG, "active_modbus", "Can't start protocol stack! Already running?\n"); + } + } + + return iExitCode; +} + +BOOL +bCreatePollingThread( void ) +{ + BOOL bResult; + pthread_t xThread; + + if( eGetPollingThreadState( ) == STOPPED ) + { + if( pthread_create( &xThread, NULL, pvPollingThread, NULL ) != 0 ) + { + bResult = FALSE; + } + else + { + bResult = TRUE; + } + } + else + { + bResult = FALSE; + } + + return bResult; +} + +void * +pvPollingThread( void *pvParameter ) +{ + vSetPollingThreadState( RUNNING ); + + if( eMBEnable( ) == MB_ENOERR ) + { + do + { +// vMBPortLog( MB_LOG_DEBUG, "usRegInputBuf[0]", "%d\n", usRegInputBuf[0]); + if( eMBPoll( ) != MB_ENOERR ) + break; +// usRegInputBuf[0] = ( USHORT ) rand( ); + } + while( eGetPollingThreadState( ) != SHUTDOWN ); + } + + ( void )eMBDisable( ); + + vSetPollingThreadState( STOPPED ); + + return 0; +} + +enum ThreadState +eGetPollingThreadState( ) +{ + enum ThreadState eCurState; + + ( void )pthread_mutex_lock( &xLock ); + eCurState = ePollThreadState; + ( void )pthread_mutex_unlock( &xLock ); + + return eCurState; +} + +void +vSetPollingThreadState( enum ThreadState eNewState ) +{ + ( void )pthread_mutex_lock( &xLock ); + ePollThreadState = eNewState; + ( void )pthread_mutex_unlock( &xLock ); +} + +eMBErrorCode +eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) +{ + eMBErrorCode eStatus = MB_ENOERR; + int iRegIndex; + + vMBPortLog( MB_LOG_DEBUG, "eMBRegInputCB", "exe\n"); + if( ( usAddress >= REG_INPUT_START ) + && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) + { + iRegIndex = ( int )( usAddress - usRegInputStart ); + while( usNRegs > 0 ) + { + *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 ); + *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF ); + iRegIndex++; + usNRegs--; + } + } + else + { + eStatus = MB_ENOREG; + } + + return eStatus; +} + +void CallProcessCommands(int index); + +eMBErrorCode +eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) +{ + eMBErrorCode eStatus = MB_ENOERR; + int iRegIndex; + + vMBPortLog( MB_LOG_DEBUG, "eMBRegHoldingCB", "exe\n"); + if( ( usAddress >= REG_HOLDING_START ) && + ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) + { + iRegIndex = ( int )( usAddress - usRegHoldingStart ); + switch ( eMode ) + { + /* Pass current register values to the protocol stack. */ + case MB_REG_READ: + while( usNRegs > 0 ) + { + *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] >> 8 ); + *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] & 0xFF ); + iRegIndex++; + usNRegs--; + } + break; + + /* Update current register values with new values from the + * protocol stack. */ + case MB_REG_WRITE: + while( usNRegs > 0 ) + { + usRegHoldingBuf[iRegIndex - 1] = *pucRegBuffer++ << 8; + usRegHoldingBuf[iRegIndex - 1] |= *pucRegBuffer++; + vMBPortLog( MB_LOG_DEBUG, "eMBRegHoldingCB", "usRegHoldingBuf[%d] %d\n",iRegIndex - 1, usRegHoldingBuf[iRegIndex - 1]); + CallProcessCommands(iRegIndex); + iRegIndex++; + usNRegs--; + + } + } + } + else + { + eStatus = MB_ENOREG; + } + return eStatus; +} + + +eMBErrorCode +eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) +{ + return MB_ENOREG; +} + +eMBErrorCode +eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) +{ + return MB_ENOREG; +} diff --git a/modbus/demo.h b/modbus/demo.h index 4769d7f..87edf02 100644 --- a/modbus/demo.h +++ b/modbus/demo.h @@ -1,27 +1,27 @@ -#ifndef _DEMO_H -#define _DEMO_H - - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -static enum ThreadState -{ - STOPPED, - RUNNING, - SHUTDOWN -} ePollThreadState; - -BOOL active_modbus( USHORT* mPara, USHORT* mStatus,USHORT port_num); -void vSetPollingThreadState( enum ThreadState eNewState ); -enum ThreadState eGetPollingThreadState( void ); -#ifdef __cplusplus -PR_END_EXTERN_C -#endif - -#endif +#ifndef _DEMO_H +#define _DEMO_H + + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + +static enum ThreadState +{ + STOPPED, + RUNNING, + SHUTDOWN +} ePollThreadState; + +BOOL active_modbus( USHORT* mPara, USHORT* mStatus,USHORT port_num); +void vSetPollingThreadState( enum ThreadState eNewState ); +enum ThreadState eGetPollingThreadState( void ); +#ifdef __cplusplus +PR_END_EXTERN_C +#endif + +#endif diff --git a/modbus/modbus/ascii/mbascii.c b/modbus/modbus/ascii/mbascii.c index 7293c34..c513457 100644 --- a/modbus/modbus/ascii/mbascii.c +++ b/modbus/modbus/ascii/mbascii.c @@ -1,486 +1,486 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.c,v 1.17 2010/06/06 13:47:07 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbascii.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -#if MB_ASCII_ENABLED > 0 - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_ASCII_DEFAULT_CR '\r' /*!< Default CR character for Modbus ASCII. */ -#define MB_ASCII_DEFAULT_LF '\n' /*!< Default LF character for Modbus ASCII. */ -#define MB_SER_PDU_SIZE_MIN 3 /*!< Minimum size of a Modbus ASCII frame. */ -#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus ASCII frame. */ -#define MB_SER_PDU_SIZE_LRC 1 /*!< Size of LRC field in PDU. */ -#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ -#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_RX_RCV, /*!< Frame is beeing received. */ - STATE_RX_WAIT_EOF /*!< Wait for End of Frame. */ -} eMBRcvState; - -typedef enum -{ - STATE_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_TX_START, /*!< Starting transmission (':' sent). */ - STATE_TX_DATA, /*!< Sending of data (Address, Data, LRC). */ - STATE_TX_END, /*!< End of transmission. */ - STATE_TX_NOTIFY /*!< Notify sender that the frame has been sent. */ -} eMBSndState; - -typedef enum -{ - BYTE_HIGH_NIBBLE, /*!< Character for high nibble of byte. */ - BYTE_LOW_NIBBLE /*!< Character for low nibble of byte. */ -} eMBBytePos; - -/* ----------------------- Static functions ---------------------------------*/ -static UCHAR prvucMBCHAR2BIN( UCHAR ucCharacter ); - -static UCHAR prvucMBBIN2CHAR( UCHAR ucByte ); - -static UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen ); - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBSndState eSndState; -static volatile eMBRcvState eRcvState; - -/* We reuse the Modbus RTU buffer because only one buffer is needed and the - * RTU buffer is bigger. */ -extern volatile UCHAR ucRTUBuf[]; -static volatile UCHAR *ucASCIIBuf = ucRTUBuf; - -static volatile USHORT usRcvBufferPos; -static volatile eMBBytePos eBytePos; - -static volatile UCHAR *pucSndBufferCur; -static volatile USHORT usSndBufferCount; - -static volatile UCHAR ucLRC; -static volatile UCHAR ucMBLFCharacter; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ( void )ucSlaveAddress; - - ENTER_CRITICAL_SECTION( ); - ucMBLFCharacter = MB_ASCII_DEFAULT_LF; - - if( xMBPortSerialInit( ucPort, ulBaudRate, 7, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else if( xMBPortTimersInit( MB_ASCII_TIMEOUT_SEC * 20000UL ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBASCIIStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( TRUE, FALSE ); - eRcvState = STATE_RX_IDLE; - EXIT_CRITICAL_SECTION( ); - - /* No special startup required for ASCII. */ - ( void )xMBPortEventPost( EV_READY ); -} - -void -eMBASCIIStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( FALSE, FALSE ); - vMBPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - ENTER_CRITICAL_SECTION( ); - assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ); - - /* Length and CRC check */ - if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) - && ( prvucMBLRC( ( UCHAR * ) ucASCIIBuf, usRcvBufferPos ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = ucASCIIBuf[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF]; - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBASCIISend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR usLRC; - - ENTER_CRITICAL_SECTION( ); - /* Check if the receiver is still in idle state. If not we where too - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_RX_IDLE ) - { - /* First byte before the Modbus-PDU is the slave address. */ - pucSndBufferCur = ( UCHAR * ) pucFrame - 1; - usSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usSndBufferCount += usLength; - - /* Calculate LRC checksum for Modbus-Serial-Line-PDU. */ - usLRC = prvucMBLRC( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucASCIIBuf[usSndBufferCount++] = usLRC; - - /* Activate the transmitter. */ - eSndState = STATE_TX_START; - vMBPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -BOOL -xMBASCIIReceiveFSM( void ) -{ - BOOL xNeedPoll = FALSE; - UCHAR ucByte; - UCHAR ucResult; - - assert( eSndState == STATE_TX_IDLE ); - - ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte ); - switch ( eRcvState ) - { - /* A new character is received. If the character is a ':' the input - * buffer is cleared. A CR-character signals the end of the data - * block. Other characters are part of the data block and their - * ASCII value is converted back to a binary representation. - */ - case STATE_RX_RCV: - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - if( ucByte == ':' ) - { - /* Empty receive buffer. */ - eBytePos = BYTE_HIGH_NIBBLE; - usRcvBufferPos = 0; - } - else if( ucByte == MB_ASCII_DEFAULT_CR ) - { - eRcvState = STATE_RX_WAIT_EOF; - } - else - { - ucResult = prvucMBCHAR2BIN( ucByte ); - switch ( eBytePos ) - { - /* High nibble of the byte comes first. We check for - * a buffer overflow here. */ - case BYTE_HIGH_NIBBLE: - if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - ucASCIIBuf[usRcvBufferPos] = ( UCHAR )( ucResult << 4 ); - eBytePos = BYTE_LOW_NIBBLE; - break; - } - else - { - /* not handled in Modbus specification but seems - * a resonable implementation. */ - eRcvState = STATE_RX_IDLE; - /* Disable previously activated timer because of error state. */ - vMBPortTimersDisable( ); - } - break; - - case BYTE_LOW_NIBBLE: - ucASCIIBuf[usRcvBufferPos] |= ucResult; - usRcvBufferPos++; - eBytePos = BYTE_HIGH_NIBBLE; - break; - } - } - break; - - case STATE_RX_WAIT_EOF: - if( ucByte == ucMBLFCharacter ) - { - /* Disable character timeout timer because all characters are - * received. */ - vMBPortTimersDisable( ); - /* Receiver is again in idle state. */ - eRcvState = STATE_RX_IDLE; - - /* Notify the caller of eMBASCIIReceive that a new frame - * was received. */ - xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); - } - else if( ucByte == ':' ) - { - /* Empty receive buffer and back to receive state. */ - eBytePos = BYTE_HIGH_NIBBLE; - usRcvBufferPos = 0; - eRcvState = STATE_RX_RCV; - - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - } - else - { - /* Frame is not okay. Delete entire frame. */ - eRcvState = STATE_RX_IDLE; - } - break; - - case STATE_RX_IDLE: - if( ucByte == ':' ) - { - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - /* Reset the input buffers to store the frame. */ - usRcvBufferPos = 0;; - eBytePos = BYTE_HIGH_NIBBLE; - eRcvState = STATE_RX_RCV; - } - break; - } - - return xNeedPoll; -} - -BOOL -xMBASCIITransmitFSM( void ) -{ - BOOL xNeedPoll = FALSE; - UCHAR ucByte; - - assert( eRcvState == STATE_RX_IDLE ); - switch ( eSndState ) - { - /* Start of transmission. The start of a frame is defined by sending - * the character ':'. */ - case STATE_TX_START: - ucByte = ':'; - xMBPortSerialPutByte( ( CHAR )ucByte ); - eSndState = STATE_TX_DATA; - eBytePos = BYTE_HIGH_NIBBLE; - break; - - /* Send the data block. Each data byte is encoded as a character hex - * stream with the high nibble sent first and the low nibble sent - * last. If all data bytes are exhausted we send a '\r' character - * to end the transmission. */ - case STATE_TX_DATA: - if( usSndBufferCount > 0 ) - { - switch ( eBytePos ) - { - case BYTE_HIGH_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur >> 4 ) ); - xMBPortSerialPutByte( ( CHAR ) ucByte ); - eBytePos = BYTE_LOW_NIBBLE; - break; - - case BYTE_LOW_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur & 0x0F ) ); - xMBPortSerialPutByte( ( CHAR )ucByte ); - pucSndBufferCur++; - eBytePos = BYTE_HIGH_NIBBLE; - usSndBufferCount--; - break; - } - } - else - { - xMBPortSerialPutByte( MB_ASCII_DEFAULT_CR ); - eSndState = STATE_TX_END; - } - break; - - /* Finish the frame by sending a LF character. */ - case STATE_TX_END: - xMBPortSerialPutByte( ( CHAR )ucMBLFCharacter ); - /* We need another state to make sure that the CR character has - * been sent. */ - eSndState = STATE_TX_NOTIFY; - break; - - /* Notify the task which called eMBASCIISend that the frame has - * been sent. */ - case STATE_TX_NOTIFY: - eSndState = STATE_TX_IDLE; - xNeedPoll = xMBPortEventPost( EV_FRAME_SENT ); - - /* Disable transmitter. This prevents another transmit buffer - * empty interrupt. */ - vMBPortSerialEnable( TRUE, FALSE ); - eSndState = STATE_TX_IDLE; - break; - - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_TX_IDLE: - /* enable receiver/disable transmitter. */ - vMBPortSerialEnable( TRUE, FALSE ); - break; - } - - return xNeedPoll; -} - -BOOL -xMBASCIITimerT1SExpired( void ) -{ - switch ( eRcvState ) - { - /* If we have a timeout we go back to the idle state and wait for - * the next frame. - */ - case STATE_RX_RCV: - case STATE_RX_WAIT_EOF: - eRcvState = STATE_RX_IDLE; - break; - - default: - assert( ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_WAIT_EOF ) ); - break; - } - vMBPortTimersDisable( ); - - /* no context switch required. */ - return FALSE; -} - - -static UCHAR -prvucMBCHAR2BIN( UCHAR ucCharacter ) -{ - if( ( ucCharacter >= '0' ) && ( ucCharacter <= '9' ) ) - { - return ( UCHAR )( ucCharacter - '0' ); - } - else if( ( ucCharacter >= 'A' ) && ( ucCharacter <= 'F' ) ) - { - return ( UCHAR )( ucCharacter - 'A' + 0x0A ); - } - else - { - return 0xFF; - } -} - -static UCHAR -prvucMBBIN2CHAR( UCHAR ucByte ) -{ - if( ucByte <= 0x09 ) - { - return ( UCHAR )( '0' + ucByte ); - } - else if( ( ucByte >= 0x0A ) && ( ucByte <= 0x0F ) ) - { - return ( UCHAR )( ucByte - 0x0A + 'A' ); - } - else - { - /* Programming error. */ - assert( 0 ); - } - return '0'; -} - - -static UCHAR -prvucMBLRC( UCHAR * pucFrame, USHORT usLen ) -{ - UCHAR ucLRC = 0; /* LRC char initialized */ - - while( usLen-- ) - { - ucLRC += *pucFrame++; /* Add buffer byte without carry */ - } - - /* Return twos complement */ - ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) ); - return ucLRC; -} - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbascii.c,v 1.17 2010/06/06 13:47:07 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbconfig.h" +#include "mbascii.h" +#include "mbframe.h" + +#include "mbcrc.h" +#include "mbport.h" + +#if MB_ASCII_ENABLED > 0 + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_ASCII_DEFAULT_CR '\r' /*!< Default CR character for Modbus ASCII. */ +#define MB_ASCII_DEFAULT_LF '\n' /*!< Default LF character for Modbus ASCII. */ +#define MB_SER_PDU_SIZE_MIN 3 /*!< Minimum size of a Modbus ASCII frame. */ +#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus ASCII frame. */ +#define MB_SER_PDU_SIZE_LRC 1 /*!< Size of LRC field in PDU. */ +#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ +#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ + +/* ----------------------- Type definitions ---------------------------------*/ +typedef enum +{ + STATE_RX_IDLE, /*!< Receiver is in idle state. */ + STATE_RX_RCV, /*!< Frame is beeing received. */ + STATE_RX_WAIT_EOF /*!< Wait for End of Frame. */ +} eMBRcvState; + +typedef enum +{ + STATE_TX_IDLE, /*!< Transmitter is in idle state. */ + STATE_TX_START, /*!< Starting transmission (':' sent). */ + STATE_TX_DATA, /*!< Sending of data (Address, Data, LRC). */ + STATE_TX_END, /*!< End of transmission. */ + STATE_TX_NOTIFY /*!< Notify sender that the frame has been sent. */ +} eMBSndState; + +typedef enum +{ + BYTE_HIGH_NIBBLE, /*!< Character for high nibble of byte. */ + BYTE_LOW_NIBBLE /*!< Character for low nibble of byte. */ +} eMBBytePos; + +/* ----------------------- Static functions ---------------------------------*/ +static UCHAR prvucMBCHAR2BIN( UCHAR ucCharacter ); + +static UCHAR prvucMBBIN2CHAR( UCHAR ucByte ); + +static UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen ); + +/* ----------------------- Static variables ---------------------------------*/ +static volatile eMBSndState eSndState; +static volatile eMBRcvState eRcvState; + +/* We reuse the Modbus RTU buffer because only one buffer is needed and the + * RTU buffer is bigger. */ +extern volatile UCHAR ucRTUBuf[]; +static volatile UCHAR *ucASCIIBuf = ucRTUBuf; + +static volatile USHORT usRcvBufferPos; +static volatile eMBBytePos eBytePos; + +static volatile UCHAR *pucSndBufferCur; +static volatile USHORT usSndBufferCount; + +static volatile UCHAR ucLRC; +static volatile UCHAR ucMBLFCharacter; + +/* ----------------------- Start implementation -----------------------------*/ +eMBErrorCode +eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) +{ + eMBErrorCode eStatus = MB_ENOERR; + ( void )ucSlaveAddress; + + ENTER_CRITICAL_SECTION( ); + ucMBLFCharacter = MB_ASCII_DEFAULT_LF; + + if( xMBPortSerialInit( ucPort, ulBaudRate, 7, eParity ) != TRUE ) + { + eStatus = MB_EPORTERR; + } + else if( xMBPortTimersInit( MB_ASCII_TIMEOUT_SEC * 20000UL ) != TRUE ) + { + eStatus = MB_EPORTERR; + } + + EXIT_CRITICAL_SECTION( ); + + return eStatus; +} + +void +eMBASCIIStart( void ) +{ + ENTER_CRITICAL_SECTION( ); + vMBPortSerialEnable( TRUE, FALSE ); + eRcvState = STATE_RX_IDLE; + EXIT_CRITICAL_SECTION( ); + + /* No special startup required for ASCII. */ + ( void )xMBPortEventPost( EV_READY ); +} + +void +eMBASCIIStop( void ) +{ + ENTER_CRITICAL_SECTION( ); + vMBPortSerialEnable( FALSE, FALSE ); + vMBPortTimersDisable( ); + EXIT_CRITICAL_SECTION( ); +} + +eMBErrorCode +eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + ENTER_CRITICAL_SECTION( ); + assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ); + + /* Length and CRC check */ + if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) + && ( prvucMBLRC( ( UCHAR * ) ucASCIIBuf, usRcvBufferPos ) == 0 ) ) + { + /* Save the address field. All frames are passed to the upper layed + * and the decision if a frame is used is done there. + */ + *pucRcvAddress = ucASCIIBuf[MB_SER_PDU_ADDR_OFF]; + + /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus + * size of address field and CRC checksum. + */ + *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC ); + + /* Return the start of the Modbus PDU to the caller. */ + *pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF]; + } + else + { + eStatus = MB_EIO; + } + EXIT_CRITICAL_SECTION( ); + return eStatus; +} + +eMBErrorCode +eMBASCIISend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) +{ + eMBErrorCode eStatus = MB_ENOERR; + UCHAR usLRC; + + ENTER_CRITICAL_SECTION( ); + /* Check if the receiver is still in idle state. If not we where too + * slow with processing the received frame and the master sent another + * frame on the network. We have to abort sending the frame. + */ + if( eRcvState == STATE_RX_IDLE ) + { + /* First byte before the Modbus-PDU is the slave address. */ + pucSndBufferCur = ( UCHAR * ) pucFrame - 1; + usSndBufferCount = 1; + + /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ + pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; + usSndBufferCount += usLength; + + /* Calculate LRC checksum for Modbus-Serial-Line-PDU. */ + usLRC = prvucMBLRC( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); + ucASCIIBuf[usSndBufferCount++] = usLRC; + + /* Activate the transmitter. */ + eSndState = STATE_TX_START; + vMBPortSerialEnable( FALSE, TRUE ); + } + else + { + eStatus = MB_EIO; + } + EXIT_CRITICAL_SECTION( ); + return eStatus; +} + +BOOL +xMBASCIIReceiveFSM( void ) +{ + BOOL xNeedPoll = FALSE; + UCHAR ucByte; + UCHAR ucResult; + + assert( eSndState == STATE_TX_IDLE ); + + ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte ); + switch ( eRcvState ) + { + /* A new character is received. If the character is a ':' the input + * buffer is cleared. A CR-character signals the end of the data + * block. Other characters are part of the data block and their + * ASCII value is converted back to a binary representation. + */ + case STATE_RX_RCV: + /* Enable timer for character timeout. */ + vMBPortTimersEnable( ); + if( ucByte == ':' ) + { + /* Empty receive buffer. */ + eBytePos = BYTE_HIGH_NIBBLE; + usRcvBufferPos = 0; + } + else if( ucByte == MB_ASCII_DEFAULT_CR ) + { + eRcvState = STATE_RX_WAIT_EOF; + } + else + { + ucResult = prvucMBCHAR2BIN( ucByte ); + switch ( eBytePos ) + { + /* High nibble of the byte comes first. We check for + * a buffer overflow here. */ + case BYTE_HIGH_NIBBLE: + if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) + { + ucASCIIBuf[usRcvBufferPos] = ( UCHAR )( ucResult << 4 ); + eBytePos = BYTE_LOW_NIBBLE; + break; + } + else + { + /* not handled in Modbus specification but seems + * a resonable implementation. */ + eRcvState = STATE_RX_IDLE; + /* Disable previously activated timer because of error state. */ + vMBPortTimersDisable( ); + } + break; + + case BYTE_LOW_NIBBLE: + ucASCIIBuf[usRcvBufferPos] |= ucResult; + usRcvBufferPos++; + eBytePos = BYTE_HIGH_NIBBLE; + break; + } + } + break; + + case STATE_RX_WAIT_EOF: + if( ucByte == ucMBLFCharacter ) + { + /* Disable character timeout timer because all characters are + * received. */ + vMBPortTimersDisable( ); + /* Receiver is again in idle state. */ + eRcvState = STATE_RX_IDLE; + + /* Notify the caller of eMBASCIIReceive that a new frame + * was received. */ + xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); + } + else if( ucByte == ':' ) + { + /* Empty receive buffer and back to receive state. */ + eBytePos = BYTE_HIGH_NIBBLE; + usRcvBufferPos = 0; + eRcvState = STATE_RX_RCV; + + /* Enable timer for character timeout. */ + vMBPortTimersEnable( ); + } + else + { + /* Frame is not okay. Delete entire frame. */ + eRcvState = STATE_RX_IDLE; + } + break; + + case STATE_RX_IDLE: + if( ucByte == ':' ) + { + /* Enable timer for character timeout. */ + vMBPortTimersEnable( ); + /* Reset the input buffers to store the frame. */ + usRcvBufferPos = 0;; + eBytePos = BYTE_HIGH_NIBBLE; + eRcvState = STATE_RX_RCV; + } + break; + } + + return xNeedPoll; +} + +BOOL +xMBASCIITransmitFSM( void ) +{ + BOOL xNeedPoll = FALSE; + UCHAR ucByte; + + assert( eRcvState == STATE_RX_IDLE ); + switch ( eSndState ) + { + /* Start of transmission. The start of a frame is defined by sending + * the character ':'. */ + case STATE_TX_START: + ucByte = ':'; + xMBPortSerialPutByte( ( CHAR )ucByte ); + eSndState = STATE_TX_DATA; + eBytePos = BYTE_HIGH_NIBBLE; + break; + + /* Send the data block. Each data byte is encoded as a character hex + * stream with the high nibble sent first and the low nibble sent + * last. If all data bytes are exhausted we send a '\r' character + * to end the transmission. */ + case STATE_TX_DATA: + if( usSndBufferCount > 0 ) + { + switch ( eBytePos ) + { + case BYTE_HIGH_NIBBLE: + ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur >> 4 ) ); + xMBPortSerialPutByte( ( CHAR ) ucByte ); + eBytePos = BYTE_LOW_NIBBLE; + break; + + case BYTE_LOW_NIBBLE: + ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur & 0x0F ) ); + xMBPortSerialPutByte( ( CHAR )ucByte ); + pucSndBufferCur++; + eBytePos = BYTE_HIGH_NIBBLE; + usSndBufferCount--; + break; + } + } + else + { + xMBPortSerialPutByte( MB_ASCII_DEFAULT_CR ); + eSndState = STATE_TX_END; + } + break; + + /* Finish the frame by sending a LF character. */ + case STATE_TX_END: + xMBPortSerialPutByte( ( CHAR )ucMBLFCharacter ); + /* We need another state to make sure that the CR character has + * been sent. */ + eSndState = STATE_TX_NOTIFY; + break; + + /* Notify the task which called eMBASCIISend that the frame has + * been sent. */ + case STATE_TX_NOTIFY: + eSndState = STATE_TX_IDLE; + xNeedPoll = xMBPortEventPost( EV_FRAME_SENT ); + + /* Disable transmitter. This prevents another transmit buffer + * empty interrupt. */ + vMBPortSerialEnable( TRUE, FALSE ); + eSndState = STATE_TX_IDLE; + break; + + /* We should not get a transmitter event if the transmitter is in + * idle state. */ + case STATE_TX_IDLE: + /* enable receiver/disable transmitter. */ + vMBPortSerialEnable( TRUE, FALSE ); + break; + } + + return xNeedPoll; +} + +BOOL +xMBASCIITimerT1SExpired( void ) +{ + switch ( eRcvState ) + { + /* If we have a timeout we go back to the idle state and wait for + * the next frame. + */ + case STATE_RX_RCV: + case STATE_RX_WAIT_EOF: + eRcvState = STATE_RX_IDLE; + break; + + default: + assert( ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_WAIT_EOF ) ); + break; + } + vMBPortTimersDisable( ); + + /* no context switch required. */ + return FALSE; +} + + +static UCHAR +prvucMBCHAR2BIN( UCHAR ucCharacter ) +{ + if( ( ucCharacter >= '0' ) && ( ucCharacter <= '9' ) ) + { + return ( UCHAR )( ucCharacter - '0' ); + } + else if( ( ucCharacter >= 'A' ) && ( ucCharacter <= 'F' ) ) + { + return ( UCHAR )( ucCharacter - 'A' + 0x0A ); + } + else + { + return 0xFF; + } +} + +static UCHAR +prvucMBBIN2CHAR( UCHAR ucByte ) +{ + if( ucByte <= 0x09 ) + { + return ( UCHAR )( '0' + ucByte ); + } + else if( ( ucByte >= 0x0A ) && ( ucByte <= 0x0F ) ) + { + return ( UCHAR )( ucByte - 0x0A + 'A' ); + } + else + { + /* Programming error. */ + assert( 0 ); + } + return '0'; +} + + +static UCHAR +prvucMBLRC( UCHAR * pucFrame, USHORT usLen ) +{ + UCHAR ucLRC = 0; /* LRC char initialized */ + + while( usLen-- ) + { + ucLRC += *pucFrame++; /* Add buffer byte without carry */ + } + + /* Return twos complement */ + ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) ); + return ucLRC; +} + +#endif diff --git a/modbus/modbus/ascii/mbascii.h b/modbus/modbus/ascii/mbascii.h index d2500f7..47846dd 100644 --- a/modbus/modbus/ascii/mbascii.h +++ b/modbus/modbus/ascii/mbascii.h @@ -1,56 +1,56 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.h,v 1.8 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_ASCII_H -#define _MB_ASCII_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -#if MB_ASCII_ENABLED > 0 -eMBErrorCode eMBASCIIInit( UCHAR slaveAddress, UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); -void eMBASCIIStart( void ); -void eMBASCIIStop( void ); - -eMBErrorCode eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBASCIISend( UCHAR slaveAddress, const UCHAR * pucFrame, - USHORT usLength ); -BOOL xMBASCIIReceiveFSM( void ); -BOOL xMBASCIITransmitFSM( void ); -BOOL xMBASCIITimerT1SExpired( void ); -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbascii.h,v 1.8 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_ASCII_H +#define _MB_ASCII_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + +#if MB_ASCII_ENABLED > 0 +eMBErrorCode eMBASCIIInit( UCHAR slaveAddress, UCHAR ucPort, + ULONG ulBaudRate, eMBParity eParity ); +void eMBASCIIStart( void ); +void eMBASCIIStop( void ); + +eMBErrorCode eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, + USHORT * pusLength ); +eMBErrorCode eMBASCIISend( UCHAR slaveAddress, const UCHAR * pucFrame, + USHORT usLength ); +BOOL xMBASCIIReceiveFSM( void ); +BOOL xMBASCIITransmitFSM( void ); +BOOL xMBASCIITimerT1SExpired( void ); +#endif + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/functions/mbfunccoils.c b/modbus/modbus/functions/mbfunccoils.c index 45ea860..1988c45 100644 --- a/modbus/modbus/functions/mbfunccoils.c +++ b/modbus/modbus/functions/mbfunccoils.c @@ -1,270 +1,270 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunccoils.c,v 1.8 2007/02/18 23:47:16 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_COILCNT_MAX ( 0x07D0 ) - -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ( 0x07B0 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ - -#if MB_FUNC_READ_COILS_ENABLED > 0 - -eMBException -eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usCoilCount; - UCHAR ucNBytes; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] << 8 ); - usCoilCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usCoilCount >= 1 ) && - ( usCoilCount < MB_PDU_FUNC_READ_COILCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_COILS; - *usLen += 1; - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usCoilCount & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR )( usCoilCount / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR )( usCoilCount / 8 ); - } - *pucFrameCur++ = ucNBytes; - *usLen += 1; - - eRegStatus = - eMBRegCoilsCB( pucFrameCur, usRegAddress, usCoilCount, - MB_REG_READ ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen += ucNBytes; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 -eMBException -eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - UCHAR ucBuf[2]; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - if( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF + 1] == 0x00 ) && - ( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) || - ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0x00 ) ) ) - { - ucBuf[1] = 0; - if( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) - { - ucBuf[0] = 1; - } - else - { - ucBuf[0] = 0; - } - eRegStatus = - eMBRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -eMBException -eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usCoilCnt; - UCHAR ucByteCount; - UCHAR ucByteCountVerify; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen > ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); - usCoilCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); - - ucByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; - - /* Compute the number of expected bytes in the request. */ - if( ( usCoilCnt & 0x0007 ) != 0 ) - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 + 1 ); - } - else - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 ); - } - - if( ( usCoilCnt >= 1 ) && - ( usCoilCnt <= MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ) && - ( ucByteCountVerify == ucByteCount ) ) - { - eRegStatus = - eMBRegCoilsCB( &pucFrame[MB_PDU_FUNC_WRITE_MUL_VALUES_OFF], - usRegAddress, usCoilCnt, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen = MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbfunccoils.c,v 1.8 2007/02/18 23:47:16 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbframe.h" +#include "mbproto.h" +#include "mbconfig.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READ_SIZE ( 4 ) +#define MB_PDU_FUNC_READ_COILCNT_MAX ( 0x07D0 ) + +#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) + +#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) +#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) +#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) +#define MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ( 0x07B0 ) + +/* ----------------------- Static functions ---------------------------------*/ +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); + +/* ----------------------- Start implementation -----------------------------*/ + +#if MB_FUNC_READ_COILS_ENABLED > 0 + +eMBException +eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + USHORT usCoilCount; + UCHAR ucNBytes; + UCHAR *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress++; + + usCoilCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] << 8 ); + usCoilCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF + 1] ); + + /* Check if the number of registers to read is valid. If not + * return Modbus illegal data value exception. + */ + if( ( usCoilCount >= 1 ) && + ( usCoilCount < MB_PDU_FUNC_READ_COILCNT_MAX ) ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READ_COILS; + *usLen += 1; + + /* Test if the quantity of coils is a multiple of 8. If not last + * byte is only partially field with unused coils set to zero. */ + if( ( usCoilCount & 0x0007 ) != 0 ) + { + ucNBytes = ( UCHAR )( usCoilCount / 8 + 1 ); + } + else + { + ucNBytes = ( UCHAR )( usCoilCount / 8 ); + } + *pucFrameCur++ = ucNBytes; + *usLen += 1; + + eRegStatus = + eMBRegCoilsCB( pucFrameCur, usRegAddress, usCoilCount, + MB_REG_READ ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + /* The response contains the function code, the starting address + * and the quantity of registers. We reuse the old values in the + * buffer because they are still valid. */ + *usLen += ucNBytes; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid read coil register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + +#if MB_FUNC_WRITE_COIL_ENABLED > 0 +eMBException +eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + UCHAR ucBuf[2]; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); + usRegAddress++; + + if( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF + 1] == 0x00 ) && + ( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) || + ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0x00 ) ) ) + { + ucBuf[1] = 0; + if( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) + { + ucBuf[0] = 1; + } + else + { + ucBuf[0] = 0; + } + eRegStatus = + eMBRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid write coil register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + +#endif + +#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 +eMBException +eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + USHORT usCoilCnt; + UCHAR ucByteCount; + UCHAR ucByteCountVerify; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen > ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); + usRegAddress++; + + usCoilCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); + usCoilCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); + + ucByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; + + /* Compute the number of expected bytes in the request. */ + if( ( usCoilCnt & 0x0007 ) != 0 ) + { + ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 + 1 ); + } + else + { + ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 ); + } + + if( ( usCoilCnt >= 1 ) && + ( usCoilCnt <= MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ) && + ( ucByteCountVerify == ucByteCount ) ) + { + eRegStatus = + eMBRegCoilsCB( &pucFrame[MB_PDU_FUNC_WRITE_MUL_VALUES_OFF], + usRegAddress, usCoilCnt, MB_REG_WRITE ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + /* The response contains the function code, the starting address + * and the quantity of registers. We reuse the old values in the + * buffer because they are still valid. */ + *usLen = MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid write coil register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + +#endif + +#endif diff --git a/modbus/modbus/functions/mbfuncdiag.c b/modbus/modbus/functions/mbfuncdiag.c index d961f8e..d75ffc0 100644 --- a/modbus/modbus/functions/mbfuncdiag.c +++ b/modbus/modbus/functions/mbfuncdiag.c @@ -1,29 +1,29 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncdiag.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbfuncdiag.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ + */ diff --git a/modbus/modbus/functions/mbfuncdisc.c b/modbus/modbus/functions/mbfuncdisc.c index cac8896..a1baa2b 100644 --- a/modbus/modbus/functions/mbfuncdisc.c +++ b/modbus/modbus/functions/mbfuncdisc.c @@ -1,125 +1,125 @@ - /* - * FreeRTOS Modbus Libary: A Modbus serial implementation for FreeRTOS - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_DISCCNT_MAX ( 0x07D0 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ - -#if MB_FUNC_READ_COILS_ENABLED > 0 - -eMBException -eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usDiscreteCnt; - UCHAR ucNBytes; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usDiscreteCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF] << 8 ); - usDiscreteCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usDiscreteCnt >= 1 ) && - ( usDiscreteCnt < MB_PDU_FUNC_READ_DISCCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_DISCRETE_INPUTS; - *usLen += 1; - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usDiscreteCnt & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 ); - } - *pucFrameCur++ = ucNBytes; - *usLen += 1; - - eRegStatus = - eMBRegDiscreteCB( pucFrameCur, usRegAddress, usDiscreteCnt ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen += ucNBytes; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif + /* + * FreeRTOS Modbus Libary: A Modbus serial implementation for FreeRTOS + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbframe.h" +#include "mbproto.h" +#include "mbconfig.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READ_SIZE ( 4 ) +#define MB_PDU_FUNC_READ_DISCCNT_MAX ( 0x07D0 ) + +/* ----------------------- Static functions ---------------------------------*/ +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); + +/* ----------------------- Start implementation -----------------------------*/ + +#if MB_FUNC_READ_COILS_ENABLED > 0 + +eMBException +eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + USHORT usDiscreteCnt; + UCHAR ucNBytes; + UCHAR *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress++; + + usDiscreteCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF] << 8 ); + usDiscreteCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF + 1] ); + + /* Check if the number of registers to read is valid. If not + * return Modbus illegal data value exception. + */ + if( ( usDiscreteCnt >= 1 ) && + ( usDiscreteCnt < MB_PDU_FUNC_READ_DISCCNT_MAX ) ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READ_DISCRETE_INPUTS; + *usLen += 1; + + /* Test if the quantity of coils is a multiple of 8. If not last + * byte is only partially field with unused coils set to zero. */ + if( ( usDiscreteCnt & 0x0007 ) != 0 ) + { + ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 + 1 ); + } + else + { + ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 ); + } + *pucFrameCur++ = ucNBytes; + *usLen += 1; + + eRegStatus = + eMBRegDiscreteCB( pucFrameCur, usRegAddress, usDiscreteCnt ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + /* The response contains the function code, the starting address + * and the quantity of registers. We reuse the old values in the + * buffer because they are still valid. */ + *usLen += ucNBytes; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid read coil register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + +#endif diff --git a/modbus/modbus/functions/mbfuncholding.c b/modbus/modbus/functions/mbfuncholding.c index 8a12398..e74a062 100644 --- a/modbus/modbus/functions/mbfuncholding.c +++ b/modbus/modbus/functions/mbfuncholding.c @@ -1,308 +1,308 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncholding.c,v 1.12 2007/02/18 23:48:22 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) - -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ( 0x0078 ) - -#define MB_PDU_FUNC_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 ) -#define MB_PDU_FUNC_READWRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 ) -#define MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 ) -#define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 9 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ - -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - -eMBException -eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - /* Make callback to update the value. */ - eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], - usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 -eMBException -eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR ucRegByteCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen >= ( MB_PDU_FUNC_WRITE_MUL_SIZE_MIN + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF + 1] ); - - ucRegByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; - - if( ( usRegCount >= 1 ) && - ( usRegCount <= MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ) && - ( ucRegByteCount == ( UCHAR ) ( 2 * usRegCount ) ) ) - { - /* Make callback to update the register values. */ - eRegStatus = - eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_MUL_VALUES_OFF], - usRegAddress, usRegCount, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting - * address and the quantity of registers. We reuse the - * old values in the buffer because they are still valid. - */ - *usLen = MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - -eMBException -eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) && ( usRegCount <= MB_PDU_FUNC_READ_REGCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_HOLDING_REGISTER; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR ) ( usRegCount * 2 ); - *usLen += 1; - - /* Make callback to fill the buffer. */ - eRegStatus = eMBRegHoldingCB( pucFrameCur, usRegAddress, usRegCount, MB_REG_READ ); - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - *usLen += usRegCount * 2; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - -eMBException -eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegReadAddress; - USHORT usRegReadCount; - USHORT usRegWriteAddress; - USHORT usRegWriteCount; - UCHAR ucRegWriteByteCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen >= ( MB_PDU_FUNC_READWRITE_SIZE_MIN + MB_PDU_SIZE_MIN ) ) - { - usRegReadAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF] << 8U ); - usRegReadAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF + 1] ); - usRegReadAddress++; - - usRegReadCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF] << 8U ); - usRegReadCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF + 1] ); - - usRegWriteAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF] << 8U ); - usRegWriteAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF + 1] ); - usRegWriteAddress++; - - usRegWriteCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF] << 8U ); - usRegWriteCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF + 1] ); - - ucRegWriteByteCount = pucFrame[MB_PDU_FUNC_READWRITE_BYTECNT_OFF]; - - if( ( usRegReadCount >= 1 ) && ( usRegReadCount <= 0x7D ) && - ( usRegWriteCount >= 1 ) && ( usRegWriteCount <= 0x79 ) && - ( ( 2 * usRegWriteCount ) == ucRegWriteByteCount ) ) - { - /* Make callback to update the register values. */ - eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF], - usRegWriteAddress, usRegWriteCount, MB_REG_WRITE ); - - if( eRegStatus == MB_ENOERR ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READWRITE_MULTIPLE_REGISTERS; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR ) ( usRegReadCount * 2 ); - *usLen += 1; - - /* Make the read callback. */ - eRegStatus = - eMBRegHoldingCB( pucFrameCur, usRegReadAddress, usRegReadCount, MB_REG_READ ); - if( eRegStatus == MB_ENOERR ) - { - *usLen += 2 * usRegReadCount; - } - } - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - return eStatus; -} - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbfuncholding.c,v 1.12 2007/02/18 23:48:22 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbframe.h" +#include "mbproto.h" +#include "mbconfig.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0) +#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READ_SIZE ( 4 ) +#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) + +#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) +#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) + +#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) +#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) +#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) +#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) +#define MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ( 0x0078 ) + +#define MB_PDU_FUNC_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) +#define MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 ) +#define MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 ) +#define MB_PDU_FUNC_READWRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 ) +#define MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 ) +#define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 9 ) + +/* ----------------------- Static functions ---------------------------------*/ +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); + +/* ----------------------- Start implementation -----------------------------*/ + +#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 + +eMBException +eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); + usRegAddress++; + + /* Make callback to update the value. */ + eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], + usRegAddress, 1, MB_REG_WRITE ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + } + else + { + /* Can't be a valid request because the length is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} +#endif + +#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 +eMBException +eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + USHORT usRegCount; + UCHAR ucRegByteCount; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen >= ( MB_PDU_FUNC_WRITE_MUL_SIZE_MIN + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); + usRegAddress++; + + usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF] << 8 ); + usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF + 1] ); + + ucRegByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; + + if( ( usRegCount >= 1 ) && + ( usRegCount <= MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ) && + ( ucRegByteCount == ( UCHAR ) ( 2 * usRegCount ) ) ) + { + /* Make callback to update the register values. */ + eRegStatus = + eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_MUL_VALUES_OFF], + usRegAddress, usRegCount, MB_REG_WRITE ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + /* The response contains the function code, the starting + * address and the quantity of registers. We reuse the + * old values in the buffer because they are still valid. + */ + *usLen = MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid request because the length is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} +#endif + +#if MB_FUNC_READ_HOLDING_ENABLED > 0 + +eMBException +eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + USHORT usRegCount; + UCHAR *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress++; + + usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); + usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); + + /* Check if the number of registers to read is valid. If not + * return Modbus illegal data value exception. + */ + if( ( usRegCount >= 1 ) && ( usRegCount <= MB_PDU_FUNC_READ_REGCNT_MAX ) ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READ_HOLDING_REGISTER; + *usLen += 1; + + /* Second byte in the response contain the number of bytes. */ + *pucFrameCur++ = ( UCHAR ) ( usRegCount * 2 ); + *usLen += 1; + + /* Make callback to fill the buffer. */ + eRegStatus = eMBRegHoldingCB( pucFrameCur, usRegAddress, usRegCount, MB_REG_READ ); + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + *usLen += usRegCount * 2; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid request because the length is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + +#endif + +#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 + +eMBException +eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegReadAddress; + USHORT usRegReadCount; + USHORT usRegWriteAddress; + USHORT usRegWriteCount; + UCHAR ucRegWriteByteCount; + UCHAR *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen >= ( MB_PDU_FUNC_READWRITE_SIZE_MIN + MB_PDU_SIZE_MIN ) ) + { + usRegReadAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF] << 8U ); + usRegReadAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF + 1] ); + usRegReadAddress++; + + usRegReadCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF] << 8U ); + usRegReadCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF + 1] ); + + usRegWriteAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF] << 8U ); + usRegWriteAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF + 1] ); + usRegWriteAddress++; + + usRegWriteCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF] << 8U ); + usRegWriteCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF + 1] ); + + ucRegWriteByteCount = pucFrame[MB_PDU_FUNC_READWRITE_BYTECNT_OFF]; + + if( ( usRegReadCount >= 1 ) && ( usRegReadCount <= 0x7D ) && + ( usRegWriteCount >= 1 ) && ( usRegWriteCount <= 0x79 ) && + ( ( 2 * usRegWriteCount ) == ucRegWriteByteCount ) ) + { + /* Make callback to update the register values. */ + eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF], + usRegWriteAddress, usRegWriteCount, MB_REG_WRITE ); + + if( eRegStatus == MB_ENOERR ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READWRITE_MULTIPLE_REGISTERS; + *usLen += 1; + + /* Second byte in the response contain the number of bytes. */ + *pucFrameCur++ = ( UCHAR ) ( usRegReadCount * 2 ); + *usLen += 1; + + /* Make the read callback. */ + eRegStatus = + eMBRegHoldingCB( pucFrameCur, usRegReadAddress, usRegReadCount, MB_REG_READ ); + if( eRegStatus == MB_ENOERR ) + { + *usLen += 2 * usRegReadCount; + } + } + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + return eStatus; +} + +#endif diff --git a/modbus/modbus/functions/mbfuncinput.c b/modbus/modbus/functions/mbfuncinput.c index 3766a3f..cceedba 100644 --- a/modbus/modbus/functions/mbfuncinput.c +++ b/modbus/modbus/functions/mbfuncinput.c @@ -1,122 +1,122 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncinput.c,v 1.10 2007/09/12 10:15:56 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) - -#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_FUNC_READ_INPUT_ENABLED > 0 - -eMBException -eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) - && ( usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR )( usRegCount * 2 ); - *usLen += 1; - - eRegStatus = - eMBRegInputCB( pucFrameCur, usRegAddress, usRegCount ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - *usLen += usRegCount * 2; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read input register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbfuncinput.c,v 1.10 2007/09/12 10:15:56 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbframe.h" +#include "mbproto.h" +#include "mbconfig.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READ_SIZE ( 4 ) +#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) + +#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) + +/* ----------------------- Static functions ---------------------------------*/ +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); + +/* ----------------------- Start implementation -----------------------------*/ +#if MB_FUNC_READ_INPUT_ENABLED > 0 + +eMBException +eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) +{ + USHORT usRegAddress; + USHORT usRegCount; + UCHAR *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress++; + + usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); + usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); + + /* Check if the number of registers to read is valid. If not + * return Modbus illegal data value exception. + */ + if( ( usRegCount >= 1 ) + && ( usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX ) ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER; + *usLen += 1; + + /* Second byte in the response contain the number of bytes. */ + *pucFrameCur++ = ( UCHAR )( usRegCount * 2 ); + *usLen += 1; + + eRegStatus = + eMBRegInputCB( pucFrameCur, usRegAddress, usRegCount ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + *usLen += usRegCount * 2; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid read input register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + +#endif diff --git a/modbus/modbus/functions/mbfuncother.c b/modbus/modbus/functions/mbfuncother.c index 95f9603..fcee972 100644 --- a/modbus/modbus/functions/mbfuncother.c +++ b/modbus/modbus/functions/mbfuncother.c @@ -1,88 +1,88 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncother.c,v 1.8 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - -/* ----------------------- Static variables ---------------------------------*/ -static UCHAR ucMBSlaveID[MB_FUNC_OTHER_REP_SLAVEID_BUF]; -static USHORT usMBSlaveIDLen; - -/* ----------------------- Start implementation -----------------------------*/ - -eMBErrorCode -eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, - UCHAR const *pucAdditional, USHORT usAdditionalLen ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* the first byte and second byte in the buffer is reserved for - * the parameter ucSlaveID and the running flag. The rest of - * the buffer is available for additional data. */ - if( usAdditionalLen + 2 < MB_FUNC_OTHER_REP_SLAVEID_BUF ) - { - usMBSlaveIDLen = 0; - ucMBSlaveID[usMBSlaveIDLen++] = ucSlaveID; - ucMBSlaveID[usMBSlaveIDLen++] = ( UCHAR )( xIsRunning ? 0xFF : 0x00 ); - if( usAdditionalLen > 0 ) - { - memcpy( &ucMBSlaveID[usMBSlaveIDLen], pucAdditional, - ( size_t )usAdditionalLen ); - usMBSlaveIDLen += usAdditionalLen; - } - } - else - { - eStatus = MB_ENORES; - } - return eStatus; -} - -eMBException -eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ) -{ - memcpy( &pucFrame[MB_PDU_DATA_OFF], &ucMBSlaveID[0], ( size_t )usMBSlaveIDLen ); - *usLen = ( USHORT )( MB_PDU_DATA_OFF + usMBSlaveIDLen ); - return MB_EX_NONE; -} - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbfuncother.c,v 1.8 2006/12/07 22:10:34 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbframe.h" +#include "mbproto.h" +#include "mbconfig.h" + +#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 + +/* ----------------------- Static variables ---------------------------------*/ +static UCHAR ucMBSlaveID[MB_FUNC_OTHER_REP_SLAVEID_BUF]; +static USHORT usMBSlaveIDLen; + +/* ----------------------- Start implementation -----------------------------*/ + +eMBErrorCode +eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, + UCHAR const *pucAdditional, USHORT usAdditionalLen ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + /* the first byte and second byte in the buffer is reserved for + * the parameter ucSlaveID and the running flag. The rest of + * the buffer is available for additional data. */ + if( usAdditionalLen + 2 < MB_FUNC_OTHER_REP_SLAVEID_BUF ) + { + usMBSlaveIDLen = 0; + ucMBSlaveID[usMBSlaveIDLen++] = ucSlaveID; + ucMBSlaveID[usMBSlaveIDLen++] = ( UCHAR )( xIsRunning ? 0xFF : 0x00 ); + if( usAdditionalLen > 0 ) + { + memcpy( &ucMBSlaveID[usMBSlaveIDLen], pucAdditional, + ( size_t )usAdditionalLen ); + usMBSlaveIDLen += usAdditionalLen; + } + } + else + { + eStatus = MB_ENORES; + } + return eStatus; +} + +eMBException +eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ) +{ + memcpy( &pucFrame[MB_PDU_DATA_OFF], &ucMBSlaveID[0], ( size_t )usMBSlaveIDLen ); + *usLen = ( USHORT )( MB_PDU_DATA_OFF + usMBSlaveIDLen ); + return MB_EX_NONE; +} + +#endif diff --git a/modbus/modbus/functions/mbutils.c b/modbus/modbus/functions/mbutils.c index ffc2509..6a72570 100644 --- a/modbus/modbus/functions/mbutils.c +++ b/modbus/modbus/functions/mbutils.c @@ -1,141 +1,141 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbutils.c,v 1.6 2007/02/18 23:49:07 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbproto.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define BITS_UCHAR 8U - -/* ----------------------- Start implementation -----------------------------*/ -void -xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits, - UCHAR ucValue ) -{ - USHORT usWordBuf; - USHORT usMask; - USHORT usByteOffset; - USHORT usNPreBits; - USHORT usValue = ucValue; - - assert( ucNBits <= 8 ); - assert( ( size_t )BITS_UCHAR == sizeof( UCHAR ) * 8 ); - - /* Calculate byte offset for first byte containing the bit values starting - * at usBitOffset. */ - usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); - - /* How many bits precede our bits to set. */ - usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); - - /* Move bit field into position over bits to set */ - usValue <<= usNPreBits; - - /* Prepare a mask for setting the new bits. */ - usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); - usMask <<= usBitOffset - usByteOffset * BITS_UCHAR; - - /* copy bits into temporary storage. */ - usWordBuf = ucByteBuf[usByteOffset]; - usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; - - /* Zero out bit field bits and then or value bits into them. */ - usWordBuf = ( USHORT )( ( usWordBuf & ( ~usMask ) ) | usValue ); - - /* move bits back into storage */ - ucByteBuf[usByteOffset] = ( UCHAR )( usWordBuf & 0xFF ); - ucByteBuf[usByteOffset + 1] = ( UCHAR )( usWordBuf >> BITS_UCHAR ); -} - -UCHAR -xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits ) -{ - USHORT usWordBuf; - USHORT usMask; - USHORT usByteOffset; - USHORT usNPreBits; - - /* Calculate byte offset for first byte containing the bit values starting - * at usBitOffset. */ - usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); - - /* How many bits precede our bits to set. */ - usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); - - /* Prepare a mask for setting the new bits. */ - usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); - - /* copy bits into temporary storage. */ - usWordBuf = ucByteBuf[usByteOffset]; - usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; - - /* throw away unneeded bits. */ - usWordBuf >>= usNPreBits; - - /* mask away bits above the requested bitfield. */ - usWordBuf &= usMask; - - return ( UCHAR ) usWordBuf; -} - -eMBException -prveMBError2Exception( eMBErrorCode eErrorCode ) -{ - eMBException eStatus; - - switch ( eErrorCode ) - { - case MB_ENOERR: - eStatus = MB_EX_NONE; - break; - - case MB_ENOREG: - eStatus = MB_EX_ILLEGAL_DATA_ADDRESS; - break; - - case MB_ETIMEDOUT: - eStatus = MB_EX_SLAVE_BUSY; - break; - - default: - eStatus = MB_EX_SLAVE_DEVICE_FAILURE; - break; - } - - return eStatus; -} +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbutils.c,v 1.6 2007/02/18 23:49:07 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbproto.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define BITS_UCHAR 8U + +/* ----------------------- Start implementation -----------------------------*/ +void +xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits, + UCHAR ucValue ) +{ + USHORT usWordBuf; + USHORT usMask; + USHORT usByteOffset; + USHORT usNPreBits; + USHORT usValue = ucValue; + + assert( ucNBits <= 8 ); + assert( ( size_t )BITS_UCHAR == sizeof( UCHAR ) * 8 ); + + /* Calculate byte offset for first byte containing the bit values starting + * at usBitOffset. */ + usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); + + /* How many bits precede our bits to set. */ + usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); + + /* Move bit field into position over bits to set */ + usValue <<= usNPreBits; + + /* Prepare a mask for setting the new bits. */ + usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); + usMask <<= usBitOffset - usByteOffset * BITS_UCHAR; + + /* copy bits into temporary storage. */ + usWordBuf = ucByteBuf[usByteOffset]; + usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; + + /* Zero out bit field bits and then or value bits into them. */ + usWordBuf = ( USHORT )( ( usWordBuf & ( ~usMask ) ) | usValue ); + + /* move bits back into storage */ + ucByteBuf[usByteOffset] = ( UCHAR )( usWordBuf & 0xFF ); + ucByteBuf[usByteOffset + 1] = ( UCHAR )( usWordBuf >> BITS_UCHAR ); +} + +UCHAR +xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits ) +{ + USHORT usWordBuf; + USHORT usMask; + USHORT usByteOffset; + USHORT usNPreBits; + + /* Calculate byte offset for first byte containing the bit values starting + * at usBitOffset. */ + usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); + + /* How many bits precede our bits to set. */ + usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); + + /* Prepare a mask for setting the new bits. */ + usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); + + /* copy bits into temporary storage. */ + usWordBuf = ucByteBuf[usByteOffset]; + usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; + + /* throw away unneeded bits. */ + usWordBuf >>= usNPreBits; + + /* mask away bits above the requested bitfield. */ + usWordBuf &= usMask; + + return ( UCHAR ) usWordBuf; +} + +eMBException +prveMBError2Exception( eMBErrorCode eErrorCode ) +{ + eMBException eStatus; + + switch ( eErrorCode ) + { + case MB_ENOERR: + eStatus = MB_EX_NONE; + break; + + case MB_ENOREG: + eStatus = MB_EX_ILLEGAL_DATA_ADDRESS; + break; + + case MB_ETIMEDOUT: + eStatus = MB_EX_SLAVE_BUSY; + break; + + default: + eStatus = MB_EX_SLAVE_DEVICE_FAILURE; + break; + } + + return eStatus; +} diff --git a/modbus/modbus/include/mb.h b/modbus/modbus/include/mb.h index 5cc6769..4c75de5 100644 --- a/modbus/modbus/include/mb.h +++ b/modbus/modbus/include/mb.h @@ -1,417 +1,417 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb.h,v 1.17 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_H -#define _MB_H - -#include "port.h" - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -#include "mbport.h" -#include "mbproto.h" - -/*! \defgroup modbus Modbus - * \code #include "mb.h" \endcode - * - * This module defines the interface for the application. It contains - * the basic functions and types required to use the Modbus protocol stack. - * A typical application will want to call eMBInit() first. If the device - * is ready to answer network requests it must then call eMBEnable() to activate - * the protocol stack. In the main loop the function eMBPoll() must be called - * periodically. The time interval between pooling depends on the configured - * Modbus timeout. If an RTOS is available a separate task should be created - * and the task should always call the function eMBPoll(). - * - * \code - * // Initialize protocol stack in RTU mode for a slave with address 10 = 0x0A - * eMBInit( MB_RTU, 0x0A, 38400, MB_PAR_EVEN ); - * // Enable the Modbus Protocol Stack. - * eMBEnable( ); - * for( ;; ) - * { - * // Call the main polling loop of the Modbus protocol stack. - * eMBPoll( ); - * ... - * } - * \endcode - */ - -/* ----------------------- Defines ------------------------------------------*/ - -/*! \ingroup modbus - * \brief Use the default Modbus TCP port (502) - */ -#define MB_TCP_PORT_USE_DEFAULT 0 - -/* ----------------------- Type definitions ---------------------------------*/ - -/*! \ingroup modbus - * \brief Modbus serial transmission modes (RTU/ASCII). - * - * Modbus serial supports two transmission modes. Either ASCII or RTU. RTU - * is faster but has more hardware requirements and requires a network with - * a low jitter. ASCII is slower and more reliable on slower links (E.g. modems) - */ - typedef enum -{ - MB_RTU, /*!< RTU transmission mode. */ - MB_ASCII, /*!< ASCII transmission mode. */ - MB_TCP /*!< TCP mode. */ -} eMBMode; - -/*! \ingroup modbus - * \brief If register should be written or read. - * - * This value is passed to the callback functions which support either - * reading or writing register values. Writing means that the application - * registers should be updated and reading means that the modbus protocol - * stack needs to know the current register values. - * - * \see eMBRegHoldingCB( ), eMBRegCoilsCB( ), eMBRegDiscreteCB( ) and - * eMBRegInputCB( ). - */ -typedef enum -{ - MB_REG_READ, /*!< Read register values and pass to protocol stack. */ - MB_REG_WRITE /*!< Update register values. */ -} eMBRegisterMode; - -/*! \ingroup modbus - * \brief Errorcodes used by all function in the protocol stack. - */ -typedef enum -{ - MB_ENOERR, /*!< no error. */ - MB_ENOREG, /*!< illegal register address. */ - MB_EINVAL, /*!< illegal argument. */ - MB_EPORTERR, /*!< porting layer error. */ - MB_ENORES, /*!< insufficient resources. */ - MB_EIO, /*!< I/O error. */ - MB_EILLSTATE, /*!< protocol stack in illegal state. */ - MB_ETIMEDOUT /*!< timeout error occurred. */ -} eMBErrorCode; - - -/* ----------------------- Function prototypes ------------------------------*/ -/*! \ingroup modbus - * \brief Initialize the Modbus protocol stack. - * - * This functions initializes the ASCII or RTU module and calls the - * init functions of the porting layer to prepare the hardware. Please - * note that the receiver is still disabled and no Modbus frames are - * processed until eMBEnable( ) has been called. - * - * \param eMode If ASCII or RTU mode should be used. - * \param ucSlaveAddress The slave address. Only frames sent to this - * address or to the broadcast address are processed. - * \param ucPort The port to use. E.g. 1 for COM1 on windows. This value - * is platform dependent and some ports simply choose to ignore it. - * \param ulBaudRate The baudrate. E.g. 19200. Supported baudrates depend - * on the porting layer. - * \param eParity Parity used for serial transmission. - * - * \return If no error occurs the function returns eMBErrorCode::MB_ENOERR. - * The protocol is then in the disabled state and ready for activation - * by calling eMBEnable( ). Otherwise one of the following error codes - * is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -extern eMBErrorCode eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, - UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ); - -/*! \ingroup modbus - * \brief Initialize the Modbus protocol stack for Modbus TCP. - * - * This function initializes the Modbus TCP Module. Please note that - * frame processing is still disabled until eMBEnable( ) is called. - * - * \param usTCPPort The TCP port to listen on. - * \return If the protocol stack has been initialized correctly the function - * returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error - * codes is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -extern eMBErrorCode eMBTCPInit( USHORT usTCPPort ); - -/*! \ingroup modbus - * \brief Release resources used by the protocol stack. - * - * This function disables the Modbus protocol stack and release all - * hardware resources. It must only be called when the protocol stack - * is disabled. - * - * \note Note all ports implement this function. A port which wants to - * get an callback must define the macro MB_PORT_HAS_CLOSE to 1. - * - * \return If the resources where released it return eMBErrorCode::MB_ENOERR. - * If the protocol stack is not in the disabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -extern eMBErrorCode eMBClose( void ); - -/*! \ingroup modbus - * \brief Enable the Modbus protocol stack. - * - * This function enables processing of Modbus frames. Enabling the protocol - * stack is only possible if it is in the disabled state. - * - * \return If the protocol stack is now in the state enabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the disabled state it - * return eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBEnable( void ); - -/*! \ingroup modbus - * \brief Disable the Modbus protocol stack. - * - * This function disables processing of Modbus frames. - * - * \return If the protocol stack has been disabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -extern eMBErrorCode eMBDisable( void ); - -/*! \ingroup modbus - * \brief The main pooling loop of the Modbus protocol stack. - * - * This function must be called periodically. The timer interval required - * is given by the application dependent Modbus slave timeout. Internally the - * function calls xMBPortEventGet() and waits for an event from the receiver or - * transmitter state machines. - * - * \return If the protocol stack is not in the enabled state the function - * returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns - * eMBErrorCode::MB_ENOERR. - */ -extern eMBErrorCode eMBPoll( void ); - -/*! \ingroup modbus - * \brief Configure the slave id of the device. - * - * This function should be called when the Modbus function Report Slave ID - * is enabled ( By defining MB_FUNC_OTHER_REP_SLAVEID_ENABLED in mbconfig.h ). - * - * \param ucSlaveID Values is returned in the Slave ID byte of the - * Report Slave ID response. - * \param xIsRunning If TRUE the Run Indicator Status byte is set to 0xFF. - * otherwise the Run Indicator Status is 0x00. - * \param pucAdditional Values which should be returned in the Additional - * bytes of the Report Slave ID response. - * \param usAdditionalLen Length of the buffer pucAdditonal. - * - * \return If the static buffer defined by MB_FUNC_OTHER_REP_SLAVEID_BUF in - * mbconfig.h is to small it returns eMBErrorCode::MB_ENORES. Otherwise - * it returns eMBErrorCode::MB_ENOERR. - */ -extern eMBErrorCode eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, - UCHAR const *pucAdditional, - USHORT usAdditionalLen ); - -/*! \ingroup modbus - * \brief Registers a callback handler for a given function code. - * - * This function registers a new callback handler for a given function code. - * The callback handler supplied is responsible for interpreting the Modbus PDU and - * the creation of an appropriate response. In case of an error it should return - * one of the possible Modbus exceptions which results in a Modbus exception frame - * sent by the protocol stack. - * - * \param ucFunctionCode The Modbus function code for which this handler should - * be registers. Valid function codes are in the range 1 to 127. - * \param pxHandler The function handler which should be called in case - * such a frame is received. If \c NULL a previously registered function handler - * for this function code is removed. - * - * \return eMBErrorCode::MB_ENOERR if the handler has been installed. If no - * more resources are available it returns eMBErrorCode::MB_ENORES. In this - * case the values in mbconfig.h should be adjusted. If the argument was not - * valid it returns eMBErrorCode::MB_EINVAL. - */ -extern eMBErrorCode eMBRegisterCB( UCHAR ucFunctionCode, - pxMBFunctionHandler pxHandler ); - -/* ----------------------- Callback -----------------------------------------*/ - -/*! \defgroup modbus_registers Modbus Registers - * \code #include "mb.h" \endcode - * The protocol stack does not internally allocate any memory for the - * registers. This makes the protocol stack very small and also usable on - * low end targets. In addition the values don't have to be in the memory - * and could for example be stored in a flash.
- * Whenever the protocol stack requires a value it calls one of the callback - * function with the register address and the number of registers to read - * as an argument. The application should then read the actual register values - * (for example the ADC voltage) and should store the result in the supplied - * buffer.
- * If the protocol stack wants to update a register value because a write - * register function was received a buffer with the new register values is - * passed to the callback function. The function should then use these values - * to update the application register values. - */ - -/*! \ingroup modbus_registers - * \brief Callback function used if the value of a Input Register - * is required by the protocol stack. The starting register address is given - * by \c usAddress and the last register is given by usAddress + - * usNRegs - 1. - * - * \param pucRegBuffer A buffer where the callback function should write - * the current value of the modbus registers to. - * \param usAddress The starting address of the register. Input registers - * are in the range 1 - 65535. - * \param usNRegs Number of registers the callback function must supply. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application can not supply values - * for registers within this range. In this case a - * ILLEGAL DATA ADDRESS exception frame is sent as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -extern eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Holding Register value is - * read or written by the protocol stack. The starting register address - * is given by \c usAddress and the last register is given by - * usAddress + usNRegs - 1. - * - * \param pucRegBuffer If the application registers values should be updated the - * buffer points to the new registers values. If the protocol stack needs - * to now the current values the callback function should write them into - * this buffer. - * \param usAddress The starting address of the register. - * \param usNRegs Number of registers to read or write. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application register - * values should be updated from the values in the buffer. For example - * this would be the case when the Modbus master has issued an - * WRITE SINGLE REGISTER command. - * If the value eMBRegisterMode::MB_REG_READ the application should copy - * the current values into the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application can not supply values - * for registers within this range. In this case a - * ILLEGAL DATA ADDRESS exception frame is sent as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -extern eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Coil Register value is - * read or written by the protocol stack. If you are going to use - * this function you might use the functions xMBUtilSetBits( ) and - * xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The bits are packed in bytes where the first coil - * starting at address \c usAddress is stored in the LSB of the - * first byte in the buffer pucRegBuffer. - * If the buffer should be written by the callback function unused - * coil values (I.e. if not a multiple of eight coils is used) should be set - * to zero. - * \param usAddress The first coil number. - * \param usNCoils Number of coil values requested. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application values should - * be updated from the values supplied in the buffer \c pucRegBuffer. - * If eMBRegisterMode::MB_REG_READ the application should store the current - * values in the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -extern eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Input Discrete Register value is - * read by the protocol stack. - * - * If you are going to use his function you might use the functions - * xMBUtilSetBits( ) and xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The buffer should be updated with the current - * coil values. The first discrete input starting at \c usAddress must be - * stored at the LSB of the first byte in the buffer. If the requested number - * is not a multiple of eight the remaining bits should be set to zero. - * \param usAddress The starting address of the first discrete input. - * \param usNDiscrete Number of discrete input values. - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If no such discrete inputs exists. - * In this case a ILLEGAL DATA ADDRESS exception frame is sent - * as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -extern eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mb.h,v 1.17 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_H +#define _MB_H + +#include "port.h" + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + +#include "mbport.h" +#include "mbproto.h" + +/*! \defgroup modbus Modbus + * \code #include "mb.h" \endcode + * + * This module defines the interface for the application. It contains + * the basic functions and types required to use the Modbus protocol stack. + * A typical application will want to call eMBInit() first. If the device + * is ready to answer network requests it must then call eMBEnable() to activate + * the protocol stack. In the main loop the function eMBPoll() must be called + * periodically. The time interval between pooling depends on the configured + * Modbus timeout. If an RTOS is available a separate task should be created + * and the task should always call the function eMBPoll(). + * + * \code + * // Initialize protocol stack in RTU mode for a slave with address 10 = 0x0A + * eMBInit( MB_RTU, 0x0A, 38400, MB_PAR_EVEN ); + * // Enable the Modbus Protocol Stack. + * eMBEnable( ); + * for( ;; ) + * { + * // Call the main polling loop of the Modbus protocol stack. + * eMBPoll( ); + * ... + * } + * \endcode + */ + +/* ----------------------- Defines ------------------------------------------*/ + +/*! \ingroup modbus + * \brief Use the default Modbus TCP port (502) + */ +#define MB_TCP_PORT_USE_DEFAULT 0 + +/* ----------------------- Type definitions ---------------------------------*/ + +/*! \ingroup modbus + * \brief Modbus serial transmission modes (RTU/ASCII). + * + * Modbus serial supports two transmission modes. Either ASCII or RTU. RTU + * is faster but has more hardware requirements and requires a network with + * a low jitter. ASCII is slower and more reliable on slower links (E.g. modems) + */ + typedef enum +{ + MB_RTU, /*!< RTU transmission mode. */ + MB_ASCII, /*!< ASCII transmission mode. */ + MB_TCP /*!< TCP mode. */ +} eMBMode; + +/*! \ingroup modbus + * \brief If register should be written or read. + * + * This value is passed to the callback functions which support either + * reading or writing register values. Writing means that the application + * registers should be updated and reading means that the modbus protocol + * stack needs to know the current register values. + * + * \see eMBRegHoldingCB( ), eMBRegCoilsCB( ), eMBRegDiscreteCB( ) and + * eMBRegInputCB( ). + */ +typedef enum +{ + MB_REG_READ, /*!< Read register values and pass to protocol stack. */ + MB_REG_WRITE /*!< Update register values. */ +} eMBRegisterMode; + +/*! \ingroup modbus + * \brief Errorcodes used by all function in the protocol stack. + */ +typedef enum +{ + MB_ENOERR, /*!< no error. */ + MB_ENOREG, /*!< illegal register address. */ + MB_EINVAL, /*!< illegal argument. */ + MB_EPORTERR, /*!< porting layer error. */ + MB_ENORES, /*!< insufficient resources. */ + MB_EIO, /*!< I/O error. */ + MB_EILLSTATE, /*!< protocol stack in illegal state. */ + MB_ETIMEDOUT /*!< timeout error occurred. */ +} eMBErrorCode; + + +/* ----------------------- Function prototypes ------------------------------*/ +/*! \ingroup modbus + * \brief Initialize the Modbus protocol stack. + * + * This functions initializes the ASCII or RTU module and calls the + * init functions of the porting layer to prepare the hardware. Please + * note that the receiver is still disabled and no Modbus frames are + * processed until eMBEnable( ) has been called. + * + * \param eMode If ASCII or RTU mode should be used. + * \param ucSlaveAddress The slave address. Only frames sent to this + * address or to the broadcast address are processed. + * \param ucPort The port to use. E.g. 1 for COM1 on windows. This value + * is platform dependent and some ports simply choose to ignore it. + * \param ulBaudRate The baudrate. E.g. 19200. Supported baudrates depend + * on the porting layer. + * \param eParity Parity used for serial transmission. + * + * \return If no error occurs the function returns eMBErrorCode::MB_ENOERR. + * The protocol is then in the disabled state and ready for activation + * by calling eMBEnable( ). Otherwise one of the following error codes + * is returned: + * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid + * slave addresses are in the range 1 - 247. + * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. + */ +extern eMBErrorCode eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, + UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ); + +/*! \ingroup modbus + * \brief Initialize the Modbus protocol stack for Modbus TCP. + * + * This function initializes the Modbus TCP Module. Please note that + * frame processing is still disabled until eMBEnable( ) is called. + * + * \param usTCPPort The TCP port to listen on. + * \return If the protocol stack has been initialized correctly the function + * returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error + * codes is returned: + * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid + * slave addresses are in the range 1 - 247. + * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. + */ +extern eMBErrorCode eMBTCPInit( USHORT usTCPPort ); + +/*! \ingroup modbus + * \brief Release resources used by the protocol stack. + * + * This function disables the Modbus protocol stack and release all + * hardware resources. It must only be called when the protocol stack + * is disabled. + * + * \note Note all ports implement this function. A port which wants to + * get an callback must define the macro MB_PORT_HAS_CLOSE to 1. + * + * \return If the resources where released it return eMBErrorCode::MB_ENOERR. + * If the protocol stack is not in the disabled state it returns + * eMBErrorCode::MB_EILLSTATE. + */ +extern eMBErrorCode eMBClose( void ); + +/*! \ingroup modbus + * \brief Enable the Modbus protocol stack. + * + * This function enables processing of Modbus frames. Enabling the protocol + * stack is only possible if it is in the disabled state. + * + * \return If the protocol stack is now in the state enabled it returns + * eMBErrorCode::MB_ENOERR. If it was not in the disabled state it + * return eMBErrorCode::MB_EILLSTATE. + */ +eMBErrorCode eMBEnable( void ); + +/*! \ingroup modbus + * \brief Disable the Modbus protocol stack. + * + * This function disables processing of Modbus frames. + * + * \return If the protocol stack has been disabled it returns + * eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns + * eMBErrorCode::MB_EILLSTATE. + */ +extern eMBErrorCode eMBDisable( void ); + +/*! \ingroup modbus + * \brief The main pooling loop of the Modbus protocol stack. + * + * This function must be called periodically. The timer interval required + * is given by the application dependent Modbus slave timeout. Internally the + * function calls xMBPortEventGet() and waits for an event from the receiver or + * transmitter state machines. + * + * \return If the protocol stack is not in the enabled state the function + * returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns + * eMBErrorCode::MB_ENOERR. + */ +extern eMBErrorCode eMBPoll( void ); + +/*! \ingroup modbus + * \brief Configure the slave id of the device. + * + * This function should be called when the Modbus function Report Slave ID + * is enabled ( By defining MB_FUNC_OTHER_REP_SLAVEID_ENABLED in mbconfig.h ). + * + * \param ucSlaveID Values is returned in the Slave ID byte of the + * Report Slave ID response. + * \param xIsRunning If TRUE the Run Indicator Status byte is set to 0xFF. + * otherwise the Run Indicator Status is 0x00. + * \param pucAdditional Values which should be returned in the Additional + * bytes of the Report Slave ID response. + * \param usAdditionalLen Length of the buffer pucAdditonal. + * + * \return If the static buffer defined by MB_FUNC_OTHER_REP_SLAVEID_BUF in + * mbconfig.h is to small it returns eMBErrorCode::MB_ENORES. Otherwise + * it returns eMBErrorCode::MB_ENOERR. + */ +extern eMBErrorCode eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, + UCHAR const *pucAdditional, + USHORT usAdditionalLen ); + +/*! \ingroup modbus + * \brief Registers a callback handler for a given function code. + * + * This function registers a new callback handler for a given function code. + * The callback handler supplied is responsible for interpreting the Modbus PDU and + * the creation of an appropriate response. In case of an error it should return + * one of the possible Modbus exceptions which results in a Modbus exception frame + * sent by the protocol stack. + * + * \param ucFunctionCode The Modbus function code for which this handler should + * be registers. Valid function codes are in the range 1 to 127. + * \param pxHandler The function handler which should be called in case + * such a frame is received. If \c NULL a previously registered function handler + * for this function code is removed. + * + * \return eMBErrorCode::MB_ENOERR if the handler has been installed. If no + * more resources are available it returns eMBErrorCode::MB_ENORES. In this + * case the values in mbconfig.h should be adjusted. If the argument was not + * valid it returns eMBErrorCode::MB_EINVAL. + */ +extern eMBErrorCode eMBRegisterCB( UCHAR ucFunctionCode, + pxMBFunctionHandler pxHandler ); + +/* ----------------------- Callback -----------------------------------------*/ + +/*! \defgroup modbus_registers Modbus Registers + * \code #include "mb.h" \endcode + * The protocol stack does not internally allocate any memory for the + * registers. This makes the protocol stack very small and also usable on + * low end targets. In addition the values don't have to be in the memory + * and could for example be stored in a flash.
+ * Whenever the protocol stack requires a value it calls one of the callback + * function with the register address and the number of registers to read + * as an argument. The application should then read the actual register values + * (for example the ADC voltage) and should store the result in the supplied + * buffer.
+ * If the protocol stack wants to update a register value because a write + * register function was received a buffer with the new register values is + * passed to the callback function. The function should then use these values + * to update the application register values. + */ + +/*! \ingroup modbus_registers + * \brief Callback function used if the value of a Input Register + * is required by the protocol stack. The starting register address is given + * by \c usAddress and the last register is given by usAddress + + * usNRegs - 1. + * + * \param pucRegBuffer A buffer where the callback function should write + * the current value of the modbus registers to. + * \param usAddress The starting address of the register. Input registers + * are in the range 1 - 65535. + * \param usNRegs Number of registers the callback function must supply. + * + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application can not supply values + * for registers within this range. In this case a + * ILLEGAL DATA ADDRESS exception frame is sent as a response. + * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is + * currently not available and the application dependent response + * timeout would be violated. In this case a SLAVE DEVICE BUSY + * exception is sent as a response. + * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case + * a SLAVE DEVICE FAILURE exception is sent as a response. + */ +extern eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs ); + +/*! \ingroup modbus_registers + * \brief Callback function used if a Holding Register value is + * read or written by the protocol stack. The starting register address + * is given by \c usAddress and the last register is given by + * usAddress + usNRegs - 1. + * + * \param pucRegBuffer If the application registers values should be updated the + * buffer points to the new registers values. If the protocol stack needs + * to now the current values the callback function should write them into + * this buffer. + * \param usAddress The starting address of the register. + * \param usNRegs Number of registers to read or write. + * \param eMode If eMBRegisterMode::MB_REG_WRITE the application register + * values should be updated from the values in the buffer. For example + * this would be the case when the Modbus master has issued an + * WRITE SINGLE REGISTER command. + * If the value eMBRegisterMode::MB_REG_READ the application should copy + * the current values into the buffer \c pucRegBuffer. + * + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application can not supply values + * for registers within this range. In this case a + * ILLEGAL DATA ADDRESS exception frame is sent as a response. + * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is + * currently not available and the application dependent response + * timeout would be violated. In this case a SLAVE DEVICE BUSY + * exception is sent as a response. + * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case + * a SLAVE DEVICE FAILURE exception is sent as a response. + */ +extern eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs, eMBRegisterMode eMode ); + +/*! \ingroup modbus_registers + * \brief Callback function used if a Coil Register value is + * read or written by the protocol stack. If you are going to use + * this function you might use the functions xMBUtilSetBits( ) and + * xMBUtilGetBits( ) for working with bitfields. + * + * \param pucRegBuffer The bits are packed in bytes where the first coil + * starting at address \c usAddress is stored in the LSB of the + * first byte in the buffer pucRegBuffer. + * If the buffer should be written by the callback function unused + * coil values (I.e. if not a multiple of eight coils is used) should be set + * to zero. + * \param usAddress The first coil number. + * \param usNCoils Number of coil values requested. + * \param eMode If eMBRegisterMode::MB_REG_WRITE the application values should + * be updated from the values supplied in the buffer \c pucRegBuffer. + * If eMBRegisterMode::MB_REG_READ the application should store the current + * values in the buffer \c pucRegBuffer. + * + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application does not map an coils + * within the requested address range. In this case a + * ILLEGAL DATA ADDRESS is sent as a response. + * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is + * currently not available and the application dependent response + * timeout would be violated. In this case a SLAVE DEVICE BUSY + * exception is sent as a response. + * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case + * a SLAVE DEVICE FAILURE exception is sent as a response. + */ +extern eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNCoils, eMBRegisterMode eMode ); + +/*! \ingroup modbus_registers + * \brief Callback function used if a Input Discrete Register value is + * read by the protocol stack. + * + * If you are going to use his function you might use the functions + * xMBUtilSetBits( ) and xMBUtilGetBits( ) for working with bitfields. + * + * \param pucRegBuffer The buffer should be updated with the current + * coil values. The first discrete input starting at \c usAddress must be + * stored at the LSB of the first byte in the buffer. If the requested number + * is not a multiple of eight the remaining bits should be set to zero. + * \param usAddress The starting address of the first discrete input. + * \param usNDiscrete Number of discrete input values. + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If no such discrete inputs exists. + * In this case a ILLEGAL DATA ADDRESS exception frame is sent + * as a response. + * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is + * currently not available and the application dependent response + * timeout would be violated. In this case a SLAVE DEVICE BUSY + * exception is sent as a response. + * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case + * a SLAVE DEVICE FAILURE exception is sent as a response. + */ +extern eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNDiscrete ); + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/include/mbconfig.h b/modbus/modbus/include/mbconfig.h index a960642..7912143 100644 --- a/modbus/modbus/include/mbconfig.h +++ b/modbus/modbus/include/mbconfig.h @@ -1,132 +1,132 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbconfig.h,v 1.15 2010/06/06 13:54:40 wolti Exp $ - */ - -#ifndef _MB_CONFIG_H -#define _MB_CONFIG_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/* ----------------------- Defines ------------------------------------------*/ -/*! \defgroup modbus_cfg Modbus Configuration - * - * Most modules in the protocol stack are completly optional and can be - * excluded. This is specially important if target resources are very small - * and program memory space should be saved.
- * - * All of these settings are available in the file mbconfig.h - */ -/*! \addtogroup modbus_cfg - * @{ - */ -/*! \brief If Modbus ASCII support is enabled. */ -#define MB_ASCII_ENABLED ( 0 ) - -/*! \brief If Modbus RTU support is enabled. */ -#define MB_RTU_ENABLED ( 0 ) - -/*! \brief If Modbus TCP support is enabled. */ -#define MB_TCP_ENABLED ( 1 ) - -/*! \brief The character timeout value for Modbus ASCII. - * - * The character timeout value is not fixed for Modbus ASCII and is therefore - * a configuration option. It should be set to the maximum expected delay - * time of the network. - */ -#define MB_ASCII_TIMEOUT_SEC ( 1 ) - -/*! \brief Timeout to wait in ASCII prior to enabling transmitter. - * - * If defined the function calls vMBPortSerialDelay with the argument - * MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS to allow for a delay before - * the serial transmitter is enabled. This is required because some - * targets are so fast that there is no time between receiving and - * transmitting the frame. If the master is to slow with enabling its - * receiver then he will not receive the response correctly. - */ -#ifndef MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS -#define MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ( 0 ) -#endif - -/*! \brief Maximum number of Modbus functions codes the protocol stack - * should support. - * - * The maximum number of supported Modbus functions must be greater than - * the sum of all enabled functions in this file and custom function - * handlers. If set to small adding more functions will fail. - */ -#define MB_FUNC_HANDLERS_MAX ( 16 ) - -/*! \brief Number of bytes which should be allocated for the Report Slave ID - * command. - * - * This number limits the maximum size of the additional segment in the - * report slave id function. See eMBSetSlaveID( ) for more information on - * how to set this value. It is only used if MB_FUNC_OTHER_REP_SLAVEID_ENABLED - * is set to 1. - */ -#define MB_FUNC_OTHER_REP_SLAVEID_BUF ( 32 ) - -/*! \brief If the Report Slave ID function should be enabled. */ -#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED ( 1 ) - -/*! \brief If the Read Input Registers function should be enabled. */ -#define MB_FUNC_READ_INPUT_ENABLED ( 1 ) - -/*! \brief If the Read Holding Registers function should be enabled. */ -#define MB_FUNC_READ_HOLDING_ENABLED ( 1 ) - -/*! \brief If the Write Single Register function should be enabled. */ -#define MB_FUNC_WRITE_HOLDING_ENABLED ( 1 ) - -/*! \brief If the Write Multiple registers function should be enabled. */ -#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED ( 1 ) - -/*! \brief If the Read Coils function should be enabled. */ -#define MB_FUNC_READ_COILS_ENABLED ( 0 ) - -/*! \brief If the Write Coils function should be enabled. */ -#define MB_FUNC_WRITE_COIL_ENABLED ( 0 ) - -/*! \brief If the Write Multiple Coils function should be enabled. */ -#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED ( 0 ) - -/*! \brief If the Read Discrete Inputs function should be enabled. */ -#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED ( 0 ) - -/*! \brief If the Read/Write Multiple Registers function should be enabled. */ -#define MB_FUNC_READWRITE_HOLDING_ENABLED ( 1 ) - -/*! @} */ -#ifdef __cplusplus - PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbconfig.h,v 1.15 2010/06/06 13:54:40 wolti Exp $ + */ + +#ifndef _MB_CONFIG_H +#define _MB_CONFIG_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif +/* ----------------------- Defines ------------------------------------------*/ +/*! \defgroup modbus_cfg Modbus Configuration + * + * Most modules in the protocol stack are completly optional and can be + * excluded. This is specially important if target resources are very small + * and program memory space should be saved.
+ * + * All of these settings are available in the file mbconfig.h + */ +/*! \addtogroup modbus_cfg + * @{ + */ +/*! \brief If Modbus ASCII support is enabled. */ +#define MB_ASCII_ENABLED ( 0 ) + +/*! \brief If Modbus RTU support is enabled. */ +#define MB_RTU_ENABLED ( 0 ) + +/*! \brief If Modbus TCP support is enabled. */ +#define MB_TCP_ENABLED ( 1 ) + +/*! \brief The character timeout value for Modbus ASCII. + * + * The character timeout value is not fixed for Modbus ASCII and is therefore + * a configuration option. It should be set to the maximum expected delay + * time of the network. + */ +#define MB_ASCII_TIMEOUT_SEC ( 1 ) + +/*! \brief Timeout to wait in ASCII prior to enabling transmitter. + * + * If defined the function calls vMBPortSerialDelay with the argument + * MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS to allow for a delay before + * the serial transmitter is enabled. This is required because some + * targets are so fast that there is no time between receiving and + * transmitting the frame. If the master is to slow with enabling its + * receiver then he will not receive the response correctly. + */ +#ifndef MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS +#define MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ( 0 ) +#endif + +/*! \brief Maximum number of Modbus functions codes the protocol stack + * should support. + * + * The maximum number of supported Modbus functions must be greater than + * the sum of all enabled functions in this file and custom function + * handlers. If set to small adding more functions will fail. + */ +#define MB_FUNC_HANDLERS_MAX ( 16 ) + +/*! \brief Number of bytes which should be allocated for the Report Slave ID + * command. + * + * This number limits the maximum size of the additional segment in the + * report slave id function. See eMBSetSlaveID( ) for more information on + * how to set this value. It is only used if MB_FUNC_OTHER_REP_SLAVEID_ENABLED + * is set to 1. + */ +#define MB_FUNC_OTHER_REP_SLAVEID_BUF ( 32 ) + +/*! \brief If the Report Slave ID function should be enabled. */ +#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED ( 1 ) + +/*! \brief If the Read Input Registers function should be enabled. */ +#define MB_FUNC_READ_INPUT_ENABLED ( 1 ) + +/*! \brief If the Read Holding Registers function should be enabled. */ +#define MB_FUNC_READ_HOLDING_ENABLED ( 1 ) + +/*! \brief If the Write Single Register function should be enabled. */ +#define MB_FUNC_WRITE_HOLDING_ENABLED ( 1 ) + +/*! \brief If the Write Multiple registers function should be enabled. */ +#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED ( 1 ) + +/*! \brief If the Read Coils function should be enabled. */ +#define MB_FUNC_READ_COILS_ENABLED ( 0 ) + +/*! \brief If the Write Coils function should be enabled. */ +#define MB_FUNC_WRITE_COIL_ENABLED ( 0 ) + +/*! \brief If the Write Multiple Coils function should be enabled. */ +#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED ( 0 ) + +/*! \brief If the Read Discrete Inputs function should be enabled. */ +#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED ( 0 ) + +/*! \brief If the Read/Write Multiple Registers function should be enabled. */ +#define MB_FUNC_READWRITE_HOLDING_ENABLED ( 1 ) + +/*! @} */ +#ifdef __cplusplus + PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/include/mbframe.h b/modbus/modbus/include/mbframe.h index f854da6..99d59c6 100644 --- a/modbus/modbus/include/mbframe.h +++ b/modbus/modbus/include/mbframe.h @@ -1,87 +1,87 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbframe.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_FRAME_H -#define _MB_FRAME_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/*! - * Constants which defines the format of a modbus frame. The example is - * shown for a Modbus RTU/ASCII frame. Note that the Modbus PDU is not - * dependent on the underlying transport. - * - * - * <------------------------ MODBUS SERIAL LINE PDU (1) -------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+----------------------------+-------------+ - * | Address | Function Code | Data | CRC/LRC | - * +-----------+---------------+----------------------------+-------------+ - * | | | | - * (2) (3/2') (3') (4) - * - * (1) ... MB_SER_PDU_SIZE_MAX = 256 - * (2) ... MB_SER_PDU_ADDR_OFF = 0 - * (3) ... MB_SER_PDU_PDU_OFF = 1 - * (4) ... MB_SER_PDU_SIZE_CRC = 2 - * - * (1') ... MB_PDU_SIZE_MAX = 253 - * (2') ... MB_PDU_FUNC_OFF = 0 - * (3') ... MB_PDU_DATA_OFF = 1 - * - */ - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_SIZE_MAX 253 /*!< Maximum size of a PDU. */ -#define MB_PDU_SIZE_MIN 1 /*!< Function Code */ -#define MB_PDU_FUNC_OFF 0 /*!< Offset of function code in PDU. */ -#define MB_PDU_DATA_OFF 1 /*!< Offset for response data in PDU. */ - -/* ----------------------- Prototypes 0-------------------------------------*/ -typedef void ( *pvMBFrameStart ) ( void ); - -typedef void ( *pvMBFrameStop ) ( void ); - -typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress, - UCHAR ** pucFrame, - USHORT * pusLength ); - -typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress, - const UCHAR * pucFrame, - USHORT usLength ); - -typedef void( *pvMBFrameClose ) ( void ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbframe.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_FRAME_H +#define _MB_FRAME_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + +/*! + * Constants which defines the format of a modbus frame. The example is + * shown for a Modbus RTU/ASCII frame. Note that the Modbus PDU is not + * dependent on the underlying transport. + * + * + * <------------------------ MODBUS SERIAL LINE PDU (1) -------------------> + * <----------- MODBUS PDU (1') ----------------> + * +-----------+---------------+----------------------------+-------------+ + * | Address | Function Code | Data | CRC/LRC | + * +-----------+---------------+----------------------------+-------------+ + * | | | | + * (2) (3/2') (3') (4) + * + * (1) ... MB_SER_PDU_SIZE_MAX = 256 + * (2) ... MB_SER_PDU_ADDR_OFF = 0 + * (3) ... MB_SER_PDU_PDU_OFF = 1 + * (4) ... MB_SER_PDU_SIZE_CRC = 2 + * + * (1') ... MB_PDU_SIZE_MAX = 253 + * (2') ... MB_PDU_FUNC_OFF = 0 + * (3') ... MB_PDU_DATA_OFF = 1 + * + */ + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_PDU_SIZE_MAX 253 /*!< Maximum size of a PDU. */ +#define MB_PDU_SIZE_MIN 1 /*!< Function Code */ +#define MB_PDU_FUNC_OFF 0 /*!< Offset of function code in PDU. */ +#define MB_PDU_DATA_OFF 1 /*!< Offset for response data in PDU. */ + +/* ----------------------- Prototypes 0-------------------------------------*/ +typedef void ( *pvMBFrameStart ) ( void ); + +typedef void ( *pvMBFrameStop ) ( void ); + +typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress, + UCHAR ** pucFrame, + USHORT * pusLength ); + +typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress, + const UCHAR * pucFrame, + USHORT usLength ); + +typedef void( *pvMBFrameClose ) ( void ); + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/include/mbfunc.h b/modbus/modbus/include/mbfunc.h index 988b85e..aea14f7 100644 --- a/modbus/modbus/include/mbfunc.h +++ b/modbus/modbus/include/mbfunc.h @@ -1,80 +1,80 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunc.h,v 1.12 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_FUNC_H -#define _MB_FUNC_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -#if MB_FUNC_OTHER_REP_SLAVEID_BUF > 0 - eMBException eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_INPUT_ENABLED > 0 -eMBException eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 -eMBException eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 -eMBException eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 -eMBException eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_COILS_ENABLED > 0 -eMBException eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 -eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -eMBException eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 -eMBException eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 -eMBException eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbfunc.h,v 1.12 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_FUNC_H +#define _MB_FUNC_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif +#if MB_FUNC_OTHER_REP_SLAVEID_BUF > 0 + eMBException eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_READ_INPUT_ENABLED > 0 +eMBException eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_READ_HOLDING_ENABLED > 0 +eMBException eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 +eMBException eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 +eMBException eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_READ_COILS_ENABLED > 0 +eMBException eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_WRITE_COIL_ENABLED > 0 +eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 +eMBException eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 +eMBException eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 +eMBException eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); +#endif + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/include/mbport.h b/modbus/modbus/include/mbport.h index 5ac4607..4f25a96 100644 --- a/modbus/modbus/include/mbport.h +++ b/modbus/modbus/include/mbport.h @@ -1,129 +1,129 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbport.h,v 1.19 2010/06/06 13:54:40 wolti Exp $ - */ - -#ifndef _MB_PORT_H -#define _MB_PORT_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Type definitions ---------------------------------*/ - -typedef enum -{ - EV_READY, /*!< Startup finished. */ - EV_FRAME_RECEIVED, /*!< Frame received. */ - EV_EXECUTE, /*!< Execute function. */ - EV_FRAME_SENT /*!< Frame sent. */ -} eMBEventType; - -/*! \ingroup modbus - * \brief Parity used for characters in serial mode. - * - * The parity which should be applied to the characters sent over the serial - * link. Please note that this values are actually passed to the porting - * layer and therefore not all parity modes might be available. - */ -typedef enum -{ - MB_PAR_NONE, /*!< No parity. */ - MB_PAR_ODD, /*!< Odd parity. */ - MB_PAR_EVEN /*!< Even parity. */ -} eMBParity; - -/* ----------------------- Supporting functions -----------------------------*/ -BOOL xMBPortEventInit( void ); - -BOOL xMBPortEventPost( eMBEventType eEvent ); - -BOOL xMBPortEventGet( /*@out@ */ eMBEventType * eEvent ); - -/* ----------------------- Serial port functions ----------------------------*/ - -BOOL xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, - UCHAR ucDataBits, eMBParity eParity ); - -void vMBPortClose( void ); - -void xMBPortSerialClose( void ); - -void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ); - -BOOL xMBPortSerialGetByte( CHAR * pucByte ); - -BOOL xMBPortSerialPutByte( CHAR ucByte ); - -/* ----------------------- Timers functions ---------------------------------*/ -BOOL xMBPortTimersInit( USHORT usTimeOut50us ); - -void xMBPortTimersClose( void ); - -void vMBPortTimersEnable( void ); - -void vMBPortTimersDisable( void ); - -void vMBPortTimersDelay( USHORT usTimeOutMS ); - -/* ----------------------- Callback for the protocol stack ------------------*/ - -/*! - * \brief Callback function for the porting layer when a new byte is - * available. - * - * Depending upon the mode this callback function is used by the RTU or - * ASCII transmission layers. In any case a call to xMBPortSerialGetByte() - * must immediately return a new character. - * - * \return TRUE if a event was posted to the queue because - * a new byte was received. The port implementation should wake up the - * tasks which are currently blocked on the eventqueue. - */ -extern BOOL( *pxMBFrameCBByteReceived ) ( void ); - -extern BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); - -extern BOOL( *pxMBPortCBTimerExpired ) ( void ); - -/* ----------------------- TCP port functions -------------------------------*/ -BOOL xMBTCPPortInit( USHORT usTCPPort ); - -void vMBTCPPortClose( void ); - -void vMBTCPPortDisable( void ); - -BOOL xMBTCPPortGetRequest( UCHAR **ppucMBTCPFrame, USHORT * usTCPLength ); - -BOOL xMBTCPPortSendResponse( const UCHAR *pucMBTCPFrame, USHORT usTCPLength ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbport.h,v 1.19 2010/06/06 13:54:40 wolti Exp $ + */ + +#ifndef _MB_PORT_H +#define _MB_PORT_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + +/* ----------------------- Type definitions ---------------------------------*/ + +typedef enum +{ + EV_READY, /*!< Startup finished. */ + EV_FRAME_RECEIVED, /*!< Frame received. */ + EV_EXECUTE, /*!< Execute function. */ + EV_FRAME_SENT /*!< Frame sent. */ +} eMBEventType; + +/*! \ingroup modbus + * \brief Parity used for characters in serial mode. + * + * The parity which should be applied to the characters sent over the serial + * link. Please note that this values are actually passed to the porting + * layer and therefore not all parity modes might be available. + */ +typedef enum +{ + MB_PAR_NONE, /*!< No parity. */ + MB_PAR_ODD, /*!< Odd parity. */ + MB_PAR_EVEN /*!< Even parity. */ +} eMBParity; + +/* ----------------------- Supporting functions -----------------------------*/ +BOOL xMBPortEventInit( void ); + +BOOL xMBPortEventPost( eMBEventType eEvent ); + +BOOL xMBPortEventGet( /*@out@ */ eMBEventType * eEvent ); + +/* ----------------------- Serial port functions ----------------------------*/ + +BOOL xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, + UCHAR ucDataBits, eMBParity eParity ); + +void vMBPortClose( void ); + +void xMBPortSerialClose( void ); + +void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ); + +BOOL xMBPortSerialGetByte( CHAR * pucByte ); + +BOOL xMBPortSerialPutByte( CHAR ucByte ); + +/* ----------------------- Timers functions ---------------------------------*/ +BOOL xMBPortTimersInit( USHORT usTimeOut50us ); + +void xMBPortTimersClose( void ); + +void vMBPortTimersEnable( void ); + +void vMBPortTimersDisable( void ); + +void vMBPortTimersDelay( USHORT usTimeOutMS ); + +/* ----------------------- Callback for the protocol stack ------------------*/ + +/*! + * \brief Callback function for the porting layer when a new byte is + * available. + * + * Depending upon the mode this callback function is used by the RTU or + * ASCII transmission layers. In any case a call to xMBPortSerialGetByte() + * must immediately return a new character. + * + * \return TRUE if a event was posted to the queue because + * a new byte was received. The port implementation should wake up the + * tasks which are currently blocked on the eventqueue. + */ +extern BOOL( *pxMBFrameCBByteReceived ) ( void ); + +extern BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); + +extern BOOL( *pxMBPortCBTimerExpired ) ( void ); + +/* ----------------------- TCP port functions -------------------------------*/ +BOOL xMBTCPPortInit( USHORT usTCPPort ); + +void vMBTCPPortClose( void ); + +void vMBTCPPortDisable( void ); + +BOOL xMBTCPPortGetRequest( UCHAR **ppucMBTCPFrame, USHORT * usTCPLength ); + +BOOL xMBTCPPortSendResponse( const UCHAR *pucMBTCPFrame, USHORT usTCPLength ); + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/include/mbproto.h b/modbus/modbus/include/mbproto.h index fe16fb9..786aaf4 100644 --- a/modbus/modbus/include/mbproto.h +++ b/modbus/modbus/include/mbproto.h @@ -1,83 +1,83 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbproto.h,v 1.14 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_PROTO_H -#define _MB_PROTO_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/* ----------------------- Defines ------------------------------------------*/ -#define MB_ADDRESS_BROADCAST ( 0 ) /*! Modbus broadcast address. */ -#define MB_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ -#define MB_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ -#define MB_FUNC_NONE ( 0 ) -#define MB_FUNC_READ_COILS ( 1 ) -#define MB_FUNC_READ_DISCRETE_INPUTS ( 2 ) -#define MB_FUNC_WRITE_SINGLE_COIL ( 5 ) -#define MB_FUNC_WRITE_MULTIPLE_COILS ( 15 ) -#define MB_FUNC_READ_HOLDING_REGISTER ( 3 ) -#define MB_FUNC_READ_INPUT_REGISTER ( 4 ) -#define MB_FUNC_WRITE_REGISTER ( 6 ) -#define MB_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) -#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) -#define MB_FUNC_DIAG_READ_EXCEPTION ( 7 ) -#define MB_FUNC_DIAG_DIAGNOSTIC ( 8 ) -#define MB_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) -#define MB_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) -#define MB_FUNC_OTHER_REPORT_SLAVEID ( 17 ) -#define MB_FUNC_ERROR ( 128 ) -/* ----------------------- Type definitions ---------------------------------*/ - typedef enum -{ - MB_EX_NONE = 0x00, - MB_EX_ILLEGAL_FUNCTION = 0x01, - MB_EX_ILLEGAL_DATA_ADDRESS = 0x02, - MB_EX_ILLEGAL_DATA_VALUE = 0x03, - MB_EX_SLAVE_DEVICE_FAILURE = 0x04, - MB_EX_ACKNOWLEDGE = 0x05, - MB_EX_SLAVE_BUSY = 0x06, - MB_EX_MEMORY_PARITY_ERROR = 0x08, - MB_EX_GATEWAY_PATH_FAILED = 0x0A, - MB_EX_GATEWAY_TGT_FAILED = 0x0B -} eMBException; - -typedef eMBException( *pxMBFunctionHandler ) ( UCHAR * pucFrame, USHORT * pusLength ); - -typedef struct -{ - UCHAR ucFunctionCode; - pxMBFunctionHandler pxHandler; -} xMBFunctionHandler; - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbproto.h,v 1.14 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_PROTO_H +#define _MB_PROTO_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif +/* ----------------------- Defines ------------------------------------------*/ +#define MB_ADDRESS_BROADCAST ( 0 ) /*! Modbus broadcast address. */ +#define MB_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ +#define MB_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ +#define MB_FUNC_NONE ( 0 ) +#define MB_FUNC_READ_COILS ( 1 ) +#define MB_FUNC_READ_DISCRETE_INPUTS ( 2 ) +#define MB_FUNC_WRITE_SINGLE_COIL ( 5 ) +#define MB_FUNC_WRITE_MULTIPLE_COILS ( 15 ) +#define MB_FUNC_READ_HOLDING_REGISTER ( 3 ) +#define MB_FUNC_READ_INPUT_REGISTER ( 4 ) +#define MB_FUNC_WRITE_REGISTER ( 6 ) +#define MB_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) +#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) +#define MB_FUNC_DIAG_READ_EXCEPTION ( 7 ) +#define MB_FUNC_DIAG_DIAGNOSTIC ( 8 ) +#define MB_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) +#define MB_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) +#define MB_FUNC_OTHER_REPORT_SLAVEID ( 17 ) +#define MB_FUNC_ERROR ( 128 ) +/* ----------------------- Type definitions ---------------------------------*/ + typedef enum +{ + MB_EX_NONE = 0x00, + MB_EX_ILLEGAL_FUNCTION = 0x01, + MB_EX_ILLEGAL_DATA_ADDRESS = 0x02, + MB_EX_ILLEGAL_DATA_VALUE = 0x03, + MB_EX_SLAVE_DEVICE_FAILURE = 0x04, + MB_EX_ACKNOWLEDGE = 0x05, + MB_EX_SLAVE_BUSY = 0x06, + MB_EX_MEMORY_PARITY_ERROR = 0x08, + MB_EX_GATEWAY_PATH_FAILED = 0x0A, + MB_EX_GATEWAY_TGT_FAILED = 0x0B +} eMBException; + +typedef eMBException( *pxMBFunctionHandler ) ( UCHAR * pucFrame, USHORT * pusLength ); + +typedef struct +{ + UCHAR ucFunctionCode; + pxMBFunctionHandler pxHandler; +} xMBFunctionHandler; + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/include/mbutils.h b/modbus/modbus/include/mbutils.h index 55f4334..6149575 100644 --- a/modbus/modbus/include/mbutils.h +++ b/modbus/modbus/include/mbutils.h @@ -1,108 +1,108 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbutils.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_UTILS_H -#define _MB_UTILS_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/*! \defgroup modbus_utils Utilities - * - * This module contains some utility functions which can be used by - * the application. It includes some special functions for working with - * bitfields backed by a character array buffer. - * - */ -/*! \addtogroup modbus_utils - * @{ - */ -/*! \brief Function to set bits in a byte buffer. - * - * This function allows the efficient use of an array to implement bitfields. - * The array used for storing the bits must always be a multiple of two - * bytes. Up to eight bits can be set or cleared in one operation. - * - * \param ucByteBuf A buffer where the bit values are stored. Must be a - * multiple of 2 bytes. No length checking is performed and if - * usBitOffset / 8 is greater than the size of the buffer memory contents - * is overwritten. - * \param usBitOffset The starting address of the bits to set. The first - * bit has the offset 0. - * \param ucNBits Number of bits to modify. The value must always be smaller - * than 8. - * \param ucValues Thew new values for the bits. The value for the first bit - * starting at usBitOffset is the LSB of the value - * ucValues - * - * \code - * ucBits[2] = {0, 0}; - * - * // Set bit 4 to 1 (read: set 1 bit starting at bit offset 4 to value 1) - * xMBUtilSetBits( ucBits, 4, 1, 1 ); - * - * // Set bit 7 to 1 and bit 8 to 0. - * xMBUtilSetBits( ucBits, 7, 2, 0x01 ); - * - * // Set bits 8 - 11 to 0x05 and bits 12 - 15 to 0x0A; - * xMBUtilSetBits( ucBits, 8, 8, 0x5A); - * \endcode - */ -void xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, - UCHAR ucNBits, UCHAR ucValues ); - -/*! \brief Function to read bits in a byte buffer. - * - * This function is used to extract up bit values from an array. Up to eight - * bit values can be extracted in one step. - * - * \param ucByteBuf A buffer where the bit values are stored. - * \param usBitOffset The starting address of the bits to set. The first - * bit has the offset 0. - * \param ucNBits Number of bits to modify. The value must always be smaller - * than 8. - * - * \code - * UCHAR ucBits[2] = {0, 0}; - * UCHAR ucResult; - * - * // Extract the bits 3 - 10. - * ucResult = xMBUtilGetBits( ucBits, 3, 8 ); - * \endcode - */ -UCHAR xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, - UCHAR ucNBits ); - -/*! @} */ - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbutils.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_UTILS_H +#define _MB_UTILS_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif +/*! \defgroup modbus_utils Utilities + * + * This module contains some utility functions which can be used by + * the application. It includes some special functions for working with + * bitfields backed by a character array buffer. + * + */ +/*! \addtogroup modbus_utils + * @{ + */ +/*! \brief Function to set bits in a byte buffer. + * + * This function allows the efficient use of an array to implement bitfields. + * The array used for storing the bits must always be a multiple of two + * bytes. Up to eight bits can be set or cleared in one operation. + * + * \param ucByteBuf A buffer where the bit values are stored. Must be a + * multiple of 2 bytes. No length checking is performed and if + * usBitOffset / 8 is greater than the size of the buffer memory contents + * is overwritten. + * \param usBitOffset The starting address of the bits to set. The first + * bit has the offset 0. + * \param ucNBits Number of bits to modify. The value must always be smaller + * than 8. + * \param ucValues Thew new values for the bits. The value for the first bit + * starting at usBitOffset is the LSB of the value + * ucValues + * + * \code + * ucBits[2] = {0, 0}; + * + * // Set bit 4 to 1 (read: set 1 bit starting at bit offset 4 to value 1) + * xMBUtilSetBits( ucBits, 4, 1, 1 ); + * + * // Set bit 7 to 1 and bit 8 to 0. + * xMBUtilSetBits( ucBits, 7, 2, 0x01 ); + * + * // Set bits 8 - 11 to 0x05 and bits 12 - 15 to 0x0A; + * xMBUtilSetBits( ucBits, 8, 8, 0x5A); + * \endcode + */ +void xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, + UCHAR ucNBits, UCHAR ucValues ); + +/*! \brief Function to read bits in a byte buffer. + * + * This function is used to extract up bit values from an array. Up to eight + * bit values can be extracted in one step. + * + * \param ucByteBuf A buffer where the bit values are stored. + * \param usBitOffset The starting address of the bits to set. The first + * bit has the offset 0. + * \param ucNBits Number of bits to modify. The value must always be smaller + * than 8. + * + * \code + * UCHAR ucBits[2] = {0, 0}; + * UCHAR ucResult; + * + * // Extract the bits 3 - 10. + * ucResult = xMBUtilGetBits( ucBits, 3, 8 ); + * \endcode + */ +UCHAR xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, + UCHAR ucNBits ); + +/*! @} */ + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/mb.c b/modbus/modbus/mb.c index 9d607b5..ea06ddb 100644 --- a/modbus/modbus/mb.c +++ b/modbus/modbus/mb.c @@ -1,413 +1,413 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb.c,v 1.28 2010/06/06 13:54:40 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbfunc.h" - -#include "mbport.h" -#if MB_RTU_ENABLED == 1 -#include "mbrtu.h" -#endif -#if MB_ASCII_ENABLED == 1 -#include "mbascii.h" -#endif -#if MB_TCP_ENABLED == 1 -#include "mbtcp.h" -#endif - -#ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 0 -#endif - -/* ----------------------- Static variables ---------------------------------*/ - -static UCHAR ucMBAddress; -static eMBMode eMBCurrentMode; - -static enum -{ - STATE_ENABLED, - STATE_DISABLED, - STATE_NOT_INITIALIZED -} eMBState = STATE_NOT_INITIALIZED; - -/* Functions pointer which are initialized in eMBInit( ). Depending on the - * mode (RTU or ASCII) the are set to the correct implementations. - */ -static peMBFrameSend peMBFrameSendCur; -static pvMBFrameStart pvMBFrameStartCur; -static pvMBFrameStop pvMBFrameStopCur; -static peMBFrameReceive peMBFrameReceiveCur; -static pvMBFrameClose pvMBFrameCloseCur; - -/* Callback functions required by the porting layer. They are called when - * an external event has happend which includes a timeout or the reception - * or transmission of a character. - */ -BOOL( *pxMBFrameCBByteReceived ) ( void ); -BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); -BOOL( *pxMBPortCBTimerExpired ) ( void ); - -BOOL( *pxMBFrameCBReceiveFSMCur ) ( void ); -BOOL( *pxMBFrameCBTransmitFSMCur ) ( void ); - -/* An array of Modbus functions handlers which associates Modbus function - * codes with implementing functions. - */ -static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = { -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, -#endif -#if MB_FUNC_READ_INPUT_ENABLED > 0 - {MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister}, -#endif -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - {MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister}, -#endif -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_READ_COILS_ENABLED > 0 - {MB_FUNC_READ_COILS, eMBFuncReadCoils}, -#endif -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - {MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils}, -#endif -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 - {MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs}, -#endif -}; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* check preconditions */ - if( ( ucSlaveAddress == MB_ADDRESS_BROADCAST ) || - ( ucSlaveAddress < MB_ADDRESS_MIN ) || ( ucSlaveAddress > MB_ADDRESS_MAX ) ) - { - eStatus = MB_EINVAL; - } - else - { - ucMBAddress = ucSlaveAddress; - - switch ( eMode ) - { -#if MB_RTU_ENABLED > 0 - case MB_RTU: - pvMBFrameStartCur = eMBRTUStart; - pvMBFrameStopCur = eMBRTUStop; - peMBFrameSendCur = eMBRTUSend; - peMBFrameReceiveCur = eMBRTUReceive; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; - pxMBFrameCBByteReceived = xMBRTUReceiveFSM; - pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; - pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; - - eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); - break; -#endif -#if MB_ASCII_ENABLED > 0 - case MB_ASCII: - pvMBFrameStartCur = eMBASCIIStart; - pvMBFrameStopCur = eMBASCIIStop; - peMBFrameSendCur = eMBASCIISend; - peMBFrameReceiveCur = eMBASCIIReceive; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; - pxMBFrameCBByteReceived = xMBASCIIReceiveFSM; - pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM; - pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired; - - eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity ); - break; -#endif - default: - eStatus = MB_EINVAL; - } - - if( eStatus == MB_ENOERR ) - { - if( !xMBPortEventInit( ) ) - { - /* port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - eMBCurrentMode = eMode; - eMBState = STATE_DISABLED; - } - } - } - return eStatus; -} - -#if MB_TCP_ENABLED > 0 -eMBErrorCode -eMBTCPInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( ( eStatus = eMBTCPDoInit( ucTCPPort ) ) != MB_ENOERR ) - { - eMBState = STATE_DISABLED; - } - else if( !xMBPortEventInit( ) ) - { - - /* Port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - pvMBFrameStartCur = eMBTCPStart; - pvMBFrameStopCur = eMBTCPStop; - peMBFrameReceiveCur = eMBTCPReceive; - peMBFrameSendCur = eMBTCPSend; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBTCPPortClose : NULL; - ucMBAddress = MB_TCP_PSEUDO_ADDRESS; - eMBCurrentMode = MB_TCP; - eMBState = STATE_DISABLED; - } - return eStatus; -} -#endif - -eMBErrorCode -eMBRegisterCB( UCHAR ucFunctionCode, pxMBFunctionHandler pxHandler ) -{ - int i; - eMBErrorCode eStatus; - - if( ( 0 < ucFunctionCode ) && ( ucFunctionCode <= 127 ) ) - { - ENTER_CRITICAL_SECTION( ); - if( pxHandler != NULL ) - { - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - if( ( xFuncHandlers[i].pxHandler == NULL ) || - ( xFuncHandlers[i].pxHandler == pxHandler ) ) - { - xFuncHandlers[i].ucFunctionCode = ucFunctionCode; - xFuncHandlers[i].pxHandler = pxHandler; - break; - } - } - eStatus = ( i != MB_FUNC_HANDLERS_MAX ) ? MB_ENOERR : MB_ENORES; - } - else - { - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - xFuncHandlers[i].ucFunctionCode = 0; - xFuncHandlers[i].pxHandler = NULL; - break; - } - } - /* Remove can't fail. */ - eStatus = MB_ENOERR; - } - EXIT_CRITICAL_SECTION( ); - } - else - { - eStatus = MB_EINVAL; - } - return eStatus; -} - - -eMBErrorCode -eMBClose( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - if( pvMBFrameCloseCur != NULL ) - { - pvMBFrameCloseCur( ); - } - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBEnable( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - /* Activate the protocol stack. */ - pvMBFrameStartCur( ); - eMBState = STATE_ENABLED; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBDisable( void ) -{ - eMBErrorCode eStatus; - - if( eMBState == STATE_ENABLED ) - { - pvMBFrameStopCur( ); - eMBState = STATE_DISABLED; - eStatus = MB_ENOERR; - } - else if( eMBState == STATE_DISABLED ) - { - eStatus = MB_ENOERR; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBPoll( void ) -{ - static UCHAR *ucMBFrame; - static UCHAR ucRcvAddress; - static UCHAR ucFunctionCode; - static USHORT usLength; - static eMBException eException; - - int i; - eMBErrorCode eStatus = MB_ENOERR; - eMBEventType eEvent; - - /* Check if the protocol stack is ready. */ - if( eMBState != STATE_ENABLED ) - { - return MB_EILLSTATE; - } - - /* Check if there is a event available. If not return control to caller. - * Otherwise we will handle the event. */ - if( xMBPortEventGet( &eEvent ) == TRUE ) - { - switch ( eEvent ) - { - case EV_READY: - break; - - case EV_FRAME_RECEIVED: - eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength ); - if( eStatus == MB_ENOERR ) - { - /* Check if the frame is for us. If not ignore the frame. */ - if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) - { - ( void )xMBPortEventPost( EV_EXECUTE ); - } - } - break; - - case EV_EXECUTE: - ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; - eException = MB_EX_ILLEGAL_FUNCTION; - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - /* No more function handlers registered. Abort. */ - if( xFuncHandlers[i].ucFunctionCode == 0 ) - { - break; - } - else if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength ); - break; - } - } - - /* If the request was not sent to the broadcast address we - * return a reply. */ - if( ucRcvAddress != MB_ADDRESS_BROADCAST ) - { - if( eException != MB_EX_NONE ) - { - /* An exception occured. Build an error frame. */ - usLength = 0; - ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR ); - ucMBFrame[usLength++] = eException; - } - if( ( eMBCurrentMode == MB_ASCII ) && MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ) - { - vMBPortTimersDelay( MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ); - } - eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength ); - } - break; - - case EV_FRAME_SENT: - break; - } - } - return MB_ENOERR; -} +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mb.c,v 1.28 2010/06/06 13:54:40 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbconfig.h" +#include "mbframe.h" +#include "mbproto.h" +#include "mbfunc.h" + +#include "mbport.h" +#if MB_RTU_ENABLED == 1 +#include "mbrtu.h" +#endif +#if MB_ASCII_ENABLED == 1 +#include "mbascii.h" +#endif +#if MB_TCP_ENABLED == 1 +#include "mbtcp.h" +#endif + +#ifndef MB_PORT_HAS_CLOSE +#define MB_PORT_HAS_CLOSE 0 +#endif + +/* ----------------------- Static variables ---------------------------------*/ + +static UCHAR ucMBAddress; +static eMBMode eMBCurrentMode; + +static enum +{ + STATE_ENABLED, + STATE_DISABLED, + STATE_NOT_INITIALIZED +} eMBState = STATE_NOT_INITIALIZED; + +/* Functions pointer which are initialized in eMBInit( ). Depending on the + * mode (RTU or ASCII) the are set to the correct implementations. + */ +static peMBFrameSend peMBFrameSendCur; +static pvMBFrameStart pvMBFrameStartCur; +static pvMBFrameStop pvMBFrameStopCur; +static peMBFrameReceive peMBFrameReceiveCur; +static pvMBFrameClose pvMBFrameCloseCur; + +/* Callback functions required by the porting layer. They are called when + * an external event has happend which includes a timeout or the reception + * or transmission of a character. + */ +BOOL( *pxMBFrameCBByteReceived ) ( void ); +BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); +BOOL( *pxMBPortCBTimerExpired ) ( void ); + +BOOL( *pxMBFrameCBReceiveFSMCur ) ( void ); +BOOL( *pxMBFrameCBTransmitFSMCur ) ( void ); + +/* An array of Modbus functions handlers which associates Modbus function + * codes with implementing functions. + */ +static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = { +#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 + {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, +#endif +#if MB_FUNC_READ_INPUT_ENABLED > 0 + {MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister}, +#endif +#if MB_FUNC_READ_HOLDING_ENABLED > 0 + {MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister}, +#endif +#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 + {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister}, +#endif +#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 + {MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister}, +#endif +#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 + {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister}, +#endif +#if MB_FUNC_READ_COILS_ENABLED > 0 + {MB_FUNC_READ_COILS, eMBFuncReadCoils}, +#endif +#if MB_FUNC_WRITE_COIL_ENABLED > 0 + {MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil}, +#endif +#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 + {MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils}, +#endif +#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 + {MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs}, +#endif +}; + +/* ----------------------- Start implementation -----------------------------*/ +eMBErrorCode +eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + /* check preconditions */ + if( ( ucSlaveAddress == MB_ADDRESS_BROADCAST ) || + ( ucSlaveAddress < MB_ADDRESS_MIN ) || ( ucSlaveAddress > MB_ADDRESS_MAX ) ) + { + eStatus = MB_EINVAL; + } + else + { + ucMBAddress = ucSlaveAddress; + + switch ( eMode ) + { +#if MB_RTU_ENABLED > 0 + case MB_RTU: + pvMBFrameStartCur = eMBRTUStart; + pvMBFrameStopCur = eMBRTUStop; + peMBFrameSendCur = eMBRTUSend; + peMBFrameReceiveCur = eMBRTUReceive; + pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; + pxMBFrameCBByteReceived = xMBRTUReceiveFSM; + pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; + pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; + + eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); + break; +#endif +#if MB_ASCII_ENABLED > 0 + case MB_ASCII: + pvMBFrameStartCur = eMBASCIIStart; + pvMBFrameStopCur = eMBASCIIStop; + peMBFrameSendCur = eMBASCIISend; + peMBFrameReceiveCur = eMBASCIIReceive; + pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; + pxMBFrameCBByteReceived = xMBASCIIReceiveFSM; + pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM; + pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired; + + eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity ); + break; +#endif + default: + eStatus = MB_EINVAL; + } + + if( eStatus == MB_ENOERR ) + { + if( !xMBPortEventInit( ) ) + { + /* port dependent event module initalization failed. */ + eStatus = MB_EPORTERR; + } + else + { + eMBCurrentMode = eMode; + eMBState = STATE_DISABLED; + } + } + } + return eStatus; +} + +#if MB_TCP_ENABLED > 0 +eMBErrorCode +eMBTCPInit( USHORT ucTCPPort ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if( ( eStatus = eMBTCPDoInit( ucTCPPort ) ) != MB_ENOERR ) + { + eMBState = STATE_DISABLED; + } + else if( !xMBPortEventInit( ) ) + { + + /* Port dependent event module initalization failed. */ + eStatus = MB_EPORTERR; + } + else + { + pvMBFrameStartCur = eMBTCPStart; + pvMBFrameStopCur = eMBTCPStop; + peMBFrameReceiveCur = eMBTCPReceive; + peMBFrameSendCur = eMBTCPSend; + pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBTCPPortClose : NULL; + ucMBAddress = MB_TCP_PSEUDO_ADDRESS; + eMBCurrentMode = MB_TCP; + eMBState = STATE_DISABLED; + } + return eStatus; +} +#endif + +eMBErrorCode +eMBRegisterCB( UCHAR ucFunctionCode, pxMBFunctionHandler pxHandler ) +{ + int i; + eMBErrorCode eStatus; + + if( ( 0 < ucFunctionCode ) && ( ucFunctionCode <= 127 ) ) + { + ENTER_CRITICAL_SECTION( ); + if( pxHandler != NULL ) + { + for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) + { + if( ( xFuncHandlers[i].pxHandler == NULL ) || + ( xFuncHandlers[i].pxHandler == pxHandler ) ) + { + xFuncHandlers[i].ucFunctionCode = ucFunctionCode; + xFuncHandlers[i].pxHandler = pxHandler; + break; + } + } + eStatus = ( i != MB_FUNC_HANDLERS_MAX ) ? MB_ENOERR : MB_ENORES; + } + else + { + for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) + { + if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) + { + xFuncHandlers[i].ucFunctionCode = 0; + xFuncHandlers[i].pxHandler = NULL; + break; + } + } + /* Remove can't fail. */ + eStatus = MB_ENOERR; + } + EXIT_CRITICAL_SECTION( ); + } + else + { + eStatus = MB_EINVAL; + } + return eStatus; +} + + +eMBErrorCode +eMBClose( void ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if( eMBState == STATE_DISABLED ) + { + if( pvMBFrameCloseCur != NULL ) + { + pvMBFrameCloseCur( ); + } + } + else + { + eStatus = MB_EILLSTATE; + } + return eStatus; +} + +eMBErrorCode +eMBEnable( void ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if( eMBState == STATE_DISABLED ) + { + /* Activate the protocol stack. */ + pvMBFrameStartCur( ); + eMBState = STATE_ENABLED; + } + else + { + eStatus = MB_EILLSTATE; + } + return eStatus; +} + +eMBErrorCode +eMBDisable( void ) +{ + eMBErrorCode eStatus; + + if( eMBState == STATE_ENABLED ) + { + pvMBFrameStopCur( ); + eMBState = STATE_DISABLED; + eStatus = MB_ENOERR; + } + else if( eMBState == STATE_DISABLED ) + { + eStatus = MB_ENOERR; + } + else + { + eStatus = MB_EILLSTATE; + } + return eStatus; +} + +eMBErrorCode +eMBPoll( void ) +{ + static UCHAR *ucMBFrame; + static UCHAR ucRcvAddress; + static UCHAR ucFunctionCode; + static USHORT usLength; + static eMBException eException; + + int i; + eMBErrorCode eStatus = MB_ENOERR; + eMBEventType eEvent; + + /* Check if the protocol stack is ready. */ + if( eMBState != STATE_ENABLED ) + { + return MB_EILLSTATE; + } + + /* Check if there is a event available. If not return control to caller. + * Otherwise we will handle the event. */ + if( xMBPortEventGet( &eEvent ) == TRUE ) + { + switch ( eEvent ) + { + case EV_READY: + break; + + case EV_FRAME_RECEIVED: + eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength ); + if( eStatus == MB_ENOERR ) + { + /* Check if the frame is for us. If not ignore the frame. */ + if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) + { + ( void )xMBPortEventPost( EV_EXECUTE ); + } + } + break; + + case EV_EXECUTE: + ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; + eException = MB_EX_ILLEGAL_FUNCTION; + for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) + { + /* No more function handlers registered. Abort. */ + if( xFuncHandlers[i].ucFunctionCode == 0 ) + { + break; + } + else if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) + { + eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength ); + break; + } + } + + /* If the request was not sent to the broadcast address we + * return a reply. */ + if( ucRcvAddress != MB_ADDRESS_BROADCAST ) + { + if( eException != MB_EX_NONE ) + { + /* An exception occured. Build an error frame. */ + usLength = 0; + ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR ); + ucMBFrame[usLength++] = eException; + } + if( ( eMBCurrentMode == MB_ASCII ) && MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ) + { + vMBPortTimersDelay( MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ); + } + eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength ); + } + break; + + case EV_FRAME_SENT: + break; + } + } + return MB_ENOERR; +} diff --git a/modbus/modbus/rtu/mbcrc.c b/modbus/modbus/rtu/mbcrc.c index 6b1a683..29b9ea7 100644 --- a/modbus/modbus/rtu/mbcrc.c +++ b/modbus/modbus/rtu/mbcrc.c @@ -1,98 +1,98 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbcrc.c,v 1.7 2007/02/18 23:50:27 wolti Exp $ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -static const UCHAR aucCRCHi[] = { - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40 -}; - -static const UCHAR aucCRCLo[] = { - 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, - 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, - 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, - 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, - 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, - 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, - 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, - 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, - 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, - 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, - 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, - 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, - 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, - 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, - 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, - 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, - 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, - 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, - 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, - 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, - 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, - 0x41, 0x81, 0x80, 0x40 -}; - -USHORT -usMBCRC16( UCHAR * pucFrame, USHORT usLen ) -{ - UCHAR ucCRCHi = 0xFF; - UCHAR ucCRCLo = 0xFF; - int iIndex; - - while( usLen-- ) - { - iIndex = ucCRCLo ^ *( pucFrame++ ); - ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] ); - ucCRCHi = aucCRCLo[iIndex]; - } - return ( USHORT )( ucCRCHi << 8 | ucCRCLo ); -} +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbcrc.c,v 1.7 2007/02/18 23:50:27 wolti Exp $ + */ + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +static const UCHAR aucCRCHi[] = { + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40 +}; + +static const UCHAR aucCRCLo[] = { + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, + 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, + 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, + 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, + 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, + 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, + 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, + 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, + 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, + 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, + 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, + 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, + 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, + 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, + 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, + 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, + 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, + 0x41, 0x81, 0x80, 0x40 +}; + +USHORT +usMBCRC16( UCHAR * pucFrame, USHORT usLen ) +{ + UCHAR ucCRCHi = 0xFF; + UCHAR ucCRCLo = 0xFF; + int iIndex; + + while( usLen-- ) + { + iIndex = ucCRCLo ^ *( pucFrame++ ); + ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] ); + ucCRCHi = aucCRCLo[iIndex]; + } + return ( USHORT )( ucCRCHi << 8 | ucCRCLo ); +} diff --git a/modbus/modbus/rtu/mbcrc.h b/modbus/modbus/rtu/mbcrc.h index 733503a..db22776 100644 --- a/modbus/modbus/rtu/mbcrc.h +++ b/modbus/modbus/rtu/mbcrc.h @@ -1,36 +1,36 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbcrc.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_CRC_H -#define _MB_CRC_H - -USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen ); - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbcrc.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_CRC_H +#define _MB_CRC_H + +USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen ); + +#endif diff --git a/modbus/modbus/rtu/mbrtu.c b/modbus/modbus/rtu/mbrtu.c index 0ba2d9f..fc9b854 100644 --- a/modbus/modbus/rtu/mbrtu.c +++ b/modbus/modbus/rtu/mbrtu.c @@ -1,355 +1,355 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu.c,v 1.18 2007/09/12 10:15:56 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbrtu.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */ -#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus RTU frame. */ -#define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */ -#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ -#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_RX_INIT, /*!< Receiver is in initial state. */ - STATE_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_RX_RCV, /*!< Frame is beeing received. */ - STATE_RX_ERROR /*!< If the frame is invalid. */ -} eMBRcvState; - -typedef enum -{ - STATE_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_TX_XMIT /*!< Transmitter is in transfer state. */ -} eMBSndState; - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBSndState eSndState; -static volatile eMBRcvState eRcvState; - -volatile UCHAR ucRTUBuf[MB_SER_PDU_SIZE_MAX]; - -static volatile UCHAR *pucSndBufferCur; -static volatile USHORT usSndBufferCount; - -static volatile USHORT usRcvBufferPos; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ULONG usTimerT35_50us; - - ( void )ucSlaveAddress; - ENTER_CRITICAL_SECTION( ); - - /* Modbus RTU uses 8 Databits. */ - if( xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else - { - /* If baudrate > 19200 then we should use the fixed timer values - * t35 = 1750us. Otherwise t35 must be 3.5 times the character time. - */ - if( ulBaudRate > 19200 ) - { - usTimerT35_50us = 35; /* 1800us. */ - } - else - { - /* The timer reload value for a character is given by: - * - * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 ) - * = 11 * Ticks_per_1s / Baudrate - * = 220000 / Baudrate - * The reload for t3.5 is 1.5 times this value and similary - * for t3.5. - */ - usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); - } - if( xMBPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - } - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBRTUStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - /* Initially the receiver is in the state STATE_RX_INIT. we start - * the timer and if no character is received within t3.5 we change - * to STATE_RX_IDLE. This makes sure that we delay startup of the - * modbus protocol stack until the bus is free. - */ - eRcvState = STATE_RX_INIT; - vMBPortSerialEnable( TRUE, FALSE ); - vMBPortTimersEnable( ); - - EXIT_CRITICAL_SECTION( ); -} - -void -eMBRTUStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( FALSE, FALSE ); - vMBPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - BOOL xFrameReceived = FALSE; - eMBErrorCode eStatus = MB_ENOERR; - - ENTER_CRITICAL_SECTION( ); - assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ); - - /* Length and CRC check */ - if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) - && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = ucRTUBuf[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & ucRTUBuf[MB_SER_PDU_PDU_OFF]; - xFrameReceived = TRUE; - } - else - { - eStatus = MB_EIO; - } - - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT usCRC16; - - ENTER_CRITICAL_SECTION( ); - - /* Check if the receiver is still in idle state. If not we where to - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_RX_IDLE ) - { - /* First byte before the Modbus-PDU is the slave address. */ - pucSndBufferCur = ( UCHAR * ) pucFrame - 1; - usSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usSndBufferCount += usLength; - - /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ - usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); - - /* Activate the transmitter. */ - eSndState = STATE_TX_XMIT; - vMBPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -BOOL -xMBRTUReceiveFSM( void ) -{ - BOOL xTaskNeedSwitch = FALSE; - UCHAR ucByte; - - assert( eSndState == STATE_TX_IDLE ); - - /* Always read the character. */ - ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte ); - - switch ( eRcvState ) - { - /* If we have received a character in the init state we have to - * wait until the frame is finished. - */ - case STATE_RX_INIT: - vMBPortTimersEnable( ); - break; - - /* In the error state we wait until all characters in the - * damaged frame are transmitted. - */ - case STATE_RX_ERROR: - vMBPortTimersEnable( ); - break; - - /* In the idle state we wait for a new character. If a character - * is received the t1.5 and t3.5 timers are started and the - * receiver is in the state STATE_RX_RECEIVCE. - */ - case STATE_RX_IDLE: - usRcvBufferPos = 0; - ucRTUBuf[usRcvBufferPos++] = ucByte; - eRcvState = STATE_RX_RCV; - - /* Enable t3.5 timers. */ - vMBPortTimersEnable( ); - break; - - /* We are currently receiving a frame. Reset the timer after - * every character received. If more than the maximum possible - * number of bytes in a modbus frame is received the frame is - * ignored. - */ - case STATE_RX_RCV: - if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - ucRTUBuf[usRcvBufferPos++] = ucByte; - } - else - { - eRcvState = STATE_RX_ERROR; - } - vMBPortTimersEnable( ); - break; - } - return xTaskNeedSwitch; -} - -BOOL -xMBRTUTransmitFSM( void ) -{ - BOOL xNeedPoll = FALSE; - - assert( eRcvState == STATE_RX_IDLE ); - - switch ( eSndState ) - { - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_TX_IDLE: - /* enable receiver/disable transmitter. */ - vMBPortSerialEnable( TRUE, FALSE ); - break; - - case STATE_TX_XMIT: - /* check if we are finished. */ - if( usSndBufferCount != 0 ) - { - xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); - pucSndBufferCur++; /* next byte in sendbuffer. */ - usSndBufferCount--; - } - else - { - xNeedPoll = xMBPortEventPost( EV_FRAME_SENT ); - /* Disable transmitter. This prevents another transmit buffer - * empty interrupt. */ - vMBPortSerialEnable( TRUE, FALSE ); - eSndState = STATE_TX_IDLE; - } - break; - } - - return xNeedPoll; -} - -BOOL -xMBRTUTimerT35Expired( void ) -{ - BOOL xNeedPoll = FALSE; - - switch ( eRcvState ) - { - /* Timer t35 expired. Startup phase is finished. */ - case STATE_RX_INIT: - xNeedPoll = xMBPortEventPost( EV_READY ); - break; - - /* A frame was received and t35 expired. Notify the listener that - * a new frame was received. */ - case STATE_RX_RCV: - xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); - break; - - /* An error occured while receiving the frame. */ - case STATE_RX_ERROR: - break; - - /* Function called in an illegal state. */ - default: - assert( ( eRcvState == STATE_RX_INIT ) || - ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) ); - } - - vMBPortTimersDisable( ); - eRcvState = STATE_RX_IDLE; - - return xNeedPoll; -} +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbrtu.c,v 1.18 2007/09/12 10:15:56 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbrtu.h" +#include "mbframe.h" + +#include "mbcrc.h" +#include "mbport.h" + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */ +#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus RTU frame. */ +#define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */ +#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ +#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ + +/* ----------------------- Type definitions ---------------------------------*/ +typedef enum +{ + STATE_RX_INIT, /*!< Receiver is in initial state. */ + STATE_RX_IDLE, /*!< Receiver is in idle state. */ + STATE_RX_RCV, /*!< Frame is beeing received. */ + STATE_RX_ERROR /*!< If the frame is invalid. */ +} eMBRcvState; + +typedef enum +{ + STATE_TX_IDLE, /*!< Transmitter is in idle state. */ + STATE_TX_XMIT /*!< Transmitter is in transfer state. */ +} eMBSndState; + +/* ----------------------- Static variables ---------------------------------*/ +static volatile eMBSndState eSndState; +static volatile eMBRcvState eRcvState; + +volatile UCHAR ucRTUBuf[MB_SER_PDU_SIZE_MAX]; + +static volatile UCHAR *pucSndBufferCur; +static volatile USHORT usSndBufferCount; + +static volatile USHORT usRcvBufferPos; + +/* ----------------------- Start implementation -----------------------------*/ +eMBErrorCode +eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) +{ + eMBErrorCode eStatus = MB_ENOERR; + ULONG usTimerT35_50us; + + ( void )ucSlaveAddress; + ENTER_CRITICAL_SECTION( ); + + /* Modbus RTU uses 8 Databits. */ + if( xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE ) + { + eStatus = MB_EPORTERR; + } + else + { + /* If baudrate > 19200 then we should use the fixed timer values + * t35 = 1750us. Otherwise t35 must be 3.5 times the character time. + */ + if( ulBaudRate > 19200 ) + { + usTimerT35_50us = 35; /* 1800us. */ + } + else + { + /* The timer reload value for a character is given by: + * + * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 ) + * = 11 * Ticks_per_1s / Baudrate + * = 220000 / Baudrate + * The reload for t3.5 is 1.5 times this value and similary + * for t3.5. + */ + usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); + } + if( xMBPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE ) + { + eStatus = MB_EPORTERR; + } + } + EXIT_CRITICAL_SECTION( ); + + return eStatus; +} + +void +eMBRTUStart( void ) +{ + ENTER_CRITICAL_SECTION( ); + /* Initially the receiver is in the state STATE_RX_INIT. we start + * the timer and if no character is received within t3.5 we change + * to STATE_RX_IDLE. This makes sure that we delay startup of the + * modbus protocol stack until the bus is free. + */ + eRcvState = STATE_RX_INIT; + vMBPortSerialEnable( TRUE, FALSE ); + vMBPortTimersEnable( ); + + EXIT_CRITICAL_SECTION( ); +} + +void +eMBRTUStop( void ) +{ + ENTER_CRITICAL_SECTION( ); + vMBPortSerialEnable( FALSE, FALSE ); + vMBPortTimersDisable( ); + EXIT_CRITICAL_SECTION( ); +} + +eMBErrorCode +eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) +{ + BOOL xFrameReceived = FALSE; + eMBErrorCode eStatus = MB_ENOERR; + + ENTER_CRITICAL_SECTION( ); + assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ); + + /* Length and CRC check */ + if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) + && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) ) + { + /* Save the address field. All frames are passed to the upper layed + * and the decision if a frame is used is done there. + */ + *pucRcvAddress = ucRTUBuf[MB_SER_PDU_ADDR_OFF]; + + /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus + * size of address field and CRC checksum. + */ + *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); + + /* Return the start of the Modbus PDU to the caller. */ + *pucFrame = ( UCHAR * ) & ucRTUBuf[MB_SER_PDU_PDU_OFF]; + xFrameReceived = TRUE; + } + else + { + eStatus = MB_EIO; + } + + EXIT_CRITICAL_SECTION( ); + return eStatus; +} + +eMBErrorCode +eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT usCRC16; + + ENTER_CRITICAL_SECTION( ); + + /* Check if the receiver is still in idle state. If not we where to + * slow with processing the received frame and the master sent another + * frame on the network. We have to abort sending the frame. + */ + if( eRcvState == STATE_RX_IDLE ) + { + /* First byte before the Modbus-PDU is the slave address. */ + pucSndBufferCur = ( UCHAR * ) pucFrame - 1; + usSndBufferCount = 1; + + /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ + pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; + usSndBufferCount += usLength; + + /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ + usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); + ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); + ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); + + /* Activate the transmitter. */ + eSndState = STATE_TX_XMIT; + vMBPortSerialEnable( FALSE, TRUE ); + } + else + { + eStatus = MB_EIO; + } + EXIT_CRITICAL_SECTION( ); + return eStatus; +} + +BOOL +xMBRTUReceiveFSM( void ) +{ + BOOL xTaskNeedSwitch = FALSE; + UCHAR ucByte; + + assert( eSndState == STATE_TX_IDLE ); + + /* Always read the character. */ + ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte ); + + switch ( eRcvState ) + { + /* If we have received a character in the init state we have to + * wait until the frame is finished. + */ + case STATE_RX_INIT: + vMBPortTimersEnable( ); + break; + + /* In the error state we wait until all characters in the + * damaged frame are transmitted. + */ + case STATE_RX_ERROR: + vMBPortTimersEnable( ); + break; + + /* In the idle state we wait for a new character. If a character + * is received the t1.5 and t3.5 timers are started and the + * receiver is in the state STATE_RX_RECEIVCE. + */ + case STATE_RX_IDLE: + usRcvBufferPos = 0; + ucRTUBuf[usRcvBufferPos++] = ucByte; + eRcvState = STATE_RX_RCV; + + /* Enable t3.5 timers. */ + vMBPortTimersEnable( ); + break; + + /* We are currently receiving a frame. Reset the timer after + * every character received. If more than the maximum possible + * number of bytes in a modbus frame is received the frame is + * ignored. + */ + case STATE_RX_RCV: + if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) + { + ucRTUBuf[usRcvBufferPos++] = ucByte; + } + else + { + eRcvState = STATE_RX_ERROR; + } + vMBPortTimersEnable( ); + break; + } + return xTaskNeedSwitch; +} + +BOOL +xMBRTUTransmitFSM( void ) +{ + BOOL xNeedPoll = FALSE; + + assert( eRcvState == STATE_RX_IDLE ); + + switch ( eSndState ) + { + /* We should not get a transmitter event if the transmitter is in + * idle state. */ + case STATE_TX_IDLE: + /* enable receiver/disable transmitter. */ + vMBPortSerialEnable( TRUE, FALSE ); + break; + + case STATE_TX_XMIT: + /* check if we are finished. */ + if( usSndBufferCount != 0 ) + { + xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); + pucSndBufferCur++; /* next byte in sendbuffer. */ + usSndBufferCount--; + } + else + { + xNeedPoll = xMBPortEventPost( EV_FRAME_SENT ); + /* Disable transmitter. This prevents another transmit buffer + * empty interrupt. */ + vMBPortSerialEnable( TRUE, FALSE ); + eSndState = STATE_TX_IDLE; + } + break; + } + + return xNeedPoll; +} + +BOOL +xMBRTUTimerT35Expired( void ) +{ + BOOL xNeedPoll = FALSE; + + switch ( eRcvState ) + { + /* Timer t35 expired. Startup phase is finished. */ + case STATE_RX_INIT: + xNeedPoll = xMBPortEventPost( EV_READY ); + break; + + /* A frame was received and t35 expired. Notify the listener that + * a new frame was received. */ + case STATE_RX_RCV: + xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); + break; + + /* An error occured while receiving the frame. */ + case STATE_RX_ERROR: + break; + + /* Function called in an illegal state. */ + default: + assert( ( eRcvState == STATE_RX_INIT ) || + ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) ); + } + + vMBPortTimersDisable( ); + eRcvState = STATE_RX_IDLE; + + return xNeedPoll; +} diff --git a/modbus/modbus/rtu/mbrtu.h b/modbus/modbus/rtu/mbrtu.h index 084b214..8d8bd1f 100644 --- a/modbus/modbus/rtu/mbrtu.h +++ b/modbus/modbus/rtu/mbrtu.h @@ -1,51 +1,51 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_RTU_H -#define _MB_RTU_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - eMBErrorCode eMBRTUInit( UCHAR slaveAddress, UCHAR ucPort, ULONG ulBaudRate, - eMBParity eParity ); -void eMBRTUStart( void ); -void eMBRTUStop( void ); -eMBErrorCode eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ); -eMBErrorCode eMBRTUSend( UCHAR slaveAddress, const UCHAR * pucFrame, USHORT usLength ); -BOOL xMBRTUReceiveFSM( void ); -BOOL xMBRTUTransmitFSM( void ); -BOOL xMBRTUTimerT15Expired( void ); -BOOL xMBRTUTimerT35Expired( void ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbrtu.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_RTU_H +#define _MB_RTU_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + eMBErrorCode eMBRTUInit( UCHAR slaveAddress, UCHAR ucPort, ULONG ulBaudRate, + eMBParity eParity ); +void eMBRTUStart( void ); +void eMBRTUStop( void ); +eMBErrorCode eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ); +eMBErrorCode eMBRTUSend( UCHAR slaveAddress, const UCHAR * pucFrame, USHORT usLength ); +BOOL xMBRTUReceiveFSM( void ); +BOOL xMBRTUTransmitFSM( void ); +BOOL xMBRTUTimerT15Expired( void ); +BOOL xMBRTUTimerT35Expired( void ); + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbus/tcp/mbtcp.c b/modbus/modbus/tcp/mbtcp.c index eb79a32..fb06144 100644 --- a/modbus/modbus/tcp/mbtcp.c +++ b/modbus/modbus/tcp/mbtcp.c @@ -1,158 +1,158 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbtcp.h" -#include "mbframe.h" -#include "mbport.h" - -#if MB_TCP_ENABLED > 0 - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- MBAP Header --------------------------------------*/ -/* - * - * <------------------------ MODBUS TCP/IP ADU(1) -------------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+------------------------------------------+ - * | TID | PID | Length | UID |Code | Data | - * +-----------+---------------+------------------------------------------+ - * | | | | | - * (2) (3) (4) (5) (6) - * - * (2) ... MB_TCP_TID = 0 (Transaction Identifier - 2 Byte) - * (3) ... MB_TCP_PID = 2 (Protocol Identifier - 2 Byte) - * (4) ... MB_TCP_LEN = 4 (Number of bytes - 2 Byte) - * (5) ... MB_TCP_UID = 6 (Unit Identifier - 1 Byte) - * (6) ... MB_TCP_FUNC = 7 (Modbus Function Code) - * - * (1) ... Modbus TCP/IP Application Data Unit - * (1') ... Modbus Protocol Data Unit - */ - -#define MB_TCP_TID 0 -#define MB_TCP_PID 2 -#define MB_TCP_LEN 4 -#define MB_TCP_UID 6 -#define MB_TCP_FUNC 7 - -#define MB_TCP_PROTOCOL_ID 0 /* 0 = Modbus Protocol */ - - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBTCPDoInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( xMBTCPPortInit( ucTCPPort ) == FALSE ) - { - eStatus = MB_EPORTERR; - } - return eStatus; -} - -void -eMBTCPStart( void ) -{ -} - -void -eMBTCPStop( void ) -{ - /* Make sure that no more clients are connected. */ - vMBTCPPortDisable( ); -} - -eMBErrorCode -eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_EIO; - UCHAR *pucMBTCPFrame; - USHORT usLength; - USHORT usPID; - - if( xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE ) - { - usPID = pucMBTCPFrame[MB_TCP_PID] << 8U; - usPID |= pucMBTCPFrame[MB_TCP_PID + 1]; - - if( usPID == MB_TCP_PROTOCOL_ID ) - { - *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC]; - *pusLength = usLength - MB_TCP_FUNC; - eStatus = MB_ENOERR; - - /* Modbus TCP does not use any addresses. Fake the source address such - * that the processing part deals with this frame. - */ - *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS; - } - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -eMBErrorCode -eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC; - USHORT usTCPLength = usLength + MB_TCP_FUNC; - - /* The MBAP header is already initialized because the caller calls this - * function with the buffer returned by the previous call. Therefore we - * only have to update the length in the header. Note that the length - * header includes the size of the Modbus PDU and the UID Byte. Therefore - * the length is usLength plus one. - */ - pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U; - pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF; - if( xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE ) - { - eStatus = MB_EIO; - } - return eStatus; -} - -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbtcp.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "stdlib.h" +#include "string.h" + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbconfig.h" +#include "mbtcp.h" +#include "mbframe.h" +#include "mbport.h" + +#if MB_TCP_ENABLED > 0 + +/* ----------------------- Defines ------------------------------------------*/ + +/* ----------------------- MBAP Header --------------------------------------*/ +/* + * + * <------------------------ MODBUS TCP/IP ADU(1) -------------------------> + * <----------- MODBUS PDU (1') ----------------> + * +-----------+---------------+------------------------------------------+ + * | TID | PID | Length | UID |Code | Data | + * +-----------+---------------+------------------------------------------+ + * | | | | | + * (2) (3) (4) (5) (6) + * + * (2) ... MB_TCP_TID = 0 (Transaction Identifier - 2 Byte) + * (3) ... MB_TCP_PID = 2 (Protocol Identifier - 2 Byte) + * (4) ... MB_TCP_LEN = 4 (Number of bytes - 2 Byte) + * (5) ... MB_TCP_UID = 6 (Unit Identifier - 1 Byte) + * (6) ... MB_TCP_FUNC = 7 (Modbus Function Code) + * + * (1) ... Modbus TCP/IP Application Data Unit + * (1') ... Modbus Protocol Data Unit + */ + +#define MB_TCP_TID 0 +#define MB_TCP_PID 2 +#define MB_TCP_LEN 4 +#define MB_TCP_UID 6 +#define MB_TCP_FUNC 7 + +#define MB_TCP_PROTOCOL_ID 0 /* 0 = Modbus Protocol */ + + +/* ----------------------- Start implementation -----------------------------*/ +eMBErrorCode +eMBTCPDoInit( USHORT ucTCPPort ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if( xMBTCPPortInit( ucTCPPort ) == FALSE ) + { + eStatus = MB_EPORTERR; + } + return eStatus; +} + +void +eMBTCPStart( void ) +{ +} + +void +eMBTCPStop( void ) +{ + /* Make sure that no more clients are connected. */ + vMBTCPPortDisable( ); +} + +eMBErrorCode +eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength ) +{ + eMBErrorCode eStatus = MB_EIO; + UCHAR *pucMBTCPFrame; + USHORT usLength; + USHORT usPID; + + if( xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE ) + { + usPID = pucMBTCPFrame[MB_TCP_PID] << 8U; + usPID |= pucMBTCPFrame[MB_TCP_PID + 1]; + + if( usPID == MB_TCP_PROTOCOL_ID ) + { + *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC]; + *pusLength = usLength - MB_TCP_FUNC; + eStatus = MB_ENOERR; + + /* Modbus TCP does not use any addresses. Fake the source address such + * that the processing part deals with this frame. + */ + *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS; + } + } + else + { + eStatus = MB_EIO; + } + return eStatus; +} + +eMBErrorCode +eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, USHORT usLength ) +{ + eMBErrorCode eStatus = MB_ENOERR; + UCHAR *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC; + USHORT usTCPLength = usLength + MB_TCP_FUNC; + + /* The MBAP header is already initialized because the caller calls this + * function with the buffer returned by the previous call. Therefore we + * only have to update the length in the header. Note that the length + * header includes the size of the Modbus PDU and the UID Byte. Therefore + * the length is usLength plus one. + */ + pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U; + pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF; + if( xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE ) + { + eStatus = MB_EIO; + } + return eStatus; +} + +#endif diff --git a/modbus/modbus/tcp/mbtcp.h b/modbus/modbus/tcp/mbtcp.h index b4eb3fd..905d113 100644 --- a/modbus/modbus/tcp/mbtcp.h +++ b/modbus/modbus/tcp/mbtcp.h @@ -1,53 +1,53 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.h,v 1.2 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_TCP_H -#define _MB_TCP_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_TCP_PSEUDO_ADDRESS 255 - -/* ----------------------- Function prototypes ------------------------------*/ - eMBErrorCode eMBTCPDoInit( USHORT ucTCPPort ); -void eMBTCPStart( void ); -void eMBTCPStop( void ); -eMBErrorCode eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, - USHORT usLength ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. + * Copyright (c) 2006 Christian Walter + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * File: $Id: mbtcp.h,v 1.2 2006/12/07 22:10:34 wolti Exp $ + */ + +#ifndef _MB_TCP_H +#define _MB_TCP_H + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif + +/* ----------------------- Defines ------------------------------------------*/ +#define MB_TCP_PSEUDO_ADDRESS 255 + +/* ----------------------- Function prototypes ------------------------------*/ + eMBErrorCode eMBTCPDoInit( USHORT ucTCPPort ); +void eMBTCPStart( void ); +void eMBTCPStop( void ); +eMBErrorCode eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, + USHORT * pusLength ); +eMBErrorCode eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, + USHORT usLength ); + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/modbusserial.cpp b/modbus/modbusserial.cpp index 88517dd..4475be3 100644 --- a/modbus/modbusserial.cpp +++ b/modbus/modbusserial.cpp @@ -1,469 +1,469 @@ -#include "modbusserial.h" -#include "InkJetPrinter.h" -#include -#include -#include "LogInfo.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "demo.h" - -/* ----------------------- Defines ------------------------------------------*/ - -//#define REG_INPUT_START 1 -//#define REG_INPUT_NREGS 400 -//#define REG_HOLDING_START 40001 -//#define REG_HOLDING_NREGS 400 -//#define REG_INPUT_START 1000 -//#define REG_INPUT_NREGS 4 -//#define REG_HOLDING_START 2000 -//#define REG_HOLDING_NREGS 130 - -/* ----------------------- Static variables ---------------------------------*/ -//static USHORT usRegInputStart = REG_INPUT_START; -//USHORT* usRegInputBuf; -//static USHORT usRegHoldingStart = REG_HOLDING_START; -//USHORT* usRegHoldingBuf; -void *uart_receive_thread(void *arg); - -ModbusSerial::ModbusSerial(ModbusPrintParas *mPara, const ModbusPrintStatus* mStatus) -{ -#ifdef MODBUS -// const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC }; -// qDebug()<< "modbusserial class\r\n"; - modbus_status = 0; - modbus_up_QRCODE = 0; - port_num = 0; - input_registers = (uint16_t*) mStatus; - holding_registers = (uint16_t*) mPara; - - QProcess process; - process.start("find /dev -name ttyUSB*"); - process.waitForFinished(); - QByteArray output = process.readAllStandardOutput(); - QString str_output = output; - - QString str_tmp; - for(int j = 0; j < str_output.length(); j++) - { - if(str_output[j] > '0' && str_output[j] < '9') - str_tmp.append(str_output[j]); - } - - port_num = str_tmp.toInt(false, 10); - qDebug()<<"port_num="<start(100); -#endif -} - -ModbusSerial::~ModbusSerial(void) -{ -//#ifdef MODBUS -// disconnect(&serial_thread, SIGNAL(started()), this, SLOT(vPollingThread())); -// if (serial_thread.isRunning()) { -// serial_thread.quit(); -// serial_thread.wait(); -// } - ( void )eMBDisable( ); - vSetPollingThreadState( STOPPED ); - ( void )eMBClose(); -//#endif - if(modbus_timer) - { - delete modbus_timer; - } -} - -extern InkJetPrinter *pInkJectPrinter; - -//void ModbusSerial::vPollingThread() -//{ -// Serial_SetPollingThreadState( RUNNING ); -// -// if (modbus_status != 1) { -//// char fileName[100]; -//// memset(fileName, 0, 100); -//// snprintf(fileName, 100, "/home/plg/doc/104.html"); -//// qDebug()<<"fileName:"< '0' && str_output[j] < '9') - str_tmp.append(str_output[j]); - } - port_num = str_tmp.toInt(false, 10); - - if(0 == active_modbus(holding_registers, input_registers, port_num)) - { -// qDebug() << "updateQRcode"; -// modbus_up_QRCODE = true; -// emit updateQRcode(); - qDebug()<< "active_modbus success!\r\n"; - modbus_status = 1; - }else - { - modbus_status = 0; -// qDebug()<< "active_modbus ENOERR!\r\n"; - } - } -// qDebug()<<"ModbusStatus: "<< modbus_status; -// qDebug()<<"PollingThreadState:"<< eGetPollingThreadState( ); - - if(modbus_status == 1) - { - if(holding_registers[0] == PRINT_START_COMMAND) { - holding_registers[0] = NULL_COMMAND; - LogInfo::setRunStatusText(tr("接收到开始打印命令")); - emit startPrint(); - } - else if(holding_registers[0] == PRINT_PAUSE_COMMAND) { - holding_registers[0] = NULL_COMMAND; - LogInfo::setRunStatusText(tr("接收到暂停打印命令")); - emit pausePrint(); - } - else if(holding_registers[0] == PRINT_STOP_COMMAND) { - holding_registers[0] = NULL_COMMAND; - LogInfo::setRunStatusText(tr("接收到停止打印命令")); - emit stopPrint(); - }else if(holding_registers[0] == UPDATE_QRCODE) { - //else if(holding_registers[0] == 34) { - holding_registers[0] = NULL_COMMAND; - input_registers[0] = 0;//sysPara->modbusStatus.printFinishFlag = 0;//置打印标志 - LogInfo::setRunStatusText(tr("接收到DM码数据命令")); - qDebug() << "updateQRcode"; - modbus_up_QRCODE = true; - emit updateQRcode(); - } - } - -} -#endif - -#ifdef __com_485_ -class DevOp; -UCHAR revdata[100]; - -void ModbusSerial::processCommands() -{ - if(revdata[0] == 10) - { - if(revdata[5] == PRINT_START_COMMAND) { - revdata[5] = NULL_COMMAND; - emit startPrint(); - } - else if(revdata[5] == PRINT_PAUSE_COMMAND) { - revdata[5] = NULL_COMMAND; - emit pausePrint(); - } - else if(revdata[5] == PRINT_STOP_COMMAND) { - revdata[5] = NULL_COMMAND; - emit stopPrint(); - }else if(revdata[5] == UPDATE_QRCODE) { - //else if(holding_registers[0] == 34) { - revdata[5] = NULL_COMMAND; - qDebug() << "updateQRcode"; - modbus_up_QRCODE = true; - emit updateQRcode(); - } - } -} - - -void *uart_receive_thread(void *arg) -{ - QByteArray temp; - QByteArray recResponse; - while(1) - { - if(DevOp::comForRFID->isOpen()) - { - //int n = DevOp::comForRFID->write(temp); - //qDebug()<<"power com send "<bytesAvailable(); - if(n>0) - { - //recResponse.append(DevOp::comForRFID->read(n)); - recResponse.clear(); - recResponse = DevOp::comForRFID->read(n); - QString str; - str.sprintf("%d - %d - %d- %d", recResponse.at(0),recResponse.at(1),recResponse.at(2),recResponse.at(5)); - qDebug()<write(temp); - qDebug()<<"write response data"; - } - } - } - //return n; - -} - -#endif - -qint32 ModbusSerial::processCommands(qint32 index) -{ - qint32 rc = 0; - // 打印机指令 - if(index == ((offsetof(ModbusPrintParas, printCommand) + sizeof(uint16_t))/2 - 1)) { // 打印控制 - if(holding_registers[index] == PRINT_START_COMMAND) { - emit startPrint(); - } - else if(holding_registers[index] == PRINT_PAUSE_COMMAND) { - emit pausePrint(); - } - else if(holding_registers[index] == PRINT_STOP_COMMAND) { - emit stopPrint(); - } - } - else if(index == ((offsetof(ModbusPrintParas, QRcode_buf) + 110)/2 - 1)) { // 传送DM码数据 - qDebug() << "updateQRcode"; - modbus_up_QRCODE = true; - emit updateQRcode(); - } - else if(index == ((offsetof(ModbusPrintParas, selectFileName) + 100)/2 - 1)) { // 打开文件 - char fileName[100]; - int fileIndex = offsetof(ModbusPrintParas, selectFileName)/2; - memcpy(fileName, &holding_registers[fileIndex], 100); - //qDebug()<<"oopen file: "<modbus->processCommands(index); -} - -// -//eMBErrorCode -//eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -//{ -// eMBErrorCode eStatus = MB_ENOERR; -// int iRegIndex; -// -// if( ( usAddress >= REG_INPUT_START ) -// && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) -// { -// usRegInputBuf = (USHORT*) pInkJectPrinter->modbus->input_registers; -// iRegIndex = ( int )( usAddress - usRegInputStart ); -// while( usNRegs > 0 ) -// { -// *pucRegBuffer++ = ( unsigned char )(( usRegInputBuf[iRegIndex] >> 8 )& 0xFF); -// *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF ); -// iRegIndex++; -// usNRegs--; -// } -// } -// else -// { -// eStatus = MB_ENOREG; -// } -// -// return eStatus; -//} -// -//eMBErrorCode -//eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) -//{ -// eMBErrorCode eStatus = MB_ENOERR; -// int iRegIndex; -// -// if( ( usAddress >= REG_HOLDING_START ) && -// ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) -// { -// -// usRegHoldingBuf = (USHORT*) pInkJectPrinter->modbus->holding_registers; -// iRegIndex = ( int )( usAddress - usRegHoldingStart ); -// switch ( eMode ) -// { -// /* Pass current register values to the protocol stack. */ -// case MB_REG_READ: -// while( usNRegs > 0 ) -// { -// *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] >> 8 ); -// *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] & 0xFF ); -// iRegIndex++; -// usNRegs--; -// } -// break; -// -// /* Update current register values with new values from the -// * protocol stack. */ -// case MB_REG_WRITE: -// while( usNRegs > 0 ) -// { -// usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; -// usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; -// pInkJectPrinter->modbus->processCommands(iRegIndex); -// iRegIndex++; -// usNRegs--; -// } -// } -// } -// else -// { -// eStatus = MB_ENOREG; -// } -// return eStatus; -//} -// -// -//eMBErrorCode -//eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) -//{ -// Q_UNUSED(pucRegBuffer); -// Q_UNUSED(usAddress); -// Q_UNUSED(usNCoils); -// Q_UNUSED(eMode); -// return MB_ENOREG; -//} -// -//eMBErrorCode -//eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -//{ -// Q_UNUSED(pucRegBuffer); -// Q_UNUSED(usAddress); -// Q_UNUSED(usNDiscrete); -// return MB_ENOREG; -//} - - - +#include "modbusserial.h" +#include "InkJetPrinter.h" +#include +#include +#include "LogInfo.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" +#include "demo.h" + +/* ----------------------- Defines ------------------------------------------*/ + +//#define REG_INPUT_START 1 +//#define REG_INPUT_NREGS 400 +//#define REG_HOLDING_START 40001 +//#define REG_HOLDING_NREGS 400 +//#define REG_INPUT_START 1000 +//#define REG_INPUT_NREGS 4 +//#define REG_HOLDING_START 2000 +//#define REG_HOLDING_NREGS 130 + +/* ----------------------- Static variables ---------------------------------*/ +//static USHORT usRegInputStart = REG_INPUT_START; +//USHORT* usRegInputBuf; +//static USHORT usRegHoldingStart = REG_HOLDING_START; +//USHORT* usRegHoldingBuf; +void *uart_receive_thread(void *arg); + +ModbusSerial::ModbusSerial(ModbusPrintParas *mPara, const ModbusPrintStatus* mStatus) +{ +#ifdef MODBUS +// const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC }; +// qDebug()<< "modbusserial class\r\n"; + modbus_status = 0; + modbus_up_QRCODE = 0; + port_num = 0; + input_registers = (uint16_t*) mStatus; + holding_registers = (uint16_t*) mPara; + + QProcess process; + process.start("find /dev -name ttyUSB*"); + process.waitForFinished(); + QByteArray output = process.readAllStandardOutput(); + QString str_output = output; + + QString str_tmp; + for(int j = 0; j < str_output.length(); j++) + { + if(str_output[j] > '0' && str_output[j] < '9') + str_tmp.append(str_output[j]); + } + + port_num = str_tmp.toInt(false, 10); + qDebug()<<"port_num="<start(100); +#endif +} + +ModbusSerial::~ModbusSerial(void) +{ +//#ifdef MODBUS +// disconnect(&serial_thread, SIGNAL(started()), this, SLOT(vPollingThread())); +// if (serial_thread.isRunning()) { +// serial_thread.quit(); +// serial_thread.wait(); +// } + ( void )eMBDisable( ); + vSetPollingThreadState( STOPPED ); + ( void )eMBClose(); +//#endif + if(modbus_timer) + { + delete modbus_timer; + } +} + +extern InkJetPrinter *pInkJectPrinter; + +//void ModbusSerial::vPollingThread() +//{ +// Serial_SetPollingThreadState( RUNNING ); +// +// if (modbus_status != 1) { +//// char fileName[100]; +//// memset(fileName, 0, 100); +//// snprintf(fileName, 100, "/home/plg/doc/104.html"); +//// qDebug()<<"fileName:"< '0' && str_output[j] < '9') + str_tmp.append(str_output[j]); + } + port_num = str_tmp.toInt(false, 10); + + if(0 == active_modbus(holding_registers, input_registers, port_num)) + { +// qDebug() << "updateQRcode"; +// modbus_up_QRCODE = true; +// emit updateQRcode(); + qDebug()<< "active_modbus success!\r\n"; + modbus_status = 1; + }else + { + modbus_status = 0; +// qDebug()<< "active_modbus ENOERR!\r\n"; + } + } +// qDebug()<<"ModbusStatus: "<< modbus_status; +// qDebug()<<"PollingThreadState:"<< eGetPollingThreadState( ); + + if(modbus_status == 1) + { + if(holding_registers[0] == PRINT_START_COMMAND) { + holding_registers[0] = NULL_COMMAND; + LogInfo::setRunStatusText(tr("接收到开始打印命令")); + emit startPrint(); + } + else if(holding_registers[0] == PRINT_PAUSE_COMMAND) { + holding_registers[0] = NULL_COMMAND; + LogInfo::setRunStatusText(tr("接收到暂停打印命令")); + emit pausePrint(); + } + else if(holding_registers[0] == PRINT_STOP_COMMAND) { + holding_registers[0] = NULL_COMMAND; + LogInfo::setRunStatusText(tr("接收到停止打印命令")); + emit stopPrint(); + }else if(holding_registers[0] == UPDATE_QRCODE) { + //else if(holding_registers[0] == 34) { + holding_registers[0] = NULL_COMMAND; + input_registers[0] = 0;//sysPara->modbusStatus.printFinishFlag = 0;//置打印标志 + LogInfo::setRunStatusText(tr("接收到DM码数据命令")); + qDebug() << "updateQRcode"; + modbus_up_QRCODE = true; + emit updateQRcode(); + } + } + +} +#endif + +#ifdef __com_485_ +class DevOp; +UCHAR revdata[100]; + +void ModbusSerial::processCommands() +{ + if(revdata[0] == 10) + { + if(revdata[5] == PRINT_START_COMMAND) { + revdata[5] = NULL_COMMAND; + emit startPrint(); + } + else if(revdata[5] == PRINT_PAUSE_COMMAND) { + revdata[5] = NULL_COMMAND; + emit pausePrint(); + } + else if(revdata[5] == PRINT_STOP_COMMAND) { + revdata[5] = NULL_COMMAND; + emit stopPrint(); + }else if(revdata[5] == UPDATE_QRCODE) { + //else if(holding_registers[0] == 34) { + revdata[5] = NULL_COMMAND; + qDebug() << "updateQRcode"; + modbus_up_QRCODE = true; + emit updateQRcode(); + } + } +} + + +void *uart_receive_thread(void *arg) +{ + QByteArray temp; + QByteArray recResponse; + while(1) + { + if(DevOp::comForRFID->isOpen()) + { + //int n = DevOp::comForRFID->write(temp); + //qDebug()<<"power com send "<bytesAvailable(); + if(n>0) + { + //recResponse.append(DevOp::comForRFID->read(n)); + recResponse.clear(); + recResponse = DevOp::comForRFID->read(n); + QString str; + str.sprintf("%d - %d - %d- %d", recResponse.at(0),recResponse.at(1),recResponse.at(2),recResponse.at(5)); + qDebug()<write(temp); + qDebug()<<"write response data"; + } + } + } + //return n; + +} + +#endif + +qint32 ModbusSerial::processCommands(qint32 index) +{ + qint32 rc = 0; + // 打印机指令 + if(index == ((offsetof(ModbusPrintParas, printCommand) + sizeof(uint16_t))/2 - 1)) { // 打印控制 + if(holding_registers[index] == PRINT_START_COMMAND) { + emit startPrint(); + } + else if(holding_registers[index] == PRINT_PAUSE_COMMAND) { + emit pausePrint(); + } + else if(holding_registers[index] == PRINT_STOP_COMMAND) { + emit stopPrint(); + } + } + else if(index == ((offsetof(ModbusPrintParas, QRcode_buf) + 110)/2 - 1)) { // 传送DM码数据 + qDebug() << "updateQRcode"; + modbus_up_QRCODE = true; + emit updateQRcode(); + } + else if(index == ((offsetof(ModbusPrintParas, selectFileName) + 100)/2 - 1)) { // 打开文件 + char fileName[100]; + int fileIndex = offsetof(ModbusPrintParas, selectFileName)/2; + memcpy(fileName, &holding_registers[fileIndex], 100); + //qDebug()<<"oopen file: "<modbus->processCommands(index); +} + +// +//eMBErrorCode +//eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) +//{ +// eMBErrorCode eStatus = MB_ENOERR; +// int iRegIndex; +// +// if( ( usAddress >= REG_INPUT_START ) +// && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) +// { +// usRegInputBuf = (USHORT*) pInkJectPrinter->modbus->input_registers; +// iRegIndex = ( int )( usAddress - usRegInputStart ); +// while( usNRegs > 0 ) +// { +// *pucRegBuffer++ = ( unsigned char )(( usRegInputBuf[iRegIndex] >> 8 )& 0xFF); +// *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF ); +// iRegIndex++; +// usNRegs--; +// } +// } +// else +// { +// eStatus = MB_ENOREG; +// } +// +// return eStatus; +//} +// +//eMBErrorCode +//eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) +//{ +// eMBErrorCode eStatus = MB_ENOERR; +// int iRegIndex; +// +// if( ( usAddress >= REG_HOLDING_START ) && +// ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) +// { +// +// usRegHoldingBuf = (USHORT*) pInkJectPrinter->modbus->holding_registers; +// iRegIndex = ( int )( usAddress - usRegHoldingStart ); +// switch ( eMode ) +// { +// /* Pass current register values to the protocol stack. */ +// case MB_REG_READ: +// while( usNRegs > 0 ) +// { +// *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] >> 8 ); +// *pucRegBuffer++ = ( UCHAR ) ( usRegHoldingBuf[iRegIndex] & 0xFF ); +// iRegIndex++; +// usNRegs--; +// } +// break; +// +// /* Update current register values with new values from the +// * protocol stack. */ +// case MB_REG_WRITE: +// while( usNRegs > 0 ) +// { +// usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; +// usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; +// pInkJectPrinter->modbus->processCommands(iRegIndex); +// iRegIndex++; +// usNRegs--; +// } +// } +// } +// else +// { +// eStatus = MB_ENOREG; +// } +// return eStatus; +//} +// +// +//eMBErrorCode +//eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) +//{ +// Q_UNUSED(pucRegBuffer); +// Q_UNUSED(usAddress); +// Q_UNUSED(usNCoils); +// Q_UNUSED(eMode); +// return MB_ENOREG; +//} +// +//eMBErrorCode +//eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) +//{ +// Q_UNUSED(pucRegBuffer); +// Q_UNUSED(usAddress); +// Q_UNUSED(usNDiscrete); +// return MB_ENOREG; +//} + + + diff --git a/modbus/modbusserial.h b/modbus/modbusserial.h index 3f3a873..ba10057 100644 --- a/modbus/modbusserial.h +++ b/modbus/modbusserial.h @@ -1,69 +1,69 @@ -#ifndef MODBUSSERIAL_H -#define MODBUSSERIAL_H -#include -//#include -#include "../SysPara.h" -#include -#include -#include -//#include - -#define PRINT_START_COMMAND 0x01 -#define PRINT_PAUSE_COMMAND 0x02 -#define PRINT_STOP_COMMAND 0x03 -#define UPDATE_QRCODE 0x04 -#define NULL_COMMAND 0x00 -//enum { -// TCP, -// TCP_PI, -// RTU -//}; -//enum ThreadState -//{ -// STOPPED, -// RUNNING, -// SHUTDOWN -//}; - -class ModbusSerial:public QObject -{ - Q_OBJECT -public: - ModbusSerial(ModbusPrintParas *mPara, const ModbusPrintStatus* mStatus); - ~ModbusSerial(); - - uint16_t* input_registers; - uint16_t* holding_registers; - uint8_t modbus_up_QRCODE; -// QThread serial_thread; - -// enum ThreadState Serial_PollThreadState; -// enum ThreadState Serial_GetPollingThreadState(); -// void Serial_SetPollingThreadState( enum ThreadState eNewState ); - qint32 getModbusStatus(); - - -Q_SIGNALS: - void updateQRcode(); - void startPrint(); - void pausePrint(); - void stopPrint(); - void openFile(QString,bool); - void faultResume(); - void writeCalendar(); - void mbLineAndCharSpace(int lineSpace, int charSpace); - -public slots: - //void processCommands(); - qint32 processCommands(qint32 index); -// void vPollingThread(); - -private: - QTimer* modbus_timer; - qint32 modbus_status; - uint16_t port_num; -// QMutex modbusThreadMutex; - -}; -#endif - +#ifndef MODBUSSERIAL_H +#define MODBUSSERIAL_H +#include +//#include +#include "../SysPara.h" +#include +#include +#include +//#include + +#define PRINT_START_COMMAND 0x01 +#define PRINT_PAUSE_COMMAND 0x02 +#define PRINT_STOP_COMMAND 0x03 +#define UPDATE_QRCODE 0x04 +#define NULL_COMMAND 0x00 +//enum { +// TCP, +// TCP_PI, +// RTU +//}; +//enum ThreadState +//{ +// STOPPED, +// RUNNING, +// SHUTDOWN +//}; + +class ModbusSerial:public QObject +{ + Q_OBJECT +public: + ModbusSerial(ModbusPrintParas *mPara, const ModbusPrintStatus* mStatus); + ~ModbusSerial(); + + uint16_t* input_registers; + uint16_t* holding_registers; + uint8_t modbus_up_QRCODE; +// QThread serial_thread; + +// enum ThreadState Serial_PollThreadState; +// enum ThreadState Serial_GetPollingThreadState(); +// void Serial_SetPollingThreadState( enum ThreadState eNewState ); + qint32 getModbusStatus(); + + +Q_SIGNALS: + void updateQRcode(); + void startPrint(); + void pausePrint(); + void stopPrint(); + void openFile(QString,bool); + void faultResume(); + void writeCalendar(); + void mbLineAndCharSpace(int lineSpace, int charSpace); + +public slots: + //void processCommands(); + qint32 processCommands(qint32 index); +// void vPollingThread(); + +private: + QTimer* modbus_timer; + qint32 modbus_status; + uint16_t port_num; +// QMutex modbusThreadMutex; + +}; +#endif + diff --git a/modbus/port/port.h b/modbus/port/port.h index e4cb1d0..9eca4c4 100644 --- a/modbus/port/port.h +++ b/modbus/port/port.h @@ -1,81 +1,81 @@ -/* - * FreeModbus Libary: BSD Socket Library Port - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: port.h,v 1.1 2007/09/12 10:15:56 wolti Exp $ - */ - - /********************************************************** - * Linux TCP support. - * Based on Walter's project. - * Modified by Steven Guo - ***********************************************************/ - -#ifndef _PORT_H -#define _PORT_H - - -#include - -#define INLINE -#define PR_BEGIN_EXTERN_C extern "C" { -#define PR_END_EXTERN_C } - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/* ----------------------- Defines ------------------------------------------*/ -#define ENTER_CRITICAL_SECTION( ) -#define EXIT_CRITICAL_SECTION( ) -#define MB_PORT_HAS_CLOSE 1 -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif -/* ----------------------- Type definitions ---------------------------------*/ -typedef int SOCKET; - -#define SOCKET_ERROR (-1) -#define INVALID_SOCKET (~0) -typedef char BOOL; -typedef unsigned char UCHAR; -typedef unsigned char BYTE; -typedef char CHAR; -typedef unsigned short USHORT; -typedef short SHORT; - -typedef unsigned long ULONG; -typedef long LONG; -typedef enum -{ - MB_LOG_DEBUG, - MB_LOG_INFO, - MB_LOG_WARN, - MB_LOG_ERROR -} eMBPortLogLevel; - -/* ----------------------- Function prototypes ------------------------------*/ - -void TcpvMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, const CHAR * szFmt, - ... ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif +/* + * FreeModbus Libary: BSD Socket Library Port + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: port.h,v 1.1 2007/09/12 10:15:56 wolti Exp $ + */ + + /********************************************************** + * Linux TCP support. + * Based on Walter's project. + * Modified by Steven Guo + ***********************************************************/ + +#ifndef _PORT_H +#define _PORT_H + + +#include + +#define INLINE +#define PR_BEGIN_EXTERN_C extern "C" { +#define PR_END_EXTERN_C } + +#ifdef __cplusplus +PR_BEGIN_EXTERN_C +#endif +/* ----------------------- Defines ------------------------------------------*/ +#define ENTER_CRITICAL_SECTION( ) +#define EXIT_CRITICAL_SECTION( ) +#define MB_PORT_HAS_CLOSE 1 +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +/* ----------------------- Type definitions ---------------------------------*/ +typedef int SOCKET; + +#define SOCKET_ERROR (-1) +#define INVALID_SOCKET (~0) +typedef char BOOL; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; +typedef char CHAR; +typedef unsigned short USHORT; +typedef short SHORT; + +typedef unsigned long ULONG; +typedef long LONG; +typedef enum +{ + MB_LOG_DEBUG, + MB_LOG_INFO, + MB_LOG_WARN, + MB_LOG_ERROR +} eMBPortLogLevel; + +/* ----------------------- Function prototypes ------------------------------*/ + +void TcpvMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, const CHAR * szFmt, + ... ); + +#ifdef __cplusplus +PR_END_EXTERN_C +#endif +#endif diff --git a/modbus/port/portevent.c b/modbus/port/portevent.c index 8350329..ea1acfc 100644 --- a/modbus/port/portevent.c +++ b/modbus/port/portevent.c @@ -1,72 +1,72 @@ -/* - * FreeModbus Libary: Win32 Port - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portevent.c,v 1.1 2007/09/12 10:15:56 wolti Exp $ - */ - - /********************************************************** - * Linux TCP support. - * Based on Walter's project. - * Modified by Steven Guo - ***********************************************************/ - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -/* ----------------------- Variables ----------------------------------------*/ -static eMBEventType eQueuedEvent; -static BOOL xEventInQueue; - -/* ----------------------- Function prototypes ------------------------------*/ -BOOL xMBPortTCPPool( void ); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL -xMBPortEventInit( void ) -{ - xEventInQueue = FALSE; - return TRUE; -} - -BOOL -xMBPortEventPost( eMBEventType eEvent ) -{ - xEventInQueue = TRUE; - eQueuedEvent = eEvent; - return TRUE; -} - -BOOL -xMBPortEventGet( eMBEventType * eEvent ) -{ - BOOL xEventHappened = FALSE; - - if( xEventInQueue ) - { - *eEvent = eQueuedEvent; - xEventInQueue = FALSE; - xEventHappened = TRUE; - } - else - { - /* We can't do anything with errors from the pooling module. */ - ( void )xMBPortTCPPool( ); - } - return xEventHappened; -} +/* + * FreeModbus Libary: Win32 Port + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portevent.c,v 1.1 2007/09/12 10:15:56 wolti Exp $ + */ + + /********************************************************** + * Linux TCP support. + * Based on Walter's project. + * Modified by Steven Guo + ***********************************************************/ + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +/* ----------------------- Variables ----------------------------------------*/ +static eMBEventType eQueuedEvent; +static BOOL xEventInQueue; + +/* ----------------------- Function prototypes ------------------------------*/ +BOOL xMBPortTCPPool( void ); + +/* ----------------------- Start implementation -----------------------------*/ +BOOL +xMBPortEventInit( void ) +{ + xEventInQueue = FALSE; + return TRUE; +} + +BOOL +xMBPortEventPost( eMBEventType eEvent ) +{ + xEventInQueue = TRUE; + eQueuedEvent = eEvent; + return TRUE; +} + +BOOL +xMBPortEventGet( eMBEventType * eEvent ) +{ + BOOL xEventHappened = FALSE; + + if( xEventInQueue ) + { + *eEvent = eQueuedEvent; + xEventInQueue = FALSE; + xEventHappened = TRUE; + } + else + { + /* We can't do anything with errors from the pooling module. */ + ( void )xMBPortTCPPool( ); + } + return xEventHappened; +} diff --git a/modbus/port/portother.c b/modbus/port/portother.c index 8f647a0..94898e8 100644 --- a/modbus/port/portother.c +++ b/modbus/port/portother.c @@ -1,69 +1,69 @@ -/* - * FreeModbus Libary: Win32 Port - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portother.c,v 1.1 2007/09/12 10:15:56 wolti Exp $ - */ - - /********************************************************** - * Linux TCP support. - * Based on Walter's project. - * Modified by Steven Guo - ***********************************************************/ - -#include -#include -#include - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "mbconfig.h" - - -BOOL -prvMBTCPPortAddressToString( SOCKET xSocket, CHAR * szAddr, USHORT usBufSize ) -{ - return TRUE; -} - -CHAR * -prvMBTCPPortFrameToString( UCHAR * pucFrame, USHORT usFrameLen ) -{ - return NULL; -} - -CHAR * -WsaError2String( int iError ) -{ - return NULL; -} - -void -vMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, const CHAR * szFmt, ... ) -{ - va_list args; - static const CHAR *arszLevel2Str[] = { "DEBUG", "INFO", "WARN", "ERROR" }; - - fprintf( stderr, "%s: %s: ", arszLevel2Str[eLevel], szModule ); - - va_start( args, szFmt ); - fprintf( stderr, szFmt, args ); - va_end( args ); -} +/* + * FreeModbus Libary: Win32 Port + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portother.c,v 1.1 2007/09/12 10:15:56 wolti Exp $ + */ + + /********************************************************** + * Linux TCP support. + * Based on Walter's project. + * Modified by Steven Guo + ***********************************************************/ + +#include +#include +#include + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" +#include "mbconfig.h" + + +BOOL +prvMBTCPPortAddressToString( SOCKET xSocket, CHAR * szAddr, USHORT usBufSize ) +{ + return TRUE; +} + +CHAR * +prvMBTCPPortFrameToString( UCHAR * pucFrame, USHORT usFrameLen ) +{ + return NULL; +} + +CHAR * +WsaError2String( int iError ) +{ + return NULL; +} + +void +vMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, const CHAR * szFmt, ... ) +{ + va_list args; + static const CHAR *arszLevel2Str[] = { "DEBUG", "INFO", "WARN", "ERROR" }; + + fprintf( stderr, "%s: %s: ", arszLevel2Str[eLevel], szModule ); + + va_start( args, szFmt ); + fprintf( stderr, szFmt, args ); + va_end( args ); +} diff --git a/modbus/port/portserial.c b/modbus/port/portserial.c index 07b5972..2c2399d 100644 --- a/modbus/port/portserial.c +++ b/modbus/port/portserial.c @@ -1,364 +1,364 @@ -/* - * FreeModbus Libary: Linux Port - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portserial.c,v 1.3 2006/10/12 08:35:34 wolti Exp $ - */ - -/* ----------------------- Standard includes --------------------------------*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "mbconfig.h" - -/* ----------------------- Defines -----------------------------------------*/ -#if MB_ASCII_ENABLED == 1 -#define BUF_SIZE 513 /* must hold a complete ASCII frame. */ -#else -#define BUF_SIZE 256 /* must hold a complete RTU frame. */ -#endif - -/* ----------------------- Static variables ---------------------------------*/ -static int iSerialFd = -1; -static BOOL bRxEnabled; -static BOOL bTxEnabled; - -static ULONG ulTimeoutMs; -static UCHAR ucBuffer[BUF_SIZE]; -static int uiRxBufferPos; -static int uiTxBufferPos; - -static struct termios xOldTIO; - -/* ----------------------- Function prototypes ------------------------------*/ -static BOOL prvbMBPortSerialRead( UCHAR * pucBuffer, USHORT usNBytes, USHORT * usNBytesRead ); -static BOOL prvbMBPortSerialWrite( UCHAR * pucBuffer, USHORT usNBytes ); - -/* ----------------------- Begin implementation -----------------------------*/ -void -vMBPortSerialEnable( BOOL bEnableRx, BOOL bEnableTx ) -{ - /* it is not allowed that both receiver and transmitter are enabled. */ - assert( !bEnableRx || !bEnableTx ); - - if( bEnableRx ) - { - ( void )tcflush( iSerialFd, TCIFLUSH ); - uiRxBufferPos = 0; - bRxEnabled = TRUE; - } - else - { - bRxEnabled = FALSE; - } - if( bEnableTx ) - { - bTxEnabled = TRUE; - uiTxBufferPos = 0; - } - else - { - bTxEnabled = FALSE; - } -} - -BOOL -xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ) -{ - CHAR szDevice[16]; - BOOL bStatus = TRUE; - - struct termios xNewTIO; - speed_t xNewSpeed; - - //snprintf( szDevice, 16, "/dev/ttyUSB%d", ucPort ); - snprintf( szDevice, 16, "/dev/ttyO1"); - - if( ( iSerialFd = open( szDevice, O_RDWR | O_NOCTTY ) ) < 0 ) - { - vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't open serial port %s: %s\n", szDevice, - strerror( errno ) ); - bStatus = FALSE; - return bStatus; - } - else if( tcgetattr( iSerialFd, &xOldTIO ) != 0 ) - { - vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't get settings from port %s: %s\n", szDevice, - strerror( errno ) ); - } - else - { - bzero( &xNewTIO, sizeof( struct termios ) ); - - xNewTIO.c_iflag |= IGNBRK | INPCK; - xNewTIO.c_cflag |= CREAD | CLOCAL; - switch ( eParity ) - { - case MB_PAR_NONE: - break; - case MB_PAR_EVEN: - xNewTIO.c_cflag |= PARENB; - break; - case MB_PAR_ODD: - xNewTIO.c_cflag |= PARENB | PARODD; - break; - default: - bStatus = FALSE; - } - switch ( ucDataBits ) - { - case 8: - xNewTIO.c_cflag |= CS8; - break; - case 7: - xNewTIO.c_cflag |= CS7; - break; - default: - bStatus = FALSE; - } - switch ( ulBaudRate ) - { - case 9600: - xNewSpeed = B9600; - break; - case 19200: - xNewSpeed = B19200; - break; - case 38400: - xNewSpeed = B38400; - break; - case 57600: - xNewSpeed = B57600; - break; - case 115200: - xNewSpeed = B115200; - break; - default: - bStatus = FALSE; - } - /*设置等待时间和最小接收字符*/ - xNewTIO.c_cc[VTIME] = 0; - xNewTIO.c_cc[VMIN] = 0; - /*处理未接收字符*/ - tcflush(iSerialFd,TCIFLUSH); //lch add - if( bStatus ) - { - if( cfsetispeed( &xNewTIO, xNewSpeed ) != 0 ) - { - vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't set baud rate %ld for port %s: %s\n", - ulBaudRate, strerror( errno ) ); - } - else if( cfsetospeed( &xNewTIO, xNewSpeed ) != 0 ) - { - vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't set baud rate %ld for port %s: %s\n", - ulBaudRate, szDevice, strerror( errno ) ); - } - else if( tcsetattr( iSerialFd, TCSANOW, &xNewTIO ) != 0 ) - //else if( tcsetattr( iSerialFd, TCSAFLUSH, &xNewTIO ) != 0 ) //lch fix - { - vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't set settings for port %s: %s\n", - szDevice, strerror( errno ) ); - } - else - { - vMBPortSerialEnable( FALSE, FALSE ); - bStatus = TRUE; - } - } - } - return bStatus; -} - -BOOL -xMBPortSerialSetTimeout( ULONG ulNewTimeoutMs ) -{ - if( ulNewTimeoutMs > 0 ) - { - ulTimeoutMs = ulNewTimeoutMs; - } - else - { - ulTimeoutMs = 1; - } - return TRUE; -} - -void -vMBPortClose( void ) -{ - if( iSerialFd != -1 ) - { - ( void )tcsetattr( iSerialFd, TCSANOW, &xOldTIO ); - ( void )close( iSerialFd ); - iSerialFd = -1; - } -} - -BOOL -prvbMBPortSerialRead( UCHAR * pucBuffer, USHORT usNBytes, USHORT * usNBytesRead ) -{ - BOOL bResult = TRUE; - ssize_t res; - fd_set rfds; - struct timeval tv; - -// tv.tv_sec = 1; -// tv.tv_usec = 60000; - tv.tv_sec = 0; - tv.tv_usec = 10000; //lch fix - - FD_ZERO( &rfds ); - FD_SET( iSerialFd, &rfds ); - - /* Wait until character received or timeout. Recover in case of an - * interrupted read system call. */ - do - { - if( select( iSerialFd + 1, &rfds, NULL, NULL, &tv ) == -1 ) - { - if( errno != EINTR ) - { - bResult = FALSE; - } - } - else if( FD_ISSET( iSerialFd, &rfds ) ) - { - if( ( res = read( iSerialFd, pucBuffer, usNBytes ) ) == -1 ) - { - bResult = FALSE; - } - else - { - *usNBytesRead = ( USHORT ) res; - break; - } - } - else - { - *usNBytesRead = 0; - break; - } - } - while( bResult == TRUE ); - return bResult; -} - -BOOL -prvbMBPortSerialWrite( UCHAR * pucBuffer, USHORT usNBytes ) -{ - ssize_t res; - size_t left = ( size_t ) usNBytes; - size_t done = 0; - - while( left > 0 ) - { - if( ( res = write( iSerialFd, pucBuffer + done, left ) ) == -1 ) - { - if( errno != EINTR ) - { - break; - } - /* call write again because of interrupted system call. */ - continue; - } - done += res; - left -= res; - } - return left == 0 ? TRUE : FALSE; -} - -BOOL -xMBPortSerialPoll( ) -{ - BOOL bStatus = TRUE; - USHORT usBytesRead; - int i; - - while( bRxEnabled ) - { - if( prvbMBPortSerialRead( &ucBuffer[0], BUF_SIZE, &usBytesRead ) ) - { - if( usBytesRead == 0 ) - { - /* timeout with no bytes. */ - break; - } - else if( usBytesRead > 0 ) - { - for( i = 0; i < usBytesRead; i++ ) - { - /* Call the modbus stack and let him fill the buffers. */ - ( void )pxMBFrameCBByteReceived( ); - } - uiRxBufferPos = 0; - } - } - else - { - vMBPortLog( MB_LOG_ERROR, "SER-POLL", "read failed on serial device: %s\n", - strerror( errno ) ); - bStatus = FALSE; - } - } - if( bTxEnabled ) - { - while( bTxEnabled ) - { - ( void )pxMBFrameCBTransmitterEmpty( ); - /* Call the modbus stack to let him fill the buffer. */ - } - if( !prvbMBPortSerialWrite( &ucBuffer[0], uiTxBufferPos ) ) - { - vMBPortLog( MB_LOG_ERROR, "SER-POLL", "write failed on serial device: %s\n", - strerror( errno ) ); - bStatus = FALSE; - } - } - - return bStatus; -} - -BOOL -xMBPortSerialPutByte( CHAR ucByte ) -{ - assert( uiTxBufferPos < BUF_SIZE ); - ucBuffer[uiTxBufferPos] = ucByte; - uiTxBufferPos++; - return TRUE; -} - -BOOL -xMBPortSerialGetByte( CHAR * pucByte ) -{ - assert( uiRxBufferPos < BUF_SIZE ); - *pucByte = ucBuffer[uiRxBufferPos]; - uiRxBufferPos++; - return TRUE; -} +/* + * FreeModbus Libary: Linux Port + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portserial.c,v 1.3 2006/10/12 08:35:34 wolti Exp $ + */ + +/* ----------------------- Standard includes --------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" +#include "mbconfig.h" + +/* ----------------------- Defines -----------------------------------------*/ +#if MB_ASCII_ENABLED == 1 +#define BUF_SIZE 513 /* must hold a complete ASCII frame. */ +#else +#define BUF_SIZE 256 /* must hold a complete RTU frame. */ +#endif + +/* ----------------------- Static variables ---------------------------------*/ +static int iSerialFd = -1; +static BOOL bRxEnabled; +static BOOL bTxEnabled; + +static ULONG ulTimeoutMs; +static UCHAR ucBuffer[BUF_SIZE]; +static int uiRxBufferPos; +static int uiTxBufferPos; + +static struct termios xOldTIO; + +/* ----------------------- Function prototypes ------------------------------*/ +static BOOL prvbMBPortSerialRead( UCHAR * pucBuffer, USHORT usNBytes, USHORT * usNBytesRead ); +static BOOL prvbMBPortSerialWrite( UCHAR * pucBuffer, USHORT usNBytes ); + +/* ----------------------- Begin implementation -----------------------------*/ +void +vMBPortSerialEnable( BOOL bEnableRx, BOOL bEnableTx ) +{ + /* it is not allowed that both receiver and transmitter are enabled. */ + assert( !bEnableRx || !bEnableTx ); + + if( bEnableRx ) + { + ( void )tcflush( iSerialFd, TCIFLUSH ); + uiRxBufferPos = 0; + bRxEnabled = TRUE; + } + else + { + bRxEnabled = FALSE; + } + if( bEnableTx ) + { + bTxEnabled = TRUE; + uiTxBufferPos = 0; + } + else + { + bTxEnabled = FALSE; + } +} + +BOOL +xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ) +{ + CHAR szDevice[16]; + BOOL bStatus = TRUE; + + struct termios xNewTIO; + speed_t xNewSpeed; + + //snprintf( szDevice, 16, "/dev/ttyUSB%d", ucPort ); + snprintf( szDevice, 16, "/dev/ttyO1"); + + if( ( iSerialFd = open( szDevice, O_RDWR | O_NOCTTY ) ) < 0 ) + { + vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't open serial port %s: %s\n", szDevice, + strerror( errno ) ); + bStatus = FALSE; + return bStatus; + } + else if( tcgetattr( iSerialFd, &xOldTIO ) != 0 ) + { + vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't get settings from port %s: %s\n", szDevice, + strerror( errno ) ); + } + else + { + bzero( &xNewTIO, sizeof( struct termios ) ); + + xNewTIO.c_iflag |= IGNBRK | INPCK; + xNewTIO.c_cflag |= CREAD | CLOCAL; + switch ( eParity ) + { + case MB_PAR_NONE: + break; + case MB_PAR_EVEN: + xNewTIO.c_cflag |= PARENB; + break; + case MB_PAR_ODD: + xNewTIO.c_cflag |= PARENB | PARODD; + break; + default: + bStatus = FALSE; + } + switch ( ucDataBits ) + { + case 8: + xNewTIO.c_cflag |= CS8; + break; + case 7: + xNewTIO.c_cflag |= CS7; + break; + default: + bStatus = FALSE; + } + switch ( ulBaudRate ) + { + case 9600: + xNewSpeed = B9600; + break; + case 19200: + xNewSpeed = B19200; + break; + case 38400: + xNewSpeed = B38400; + break; + case 57600: + xNewSpeed = B57600; + break; + case 115200: + xNewSpeed = B115200; + break; + default: + bStatus = FALSE; + } + /*设置等待时间和最小接收字符*/ + xNewTIO.c_cc[VTIME] = 0; + xNewTIO.c_cc[VMIN] = 0; + /*处理未接收字符*/ + tcflush(iSerialFd,TCIFLUSH); //lch add + if( bStatus ) + { + if( cfsetispeed( &xNewTIO, xNewSpeed ) != 0 ) + { + vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't set baud rate %ld for port %s: %s\n", + ulBaudRate, strerror( errno ) ); + } + else if( cfsetospeed( &xNewTIO, xNewSpeed ) != 0 ) + { + vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't set baud rate %ld for port %s: %s\n", + ulBaudRate, szDevice, strerror( errno ) ); + } + else if( tcsetattr( iSerialFd, TCSANOW, &xNewTIO ) != 0 ) + //else if( tcsetattr( iSerialFd, TCSAFLUSH, &xNewTIO ) != 0 ) //lch fix + { + vMBPortLog( MB_LOG_ERROR, "SER-INIT", "Can't set settings for port %s: %s\n", + szDevice, strerror( errno ) ); + } + else + { + vMBPortSerialEnable( FALSE, FALSE ); + bStatus = TRUE; + } + } + } + return bStatus; +} + +BOOL +xMBPortSerialSetTimeout( ULONG ulNewTimeoutMs ) +{ + if( ulNewTimeoutMs > 0 ) + { + ulTimeoutMs = ulNewTimeoutMs; + } + else + { + ulTimeoutMs = 1; + } + return TRUE; +} + +void +vMBPortClose( void ) +{ + if( iSerialFd != -1 ) + { + ( void )tcsetattr( iSerialFd, TCSANOW, &xOldTIO ); + ( void )close( iSerialFd ); + iSerialFd = -1; + } +} + +BOOL +prvbMBPortSerialRead( UCHAR * pucBuffer, USHORT usNBytes, USHORT * usNBytesRead ) +{ + BOOL bResult = TRUE; + ssize_t res; + fd_set rfds; + struct timeval tv; + +// tv.tv_sec = 1; +// tv.tv_usec = 60000; + tv.tv_sec = 0; + tv.tv_usec = 10000; //lch fix + + FD_ZERO( &rfds ); + FD_SET( iSerialFd, &rfds ); + + /* Wait until character received or timeout. Recover in case of an + * interrupted read system call. */ + do + { + if( select( iSerialFd + 1, &rfds, NULL, NULL, &tv ) == -1 ) + { + if( errno != EINTR ) + { + bResult = FALSE; + } + } + else if( FD_ISSET( iSerialFd, &rfds ) ) + { + if( ( res = read( iSerialFd, pucBuffer, usNBytes ) ) == -1 ) + { + bResult = FALSE; + } + else + { + *usNBytesRead = ( USHORT ) res; + break; + } + } + else + { + *usNBytesRead = 0; + break; + } + } + while( bResult == TRUE ); + return bResult; +} + +BOOL +prvbMBPortSerialWrite( UCHAR * pucBuffer, USHORT usNBytes ) +{ + ssize_t res; + size_t left = ( size_t ) usNBytes; + size_t done = 0; + + while( left > 0 ) + { + if( ( res = write( iSerialFd, pucBuffer + done, left ) ) == -1 ) + { + if( errno != EINTR ) + { + break; + } + /* call write again because of interrupted system call. */ + continue; + } + done += res; + left -= res; + } + return left == 0 ? TRUE : FALSE; +} + +BOOL +xMBPortSerialPoll( ) +{ + BOOL bStatus = TRUE; + USHORT usBytesRead; + int i; + + while( bRxEnabled ) + { + if( prvbMBPortSerialRead( &ucBuffer[0], BUF_SIZE, &usBytesRead ) ) + { + if( usBytesRead == 0 ) + { + /* timeout with no bytes. */ + break; + } + else if( usBytesRead > 0 ) + { + for( i = 0; i < usBytesRead; i++ ) + { + /* Call the modbus stack and let him fill the buffers. */ + ( void )pxMBFrameCBByteReceived( ); + } + uiRxBufferPos = 0; + } + } + else + { + vMBPortLog( MB_LOG_ERROR, "SER-POLL", "read failed on serial device: %s\n", + strerror( errno ) ); + bStatus = FALSE; + } + } + if( bTxEnabled ) + { + while( bTxEnabled ) + { + ( void )pxMBFrameCBTransmitterEmpty( ); + /* Call the modbus stack to let him fill the buffer. */ + } + if( !prvbMBPortSerialWrite( &ucBuffer[0], uiTxBufferPos ) ) + { + vMBPortLog( MB_LOG_ERROR, "SER-POLL", "write failed on serial device: %s\n", + strerror( errno ) ); + bStatus = FALSE; + } + } + + return bStatus; +} + +BOOL +xMBPortSerialPutByte( CHAR ucByte ) +{ + assert( uiTxBufferPos < BUF_SIZE ); + ucBuffer[uiTxBufferPos] = ucByte; + uiTxBufferPos++; + return TRUE; +} + +BOOL +xMBPortSerialGetByte( CHAR * pucByte ) +{ + assert( uiRxBufferPos < BUF_SIZE ); + *pucByte = ucBuffer[uiRxBufferPos]; + uiRxBufferPos++; + return TRUE; +} diff --git a/modbus/port/porttcp.c b/modbus/port/porttcp.c index 43df2b6..c193e07 100644 --- a/modbus/port/porttcp.c +++ b/modbus/port/porttcp.c @@ -1,385 +1,385 @@ -/* - * FreeModbus Libary: Win32 Port - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: porttcp.c,v 1.1 2007/09/12 10:15:56 wolti Exp $ - */ - -/* - * Design Notes: - * - * The xMBPortTCPInit function allocates a socket and binds the socket to - * all available interfaces ( bind with INADDR_ANY ). In addition it - * creates an array of event objects which is used to check the state of - * the clients. On event object is used to handle new connections or - * closed ones. The other objects are used on a per client basis for - * processing. - */ - - /********************************************************** - * Linux TCP support. - * Based on Walter's project. - * Modified by Steven Guo - ***********************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -//#include - -/* ----------------------- MBAP Header --------------------------------------*/ -#define MB_TCP_UID 6 -#define MB_TCP_LEN 4 -#define MB_TCP_FUNC 7 - -/* ----------------------- Defines -----------------------------------------*/ -#define MB_TCP_DEFAULT_PORT 5022//5022 /* TCP listening port. */ -#define MB_TCP_POOL_TIMEOUT 50 /* pool timeout for event waiting. */ -#define MB_TCP_READ_TIMEOUT 1000 /* Maximum timeout to wait for packets. */ -#define MB_TCP_READ_CYCLE 100 /* Time between checking for new data. */ - -#define MB_TCP_DEBUG 1 /* Set to 1 for additional debug output. */ - -#define MB_TCP_BUF_SIZE ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */ - -#define EV_CONNECTION 0 -#define EV_CLIENT 1 -#define EV_NEVENTS EV_CLIENT + 1 - -/* ----------------------- Static variables ---------------------------------*/ -SOCKET xListenSocket; -SOCKET xClientSocket = INVALID_SOCKET; -static fd_set allset; - -static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE]; -static USHORT usTCPBufPos; -static USHORT usTCPFrameBytesLeft; - -/* ----------------------- External functions -------------------------------*/ -CHAR *WsaError2String( int dwError ); - -/* ----------------------- Static functions ---------------------------------*/ -BOOL prvMBTCPPortAddressToString( SOCKET xSocket, CHAR * szAddr, USHORT usBufSize ); -CHAR *prvMBTCPPortFrameToString( UCHAR * pucFrame, USHORT usFrameLen ); -static BOOL prvbMBPortAcceptClient( void ); -static void prvvMBPortReleaseClient( void ); -//static QTcpServer qListenSocket; - -/* ----------------------- Begin implementation -----------------------------*/ - -BOOL -xMBTCPPortInit( USHORT usTCPPort ) -{ - USHORT usPort; - struct sockaddr_in serveraddr; - int tmp = 1; - - if( usTCPPort == 0 ) - { - usPort = MB_TCP_DEFAULT_PORT; - } - else - { - usPort = ( USHORT ) usTCPPort; - } - memset( &serveraddr, 0, sizeof( serveraddr ) ); - serveraddr.sin_family = AF_INET; - serveraddr.sin_addr.s_addr = htonl( INADDR_ANY ); - serveraddr.sin_port = htons( usPort ); - if( ( xListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == -1 ) - { - fprintf( stderr, "Create socket failed.\r\n" ); - return FALSE; - } - if(setsockopt(xListenSocket, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(int))<0) - { - fprintf( stderr, "setsockopt socket failed.\r\n" ); - return FALSE; - } - if( bind( xListenSocket, ( struct sockaddr * )&serveraddr, sizeof( serveraddr ) ) == -1 ) - { - fprintf( stderr, "Bind socket failed.\r\n" ); - return FALSE; - } - else if( listen( xListenSocket, 1 ) == -1 ) - { - fprintf( stderr, "Listen socket failed.\r\n" ); - return FALSE; - } - FD_ZERO( &allset ); - FD_SET( xListenSocket, &allset ); - return TRUE; -} - -void -vMBTCPPortClose( ) -{ - // Close all client sockets. - if( xClientSocket != SOCKET_ERROR ) - { - prvvMBPortReleaseClient( ); - } - // Close the listener socket. - if( xListenSocket != SOCKET_ERROR ) - { - close( xListenSocket ); - } -} - -void -vMBTCPPortDisable( void ) -{ - /* Close all client sockets. */ - if( xClientSocket != SOCKET_ERROR ) - { - prvvMBPortReleaseClient( ); - } -} - -/*! \ingroup port_win32tcp - * - * \brief Pool the listening socket and currently connected Modbus TCP clients - * for new events. - * \internal - * - * This function checks if new clients want to connect or if already connected - * clients are sending requests. If a new client is connected and there are - * still client slots left (The current implementation supports only one) - * then the connection is accepted and an event object for the new client - * socket is activated (See prvbMBPortAcceptClient() ). - * Events for already existing clients in \c FD_READ and \c FD_CLOSE. In case of - * an \c FD_CLOSE the client connection is released (See prvvMBPortReleaseClient() ). - * In case of an \c FD_READ command the existing data is read from the client - * and if a complete frame has been received the Modbus Stack is notified. - * - * \return FALSE in case of an internal I/O error. For example if the internal - * event objects are in an invalid state. Note that this does not include any - * client errors. In all other cases returns TRUE. - */ -int errorCount = 0; - -BOOL -xMBPortTCPPool( void ) -{ - int n; - fd_set fread; - struct timeval tval; - - tval.tv_sec = 1; - tval.tv_usec = 60000; - int ret; - USHORT usLength; - - if( xClientSocket == INVALID_SOCKET ) - { - /* Accept to client */ - if( ( n = select( xListenSocket + 1, &allset, NULL, NULL, NULL ) ) < 0 ) - { - if( errno == EINTR ) - { - ; - } - else - { - ; - } - } - if( FD_ISSET( xListenSocket, &allset ) ) - { - ( void )prvbMBPortAcceptClient( ); - } - } - - while( TRUE ) - { - FD_ZERO( &fread ); - FD_SET( xClientSocket, &fread ); - if( ( ( ret = select( xClientSocket + 1, &fread, NULL, NULL, &tval ) ) == SOCKET_ERROR ) - || !ret ) - { - sleep(1); - errorCount++; - if(errorCount > 10) - { - errorCount = 0; - close( xClientSocket ); - xClientSocket = INVALID_SOCKET; - return TRUE; - } - continue; - } - if( ret > 0 ) - { - if( FD_ISSET( xClientSocket, &fread ) ) - { - if( ( ( ret = - recv( xClientSocket, &aucTCPBuf[usTCPBufPos], usTCPFrameBytesLeft, - 0 ) ) == SOCKET_ERROR ) || ( !ret ) ) - { - close( xClientSocket ); - xClientSocket = INVALID_SOCKET; - return TRUE; - } - usTCPBufPos += ret; - usTCPFrameBytesLeft -= ret; - if( usTCPBufPos >= MB_TCP_FUNC ) - { - /* Length is a byte count of Modbus PDU (function code + data) and the - * unit identifier. */ - usLength = aucTCPBuf[MB_TCP_LEN] << 8U; - usLength |= aucTCPBuf[MB_TCP_LEN + 1]; - - /* Is the frame already complete. */ - if( usTCPBufPos < ( MB_TCP_UID + usLength ) ) - { - usTCPFrameBytesLeft = usLength + MB_TCP_UID - usTCPBufPos; - } - /* The frame is complete. */ - else if( usTCPBufPos == ( MB_TCP_UID + usLength ) ) - { - ( void )xMBPortEventPost( EV_FRAME_RECEIVED ); - return TRUE; - } - /* This can not happend because we always calculate the number of bytes - * to receive. */ - else - { - assert( usTCPBufPos <= ( MB_TCP_UID + usLength ) ); - } - } - } - } - } - return TRUE; -} - -/*! - * \ingroup port_win32tcp - * \brief Receives parts of a Modbus TCP frame and if complete notifies - * the protocol stack. - * \internal - * - * This function reads a complete Modbus TCP frame from the protocol stack. - * It starts by reading the header with an initial request size for - * usTCPFrameBytesLeft = MB_TCP_FUNC. If the header is complete the - * number of bytes left can be calculated from it (See Length in MBAP header). - * Further read calls are issued until the frame is complete. - * - * \return \c TRUE if part of a Modbus TCP frame could be processed. In case - * of a communication error the function returns \c FALSE. - */ - -BOOL -xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength ) -{ - *ppucMBTCPFrame = &aucTCPBuf[0]; - *usTCPLength = usTCPBufPos; - - /* Reset the buffer. */ - usTCPBufPos = 0; - usTCPFrameBytesLeft = MB_TCP_FUNC; - return TRUE; -} - -BOOL -xMBTCPPortSendResponse( const UCHAR * pucMBTCPFrame, USHORT usTCPLength ) -{ - BOOL bFrameSent = FALSE; - BOOL bAbort = FALSE; - int res; - int iBytesSent = 0; - int iTimeOut = MB_TCP_READ_TIMEOUT; - - do - { - res = send( xClientSocket, &pucMBTCPFrame[iBytesSent], usTCPLength - iBytesSent, 0 ); - switch ( res ) - { - case -1: - if( iTimeOut > 0 ) - { - iTimeOut -= MB_TCP_READ_CYCLE; - usleep( MB_TCP_READ_CYCLE ); - } - else - { - bAbort = TRUE; - } - break; - case 0: - prvvMBPortReleaseClient( ); - bAbort = TRUE; - break; - default: - iBytesSent += res; - break; - } - } - while( ( iBytesSent != usTCPLength ) && !bAbort ); - - bFrameSent = iBytesSent == usTCPLength ? TRUE : FALSE; - - return bFrameSent; -} - -void -prvvMBPortReleaseClient( ) -{ - ( void )recv( xClientSocket, &aucTCPBuf[0], MB_TCP_BUF_SIZE, 0 ); - - ( void )close( xClientSocket ); - xClientSocket = INVALID_SOCKET; -} - -BOOL -prvbMBPortAcceptClient( ) -{ - SOCKET xNewSocket; - BOOL bOkay; - - /* Check if we can handle a new connection. */ - - if( xClientSocket != INVALID_SOCKET ) - { - fprintf( stderr, "can't accept new client. all connections in use.\n" ); - bOkay = FALSE; - } - else if( ( xNewSocket = accept( xListenSocket, NULL, NULL ) ) == INVALID_SOCKET ) - { - bOkay = FALSE; - } - else - { - xClientSocket = xNewSocket; - usTCPBufPos = 0; - usTCPFrameBytesLeft = MB_TCP_FUNC; - bOkay = TRUE; - } - return bOkay; -} +/* + * FreeModbus Libary: Win32 Port + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: porttcp.c,v 1.1 2007/09/12 10:15:56 wolti Exp $ + */ + +/* + * Design Notes: + * + * The xMBPortTCPInit function allocates a socket and binds the socket to + * all available interfaces ( bind with INADDR_ANY ). In addition it + * creates an array of event objects which is used to check the state of + * the clients. On event object is used to handle new connections or + * closed ones. The other objects are used on a per client basis for + * processing. + */ + + /********************************************************** + * Linux TCP support. + * Based on Walter's project. + * Modified by Steven Guo + ***********************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +//#include + +/* ----------------------- MBAP Header --------------------------------------*/ +#define MB_TCP_UID 6 +#define MB_TCP_LEN 4 +#define MB_TCP_FUNC 7 + +/* ----------------------- Defines -----------------------------------------*/ +#define MB_TCP_DEFAULT_PORT 5022//5022 /* TCP listening port. */ +#define MB_TCP_POOL_TIMEOUT 50 /* pool timeout for event waiting. */ +#define MB_TCP_READ_TIMEOUT 1000 /* Maximum timeout to wait for packets. */ +#define MB_TCP_READ_CYCLE 100 /* Time between checking for new data. */ + +#define MB_TCP_DEBUG 1 /* Set to 1 for additional debug output. */ + +#define MB_TCP_BUF_SIZE ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */ + +#define EV_CONNECTION 0 +#define EV_CLIENT 1 +#define EV_NEVENTS EV_CLIENT + 1 + +/* ----------------------- Static variables ---------------------------------*/ +SOCKET xListenSocket; +SOCKET xClientSocket = INVALID_SOCKET; +static fd_set allset; + +static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE]; +static USHORT usTCPBufPos; +static USHORT usTCPFrameBytesLeft; + +/* ----------------------- External functions -------------------------------*/ +CHAR *WsaError2String( int dwError ); + +/* ----------------------- Static functions ---------------------------------*/ +BOOL prvMBTCPPortAddressToString( SOCKET xSocket, CHAR * szAddr, USHORT usBufSize ); +CHAR *prvMBTCPPortFrameToString( UCHAR * pucFrame, USHORT usFrameLen ); +static BOOL prvbMBPortAcceptClient( void ); +static void prvvMBPortReleaseClient( void ); +//static QTcpServer qListenSocket; + +/* ----------------------- Begin implementation -----------------------------*/ + +BOOL +xMBTCPPortInit( USHORT usTCPPort ) +{ + USHORT usPort; + struct sockaddr_in serveraddr; + int tmp = 1; + + if( usTCPPort == 0 ) + { + usPort = MB_TCP_DEFAULT_PORT; + } + else + { + usPort = ( USHORT ) usTCPPort; + } + memset( &serveraddr, 0, sizeof( serveraddr ) ); + serveraddr.sin_family = AF_INET; + serveraddr.sin_addr.s_addr = htonl( INADDR_ANY ); + serveraddr.sin_port = htons( usPort ); + if( ( xListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == -1 ) + { + fprintf( stderr, "Create socket failed.\r\n" ); + return FALSE; + } + if(setsockopt(xListenSocket, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(int))<0) + { + fprintf( stderr, "setsockopt socket failed.\r\n" ); + return FALSE; + } + if( bind( xListenSocket, ( struct sockaddr * )&serveraddr, sizeof( serveraddr ) ) == -1 ) + { + fprintf( stderr, "Bind socket failed.\r\n" ); + return FALSE; + } + else if( listen( xListenSocket, 1 ) == -1 ) + { + fprintf( stderr, "Listen socket failed.\r\n" ); + return FALSE; + } + FD_ZERO( &allset ); + FD_SET( xListenSocket, &allset ); + return TRUE; +} + +void +vMBTCPPortClose( ) +{ + // Close all client sockets. + if( xClientSocket != SOCKET_ERROR ) + { + prvvMBPortReleaseClient( ); + } + // Close the listener socket. + if( xListenSocket != SOCKET_ERROR ) + { + close( xListenSocket ); + } +} + +void +vMBTCPPortDisable( void ) +{ + /* Close all client sockets. */ + if( xClientSocket != SOCKET_ERROR ) + { + prvvMBPortReleaseClient( ); + } +} + +/*! \ingroup port_win32tcp + * + * \brief Pool the listening socket and currently connected Modbus TCP clients + * for new events. + * \internal + * + * This function checks if new clients want to connect or if already connected + * clients are sending requests. If a new client is connected and there are + * still client slots left (The current implementation supports only one) + * then the connection is accepted and an event object for the new client + * socket is activated (See prvbMBPortAcceptClient() ). + * Events for already existing clients in \c FD_READ and \c FD_CLOSE. In case of + * an \c FD_CLOSE the client connection is released (See prvvMBPortReleaseClient() ). + * In case of an \c FD_READ command the existing data is read from the client + * and if a complete frame has been received the Modbus Stack is notified. + * + * \return FALSE in case of an internal I/O error. For example if the internal + * event objects are in an invalid state. Note that this does not include any + * client errors. In all other cases returns TRUE. + */ +int errorCount = 0; + +BOOL +xMBPortTCPPool( void ) +{ + int n; + fd_set fread; + struct timeval tval; + + tval.tv_sec = 1; + tval.tv_usec = 60000; + int ret; + USHORT usLength; + + if( xClientSocket == INVALID_SOCKET ) + { + /* Accept to client */ + if( ( n = select( xListenSocket + 1, &allset, NULL, NULL, NULL ) ) < 0 ) + { + if( errno == EINTR ) + { + ; + } + else + { + ; + } + } + if( FD_ISSET( xListenSocket, &allset ) ) + { + ( void )prvbMBPortAcceptClient( ); + } + } + + while( TRUE ) + { + FD_ZERO( &fread ); + FD_SET( xClientSocket, &fread ); + if( ( ( ret = select( xClientSocket + 1, &fread, NULL, NULL, &tval ) ) == SOCKET_ERROR ) + || !ret ) + { + sleep(1); + errorCount++; + if(errorCount > 10) + { + errorCount = 0; + close( xClientSocket ); + xClientSocket = INVALID_SOCKET; + return TRUE; + } + continue; + } + if( ret > 0 ) + { + if( FD_ISSET( xClientSocket, &fread ) ) + { + if( ( ( ret = + recv( xClientSocket, &aucTCPBuf[usTCPBufPos], usTCPFrameBytesLeft, + 0 ) ) == SOCKET_ERROR ) || ( !ret ) ) + { + close( xClientSocket ); + xClientSocket = INVALID_SOCKET; + return TRUE; + } + usTCPBufPos += ret; + usTCPFrameBytesLeft -= ret; + if( usTCPBufPos >= MB_TCP_FUNC ) + { + /* Length is a byte count of Modbus PDU (function code + data) and the + * unit identifier. */ + usLength = aucTCPBuf[MB_TCP_LEN] << 8U; + usLength |= aucTCPBuf[MB_TCP_LEN + 1]; + + /* Is the frame already complete. */ + if( usTCPBufPos < ( MB_TCP_UID + usLength ) ) + { + usTCPFrameBytesLeft = usLength + MB_TCP_UID - usTCPBufPos; + } + /* The frame is complete. */ + else if( usTCPBufPos == ( MB_TCP_UID + usLength ) ) + { + ( void )xMBPortEventPost( EV_FRAME_RECEIVED ); + return TRUE; + } + /* This can not happend because we always calculate the number of bytes + * to receive. */ + else + { + assert( usTCPBufPos <= ( MB_TCP_UID + usLength ) ); + } + } + } + } + } + return TRUE; +} + +/*! + * \ingroup port_win32tcp + * \brief Receives parts of a Modbus TCP frame and if complete notifies + * the protocol stack. + * \internal + * + * This function reads a complete Modbus TCP frame from the protocol stack. + * It starts by reading the header with an initial request size for + * usTCPFrameBytesLeft = MB_TCP_FUNC. If the header is complete the + * number of bytes left can be calculated from it (See Length in MBAP header). + * Further read calls are issued until the frame is complete. + * + * \return \c TRUE if part of a Modbus TCP frame could be processed. In case + * of a communication error the function returns \c FALSE. + */ + +BOOL +xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength ) +{ + *ppucMBTCPFrame = &aucTCPBuf[0]; + *usTCPLength = usTCPBufPos; + + /* Reset the buffer. */ + usTCPBufPos = 0; + usTCPFrameBytesLeft = MB_TCP_FUNC; + return TRUE; +} + +BOOL +xMBTCPPortSendResponse( const UCHAR * pucMBTCPFrame, USHORT usTCPLength ) +{ + BOOL bFrameSent = FALSE; + BOOL bAbort = FALSE; + int res; + int iBytesSent = 0; + int iTimeOut = MB_TCP_READ_TIMEOUT; + + do + { + res = send( xClientSocket, &pucMBTCPFrame[iBytesSent], usTCPLength - iBytesSent, 0 ); + switch ( res ) + { + case -1: + if( iTimeOut > 0 ) + { + iTimeOut -= MB_TCP_READ_CYCLE; + usleep( MB_TCP_READ_CYCLE ); + } + else + { + bAbort = TRUE; + } + break; + case 0: + prvvMBPortReleaseClient( ); + bAbort = TRUE; + break; + default: + iBytesSent += res; + break; + } + } + while( ( iBytesSent != usTCPLength ) && !bAbort ); + + bFrameSent = iBytesSent == usTCPLength ? TRUE : FALSE; + + return bFrameSent; +} + +void +prvvMBPortReleaseClient( ) +{ + ( void )recv( xClientSocket, &aucTCPBuf[0], MB_TCP_BUF_SIZE, 0 ); + + ( void )close( xClientSocket ); + xClientSocket = INVALID_SOCKET; +} + +BOOL +prvbMBPortAcceptClient( ) +{ + SOCKET xNewSocket; + BOOL bOkay; + + /* Check if we can handle a new connection. */ + + if( xClientSocket != INVALID_SOCKET ) + { + fprintf( stderr, "can't accept new client. all connections in use.\n" ); + bOkay = FALSE; + } + else if( ( xNewSocket = accept( xListenSocket, NULL, NULL ) ) == INVALID_SOCKET ) + { + bOkay = FALSE; + } + else + { + xClientSocket = xNewSocket; + usTCPBufPos = 0; + usTCPFrameBytesLeft = MB_TCP_FUNC; + bOkay = TRUE; + } + return bOkay; +} diff --git a/modbus/port/porttimer.c b/modbus/port/porttimer.c index a8bf3a9..c2cf0f2 100644 --- a/modbus/port/porttimer.c +++ b/modbus/port/porttimer.c @@ -1,97 +1,97 @@ -/* - * FreeModbus Libary: Linux Port - * Copyright (C) 2006 Christian Walter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: porttimer.c,v 1.1 2006/08/01 20:58:50 wolti Exp $ - */ - -/* ----------------------- Standard includes --------------------------------*/ -#include -#include - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- Static variables ---------------------------------*/ -ULONG ulTimeOut; -BOOL bTimeoutEnable; - -static struct timeval xTimeLast; - -/* ----------------------- Start implementation -----------------------------*/ -BOOL -xMBPortTimersInit( USHORT usTim1Timerout50us ) -{ - ulTimeOut = usTim1Timerout50us / 20U; - if( ulTimeOut == 0 ) - ulTimeOut = 1; - - return xMBPortSerialSetTimeout( ulTimeOut ); -} - -void -xMBPortTimersClose( ) -{ - /* Does not use any hardware resources. */ -} - -void -vMBPortTimerPoll( ) -{ - ULONG ulDeltaMS; - struct timeval xTimeCur; - - /* Timers are called from the serial layer because we have no high - * res timer in Win32. */ - if( bTimeoutEnable ) - { - if( gettimeofday( &xTimeCur, NULL ) != 0 ) - { - /* gettimeofday failed - retry next time. */ - } - else - { - ulDeltaMS = ( xTimeCur.tv_sec - xTimeLast.tv_sec ) * 1000L + - ( xTimeCur.tv_usec - xTimeLast.tv_usec ) * 1000L; - if( ulDeltaMS > ulTimeOut ) - { - bTimeoutEnable = FALSE; - ( void )pxMBPortCBTimerExpired( ); - } - } - } -} - -void -vMBPortTimersEnable( ) -{ - int res = gettimeofday( &xTimeLast, NULL ); - - assert( res == 0 ); - bTimeoutEnable = TRUE; -} - -void -vMBPortTimersDisable( ) -{ - bTimeoutEnable = FALSE; -} +/* + * FreeModbus Libary: Linux Port + * Copyright (C) 2006 Christian Walter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: porttimer.c,v 1.1 2006/08/01 20:58:50 wolti Exp $ + */ + +/* ----------------------- Standard includes --------------------------------*/ +#include +#include + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +/* ----------------------- Defines ------------------------------------------*/ + +/* ----------------------- Static variables ---------------------------------*/ +ULONG ulTimeOut; +BOOL bTimeoutEnable; + +static struct timeval xTimeLast; + +/* ----------------------- Start implementation -----------------------------*/ +BOOL +xMBPortTimersInit( USHORT usTim1Timerout50us ) +{ + ulTimeOut = usTim1Timerout50us / 20U; + if( ulTimeOut == 0 ) + ulTimeOut = 1; + + return xMBPortSerialSetTimeout( ulTimeOut ); +} + +void +xMBPortTimersClose( ) +{ + /* Does not use any hardware resources. */ +} + +void +vMBPortTimerPoll( ) +{ + ULONG ulDeltaMS; + struct timeval xTimeCur; + + /* Timers are called from the serial layer because we have no high + * res timer in Win32. */ + if( bTimeoutEnable ) + { + if( gettimeofday( &xTimeCur, NULL ) != 0 ) + { + /* gettimeofday failed - retry next time. */ + } + else + { + ulDeltaMS = ( xTimeCur.tv_sec - xTimeLast.tv_sec ) * 1000L + + ( xTimeCur.tv_usec - xTimeLast.tv_usec ) * 1000L; + if( ulDeltaMS > ulTimeOut ) + { + bTimeoutEnable = FALSE; + ( void )pxMBPortCBTimerExpired( ); + } + } + } +} + +void +vMBPortTimersEnable( ) +{ + int res = gettimeofday( &xTimeLast, NULL ); + + assert( res == 0 ); + bTimeoutEnable = TRUE; +} + +void +vMBPortTimersDisable( ) +{ + bTimeoutEnable = FALSE; +} diff --git a/posix_qextserialport.cpp b/posix_qextserialport.cpp index 43aa60c..4f53abc 100644 --- a/posix_qextserialport.cpp +++ b/posix_qextserialport.cpp @@ -1,1128 +1,1128 @@ - -/*! -\class Posix_QextSerialPort -\version 1.0.0 -\author Stefan Sander -\author Michal Policht - -A cross-platform serial port class. -This class encapsulates the POSIX 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 _TTY_NOWARN_ will also turn off portability warnings. -*/ - -#include -#include "posix_qextserialport.h" - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort() -Default constructor. Note that the name of the device 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/ttySAC0, /dev/ttySAC1 - Linux /dev/ttyS0, /dev/ttyS1 -\endverbatim - -This constructor assigns the device name to the name of the first port on the specified system. -See the other constructors if you need to open a different port. -*/ -Posix_QextSerialPort::Posix_QextSerialPort() -: QextSerialBase() -{ - Posix_File=new QFile(); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&) -Copy constructor. -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s) - : QextSerialBase(s.port) -{ - setOpenMode(s.openMode()); - port = s.port; - Settings.BaudRate=s.Settings.BaudRate; - Settings.DataBits=s.Settings.DataBits; - Settings.Parity=s.Settings.Parity; - Settings.StopBits=s.Settings.StopBits; - Settings.FlowControl=s.Settings.FlowControl; - lastErr=s.lastErr; - - Posix_File=new QFile(); - Posix_File=s.Posix_File; - memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval)); - memcpy(&Posix_Copy_Timeout, &s.Posix_Copy_Timeout, sizeof(struct timeval)); - memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios)); -} - -/*! -\fn Posix_QextSerialPort::Posix_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". -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode) - : QextSerialBase(name) -{ - Posix_File=new QFile(); - setQueryMode(mode); - init(); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) -Constructs a port with default name and specified settings. -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode) - : QextSerialBase() -{ - setBaudRate(settings.BaudRate); - setDataBits(settings.DataBits); - setParity(settings.Parity); - setStopBits(settings.StopBits); - setFlowControl(settings.FlowControl); - - Posix_File=new QFile(); - setTimeout(settings.Timeout_Millisec); - setQueryMode(mode); - init(); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) -Constructs a port with specified name and settings. -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) - : QextSerialBase(name) -{ - setBaudRate(settings.BaudRate); - setDataBits(settings.DataBits); - setParity(settings.Parity); - setStopBits(settings.StopBits); - setFlowControl(settings.FlowControl); - - Posix_File=new QFile(); - setTimeout(settings.Timeout_Millisec); - setQueryMode(mode); - init(); -} - -/*! -\fn Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) -Override the = operator. -*/ -Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) -{ - setOpenMode(s.openMode()); - port = s.port; - Settings.BaudRate=s.Settings.BaudRate; - Settings.DataBits=s.Settings.DataBits; - Settings.Parity=s.Settings.Parity; - Settings.StopBits=s.Settings.StopBits; - Settings.FlowControl=s.Settings.FlowControl; - lastErr=s.lastErr; - - Posix_File=s.Posix_File; - memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval)); - memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval)); - memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios)); - return *this; -} - -void Posix_QextSerialPort::init() -{ - if (queryMode() == QextSerialBase::EventDriven) - qWarning("POSIX doesn't have event driven mechanism implemented yet"); -} - -/*! -\fn Posix_QextSerialPort::~Posix_QextSerialPort() -Standard destructor. -*/ -Posix_QextSerialPort::~Posix_QextSerialPort() -{ - if (isOpen()) { - close(); - } - Posix_File->close(); - delete Posix_File; -} - -/*! -\fn void Posix_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. - -\note -BAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support -BAUD1800. - -\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 Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) -{ - LOCK_MUTEX(); - if (Settings.BaudRate!=baudRate) { - switch (baudRate) { - case BAUD14400: - Settings.BaudRate=BAUD9600; - break; - - case BAUD56000: - Settings.BaudRate=BAUD38400; - break; - - case BAUD76800: - -#ifndef B76800 - Settings.BaudRate=BAUD57600; -#else - Settings.BaudRate=baudRate; -#endif - break; - - case BAUD128000: - case BAUD256000: - Settings.BaudRate=BAUD115200; - break; - - default: - Settings.BaudRate=baudRate; - break; - } - } - if (isOpen()) { - switch (baudRate) { - - /*50 baud*/ - case BAUD50: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B50; -#else - cfsetispeed(&Posix_CommConfig, B50); - cfsetospeed(&Posix_CommConfig, B50); -#endif - break; - - /*75 baud*/ - case BAUD75: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B75; -#else - cfsetispeed(&Posix_CommConfig, B75); - cfsetospeed(&Posix_CommConfig, B75); -#endif - break; - - /*110 baud*/ - case BAUD110: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B110; -#else - cfsetispeed(&Posix_CommConfig, B110); - cfsetospeed(&Posix_CommConfig, B110); -#endif - break; - - /*134.5 baud*/ - case BAUD134: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 134.5 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B134; -#else - cfsetispeed(&Posix_CommConfig, B134); - cfsetospeed(&Posix_CommConfig, B134); -#endif - break; - - /*150 baud*/ - case BAUD150: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 150 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B150; -#else - cfsetispeed(&Posix_CommConfig, B150); - cfsetospeed(&Posix_CommConfig, B150); -#endif - break; - - /*200 baud*/ - case BAUD200: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 200 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B200; -#else - cfsetispeed(&Posix_CommConfig, B200); - cfsetospeed(&Posix_CommConfig, B200); -#endif - break; - - /*300 baud*/ - case BAUD300: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B300; -#else - cfsetispeed(&Posix_CommConfig, B300); - cfsetospeed(&Posix_CommConfig, B300); -#endif - break; - - /*600 baud*/ - case BAUD600: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B600; -#else - cfsetispeed(&Posix_CommConfig, B600); - cfsetospeed(&Posix_CommConfig, B600); -#endif - break; - - /*1200 baud*/ - case BAUD1200: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B1200; -#else - cfsetispeed(&Posix_CommConfig, B1200); - cfsetospeed(&Posix_CommConfig, B1200); -#endif - break; - - /*1800 baud*/ - case BAUD1800: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and IRIX do not support 1800 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B1800; -#else - cfsetispeed(&Posix_CommConfig, B1800); - cfsetospeed(&Posix_CommConfig, B1800); -#endif - break; - - /*2400 baud*/ - case BAUD2400: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B2400; -#else - cfsetispeed(&Posix_CommConfig, B2400); - cfsetospeed(&Posix_CommConfig, B2400); -#endif - break; - - /*4800 baud*/ - case BAUD4800: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B4800; -#else - cfsetispeed(&Posix_CommConfig, B4800); - cfsetospeed(&Posix_CommConfig, B4800); -#endif - break; - - /*9600 baud*/ - case BAUD9600: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B9600; -#else - cfsetispeed(&Posix_CommConfig, B9600); - cfsetospeed(&Posix_CommConfig, B9600); -#endif - break; - - /*14400 baud*/ - case BAUD14400: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 14400 baud operation. Switching to 9600 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B9600; -#else - cfsetispeed(&Posix_CommConfig, B9600); - cfsetospeed(&Posix_CommConfig, B9600); -#endif - break; - - /*19200 baud*/ - case BAUD19200: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B19200; -#else - cfsetispeed(&Posix_CommConfig, B19200); - cfsetospeed(&Posix_CommConfig, B19200); -#endif - break; - - /*38400 baud*/ - case BAUD38400: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B38400; -#else - cfsetispeed(&Posix_CommConfig, B38400); - cfsetospeed(&Posix_CommConfig, B38400); -#endif - break; - - /*56000 baud*/ - case BAUD56000: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 56000 baud operation. Switching to 38400 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B38400; -#else - cfsetispeed(&Posix_CommConfig, B38400); - cfsetospeed(&Posix_CommConfig, B38400); -#endif - break; - - /*57600 baud*/ - case BAUD57600: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B57600; -#else - cfsetispeed(&Posix_CommConfig, B57600); - cfsetospeed(&Posix_CommConfig, B57600); -#endif - break; - - /*76800 baud*/ - case BAUD76800: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and some POSIX systems do not support 76800 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - -#ifdef B76800 - Posix_CommConfig.c_cflag|=B76800; -#else - TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); - Posix_CommConfig.c_cflag|=B57600; -#endif //B76800 -#else //CBAUD -#ifdef B76800 - cfsetispeed(&Posix_CommConfig, B76800); - cfsetospeed(&Posix_CommConfig, B76800); -#else - TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); - cfsetispeed(&Posix_CommConfig, B57600); - cfsetospeed(&Posix_CommConfig, B57600); -#endif //B76800 -#endif //CBAUD - break; - - /*115200 baud*/ - case BAUD115200: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B115200; -#else - cfsetispeed(&Posix_CommConfig, B115200); - cfsetospeed(&Posix_CommConfig, B115200); -#endif - break; - - /*128000 baud*/ - case BAUD128000: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 128000 baud operation. Switching to 115200 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B115200; -#else - cfsetispeed(&Posix_CommConfig, B115200); - cfsetospeed(&Posix_CommConfig, B115200); -#endif - break; - - /*256000 baud*/ - case BAUD256000: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 256000 baud operation. Switching to 115200 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B115200; -#else - cfsetispeed(&Posix_CommConfig, B115200); - cfsetospeed(&Posix_CommConfig, B115200); -#endif - break; - } - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_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 - 8 data bits cannot be used with space parity on POSIX systems. - -*/ -void Posix_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) || - (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { - } - else { - Settings.DataBits=dataBits; - } - } - if (isOpen()) { - switch(dataBits) { - - /*5 data bits*/ - case DATA_5: - if (Settings.StopBits==STOP_2) { - TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS5; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*6 data bits*/ - case DATA_6: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS6; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*7 data bits*/ - case DATA_7: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS7; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*8 data bits*/ - case DATA_8: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS8; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_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 - -\note -This function is subject to the following limitations: -\par -POSIX systems do not support mark parity. -\par -POSIX systems support space parity only if tricked into doing so, and only with - fewer than 8 data bits. Use space parity very carefully with POSIX systems. - -*/ -void Posix_QextSerialPort::setParity(ParityType parity) -{ - LOCK_MUTEX(); - if (Settings.Parity!=parity) { - if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { - } - else { - Settings.Parity=parity; - } - } - if (isOpen()) { - switch (parity) { - - /*space parity*/ - case PAR_SPACE: - if (Settings.DataBits==DATA_8) { - TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); - } - else { - - /*space parity not directly supported - add an extra data bit to simulate it*/ - Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); - switch(Settings.DataBits) { - case DATA_5: - Settings.DataBits=DATA_6; - Posix_CommConfig.c_cflag|=CS6; - break; - - case DATA_6: - Settings.DataBits=DATA_7; - Posix_CommConfig.c_cflag|=CS7; - break; - - case DATA_7: - Settings.DataBits=DATA_8; - Posix_CommConfig.c_cflag|=CS8; - break; - - case DATA_8: - break; - } - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*mark parity - WINDOWS ONLY*/ - case PAR_MARK: - TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); - break; - - /*no parity*/ - case PAR_NONE: - Posix_CommConfig.c_cflag&=(~PARENB); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*even parity*/ - case PAR_EVEN: - Posix_CommConfig.c_cflag&=(~PARODD); - Posix_CommConfig.c_cflag|=PARENB; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*odd parity*/ - case PAR_ODD: - Posix_CommConfig.c_cflag|=(PARENB|PARODD); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_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 - POSIX does not support 1.5 stop bits. - -*/ -void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) -{ - LOCK_MUTEX(); - if (Settings.StopBits!=stopBits) { - if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} - else { - Settings.StopBits=stopBits; - } - } - if (isOpen()) { - switch (stopBits) { - - /*one stop bit*/ - case STOP_1: - Settings.StopBits=stopBits; - Posix_CommConfig.c_cflag&=(~CSTOPB); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*1.5 stop bits*/ - case STOP_1_5: - TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); - break; - - /*two stop bits*/ - case STOP_2: - if (Settings.DataBits==DATA_5) { - TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); - } - else { - Settings.StopBits=stopBits; - Posix_CommConfig.c_cflag|=CSTOPB; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_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 -\note -FLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is -unsupported, FLOW_HARDWARE is the same as FLOW_OFF. - -*/ -void Posix_QextSerialPort::setFlowControl(FlowType flow) -{ - LOCK_MUTEX(); - if (Settings.FlowControl!=flow) { - Settings.FlowControl=flow; - } - if (isOpen()) { - switch(flow) { - - /*no flow control*/ - case FLOW_OFF: - Posix_CommConfig.c_cflag&=(~CRTSCTS); - Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*software (XON/XOFF) flow control*/ - case FLOW_XONXOFF: - Posix_CommConfig.c_cflag&=(~CRTSCTS); - Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - case FLOW_HARDWARE: - Posix_CommConfig.c_cflag|=CRTSCTS; - Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setTimeout(ulong sec); -Sets the read and write timeouts for the port to millisec milliseconds. -Note that this is a per-character timeout, i.e. the port will wait this long for each -individual character, not for the whole read operation. This timeout also applies to the -bytesWaiting() function. - -\note -POSIX does not support millisecond-level control for I/O timeout values. Any -timeout set using this function will be set to the next lowest tenth of a second for -the purposes of detecting read or write timeouts. For example a timeout of 550 milliseconds -will be seen by the class as a timeout of 500 milliseconds for the purposes of reading and -writing the port. However millisecond-level control is allowed by the select() system call, -so for example a 550-millisecond timeout will be seen as 550 milliseconds on POSIX systems for -the purpose of detecting available bytes in the read buffer. - -*/ -void Posix_QextSerialPort::setTimeout(long millisec) -{ - LOCK_MUTEX(); - Settings.Timeout_Millisec = millisec; - Posix_Copy_Timeout.tv_sec = millisec / 1000; - Posix_Copy_Timeout.tv_usec = millisec % 1000; - if (isOpen()) { - tcgetattr(Posix_File->handle(), &Posix_CommConfig); - Posix_CommConfig.c_cc[VTIME] = millisec/100; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - UNLOCK_MUTEX(); -} - -/*! -\fn bool Posix_QextSerialPort::open(OpenMode mode) -Opens the serial port associated to this class. -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 Posix_QextSerialPort::open(OpenMode mode) -{ - LOCK_MUTEX(); - if (mode == QIODevice::NotOpen) - return isOpen(); - if (!isOpen()) { - /*open the port*/ - Posix_File->setFileName(port); - // qDebug("Trying to open File"); - if (Posix_File->open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { - // qDebug("Opened File succesfully"); - /*set open mode*/ - QIODevice::open(mode); - - /*configure port settings*/ - tcgetattr(Posix_File->handle(), &Posix_CommConfig); - - /*set up other port settings*/ - Posix_CommConfig.c_cflag|=CREAD|CLOCAL; - Posix_CommConfig.c_lflag&=(~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG)); - Posix_CommConfig.c_iflag&=(~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY)); - Posix_CommConfig.c_oflag&=(~OPOST); - Posix_CommConfig.c_cc[VMIN]=0; - Posix_CommConfig.c_cc[VINTR] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VQUIT] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VSTART] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VSTOP] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VSUSP] = _POSIX_VDISABLE; - setBaudRate(Settings.BaudRate); - setDataBits(Settings.DataBits); - setParity(Settings.Parity); - setStopBits(Settings.StopBits); - setFlowControl(Settings.FlowControl); - setTimeout(Settings.Timeout_Millisec); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } else { - qDebug("Could not open File! Error code : %d", Posix_File->error()); - } - } - UNLOCK_MUTEX(); - return isOpen(); -} - -/*! -\fn void Posix_QextSerialPort::close() -Closes a serial port. This function has no effect if the serial port associated with the class -is not currently open. -*/ -void Posix_QextSerialPort::close() -{ - LOCK_MUTEX(); - Posix_File->close(); - QIODevice::close(); - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_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 Posix_QextSerialPort::flush() -{ - LOCK_MUTEX(); - if (isOpen()) { - Posix_File->flush(); - } - UNLOCK_MUTEX(); -} - -/*! -\fn qint64 Posix_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 Posix_QextSerialPort::bytesWaiting() instead. -*/ -qint64 Posix_QextSerialPort::size() const -{ - int numBytes; - if (ioctl(Posix_File->handle(), FIONREAD, &numBytes)<0) { - numBytes=0; - } - return (qint64)numBytes; -} - -/*! -\fn qint64 Posix_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 -Posix_QextSerialPort::getLastError(). -*/ -qint64 Posix_QextSerialPort::bytesAvailable() -{ - LOCK_MUTEX(); - if (isOpen()) { - int bytesQueued; - fd_set fileSet; - FD_ZERO(&fileSet); - FD_SET(Posix_File->handle(), &fileSet); - - /*on Linux systems the Posix_Timeout structure will be altered by the select() call. - Make sure we use the right timeout values*/ - //memcpy(&Posix_Timeout, &Posix_Copy_Timeout, sizeof(struct timeval)); - Posix_Timeout = Posix_Copy_Timeout; - int n=select(Posix_File->handle()+1, &fileSet, NULL, &fileSet, &Posix_Timeout); - if (!n) { - lastErr=E_PORT_TIMEOUT; - UNLOCK_MUTEX(); - return -1; - } - if (n==-1 || ioctl(Posix_File->handle(), FIONREAD, &bytesQueued)==-1) { - translateError(errno); - UNLOCK_MUTEX(); - return -1; - } - lastErr=E_NO_ERROR; - UNLOCK_MUTEX(); - return bytesQueued + QIODevice::bytesAvailable(); - } - UNLOCK_MUTEX(); - return 0; -} - -/*! -\fn void Posix_QextSerialPort::ungetChar(char) -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 Posix_QextSerialPort::ungetChar(char) -{ - /*meaningless on unbuffered sequential device - return error and print a warning*/ - TTY_WARNING("Posix_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); -} - -/*! -\fn void Posix_QextSerialPort::translateError(ulong error) -Translates a system-specific error code to a QextSerialPort error code. Used internally. -*/ -void Posix_QextSerialPort::translateError(ulong error) -{ - switch (error) { - case EBADF: - case ENOTTY: - lastErr=E_INVALID_FD; - break; - - case EINTR: - lastErr=E_CAUGHT_NON_BLOCKED_SIGNAL; - break; - - case ENOMEM: - lastErr=E_NO_MEMORY; - break; - } -} - -/*! -\fn void Posix_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 Posix_QextSerialPort::setDtr(bool set) -{ - LOCK_MUTEX(); - if (isOpen()) { - int status; - ioctl(Posix_File->handle(), TIOCMGET, &status); - if (set) { - status|=TIOCM_DTR; - } - else { - status&=~TIOCM_DTR; - } - ioctl(Posix_File->handle(), TIOCMSET, &status); - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_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 Posix_QextSerialPort::setRts(bool set) -{ - LOCK_MUTEX(); - if (isOpen()) { - int status; - ioctl(Posix_File->handle(), TIOCMGET, &status); - if (set) { - status|=TIOCM_RTS; - } - else { - status&=~TIOCM_RTS; - } - ioctl(Posix_File->handle(), TIOCMSET, &status); - } - UNLOCK_MUTEX(); -} - -/*! -\fn unsigned long Posix_QextSerialPort::lineStatus() -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 -LS_RTS RTS (POSIX only) -LS_DTR DTR (POSIX only) -LS_ST Secondary TXD (POSIX only) -LS_SR Secondary RXD (POSIX only) -\endverbatim - -This function will return 0 if the port associated with the class is not currently open. -*/ -unsigned long Posix_QextSerialPort::lineStatus() -{ - unsigned long Status=0, Temp=0; - LOCK_MUTEX(); - if (isOpen()) { - ioctl(Posix_File->handle(), TIOCMGET, &Temp); - if (Temp&TIOCM_CTS) { - Status|=LS_CTS; - } - if (Temp&TIOCM_DSR) { - Status|=LS_DSR; - } - if (Temp&TIOCM_RI) { - Status|=LS_RI; - } - if (Temp&TIOCM_CD) { - Status|=LS_DCD; - } - if (Temp&TIOCM_DTR) { - Status|=LS_DTR; - } - if (Temp&TIOCM_RTS) { - Status|=LS_RTS; - } - if (Temp&TIOCM_ST) { - Status|=LS_ST; - } - if (Temp&TIOCM_SR) { - Status|=LS_SR; - } - } - UNLOCK_MUTEX(); - return Status; -} - -/*! -\fn qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) -Reads a block of data from the serial port. This function will read at most maxSize 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 Posix_QextSerialPort::readData(char * data, qint64 maxSize) -{ - LOCK_MUTEX(); - int retVal=0; - retVal=Posix_File->read(data, maxSize); - if (retVal==-1) - lastErr=E_READ_FAILED; - UNLOCK_MUTEX(); - - return retVal; -} - -/*! -\fn qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) -Writes a block of data to the serial port. This function will write maxSize 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 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) -{ - LOCK_MUTEX(); - int retVal=0; - retVal=Posix_File->write(data, maxSize); - if (retVal==-1) - lastErr=E_WRITE_FAILED; - UNLOCK_MUTEX(); - - return retVal; -} + +/*! +\class Posix_QextSerialPort +\version 1.0.0 +\author Stefan Sander +\author Michal Policht + +A cross-platform serial port class. +This class encapsulates the POSIX 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 _TTY_NOWARN_ will also turn off portability warnings. +*/ + +#include +#include "posix_qextserialport.h" + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort() +Default constructor. Note that the name of the device 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/ttySAC0, /dev/ttySAC1 + Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +This constructor assigns the device name to the name of the first port on the specified system. +See the other constructors if you need to open a different port. +*/ +Posix_QextSerialPort::Posix_QextSerialPort() +: QextSerialBase() +{ + Posix_File=new QFile(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&) +Copy constructor. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s) + : QextSerialBase(s.port) +{ + setOpenMode(s.openMode()); + port = s.port; + Settings.BaudRate=s.Settings.BaudRate; + Settings.DataBits=s.Settings.DataBits; + Settings.Parity=s.Settings.Parity; + Settings.StopBits=s.Settings.StopBits; + Settings.FlowControl=s.Settings.FlowControl; + lastErr=s.lastErr; + + Posix_File=new QFile(); + Posix_File=s.Posix_File; + memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval)); + memcpy(&Posix_Copy_Timeout, &s.Posix_Copy_Timeout, sizeof(struct timeval)); + memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios)); +} + +/*! +\fn Posix_QextSerialPort::Posix_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". +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode) + : QextSerialBase(name) +{ + Posix_File=new QFile(); + setQueryMode(mode); + init(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) +Constructs a port with default name and specified settings. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode) + : QextSerialBase() +{ + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setParity(settings.Parity); + setStopBits(settings.StopBits); + setFlowControl(settings.FlowControl); + + Posix_File=new QFile(); + setTimeout(settings.Timeout_Millisec); + setQueryMode(mode); + init(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) +Constructs a port with specified name and settings. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) + : QextSerialBase(name) +{ + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setParity(settings.Parity); + setStopBits(settings.StopBits); + setFlowControl(settings.FlowControl); + + Posix_File=new QFile(); + setTimeout(settings.Timeout_Millisec); + setQueryMode(mode); + init(); +} + +/*! +\fn Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) +Override the = operator. +*/ +Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) +{ + setOpenMode(s.openMode()); + port = s.port; + Settings.BaudRate=s.Settings.BaudRate; + Settings.DataBits=s.Settings.DataBits; + Settings.Parity=s.Settings.Parity; + Settings.StopBits=s.Settings.StopBits; + Settings.FlowControl=s.Settings.FlowControl; + lastErr=s.lastErr; + + Posix_File=s.Posix_File; + memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval)); + memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval)); + memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios)); + return *this; +} + +void Posix_QextSerialPort::init() +{ + if (queryMode() == QextSerialBase::EventDriven) + qWarning("POSIX doesn't have event driven mechanism implemented yet"); +} + +/*! +\fn Posix_QextSerialPort::~Posix_QextSerialPort() +Standard destructor. +*/ +Posix_QextSerialPort::~Posix_QextSerialPort() +{ + if (isOpen()) { + close(); + } + Posix_File->close(); + delete Posix_File; +} + +/*! +\fn void Posix_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. + +\note +BAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support +BAUD1800. + +\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 Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) +{ + LOCK_MUTEX(); + if (Settings.BaudRate!=baudRate) { + switch (baudRate) { + case BAUD14400: + Settings.BaudRate=BAUD9600; + break; + + case BAUD56000: + Settings.BaudRate=BAUD38400; + break; + + case BAUD76800: + +#ifndef B76800 + Settings.BaudRate=BAUD57600; +#else + Settings.BaudRate=baudRate; +#endif + break; + + case BAUD128000: + case BAUD256000: + Settings.BaudRate=BAUD115200; + break; + + default: + Settings.BaudRate=baudRate; + break; + } + } + if (isOpen()) { + switch (baudRate) { + + /*50 baud*/ + case BAUD50: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B50; +#else + cfsetispeed(&Posix_CommConfig, B50); + cfsetospeed(&Posix_CommConfig, B50); +#endif + break; + + /*75 baud*/ + case BAUD75: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B75; +#else + cfsetispeed(&Posix_CommConfig, B75); + cfsetospeed(&Posix_CommConfig, B75); +#endif + break; + + /*110 baud*/ + case BAUD110: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B110; +#else + cfsetispeed(&Posix_CommConfig, B110); + cfsetospeed(&Posix_CommConfig, B110); +#endif + break; + + /*134.5 baud*/ + case BAUD134: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 134.5 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B134; +#else + cfsetispeed(&Posix_CommConfig, B134); + cfsetospeed(&Posix_CommConfig, B134); +#endif + break; + + /*150 baud*/ + case BAUD150: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 150 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B150; +#else + cfsetispeed(&Posix_CommConfig, B150); + cfsetospeed(&Posix_CommConfig, B150); +#endif + break; + + /*200 baud*/ + case BAUD200: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 200 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B200; +#else + cfsetispeed(&Posix_CommConfig, B200); + cfsetospeed(&Posix_CommConfig, B200); +#endif + break; + + /*300 baud*/ + case BAUD300: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B300; +#else + cfsetispeed(&Posix_CommConfig, B300); + cfsetospeed(&Posix_CommConfig, B300); +#endif + break; + + /*600 baud*/ + case BAUD600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B600; +#else + cfsetispeed(&Posix_CommConfig, B600); + cfsetospeed(&Posix_CommConfig, B600); +#endif + break; + + /*1200 baud*/ + case BAUD1200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B1200; +#else + cfsetispeed(&Posix_CommConfig, B1200); + cfsetospeed(&Posix_CommConfig, B1200); +#endif + break; + + /*1800 baud*/ + case BAUD1800: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and IRIX do not support 1800 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B1800; +#else + cfsetispeed(&Posix_CommConfig, B1800); + cfsetospeed(&Posix_CommConfig, B1800); +#endif + break; + + /*2400 baud*/ + case BAUD2400: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B2400; +#else + cfsetispeed(&Posix_CommConfig, B2400); + cfsetospeed(&Posix_CommConfig, B2400); +#endif + break; + + /*4800 baud*/ + case BAUD4800: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B4800; +#else + cfsetispeed(&Posix_CommConfig, B4800); + cfsetospeed(&Posix_CommConfig, B4800); +#endif + break; + + /*9600 baud*/ + case BAUD9600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B9600; +#else + cfsetispeed(&Posix_CommConfig, B9600); + cfsetospeed(&Posix_CommConfig, B9600); +#endif + break; + + /*14400 baud*/ + case BAUD14400: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 14400 baud operation. Switching to 9600 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B9600; +#else + cfsetispeed(&Posix_CommConfig, B9600); + cfsetospeed(&Posix_CommConfig, B9600); +#endif + break; + + /*19200 baud*/ + case BAUD19200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B19200; +#else + cfsetispeed(&Posix_CommConfig, B19200); + cfsetospeed(&Posix_CommConfig, B19200); +#endif + break; + + /*38400 baud*/ + case BAUD38400: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B38400; +#else + cfsetispeed(&Posix_CommConfig, B38400); + cfsetospeed(&Posix_CommConfig, B38400); +#endif + break; + + /*56000 baud*/ + case BAUD56000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 56000 baud operation. Switching to 38400 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B38400; +#else + cfsetispeed(&Posix_CommConfig, B38400); + cfsetospeed(&Posix_CommConfig, B38400); +#endif + break; + + /*57600 baud*/ + case BAUD57600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B57600; +#else + cfsetispeed(&Posix_CommConfig, B57600); + cfsetospeed(&Posix_CommConfig, B57600); +#endif + break; + + /*76800 baud*/ + case BAUD76800: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and some POSIX systems do not support 76800 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + +#ifdef B76800 + Posix_CommConfig.c_cflag|=B76800; +#else + TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); + Posix_CommConfig.c_cflag|=B57600; +#endif //B76800 +#else //CBAUD +#ifdef B76800 + cfsetispeed(&Posix_CommConfig, B76800); + cfsetospeed(&Posix_CommConfig, B76800); +#else + TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); + cfsetispeed(&Posix_CommConfig, B57600); + cfsetospeed(&Posix_CommConfig, B57600); +#endif //B76800 +#endif //CBAUD + break; + + /*115200 baud*/ + case BAUD115200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + + /*128000 baud*/ + case BAUD128000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 128000 baud operation. Switching to 115200 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + + /*256000 baud*/ + case BAUD256000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 256000 baud operation. Switching to 115200 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + } + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_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 + 8 data bits cannot be used with space parity on POSIX systems. + +*/ +void Posix_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) || + (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { + } + else { + Settings.DataBits=dataBits; + } + } + if (isOpen()) { + switch(dataBits) { + + /*5 data bits*/ + case DATA_5: + if (Settings.StopBits==STOP_2) { + TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS5; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*6 data bits*/ + case DATA_6: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS6; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*7 data bits*/ + case DATA_7: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS7; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*8 data bits*/ + case DATA_8: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS8; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_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 + +\note +This function is subject to the following limitations: +\par +POSIX systems do not support mark parity. +\par +POSIX systems support space parity only if tricked into doing so, and only with + fewer than 8 data bits. Use space parity very carefully with POSIX systems. + +*/ +void Posix_QextSerialPort::setParity(ParityType parity) +{ + LOCK_MUTEX(); + if (Settings.Parity!=parity) { + if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { + } + else { + Settings.Parity=parity; + } + } + if (isOpen()) { + switch (parity) { + + /*space parity*/ + case PAR_SPACE: + if (Settings.DataBits==DATA_8) { + TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); + } + else { + + /*space parity not directly supported - add an extra data bit to simulate it*/ + Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); + switch(Settings.DataBits) { + case DATA_5: + Settings.DataBits=DATA_6; + Posix_CommConfig.c_cflag|=CS6; + break; + + case DATA_6: + Settings.DataBits=DATA_7; + Posix_CommConfig.c_cflag|=CS7; + break; + + case DATA_7: + Settings.DataBits=DATA_8; + Posix_CommConfig.c_cflag|=CS8; + break; + + case DATA_8: + break; + } + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*mark parity - WINDOWS ONLY*/ + case PAR_MARK: + TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); + break; + + /*no parity*/ + case PAR_NONE: + Posix_CommConfig.c_cflag&=(~PARENB); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*even parity*/ + case PAR_EVEN: + Posix_CommConfig.c_cflag&=(~PARODD); + Posix_CommConfig.c_cflag|=PARENB; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*odd parity*/ + case PAR_ODD: + Posix_CommConfig.c_cflag|=(PARENB|PARODD); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_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 + POSIX does not support 1.5 stop bits. + +*/ +void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) +{ + LOCK_MUTEX(); + if (Settings.StopBits!=stopBits) { + if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} + else { + Settings.StopBits=stopBits; + } + } + if (isOpen()) { + switch (stopBits) { + + /*one stop bit*/ + case STOP_1: + Settings.StopBits=stopBits; + Posix_CommConfig.c_cflag&=(~CSTOPB); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*1.5 stop bits*/ + case STOP_1_5: + TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); + break; + + /*two stop bits*/ + case STOP_2: + if (Settings.DataBits==DATA_5) { + TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); + } + else { + Settings.StopBits=stopBits; + Posix_CommConfig.c_cflag|=CSTOPB; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_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 +\note +FLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is +unsupported, FLOW_HARDWARE is the same as FLOW_OFF. + +*/ +void Posix_QextSerialPort::setFlowControl(FlowType flow) +{ + LOCK_MUTEX(); + if (Settings.FlowControl!=flow) { + Settings.FlowControl=flow; + } + if (isOpen()) { + switch(flow) { + + /*no flow control*/ + case FLOW_OFF: + Posix_CommConfig.c_cflag&=(~CRTSCTS); + Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*software (XON/XOFF) flow control*/ + case FLOW_XONXOFF: + Posix_CommConfig.c_cflag&=(~CRTSCTS); + Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + case FLOW_HARDWARE: + Posix_CommConfig.c_cflag|=CRTSCTS; + Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setTimeout(ulong sec); +Sets the read and write timeouts for the port to millisec milliseconds. +Note that this is a per-character timeout, i.e. the port will wait this long for each +individual character, not for the whole read operation. This timeout also applies to the +bytesWaiting() function. + +\note +POSIX does not support millisecond-level control for I/O timeout values. Any +timeout set using this function will be set to the next lowest tenth of a second for +the purposes of detecting read or write timeouts. For example a timeout of 550 milliseconds +will be seen by the class as a timeout of 500 milliseconds for the purposes of reading and +writing the port. However millisecond-level control is allowed by the select() system call, +so for example a 550-millisecond timeout will be seen as 550 milliseconds on POSIX systems for +the purpose of detecting available bytes in the read buffer. + +*/ +void Posix_QextSerialPort::setTimeout(long millisec) +{ + LOCK_MUTEX(); + Settings.Timeout_Millisec = millisec; + Posix_Copy_Timeout.tv_sec = millisec / 1000; + Posix_Copy_Timeout.tv_usec = millisec % 1000; + if (isOpen()) { + tcgetattr(Posix_File->handle(), &Posix_CommConfig); + Posix_CommConfig.c_cc[VTIME] = millisec/100; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn bool Posix_QextSerialPort::open(OpenMode mode) +Opens the serial port associated to this class. +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 Posix_QextSerialPort::open(OpenMode mode) +{ + LOCK_MUTEX(); + if (mode == QIODevice::NotOpen) + return isOpen(); + if (!isOpen()) { + /*open the port*/ + Posix_File->setFileName(port); + // qDebug("Trying to open File"); + if (Posix_File->open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { + // qDebug("Opened File succesfully"); + /*set open mode*/ + QIODevice::open(mode); + + /*configure port settings*/ + tcgetattr(Posix_File->handle(), &Posix_CommConfig); + + /*set up other port settings*/ + Posix_CommConfig.c_cflag|=CREAD|CLOCAL; + Posix_CommConfig.c_lflag&=(~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG)); + Posix_CommConfig.c_iflag&=(~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY)); + Posix_CommConfig.c_oflag&=(~OPOST); + Posix_CommConfig.c_cc[VMIN]=0; + Posix_CommConfig.c_cc[VINTR] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VQUIT] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSTART] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSTOP] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSUSP] = _POSIX_VDISABLE; + setBaudRate(Settings.BaudRate); + setDataBits(Settings.DataBits); + setParity(Settings.Parity); + setStopBits(Settings.StopBits); + setFlowControl(Settings.FlowControl); + setTimeout(Settings.Timeout_Millisec); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } else { + qDebug("Could not open File! Error code : %d", Posix_File->error()); + } + } + UNLOCK_MUTEX(); + return isOpen(); +} + +/*! +\fn void Posix_QextSerialPort::close() +Closes a serial port. This function has no effect if the serial port associated with the class +is not currently open. +*/ +void Posix_QextSerialPort::close() +{ + LOCK_MUTEX(); + Posix_File->close(); + QIODevice::close(); + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_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 Posix_QextSerialPort::flush() +{ + LOCK_MUTEX(); + if (isOpen()) { + Posix_File->flush(); + } + UNLOCK_MUTEX(); +} + +/*! +\fn qint64 Posix_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 Posix_QextSerialPort::bytesWaiting() instead. +*/ +qint64 Posix_QextSerialPort::size() const +{ + int numBytes; + if (ioctl(Posix_File->handle(), FIONREAD, &numBytes)<0) { + numBytes=0; + } + return (qint64)numBytes; +} + +/*! +\fn qint64 Posix_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 +Posix_QextSerialPort::getLastError(). +*/ +qint64 Posix_QextSerialPort::bytesAvailable() +{ + LOCK_MUTEX(); + if (isOpen()) { + int bytesQueued; + fd_set fileSet; + FD_ZERO(&fileSet); + FD_SET(Posix_File->handle(), &fileSet); + + /*on Linux systems the Posix_Timeout structure will be altered by the select() call. + Make sure we use the right timeout values*/ + //memcpy(&Posix_Timeout, &Posix_Copy_Timeout, sizeof(struct timeval)); + Posix_Timeout = Posix_Copy_Timeout; + int n=select(Posix_File->handle()+1, &fileSet, NULL, &fileSet, &Posix_Timeout); + if (!n) { + lastErr=E_PORT_TIMEOUT; + UNLOCK_MUTEX(); + return -1; + } + if (n==-1 || ioctl(Posix_File->handle(), FIONREAD, &bytesQueued)==-1) { + translateError(errno); + UNLOCK_MUTEX(); + return -1; + } + lastErr=E_NO_ERROR; + UNLOCK_MUTEX(); + return bytesQueued + QIODevice::bytesAvailable(); + } + UNLOCK_MUTEX(); + return 0; +} + +/*! +\fn void Posix_QextSerialPort::ungetChar(char) +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 Posix_QextSerialPort::ungetChar(char) +{ + /*meaningless on unbuffered sequential device - return error and print a warning*/ + TTY_WARNING("Posix_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); +} + +/*! +\fn void Posix_QextSerialPort::translateError(ulong error) +Translates a system-specific error code to a QextSerialPort error code. Used internally. +*/ +void Posix_QextSerialPort::translateError(ulong error) +{ + switch (error) { + case EBADF: + case ENOTTY: + lastErr=E_INVALID_FD; + break; + + case EINTR: + lastErr=E_CAUGHT_NON_BLOCKED_SIGNAL; + break; + + case ENOMEM: + lastErr=E_NO_MEMORY; + break; + } +} + +/*! +\fn void Posix_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 Posix_QextSerialPort::setDtr(bool set) +{ + LOCK_MUTEX(); + if (isOpen()) { + int status; + ioctl(Posix_File->handle(), TIOCMGET, &status); + if (set) { + status|=TIOCM_DTR; + } + else { + status&=~TIOCM_DTR; + } + ioctl(Posix_File->handle(), TIOCMSET, &status); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_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 Posix_QextSerialPort::setRts(bool set) +{ + LOCK_MUTEX(); + if (isOpen()) { + int status; + ioctl(Posix_File->handle(), TIOCMGET, &status); + if (set) { + status|=TIOCM_RTS; + } + else { + status&=~TIOCM_RTS; + } + ioctl(Posix_File->handle(), TIOCMSET, &status); + } + UNLOCK_MUTEX(); +} + +/*! +\fn unsigned long Posix_QextSerialPort::lineStatus() +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 +LS_RTS RTS (POSIX only) +LS_DTR DTR (POSIX only) +LS_ST Secondary TXD (POSIX only) +LS_SR Secondary RXD (POSIX only) +\endverbatim + +This function will return 0 if the port associated with the class is not currently open. +*/ +unsigned long Posix_QextSerialPort::lineStatus() +{ + unsigned long Status=0, Temp=0; + LOCK_MUTEX(); + if (isOpen()) { + ioctl(Posix_File->handle(), TIOCMGET, &Temp); + if (Temp&TIOCM_CTS) { + Status|=LS_CTS; + } + if (Temp&TIOCM_DSR) { + Status|=LS_DSR; + } + if (Temp&TIOCM_RI) { + Status|=LS_RI; + } + if (Temp&TIOCM_CD) { + Status|=LS_DCD; + } + if (Temp&TIOCM_DTR) { + Status|=LS_DTR; + } + if (Temp&TIOCM_RTS) { + Status|=LS_RTS; + } + if (Temp&TIOCM_ST) { + Status|=LS_ST; + } + if (Temp&TIOCM_SR) { + Status|=LS_SR; + } + } + UNLOCK_MUTEX(); + return Status; +} + +/*! +\fn qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) +Reads a block of data from the serial port. This function will read at most maxSize 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 Posix_QextSerialPort::readData(char * data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + retVal=Posix_File->read(data, maxSize); + if (retVal==-1) + lastErr=E_READ_FAILED; + UNLOCK_MUTEX(); + + return retVal; +} + +/*! +\fn qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) +Writes a block of data to the serial port. This function will write maxSize 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 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + retVal=Posix_File->write(data, maxSize); + if (retVal==-1) + lastErr=E_WRITE_FAILED; + UNLOCK_MUTEX(); + + return retVal; +} diff --git a/posix_qextserialport.h b/posix_qextserialport.h index 298bc2e..2c0ebe8 100644 --- a/posix_qextserialport.h +++ b/posix_qextserialport.h @@ -1,63 +1,63 @@ -#ifndef _POSIX_QEXTSERIALPORT_H_ -#define _POSIX_QEXTSERIALPORT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include "qextserialbase.h" - -class Posix_QextSerialPort:public QextSerialBase -{ - private: - /*! - * This method is a part of constructor. - */ - void init(); - - 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); - - public: - Posix_QextSerialPort(); - Posix_QextSerialPort(const Posix_QextSerialPort& s); - Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - 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(long); - - virtual bool open(OpenMode mode); - 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(); - -}; - -#endif +#ifndef _POSIX_QEXTSERIALPORT_H_ +#define _POSIX_QEXTSERIALPORT_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "qextserialbase.h" + +class Posix_QextSerialPort:public QextSerialBase +{ + private: + /*! + * This method is a part of constructor. + */ + void init(); + + 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); + + public: + Posix_QextSerialPort(); + Posix_QextSerialPort(const Posix_QextSerialPort& s); + Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode = QextSerialBase::Polling); + Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); + Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); + 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(long); + + virtual bool open(OpenMode mode); + 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(); + +}; + +#endif diff --git a/qextserialbase.cpp b/qextserialbase.cpp index 854adf6..4c77fb7 100644 --- a/qextserialbase.cpp +++ b/qextserialbase.cpp @@ -1,226 +1,226 @@ -#include "qextserialbase.h" - -/*! -\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() -{ - delete mutex; -} - -/*! -\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 0 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_Millisec=500; - mutex = new QMutex( QMutex::Recursive ); - setOpenMode(QIODevice::NotOpen); -} - -void QextSerialBase::setQueryMode(QueryMode mechanism) -{ - _queryMode = mechanism; -} - -/*! -\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; -} +#include "qextserialbase.h" + +/*! +\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() +{ + delete mutex; +} + +/*! +\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 0 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_Millisec=500; + mutex = new QMutex( QMutex::Recursive ); + setOpenMode(QIODevice::NotOpen); +} + +void QextSerialBase::setQueryMode(QueryMode mechanism) +{ + _queryMode = mechanism; +} + +/*! +\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; +} diff --git a/qextserialbase.h b/qextserialbase.h index 93037cb..e1474e4 100644 --- a/qextserialbase.h +++ b/qextserialbase.h @@ -1,258 +1,258 @@ -#ifndef _QEXTSERIALBASE_H_ -#define _QEXTSERIALBASE_H_ - -#include -#include -#include -#include - -/*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*/ -#define LOCK_MUTEX() mutex->lock() -#define UNLOCK_MUTEX() mutex->unlock() - -/*macros for warning and debug messages*/ -#ifdef _TTY_NOWARN_PORT_ -#define TTY_PORTABILITY_WARNING(s) -#else -#define TTY_PORTABILITY_WARNING(s) qWarning(s) -#endif /*_TTY_NOWARN_PORT_*/ -#ifdef _TTY_NOWARN_ -#define TTY_WARNING(s) -#else -#define TTY_WARNING(s) qWarning(s) -#endif /*_TTY_NOWARN_*/ - - -/*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; - long Timeout_Millisec; -}; - -/*! - * \author Stefan Sander - * \author Michal Policht - * - * A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort. - */ -class QextSerialBase : public QIODevice -{ - Q_OBJECT - - public: - enum QueryMode { - Polling, - EventDriven - }; - - protected: - QMutex* mutex; - QString port; - PortSettings Settings; - ulong lastErr; - QextSerialBase::QueryMode _queryMode; - - virtual qint64 readData(char * data, qint64 maxSize)=0; - virtual qint64 writeData(const char * data, qint64 maxSize)=0; - - public: - QextSerialBase(); - QextSerialBase(const QString & name); - virtual ~QextSerialBase(); - virtual void construct(); - virtual void setPortName(const QString & name); - virtual QString portName() const; - - /**! - * Get query mode. - * \return query mode. - */ - inline QextSerialBase::QueryMode queryMode() const { return _queryMode; }; - - /*! - * Set desired serial communication handling style. You may choose from polling - * or event driven approach. This function does nothing when port is open; to - * apply changes port must be reopened. - * - * In event driven approach read() and write() functions are acting - * asynchronously. They return immediately and the operation is performed in - * the background, so they doesn't freeze the calling thread. - * To determine when operation is finished, QextSerialPort runs separate thread - * and monitors serial port events. Whenever the event occurs, adequate signal - * is emitted. - * - * When polling is set, read() and write() are acting synchronously. Signals are - * not working in this mode and some functions may not be available. The advantage - * of polling is that it generates less overhead due to lack of signals emissions - * and it doesn't start separate thread to monitor events. - * - * Generally event driven approach is more capable and friendly, although some - * applications may need as low overhead as possible and then polling comes. - * - * \param mode query mode. - */ - virtual void setQueryMode(QueryMode mode); - -// virtual void setBlockingRead(bool block) = 0; ///< @todo implement. - - 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(long)=0; - - virtual bool open(OpenMode mode)=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; - - signals: - /** - * This signal is emitted whenever port settings are updated. - * \param valid \p true if settings are valid, \p false otherwise. - * - * @todo implement. - */ -// void validSettings(bool valid); - - /*! - * This signal is emitted whenever dsr line has changed its state. You may - * use this signal to check if device is connected. - * \param status \p true when DSR signal is on, \p false otherwise. - * - * \see lineStatus(). - */ - void dsrChanged(bool status); -}; - -#endif +#ifndef _QEXTSERIALBASE_H_ +#define _QEXTSERIALBASE_H_ + +#include +#include +#include +#include + +/*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*/ +#define LOCK_MUTEX() mutex->lock() +#define UNLOCK_MUTEX() mutex->unlock() + +/*macros for warning and debug messages*/ +#ifdef _TTY_NOWARN_PORT_ +#define TTY_PORTABILITY_WARNING(s) +#else +#define TTY_PORTABILITY_WARNING(s) qWarning(s) +#endif /*_TTY_NOWARN_PORT_*/ +#ifdef _TTY_NOWARN_ +#define TTY_WARNING(s) +#else +#define TTY_WARNING(s) qWarning(s) +#endif /*_TTY_NOWARN_*/ + + +/*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; + long Timeout_Millisec; +}; + +/*! + * \author Stefan Sander + * \author Michal Policht + * + * A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort. + */ +class QextSerialBase : public QIODevice +{ + Q_OBJECT + + public: + enum QueryMode { + Polling, + EventDriven + }; + + protected: + QMutex* mutex; + QString port; + PortSettings Settings; + ulong lastErr; + QextSerialBase::QueryMode _queryMode; + + virtual qint64 readData(char * data, qint64 maxSize)=0; + virtual qint64 writeData(const char * data, qint64 maxSize)=0; + + public: + QextSerialBase(); + QextSerialBase(const QString & name); + virtual ~QextSerialBase(); + virtual void construct(); + virtual void setPortName(const QString & name); + virtual QString portName() const; + + /**! + * Get query mode. + * \return query mode. + */ + inline QextSerialBase::QueryMode queryMode() const { return _queryMode; }; + + /*! + * Set desired serial communication handling style. You may choose from polling + * or event driven approach. This function does nothing when port is open; to + * apply changes port must be reopened. + * + * In event driven approach read() and write() functions are acting + * asynchronously. They return immediately and the operation is performed in + * the background, so they doesn't freeze the calling thread. + * To determine when operation is finished, QextSerialPort runs separate thread + * and monitors serial port events. Whenever the event occurs, adequate signal + * is emitted. + * + * When polling is set, read() and write() are acting synchronously. Signals are + * not working in this mode and some functions may not be available. The advantage + * of polling is that it generates less overhead due to lack of signals emissions + * and it doesn't start separate thread to monitor events. + * + * Generally event driven approach is more capable and friendly, although some + * applications may need as low overhead as possible and then polling comes. + * + * \param mode query mode. + */ + virtual void setQueryMode(QueryMode mode); + +// virtual void setBlockingRead(bool block) = 0; ///< @todo implement. + + 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(long)=0; + + virtual bool open(OpenMode mode)=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; + + signals: + /** + * This signal is emitted whenever port settings are updated. + * \param valid \p true if settings are valid, \p false otherwise. + * + * @todo implement. + */ +// void validSettings(bool valid); + + /*! + * This signal is emitted whenever dsr line has changed its state. You may + * use this signal to check if device is connected. + * \param status \p true when DSR signal is on, \p false otherwise. + * + * \see lineStatus(). + */ + void dsrChanged(bool status); +}; + +#endif diff --git a/qjson/upQJson.pri b/qjson/upQJson.pri index ce65f11..c31fa95 100644 --- a/qjson/upQJson.pri +++ b/qjson/upQJson.pri @@ -1,24 +1,24 @@ -!greaterThan(QT_MAJOR_VERSION, 4): { - - INCLUDEPATH += \ - $$PWD - - SOURCES += \ - $$PWD/qjson.cpp \ - $$PWD/qjsonarray.cpp \ - $$PWD/qjsondocument.cpp \ - $$PWD/qjsonobject.cpp \ - $$PWD/qjsonparser.cpp \ - $$PWD/qjsonvalue.cpp \ - $$PWD/qjsonwriter.cpp - - HEADERS += \ - $$PWD/qjson_p.h \ - $$PWD/qjsonarray.h \ - $$PWD/qjsondocument.h \ - $$PWD/qjsonobject.h \ - $$PWD/qjsonparser_p.h \ - $$PWD/qjsonvalue.h \ - $$PWD/qjsonwriter_p.h - -} +!greaterThan(QT_MAJOR_VERSION, 4): { + + INCLUDEPATH += \ + $$PWD + + SOURCES += \ + $$PWD/qjson.cpp \ + $$PWD/qjsonarray.cpp \ + $$PWD/qjsondocument.cpp \ + $$PWD/qjsonobject.cpp \ + $$PWD/qjsonparser.cpp \ + $$PWD/qjsonvalue.cpp \ + $$PWD/qjsonwriter.cpp + + HEADERS += \ + $$PWD/qjson_p.h \ + $$PWD/qjsonarray.h \ + $$PWD/qjsondocument.h \ + $$PWD/qjsonobject.h \ + $$PWD/qjsonparser_p.h \ + $$PWD/qjsonvalue.h \ + $$PWD/qjsonwriter_p.h + +} diff --git a/rfid/rfidfunction.cpp b/rfid/rfidfunction.cpp index 3ff799a..234ad13 100644 --- a/rfid/rfidfunction.cpp +++ b/rfid/rfidfunction.cpp @@ -1,639 +1,639 @@ -#include "rfidfunction.h" -#include "sm3.h" -#include "sm4.h" -#include -#include - - -// 计算校验和并输出 -void RFIDFunction::CheckSumOut(unsigned char* buf, unsigned char len) -{ - unsigned char i; - unsigned char checksum; - checksum = 0; - for (i = 0; i < (len - 1); i++) - { - checksum ^= buf[i]; // 逐位异或计算校验和 - } - buf[len - 1] = (unsigned char)~checksum; // 取反作为校验和 -} - -// 检查输入的校验和是否正确 -bool RFIDFunction::CheckSumIn(unsigned char* buf, unsigned char len) -{ - unsigned char i; - unsigned char checksum; - checksum = 0; - for (i = 0; i < (len - 1); i++) - { - checksum ^= buf[i]; // 逐位异或计算校验和 - } - if (buf[len - 1] == (unsigned char)~checksum) // 比较校验和 - { - return true; // 校验和正确 - } - return false; // 校验和错误 -} - -// 将十六进制字符串转换为字节数组 -void hexStrToByte(const QByteArray& hexIn, unsigned char* dest) -{ - int sourceLen = hexIn.size(); - unsigned char* source = (unsigned char*)hexIn.constData(); - short i; - unsigned char highByte, lowByte; - - for (i = 0; i < sourceLen; i += 2) - { - highByte = toupper(source[i]); // 高位 - lowByte = toupper(source[i + 1]); // 低位 - - if (highByte > 0x39) - { - highByte -= 0x37; // A-F转换 - } - else - { - highByte -= 0x30; // 0-9转换 - } - - if (lowByte > 0x39) - { - lowByte -= 0x37; // A-F转换 - } - else - { - lowByte -= 0x30; // 0-9转换 - } - dest[i / 2] = (highByte << 4) | lowByte; // 合并高低位 - } - return; -} - -// 检测输入的字符是否是有效的16进制字符 -bool isValidHex(const QByteArray& input) -{ - int length = input.size(); // 获取输入的长度 - for (int i = 0; i < length; ++i) // 使用传统的for循环 - { - char c = input[i]; // 获取当前字符 - // 检查字符是否在0-9, A-F, a-f范围内 - if (!((c >= '0' && c <= '9') || - (c >= 'A' && c <= 'F') || - (c >= 'a' && c <= 'f'))) - { - return false; // 如果有无效字符,返回false - } - } - return true; // 所有字符均有效,返回true -} - - -void sleepMs(unsigned int msec) -{ - QTime dieTime = QTime::currentTime().addMSecs(msec); - - while( QTime::currentTime() < dieTime ) - - QCoreApplication::processEvents(QEventLoop::AllEvents, 100); -} - - -RFIDFunction::RFIDFunction(QObject *parent) - : QObject(parent),m_SerialPort(NULL) -{ - m_SerialSate = initSerialPortAndOpen("COM3"); // 初始化串口 -} - -RFIDFunction::~RFIDFunction() -{ - m_SerialPort->deleteLater(); -} - -/*** - * @描述 : 创建读写卡的密码(Key_A和Key_B) - * @入参 : info 生成密码的数据 - * @输出 : 无 - * @返回 : 密钥的原始数据 - */ -const QByteArray RFIDFunction::createPassword(const QByteArray& info) -{ - if (info.isEmpty()) - { - return ""; // 如果输入为空,返回空 - } - int inputSize = info.size(); - if (inputSize > 8192) - { - return ""; // 如果输入大小超过限制,返回空 - } - //先用SM3对原始数据进行哈希生成 - unsigned char hashDataOrigin[32] = { 0 }; - SM3::sm3Hash((unsigned char*)info.data(), inputSize, hashDataOrigin); // 生成哈希 - - //接着使用哈希生成SM4加密密钥 - unsigned char sm4Key[16] = { 0 }; - unsigned char sm4IV[16] = { 0 }; - int index_1 = 0; - int index_2 = 0; - for (int i = 0; i < 32; i++) - { - if (i % 2 == 0) - { - sm4Key[index_1++] = hashDataOrigin[i]; // 偶数位作为SM4密钥 - } - else - { - sm4IV[index_2++] = hashDataOrigin[i]; // 奇数位作为SM4初始向量 - } - } - - //再用SM4对原始数据进行加密 - unsigned char out[8192] = {0}; - sm4_context sm4Ctx; - SM4::sm4_setkey_enc(&sm4Ctx, sm4Key); // 设置SM4加密密钥 - SM4::sm4_crypt_cbc(&sm4Ctx, SM4_ENCRYPT, inputSize, sm4IV, (unsigned char*)info.data(), out); // 执行SM4加密 - - //最后再用SM3对加密后的数据取哈希 - unsigned char hashEncrypted[32] = { 0 }; - SM3::sm3Hash(out, inputSize, hashEncrypted); // 生成加密数据的哈希 - index_1 = 0; - char key[16] = { 0 }; - for (int i = 0; i < 32; i++) - { - if (i % 2 != 0)//取哈希的奇数位作为最终的密码 - { - key[index_1++] = hashEncrypted[i]; - } - } - return QByteArray(key,16).toHex(); // 返回最终的密码 -} - - -bool RFIDFunction::getSerialState() -{ - return m_SerialSate; // 返回串口状态 -} - -RFIDFunction::ErrorCode RFIDFunction::initSerialPortAndOpen(const QString& portName, - BaudRateType baudRate, - DataBitsType setDataBits, - StopBitsType stopBits, - ParityType parity) -{ - m_SerialPort = new Posix_QextSerialPort("/dev/ttyO3",QextSerialBase::Polling); // 创建串口对象 - m_SerialPort->setPortName(portName); // 设置串口名称 - m_SerialPort->setBaudRate((BaudRateType)baudRate); // 设置波特率 - m_SerialPort->setDataBits(setDataBits); // 设置数据位 - m_SerialPort->setStopBits(stopBits); // 设置停止位 - m_SerialPort->setParity(parity); // 设置校验位 - m_SerialPort->setFlowControl(FLOW_OFF); - if (m_SerialPort->open(QIODevice::ReadWrite)) // 打开串口 - { - return Serial_Error; // 打开失败,返回串口错误 - } - - return No_Error; // 打开成功,返回无错误 -} - -RFIDFunction::ErrorCode RFIDFunction::setOriginPassword(const QByteArray& psw) -{ - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x03; // 命令头 - com[1] = 0x0B; // 数据长度 - com[2] = 0xC4; // 命令类型 - com[3] = 0x20; // 额外数据 - unsigned char hexOut[32] = { 0 }; // 存储转换后的十六进制数据 - hexStrToByte(psw, hexOut); // 将密码转换为字节数组 - memcpy(com + 4, hexOut, 6); // 将密码添加到命令中 - CheckSumOut(com, com[1]); // 计算校验和 - - //QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x03) && (revData[1] == 0x08) && (revData[2] == 0xC4) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} - -RFIDFunction::ErrorCode RFIDFunction::setWriteAndReadPassword(const QByteArray& writePassword, const QByteArray& readPassword, KeyFunction keyFunc) -{ - if (writePassword.isEmpty() || readPassword.isEmpty()) - { - return Data_Is_Empty_Error; // 如果密码为空,返回错误 - } - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x03; // 命令头 - com[1] = 0x15; // 数据长度 - com[2] = 0xC3; // 命令类型 - com[3] = 0x20; // 额外数据 - unsigned char hexOut[32] = { 0 }; // 存储转换后的十六进制数据 - hexStrToByte(writePassword.toHex(), hexOut); // 将写密码转换为字节数组 - memcpy(com + 4, hexOut, 6); // 将写密码添加到命令中 - switch (keyFunc) // 根据密钥功能设置命令 - { - case RFIDFunction::KeyA_Same_KeyB: - /* - * 控制如下:KEYA,KEYB 可以用来读 、写 、增值 、减值 、更改扇区密钥 - */ - com[10] = 0xFF; // 设置KEYA和KEYB相同 - com[11] = 0x07; // 设置权限 - com[12] = 0x80; // 设置操作 - com[13] = 0x69; // 设置结束标志 - break; - case RFIDFunction::KeyB_Control_KeyA: - /* - 控制如下:KEYA 可以读数据块 、减值 、查询余额 - KEYB 可以读写数据块 、增值 、减值 、查询余额 - KEYA 、KEYB 不可读,KEYA,KEYB 由 KEYB 修改 - */ - com[10] = 0x08; // 设置KEYB控制KEYA - com[11] = 0x77; // 设置权限 - com[12] = 0x8F; // 设置操作 - com[13] = 0x69; // 设置结束标志 - break; - default: - break; - } - memset(hexOut, 0, 32); // 清空hexOut - hexStrToByte(readPassword.toHex(), hexOut); // 将读密码转换为字节数组 - memcpy(com + 14, hexOut, 6); // 将读密码添加到命令中 - CheckSumOut(com, com[1]); // 计算校验和 - - QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 - - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x03) && (revData[1] == 0x08) && (revData[2] == 0xC3) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} - -RFIDFunction::ErrorCode RFIDFunction::setEncryptedBlock(KeyType type, ControlBlock block) -{ - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x01; // 命令头 - com[1] = 0x08; // 数据长度 - switch (type)//只有两种密码,A和B - { - case RFIDFunction::KEY_A: - com[2] = 0xA5; // 设置为KEY_A - break; - case RFIDFunction::KEY_B: - com[2] = 0x5A; // 设置为KEY_B - break; - default: - com[2] = 0xA5; // 默认设置为KEY_A - break; - } - com[3] = 0x20; // 额外数据 - memcpy(com + 4, &block, 1); // 将加密块添加到命令中 - - com[5] = 0x01;//蜂鸣器开 0x00不开 - com[6] = 0x00;//保留 - CheckSumOut(com, com[1]); // 计算校验和 - - QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 - - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x01) && (revData[1] == 0x08) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} - -RFIDFunction::ErrorCode RFIDFunction::writeDataToBlock(KeyType type, DataBlock block, const QByteArray& data) -{ - if (data.isEmpty()) - { - return Data_Is_Empty_Error; // 如果数据为空,返回错误 - } - - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x01; // 命令头 - com[1] = 0x17; // 数据长度 - switch (type)//只有两种密码,A和B - { - case RFIDFunction::KEY_A: - com[2] = 0xA4; // 设置为KEY_A - break; - case RFIDFunction::KEY_B: - com[2] = 0x5B; // 设置为KEY_B - break; - default: - com[2] = 0xA4; // 默认设置为KEY_A - break; - } - com[3] = 0x20; // 额外数据 - memcpy(com + 4, &block, 1); // 将数据块添加到命令中 - - com[5] = 0x01;//蜂鸣器开 0x00不开 - unsigned char hexOut[32] = { 0 }; // 存储转换后的十六进制数据 - memset(hexOut, 0, 32); // 清空hexOut - if (!isValidHex(data)) // 检查数据是否合法 - { - return Data_Is_Illegal_Error; // 数据非法 - } - hexStrToByte(data, hexOut); // 将数据转换为字节数组 - memcpy(com + 6, hexOut, 16); // 将数据添加到命令中 - - CheckSumOut(com, com[1]); // 计算校验和 - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x01) && (revData[1] == 0x08) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} - -RFIDFunction::ErrorCode RFIDFunction::readDataFromBlock(KeyType type, DataBlock block, QByteArray& data) -{ - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x01; // 命令头 - com[1] = 0x08; // 数据长度 - switch (type)//只有两种密码,A和B - { - case RFIDFunction::KEY_A: - com[2] = 0xA3; // 设置为KEY_A - break; - case RFIDFunction::KEY_B: - com[2] = 0x5C; // 设置为KEY_B - break; - default: - com[2] = 0xA3; // 默认设置为KEY_A - break; - } - com[3] = 0x20; // 额外数据 - - memcpy(com + 4, &block, 1); // 将数据块添加到命令中 - - com[5] = 0x01;//蜂鸣器开 0x00不开 - com[6] = 0x00;//保留 - CheckSumOut(com, com[1]); // 计算校验和 - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - //QByteArray AAA = readData.toHex(); // 转换为十六进制字符串 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x01) && (revData[1] == 0x16) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - data = QByteArray::fromHex(readData.mid(3,16)); - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} - - -RFIDFunction::ErrorCode RFIDFunction::setWorkMode(WorkMode mode, DataBlock block, UploadMode uploadMode) -{ - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x03; // 命令头 - com[1] = 0x08; // 数据长度 - com[2] = 0xC1; // 工作模式 - com[3] = 0x20; // 设备号数据 - - memcpy(com + 4, &mode, 1); // 将工作模式添加到命令中 - switch (mode) - { - case RFIDFunction::Command_Mode: - com[5] = 0x00; - com[6] = 0x00; - break; - case RFIDFunction::Auto_Read_Card_Num_Mode: - com[5] = 0x00; - com[6] = uploadMode; - break; - case RFIDFunction::Auto_Read_Data_Mode: - case RFIDFunction::Auto_Read_Card_Num_Data_Mode: - default: - com[5] = block; - com[6] = uploadMode; - break; - } - CheckSumOut(com, com[1]); // 计算校验和 - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - QByteArray AAA = readData.toHex(); // 转换为十六进制字符串 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x03) && (revData[1] == 0x08) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} - -RFIDFunction::ErrorCode RFIDFunction::getReaderAddress(QByteArray& psw) -{ - unsigned char com[32] = { 0 }; // 命令数组 - com[0] = 0x02; // 命令头 - com[1] = 0x08; // 数据长度 - com[2] = 0xB0; // 命令类型 - com[3] = 0x00; // 额外数据 - com[4] = 0x00; // 额外数据 - com[5] = 0x00; // 额外数据 - com[6] = 0x00; // 额外数据 - - CheckSumOut(com, com[1]); // 计算校验和 - - QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 - if (m_SerialPort->isOpen()) // 检查串口是否打开 - { - qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 - if (len != com[1]) // 检查发送长度 - { - return Send_Data_Error; // 发送错误 - } - // 等待请求完成 - sleepMs(200); - - QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 - unsigned char revData[32] = { 0 }; // 存储返回数据 - memcpy(revData, readData.data(), readData.size()); // 复制返回数据 - if ((revData[0] == 0x02) && (revData[1] == 0x08) && (revData[2] == com[2])) //判断是否为写数据返回的数据包 - { - bool status = CheckSumIn(revData, revData[1]); //计算校验和 - if (status) - { - if (revData[4] == 0x00) //写数据块成功 - { - psw = QByteArray::fromHex(QByteArray(revData[5], 1)); - return No_Error; // 返回无错误 - } - } - else - { - return Received_Data_Check_Error; // 校验和错误 - } - } - else - { - return Received_Data_Error; // 返回数据错误 - } - } - return Serial_Error; // 串口错误 -} +#include "rfidfunction.h" +#include "sm3.h" +#include "sm4.h" +#include +#include + + +// 计算校验和并输出 +void RFIDFunction::CheckSumOut(unsigned char* buf, unsigned char len) +{ + unsigned char i; + unsigned char checksum; + checksum = 0; + for (i = 0; i < (len - 1); i++) + { + checksum ^= buf[i]; // 逐位异或计算校验和 + } + buf[len - 1] = (unsigned char)~checksum; // 取反作为校验和 +} + +// 检查输入的校验和是否正确 +bool RFIDFunction::CheckSumIn(unsigned char* buf, unsigned char len) +{ + unsigned char i; + unsigned char checksum; + checksum = 0; + for (i = 0; i < (len - 1); i++) + { + checksum ^= buf[i]; // 逐位异或计算校验和 + } + if (buf[len - 1] == (unsigned char)~checksum) // 比较校验和 + { + return true; // 校验和正确 + } + return false; // 校验和错误 +} + +// 将十六进制字符串转换为字节数组 +void hexStrToByte(const QByteArray& hexIn, unsigned char* dest) +{ + int sourceLen = hexIn.size(); + unsigned char* source = (unsigned char*)hexIn.constData(); + short i; + unsigned char highByte, lowByte; + + for (i = 0; i < sourceLen; i += 2) + { + highByte = toupper(source[i]); // 高位 + lowByte = toupper(source[i + 1]); // 低位 + + if (highByte > 0x39) + { + highByte -= 0x37; // A-F转换 + } + else + { + highByte -= 0x30; // 0-9转换 + } + + if (lowByte > 0x39) + { + lowByte -= 0x37; // A-F转换 + } + else + { + lowByte -= 0x30; // 0-9转换 + } + dest[i / 2] = (highByte << 4) | lowByte; // 合并高低位 + } + return; +} + +// 检测输入的字符是否是有效的16进制字符 +bool isValidHex(const QByteArray& input) +{ + int length = input.size(); // 获取输入的长度 + for (int i = 0; i < length; ++i) // 使用传统的for循环 + { + char c = input[i]; // 获取当前字符 + // 检查字符是否在0-9, A-F, a-f范围内 + if (!((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'F') || + (c >= 'a' && c <= 'f'))) + { + return false; // 如果有无效字符,返回false + } + } + return true; // 所有字符均有效,返回true +} + + +void sleepMs(unsigned int msec) +{ + QTime dieTime = QTime::currentTime().addMSecs(msec); + + while( QTime::currentTime() < dieTime ) + + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); +} + + +RFIDFunction::RFIDFunction(QObject *parent) + : QObject(parent),m_SerialPort(NULL) +{ + m_SerialSate = initSerialPortAndOpen("COM3"); // 初始化串口 +} + +RFIDFunction::~RFIDFunction() +{ + m_SerialPort->deleteLater(); +} + +/*** + * @描述 : 创建读写卡的密码(Key_A和Key_B) + * @入参 : info 生成密码的数据 + * @输出 : 无 + * @返回 : 密钥的原始数据 + */ +const QByteArray RFIDFunction::createPassword(const QByteArray& info) +{ + if (info.isEmpty()) + { + return ""; // 如果输入为空,返回空 + } + int inputSize = info.size(); + if (inputSize > 8192) + { + return ""; // 如果输入大小超过限制,返回空 + } + //先用SM3对原始数据进行哈希生成 + unsigned char hashDataOrigin[32] = { 0 }; + SM3::sm3Hash((unsigned char*)info.data(), inputSize, hashDataOrigin); // 生成哈希 + + //接着使用哈希生成SM4加密密钥 + unsigned char sm4Key[16] = { 0 }; + unsigned char sm4IV[16] = { 0 }; + int index_1 = 0; + int index_2 = 0; + for (int i = 0; i < 32; i++) + { + if (i % 2 == 0) + { + sm4Key[index_1++] = hashDataOrigin[i]; // 偶数位作为SM4密钥 + } + else + { + sm4IV[index_2++] = hashDataOrigin[i]; // 奇数位作为SM4初始向量 + } + } + + //再用SM4对原始数据进行加密 + unsigned char out[8192] = {0}; + sm4_context sm4Ctx; + SM4::sm4_setkey_enc(&sm4Ctx, sm4Key); // 设置SM4加密密钥 + SM4::sm4_crypt_cbc(&sm4Ctx, SM4_ENCRYPT, inputSize, sm4IV, (unsigned char*)info.data(), out); // 执行SM4加密 + + //最后再用SM3对加密后的数据取哈希 + unsigned char hashEncrypted[32] = { 0 }; + SM3::sm3Hash(out, inputSize, hashEncrypted); // 生成加密数据的哈希 + index_1 = 0; + char key[16] = { 0 }; + for (int i = 0; i < 32; i++) + { + if (i % 2 != 0)//取哈希的奇数位作为最终的密码 + { + key[index_1++] = hashEncrypted[i]; + } + } + return QByteArray(key,16).toHex(); // 返回最终的密码 +} + + +bool RFIDFunction::getSerialState() +{ + return m_SerialSate; // 返回串口状态 +} + +RFIDFunction::ErrorCode RFIDFunction::initSerialPortAndOpen(const QString& portName, + BaudRateType baudRate, + DataBitsType setDataBits, + StopBitsType stopBits, + ParityType parity) +{ + m_SerialPort = new Posix_QextSerialPort("/dev/ttyO3",QextSerialBase::Polling); // 创建串口对象 + m_SerialPort->setPortName(portName); // 设置串口名称 + m_SerialPort->setBaudRate((BaudRateType)baudRate); // 设置波特率 + m_SerialPort->setDataBits(setDataBits); // 设置数据位 + m_SerialPort->setStopBits(stopBits); // 设置停止位 + m_SerialPort->setParity(parity); // 设置校验位 + m_SerialPort->setFlowControl(FLOW_OFF); + if (m_SerialPort->open(QIODevice::ReadWrite)) // 打开串口 + { + return Serial_Error; // 打开失败,返回串口错误 + } + + return No_Error; // 打开成功,返回无错误 +} + +RFIDFunction::ErrorCode RFIDFunction::setOriginPassword(const QByteArray& psw) +{ + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x03; // 命令头 + com[1] = 0x0B; // 数据长度 + com[2] = 0xC4; // 命令类型 + com[3] = 0x20; // 额外数据 + unsigned char hexOut[32] = { 0 }; // 存储转换后的十六进制数据 + hexStrToByte(psw, hexOut); // 将密码转换为字节数组 + memcpy(com + 4, hexOut, 6); // 将密码添加到命令中 + CheckSumOut(com, com[1]); // 计算校验和 + + //QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x03) && (revData[1] == 0x08) && (revData[2] == 0xC4) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} + +RFIDFunction::ErrorCode RFIDFunction::setWriteAndReadPassword(const QByteArray& writePassword, const QByteArray& readPassword, KeyFunction keyFunc) +{ + if (writePassword.isEmpty() || readPassword.isEmpty()) + { + return Data_Is_Empty_Error; // 如果密码为空,返回错误 + } + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x03; // 命令头 + com[1] = 0x15; // 数据长度 + com[2] = 0xC3; // 命令类型 + com[3] = 0x20; // 额外数据 + unsigned char hexOut[32] = { 0 }; // 存储转换后的十六进制数据 + hexStrToByte(writePassword.toHex(), hexOut); // 将写密码转换为字节数组 + memcpy(com + 4, hexOut, 6); // 将写密码添加到命令中 + switch (keyFunc) // 根据密钥功能设置命令 + { + case RFIDFunction::KeyA_Same_KeyB: + /* + * 控制如下:KEYA,KEYB 可以用来读 、写 、增值 、减值 、更改扇区密钥 + */ + com[10] = 0xFF; // 设置KEYA和KEYB相同 + com[11] = 0x07; // 设置权限 + com[12] = 0x80; // 设置操作 + com[13] = 0x69; // 设置结束标志 + break; + case RFIDFunction::KeyB_Control_KeyA: + /* + 控制如下:KEYA 可以读数据块 、减值 、查询余额 + KEYB 可以读写数据块 、增值 、减值 、查询余额 + KEYA 、KEYB 不可读,KEYA,KEYB 由 KEYB 修改 + */ + com[10] = 0x08; // 设置KEYB控制KEYA + com[11] = 0x77; // 设置权限 + com[12] = 0x8F; // 设置操作 + com[13] = 0x69; // 设置结束标志 + break; + default: + break; + } + memset(hexOut, 0, 32); // 清空hexOut + hexStrToByte(readPassword.toHex(), hexOut); // 将读密码转换为字节数组 + memcpy(com + 14, hexOut, 6); // 将读密码添加到命令中 + CheckSumOut(com, com[1]); // 计算校验和 + + QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 + + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x03) && (revData[1] == 0x08) && (revData[2] == 0xC3) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} + +RFIDFunction::ErrorCode RFIDFunction::setEncryptedBlock(KeyType type, ControlBlock block) +{ + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x01; // 命令头 + com[1] = 0x08; // 数据长度 + switch (type)//只有两种密码,A和B + { + case RFIDFunction::KEY_A: + com[2] = 0xA5; // 设置为KEY_A + break; + case RFIDFunction::KEY_B: + com[2] = 0x5A; // 设置为KEY_B + break; + default: + com[2] = 0xA5; // 默认设置为KEY_A + break; + } + com[3] = 0x20; // 额外数据 + memcpy(com + 4, &block, 1); // 将加密块添加到命令中 + + com[5] = 0x01;//蜂鸣器开 0x00不开 + com[6] = 0x00;//保留 + CheckSumOut(com, com[1]); // 计算校验和 + + QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 + + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x01) && (revData[1] == 0x08) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} + +RFIDFunction::ErrorCode RFIDFunction::writeDataToBlock(KeyType type, DataBlock block, const QByteArray& data) +{ + if (data.isEmpty()) + { + return Data_Is_Empty_Error; // 如果数据为空,返回错误 + } + + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x01; // 命令头 + com[1] = 0x17; // 数据长度 + switch (type)//只有两种密码,A和B + { + case RFIDFunction::KEY_A: + com[2] = 0xA4; // 设置为KEY_A + break; + case RFIDFunction::KEY_B: + com[2] = 0x5B; // 设置为KEY_B + break; + default: + com[2] = 0xA4; // 默认设置为KEY_A + break; + } + com[3] = 0x20; // 额外数据 + memcpy(com + 4, &block, 1); // 将数据块添加到命令中 + + com[5] = 0x01;//蜂鸣器开 0x00不开 + unsigned char hexOut[32] = { 0 }; // 存储转换后的十六进制数据 + memset(hexOut, 0, 32); // 清空hexOut + if (!isValidHex(data)) // 检查数据是否合法 + { + return Data_Is_Illegal_Error; // 数据非法 + } + hexStrToByte(data, hexOut); // 将数据转换为字节数组 + memcpy(com + 6, hexOut, 16); // 将数据添加到命令中 + + CheckSumOut(com, com[1]); // 计算校验和 + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x01) && (revData[1] == 0x08) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} + +RFIDFunction::ErrorCode RFIDFunction::readDataFromBlock(KeyType type, DataBlock block, QByteArray& data) +{ + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x01; // 命令头 + com[1] = 0x08; // 数据长度 + switch (type)//只有两种密码,A和B + { + case RFIDFunction::KEY_A: + com[2] = 0xA3; // 设置为KEY_A + break; + case RFIDFunction::KEY_B: + com[2] = 0x5C; // 设置为KEY_B + break; + default: + com[2] = 0xA3; // 默认设置为KEY_A + break; + } + com[3] = 0x20; // 额外数据 + + memcpy(com + 4, &block, 1); // 将数据块添加到命令中 + + com[5] = 0x01;//蜂鸣器开 0x00不开 + com[6] = 0x00;//保留 + CheckSumOut(com, com[1]); // 计算校验和 + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + //QByteArray AAA = readData.toHex(); // 转换为十六进制字符串 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x01) && (revData[1] == 0x16) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + data = QByteArray::fromHex(readData.mid(3,16)); + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} + + +RFIDFunction::ErrorCode RFIDFunction::setWorkMode(WorkMode mode, DataBlock block, UploadMode uploadMode) +{ + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x03; // 命令头 + com[1] = 0x08; // 数据长度 + com[2] = 0xC1; // 工作模式 + com[3] = 0x20; // 设备号数据 + + memcpy(com + 4, &mode, 1); // 将工作模式添加到命令中 + switch (mode) + { + case RFIDFunction::Command_Mode: + com[5] = 0x00; + com[6] = 0x00; + break; + case RFIDFunction::Auto_Read_Card_Num_Mode: + com[5] = 0x00; + com[6] = uploadMode; + break; + case RFIDFunction::Auto_Read_Data_Mode: + case RFIDFunction::Auto_Read_Card_Num_Data_Mode: + default: + com[5] = block; + com[6] = uploadMode; + break; + } + CheckSumOut(com, com[1]); // 计算校验和 + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + QByteArray AAA = readData.toHex(); // 转换为十六进制字符串 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x03) && (revData[1] == 0x08) && (revData[2] == com[2]) && (revData[3] == 0x20)) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} + +RFIDFunction::ErrorCode RFIDFunction::getReaderAddress(QByteArray& psw) +{ + unsigned char com[32] = { 0 }; // 命令数组 + com[0] = 0x02; // 命令头 + com[1] = 0x08; // 数据长度 + com[2] = 0xB0; // 命令类型 + com[3] = 0x00; // 额外数据 + com[4] = 0x00; // 额外数据 + com[5] = 0x00; // 额外数据 + com[6] = 0x00; // 额外数据 + + CheckSumOut(com, com[1]); // 计算校验和 + + QByteArray AAA = QByteArray((char*)com, com[1]).toHex(); // 转换为十六进制字符串 + if (m_SerialPort->isOpen()) // 检查串口是否打开 + { + qint64 len = m_SerialPort->write(QByteArray((char*)com, com[1])); // 发送命令 + if (len != com[1]) // 检查发送长度 + { + return Send_Data_Error; // 发送错误 + } + // 等待请求完成 + sleepMs(200); + + QByteArray readData = m_SerialPort->readAll(); // 读取返回数据 + unsigned char revData[32] = { 0 }; // 存储返回数据 + memcpy(revData, readData.data(), readData.size()); // 复制返回数据 + if ((revData[0] == 0x02) && (revData[1] == 0x08) && (revData[2] == com[2])) //判断是否为写数据返回的数据包 + { + bool status = CheckSumIn(revData, revData[1]); //计算校验和 + if (status) + { + if (revData[4] == 0x00) //写数据块成功 + { + psw = QByteArray::fromHex(QByteArray(revData[5], 1)); + return No_Error; // 返回无错误 + } + } + else + { + return Received_Data_Check_Error; // 校验和错误 + } + } + else + { + return Received_Data_Error; // 返回数据错误 + } + } + return Serial_Error; // 串口错误 +} diff --git a/rfid/rfidfunction.h b/rfid/rfidfunction.h index 5012539..81304c2 100644 --- a/rfid/rfidfunction.h +++ b/rfid/rfidfunction.h @@ -1,171 +1,171 @@ -#pragma once - -#include -#include -#include -#include "posix_qextserialport.h" - -class RFIDFunction:public QObject -{ - Q_OBJECT -public: - enum ControlBlock//加密块 - { - Sector_0_Block_3 = 3, - Sector_1_Block_3 = 7, - Sector_2_Block_3 = 11, - Sector_3_Block_3 = 15, - Sector_4_Block_3 = 19, - Sector_5_Block_3 = 23, - Sector_6_Block_3 = 27, - Sector_7_Block_3 = 31, - Sector_8_Block_3 = 35, - Sector_9_Block_3 = 39, - Sector_10_Block_3 = 43, - Sector_11_Block_3 = 47, - Sector_12_Block_3 = 51, - Sector_13_Block_3 = 55, - Sector_14_Block_3 = 59, - Sector_15_Block_3 = 63 - }; - - enum KeyType//密钥类型 - { - KEY_A = 0, // 密钥A - KEY_B // 密钥B - }; - - enum DataBlock //数据块 - { - Sector_0_Block_1 = 1, - Sector_0_Block_2 = 2, - - Sector_1_Block_0 = 4, - Sector_1_Block_1 = 5, - Sector_1_Block_2 = 6, - - Sector_2_Block_0 = 8, - Sector_2_Block_1 = 9, - Sector_2_Block_2 = 10, - - Sector_3_Block_0 = 12, - Sector_3_Block_1 = 13, - Sector_3_Block_2 = 14, - - Sector_4_Block_0 = 16, - Sector_4_Block_1 = 17, - Sector_4_Block_2 = 18, - - Sector_5_Block_0 = 20, - Sector_5_Block_1 = 21, - Sector_5_Block_2 = 22, - - Sector_6_Block_0 = 24, - Sector_6_Block_1 = 25, - Sector_6_Block_2 = 26, - - Sector_7_Block_0 = 28, - Sector_7_Block_1 = 29, - Sector_7_Block_2 = 30, - - Sector_8_Block_0 = 32, - Sector_8_Block_1 = 33, - Sector_8_Block_2 = 34, - - Sector_9_Block_0 = 36, - Sector_9_Block_1 = 37, - Sector_9_Block_2 = 38, - - Sector_10_Block_0 = 40, - Sector_10_Block_1 = 41, - Sector_10_Block_2 = 42, - - Sector_11_Block_0 = 44, - Sector_11_Block_1 = 45, - Sector_11_Block_2 = 46, - - Sector_12_Block_0 = 48, - Sector_12_Block_1 = 49, - Sector_12_Block_2 = 50, - - Sector_13_Block_0 = 52, - Sector_13_Block_1 = 53, - Sector_13_Block_2 = 54, - - Sector_14_Block_0 = 56, - Sector_14_Block_1 = 57, - Sector_14_Block_2 = 58, - - Sector_15_Block_0 = 60, - Sector_15_Block_1 = 61, - Sector_15_Block_2 = 62 - }; - - enum KeyFunction - { - KeyA_Same_KeyB = 0, // KEYA和KEYB相同 - KeyB_Control_KeyA // KEYB控制KEYA - }; - - - - enum WorkMode //工作模式 - { - Command_Mode = 0x01,//命令模式(关闭自动读卡),该模式会关闭自动读卡功能 - Auto_Read_Card_Num_Mode = 0x02,//自动读卡号 - Auto_Read_Data_Mode = 0x03,//自动读块数据,块号为要自动读的数据块编号 - Auto_Read_Card_Num_Data_Mode = 0x04//自动读卡号与指定块数据,块号为要自动读的数据块编号 - }; - - enum UploadMode//上传模式 - { - Auto_Upload = 0x00,//读卡后主动发送数据,主动将读到的数据发送给上位机 - Command_Upload = 0x01//读卡后被动发送数据,需要收到上位机获取数据的命令才将读到的数据发送给上位机 - }; - - - - enum ErrorCode - { - No_Error = 0, // 无错误 - Serial_Error, // 串口错误 - Send_Data_Error, // 发送数据错误 - Data_Is_Empty_Error, // 数据为空错误 - Data_Size_More_Than_8192_Error, // 数据大小超过8192错误 - Received_Data_Check_Error, // 接收数据校验错误 - Received_Data_Error, // 接收数据错误 - Data_Is_Illegal_Error // 数据非法错误 - }; - -public: - RFIDFunction(QObject* parent); // 构造函数 - ~RFIDFunction(); // 析构函数 - void CheckSumOut(unsigned char* buf, unsigned char len); - bool CheckSumIn(unsigned char* buf, unsigned char len); - - - ErrorCode initSerialPortAndOpen(const QString& portName, // 初始化串口并打开 - BaudRateType baudRate = BAUD9600, // 波特率 - DataBitsType setDataBits = DATA_8, // 数据位 - StopBitsType stopBits = STOP_1, // 停止位 - ParityType parity = PAR_NONE // 校验位 - ); - - static const QByteArray createPassword(const QByteArray& info); // 创建密码 - - bool getSerialState(); // 获取串口状态 - ErrorCode setOriginPassword(const QByteArray& psw); // 设置原始密码 - ErrorCode setWriteAndReadPassword(const QByteArray& writePassword, const QByteArray& readPassword, KeyFunction keyFunc); // 设置读写密码 - ErrorCode setEncryptedBlock(KeyType type, ControlBlock block); // 设置加密块 - ErrorCode writeDataToBlock(KeyType type, DataBlock block, const QByteArray& data); // 写数据到块 - ErrorCode readDataFromBlock(KeyType type, DataBlock block, QByteArray& data); // 从块读取数据 - ErrorCode setWorkMode(WorkMode mode, DataBlock block = Sector_1_Block_2, UploadMode uploadMode = Auto_Upload);//设置工作模式 - ErrorCode getReaderAddress(QByteArray& psw); // 获取读卡器地址 - - - -private: - bool m_SerialSate; // 串口状态 - Posix_QextSerialPort *m_SerialPort;; // 串口对象 - -}; +#pragma once + +#include +#include +#include +#include "posix_qextserialport.h" + +class RFIDFunction:public QObject +{ + Q_OBJECT +public: + enum ControlBlock//加密块 + { + Sector_0_Block_3 = 3, + Sector_1_Block_3 = 7, + Sector_2_Block_3 = 11, + Sector_3_Block_3 = 15, + Sector_4_Block_3 = 19, + Sector_5_Block_3 = 23, + Sector_6_Block_3 = 27, + Sector_7_Block_3 = 31, + Sector_8_Block_3 = 35, + Sector_9_Block_3 = 39, + Sector_10_Block_3 = 43, + Sector_11_Block_3 = 47, + Sector_12_Block_3 = 51, + Sector_13_Block_3 = 55, + Sector_14_Block_3 = 59, + Sector_15_Block_3 = 63 + }; + + enum KeyType//密钥类型 + { + KEY_A = 0, // 密钥A + KEY_B // 密钥B + }; + + enum DataBlock //数据块 + { + Sector_0_Block_1 = 1, + Sector_0_Block_2 = 2, + + Sector_1_Block_0 = 4, + Sector_1_Block_1 = 5, + Sector_1_Block_2 = 6, + + Sector_2_Block_0 = 8, + Sector_2_Block_1 = 9, + Sector_2_Block_2 = 10, + + Sector_3_Block_0 = 12, + Sector_3_Block_1 = 13, + Sector_3_Block_2 = 14, + + Sector_4_Block_0 = 16, + Sector_4_Block_1 = 17, + Sector_4_Block_2 = 18, + + Sector_5_Block_0 = 20, + Sector_5_Block_1 = 21, + Sector_5_Block_2 = 22, + + Sector_6_Block_0 = 24, + Sector_6_Block_1 = 25, + Sector_6_Block_2 = 26, + + Sector_7_Block_0 = 28, + Sector_7_Block_1 = 29, + Sector_7_Block_2 = 30, + + Sector_8_Block_0 = 32, + Sector_8_Block_1 = 33, + Sector_8_Block_2 = 34, + + Sector_9_Block_0 = 36, + Sector_9_Block_1 = 37, + Sector_9_Block_2 = 38, + + Sector_10_Block_0 = 40, + Sector_10_Block_1 = 41, + Sector_10_Block_2 = 42, + + Sector_11_Block_0 = 44, + Sector_11_Block_1 = 45, + Sector_11_Block_2 = 46, + + Sector_12_Block_0 = 48, + Sector_12_Block_1 = 49, + Sector_12_Block_2 = 50, + + Sector_13_Block_0 = 52, + Sector_13_Block_1 = 53, + Sector_13_Block_2 = 54, + + Sector_14_Block_0 = 56, + Sector_14_Block_1 = 57, + Sector_14_Block_2 = 58, + + Sector_15_Block_0 = 60, + Sector_15_Block_1 = 61, + Sector_15_Block_2 = 62 + }; + + enum KeyFunction + { + KeyA_Same_KeyB = 0, // KEYA和KEYB相同 + KeyB_Control_KeyA // KEYB控制KEYA + }; + + + + enum WorkMode //工作模式 + { + Command_Mode = 0x01,//命令模式(关闭自动读卡),该模式会关闭自动读卡功能 + Auto_Read_Card_Num_Mode = 0x02,//自动读卡号 + Auto_Read_Data_Mode = 0x03,//自动读块数据,块号为要自动读的数据块编号 + Auto_Read_Card_Num_Data_Mode = 0x04//自动读卡号与指定块数据,块号为要自动读的数据块编号 + }; + + enum UploadMode//上传模式 + { + Auto_Upload = 0x00,//读卡后主动发送数据,主动将读到的数据发送给上位机 + Command_Upload = 0x01//读卡后被动发送数据,需要收到上位机获取数据的命令才将读到的数据发送给上位机 + }; + + + + enum ErrorCode + { + No_Error = 0, // 无错误 + Serial_Error, // 串口错误 + Send_Data_Error, // 发送数据错误 + Data_Is_Empty_Error, // 数据为空错误 + Data_Size_More_Than_8192_Error, // 数据大小超过8192错误 + Received_Data_Check_Error, // 接收数据校验错误 + Received_Data_Error, // 接收数据错误 + Data_Is_Illegal_Error // 数据非法错误 + }; + +public: + RFIDFunction(QObject* parent); // 构造函数 + ~RFIDFunction(); // 析构函数 + void CheckSumOut(unsigned char* buf, unsigned char len); + bool CheckSumIn(unsigned char* buf, unsigned char len); + + + ErrorCode initSerialPortAndOpen(const QString& portName, // 初始化串口并打开 + BaudRateType baudRate = BAUD9600, // 波特率 + DataBitsType setDataBits = DATA_8, // 数据位 + StopBitsType stopBits = STOP_1, // 停止位 + ParityType parity = PAR_NONE // 校验位 + ); + + static const QByteArray createPassword(const QByteArray& info); // 创建密码 + + bool getSerialState(); // 获取串口状态 + ErrorCode setOriginPassword(const QByteArray& psw); // 设置原始密码 + ErrorCode setWriteAndReadPassword(const QByteArray& writePassword, const QByteArray& readPassword, KeyFunction keyFunc); // 设置读写密码 + ErrorCode setEncryptedBlock(KeyType type, ControlBlock block); // 设置加密块 + ErrorCode writeDataToBlock(KeyType type, DataBlock block, const QByteArray& data); // 写数据到块 + ErrorCode readDataFromBlock(KeyType type, DataBlock block, QByteArray& data); // 从块读取数据 + ErrorCode setWorkMode(WorkMode mode, DataBlock block = Sector_1_Block_2, UploadMode uploadMode = Auto_Upload);//设置工作模式 + ErrorCode getReaderAddress(QByteArray& psw); // 获取读卡器地址 + + + +private: + bool m_SerialSate; // 串口状态 + Posix_QextSerialPort *m_SerialPort;; // 串口对象 + +}; diff --git a/rfid/sm4.cpp b/rfid/sm4.cpp index 320c957..da723d4 100644 --- a/rfid/sm4.cpp +++ b/rfid/sm4.cpp @@ -1,231 +1,231 @@ - -#include "sm4.h" -#include -#include - -#ifndef GET_ULONG_BE -#define GET_ULONG_BE(n,b,i) \ -{ \ - (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ - | ( (unsigned long) (b)[(i) + 1] << 16 ) \ - | ( (unsigned long) (b)[(i) + 2] << 8 ) \ - | ( (unsigned long) (b)[(i) + 3] ); \ -} -#endif - -#ifndef PUT_ULONG_BE -#define PUT_ULONG_BE(n,b,i) \ -{ \ - (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ - (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ - (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ - (b)[(i) + 3] = (unsigned char) ( (n) ); \ -} -#endif - -#define SHL(x,n) (((x) & 0xFFFFFFFF) << n) -#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n))) - -#define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; } - -static const unsigned char SboxTable[16][16] = -{ -{0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05}, -{0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99}, -{0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62}, -{0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6}, -{0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8}, -{0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35}, -{0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87}, -{0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e}, -{0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1}, -{0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3}, -{0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f}, -{0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51}, -{0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8}, -{0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0}, -{0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84}, -{0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48} -}; - - -static const unsigned long FK[4] = {0xa3b1bac6,0x56aa3350,0x677d9197,0xb27022dc}; - -static const unsigned long CK[32] = -{ -0x00070e15,0x1c232a31,0x383f464d,0x545b6269, -0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, -0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249, -0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, -0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229, -0x30373e45,0x4c535a61,0x686f767d,0x848b9299, -0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209, -0x10171e25,0x2c333a41,0x484f565d,0x646b7279 -}; - - -static unsigned char sm4Sbox(unsigned char inch) -{ - unsigned char *pTable = (unsigned char *)SboxTable; - unsigned char retVal = (unsigned char)(pTable[inch]); - return retVal; -} - -static unsigned long sm4Lt(unsigned long ka) -{ - unsigned long bb = 0; - unsigned long c = 0; - unsigned char a[4]; - unsigned char b[4]; - PUT_ULONG_BE(ka,a,0) - b[0] = sm4Sbox(a[0]); - b[1] = sm4Sbox(a[1]); - b[2] = sm4Sbox(a[2]); - b[3] = sm4Sbox(a[3]); - GET_ULONG_BE(bb,b,0) - c =bb^(ROTL(bb, 2))^(ROTL(bb, 10))^(ROTL(bb, 18))^(ROTL(bb, 24)); - return c; -} - -static unsigned long sm4F(unsigned long x0, unsigned long x1, unsigned long x2, unsigned long x3, unsigned long rk) -{ - return (x0^sm4Lt(x1^x2^x3^rk)); -} - -static unsigned long sm4CalciRK(unsigned long ka) -{ - unsigned long bb = 0; - unsigned long rk = 0; - unsigned char a[4]; - unsigned char b[4]; - PUT_ULONG_BE(ka,a,0) - b[0] = sm4Sbox(a[0]); - b[1] = sm4Sbox(a[1]); - b[2] = sm4Sbox(a[2]); - b[3] = sm4Sbox(a[3]); - GET_ULONG_BE(bb,b,0) - rk = bb^(ROTL(bb, 13))^(ROTL(bb, 23)); - return rk; -} - -static void sm4_setkey( unsigned long SK[32], unsigned char key[16] ) -{ - unsigned long MK[4]; - unsigned long k[36]; - unsigned long i = 0; - - GET_ULONG_BE( MK[0], key, 0 ); - GET_ULONG_BE( MK[1], key, 4 ); - GET_ULONG_BE( MK[2], key, 8 ); - GET_ULONG_BE( MK[3], key, 12 ); - k[0] = MK[0]^FK[0]; - k[1] = MK[1]^FK[1]; - k[2] = MK[2]^FK[2]; - k[3] = MK[3]^FK[3]; - for(; i<32; i++) - { - k[i+4] = k[i] ^ (sm4CalciRK(k[i+1]^k[i+2]^k[i+3]^CK[i])); - SK[i] = k[i+4]; - } - -} - -static void sm4_one_round( unsigned long sk[32], - unsigned char input[16], - unsigned char output[16] ) -{ - unsigned long i = 0; - unsigned long ulbuf[36]; - - memset(ulbuf, 0, sizeof(ulbuf)); - GET_ULONG_BE( ulbuf[0], input, 0 ) - GET_ULONG_BE( ulbuf[1], input, 4 ) - GET_ULONG_BE( ulbuf[2], input, 8 ) - GET_ULONG_BE( ulbuf[3], input, 12 ) - while(i<32) - { - ulbuf[i+4] = sm4F(ulbuf[i], ulbuf[i+1], ulbuf[i+2], ulbuf[i+3], sk[i]); - i++; - } - PUT_ULONG_BE(ulbuf[35],output,0); - PUT_ULONG_BE(ulbuf[34],output,4); - PUT_ULONG_BE(ulbuf[33],output,8); - PUT_ULONG_BE(ulbuf[32],output,12); -} - -void SM4::sm4_setkey_enc( sm4_context *ctx, unsigned char key[16] ) -{ - ctx->mode = SM4_ENCRYPT; - sm4_setkey( ctx->sk, key ); -} - -void SM4::sm4_setkey_dec( sm4_context *ctx, unsigned char key[16] ) -{ - int i; - ctx->mode = SM4_ENCRYPT; - sm4_setkey( ctx->sk, key ); - for( i = 0; i < 16; i ++ ) - { - SWAP( ctx->sk[ i ], ctx->sk[ 31-i] ); - } -} - -void SM4::sm4_crypt_ecb( sm4_context *ctx, - int mode, - int length, - unsigned char *input, - unsigned char *output) -{ - while( length > 0 ) - { - sm4_one_round( ctx->sk, input, output ); - input += 16; - output += 16; - length -= 16; - } - -} - -void SM4::sm4_crypt_cbc( sm4_context *ctx, - int mode, - int length, - unsigned char iv[16], - unsigned char *input, - unsigned char *output ) -{ - int i; - unsigned char temp[16]; - - if( mode == SM4_ENCRYPT ) - { - while( length > 0 ) - { - for( i = 0; i < 16; i++ ) - output[i] = (unsigned char)( input[i] ^ iv[i] ); - - sm4_one_round( ctx->sk, output, output ); - memcpy( iv, output, 16 ); - - input += 16; - output += 16; - length -= 16; - } - } - else /* SM4_DECRYPT */ - { - while( length > 0 ) - { - memcpy( temp, input, 16 ); - sm4_one_round( ctx->sk, input, output ); - - for( i = 0; i < 16; i++ ) - output[i] = (unsigned char)( output[i] ^ iv[i] ); - - memcpy( iv, temp, 16 ); - - input += 16; - output += 16; - length -= 16; - } - } -} + +#include "sm4.h" +#include +#include + +#ifndef GET_ULONG_BE +#define GET_ULONG_BE(n,b,i) \ +{ \ + (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ + | ( (unsigned long) (b)[(i) + 1] << 16 ) \ + | ( (unsigned long) (b)[(i) + 2] << 8 ) \ + | ( (unsigned long) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_ULONG_BE +#define PUT_ULONG_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +#define SHL(x,n) (((x) & 0xFFFFFFFF) << n) +#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n))) + +#define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; } + +static const unsigned char SboxTable[16][16] = +{ +{0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05}, +{0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99}, +{0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62}, +{0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6}, +{0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8}, +{0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35}, +{0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87}, +{0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e}, +{0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1}, +{0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3}, +{0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f}, +{0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51}, +{0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8}, +{0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0}, +{0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84}, +{0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48} +}; + + +static const unsigned long FK[4] = {0xa3b1bac6,0x56aa3350,0x677d9197,0xb27022dc}; + +static const unsigned long CK[32] = +{ +0x00070e15,0x1c232a31,0x383f464d,0x545b6269, +0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, +0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249, +0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, +0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229, +0x30373e45,0x4c535a61,0x686f767d,0x848b9299, +0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209, +0x10171e25,0x2c333a41,0x484f565d,0x646b7279 +}; + + +static unsigned char sm4Sbox(unsigned char inch) +{ + unsigned char *pTable = (unsigned char *)SboxTable; + unsigned char retVal = (unsigned char)(pTable[inch]); + return retVal; +} + +static unsigned long sm4Lt(unsigned long ka) +{ + unsigned long bb = 0; + unsigned long c = 0; + unsigned char a[4]; + unsigned char b[4]; + PUT_ULONG_BE(ka,a,0) + b[0] = sm4Sbox(a[0]); + b[1] = sm4Sbox(a[1]); + b[2] = sm4Sbox(a[2]); + b[3] = sm4Sbox(a[3]); + GET_ULONG_BE(bb,b,0) + c =bb^(ROTL(bb, 2))^(ROTL(bb, 10))^(ROTL(bb, 18))^(ROTL(bb, 24)); + return c; +} + +static unsigned long sm4F(unsigned long x0, unsigned long x1, unsigned long x2, unsigned long x3, unsigned long rk) +{ + return (x0^sm4Lt(x1^x2^x3^rk)); +} + +static unsigned long sm4CalciRK(unsigned long ka) +{ + unsigned long bb = 0; + unsigned long rk = 0; + unsigned char a[4]; + unsigned char b[4]; + PUT_ULONG_BE(ka,a,0) + b[0] = sm4Sbox(a[0]); + b[1] = sm4Sbox(a[1]); + b[2] = sm4Sbox(a[2]); + b[3] = sm4Sbox(a[3]); + GET_ULONG_BE(bb,b,0) + rk = bb^(ROTL(bb, 13))^(ROTL(bb, 23)); + return rk; +} + +static void sm4_setkey( unsigned long SK[32], unsigned char key[16] ) +{ + unsigned long MK[4]; + unsigned long k[36]; + unsigned long i = 0; + + GET_ULONG_BE( MK[0], key, 0 ); + GET_ULONG_BE( MK[1], key, 4 ); + GET_ULONG_BE( MK[2], key, 8 ); + GET_ULONG_BE( MK[3], key, 12 ); + k[0] = MK[0]^FK[0]; + k[1] = MK[1]^FK[1]; + k[2] = MK[2]^FK[2]; + k[3] = MK[3]^FK[3]; + for(; i<32; i++) + { + k[i+4] = k[i] ^ (sm4CalciRK(k[i+1]^k[i+2]^k[i+3]^CK[i])); + SK[i] = k[i+4]; + } + +} + +static void sm4_one_round( unsigned long sk[32], + unsigned char input[16], + unsigned char output[16] ) +{ + unsigned long i = 0; + unsigned long ulbuf[36]; + + memset(ulbuf, 0, sizeof(ulbuf)); + GET_ULONG_BE( ulbuf[0], input, 0 ) + GET_ULONG_BE( ulbuf[1], input, 4 ) + GET_ULONG_BE( ulbuf[2], input, 8 ) + GET_ULONG_BE( ulbuf[3], input, 12 ) + while(i<32) + { + ulbuf[i+4] = sm4F(ulbuf[i], ulbuf[i+1], ulbuf[i+2], ulbuf[i+3], sk[i]); + i++; + } + PUT_ULONG_BE(ulbuf[35],output,0); + PUT_ULONG_BE(ulbuf[34],output,4); + PUT_ULONG_BE(ulbuf[33],output,8); + PUT_ULONG_BE(ulbuf[32],output,12); +} + +void SM4::sm4_setkey_enc( sm4_context *ctx, unsigned char key[16] ) +{ + ctx->mode = SM4_ENCRYPT; + sm4_setkey( ctx->sk, key ); +} + +void SM4::sm4_setkey_dec( sm4_context *ctx, unsigned char key[16] ) +{ + int i; + ctx->mode = SM4_ENCRYPT; + sm4_setkey( ctx->sk, key ); + for( i = 0; i < 16; i ++ ) + { + SWAP( ctx->sk[ i ], ctx->sk[ 31-i] ); + } +} + +void SM4::sm4_crypt_ecb( sm4_context *ctx, + int mode, + int length, + unsigned char *input, + unsigned char *output) +{ + while( length > 0 ) + { + sm4_one_round( ctx->sk, input, output ); + input += 16; + output += 16; + length -= 16; + } + +} + +void SM4::sm4_crypt_cbc( sm4_context *ctx, + int mode, + int length, + unsigned char iv[16], + unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[16]; + + if( mode == SM4_ENCRYPT ) + { + while( length > 0 ) + { + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + sm4_one_round( ctx->sk, output, output ); + memcpy( iv, output, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } + else /* SM4_DECRYPT */ + { + while( length > 0 ) + { + memcpy( temp, input, 16 ); + sm4_one_round( ctx->sk, input, output ); + + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } +} diff --git a/rfid/sm4.h b/rfid/sm4.h index 2397417..eb0a2ef 100644 --- a/rfid/sm4.h +++ b/rfid/sm4.h @@ -1,34 +1,34 @@ -#ifndef SM4_H -#define SM4_H - -#define SM4_ENCRYPT 1 -#define SM4_DECRYPT 0 - -typedef struct -{ - int mode; - unsigned long sk[32]; -} -sm4_context; - -class SM4 -{ -public: - static void sm4_setkey_enc(sm4_context* ctx, unsigned char key[16]); - - static void sm4_setkey_dec(sm4_context* ctx, unsigned char key[16]); - - static void sm4_crypt_ecb(sm4_context* ctx, - int mode, - int length, - unsigned char* input, - unsigned char* output); - static void sm4_crypt_cbc(sm4_context* ctx, - int mode, - int length, - unsigned char iv[16], - unsigned char* input, - unsigned char* output); -}; - -#endif /* sm4.h */ +#ifndef SM4_H +#define SM4_H + +#define SM4_ENCRYPT 1 +#define SM4_DECRYPT 0 + +typedef struct +{ + int mode; + unsigned long sk[32]; +} +sm4_context; + +class SM4 +{ +public: + static void sm4_setkey_enc(sm4_context* ctx, unsigned char key[16]); + + static void sm4_setkey_dec(sm4_context* ctx, unsigned char key[16]); + + static void sm4_crypt_ecb(sm4_context* ctx, + int mode, + int length, + unsigned char* input, + unsigned char* output); + static void sm4_crypt_cbc(sm4_context* ctx, + int mode, + int length, + unsigned char iv[16], + unsigned char* input, + unsigned char* output); +}; + +#endif /* sm4.h */ diff --git a/scene/BarcodeEditor.cpp b/scene/BarcodeEditor.cpp index 3cc2ea1..e0f2f2e 100644 --- a/scene/BarcodeEditor.cpp +++ b/scene/BarcodeEditor.cpp @@ -1,534 +1,534 @@ -#include "BarcodeEditor.h" -#include "ui_BarcodeEditor.h" -#include "DateFormatEditor.h" -#include "DateReplaceEditor.h" -#include "CounterEditor.h" -#include -#include -#include "DlgQrcodeFormat.h" - -// 使用SysPara的相关参数构造CounterEditorVM -CounterEditorVM makeCounterVM(COUNTER_TYPE type, int digitalNum, const CounterSettings& cnt1Settings, const CounterSettings& cnt2Settings) -{ - CounterEditorVM vm; - vm.counterType = type; - vm.digitalNum = digitalNum; - vm.counter1 = cnt1Settings; - vm.counter2 = cnt2Settings; - return vm; -} - -BarcodeEditor::BarcodeEditor(QWidget *parent) : - QDialog(parent), - ui(new Ui::BarcodeEditor) -{ - ui->setupUi(this); - applyStyleSheet(); - - m_dateFormatEditor = new DateFormatEditor(); - m_dateReplaceEditor = new DateReplaceEditor(); - m_counterEditor = new CounterEditor(); - - ui->lineEditContent->installEventFilter(this); - - m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); - m_dateReplaceEditor->setDateModel(m_vm.dateViewModel); - - connect(ui->cbBoxType, QOverload::of(&QComboBox::currentIndexChanged), this, &BarcodeEditor::onTypeChanged); - - m_barcodeFormatEditor.setParent(this, m_barcodeFormatEditor.windowFlags()); - m_qrcodeFormatEditor.setParent(this, m_qrcodeFormatEditor.windowFlags()); - m_barcodeFormatEditor.setWindowModality(Qt::WindowModality::WindowModal); - m_qrcodeFormatEditor.setWindowModality(Qt::WindowModality::WindowModal); - m_barcodeFormatEditor.setWindowTitle(tr("BarCode Format")); - m_qrcodeFormatEditor.setWindowTitle(tr("Qrcode Format")); -} - -BarcodeEditor::~BarcodeEditor() -{ - auto index = ui->tabWidget->indexOf(m_dateFormatEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - - index = ui->tabWidget->indexOf(m_dateReplaceEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - - index = ui->tabWidget->indexOf(m_counterEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - - ui->lineEditContent->removeEventFilter(this); - - delete m_dateFormatEditor; - delete m_dateReplaceEditor; - delete m_counterEditor; - delete ui; -} - -void BarcodeEditor::bindViewModel(const BarcodeViewModel &vm) -{ - m_vm = vm; - - // 通用设置视图模型 - auto b = ui->widGeneralSettings->blockSignals(true); - ui->widGeneralSettings->setViewModel(vm.generalSettingsVM); - ui->widGeneralSettings->blockSignals(b); - - // 内容模版 - b = ui->lineEditContent->blockSignals(true); - ui->lineEditContent->setText(m_vm.contentPattern); - ui->lineEditContent->blockSignals(b); - - // 类型选择框 - b = ui->cbBoxType->blockSignals(true); - ui->cbBoxType->setCurrentIndex(m_vm.type); - ui->cbBoxType->blockSignals(b); - - // 缺失的代替表用默认值补齐 - DateItemModel& dateVm = m_vm.dateViewModel; - if (dateVm.dataMap.isEmpty() || dateVm.daysMap.isEmpty() || dateVm.monthsMap.isEmpty() - || dateVm.yearsMap.isEmpty() || dateVm.weeksMap.isEmpty() || dateVm.hoursMap.isEmpty()) { - DateItemModel def = DateItemModel::createDefaultReplaceModel(); - if (dateVm.dataMap.isEmpty()) dateVm.dataMap = def.dataMap; - if (dateVm.daysMap.isEmpty()) dateVm.daysMap = def.daysMap; - if (dateVm.monthsMap.isEmpty()) dateVm.monthsMap = def.monthsMap; - if (dateVm.yearsMap.isEmpty()) dateVm.yearsMap = def.yearsMap; - if (dateVm.weeksMap.isEmpty()) dateVm.weeksMap = def.weeksMap; - if (dateVm.hoursMap.isEmpty()) dateVm.hoursMap = def.hoursMap; - } - - DateFormatEditorVM dateFormatVM; - if(dateVm.daysOffset > 0) { - dateFormatVM.expirationValue = dateVm.daysOffset; - dateFormatVM.expirationType = EXPIRATION_TYPE_DAY; - } - else if(dateVm.monthsOffset > 0) { - dateFormatVM.expirationValue = dateVm.monthsOffset; - dateFormatVM.expirationType = EXPIRATION_TYPE_MONTH; - } - dateFormatVM.pattern = dateVm.datetimePattern; - m_dateFormatEditor->setViewModel(dateFormatVM); - m_dateReplaceEditor->setDateModel(dateVm); - - if(m_vm.contentPattern.contains("{t}")) { - if(ui->tabWidget->indexOf(m_dateFormatEditor) == -1) { - ui->tabWidget->addTab(m_dateFormatEditor, tr(u8"日期/时间")); - } - m_dateFormatEditor->setFixedSize(ui->tabBarcode->size()); - - if(ui->tabWidget->indexOf(m_dateReplaceEditor) == -1) { - ui->tabWidget->addTab(m_dateReplaceEditor, tr(u8"代替")); - } - m_dateReplaceEditor->setFixedSize(ui->tabBarcode->size()); - } - else { - auto index = ui->tabWidget->indexOf(m_dateFormatEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - - index = ui->tabWidget->indexOf(m_dateReplaceEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - } - - if(m_vm.contentPattern.contains("{c}")) { - if(ui->tabWidget->indexOf(m_counterEditor) == -1) { - ui->tabWidget->addTab(m_counterEditor, tr(u8"计数器")); - } - m_counterEditor->setViewModel(makeCounterVM( - static_cast(m_vm.counterViewModel.counterType), - m_vm.counterViewModel.digitalNum, - m_vm.counterViewModel.cnt1Settings, - m_vm.counterViewModel.cnt2Settings)); - m_counterEditor->setFixedSize(ui->tabBarcode->size()); - } - else { - auto index = ui->tabWidget->indexOf(m_counterEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - } -} - -BarcodeViewModel BarcodeEditor::viewModel() -{ - m_vm.contentPattern = ui->lineEditContent->text(); - m_vm.type = (BarcodeType) (ui->cbBoxType->currentIndex()); - - // 从子编辑器拉取最新值回写到 m_vm - - // 通用设置 - m_vm.generalSettingsVM = ui->widGeneralSettings->viewModel(); - - // 日期设置,如果存在 {t} 变量 - if(m_vm.contentPattern.contains("{t}")) { - DateFormatEditorVM fmt = m_dateFormatEditor->viewModel(); - m_vm.dateViewModel.datetimePattern = fmt.pattern; - if(fmt.expirationType == EXPIRATION_TYPE_DAY) { - m_vm.dateViewModel.daysOffset = fmt.expirationValue; - m_vm.dateViewModel.monthsOffset = 0; - } - else if(fmt.expirationType == EXPIRATION_TYPE_MONTH) { - m_vm.dateViewModel.monthsOffset = fmt.expirationValue; - m_vm.dateViewModel.daysOffset = 0; - } - else { - m_vm.dateViewModel.daysOffset = 0; - m_vm.dateViewModel.monthsOffset = 0; - } - - // 代替表从 DateReplaceEditor 取 - DateItemModel rep = m_dateReplaceEditor->dateModel(); - m_vm.dateViewModel.dataMap = rep.dataMap; - m_vm.dateViewModel.daysMap = rep.daysMap; - m_vm.dateViewModel.monthsMap = rep.monthsMap; - m_vm.dateViewModel.yearsMap = rep.yearsMap; - m_vm.dateViewModel.weeksMap = rep.weeksMap; - m_vm.dateViewModel.hoursMap = rep.hoursMap; - } - - // 计数器设置,如果存在 {c} 变量 - if(m_vm.contentPattern.contains("{c}")) { - CounterEditorVM cnt = m_counterEditor->viewModel(); - m_vm.counterViewModel.counterType = cnt.counterType; - m_vm.counterViewModel.digitalNum = cnt.digitalNum; - m_vm.counterViewModel.cnt1Settings = cnt.counter1; - m_vm.counterViewModel.cnt2Settings = cnt.counter2; - } - - return m_vm; -} - -void BarcodeEditor::restoreViewModel() -{ - m_vm.generalSettingsVM = TextItemModel(); - m_vm.contentPattern = ""; - m_vm.counterViewModel = CounterViewModel(); - m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); - m_vm.type = BARCODE_TYPE_BARCODE; - m_vm.format.setValue(DlgBarcodeFormatVM()); - bindViewModel(m_vm); -} - -void BarcodeEditor::onBtnFormatClicked() -{ - if(m_vm.type == BARCODE_TYPE_BARCODE) { - m_barcodeFormatEditor.setViewModel(m_vm.format.value()); - if (m_barcodeFormatEditor.exec() == QDialog::Accepted) { - onBarcodeFormatConfirmed(); - } - } - else { - m_qrcodeFormatEditor.setViewModel(m_vm.format.value()); - if (m_qrcodeFormatEditor.exec() == QDialog::Accepted) { - onQrcodeFormatConfirmed(); - } - } -} - -void BarcodeEditor::onBtnDatetimeClicked() -{ - if(ui->lineEditContent->text().contains("{t}")) { - qInfo() << "Cannot add datetime format twice"; - return; - } - - ui->lineEditContent->insert("{t}"); - ui->tabWidget->setCurrentIndex(1); -} - -void BarcodeEditor::onBtnCounterClicked() -{ - QString cntStr = "{c}"; - if(ui->lineEditContent->text().contains(cntStr)) { - qInfo() << "Cannot add counter format twice"; - return; - } - - ui->lineEditContent->insert(cntStr); -} - -void BarcodeEditor::onCheckBtnClicked() -{ - m_vm = viewModel(); - emit accepted(); - hide(); -} - -void BarcodeEditor::onCloseBtnClicked() -{ - emit rejected(); - hide(); -} - -void BarcodeEditor::onBarcodeFormatConfirmed() -{ - m_vm.format.setValue(m_barcodeFormatEditor.viewModel()); - m_vm.type = BARCODE_TYPE_BARCODE; - - auto b = ui->cbBoxType->blockSignals(true); - ui->cbBoxType->setCurrentIndex(int(m_vm.type)); - ui->cbBoxType->blockSignals(b); -} - -void BarcodeEditor::onQrcodeFormatConfirmed() -{ - m_vm.format.setValue(m_qrcodeFormatEditor.viewModel()); -// m_vm.type = BARCODE_TYPE_QRCODE; - - auto b = ui->cbBoxType->blockSignals(true); - ui->cbBoxType->setCurrentIndex(int(m_vm.type)); - ui->cbBoxType->blockSignals(b); -} - -void BarcodeEditor::onTypeChanged(int i) -{ - if(m_vm.type == i) - return; - - m_vm.type = (BarcodeType)(i); - if(m_vm.type == BARCODE_TYPE_BARCODE) { - m_vm.format.setValue(DlgBarcodeFormatVM()); - } - else - m_vm.format.setValue(DlgQrcodeFormatVM()); -} - -bool BarcodeEditor::eventFilter(QObject *obj, QEvent *event) -{ - if(obj == ui->lineEditContent) { - if(event->type() == QEvent::KeyPress) { - QKeyEvent* keyEvent = static_cast(event); - if(keyEvent->key() == Qt::Key_Backspace) { - QString text = ui->lineEditContent->text(); - int cursor = ui->lineEditContent->cursorPosition(); - if(cursor < 0) { - return false; - } - - // 碰到 {t} 或 {c},直接删除 - auto datePatternPos = text.indexOf("{t}"); - auto counterPatternPos = text.indexOf("{c}"); - if(datePatternPos >= 0 || counterPatternPos >= 0) { - if(datePatternPos < cursor && cursor <= datePatternPos + 3) { - ui->lineEditContent->setText(text.remove(datePatternPos, 3)); - return true; - } - else if(counterPatternPos < cursor && cursor <= counterPatternPos + 3) { - ui->lineEditContent->setText(text.remove(counterPatternPos, 3)); - return true; - } - } - } - } - } - - return false; -} - -void BarcodeEditor::applyStyleSheet() -{ - // QFile stylesFile(":/styles.qss"); - // QTextStream ts(&stylesFile); - // setStyleSheet(ts.readAll()); -} - -void BarcodeEditor::onContentChanged(QString content) -{ - const DateItemModel& dateVm = m_vm.dateViewModel; - - // 根据内容决定是否显示日期/时间选项卡 - if(!content.contains("{t}")) { - auto index = ui->tabWidget->indexOf(m_dateFormatEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - - index = ui->tabWidget->indexOf(m_dateReplaceEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - } - else { - if(ui->tabWidget->indexOf(m_dateFormatEditor) == -1) { - ui->tabWidget->addTab(m_dateFormatEditor, tr(u8"日期/时间")); - } - m_dateFormatEditor->setFixedSize(ui->tabBarcode->size()); - - if(ui->tabWidget->indexOf(m_dateReplaceEditor) == -1) { - ui->tabWidget->addTab(m_dateReplaceEditor, tr(u8"代替")); - } - m_dateReplaceEditor->setFixedSize(ui->tabBarcode->size()); - - DateFormatEditorVM dateFormatVM; - if(dateVm.daysOffset > 0) { - dateFormatVM.expirationValue = dateVm.daysOffset; - dateFormatVM.expirationType = EXPIRATION_TYPE_DAY; - } - else if(dateVm.monthsOffset > 0) { - dateFormatVM.expirationValue = dateVm.monthsOffset; - dateFormatVM.expirationType = EXPIRATION_TYPE_MONTH; - } - - dateFormatVM.pattern = dateVm.datetimePattern; - m_dateFormatEditor->setViewModel(dateFormatVM); - - m_dateReplaceEditor->setDateModel(dateVm); - } - - // 根据内容决定是否显示计数器选项卡 - if(!content.contains("{c}")) { - auto index = ui->tabWidget->indexOf(m_counterEditor); - if(index != -1) { - ui->tabWidget->removeTab(index); - } - } - else { - if(ui->tabWidget->indexOf(m_counterEditor) == -1) { - ui->tabWidget->addTab(m_counterEditor, tr(u8"计数器")); - m_counterEditor->setViewModel(makeCounterVM( - static_cast(m_vm.counterViewModel.counterType), - m_vm.counterViewModel.digitalNum, - m_vm.counterViewModel.cnt1Settings, - m_vm.counterViewModel.cnt2Settings)); - } - m_counterEditor->setFixedSize(ui->tabBarcode->size()); - } - - m_vm.contentPattern = content; -} - -void BarcodeViewModel::saveToXml(const BarcodeViewModel &vm, QXmlStreamAttributes &attrs) -{ - attrs.append("barcodeContentPattern", vm.contentPattern); - attrs.append("barcodeType", QString::number(int(vm.type))); - - if(vm.type == BARCODE_TYPE_BARCODE) { - DlgBarcodeFormatVM barcodeFormat = vm.format.value(); - attrs.append("barcodeFormat", barcodeFormat.type); - attrs.append("barcodeHeight", QString::number(barcodeFormat.height)); - attrs.append("barcodeWidth", QString::number(barcodeFormat.width)); - attrs.append("barcodeScale", QString::number(barcodeFormat.scale)); - attrs.append("barcodeInkType", QString::number(int(barcodeFormat.inkType))); - attrs.append("barcodeTxtVisible", barcodeFormat.txtVisible ? "true" : "false"); - } - else { - DlgQrcodeFormatVM qrcodeFormat = vm.format.value(); - attrs.append("qrcodeFormat", QString::number(qrcodeFormat.type)); - attrs.append("qrcodeSize", QString::number(qrcodeFormat.size)); - attrs.append("qrcodeLevel", QString::number(int(qrcodeFormat.level))); - attrs.append("qrcodeInkType", QString::number(int(qrcodeFormat.inkType))); - } - - if(vm.contentPattern.contains("{t}")) { - DateItemModel::saveToXml(vm.dateViewModel, attrs); - } - - if(vm.contentPattern.contains("{c}")) { - attrs.append("counterType", QString::number(vm.counterViewModel.counterType)); - attrs.append("counterDigitalNum", QString::number(vm.counterViewModel.digitalNum)); - } -} - -BarcodeViewModel BarcodeViewModel::loadFromXml(const QXmlStreamAttributes &attrs) -{ - BarcodeViewModel vm; - vm.contentPattern = attrs.value("barcodeContentPattern").toString(); - vm.type = static_cast(attrs.value("barcodeType").toInt()); - if(vm.type == BARCODE_TYPE_BARCODE) { - DlgBarcodeFormatVM barcodeFormat; - barcodeFormat.type = attrs.value("barcodeFormat").toString(); - barcodeFormat.height = attrs.value("barcodeHeight").toInt(); - barcodeFormat.width = attrs.value("barcodeWidth").toInt(); - barcodeFormat.scale = attrs.value("barcodeScale").toInt(); - barcodeFormat.inkType = static_cast(attrs.value("barcodeInkType").toInt()); - barcodeFormat.txtVisible = attrs.value("barcodeTxtVisible").toString() == "true"; - vm.format.setValue(barcodeFormat); - } - else { - DlgQrcodeFormatVM qrcodeFormat; - qrcodeFormat.type = static_cast(attrs.value("qrcodeFormat").toInt()); - qrcodeFormat.size = static_cast(attrs.value("qrcodeSize").toInt()); - qrcodeFormat.level = static_cast(attrs.value("qrcodeLevel").toInt()); - qrcodeFormat.inkType = static_cast(attrs.value("qrcodeInkType").toInt()); - vm.format.setValue(qrcodeFormat); - } - - if(vm.contentPattern.contains("{t}")) { - DateItemModel::loadFromXml(vm.dateViewModel, attrs); - } - - if(vm.contentPattern.contains("{c}")) { - vm.counterViewModel.counterType = static_cast(attrs.value("counterType").toInt()); - vm.counterViewModel.digitalNum = attrs.value("counterDigitalNum").toInt(); - } - - return vm; -} - - -QString BarcodeViewModel::toString(const BarcodeViewModel &vm) -{ - QString str; - str += QString("type: %1\r\n").arg(int(vm.type)); - str += QString("contentPattern: \"%1\"\r\n").arg(vm.contentPattern); - - // counterViewModel - str += QString("counterViewModel: \r\n"); - str += QString("\t counter type: %1\r\n").arg(vm.counterViewModel.counterType); - str += QString("\t digital number: %1\r\n").arg(vm.counterViewModel.digitalNum); - str += QString("\t letter space: %1\r\n").arg(vm.counterViewModel.letterSpace); - - // dateViewModel - str += QString("dateViewModel: \r\n"); - str += QString("\t pattern: \"%1\"\r\n").arg(vm.dateViewModel.datetimePattern); - - int expirationValue = 0; - int expirationType = 0; - if(vm.dateViewModel.daysOffset > 0) { - expirationValue = vm.dateViewModel.daysOffset; - expirationType = EXPIRATION_TYPE_DAY; - } - else if(vm.dateViewModel.monthsOffset > 0) { - expirationValue = vm.dateViewModel.monthsOffset; - expirationType = EXPIRATION_TYPE_MONTH; - } - str += QString("\t expirationValue: %1\r\n").arg(expirationValue); - str += QString("\t expirationType: %1\r\n").arg(expirationType); - - // format - str += QString("format: \n"); - if(vm.type == BARCODE_TYPE_BARCODE) { - DlgBarcodeFormatVM barcodeFormat = vm.format.value(); - str += QString("\t type: \"%1\"\r\n").arg(barcodeFormat.type); - str += QString("\t height: %1\r\n").arg(barcodeFormat.height); - str += QString("\t width: %1\r\n").arg(barcodeFormat.width); - str += QString("\t scale: %1\r\n").arg(barcodeFormat.scale); - str += QString("\t inkType: %1\r\n").arg(int(barcodeFormat.inkType)); - str += QString("\t txtVisible: %1\r\n").arg(barcodeFormat.txtVisible ? "true" : "false"); - } - else { - DlgQrcodeFormatVM qrcodeFormat = vm.format.value(); - str += QString("\t type: %1\r\n").arg(int(qrcodeFormat.type)); - str += QString("\t size: %1\r\n").arg(int(qrcodeFormat.size)); - str += QString("\t level: %1\r\n").arg(int(qrcodeFormat.level)); - str += QString("\t inkType: %1\r\n").arg(int(qrcodeFormat.inkType)); - } - - return str; -} - -void BarcodeEditor::on_cbBoxType_currentIndexChanged(int index) -{ - //bar 0; qr 1; dm 2; - m_vm.type = index; - if (index == 0) return; - m_qrcodeFormatEditor.setCodeType(ui->cbBoxType->currentText()); - onQrcodeFormatConfirmed(); +#include "BarcodeEditor.h" +#include "ui_BarcodeEditor.h" +#include "DateFormatEditor.h" +#include "DateReplaceEditor.h" +#include "CounterEditor.h" +#include +#include +#include "DlgQrcodeFormat.h" + +// 使用SysPara的相关参数构造CounterEditorVM +CounterEditorVM makeCounterVM(COUNTER_TYPE type, int digitalNum, const CounterSettings& cnt1Settings, const CounterSettings& cnt2Settings) +{ + CounterEditorVM vm; + vm.counterType = type; + vm.digitalNum = digitalNum; + vm.counter1 = cnt1Settings; + vm.counter2 = cnt2Settings; + return vm; +} + +BarcodeEditor::BarcodeEditor(QWidget *parent) : + QDialog(parent), + ui(new Ui::BarcodeEditor) +{ + ui->setupUi(this); + applyStyleSheet(); + + m_dateFormatEditor = new DateFormatEditor(); + m_dateReplaceEditor = new DateReplaceEditor(); + m_counterEditor = new CounterEditor(); + + ui->lineEditContent->installEventFilter(this); + + m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); + m_dateReplaceEditor->setDateModel(m_vm.dateViewModel); + + connect(ui->cbBoxType, QOverload::of(&QComboBox::currentIndexChanged), this, &BarcodeEditor::onTypeChanged); + + m_barcodeFormatEditor.setParent(this, m_barcodeFormatEditor.windowFlags()); + m_qrcodeFormatEditor.setParent(this, m_qrcodeFormatEditor.windowFlags()); + m_barcodeFormatEditor.setWindowModality(Qt::WindowModality::WindowModal); + m_qrcodeFormatEditor.setWindowModality(Qt::WindowModality::WindowModal); + m_barcodeFormatEditor.setWindowTitle(tr("BarCode Format")); + m_qrcodeFormatEditor.setWindowTitle(tr("Qrcode Format")); +} + +BarcodeEditor::~BarcodeEditor() +{ + auto index = ui->tabWidget->indexOf(m_dateFormatEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + + index = ui->tabWidget->indexOf(m_dateReplaceEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + + index = ui->tabWidget->indexOf(m_counterEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + + ui->lineEditContent->removeEventFilter(this); + + delete m_dateFormatEditor; + delete m_dateReplaceEditor; + delete m_counterEditor; + delete ui; +} + +void BarcodeEditor::bindViewModel(const BarcodeViewModel &vm) +{ + m_vm = vm; + + // 通用设置视图模型 + auto b = ui->widGeneralSettings->blockSignals(true); + ui->widGeneralSettings->setViewModel(vm.generalSettingsVM); + ui->widGeneralSettings->blockSignals(b); + + // 内容模版 + b = ui->lineEditContent->blockSignals(true); + ui->lineEditContent->setText(m_vm.contentPattern); + ui->lineEditContent->blockSignals(b); + + // 类型选择框 + b = ui->cbBoxType->blockSignals(true); + ui->cbBoxType->setCurrentIndex(m_vm.type); + ui->cbBoxType->blockSignals(b); + + // 缺失的代替表用默认值补齐 + DateItemModel& dateVm = m_vm.dateViewModel; + if (dateVm.dataMap.isEmpty() || dateVm.daysMap.isEmpty() || dateVm.monthsMap.isEmpty() + || dateVm.yearsMap.isEmpty() || dateVm.weeksMap.isEmpty() || dateVm.hoursMap.isEmpty()) { + DateItemModel def = DateItemModel::createDefaultReplaceModel(); + if (dateVm.dataMap.isEmpty()) dateVm.dataMap = def.dataMap; + if (dateVm.daysMap.isEmpty()) dateVm.daysMap = def.daysMap; + if (dateVm.monthsMap.isEmpty()) dateVm.monthsMap = def.monthsMap; + if (dateVm.yearsMap.isEmpty()) dateVm.yearsMap = def.yearsMap; + if (dateVm.weeksMap.isEmpty()) dateVm.weeksMap = def.weeksMap; + if (dateVm.hoursMap.isEmpty()) dateVm.hoursMap = def.hoursMap; + } + + DateFormatEditorVM dateFormatVM; + if(dateVm.daysOffset > 0) { + dateFormatVM.expirationValue = dateVm.daysOffset; + dateFormatVM.expirationType = EXPIRATION_TYPE_DAY; + } + else if(dateVm.monthsOffset > 0) { + dateFormatVM.expirationValue = dateVm.monthsOffset; + dateFormatVM.expirationType = EXPIRATION_TYPE_MONTH; + } + dateFormatVM.pattern = dateVm.datetimePattern; + m_dateFormatEditor->setViewModel(dateFormatVM); + m_dateReplaceEditor->setDateModel(dateVm); + + if(m_vm.contentPattern.contains("{t}")) { + if(ui->tabWidget->indexOf(m_dateFormatEditor) == -1) { + ui->tabWidget->addTab(m_dateFormatEditor, tr(u8"日期/时间")); + } + m_dateFormatEditor->setFixedSize(ui->tabBarcode->size()); + + if(ui->tabWidget->indexOf(m_dateReplaceEditor) == -1) { + ui->tabWidget->addTab(m_dateReplaceEditor, tr(u8"代替")); + } + m_dateReplaceEditor->setFixedSize(ui->tabBarcode->size()); + } + else { + auto index = ui->tabWidget->indexOf(m_dateFormatEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + + index = ui->tabWidget->indexOf(m_dateReplaceEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + } + + if(m_vm.contentPattern.contains("{c}")) { + if(ui->tabWidget->indexOf(m_counterEditor) == -1) { + ui->tabWidget->addTab(m_counterEditor, tr(u8"计数器")); + } + m_counterEditor->setViewModel(makeCounterVM( + static_cast(m_vm.counterViewModel.counterType), + m_vm.counterViewModel.digitalNum, + m_vm.counterViewModel.cnt1Settings, + m_vm.counterViewModel.cnt2Settings)); + m_counterEditor->setFixedSize(ui->tabBarcode->size()); + } + else { + auto index = ui->tabWidget->indexOf(m_counterEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + } +} + +BarcodeViewModel BarcodeEditor::viewModel() +{ + m_vm.contentPattern = ui->lineEditContent->text(); + m_vm.type = (BarcodeType) (ui->cbBoxType->currentIndex()); + + // 从子编辑器拉取最新值回写到 m_vm + + // 通用设置 + m_vm.generalSettingsVM = ui->widGeneralSettings->viewModel(); + + // 日期设置,如果存在 {t} 变量 + if(m_vm.contentPattern.contains("{t}")) { + DateFormatEditorVM fmt = m_dateFormatEditor->viewModel(); + m_vm.dateViewModel.datetimePattern = fmt.pattern; + if(fmt.expirationType == EXPIRATION_TYPE_DAY) { + m_vm.dateViewModel.daysOffset = fmt.expirationValue; + m_vm.dateViewModel.monthsOffset = 0; + } + else if(fmt.expirationType == EXPIRATION_TYPE_MONTH) { + m_vm.dateViewModel.monthsOffset = fmt.expirationValue; + m_vm.dateViewModel.daysOffset = 0; + } + else { + m_vm.dateViewModel.daysOffset = 0; + m_vm.dateViewModel.monthsOffset = 0; + } + + // 代替表从 DateReplaceEditor 取 + DateItemModel rep = m_dateReplaceEditor->dateModel(); + m_vm.dateViewModel.dataMap = rep.dataMap; + m_vm.dateViewModel.daysMap = rep.daysMap; + m_vm.dateViewModel.monthsMap = rep.monthsMap; + m_vm.dateViewModel.yearsMap = rep.yearsMap; + m_vm.dateViewModel.weeksMap = rep.weeksMap; + m_vm.dateViewModel.hoursMap = rep.hoursMap; + } + + // 计数器设置,如果存在 {c} 变量 + if(m_vm.contentPattern.contains("{c}")) { + CounterEditorVM cnt = m_counterEditor->viewModel(); + m_vm.counterViewModel.counterType = cnt.counterType; + m_vm.counterViewModel.digitalNum = cnt.digitalNum; + m_vm.counterViewModel.cnt1Settings = cnt.counter1; + m_vm.counterViewModel.cnt2Settings = cnt.counter2; + } + + return m_vm; +} + +void BarcodeEditor::restoreViewModel() +{ + m_vm.generalSettingsVM = TextItemModel(); + m_vm.contentPattern = ""; + m_vm.counterViewModel = CounterViewModel(); + m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); + m_vm.type = BARCODE_TYPE_BARCODE; + m_vm.format.setValue(DlgBarcodeFormatVM()); + bindViewModel(m_vm); +} + +void BarcodeEditor::onBtnFormatClicked() +{ + if(m_vm.type == BARCODE_TYPE_BARCODE) { + m_barcodeFormatEditor.setViewModel(m_vm.format.value()); + if (m_barcodeFormatEditor.exec() == QDialog::Accepted) { + onBarcodeFormatConfirmed(); + } + } + else { + m_qrcodeFormatEditor.setViewModel(m_vm.format.value()); + if (m_qrcodeFormatEditor.exec() == QDialog::Accepted) { + onQrcodeFormatConfirmed(); + } + } +} + +void BarcodeEditor::onBtnDatetimeClicked() +{ + if(ui->lineEditContent->text().contains("{t}")) { + qInfo() << "Cannot add datetime format twice"; + return; + } + + ui->lineEditContent->insert("{t}"); + ui->tabWidget->setCurrentIndex(1); +} + +void BarcodeEditor::onBtnCounterClicked() +{ + QString cntStr = "{c}"; + if(ui->lineEditContent->text().contains(cntStr)) { + qInfo() << "Cannot add counter format twice"; + return; + } + + ui->lineEditContent->insert(cntStr); +} + +void BarcodeEditor::onCheckBtnClicked() +{ + m_vm = viewModel(); + emit accepted(); + hide(); +} + +void BarcodeEditor::onCloseBtnClicked() +{ + emit rejected(); + hide(); +} + +void BarcodeEditor::onBarcodeFormatConfirmed() +{ + m_vm.format.setValue(m_barcodeFormatEditor.viewModel()); + m_vm.type = BARCODE_TYPE_BARCODE; + + auto b = ui->cbBoxType->blockSignals(true); + ui->cbBoxType->setCurrentIndex(int(m_vm.type)); + ui->cbBoxType->blockSignals(b); +} + +void BarcodeEditor::onQrcodeFormatConfirmed() +{ + m_vm.format.setValue(m_qrcodeFormatEditor.viewModel()); +// m_vm.type = BARCODE_TYPE_QRCODE; + + auto b = ui->cbBoxType->blockSignals(true); + ui->cbBoxType->setCurrentIndex(int(m_vm.type)); + ui->cbBoxType->blockSignals(b); +} + +void BarcodeEditor::onTypeChanged(int i) +{ + if(m_vm.type == i) + return; + + m_vm.type = (BarcodeType)(i); + if(m_vm.type == BARCODE_TYPE_BARCODE) { + m_vm.format.setValue(DlgBarcodeFormatVM()); + } + else + m_vm.format.setValue(DlgQrcodeFormatVM()); +} + +bool BarcodeEditor::eventFilter(QObject *obj, QEvent *event) +{ + if(obj == ui->lineEditContent) { + if(event->type() == QEvent::KeyPress) { + QKeyEvent* keyEvent = static_cast(event); + if(keyEvent->key() == Qt::Key_Backspace) { + QString text = ui->lineEditContent->text(); + int cursor = ui->lineEditContent->cursorPosition(); + if(cursor < 0) { + return false; + } + + // 碰到 {t} 或 {c},直接删除 + auto datePatternPos = text.indexOf("{t}"); + auto counterPatternPos = text.indexOf("{c}"); + if(datePatternPos >= 0 || counterPatternPos >= 0) { + if(datePatternPos < cursor && cursor <= datePatternPos + 3) { + ui->lineEditContent->setText(text.remove(datePatternPos, 3)); + return true; + } + else if(counterPatternPos < cursor && cursor <= counterPatternPos + 3) { + ui->lineEditContent->setText(text.remove(counterPatternPos, 3)); + return true; + } + } + } + } + } + + return false; +} + +void BarcodeEditor::applyStyleSheet() +{ + // QFile stylesFile(":/styles.qss"); + // QTextStream ts(&stylesFile); + // setStyleSheet(ts.readAll()); +} + +void BarcodeEditor::onContentChanged(QString content) +{ + const DateItemModel& dateVm = m_vm.dateViewModel; + + // 根据内容决定是否显示日期/时间选项卡 + if(!content.contains("{t}")) { + auto index = ui->tabWidget->indexOf(m_dateFormatEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + + index = ui->tabWidget->indexOf(m_dateReplaceEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + } + else { + if(ui->tabWidget->indexOf(m_dateFormatEditor) == -1) { + ui->tabWidget->addTab(m_dateFormatEditor, tr(u8"日期/时间")); + } + m_dateFormatEditor->setFixedSize(ui->tabBarcode->size()); + + if(ui->tabWidget->indexOf(m_dateReplaceEditor) == -1) { + ui->tabWidget->addTab(m_dateReplaceEditor, tr(u8"代替")); + } + m_dateReplaceEditor->setFixedSize(ui->tabBarcode->size()); + + DateFormatEditorVM dateFormatVM; + if(dateVm.daysOffset > 0) { + dateFormatVM.expirationValue = dateVm.daysOffset; + dateFormatVM.expirationType = EXPIRATION_TYPE_DAY; + } + else if(dateVm.monthsOffset > 0) { + dateFormatVM.expirationValue = dateVm.monthsOffset; + dateFormatVM.expirationType = EXPIRATION_TYPE_MONTH; + } + + dateFormatVM.pattern = dateVm.datetimePattern; + m_dateFormatEditor->setViewModel(dateFormatVM); + + m_dateReplaceEditor->setDateModel(dateVm); + } + + // 根据内容决定是否显示计数器选项卡 + if(!content.contains("{c}")) { + auto index = ui->tabWidget->indexOf(m_counterEditor); + if(index != -1) { + ui->tabWidget->removeTab(index); + } + } + else { + if(ui->tabWidget->indexOf(m_counterEditor) == -1) { + ui->tabWidget->addTab(m_counterEditor, tr(u8"计数器")); + m_counterEditor->setViewModel(makeCounterVM( + static_cast(m_vm.counterViewModel.counterType), + m_vm.counterViewModel.digitalNum, + m_vm.counterViewModel.cnt1Settings, + m_vm.counterViewModel.cnt2Settings)); + } + m_counterEditor->setFixedSize(ui->tabBarcode->size()); + } + + m_vm.contentPattern = content; +} + +void BarcodeViewModel::saveToXml(const BarcodeViewModel &vm, QXmlStreamAttributes &attrs) +{ + attrs.append("barcodeContentPattern", vm.contentPattern); + attrs.append("barcodeType", QString::number(int(vm.type))); + + if(vm.type == BARCODE_TYPE_BARCODE) { + DlgBarcodeFormatVM barcodeFormat = vm.format.value(); + attrs.append("barcodeFormat", barcodeFormat.type); + attrs.append("barcodeHeight", QString::number(barcodeFormat.height)); + attrs.append("barcodeWidth", QString::number(barcodeFormat.width)); + attrs.append("barcodeScale", QString::number(barcodeFormat.scale)); + attrs.append("barcodeInkType", QString::number(int(barcodeFormat.inkType))); + attrs.append("barcodeTxtVisible", barcodeFormat.txtVisible ? "true" : "false"); + } + else { + DlgQrcodeFormatVM qrcodeFormat = vm.format.value(); + attrs.append("qrcodeFormat", QString::number(qrcodeFormat.type)); + attrs.append("qrcodeSize", QString::number(qrcodeFormat.size)); + attrs.append("qrcodeLevel", QString::number(int(qrcodeFormat.level))); + attrs.append("qrcodeInkType", QString::number(int(qrcodeFormat.inkType))); + } + + if(vm.contentPattern.contains("{t}")) { + DateItemModel::saveToXml(vm.dateViewModel, attrs); + } + + if(vm.contentPattern.contains("{c}")) { + attrs.append("counterType", QString::number(vm.counterViewModel.counterType)); + attrs.append("counterDigitalNum", QString::number(vm.counterViewModel.digitalNum)); + } +} + +BarcodeViewModel BarcodeViewModel::loadFromXml(const QXmlStreamAttributes &attrs) +{ + BarcodeViewModel vm; + vm.contentPattern = attrs.value("barcodeContentPattern").toString(); + vm.type = static_cast(attrs.value("barcodeType").toInt()); + if(vm.type == BARCODE_TYPE_BARCODE) { + DlgBarcodeFormatVM barcodeFormat; + barcodeFormat.type = attrs.value("barcodeFormat").toString(); + barcodeFormat.height = attrs.value("barcodeHeight").toInt(); + barcodeFormat.width = attrs.value("barcodeWidth").toInt(); + barcodeFormat.scale = attrs.value("barcodeScale").toInt(); + barcodeFormat.inkType = static_cast(attrs.value("barcodeInkType").toInt()); + barcodeFormat.txtVisible = attrs.value("barcodeTxtVisible").toString() == "true"; + vm.format.setValue(barcodeFormat); + } + else { + DlgQrcodeFormatVM qrcodeFormat; + qrcodeFormat.type = static_cast(attrs.value("qrcodeFormat").toInt()); + qrcodeFormat.size = static_cast(attrs.value("qrcodeSize").toInt()); + qrcodeFormat.level = static_cast(attrs.value("qrcodeLevel").toInt()); + qrcodeFormat.inkType = static_cast(attrs.value("qrcodeInkType").toInt()); + vm.format.setValue(qrcodeFormat); + } + + if(vm.contentPattern.contains("{t}")) { + DateItemModel::loadFromXml(vm.dateViewModel, attrs); + } + + if(vm.contentPattern.contains("{c}")) { + vm.counterViewModel.counterType = static_cast(attrs.value("counterType").toInt()); + vm.counterViewModel.digitalNum = attrs.value("counterDigitalNum").toInt(); + } + + return vm; +} + + +QString BarcodeViewModel::toString(const BarcodeViewModel &vm) +{ + QString str; + str += QString("type: %1\r\n").arg(int(vm.type)); + str += QString("contentPattern: \"%1\"\r\n").arg(vm.contentPattern); + + // counterViewModel + str += QString("counterViewModel: \r\n"); + str += QString("\t counter type: %1\r\n").arg(vm.counterViewModel.counterType); + str += QString("\t digital number: %1\r\n").arg(vm.counterViewModel.digitalNum); + str += QString("\t letter space: %1\r\n").arg(vm.counterViewModel.letterSpace); + + // dateViewModel + str += QString("dateViewModel: \r\n"); + str += QString("\t pattern: \"%1\"\r\n").arg(vm.dateViewModel.datetimePattern); + + int expirationValue = 0; + int expirationType = 0; + if(vm.dateViewModel.daysOffset > 0) { + expirationValue = vm.dateViewModel.daysOffset; + expirationType = EXPIRATION_TYPE_DAY; + } + else if(vm.dateViewModel.monthsOffset > 0) { + expirationValue = vm.dateViewModel.monthsOffset; + expirationType = EXPIRATION_TYPE_MONTH; + } + str += QString("\t expirationValue: %1\r\n").arg(expirationValue); + str += QString("\t expirationType: %1\r\n").arg(expirationType); + + // format + str += QString("format: \n"); + if(vm.type == BARCODE_TYPE_BARCODE) { + DlgBarcodeFormatVM barcodeFormat = vm.format.value(); + str += QString("\t type: \"%1\"\r\n").arg(barcodeFormat.type); + str += QString("\t height: %1\r\n").arg(barcodeFormat.height); + str += QString("\t width: %1\r\n").arg(barcodeFormat.width); + str += QString("\t scale: %1\r\n").arg(barcodeFormat.scale); + str += QString("\t inkType: %1\r\n").arg(int(barcodeFormat.inkType)); + str += QString("\t txtVisible: %1\r\n").arg(barcodeFormat.txtVisible ? "true" : "false"); + } + else { + DlgQrcodeFormatVM qrcodeFormat = vm.format.value(); + str += QString("\t type: %1\r\n").arg(int(qrcodeFormat.type)); + str += QString("\t size: %1\r\n").arg(int(qrcodeFormat.size)); + str += QString("\t level: %1\r\n").arg(int(qrcodeFormat.level)); + str += QString("\t inkType: %1\r\n").arg(int(qrcodeFormat.inkType)); + } + + return str; +} + +void BarcodeEditor::on_cbBoxType_currentIndexChanged(int index) +{ + //bar 0; qr 1; dm 2; + m_vm.type = index; + if (index == 0) return; + m_qrcodeFormatEditor.setCodeType(ui->cbBoxType->currentText()); + onQrcodeFormatConfirmed(); } \ No newline at end of file diff --git a/scene/BarcodeEditor.h b/scene/BarcodeEditor.h index f369ede..9b1ec74 100644 --- a/scene/BarcodeEditor.h +++ b/scene/BarcodeEditor.h @@ -1,192 +1,192 @@ -#ifndef BARCODEEDITOR_H -#define BARCODEEDITOR_H - -#include - -#include "ViewModels.h" -#include "SysPara.h" -#include "dlgQrcodeFormat.h" -#include "DlgBarcodeFormat.h" -#include -#include "ItemGeneralSettings.h" - -class DateFormatEditor; -class DateReplaceEditor; -class CounterEditor; - -enum BarcodeType { - BARCODE_TYPE_BARCODE = 0, - BARCODE_TYPE_QRCODE = 1, - BARCODE_TYPE_DMCODE = 2, -}; - -/** - * @brief 条码设置界面所用的视图模型 - * - * @remark contentPattern 内可包含变量,如 {t} 表示日期/时间、{c} 表示计数器。 - * 仅当 contentPattern 含有相应变量时,counterViewModel / dateViewModel 字段才有意义。 - */ -struct BarcodeViewModel { - TextItemModel generalSettingsVM; // 通用设置视图模型 - QString contentPattern; // 条形码内容模版,例如 "ABC{t}{c1}" - CounterViewModel counterViewModel; // 计数器视图模型 - DateItemModel dateViewModel; // 日期视图模型 - BarcodeType type = BARCODE_TYPE_BARCODE; // 条形码 或 二维码 - QVariant format; // 条形码/二维码 格式设置,如果是条形码,则实际类型为 DlgBarcodeFormatVM,如果是二维码,则实际类型为 DlgQrcodeFormatVM - - std::function imageGenerator; // 条形码/二维码 图片生成函数 - - /** - * @brief 将vm保存到xml属性集 - * - * @param vm 条码视图模型 - * @param attrs xml属性集 - */ - static void saveToXml(const BarcodeViewModel& vm, QXmlStreamAttributes& attrs); - - /** - * @brief 从xml属性集加载条码视图模型 - * - * @param attrs xml属性集 - * @return BarcodeViewModel 条码视图模型 - */ - static BarcodeViewModel loadFromXml(const QXmlStreamAttributes& attrs); - - /** - * @brief - * - * @param vm 条码视图模型 - * @return QString 字符串表示 - * - * @example - * type: 0 - * contentPattern: ABC{t}{c1} - * counterViewModel: - * \t counter type: 7 - * \t digital number: 2 - * \t letter space: 2 - * dateViewModel: - * \t pattern: "yyyy-MM-dd HH:mm:ss" - * \t expirationValue: 0 - * \t expirationType: 0 - * format: - * \t type: "BARCODE_128" - * \t height: 9 - * \t width: 36 - * \t scale: 1 - * \t inkType: 0 - * \t txtVisible: false - */ - static QString toString(const BarcodeViewModel& vm); -}; - -Q_DECLARE_METATYPE(BarcodeViewModel); - -namespace Ui { -class BarcodeEditor; -} - -class BarcodeEditor : public QDialog -{ - Q_OBJECT - -public: - explicit BarcodeEditor(QWidget *parent = nullptr); - ~BarcodeEditor(); - - /** - * @brief 注入条形码视图模型(纯结构体,按值拷贝) - * - * @param vm - */ - void bindViewModel(const BarcodeViewModel& vm); - - /** - * @brief 获取当前视图模型 - * - * @note 调用前会先从各子编辑器收集最新值回写到内部 m_vm,再返回。 - * - * @return BarcodeViewModel - */ - BarcodeViewModel viewModel(); - - void restoreViewModel(); - - void applyCounterConfigToSysPara(); - -private slots: - - /** - * @brief 条形码内容改变时触发 - * - * @param content - */ - void onContentChanged(QString content); - - /** - * @brief 条形码、二维码格式更改按钮点击时触发 - * - */ - void onBtnFormatClicked(); - - /** - * @brief 日期按钮点击时触发 - * - */ - void onBtnDatetimeClicked(); - - /** - * @brief 计数器按钮点击时触发 - * - */ - void onBtnCounterClicked(); - - /** - * @brief 确定按钮点击时触发 - * - */ - void onCheckBtnClicked(); - - /** - * @brief 取消按钮点击时触发 - * - */ - void onCloseBtnClicked(); - - /** - * @brief 条形码格式确认时触发 - * - */ - void onBarcodeFormatConfirmed(); - - /** - * @brief 二维码格式确认时触发 - * - */ - void onQrcodeFormatConfirmed(); - - void onTypeChanged(int i); - - void on_cbBoxType_currentIndexChanged(int index); - -protected: - virtual bool eventFilter(QObject* obj, QEvent* event) override; - -private: - Ui::BarcodeEditor *ui; - - void applyStyleSheet(); - - BarcodeViewModel m_vm; - - DateFormatEditor *m_dateFormatEditor = nullptr; - DateReplaceEditor *m_dateReplaceEditor = nullptr; - CounterEditor *m_counterEditor = nullptr; - - SysPara* m_sysPara = nullptr; - - DlgBarcodeFormat m_barcodeFormatEditor; - DlgQrcodeFormat m_qrcodeFormatEditor; -}; - -#endif // BARCODEEDITOR_H +#ifndef BARCODEEDITOR_H +#define BARCODEEDITOR_H + +#include + +#include "ViewModels.h" +#include "SysPara.h" +#include "dlgQrcodeFormat.h" +#include "DlgBarcodeFormat.h" +#include +#include "ItemGeneralSettings.h" + +class DateFormatEditor; +class DateReplaceEditor; +class CounterEditor; + +enum BarcodeType { + BARCODE_TYPE_BARCODE = 0, + BARCODE_TYPE_QRCODE = 1, + BARCODE_TYPE_DMCODE = 2, +}; + +/** + * @brief 条码设置界面所用的视图模型 + * + * @remark contentPattern 内可包含变量,如 {t} 表示日期/时间、{c} 表示计数器。 + * 仅当 contentPattern 含有相应变量时,counterViewModel / dateViewModel 字段才有意义。 + */ +struct BarcodeViewModel { + TextItemModel generalSettingsVM; // 通用设置视图模型 + QString contentPattern; // 条形码内容模版,例如 "ABC{t}{c1}" + CounterViewModel counterViewModel; // 计数器视图模型 + DateItemModel dateViewModel; // 日期视图模型 + BarcodeType type = BARCODE_TYPE_BARCODE; // 条形码 或 二维码 + QVariant format; // 条形码/二维码 格式设置,如果是条形码,则实际类型为 DlgBarcodeFormatVM,如果是二维码,则实际类型为 DlgQrcodeFormatVM + + std::function imageGenerator; // 条形码/二维码 图片生成函数 + + /** + * @brief 将vm保存到xml属性集 + * + * @param vm 条码视图模型 + * @param attrs xml属性集 + */ + static void saveToXml(const BarcodeViewModel& vm, QXmlStreamAttributes& attrs); + + /** + * @brief 从xml属性集加载条码视图模型 + * + * @param attrs xml属性集 + * @return BarcodeViewModel 条码视图模型 + */ + static BarcodeViewModel loadFromXml(const QXmlStreamAttributes& attrs); + + /** + * @brief + * + * @param vm 条码视图模型 + * @return QString 字符串表示 + * + * @example + * type: 0 + * contentPattern: ABC{t}{c1} + * counterViewModel: + * \t counter type: 7 + * \t digital number: 2 + * \t letter space: 2 + * dateViewModel: + * \t pattern: "yyyy-MM-dd HH:mm:ss" + * \t expirationValue: 0 + * \t expirationType: 0 + * format: + * \t type: "BARCODE_128" + * \t height: 9 + * \t width: 36 + * \t scale: 1 + * \t inkType: 0 + * \t txtVisible: false + */ + static QString toString(const BarcodeViewModel& vm); +}; + +Q_DECLARE_METATYPE(BarcodeViewModel); + +namespace Ui { +class BarcodeEditor; +} + +class BarcodeEditor : public QDialog +{ + Q_OBJECT + +public: + explicit BarcodeEditor(QWidget *parent = nullptr); + ~BarcodeEditor(); + + /** + * @brief 注入条形码视图模型(纯结构体,按值拷贝) + * + * @param vm + */ + void bindViewModel(const BarcodeViewModel& vm); + + /** + * @brief 获取当前视图模型 + * + * @note 调用前会先从各子编辑器收集最新值回写到内部 m_vm,再返回。 + * + * @return BarcodeViewModel + */ + BarcodeViewModel viewModel(); + + void restoreViewModel(); + + void applyCounterConfigToSysPara(); + +private slots: + + /** + * @brief 条形码内容改变时触发 + * + * @param content + */ + void onContentChanged(QString content); + + /** + * @brief 条形码、二维码格式更改按钮点击时触发 + * + */ + void onBtnFormatClicked(); + + /** + * @brief 日期按钮点击时触发 + * + */ + void onBtnDatetimeClicked(); + + /** + * @brief 计数器按钮点击时触发 + * + */ + void onBtnCounterClicked(); + + /** + * @brief 确定按钮点击时触发 + * + */ + void onCheckBtnClicked(); + + /** + * @brief 取消按钮点击时触发 + * + */ + void onCloseBtnClicked(); + + /** + * @brief 条形码格式确认时触发 + * + */ + void onBarcodeFormatConfirmed(); + + /** + * @brief 二维码格式确认时触发 + * + */ + void onQrcodeFormatConfirmed(); + + void onTypeChanged(int i); + + void on_cbBoxType_currentIndexChanged(int index); + +protected: + virtual bool eventFilter(QObject* obj, QEvent* event) override; + +private: + Ui::BarcodeEditor *ui; + + void applyStyleSheet(); + + BarcodeViewModel m_vm; + + DateFormatEditor *m_dateFormatEditor = nullptr; + DateReplaceEditor *m_dateReplaceEditor = nullptr; + CounterEditor *m_counterEditor = nullptr; + + SysPara* m_sysPara = nullptr; + + DlgBarcodeFormat m_barcodeFormatEditor; + DlgQrcodeFormat m_qrcodeFormatEditor; +}; + +#endif // BARCODEEDITOR_H diff --git a/scene/BarcodeEditor.ui b/scene/BarcodeEditor.ui index 66daa13..1feb56f 100644 --- a/scene/BarcodeEditor.ui +++ b/scene/BarcodeEditor.ui @@ -1,484 +1,484 @@ - - - BarcodeEditor - - - - 0 - 0 - 800 - 600 - - - - Form - - - QWidget { - font-size: 16px; -} - -QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - -QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ -} - -/* 下拉箭头区域 */ -QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; -} - -/* 下拉箭头图标 */ -QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ -} - -/* 悬停状态 */ -QComboBox:hover { - background-color: #efefef; -} - -// 下拉框 -QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; -} - -QSpinBox::up-button { - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::up-arrow { - image: url(:/image/up_white.png); -} - -QSpinBox::down-button { - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::down-arrow { - image: url(:/image/down_white.png); -} - - - - false - - - - - 520 - 540 - 101 - 40 - - - - - 100 - 40 - - - - ✓ - - - - - - 640 - 540 - 101 - 40 - - - - - 0 - 0 - - - - - 100 - 40 - - - - ✕ - - - - - - 10 - 50 - 771 - 471 - - - - QTabWidget { - border: none; - background-color: #7B838E; - } - - QTabBar::tab { - min-width: 90px; - min-height: 45px; - padding: 4px 10px; - margin-right: 4px; - border: 1px solid #dddddd; - border-bottom: none; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - background-color: #5396C1; - color: #ffffff; - } - - QTabWidget::tab-bar { - top: -3px; - left: 10px; - } - - QTabBar::tab:selected { - background-color: #6bb1e0; - color: #ffffff; - box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); - } - - - 1 - - - - 整体设置 - - - - - -1 - -1 - 771 - 441 - - - - - - - 条形码 - - - - - 40 - 20 - 81 - 21 - - - - 内容 - - - - - - 40 - 50 - 481 - 31 - - - - - - - 40 - 110 - 81 - 20 - - - - 类型 - - - - - - 40 - 140 - 191 - 31 - - - - - 条形码 - - - - - QRCode - - - - - DataMatrix - - - - - - - 260 - 140 - 141 - 31 - - - - 码格式 - - - - - - 420 - 120 - 261 - 231 - - - - 嵌入 - - - - - 60 - 40 - 131 - 41 - - - - 日期 - - - - - - 60 - 90 - 131 - 41 - - - - 计数器 - - - - - - - - - 0 - 0 - 800 - 38 - - - - background-color:#4E679F; - - - - - - color:#ffffff; - - - 条形码编辑 - - - - - - - - - ItemGeneralSettings - QWidget -
scene/ItemGeneralSettings.h
- 1 -
-
- - - - lineEditContent - textChanged(QString) - BarcodeEditor - onContentChanged(QString) - - - 199 - 144 - - - -130 - 136 - - - - - btnFormat - clicked() - BarcodeEditor - onBtnFormatClicked() - - - 412 - 231 - - - 895 - 230 - - - - - btnDatetime - clicked() - BarcodeEditor - onBtnDatetimeClicked() - - - 562 - 255 - - - 915 - 326 - - - - - btnCounter1 - clicked() - BarcodeEditor - onBtnCounterClicked() - - - 553 - 300 - - - 819 - 382 - - - - - checkBtn - clicked() - BarcodeEditor - onCheckBtnClicked() - - - 543 - 558 - - - 581 - 705 - - - - - closeBtn - clicked() - BarcodeEditor - onCloseBtnClicked() - - - 689 - 561 - - - 708 - 734 - - - - - - onContentChanged(QString) - onBtnFormatClicked() - onBtnDatetimeClicked() - onBtnCounterClicked() - onCheckBtnClicked() - onCloseBtnClicked() - -
+ + + BarcodeEditor + + + + 0 + 0 + 800 + 600 + + + + Form + + + QWidget { + font-size: 16px; +} + +QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + +QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ +} + +/* 下拉箭头区域 */ +QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; +} + +/* 下拉箭头图标 */ +QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ +} + +/* 悬停状态 */ +QComboBox:hover { + background-color: #efefef; +} + +// 下拉框 +QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; +} + +QSpinBox::up-button { + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; +} + +QSpinBox::up-arrow { + image: url(:/image/up_white.png); +} + +QSpinBox::down-button { + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; +} + +QSpinBox::down-arrow { + image: url(:/image/down_white.png); +} + + + + false + + + + + 520 + 540 + 101 + 40 + + + + + 100 + 40 + + + + ✓ + + + + + + 640 + 540 + 101 + 40 + + + + + 0 + 0 + + + + + 100 + 40 + + + + ✕ + + + + + + 10 + 50 + 771 + 471 + + + + QTabWidget { + border: none; + background-color: #7B838E; + } + + QTabBar::tab { + min-width: 90px; + min-height: 45px; + padding: 4px 10px; + margin-right: 4px; + border: 1px solid #dddddd; + border-bottom: none; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + background-color: #5396C1; + color: #ffffff; + } + + QTabWidget::tab-bar { + top: -3px; + left: 10px; + } + + QTabBar::tab:selected { + background-color: #6bb1e0; + color: #ffffff; + box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); + } + + + 1 + + + + 整体设置 + + + + + -1 + -1 + 771 + 441 + + + + + + + 条形码 + + + + + 40 + 20 + 81 + 21 + + + + 内容 + + + + + + 40 + 50 + 481 + 31 + + + + + + + 40 + 110 + 81 + 20 + + + + 类型 + + + + + + 40 + 140 + 191 + 31 + + + + + 条形码 + + + + + QRCode + + + + + DataMatrix + + + + + + + 260 + 140 + 141 + 31 + + + + 码格式 + + + + + + 420 + 120 + 261 + 231 + + + + 嵌入 + + + + + 60 + 40 + 131 + 41 + + + + 日期 + + + + + + 60 + 90 + 131 + 41 + + + + 计数器 + + + + + + + + + 0 + 0 + 800 + 38 + + + + background-color:#4E679F; + + + + + + color:#ffffff; + + + 条形码编辑 + + + + + + + + + ItemGeneralSettings + QWidget +
scene/ItemGeneralSettings.h
+ 1 +
+
+ + + + lineEditContent + textChanged(QString) + BarcodeEditor + onContentChanged(QString) + + + 199 + 144 + + + -130 + 136 + + + + + btnFormat + clicked() + BarcodeEditor + onBtnFormatClicked() + + + 412 + 231 + + + 895 + 230 + + + + + btnDatetime + clicked() + BarcodeEditor + onBtnDatetimeClicked() + + + 562 + 255 + + + 915 + 326 + + + + + btnCounter1 + clicked() + BarcodeEditor + onBtnCounterClicked() + + + 553 + 300 + + + 819 + 382 + + + + + checkBtn + clicked() + BarcodeEditor + onCheckBtnClicked() + + + 543 + 558 + + + 581 + 705 + + + + + closeBtn + clicked() + BarcodeEditor + onCloseBtnClicked() + + + 689 + 561 + + + 708 + 734 + + + + + + onContentChanged(QString) + onBtnFormatClicked() + onBtnDatetimeClicked() + onBtnCounterClicked() + onCheckBtnClicked() + onCloseBtnClicked() + +
diff --git a/scene/CounterEditor.cpp b/scene/CounterEditor.cpp index 01fe2a4..2e8d5f3 100644 --- a/scene/CounterEditor.cpp +++ b/scene/CounterEditor.cpp @@ -1,138 +1,138 @@ -#include "CounterEditor.h" -#include "ui_CounterEditor.h" -#include "ViewModels.h" - -CounterEditor::CounterEditor(QWidget *parent) : - QWidget(parent), - ui(new Ui::CounterEditor) -{ - ui->setupUi(this); - - connect(ui->checkBoxResetCnt2CurrValue, &QCheckBox::toggled, - this, &CounterEditor::onEditCurrValueToggled); - - connect(ui->cbBoxCounterType, QOverload::of(&QComboBox::currentIndexChanged), this, &CounterEditor::onCounterTypeChanged); - connect(ui->cbBoxDigitalNum, QOverload::of(&QComboBox::currentIndexChanged), this, &CounterEditor::onDigitalNumChanged); - - connect(ui->spinBoxCnt2StartValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); - connect(ui->spinBoxCnt2EndValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); - connect(ui->spinBoxCnt2RepeateCnt, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); - connect(ui->spinBoxCnt2StepValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); - connect(ui->spinBoxCnt2CurrValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); - - connect(ui->checkBoxResetCnt2CurrValue, &QCheckBox::clicked, this, [this](bool) {fetchCounterConfigFromView();} ); - connect(ui->eleCNT2IncEn, &QCheckBox::clicked, this, [this](bool) {fetchCounterConfigFromView();} ); - - setViewModel(m_vm); -} - -CounterEditor::~CounterEditor() -{ - delete ui; -} - -/** - * @brief 设置视图模型并将其更新至UI - * - * @param vm - */ -void CounterEditor::setViewModel(CounterEditorVM vm) -{ - m_vm = std::move(vm); - - // 根据 VM 中的当前计数器ID 确定显示哪个计数器的配置 - CounterEditorVM::CounterSlot& cnt = m_vm.counterType == COUNTER_TYPE_1 ? m_vm.counter1 : m_vm.counter2; - - auto b = ui->spinBoxCnt2StartValue->blockSignals(true); - ui->spinBoxCnt2StartValue->setValue(cnt.startValue); - ui->spinBoxCnt2StartValue->blockSignals(b); - - b = ui->spinBoxCnt2EndValue->blockSignals(true); - ui->spinBoxCnt2EndValue->setValue(cnt.endValue); - ui->spinBoxCnt2EndValue->blockSignals(b); - - b = ui->spinBoxCnt2RepeateCnt->blockSignals(true); - ui->spinBoxCnt2RepeateCnt->setValue(cnt.repeatValue); - ui->spinBoxCnt2RepeateCnt->blockSignals(b); - - b = ui->spinBoxCnt2StepValue->blockSignals(true); - ui->spinBoxCnt2StepValue->setValue(cnt.stepValue); - ui->spinBoxCnt2StepValue->blockSignals(b); - - b = ui->spinBoxCnt2CurrValue->blockSignals(true); - ui->spinBoxCnt2CurrValue->setValue(cnt.currValue); - ui->spinBoxCnt2CurrValue->blockSignals(b); - - b = ui->checkBoxResetCnt2CurrValue->blockSignals(true); - ui->checkBoxResetCnt2CurrValue->setChecked(cnt.editCurrValue); - ui->checkBoxResetCnt2CurrValue->blockSignals(b); - - b = ui->eleCNT2IncEn->blockSignals(true); - ui->eleCNT2IncEn->setChecked(cnt.eleEyeIncEn); - ui->eleCNT2IncEn->blockSignals(b); - - ui->spinBoxCnt2CurrValue->setEnabled(cnt.editCurrValue); - ui->labelCnt2CurrValue->setText(QString::number(cnt.currValue)); - - b = ui->cbBoxCounterType->blockSignals(true); - ui->cbBoxCounterType->setCurrentIndex(m_vm.counterType == COUNTER_TYPE_1 ? 0 : 1); - ui->cbBoxCounterType->blockSignals(b); - - b = ui->cbBoxDigitalNum->blockSignals(true); - ui->cbBoxDigitalNum->setCurrentIndex(m_vm.digitalNum - 1); - ui->cbBoxDigitalNum->blockSignals(b); -} - -/** - * @brief 从界面获取最新配置以刷新视图模型 - * - * @return CounterEditorVM 最新的视图模型 - */ -CounterEditorVM CounterEditor::viewModel() -{ - m_vm.counterType = ui->cbBoxCounterType->currentIndex() == 0 ? COUNTER_TYPE_1 : COUNTER_TYPE_2; - m_vm.digitalNum = ui->cbBoxDigitalNum->currentIndex() + 1; - fetchCounterConfigFromView(); - return m_vm; -} - -void CounterEditor::onCounterTypeChanged(int i) -{ - i = std::max(i, 0); - m_vm.counterType = i == 0 ? COUNTER_TYPE_1 : COUNTER_TYPE_2; - setViewModel(m_vm); -} - -void CounterEditor::onDigitalNumChanged(int i) -{ - i = std::max(i, 0); - m_vm.digitalNum = i + 1; -} - -/** - * @brief 从界面拉取计数器配置 - * - * 根据当前所选的计数器ID更新对应的计数器配置 - * - */ -void CounterEditor::fetchCounterConfigFromView() -{ - CounterEditorVM::CounterSlot& cnt = m_vm.counterType == COUNTER_TYPE_1 ? m_vm.counter1 : m_vm.counter2; - - cnt.startValue = ui->spinBoxCnt2StartValue->value(); - cnt.endValue = ui->spinBoxCnt2EndValue->value(); - cnt.repeatValue = ui->spinBoxCnt2RepeateCnt->value(); - cnt.stepValue = ui->spinBoxCnt2StepValue->value(); - cnt.currValue = ui->spinBoxCnt2CurrValue->value(); - cnt.editCurrValue = ui->checkBoxResetCnt2CurrValue->isChecked(); - cnt.eleEyeIncEn = ui->eleCNT2IncEn->isChecked(); -} - -/** - * @brief 简单启用对应SpinBox - * - */ -void CounterEditor::onEditCurrValueToggled() -{ - ui->spinBoxCnt2CurrValue->setEnabled(ui->checkBoxResetCnt2CurrValue->isChecked()); +#include "CounterEditor.h" +#include "ui_CounterEditor.h" +#include "ViewModels.h" + +CounterEditor::CounterEditor(QWidget *parent) : + QWidget(parent), + ui(new Ui::CounterEditor) +{ + ui->setupUi(this); + + connect(ui->checkBoxResetCnt2CurrValue, &QCheckBox::toggled, + this, &CounterEditor::onEditCurrValueToggled); + + connect(ui->cbBoxCounterType, QOverload::of(&QComboBox::currentIndexChanged), this, &CounterEditor::onCounterTypeChanged); + connect(ui->cbBoxDigitalNum, QOverload::of(&QComboBox::currentIndexChanged), this, &CounterEditor::onDigitalNumChanged); + + connect(ui->spinBoxCnt2StartValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); + connect(ui->spinBoxCnt2EndValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); + connect(ui->spinBoxCnt2RepeateCnt, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); + connect(ui->spinBoxCnt2StepValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); + connect(ui->spinBoxCnt2CurrValue, QOverload::of(&QSpinBox::valueChanged), this, [this](int) {fetchCounterConfigFromView();} ); + + connect(ui->checkBoxResetCnt2CurrValue, &QCheckBox::clicked, this, [this](bool) {fetchCounterConfigFromView();} ); + connect(ui->eleCNT2IncEn, &QCheckBox::clicked, this, [this](bool) {fetchCounterConfigFromView();} ); + + setViewModel(m_vm); +} + +CounterEditor::~CounterEditor() +{ + delete ui; +} + +/** + * @brief 设置视图模型并将其更新至UI + * + * @param vm + */ +void CounterEditor::setViewModel(CounterEditorVM vm) +{ + m_vm = std::move(vm); + + // 根据 VM 中的当前计数器ID 确定显示哪个计数器的配置 + CounterEditorVM::CounterSlot& cnt = m_vm.counterType == COUNTER_TYPE_1 ? m_vm.counter1 : m_vm.counter2; + + auto b = ui->spinBoxCnt2StartValue->blockSignals(true); + ui->spinBoxCnt2StartValue->setValue(cnt.startValue); + ui->spinBoxCnt2StartValue->blockSignals(b); + + b = ui->spinBoxCnt2EndValue->blockSignals(true); + ui->spinBoxCnt2EndValue->setValue(cnt.endValue); + ui->spinBoxCnt2EndValue->blockSignals(b); + + b = ui->spinBoxCnt2RepeateCnt->blockSignals(true); + ui->spinBoxCnt2RepeateCnt->setValue(cnt.repeatValue); + ui->spinBoxCnt2RepeateCnt->blockSignals(b); + + b = ui->spinBoxCnt2StepValue->blockSignals(true); + ui->spinBoxCnt2StepValue->setValue(cnt.stepValue); + ui->spinBoxCnt2StepValue->blockSignals(b); + + b = ui->spinBoxCnt2CurrValue->blockSignals(true); + ui->spinBoxCnt2CurrValue->setValue(cnt.currValue); + ui->spinBoxCnt2CurrValue->blockSignals(b); + + b = ui->checkBoxResetCnt2CurrValue->blockSignals(true); + ui->checkBoxResetCnt2CurrValue->setChecked(cnt.editCurrValue); + ui->checkBoxResetCnt2CurrValue->blockSignals(b); + + b = ui->eleCNT2IncEn->blockSignals(true); + ui->eleCNT2IncEn->setChecked(cnt.eleEyeIncEn); + ui->eleCNT2IncEn->blockSignals(b); + + ui->spinBoxCnt2CurrValue->setEnabled(cnt.editCurrValue); + ui->labelCnt2CurrValue->setText(QString::number(cnt.currValue)); + + b = ui->cbBoxCounterType->blockSignals(true); + ui->cbBoxCounterType->setCurrentIndex(m_vm.counterType == COUNTER_TYPE_1 ? 0 : 1); + ui->cbBoxCounterType->blockSignals(b); + + b = ui->cbBoxDigitalNum->blockSignals(true); + ui->cbBoxDigitalNum->setCurrentIndex(m_vm.digitalNum - 1); + ui->cbBoxDigitalNum->blockSignals(b); +} + +/** + * @brief 从界面获取最新配置以刷新视图模型 + * + * @return CounterEditorVM 最新的视图模型 + */ +CounterEditorVM CounterEditor::viewModel() +{ + m_vm.counterType = ui->cbBoxCounterType->currentIndex() == 0 ? COUNTER_TYPE_1 : COUNTER_TYPE_2; + m_vm.digitalNum = ui->cbBoxDigitalNum->currentIndex() + 1; + fetchCounterConfigFromView(); + return m_vm; +} + +void CounterEditor::onCounterTypeChanged(int i) +{ + i = std::max(i, 0); + m_vm.counterType = i == 0 ? COUNTER_TYPE_1 : COUNTER_TYPE_2; + setViewModel(m_vm); +} + +void CounterEditor::onDigitalNumChanged(int i) +{ + i = std::max(i, 0); + m_vm.digitalNum = i + 1; +} + +/** + * @brief 从界面拉取计数器配置 + * + * 根据当前所选的计数器ID更新对应的计数器配置 + * + */ +void CounterEditor::fetchCounterConfigFromView() +{ + CounterEditorVM::CounterSlot& cnt = m_vm.counterType == COUNTER_TYPE_1 ? m_vm.counter1 : m_vm.counter2; + + cnt.startValue = ui->spinBoxCnt2StartValue->value(); + cnt.endValue = ui->spinBoxCnt2EndValue->value(); + cnt.repeatValue = ui->spinBoxCnt2RepeateCnt->value(); + cnt.stepValue = ui->spinBoxCnt2StepValue->value(); + cnt.currValue = ui->spinBoxCnt2CurrValue->value(); + cnt.editCurrValue = ui->checkBoxResetCnt2CurrValue->isChecked(); + cnt.eleEyeIncEn = ui->eleCNT2IncEn->isChecked(); +} + +/** + * @brief 简单启用对应SpinBox + * + */ +void CounterEditor::onEditCurrValueToggled() +{ + ui->spinBoxCnt2CurrValue->setEnabled(ui->checkBoxResetCnt2CurrValue->isChecked()); } \ No newline at end of file diff --git a/scene/CounterEditor.h b/scene/CounterEditor.h index b34a777..3b6343a 100644 --- a/scene/CounterEditor.h +++ b/scene/CounterEditor.h @@ -1,71 +1,71 @@ -#ifndef COUNTEREDITOR_H -#define COUNTEREDITOR_H - -#include - -namespace Ui { -class CounterEditor; -} - -/** - * @brief 用于 CounterEditor 的视图模型 - * - * 包含了计数器ID、计数器位数以及各个计数器当前的配置 - * - */ -struct CounterEditorVM { - - int counterType = 7; - int digitalNum = 2; - - struct CounterSlot { - int startValue = 1; - int endValue = 9999; - int repeatValue = 1; - int stepValue = 1; - int currValue = 1; - bool editCurrValue = false; // 对应 checkBoxResetCnt2CurrValue:勾选才允许重置/编辑当前值 - bool eleEyeIncEn = false; // 对应 eleCNT2IncEn:电眼触发使计数器+1 - }; - - CounterSlot counter1, counter2; -}; - -using CounterSettings = CounterEditorVM::CounterSlot; - -class CounterEditor : public QWidget -{ - Q_OBJECT - -public: - explicit CounterEditor(QWidget *parent = nullptr); - ~CounterEditor(); - - /** - * @brief 设置 UI 所用的视图模型 - * - * @param vm - */ - void setViewModel(CounterEditorVM vm); - - /** - * @brief 获取 UI 当前的视图模型 - * - * @return CounterEditorVM - */ - CounterEditorVM viewModel(); - -private slots: - void onEditCurrValueToggled(); - void onCounterTypeChanged(int i); - void onDigitalNumChanged(int i); - -private: - void fetchCounterConfigFromView(); - - Ui::CounterEditor *ui; - - CounterEditorVM m_vm; -}; - -#endif // COUNTEREDITOR_H +#ifndef COUNTEREDITOR_H +#define COUNTEREDITOR_H + +#include + +namespace Ui { +class CounterEditor; +} + +/** + * @brief 用于 CounterEditor 的视图模型 + * + * 包含了计数器ID、计数器位数以及各个计数器当前的配置 + * + */ +struct CounterEditorVM { + + int counterType = 7; + int digitalNum = 2; + + struct CounterSlot { + int startValue = 1; + int endValue = 9999; + int repeatValue = 1; + int stepValue = 1; + int currValue = 1; + bool editCurrValue = false; // 对应 checkBoxResetCnt2CurrValue:勾选才允许重置/编辑当前值 + bool eleEyeIncEn = false; // 对应 eleCNT2IncEn:电眼触发使计数器+1 + }; + + CounterSlot counter1, counter2; +}; + +using CounterSettings = CounterEditorVM::CounterSlot; + +class CounterEditor : public QWidget +{ + Q_OBJECT + +public: + explicit CounterEditor(QWidget *parent = nullptr); + ~CounterEditor(); + + /** + * @brief 设置 UI 所用的视图模型 + * + * @param vm + */ + void setViewModel(CounterEditorVM vm); + + /** + * @brief 获取 UI 当前的视图模型 + * + * @return CounterEditorVM + */ + CounterEditorVM viewModel(); + +private slots: + void onEditCurrValueToggled(); + void onCounterTypeChanged(int i); + void onDigitalNumChanged(int i); + +private: + void fetchCounterConfigFromView(); + + Ui::CounterEditor *ui; + + CounterEditorVM m_vm; +}; + +#endif // COUNTEREDITOR_H diff --git a/scene/CounterEditor.ui b/scene/CounterEditor.ui index ea96540..5a7214e 100644 --- a/scene/CounterEditor.ui +++ b/scene/CounterEditor.ui @@ -1,796 +1,796 @@ - - - CounterEditor - - - - 0 - 0 - 732 - 522 - - - - QWidget{ - font-size: 16px; -} - - QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - - QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ - } - - /* 下拉箭头区域 */ - QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; - } - - /* 下拉箭头图标 */ - QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - } - - /* 悬停状态 */ - QComboBox:hover { - background-color: #efefef; - } - - QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; - } - - QSpinBox::down-button { - width: 23px; /* 图标显示宽度 */ - height: 23px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; - } - - QSpinBox::down-arrow { - image: url(:/image/down_white.png); - height: 18px; - width: 18px; - } - - QSpinBox::up-button { - width: 23px; /* 图标显示宽度 */ - height: 23px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; - } - - QSpinBox::up-arrow { - image: url(:/image/up_white.png); - height: 18px; - width: 18px; - } - - QSpinBox { - border: 1px solid #333333; - } - - QTabWidget { - border: none; - background-color: #7B838E; - } - - QTabBar::tab { - margin-top: -3px; - min-width: 90px; - min-height: 45px; - padding: 4px 10px; - margin-right: 4px; - border: 1px solid #dddddd; - border-bottom: none; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - background-color: #5396C1; - color: #ffffff; - } - - QTabWidget::tab-bar { - top: -3px; - left: 10px; - } - - QTabBar::tab:focus { - outline: none; - } - - QTabBar::tab:selected { - background-color: #6bb1e0; - color: #ffffff; - box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); - } - - QRadioButton::indicator { - width: 25px; - height: 25px; - } - - QSpinBox::down-button { - width: 23px; /* 图标显示宽度 */ - height: 23px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; - } - - QSpinBox::down-arrow { - image: url(:/image/down_white.png); - height: 15px; - width: 15px; - } - - QSpinBox::up-button { - width: 23px; /* 图标显示宽度 */ - height: 23px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; - } - - QSpinBox::up-arrow { - image: url(:/image/up_white.png); - height: 15px; - width: 15px; - } - - QSpinBox { - border: 1px solid #333333; - } - - QCheckBox { - color: #000000; - } - - QCheckBox::indicator { - width: 15px; - height: 15px; - border: 1px solid #96A0A9; - border-radius: 8px; - background-color: #ffffff; - } - - QCheckBox::indicator:checked { - background-color: #95B2D4; - border-color: #95B2D4; - } - - - - - 369 - 122 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - - - - 9999999 - - - 9999 - - - - - - 475 - 122 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - Qt::LeftToRight - - - 重复数: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - 581 - 122 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - 1 - - - 65535 - - - - - - 157 - 179 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - -49999999 - - - 49999999 - - - 1 - - - - - true - - - - 475 - 179 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - - -1 - - - - Qt::LeftToRight - - - - - - Qt::AlignCenter - - - - - - 51 - 122 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - Qt::LeftToRight - - - 起始值: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - 157 - 122 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - 999999 - - - 1 - - - - - - 263 - 122 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - Qt::LeftToRight - - - 结束值: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - false - - - - 369 - 179 - 100 - 50 - - - - - 0 - 0 - - - - - 100 - 50 - - - - - 100 - 50 - - - - 0 - - - 999999999 - - - 1 - - - - - - 270 - 179 - 100 - 50 - - - - - 100 - 50 - - - - - 100 - 50 - - - - - 1 - - - 1 - - - 1 - - - 1 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 100 - 50 - - - - QRadioButton::indicator { -width: 25px; -height: 25px; -} - - - 当前值: - - - - - - - - - 56 - 179 - 100 - 50 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 100 - 50 - - - - QRadioButton::indicator { -width: 25px; -height: 25px; -} - - - 增量值: - - - - - - - - - 70 - 60 - 81 - 31 - - - - 计数器ID: - - - - - - 160 - 60 - 121 - 31 - - - - - 计数器1 - - - - - 计数器2 - - - - - - - 370 - 60 - 91 - 31 - - - - 计数器位数: - - - - - - 470 - 60 - 101 - 31 - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - - - + + + CounterEditor + + + + 0 + 0 + 732 + 522 + + + + QWidget{ + font-size: 16px; +} + + QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + + QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ + } + + /* 下拉箭头区域 */ + QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; + } + + /* 下拉箭头图标 */ + QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + } + + /* 悬停状态 */ + QComboBox:hover { + background-color: #efefef; + } + + QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; + } + + QSpinBox::down-button { + width: 23px; /* 图标显示宽度 */ + height: 23px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; + } + + QSpinBox::down-arrow { + image: url(:/image/down_white.png); + height: 18px; + width: 18px; + } + + QSpinBox::up-button { + width: 23px; /* 图标显示宽度 */ + height: 23px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; + } + + QSpinBox::up-arrow { + image: url(:/image/up_white.png); + height: 18px; + width: 18px; + } + + QSpinBox { + border: 1px solid #333333; + } + + QTabWidget { + border: none; + background-color: #7B838E; + } + + QTabBar::tab { + margin-top: -3px; + min-width: 90px; + min-height: 45px; + padding: 4px 10px; + margin-right: 4px; + border: 1px solid #dddddd; + border-bottom: none; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + background-color: #5396C1; + color: #ffffff; + } + + QTabWidget::tab-bar { + top: -3px; + left: 10px; + } + + QTabBar::tab:focus { + outline: none; + } + + QTabBar::tab:selected { + background-color: #6bb1e0; + color: #ffffff; + box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); + } + + QRadioButton::indicator { + width: 25px; + height: 25px; + } + + QSpinBox::down-button { + width: 23px; /* 图标显示宽度 */ + height: 23px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; + } + + QSpinBox::down-arrow { + image: url(:/image/down_white.png); + height: 15px; + width: 15px; + } + + QSpinBox::up-button { + width: 23px; /* 图标显示宽度 */ + height: 23px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; + } + + QSpinBox::up-arrow { + image: url(:/image/up_white.png); + height: 15px; + width: 15px; + } + + QSpinBox { + border: 1px solid #333333; + } + + QCheckBox { + color: #000000; + } + + QCheckBox::indicator { + width: 15px; + height: 15px; + border: 1px solid #96A0A9; + border-radius: 8px; + background-color: #ffffff; + } + + QCheckBox::indicator:checked { + background-color: #95B2D4; + border-color: #95B2D4; + } + + + + + 369 + 122 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + + + + 9999999 + + + 9999 + + + + + + 475 + 122 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + Qt::LeftToRight + + + 重复数: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 581 + 122 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + 1 + + + 65535 + + + + + + 157 + 179 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + -49999999 + + + 49999999 + + + 1 + + + + + true + + + + 475 + 179 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + + -1 + + + + Qt::LeftToRight + + + + + + Qt::AlignCenter + + + + + + 51 + 122 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + Qt::LeftToRight + + + 起始值: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 157 + 122 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + 999999 + + + 1 + + + + + + 263 + 122 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + Qt::LeftToRight + + + 结束值: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + false + + + + 369 + 179 + 100 + 50 + + + + + 0 + 0 + + + + + 100 + 50 + + + + + 100 + 50 + + + + 0 + + + 999999999 + + + 1 + + + + + + 270 + 179 + 100 + 50 + + + + + 100 + 50 + + + + + 100 + 50 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 100 + 50 + + + + QRadioButton::indicator { +width: 25px; +height: 25px; +} + + + 当前值: + + + + + + + + + 56 + 179 + 100 + 50 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 100 + 50 + + + + QRadioButton::indicator { +width: 25px; +height: 25px; +} + + + 增量值: + + + + + + + + + 70 + 60 + 81 + 31 + + + + 计数器ID: + + + + + + 160 + 60 + 121 + 31 + + + + + 计数器1 + + + + + 计数器2 + + + + + + + 370 + 60 + 91 + 31 + + + + 计数器位数: + + + + + + 470 + 60 + 101 + 31 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + + + diff --git a/scene/DateFormatEditor.cpp b/scene/DateFormatEditor.cpp index 60d44f4..77c707d 100644 --- a/scene/DateFormatEditor.cpp +++ b/scene/DateFormatEditor.cpp @@ -1,105 +1,105 @@ -#include "DateFormatEditor.h" -#include "ui_DateFormatEditor.h" - -DateFormatEditor::DateFormatEditor(QWidget *parent) : - QWidget(parent), - ui(new Ui::DateFormatEditor) -{ - ui->setupUi(this); - - connect(ui->btnPoint,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnColon,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnComma,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnSlash,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnSemicolon,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnUnderline,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnDash,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnBackSpace,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnHour,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnMinute,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnSecond,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnDay,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnMonth,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnYear4,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnYear2,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnWeekOfYear,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnWeek,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); - connect(ui->btnSpace, &QPushButton::clicked, this, &DateFormatEditor::buttonClickedSlot); - - setViewModel(m_vm); -} - -DateFormatEditor::~DateFormatEditor() -{ - delete ui; -} - -void DateFormatEditor::setViewModel(DateFormatEditorVM vm) -{ - m_vm = std::move(vm); - - auto b = ui->lineEdit_DateFormat->blockSignals(true); - ui->lineEdit_DateFormat->setText(m_vm.pattern); - ui->lineEdit_DateFormat->blockSignals(b); - - b = ui->expirationNumCBox->blockSignals(true); - ui->expirationNumCBox->setValue(m_vm.expirationValue); - ui->expirationNumCBox->blockSignals(b); - - b = ui->expirationCBox->blockSignals(true); - ui->expirationCBox->setCurrentIndex(m_vm.expirationType); - ui->expirationCBox->blockSignals(b); -} - -DateFormatEditorVM DateFormatEditor::viewModel() -{ - m_vm.pattern = ui->lineEdit_DateFormat->text(); - m_vm.expirationValue = ui->expirationNumCBox->value(); - m_vm.expirationType = (EXPIRATION_TYPE)(ui->expirationCBox->currentIndex()); - return m_vm; -} - -void DateFormatEditor::buttonClickedSlot() -{ - QPushButton* btn = qobject_cast(sender()); - - if(btn == ui->btnPoint){ - ui->lineEdit_DateFormat->insert("."); - }else if(btn == ui->btnColon){ - ui->lineEdit_DateFormat->insert(":"); - }else if(btn == ui->btnComma){ - ui->lineEdit_DateFormat->insert(","); - }else if(btn == ui->btnSlash){ - ui->lineEdit_DateFormat->insert("/"); - }else if(btn == ui->btnSemicolon){ - ui->lineEdit_DateFormat->insert(";"); - }else if(btn == ui->btnUnderline){ - ui->lineEdit_DateFormat->insert("_"); - }else if(btn == ui->btnDash){ - ui->lineEdit_DateFormat->insert("-"); - }else if(btn == ui->btnBackSpace){ - ui->lineEdit_DateFormat->backspace(); - }else if(btn == ui->btnHour){ - ui->lineEdit_DateFormat->insert("HH"); - }else if(btn == ui->btnMinute){ - ui->lineEdit_DateFormat->insert("mm"); - }else if(btn == ui->btnSecond){ - ui->lineEdit_DateFormat->insert("ss"); - }else if(btn == ui->btnDay){ - ui->lineEdit_DateFormat->insert("dd"); - }else if(btn == ui->btnMonth){ - ui->lineEdit_DateFormat->insert("MM"); - }else if(btn == ui->btnYear4){ - ui->lineEdit_DateFormat->insert("yyyy"); - }else if(btn == ui->btnYear2){ - ui->lineEdit_DateFormat->insert("YY"); - } - else if(btn == ui->btnWeekOfYear){ - ui->lineEdit_DateFormat->insert("c"); - } - else if(btn == ui->btnWeek){ - ui->lineEdit_DateFormat->insert("w"); - } - else if(btn == ui->btnSpace) - ui->lineEdit_DateFormat->insert(" "); +#include "DateFormatEditor.h" +#include "ui_DateFormatEditor.h" + +DateFormatEditor::DateFormatEditor(QWidget *parent) : + QWidget(parent), + ui(new Ui::DateFormatEditor) +{ + ui->setupUi(this); + + connect(ui->btnPoint,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnColon,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnComma,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnSlash,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnSemicolon,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnUnderline,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnDash,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnBackSpace,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnHour,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnMinute,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnSecond,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnDay,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnMonth,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnYear4,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnYear2,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnWeekOfYear,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnWeek,&QPushButton::clicked,this,&DateFormatEditor::buttonClickedSlot); + connect(ui->btnSpace, &QPushButton::clicked, this, &DateFormatEditor::buttonClickedSlot); + + setViewModel(m_vm); +} + +DateFormatEditor::~DateFormatEditor() +{ + delete ui; +} + +void DateFormatEditor::setViewModel(DateFormatEditorVM vm) +{ + m_vm = std::move(vm); + + auto b = ui->lineEdit_DateFormat->blockSignals(true); + ui->lineEdit_DateFormat->setText(m_vm.pattern); + ui->lineEdit_DateFormat->blockSignals(b); + + b = ui->expirationNumCBox->blockSignals(true); + ui->expirationNumCBox->setValue(m_vm.expirationValue); + ui->expirationNumCBox->blockSignals(b); + + b = ui->expirationCBox->blockSignals(true); + ui->expirationCBox->setCurrentIndex(m_vm.expirationType); + ui->expirationCBox->blockSignals(b); +} + +DateFormatEditorVM DateFormatEditor::viewModel() +{ + m_vm.pattern = ui->lineEdit_DateFormat->text(); + m_vm.expirationValue = ui->expirationNumCBox->value(); + m_vm.expirationType = (EXPIRATION_TYPE)(ui->expirationCBox->currentIndex()); + return m_vm; +} + +void DateFormatEditor::buttonClickedSlot() +{ + QPushButton* btn = qobject_cast(sender()); + + if(btn == ui->btnPoint){ + ui->lineEdit_DateFormat->insert("."); + }else if(btn == ui->btnColon){ + ui->lineEdit_DateFormat->insert(":"); + }else if(btn == ui->btnComma){ + ui->lineEdit_DateFormat->insert(","); + }else if(btn == ui->btnSlash){ + ui->lineEdit_DateFormat->insert("/"); + }else if(btn == ui->btnSemicolon){ + ui->lineEdit_DateFormat->insert(";"); + }else if(btn == ui->btnUnderline){ + ui->lineEdit_DateFormat->insert("_"); + }else if(btn == ui->btnDash){ + ui->lineEdit_DateFormat->insert("-"); + }else if(btn == ui->btnBackSpace){ + ui->lineEdit_DateFormat->backspace(); + }else if(btn == ui->btnHour){ + ui->lineEdit_DateFormat->insert("HH"); + }else if(btn == ui->btnMinute){ + ui->lineEdit_DateFormat->insert("mm"); + }else if(btn == ui->btnSecond){ + ui->lineEdit_DateFormat->insert("ss"); + }else if(btn == ui->btnDay){ + ui->lineEdit_DateFormat->insert("dd"); + }else if(btn == ui->btnMonth){ + ui->lineEdit_DateFormat->insert("MM"); + }else if(btn == ui->btnYear4){ + ui->lineEdit_DateFormat->insert("yyyy"); + }else if(btn == ui->btnYear2){ + ui->lineEdit_DateFormat->insert("YY"); + } + else if(btn == ui->btnWeekOfYear){ + ui->lineEdit_DateFormat->insert("c"); + } + else if(btn == ui->btnWeek){ + ui->lineEdit_DateFormat->insert("w"); + } + else if(btn == ui->btnSpace) + ui->lineEdit_DateFormat->insert(" "); } \ No newline at end of file diff --git a/scene/DateFormatEditor.h b/scene/DateFormatEditor.h index 038a3ab..9f311ea 100644 --- a/scene/DateFormatEditor.h +++ b/scene/DateFormatEditor.h @@ -1,46 +1,46 @@ -#ifndef DATEFORMATEDITOR_H -#define DATEFORMATEDITOR_H - -#include -#include "ViewModels.h" - -namespace Ui { -class DateFormatEditor; -} - -enum EXPIRATION_TYPE { - EXPIRATION_TYPE_NONE = -1, - EXPIRATION_TYPE_DAY, - EXPIRATION_TYPE_MONTH, - EXPIRATION_TYPE_RESERVED, -}; - -struct DateFormatEditorVM { - QString pattern; - int expirationValue = 0; - EXPIRATION_TYPE expirationType = EXPIRATION_TYPE_NONE; -}; - -class DateFormatEditor : public QWidget -{ - Q_OBJECT - -public: - explicit DateFormatEditor(QWidget *parent = nullptr); - ~DateFormatEditor(); - - void setViewModel(DateFormatEditorVM vm); - - DateFormatEditorVM viewModel(); - -private slots: - void buttonClickedSlot(); - -private: - Ui::DateFormatEditor *ui; - - DateFormatEditorVM m_vm; - -}; - -#endif // DATEFORMATEDITOR_H +#ifndef DATEFORMATEDITOR_H +#define DATEFORMATEDITOR_H + +#include +#include "ViewModels.h" + +namespace Ui { +class DateFormatEditor; +} + +enum EXPIRATION_TYPE { + EXPIRATION_TYPE_NONE = -1, + EXPIRATION_TYPE_DAY, + EXPIRATION_TYPE_MONTH, + EXPIRATION_TYPE_RESERVED, +}; + +struct DateFormatEditorVM { + QString pattern; + int expirationValue = 0; + EXPIRATION_TYPE expirationType = EXPIRATION_TYPE_NONE; +}; + +class DateFormatEditor : public QWidget +{ + Q_OBJECT + +public: + explicit DateFormatEditor(QWidget *parent = nullptr); + ~DateFormatEditor(); + + void setViewModel(DateFormatEditorVM vm); + + DateFormatEditorVM viewModel(); + +private slots: + void buttonClickedSlot(); + +private: + Ui::DateFormatEditor *ui; + + DateFormatEditorVM m_vm; + +}; + +#endif // DATEFORMATEDITOR_H diff --git a/scene/DateFormatEditor.ui b/scene/DateFormatEditor.ui index b17721d..f232f45 100644 --- a/scene/DateFormatEditor.ui +++ b/scene/DateFormatEditor.ui @@ -1,443 +1,443 @@ - - - DateFormatEditor - - - - 0 - 0 - 764 - 361 - - - - Form - - - QWidget{ - font-size: 16px; -} - - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - -QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ -} - -/* 下拉箭头区域 */ -QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; -} - -/* 下拉箭头图标 */ -QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ -} - -/* 悬停状态 */ -QComboBox:hover { - background-color: #efefef; -} - -// 下拉框 -QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; -} - - - - - 0 - 0 - 761 - 361 - - - - - - 40 - 30 - 67 - 17 - - - - 内容 - - - - - true - - - - 60 - 50 - 371 - 30 - - - - Qt::StrongFocus - - - - - - 470 - 26 - 111 - 21 - - - - 有效期限 - - - - - - 510 - 50 - 231 - 30 - - - - - - - - 天数 - - - - - 月 - 精确到日 - - - - - 月 - 精确到月 - - - - - - - 20 - 100 - 45 - 35 - - - - . - - - - - - 70 - 100 - 45 - 35 - - - - : - - - - - - 120 - 100 - 45 - 35 - - - - , - - - - - - 170 - 100 - 45 - 35 - - - - / - - - - - - 220 - 100 - 45 - 35 - - - - ; - - - - - - 270 - 100 - 45 - 35 - - - - _ - - - - - - 320 - 100 - 45 - 35 - - - - - - - - - - - 20 - 150 - 95 - 35 - - - - Qt::StrongFocus - - - 小时 - - - - - - 150 - 150 - 95 - 35 - - - - 分钟 - - - - - - 270 - 150 - 95 - 35 - - - - 秒钟 - - - - - - 150 - 200 - 95 - 35 - - - - 月 - - - - - - 270 - 200 - 95 - 35 - - - - 年2026 - - - - - - 20 - 200 - 95 - 35 - - - - 日 - - - - - - 20 - 250 - 221 - 35 - - - - 年中第几周 - - - - - - 270 - 250 - 95 - 35 - - - - 年26 - - - - - - 20 - 300 - 141 - 35 - - - - 周几 - - - - - - 210 - 300 - 155 - 35 - - - - 空格 - - - - - - 370 - 100 - 81 - 35 - - - - <------ - - - - - - 540 - 100 - 111 - 31 - - - - QAbstractSpinBox::NoButtons - - - 9999 - - - - - - 660 - 100 - 31 - 31 - - - - - - - - - - - 700 - 100 - 31 - 31 - - - - + - - - - - - - + + + DateFormatEditor + + + + 0 + 0 + 764 + 361 + + + + Form + + + QWidget{ + font-size: 16px; +} + + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + +QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ +} + +/* 下拉箭头区域 */ +QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; +} + +/* 下拉箭头图标 */ +QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ +} + +/* 悬停状态 */ +QComboBox:hover { + background-color: #efefef; +} + +// 下拉框 +QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; +} + + + + + 0 + 0 + 761 + 361 + + + + + + 40 + 30 + 67 + 17 + + + + 内容 + + + + + true + + + + 60 + 50 + 371 + 30 + + + + Qt::StrongFocus + + + + + + 470 + 26 + 111 + 21 + + + + 有效期限 + + + + + + 510 + 50 + 231 + 30 + + + + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + + + 20 + 100 + 45 + 35 + + + + . + + + + + + 70 + 100 + 45 + 35 + + + + : + + + + + + 120 + 100 + 45 + 35 + + + + , + + + + + + 170 + 100 + 45 + 35 + + + + / + + + + + + 220 + 100 + 45 + 35 + + + + ; + + + + + + 270 + 100 + 45 + 35 + + + + _ + + + + + + 320 + 100 + 45 + 35 + + + + - + + + + + + 20 + 150 + 95 + 35 + + + + Qt::StrongFocus + + + 小时 + + + + + + 150 + 150 + 95 + 35 + + + + 分钟 + + + + + + 270 + 150 + 95 + 35 + + + + 秒钟 + + + + + + 150 + 200 + 95 + 35 + + + + 月 + + + + + + 270 + 200 + 95 + 35 + + + + 年2026 + + + + + + 20 + 200 + 95 + 35 + + + + 日 + + + + + + 20 + 250 + 221 + 35 + + + + 年中第几周 + + + + + + 270 + 250 + 95 + 35 + + + + 年26 + + + + + + 20 + 300 + 141 + 35 + + + + 周几 + + + + + + 210 + 300 + 155 + 35 + + + + 空格 + + + + + + 370 + 100 + 81 + 35 + + + + <------ + + + + + + 540 + 100 + 111 + 31 + + + + QAbstractSpinBox::NoButtons + + + 9999 + + + + + + 660 + 100 + 31 + 31 + + + + - + + + + + + 700 + 100 + 31 + 31 + + + + + + + + + + + + diff --git a/scene/DateReplaceEditor.cpp b/scene/DateReplaceEditor.cpp index e0ba9a8..3c62784 100644 --- a/scene/DateReplaceEditor.cpp +++ b/scene/DateReplaceEditor.cpp @@ -1,603 +1,603 @@ -#include "DateReplaceEditor.h" -#include "ui_DateReplaceEditor.h" - -#include -#include -#include -#include - -extern unsigned char vartypeR; -extern QMap> replaceValueMap; - -DateReplaceEditor::DateReplaceEditor(QWidget *parent) : - QWidget(parent), - ui(new Ui::DateReplaceEditor) -{ - ui->setupUi(this); - - init(); - initReplaceValue(); - applyStyleSheet(); -} - -DateReplaceEditor::~DateReplaceEditor() -{ - delete ui; -} - -DateItemModel DateReplaceEditor::dateModel() -{ - DateItemModel model; - model.dataMap = dataList; - model.weeksMap = weekList; - model.hoursMap = hourList; - model.monthsMap = monthList; - model.daysMap = dayList; - for (int i = 0; i < yearInitList.size() && i < yearList.size(); ++i) { - model.yearsMap[yearInitList[i]] = yearList[i]; - } - - return model; -} - -void DateReplaceEditor::setDateModel(const DateItemModel &model) -{ - dataList = model.dataMap; - weekList = model.weeksMap; - hourList = model.hoursMap; - monthList = model.monthsMap; - dayList = model.daysMap; - - yearInitList = model.yearsMap.keys(); - yearList = model.yearsMap.values(); - - switch (ui->cb_replaceType->currentIndex()) { - case 0: - loadDataShow(); - break; - case 1: - loadWeekShow(); - break; - case 2: - loadMonthShow(); - break; - case 3: - loadYearShow(); - break; - case 4: - loadDayShow(); - break; - case 5: - loadHourShow(); - break; - default: - loadMonthShow(); - break; - } -} - -void DateReplaceEditor::applyStyleSheet() -{ - QString styleSheet = R"( - QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - - QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ - } - - /* 下拉箭头区域 */ - QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; - } - - /* 下拉箭头图标 */ - QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - } - - /* 悬停状态 */ - QComboBox:hover { - background-color: #efefef; - } - - // 下拉框 - QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; - } - - )"; - - setStyleSheet(styleSheet); -} - -void DateReplaceEditor::init() -{ - connect(ui->lineEdit_Replace1, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 0, std::placeholders::_1)); - connect(ui->lineEdit_Replace2, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 1, std::placeholders::_1)); - connect(ui->lineEdit_Replace3, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 2, std::placeholders::_1)); - connect(ui->lineEdit_Replace4, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 3, std::placeholders::_1)); -} - -void DateReplaceEditor::initReplaceValue() -{ - monthList.clear(); - for (int i = 1; i <= 12; ++i) { - monthList.append(QString("%1").arg(i, 2, 10, QChar('0'))); - } - - dataList.clear(); - dataList << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" - << "8" << "9" << "A" << "B" << "C" << "D" << "E" << "F"; - - weekList.clear(); - weekList << "MON" << "TUE" << "WED" << "THU" << "FRI" << "SAT" << "SUN"; - - yearList.clear(); - yearInitList.clear(); - int startYear = QDate::currentDate().year(); - for (int i = 0; i < 16; ++i) { - yearList << QString::number(startYear + i); - yearInitList << startYear + i; - } - - dayList.clear(); - for (int i = 1; i <= 31; ++i) { - dayList.append(QString("%1").arg(i, 2, 10, QChar('0'))); - } - - hourList.clear(); - for (int i = 0; i <= 23; ++i) { - hourList.append(QString("%1").arg(i, 2, 10, QChar('0'))); - } - - currPage = 0; - - if(ui->cb_replaceType->currentIndex() == 2) - loadMonthShow(); - else if(ui->cb_replaceType->currentIndex() == 0) - loadDataShow(); - else if(ui->cb_replaceType->currentIndex() == 1) - loadWeekShow(); - else if(ui->cb_replaceType->currentIndex() == 3) - loadYearShow(); - else if(ui->cb_replaceType->currentIndex() == 4) - loadDayShow(); - else if(ui->cb_replaceType->currentIndex() == 5) - loadHourShow(); -} - -void DateReplaceEditor::on_cb_replaceType_currentIndexChanged(int index) -{ - currPage = 0; - initShowLineEdit(); - - if(index == 0){ - loadDataShow(); - }else if(index == 1){ - loadWeekShow(); - }else if(index == 2){ - loadMonthShow(); - }else if(index == 3){ - loadYearShow(); - }else if(index == 4){ - loadDayShow(); - }else if(index == 5){ - loadHourShow(); - } -} - -void DateReplaceEditor::loadMonthShow() -{ - initShowLineEdit(); - if(currPage > 2) - currPage = 2; - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); - if(lineEdit) - lineEdit->setText(QString::number(i+1)); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(monthList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} - -void DateReplaceEditor::loadDataShow() -{ - initShowLineEdit(); - if(currPage > 3) - currPage = 3; - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); - if(lineEdit) - lineEdit->setText(QString::number(i)); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(dataList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} - -void DateReplaceEditor::loadWeekShow() -{ - initShowLineEdit(); - if(currPage > 1) - currPage = 1; - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); - if(lineEdit) - lineEdit->setText(QString::number(i+1)); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(weekList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} - -void DateReplaceEditor::loadYearShow() -{ - initShowLineEdit(); - if(currPage > 3) - currPage = 3; - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); - if(lineEdit && isetText(QString::number(yearInitList.at(i))); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(yearList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} - -void DateReplaceEditor::loadDayShow() -{ - initShowLineEdit(); - if(currPage > 7) - currPage = 7; - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); - if(lineEdit) - lineEdit->setText(QString::number(i+1)); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(dayList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} - -void DateReplaceEditor::loadHourShow() -{ - initShowLineEdit(); - if(currPage > 5) - currPage = 5; - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); - if(lineEdit) - lineEdit->setText(QString::number(i)); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(hourList.at(i)); - lineEdit2->blockSignals(b); - } - objectIndex++; - } -} - -void DateReplaceEditor::getMonthValue() -{ - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); - if(lineEdit2) - monthList[i] = lineEdit2->text(); - objectIndex++; - } -} - -void DateReplaceEditor::getYearValue() -{ - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); - if(lineEdit2) - yearList[i] = lineEdit2->text(); - objectIndex++; - } -} - -void DateReplaceEditor::getDayValue() -{ - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); - if(lineEdit2) - dayList[i] = lineEdit2->text(); - objectIndex++; - } -} - -void DateReplaceEditor::getHourValue() -{ - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); - if(lineEdit2) - hourList[i] = lineEdit2->text(); - objectIndex++; - } -} - -void DateReplaceEditor::getWeekValue() -{ - int objectIndex = 1; - for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); - if(lineEdit2) - weekList[i] = lineEdit2->text(); - objectIndex++; - } -} - -void DateReplaceEditor::on_btnUP_clicked() -{ - if(currPage < 1) - return; - currPage = currPage - 1; - - if(ui->cb_replaceType->currentIndex() == 2){ - loadMonthShow(); - }else if(ui->cb_replaceType->currentIndex() == 0){ - loadDataShow(); - }else if(ui->cb_replaceType->currentIndex() == 1){ - loadWeekShow(); - }else if(ui->cb_replaceType->currentIndex() == 3){ - loadYearShow(); - }else if(ui->cb_replaceType->currentIndex() == 4){ - loadDayShow(); - }else if(ui->cb_replaceType->currentIndex() == 5){ - loadHourShow(); - } -} - -void DateReplaceEditor::on_btnDown_clicked() -{ - initShowLineEdit(); - - int currentIndex = ui->cb_replaceType->currentIndex(); - if (currentIndex == 2) { - if (currPage < 2) { - currPage++; - } - loadMonthShow(); - return; - } - - if (currentIndex == 0) { - if (currPage < 3) { - currPage++; - } - loadDataShow(); - return; - } - - if(currentIndex == 1){ - if(currPage < 1){ - currPage++; - } - loadWeekShow(); - return; - } - - if(currentIndex == 3){ - if(currPage < 3){ - currPage++; - } - loadYearShow(); - return; - } - - if(currentIndex == 4){ - if(currPage < 7){ - currPage++; - } - loadDayShow(); - return; - } - - if(currentIndex == 5){ - if(currPage < 5){ - currPage++; - } - loadHourShow(); - return; - } -} - -void DateReplaceEditor::initShowLineEdit() -{ - for(int i=1;i<=4;i++){ - QString strObject = QString("lineEditName") + QString::number(i); - QLineEdit *lineEdit = this->findChild(strObject); - if(lineEdit) - lineEdit->setText(""); - - QString strObject2 = QString("lineEdit_Replace") + QString::number(i); - QLineEdit *lineEdit2 = this->findChild(strObject2); - if(lineEdit2) { - auto b = lineEdit2->blockSignals(true); - lineEdit2->setText(""); - lineEdit2->blockSignals(b); - } - } -} - -void DateReplaceEditor::on_btnPreSetValue_clicked() -{ - if(ui->cb_replaceType->currentIndex() == 2){ - getMonthValue(); - vartypeR = vartypeR | 1<<2; - QMap monthMap; - for(int i=0;icb_replaceType->currentIndex() == 3){ - getYearValue(); - vartypeR = vartypeR | 1<<3; - QMap yearMap; - for(int i=0;icb_replaceType->currentIndex() == 4){ - getDayValue(); - vartypeR = vartypeR | 1<<4; - QMap dayMap; - for(int i=0;icb_replaceType->currentIndex() == 5){ - getHourValue(); - vartypeR = vartypeR | 1<<5; - QMap hourMap; - for(int i=0;icb_replaceType->currentIndex() == 1){ - getWeekValue(); - vartypeR = vartypeR | 1<<1; - QMap weekMap; - for(int i=0;icb_replaceType->currentIndex()) { - case 0: - if (mapIdx < dataList.size()) dataList[mapIdx] = txt; - break; - case 1: - if (mapIdx < weekList.size()) weekList[mapIdx] = txt; - break; - case 2: - if (mapIdx < monthList.size()) monthList[mapIdx] = txt; - break; - case 3: - if (mapIdx < yearList.size()) yearList[mapIdx] = txt; - break; - case 4: - if (mapIdx < dayList.size()) dayList[mapIdx] = txt; - break; - case 5: - if (mapIdx < hourList.size()) hourList[mapIdx] = txt; - break; - default: - break; - } -} +#include "DateReplaceEditor.h" +#include "ui_DateReplaceEditor.h" + +#include +#include +#include +#include + +extern unsigned char vartypeR; +extern QMap> replaceValueMap; + +DateReplaceEditor::DateReplaceEditor(QWidget *parent) : + QWidget(parent), + ui(new Ui::DateReplaceEditor) +{ + ui->setupUi(this); + + init(); + initReplaceValue(); + applyStyleSheet(); +} + +DateReplaceEditor::~DateReplaceEditor() +{ + delete ui; +} + +DateItemModel DateReplaceEditor::dateModel() +{ + DateItemModel model; + model.dataMap = dataList; + model.weeksMap = weekList; + model.hoursMap = hourList; + model.monthsMap = monthList; + model.daysMap = dayList; + for (int i = 0; i < yearInitList.size() && i < yearList.size(); ++i) { + model.yearsMap[yearInitList[i]] = yearList[i]; + } + + return model; +} + +void DateReplaceEditor::setDateModel(const DateItemModel &model) +{ + dataList = model.dataMap; + weekList = model.weeksMap; + hourList = model.hoursMap; + monthList = model.monthsMap; + dayList = model.daysMap; + + yearInitList = model.yearsMap.keys(); + yearList = model.yearsMap.values(); + + switch (ui->cb_replaceType->currentIndex()) { + case 0: + loadDataShow(); + break; + case 1: + loadWeekShow(); + break; + case 2: + loadMonthShow(); + break; + case 3: + loadYearShow(); + break; + case 4: + loadDayShow(); + break; + case 5: + loadHourShow(); + break; + default: + loadMonthShow(); + break; + } +} + +void DateReplaceEditor::applyStyleSheet() +{ + QString styleSheet = R"( + QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + + QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ + } + + /* 下拉箭头区域 */ + QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; + } + + /* 下拉箭头图标 */ + QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + } + + /* 悬停状态 */ + QComboBox:hover { + background-color: #efefef; + } + + // 下拉框 + QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; + } + + )"; + + setStyleSheet(styleSheet); +} + +void DateReplaceEditor::init() +{ + connect(ui->lineEdit_Replace1, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 0, std::placeholders::_1)); + connect(ui->lineEdit_Replace2, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 1, std::placeholders::_1)); + connect(ui->lineEdit_Replace3, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 2, std::placeholders::_1)); + connect(ui->lineEdit_Replace4, &QLineEdit::textChanged, std::bind(&DateReplaceEditor::onLineEditReplaceChanged, this, 3, std::placeholders::_1)); +} + +void DateReplaceEditor::initReplaceValue() +{ + monthList.clear(); + for (int i = 1; i <= 12; ++i) { + monthList.append(QString("%1").arg(i, 2, 10, QChar('0'))); + } + + dataList.clear(); + dataList << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" + << "8" << "9" << "A" << "B" << "C" << "D" << "E" << "F"; + + weekList.clear(); + weekList << "MON" << "TUE" << "WED" << "THU" << "FRI" << "SAT" << "SUN"; + + yearList.clear(); + yearInitList.clear(); + int startYear = QDate::currentDate().year(); + for (int i = 0; i < 16; ++i) { + yearList << QString::number(startYear + i); + yearInitList << startYear + i; + } + + dayList.clear(); + for (int i = 1; i <= 31; ++i) { + dayList.append(QString("%1").arg(i, 2, 10, QChar('0'))); + } + + hourList.clear(); + for (int i = 0; i <= 23; ++i) { + hourList.append(QString("%1").arg(i, 2, 10, QChar('0'))); + } + + currPage = 0; + + if(ui->cb_replaceType->currentIndex() == 2) + loadMonthShow(); + else if(ui->cb_replaceType->currentIndex() == 0) + loadDataShow(); + else if(ui->cb_replaceType->currentIndex() == 1) + loadWeekShow(); + else if(ui->cb_replaceType->currentIndex() == 3) + loadYearShow(); + else if(ui->cb_replaceType->currentIndex() == 4) + loadDayShow(); + else if(ui->cb_replaceType->currentIndex() == 5) + loadHourShow(); +} + +void DateReplaceEditor::on_cb_replaceType_currentIndexChanged(int index) +{ + currPage = 0; + initShowLineEdit(); + + if(index == 0){ + loadDataShow(); + }else if(index == 1){ + loadWeekShow(); + }else if(index == 2){ + loadMonthShow(); + }else if(index == 3){ + loadYearShow(); + }else if(index == 4){ + loadDayShow(); + }else if(index == 5){ + loadHourShow(); + } +} + +void DateReplaceEditor::loadMonthShow() +{ + initShowLineEdit(); + if(currPage > 2) + currPage = 2; + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); + if(lineEdit) + lineEdit->setText(QString::number(i+1)); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(monthList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} + +void DateReplaceEditor::loadDataShow() +{ + initShowLineEdit(); + if(currPage > 3) + currPage = 3; + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); + if(lineEdit) + lineEdit->setText(QString::number(i)); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(dataList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} + +void DateReplaceEditor::loadWeekShow() +{ + initShowLineEdit(); + if(currPage > 1) + currPage = 1; + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); + if(lineEdit) + lineEdit->setText(QString::number(i+1)); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(weekList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} + +void DateReplaceEditor::loadYearShow() +{ + initShowLineEdit(); + if(currPage > 3) + currPage = 3; + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); + if(lineEdit && isetText(QString::number(yearInitList.at(i))); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(yearList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} + +void DateReplaceEditor::loadDayShow() +{ + initShowLineEdit(); + if(currPage > 7) + currPage = 7; + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); + if(lineEdit) + lineEdit->setText(QString::number(i+1)); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(dayList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} + +void DateReplaceEditor::loadHourShow() +{ + initShowLineEdit(); + if(currPage > 5) + currPage = 5; + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject); + if(lineEdit) + lineEdit->setText(QString::number(i)); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(objectIndex); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(hourList.at(i)); + lineEdit2->blockSignals(b); + } + objectIndex++; + } +} + +void DateReplaceEditor::getMonthValue() +{ + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); + if(lineEdit2) + monthList[i] = lineEdit2->text(); + objectIndex++; + } +} + +void DateReplaceEditor::getYearValue() +{ + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); + if(lineEdit2) + yearList[i] = lineEdit2->text(); + objectIndex++; + } +} + +void DateReplaceEditor::getDayValue() +{ + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); + if(lineEdit2) + dayList[i] = lineEdit2->text(); + objectIndex++; + } +} + +void DateReplaceEditor::getHourValue() +{ + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); + if(lineEdit2) + hourList[i] = lineEdit2->text(); + objectIndex++; + } +} + +void DateReplaceEditor::getWeekValue() +{ + int objectIndex = 1; + for(int i=currPage*4;(i<(currPage+1)*4)&&(ifindChild(strObject2); + if(lineEdit2) + weekList[i] = lineEdit2->text(); + objectIndex++; + } +} + +void DateReplaceEditor::on_btnUP_clicked() +{ + if(currPage < 1) + return; + currPage = currPage - 1; + + if(ui->cb_replaceType->currentIndex() == 2){ + loadMonthShow(); + }else if(ui->cb_replaceType->currentIndex() == 0){ + loadDataShow(); + }else if(ui->cb_replaceType->currentIndex() == 1){ + loadWeekShow(); + }else if(ui->cb_replaceType->currentIndex() == 3){ + loadYearShow(); + }else if(ui->cb_replaceType->currentIndex() == 4){ + loadDayShow(); + }else if(ui->cb_replaceType->currentIndex() == 5){ + loadHourShow(); + } +} + +void DateReplaceEditor::on_btnDown_clicked() +{ + initShowLineEdit(); + + int currentIndex = ui->cb_replaceType->currentIndex(); + if (currentIndex == 2) { + if (currPage < 2) { + currPage++; + } + loadMonthShow(); + return; + } + + if (currentIndex == 0) { + if (currPage < 3) { + currPage++; + } + loadDataShow(); + return; + } + + if(currentIndex == 1){ + if(currPage < 1){ + currPage++; + } + loadWeekShow(); + return; + } + + if(currentIndex == 3){ + if(currPage < 3){ + currPage++; + } + loadYearShow(); + return; + } + + if(currentIndex == 4){ + if(currPage < 7){ + currPage++; + } + loadDayShow(); + return; + } + + if(currentIndex == 5){ + if(currPage < 5){ + currPage++; + } + loadHourShow(); + return; + } +} + +void DateReplaceEditor::initShowLineEdit() +{ + for(int i=1;i<=4;i++){ + QString strObject = QString("lineEditName") + QString::number(i); + QLineEdit *lineEdit = this->findChild(strObject); + if(lineEdit) + lineEdit->setText(""); + + QString strObject2 = QString("lineEdit_Replace") + QString::number(i); + QLineEdit *lineEdit2 = this->findChild(strObject2); + if(lineEdit2) { + auto b = lineEdit2->blockSignals(true); + lineEdit2->setText(""); + lineEdit2->blockSignals(b); + } + } +} + +void DateReplaceEditor::on_btnPreSetValue_clicked() +{ + if(ui->cb_replaceType->currentIndex() == 2){ + getMonthValue(); + vartypeR = vartypeR | 1<<2; + QMap monthMap; + for(int i=0;icb_replaceType->currentIndex() == 3){ + getYearValue(); + vartypeR = vartypeR | 1<<3; + QMap yearMap; + for(int i=0;icb_replaceType->currentIndex() == 4){ + getDayValue(); + vartypeR = vartypeR | 1<<4; + QMap dayMap; + for(int i=0;icb_replaceType->currentIndex() == 5){ + getHourValue(); + vartypeR = vartypeR | 1<<5; + QMap hourMap; + for(int i=0;icb_replaceType->currentIndex() == 1){ + getWeekValue(); + vartypeR = vartypeR | 1<<1; + QMap weekMap; + for(int i=0;icb_replaceType->currentIndex()) { + case 0: + if (mapIdx < dataList.size()) dataList[mapIdx] = txt; + break; + case 1: + if (mapIdx < weekList.size()) weekList[mapIdx] = txt; + break; + case 2: + if (mapIdx < monthList.size()) monthList[mapIdx] = txt; + break; + case 3: + if (mapIdx < yearList.size()) yearList[mapIdx] = txt; + break; + case 4: + if (mapIdx < dayList.size()) dayList[mapIdx] = txt; + break; + case 5: + if (mapIdx < hourList.size()) hourList[mapIdx] = txt; + break; + default: + break; + } +} diff --git a/scene/DateReplaceEditor.h b/scene/DateReplaceEditor.h index 4e8429c..e946ad0 100644 --- a/scene/DateReplaceEditor.h +++ b/scene/DateReplaceEditor.h @@ -1,66 +1,66 @@ -#ifndef DATEREPLACEEDITOR_H -#define DATEREPLACEEDITOR_H - -#include -#include -#include - -#include "ViewModels.h" - -class QLineEdit; - -namespace Ui { -class DateReplaceEditor; -} - -class DateReplaceEditor : public QWidget -{ - Q_OBJECT - -public: - explicit DateReplaceEditor(QWidget *parent = nullptr); - ~DateReplaceEditor(); - - DateItemModel dateModel(); - void setDateModel(const DateItemModel& model); - - void init(); - void initReplaceValue(); - void initShowLineEdit(); - - void loadMonthShow(); - void loadDataShow(); - void loadWeekShow(); - void loadYearShow(); - void loadDayShow(); - void loadHourShow(); - - void getMonthValue(); - void getYearValue(); - void getHourValue(); - void getWeekValue(); - void getDayValue(); - -private slots: - void on_cb_replaceType_currentIndexChanged(int index); - void on_btnUP_clicked(); - void on_btnDown_clicked(); - void on_btnPreSetValue_clicked(); - void onLineEditReplaceChanged(int i, QString txt); - -private: - void applyStyleSheet(); - - Ui::DateReplaceEditor *ui; - - int currPage = 0; - QStringList monthList; - QStringList dataList; - QStringList weekList; - QStringList yearList; - QList yearInitList; - QStringList dayList; - QStringList hourList; -}; - -#endif // DATEREPLACEEDITOR_H +#ifndef DATEREPLACEEDITOR_H +#define DATEREPLACEEDITOR_H + +#include +#include +#include + +#include "ViewModels.h" + +class QLineEdit; + +namespace Ui { +class DateReplaceEditor; +} + +class DateReplaceEditor : public QWidget +{ + Q_OBJECT + +public: + explicit DateReplaceEditor(QWidget *parent = nullptr); + ~DateReplaceEditor(); + + DateItemModel dateModel(); + void setDateModel(const DateItemModel& model); + + void init(); + void initReplaceValue(); + void initShowLineEdit(); + + void loadMonthShow(); + void loadDataShow(); + void loadWeekShow(); + void loadYearShow(); + void loadDayShow(); + void loadHourShow(); + + void getMonthValue(); + void getYearValue(); + void getHourValue(); + void getWeekValue(); + void getDayValue(); + +private slots: + void on_cb_replaceType_currentIndexChanged(int index); + void on_btnUP_clicked(); + void on_btnDown_clicked(); + void on_btnPreSetValue_clicked(); + void onLineEditReplaceChanged(int i, QString txt); + +private: + void applyStyleSheet(); + + Ui::DateReplaceEditor *ui; + + int currPage = 0; + QStringList monthList; + QStringList dataList; + QStringList weekList; + QStringList yearList; + QList yearInitList; + QStringList dayList; + QStringList hourList; +}; + +#endif // DATEREPLACEEDITOR_H diff --git a/scene/DateReplaceEditor.ui b/scene/DateReplaceEditor.ui index 8ed86f5..21f4444 100644 --- a/scene/DateReplaceEditor.ui +++ b/scene/DateReplaceEditor.ui @@ -1,307 +1,307 @@ - - - DateReplaceEditor - - - - 0 - 0 - 661 - 371 - - - - QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - -QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ -} - -/* 下拉箭头区域 */ -QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; -} - -/* 下拉箭头图标 */ -QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ -} - -/* 悬停状态 */ -QComboBox:hover { - background-color: #efefef; -} - -// 下拉框 -QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; -} - - - - - - 70 - 100 - 67 - 17 - - - - 名称 - - - - - false - - - - 80 - 130 - 113 - 30 - - - - - - false - - - - 80 - 170 - 113 - 30 - - - - - - false - - - - 80 - 210 - 113 - 30 - - - - - - false - - - - 80 - 250 - 113 - 30 - - - - - - - 280 - 20 - 181 - 35 - - - - - 数据 - - - - - 周几 - - - - - 月 - - - - - 年 - - - - - 天数 - - - - - 小时 - - - - - Meridiem - - - - - - - 220 - 30 - 50 - 17 - - - - 类型 - - - - - - 240 - 100 - 51 - 17 - - - - 代替 - - - - - - 250 - 130 - 231 - 30 - - - - - - - 250 - 170 - 231 - 30 - - - - - - - 250 - 250 - 231 - 30 - - - - - - - 250 - 210 - 231 - 30 - - - - - - - 530 - 130 - 61 - 51 - - - - 上 - - - - - - 530 - 210 - 61 - 51 - - - - 下 - - - - - - 80 - 310 - 111 - 41 - - - - 预设值 - - - - - - + + + DateReplaceEditor + + + + 0 + 0 + 661 + 371 + + + + QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + +QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ +} + +/* 下拉箭头区域 */ +QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; +} + +/* 下拉箭头图标 */ +QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ +} + +/* 悬停状态 */ +QComboBox:hover { + background-color: #efefef; +} + +// 下拉框 +QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; +} + + + + + + 70 + 100 + 67 + 17 + + + + 名称 + + + + + false + + + + 80 + 130 + 113 + 30 + + + + + + false + + + + 80 + 170 + 113 + 30 + + + + + + false + + + + 80 + 210 + 113 + 30 + + + + + + false + + + + 80 + 250 + 113 + 30 + + + + + + + 280 + 20 + 181 + 35 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + + + 220 + 30 + 50 + 17 + + + + 类型 + + + + + + 240 + 100 + 51 + 17 + + + + 代替 + + + + + + 250 + 130 + 231 + 30 + + + + + + + 250 + 170 + 231 + 30 + + + + + + + 250 + 250 + 231 + 30 + + + + + + + 250 + 210 + 231 + 30 + + + + + + + 530 + 130 + 61 + 51 + + + + 上 + + + + + + 530 + 210 + 61 + 51 + + + + 下 + + + + + + 80 + 310 + 111 + 41 + + + + 预设值 + + + + + + diff --git a/scene/DlgBarcodeFormat.cpp b/scene/DlgBarcodeFormat.cpp index 175f9c6..8012a2e 100644 --- a/scene/DlgBarcodeFormat.cpp +++ b/scene/DlgBarcodeFormat.cpp @@ -1,51 +1,51 @@ -#include "DlgBarcodeFormat.h" -#include "ui_DlgBarcodeFormat.h" - -DlgBarcodeFormat::DlgBarcodeFormat(QWidget *parent) : - QDialog(parent), - ui(new Ui::DlgBarcodeFormat) -{ - ui->setupUi(this); - - ui->BarCodeType->addItem("BARCODE_128"); - ui->BarCodeType->addItem("BARCODE_93"); - ui->BarCodeType->addItem("BARCODE_ISBN"); - ui->BarCodeType->addItem("BARCODE_EAN"); - ui->BarCodeType->addItem("BARCODE_UPC"); - ui->BarCodeType->addItem("BARCODE_39"); - - ui->BarCodeHeigh->addItem(tr("5点")); - ui->BarCodeHeigh->addItem(tr("7点")); - ui->BarCodeHeigh->addItem(tr("9点")); - ui->BarCodeHeigh->addItem(tr("12点")); - ui->BarCodeHeigh->addItem(tr("16点")); - ui->BarCodeHeigh->addItem(tr("24点")); - - ui->BarCodeHeigh->setCurrentIndex(2); - ui->BarCodeType->setCurrentIndex(0); -} - -DlgBarcodeFormat::~DlgBarcodeFormat() -{ - delete ui; -} - -void DlgBarcodeFormat::setViewModel(DlgBarcodeFormatVM vm) -{ - m_vm = vm; - ui->BarCodeType->setCurrentText(vm.type); - ui->BarCodeHeigh->setCurrentText(tr("%1点").arg(vm.height)); - ui->BarCodeDot->setCurrentText(tr("%1点").arg(vm.width)); - ui->BarCodeScale->setValue(vm.scale); - ui->checkBoxAddText->setChecked(vm.txtVisible); -} - -DlgBarcodeFormatVM DlgBarcodeFormat::viewModel() -{ - m_vm.type = ui->BarCodeType->currentText(); - m_vm.height = ui->BarCodeHeigh->currentText().remove(tr("点")).toInt(); - m_vm.width = ui->BarCodeDot->currentText().remove(tr("点")).toInt(); - m_vm.scale = ui->BarCodeScale->value(); - m_vm.txtVisible = ui->checkBoxAddText->isChecked(); - return m_vm; -} +#include "DlgBarcodeFormat.h" +#include "ui_DlgBarcodeFormat.h" + +DlgBarcodeFormat::DlgBarcodeFormat(QWidget *parent) : + QDialog(parent), + ui(new Ui::DlgBarcodeFormat) +{ + ui->setupUi(this); + + ui->BarCodeType->addItem("BARCODE_128"); + ui->BarCodeType->addItem("BARCODE_93"); + ui->BarCodeType->addItem("BARCODE_ISBN"); + ui->BarCodeType->addItem("BARCODE_EAN"); + ui->BarCodeType->addItem("BARCODE_UPC"); + ui->BarCodeType->addItem("BARCODE_39"); + + ui->BarCodeHeigh->addItem(tr("5点")); + ui->BarCodeHeigh->addItem(tr("7点")); + ui->BarCodeHeigh->addItem(tr("9点")); + ui->BarCodeHeigh->addItem(tr("12点")); + ui->BarCodeHeigh->addItem(tr("16点")); + ui->BarCodeHeigh->addItem(tr("24点")); + + ui->BarCodeHeigh->setCurrentIndex(2); + ui->BarCodeType->setCurrentIndex(0); +} + +DlgBarcodeFormat::~DlgBarcodeFormat() +{ + delete ui; +} + +void DlgBarcodeFormat::setViewModel(DlgBarcodeFormatVM vm) +{ + m_vm = vm; + ui->BarCodeType->setCurrentText(vm.type); + ui->BarCodeHeigh->setCurrentText(tr("%1点").arg(vm.height)); + ui->BarCodeDot->setCurrentText(tr("%1点").arg(vm.width)); + ui->BarCodeScale->setValue(vm.scale); + ui->checkBoxAddText->setChecked(vm.txtVisible); +} + +DlgBarcodeFormatVM DlgBarcodeFormat::viewModel() +{ + m_vm.type = ui->BarCodeType->currentText(); + m_vm.height = ui->BarCodeHeigh->currentText().remove(tr("点")).toInt(); + m_vm.width = ui->BarCodeDot->currentText().remove(tr("点")).toInt(); + m_vm.scale = ui->BarCodeScale->value(); + m_vm.txtVisible = ui->checkBoxAddText->isChecked(); + return m_vm; +} diff --git a/scene/DlgBarcodeFormat.h b/scene/DlgBarcodeFormat.h index 2862fe1..68a21de 100644 --- a/scene/DlgBarcodeFormat.h +++ b/scene/DlgBarcodeFormat.h @@ -1,40 +1,40 @@ -#ifndef DLGBARCODEFORMAT_H -#define DLGBARCODEFORMAT_H - -#include -#include "ViewModels.h" - -namespace Ui { -class DlgBarcodeFormat; -} - -struct DlgBarcodeFormatVM { - QString type = "BARCODE_128"; - int height = 9; - int width = 1; - int scale = 1; - InkType inkType = INK_TYPE_BLACK; - bool txtVisible = false; -}; - -Q_DECLARE_METATYPE(DlgBarcodeFormatVM); - -class DlgBarcodeFormat : public QDialog -{ - Q_OBJECT - -public: - explicit DlgBarcodeFormat(QWidget *parent = nullptr); - ~DlgBarcodeFormat(); - - void setViewModel(DlgBarcodeFormatVM vm); - - DlgBarcodeFormatVM viewModel(); - -private: - Ui::DlgBarcodeFormat *ui; - - DlgBarcodeFormatVM m_vm; -}; - -#endif // DLGBARCODEFORMAT_H +#ifndef DLGBARCODEFORMAT_H +#define DLGBARCODEFORMAT_H + +#include +#include "ViewModels.h" + +namespace Ui { +class DlgBarcodeFormat; +} + +struct DlgBarcodeFormatVM { + QString type = "BARCODE_128"; + int height = 9; + int width = 1; + int scale = 1; + InkType inkType = INK_TYPE_BLACK; + bool txtVisible = false; +}; + +Q_DECLARE_METATYPE(DlgBarcodeFormatVM); + +class DlgBarcodeFormat : public QDialog +{ + Q_OBJECT + +public: + explicit DlgBarcodeFormat(QWidget *parent = nullptr); + ~DlgBarcodeFormat(); + + void setViewModel(DlgBarcodeFormatVM vm); + + DlgBarcodeFormatVM viewModel(); + +private: + Ui::DlgBarcodeFormat *ui; + + DlgBarcodeFormatVM m_vm; +}; + +#endif // DLGBARCODEFORMAT_H diff --git a/scene/DlgBarcodeFormat.ui b/scene/DlgBarcodeFormat.ui index c5b05fd..b8075e0 100644 --- a/scene/DlgBarcodeFormat.ui +++ b/scene/DlgBarcodeFormat.ui @@ -1,390 +1,390 @@ - - - DlgBarcodeFormat - - - - 0 - 0 - 510 - 380 - - - - - 0 - 0 - - - - Dialog - - - QWidget { - font-size: 16px; -} - -QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - -QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ -} - -/* 下拉箭头区域 */ -QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; -} - -/* 下拉箭头图标 */ -QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ -} - -/* 悬停状态 */ -QComboBox:hover { - background-color: #efefef; -} - -// 下拉框 -QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; -} - -QSpinBox::up-button { - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::up-arrow { - image: url(:/image/up_white.png); -} - -QSpinBox::down-button { - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::down-arrow { - image: url(:/image/down_white.png); -} - - - - - - 280 - 150 - 60 - 31 - - - - - 60 - 16777215 - - - - false - - - QAbstractSpinBox::NoButtons - - - false - - - 1 - - - 10 - - - 1 - - - - - - 70 - 120 - 91 - 23 - - - - 条形码高度 - - - - - - 70 - 230 - 111 - 31 - - - - - 1点 - - - - - 2点 - - - - - 3点 - - - - - 4点 - - - - - 5点 - - - - - 6点 - - - - - - - 280 - 230 - 150 - 31 - - - - - 0 - 0 - - - - - 0 - 0 - - - - 增加数字行 - - - - - - 70 - 150 - 111 - 31 - - - - - - - 280 - 70 - 111 - 31 - - - - 1 - - - - 黑墨 - - - - - 白墨 - - - - - - - 70 - 200 - 76 - 23 - - - - 条码宽度 - - - - - - 70 - 40 - 140 - 23 - - - - 条形码类型 - - - - - - 70 - 70 - 161 - 31 - - - - - 0 - 0 - - - - - 140 - 0 - - - - - - - 280 - 40 - 76 - 23 - - - - 墨水类型 - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - 280 - 120 - 129 - 23 - - - - 显示缩放 - - - - - - 370 - 300 - 101 - 50 - - - - ✓ - - - - - BarCodeType - comboBoxInkColor - BarCodeHeigh - BarCodeScale - BarCodeDot - checkBoxAddText - checkBtn - - - - - checkBtn - clicked() - DlgBarcodeFormat - accept() - - - 412 - 323 - - - 417 - 460 - - - - - + + + DlgBarcodeFormat + + + + 0 + 0 + 510 + 380 + + + + + 0 + 0 + + + + Dialog + + + QWidget { + font-size: 16px; +} + +QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + +QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ +} + +/* 下拉箭头区域 */ +QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; +} + +/* 下拉箭头图标 */ +QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ +} + +/* 悬停状态 */ +QComboBox:hover { + background-color: #efefef; +} + +// 下拉框 +QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; +} + +QSpinBox::up-button { + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; +} + +QSpinBox::up-arrow { + image: url(:/image/up_white.png); +} + +QSpinBox::down-button { + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; +} + +QSpinBox::down-arrow { + image: url(:/image/down_white.png); +} + + + + + + 280 + 150 + 60 + 31 + + + + + 60 + 16777215 + + + + false + + + QAbstractSpinBox::NoButtons + + + false + + + 1 + + + 10 + + + 1 + + + + + + 70 + 120 + 91 + 23 + + + + 条形码高度 + + + + + + 70 + 230 + 111 + 31 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + 5点 + + + + + 6点 + + + + + + + 280 + 230 + 150 + 31 + + + + + 0 + 0 + + + + + 0 + 0 + + + + 增加数字行 + + + + + + 70 + 150 + 111 + 31 + + + + + + + 280 + 70 + 111 + 31 + + + + 1 + + + + 黑墨 + + + + + 白墨 + + + + + + + 70 + 200 + 76 + 23 + + + + 条码宽度 + + + + + + 70 + 40 + 140 + 23 + + + + 条形码类型 + + + + + + 70 + 70 + 161 + 31 + + + + + 0 + 0 + + + + + 140 + 0 + + + + + + + 280 + 40 + 76 + 23 + + + + 墨水类型 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 280 + 120 + 129 + 23 + + + + 显示缩放 + + + + + + 370 + 300 + 101 + 50 + + + + ✓ + + + + + BarCodeType + comboBoxInkColor + BarCodeHeigh + BarCodeScale + BarCodeDot + checkBoxAddText + checkBtn + + + + + checkBtn + clicked() + DlgBarcodeFormat + accept() + + + 412 + 323 + + + 417 + 460 + + + + + diff --git a/scene/DlgQrcodeFormat.cpp b/scene/DlgQrcodeFormat.cpp index fa8f81e..6951497 100644 --- a/scene/DlgQrcodeFormat.cpp +++ b/scene/DlgQrcodeFormat.cpp @@ -1,40 +1,40 @@ -#include "DlgQrcodeFormat.h" -#include "ui_DlgQrcodeFormat.h" - -DlgQrcodeFormat::DlgQrcodeFormat(QWidget *parent) : - QDialog(parent), - ui(new Ui::DlgQrcodeFormat) -{ - ui->setupUi(this); - setViewModel(m_vm); - ui->comboBoxType->setEnabled(false); -} - -DlgQrcodeFormat::~DlgQrcodeFormat() -{ - delete ui; -} - -void DlgQrcodeFormat::setViewModel(DlgQrcodeFormatVM vm) -{ - m_vm = vm; - ui->comboBoxType->setCurrentIndex(int(vm.type)); - ui->comboBoxInkColor->setCurrentIndex(int(vm.inkType)); - ui->comboBox_DMType->setCurrentIndex(int(vm.size)); - ui->comboBox_QRCodeLevel->setCurrentIndex(int(vm.level)); -} - -DlgQrcodeFormatVM DlgQrcodeFormat::viewModel() -{ - m_vm.type = QRCodeType(ui->comboBoxType->currentIndex()); - m_vm.inkType = InkType(ui->comboBoxInkColor->currentIndex()); - m_vm.level = QRCodeLevel(ui->comboBox_QRCodeLevel->currentIndex()); - m_vm.size = QRCodeSize(ui->comboBox_DMType->currentIndex()); - return m_vm; -} - -void DlgQrcodeFormat::setCodeType(QString type) -{ - // type = "QRCode" "DataMatrix" - ui->comboBoxType->setCurrentText(type); -} +#include "DlgQrcodeFormat.h" +#include "ui_DlgQrcodeFormat.h" + +DlgQrcodeFormat::DlgQrcodeFormat(QWidget *parent) : + QDialog(parent), + ui(new Ui::DlgQrcodeFormat) +{ + ui->setupUi(this); + setViewModel(m_vm); + ui->comboBoxType->setEnabled(false); +} + +DlgQrcodeFormat::~DlgQrcodeFormat() +{ + delete ui; +} + +void DlgQrcodeFormat::setViewModel(DlgQrcodeFormatVM vm) +{ + m_vm = vm; + ui->comboBoxType->setCurrentIndex(int(vm.type)); + ui->comboBoxInkColor->setCurrentIndex(int(vm.inkType)); + ui->comboBox_DMType->setCurrentIndex(int(vm.size)); + ui->comboBox_QRCodeLevel->setCurrentIndex(int(vm.level)); +} + +DlgQrcodeFormatVM DlgQrcodeFormat::viewModel() +{ + m_vm.type = QRCodeType(ui->comboBoxType->currentIndex()); + m_vm.inkType = InkType(ui->comboBoxInkColor->currentIndex()); + m_vm.level = QRCodeLevel(ui->comboBox_QRCodeLevel->currentIndex()); + m_vm.size = QRCodeSize(ui->comboBox_DMType->currentIndex()); + return m_vm; +} + +void DlgQrcodeFormat::setCodeType(QString type) +{ + // type = "QRCode" "DataMatrix" + ui->comboBoxType->setCurrentText(type); +} diff --git a/scene/DlgQrcodeFormat.h b/scene/DlgQrcodeFormat.h index 58d8265..97a6ba4 100644 --- a/scene/DlgQrcodeFormat.h +++ b/scene/DlgQrcodeFormat.h @@ -1,61 +1,61 @@ -#ifndef DLGQRCODEFORMAT_H -#define DLGQRCODEFORMAT_H - -#include -#include "ViewModels.h" - -namespace Ui { -class DlgQrcodeFormat; -} - -enum QRCodeType { - QR_CODE_TYPE_DATA_MATRIX = 0, - QR_CODE_TYPE_QRCODE = 1, -}; - -enum QRCodeLevel { - QR_CODE_LEVEL_L = 0, - QR_CODE_LEVEL_M = 1, - QR_CODE_LEVEL_H = 2, - QR_CODE_LEVEL_Q = 3, -}; - -enum QRCodeSize { - QR_CODE_SIZE_DEFAULT, - QR_CODE_SIZE_8X18, - QR_CODE_SIZE_8X32, - QR_CODE_SIZE_12X26, - QR_CODE_SIZE_12X36, - QR_CODE_SIZE_16X36, - QR_CODE_SIZE_16X48, -}; - -struct DlgQrcodeFormatVM { - QRCodeType type = QR_CODE_TYPE_QRCODE; - QRCodeLevel level = QR_CODE_LEVEL_L; - QRCodeSize size = QR_CODE_SIZE_DEFAULT; - InkType inkType = INK_TYPE_BLACK; -}; - -Q_DECLARE_METATYPE(DlgQrcodeFormatVM); - -class DlgQrcodeFormat : public QDialog -{ - Q_OBJECT - -public: - explicit DlgQrcodeFormat(QWidget *parent = nullptr); - ~DlgQrcodeFormat(); - - void setViewModel(DlgQrcodeFormatVM vm); - - DlgQrcodeFormatVM viewModel(); - - void setCodeType(QString type); -private: - Ui::DlgQrcodeFormat *ui; - - DlgQrcodeFormatVM m_vm; -}; - -#endif // DLGQRCODEFORMAT_H +#ifndef DLGQRCODEFORMAT_H +#define DLGQRCODEFORMAT_H + +#include +#include "ViewModels.h" + +namespace Ui { +class DlgQrcodeFormat; +} + +enum QRCodeType { + QR_CODE_TYPE_DATA_MATRIX = 0, + QR_CODE_TYPE_QRCODE = 1, +}; + +enum QRCodeLevel { + QR_CODE_LEVEL_L = 0, + QR_CODE_LEVEL_M = 1, + QR_CODE_LEVEL_H = 2, + QR_CODE_LEVEL_Q = 3, +}; + +enum QRCodeSize { + QR_CODE_SIZE_DEFAULT, + QR_CODE_SIZE_8X18, + QR_CODE_SIZE_8X32, + QR_CODE_SIZE_12X26, + QR_CODE_SIZE_12X36, + QR_CODE_SIZE_16X36, + QR_CODE_SIZE_16X48, +}; + +struct DlgQrcodeFormatVM { + QRCodeType type = QR_CODE_TYPE_QRCODE; + QRCodeLevel level = QR_CODE_LEVEL_L; + QRCodeSize size = QR_CODE_SIZE_DEFAULT; + InkType inkType = INK_TYPE_BLACK; +}; + +Q_DECLARE_METATYPE(DlgQrcodeFormatVM); + +class DlgQrcodeFormat : public QDialog +{ + Q_OBJECT + +public: + explicit DlgQrcodeFormat(QWidget *parent = nullptr); + ~DlgQrcodeFormat(); + + void setViewModel(DlgQrcodeFormatVM vm); + + DlgQrcodeFormatVM viewModel(); + + void setCodeType(QString type); +private: + Ui::DlgQrcodeFormat *ui; + + DlgQrcodeFormatVM m_vm; +}; + +#endif // DLGQRCODEFORMAT_H diff --git a/scene/DlgQrcodeFormat.ui b/scene/DlgQrcodeFormat.ui index 7e10641..2b0840b 100644 --- a/scene/DlgQrcodeFormat.ui +++ b/scene/DlgQrcodeFormat.ui @@ -1,331 +1,331 @@ - - - DlgQrcodeFormat - - - - 0 - 0 - 510 - 380 - - - - - 0 - 0 - - - - Dialog - - - QWidget{ - font-size: 16px; -} -QWidget { - font-size: 16px; -} - -QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - -QComboBox { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - width: 180px; - height: 90px; - padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ -} - -/* 下拉箭头区域 */ -QComboBox::drop-down { - border: 1px solid #333333; - border-radius: 3px; - width: 30px; /* 箭头区域宽度 */ - background-color: #5396C1; -} - -/* 下拉箭头图标 */ -QComboBox::down-arrow { - image: url(:/image/down_white.png); - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ -} - -/* 悬停状态 */ -QComboBox:hover { - background-color: #efefef; -} - -// 下拉框 -QComboBox QAbstractItemView { - border: 1px solid #000000; - border-radius: 3px; - font-size: 14px; - selection-background-color: #5396C1; /* 选中项背景色(稍深) */ - selection-color: #ffffff; -} - -QSpinBox::up-button { - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::up-arrow { - image: url(:/image/up_white.png); -} - -QSpinBox::down-button { - width: 16px; /* 图标显示宽度 */ - height: 16px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::down-arrow { - image: url(:/image/down_white.png); -} - - - - - - 40 - 60 - 251 - 31 - - - - - DataMatrix - - - - - QRCode - - - - - - - 40 - 130 - 251 - 31 - - - - - 正相打印 - - - - - 反相打印 - - - - - - - 40 - 180 - 141 - 21 - - - - DM码尺寸: - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - 40 - 210 - 157 - 31 - - - - - 0 - 0 - - - - - 默认 - - - - - 8 x 18 - - - - - 8 x 32 - - - - - 12 x 26 - - - - - 12 x 36 - - - - - 16 x 36 - - - - - 16 x 48 - - - - - - - 210 - 210 - 156 - 31 - - - - - 低级 - - - - - 中级 - - - - - 高级 - - - - - 超高级 - - - - - - - 40 - 21 - 181 - 31 - - - - 类型 - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - 40 - 101 - 141 - 21 - - - - 墨水类型 - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - 370 - 300 - 101 - 50 - - - - ✓ - - - - - - - checkBtn - clicked() - DlgQrcodeFormat - accept() - - - 423 - 327 - - - 463 - 504 - - - - - + + + DlgQrcodeFormat + + + + 0 + 0 + 510 + 380 + + + + + 0 + 0 + + + + Dialog + + + QWidget{ + font-size: 16px; +} +QWidget { + font-size: 16px; +} + +QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + +QComboBox { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + width: 180px; + height: 90px; + padding-left: 10px; /* 文字左边距,避免紧贴边缘 */ +} + +/* 下拉箭头区域 */ +QComboBox::drop-down { + border: 1px solid #333333; + border-radius: 3px; + width: 30px; /* 箭头区域宽度 */ + background-color: #5396C1; +} + +/* 下拉箭头图标 */ +QComboBox::down-arrow { + image: url(:/image/down_white.png); + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ +} + +/* 悬停状态 */ +QComboBox:hover { + background-color: #efefef; +} + +// 下拉框 +QComboBox QAbstractItemView { + border: 1px solid #000000; + border-radius: 3px; + font-size: 14px; + selection-background-color: #5396C1; /* 选中项背景色(稍深) */ + selection-color: #ffffff; +} + +QSpinBox::up-button { + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; +} + +QSpinBox::up-arrow { + image: url(:/image/up_white.png); +} + +QSpinBox::down-button { + width: 16px; /* 图标显示宽度 */ + height: 16px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; +} + +QSpinBox::down-arrow { + image: url(:/image/down_white.png); +} + + + + + + 40 + 60 + 251 + 31 + + + + + DataMatrix + + + + + QRCode + + + + + + + 40 + 130 + 251 + 31 + + + + + 正相打印 + + + + + 反相打印 + + + + + + + 40 + 180 + 141 + 21 + + + + DM码尺寸: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 40 + 210 + 157 + 31 + + + + + 0 + 0 + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + + + 210 + 210 + 156 + 31 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + + + 40 + 21 + 181 + 31 + + + + 类型 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 40 + 101 + 141 + 21 + + + + 墨水类型 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 370 + 300 + 101 + 50 + + + + ✓ + + + + + + + checkBtn + clicked() + DlgQrcodeFormat + accept() + + + 423 + 327 + + + 463 + 504 + + + + + diff --git a/scene/ItemGeneralSettings.cpp b/scene/ItemGeneralSettings.cpp index a5adc6a..20f2f0a 100644 --- a/scene/ItemGeneralSettings.cpp +++ b/scene/ItemGeneralSettings.cpp @@ -1,174 +1,174 @@ -#include "ItemGeneralSettings.h" -#include "ui_ItemGeneralSettings.h" -#include - -ItemGeneralSettings::ItemGeneralSettings(QWidget *parent) : - QWidget(parent), - ui(new Ui::ItemGeneralSettings) -{ - ui->setupUi(this); - m_directionButtonGroup.addButton(ui->normalRBtn, NORMAL); - m_directionButtonGroup.addButton(ui->verMirrorRBtn, MIRROR_V); - m_directionButtonGroup.addButton(ui->horMirrorRBtn, MIRROR_H); - m_directionButtonGroup.addButton(ui->mirrorRBtn, MIRROR_VH); - m_directionButtonGroup.addButton(ui->m90NHorRBtn, MIRROR_H_R270); - m_directionButtonGroup.addButton(ui->a90RBtn, R90); - m_directionButtonGroup.addButton(ui->m90RBtn, R270); - m_directionButtonGroup.addButton(ui->m90NVerRBtn, MIRROR_V_R270); - - connect(&m_directionButtonGroup, static_cast(&QButtonGroup::buttonClicked), - this, &ItemGeneralSettings::ondirectionChanged); - connect(ui->boldSpinBox, static_cast(&QSpinBox::valueChanged), - this, &ItemGeneralSettings::onBoldSpinBoxValueChanged); - connect(ui->txtSpanSpinBox, static_cast(&QSpinBox::valueChanged), - this, &ItemGeneralSettings::onLetterSpaceSpinBoxChanged); - connect(ui->invertCheckBox, &QCheckBox::stateChanged, - this, [this](int state) { onColorReversalCheckBoxChecked(state == Qt::Checked); }); - - initUI(); -} - -ItemGeneralSettings::~ItemGeneralSettings() -{ - delete ui; -} - -void ItemGeneralSettings::edit(PicTextItem *item) -{ - m_currItem = item; - - // 从item快照创建ViewModel(如果item为空,使用默认值) - setViewModel(TextItemModel::fromItem(item)); -} - -void ItemGeneralSettings::initUI() -{ - ui->densitySpinBox->setValue(0); - ui->invertCheckBox->setChecked(false); - ui->alternateCheckBox->setChecked(false); - ui->boldSpinBox->setValue(0); - ui->txtSpanSpinBox->setValue(0); - ui->normalRBtn->setChecked(true); - ui->applyCounterCheckBox->setChecked(false); - ui->counterIDSpinBox->setValue(0); -} - -void ItemGeneralSettings::setViewModel(const TextItemModel &vm) -{ - m_vmSnapshot = vm; - m_vm = vm; - - // 阻止信号以避免重复回调 - auto blockBold = ui->boldSpinBox->blockSignals(true); - auto blockSpan = ui->txtSpanSpinBox->blockSignals(true); - auto blockInvert = ui->invertCheckBox->blockSignals(true); - - // 根据m_vm更新UI显示 - ui->boldSpinBox->setValue(m_vm.boldMultiple); - ui->txtSpanSpinBox->setValue(m_vm.letterSpace); - - auto dirBtn = m_directionButtonGroup.button(m_vm.direction); - if (dirBtn) { - dirBtn->setChecked(true); - } - - ui->invertCheckBox->setChecked(m_vm.colorReversal); - - // 恢复信号 - ui->boldSpinBox->blockSignals(blockBold); - ui->txtSpanSpinBox->blockSignals(blockSpan); - ui->invertCheckBox->blockSignals(blockInvert); - - // 字间距可见性由item的类型决定 - switch(m_vm.sourceType) { - case SourceType::TEXT: - case SourceType::DATETIME: - case SourceType::SCHEDULE_SHIFT: - ui->letterSpacePanel->setVisible(true); - break; - case SourceType::UNKNOWN: - default: - ui->letterSpacePanel->setVisible(false); - break; - } - - updatePreview(); -} - -void ItemGeneralSettings::applyToItem(PicTextItem *item) -{ - if (!item) { - return; - } - - // VM的属性被逐一应用到item - item->setDirection(m_vm.direction); - item->setBoldMultiple(m_vm.boldMultiple); - item->setLetterSpace(m_vm.letterSpace); - item->setColorReversal(m_vm.colorReversal); - item->applyModify(); -} - -void ItemGeneralSettings::ondirectionChanged(int dir) -{ - // 只更新VM,不直接修改item - m_vm.direction = ItemDirectionType(dir); - updatePreview(); -} - -void ItemGeneralSettings::onBoldSpinBoxValueChanged(int multiple) -{ - // 只更新VM - m_vm.boldMultiple = multiple; - updatePreview(); -} - -void ItemGeneralSettings::onLetterSpaceSpinBoxChanged(int space) -{ - // 只更新VM - m_vm.letterSpace = space; - updatePreview(); -} - -void ItemGeneralSettings::onColorReversalCheckBoxChecked(bool b) -{ - // 只更新VM - m_vm.colorReversal = b; - updatePreview(); -} - -void ItemGeneralSettings::updatePreview() -{ - // 预览需要基于item的source和m_vm的属性组合渲染 - // 如果m_currItem为空,显示空图像 - if (!m_currItem) { - if(m_vm.imageGenerator) { - ui->previewWidget->setImg(m_vm.imageGenerator()); - } - else { - ui->previewWidget->setImg(QImage()); - } - return; - } - - // 临时应用VM到item以获取预览,随后还原 - auto backupDir = m_currItem->direction(); - auto backupBold = m_currItem->boldMultiple(); - auto backupSpace = m_currItem->letterSpace(); - auto backupReverse = m_currItem->colorReversal(); - - m_currItem->setDirection(m_vm.direction); - m_currItem->setBoldMultiple(m_vm.boldMultiple); - m_currItem->setLetterSpace(m_vm.letterSpace); - m_currItem->setColorReversal(m_vm.colorReversal); - m_currItem->applyModify(); - - ui->previewWidget->setImg(m_currItem->preview()); - - // 还原原始状态(preview()后item的属性不应该被留下改动) - m_currItem->setDirection(backupDir); - m_currItem->setBoldMultiple(backupBold); - m_currItem->setLetterSpace(backupSpace); - m_currItem->setColorReversal(backupReverse); - m_currItem->applyModify(); +#include "ItemGeneralSettings.h" +#include "ui_ItemGeneralSettings.h" +#include + +ItemGeneralSettings::ItemGeneralSettings(QWidget *parent) : + QWidget(parent), + ui(new Ui::ItemGeneralSettings) +{ + ui->setupUi(this); + m_directionButtonGroup.addButton(ui->normalRBtn, NORMAL); + m_directionButtonGroup.addButton(ui->verMirrorRBtn, MIRROR_V); + m_directionButtonGroup.addButton(ui->horMirrorRBtn, MIRROR_H); + m_directionButtonGroup.addButton(ui->mirrorRBtn, MIRROR_VH); + m_directionButtonGroup.addButton(ui->m90NHorRBtn, MIRROR_H_R270); + m_directionButtonGroup.addButton(ui->a90RBtn, R90); + m_directionButtonGroup.addButton(ui->m90RBtn, R270); + m_directionButtonGroup.addButton(ui->m90NVerRBtn, MIRROR_V_R270); + + connect(&m_directionButtonGroup, static_cast(&QButtonGroup::buttonClicked), + this, &ItemGeneralSettings::ondirectionChanged); + connect(ui->boldSpinBox, static_cast(&QSpinBox::valueChanged), + this, &ItemGeneralSettings::onBoldSpinBoxValueChanged); + connect(ui->txtSpanSpinBox, static_cast(&QSpinBox::valueChanged), + this, &ItemGeneralSettings::onLetterSpaceSpinBoxChanged); + connect(ui->invertCheckBox, &QCheckBox::stateChanged, + this, [this](int state) { onColorReversalCheckBoxChecked(state == Qt::Checked); }); + + initUI(); +} + +ItemGeneralSettings::~ItemGeneralSettings() +{ + delete ui; +} + +void ItemGeneralSettings::edit(PicTextItem *item) +{ + m_currItem = item; + + // 从item快照创建ViewModel(如果item为空,使用默认值) + setViewModel(TextItemModel::fromItem(item)); +} + +void ItemGeneralSettings::initUI() +{ + ui->densitySpinBox->setValue(0); + ui->invertCheckBox->setChecked(false); + ui->alternateCheckBox->setChecked(false); + ui->boldSpinBox->setValue(0); + ui->txtSpanSpinBox->setValue(0); + ui->normalRBtn->setChecked(true); + ui->applyCounterCheckBox->setChecked(false); + ui->counterIDSpinBox->setValue(0); +} + +void ItemGeneralSettings::setViewModel(const TextItemModel &vm) +{ + m_vmSnapshot = vm; + m_vm = vm; + + // 阻止信号以避免重复回调 + auto blockBold = ui->boldSpinBox->blockSignals(true); + auto blockSpan = ui->txtSpanSpinBox->blockSignals(true); + auto blockInvert = ui->invertCheckBox->blockSignals(true); + + // 根据m_vm更新UI显示 + ui->boldSpinBox->setValue(m_vm.boldMultiple); + ui->txtSpanSpinBox->setValue(m_vm.letterSpace); + + auto dirBtn = m_directionButtonGroup.button(m_vm.direction); + if (dirBtn) { + dirBtn->setChecked(true); + } + + ui->invertCheckBox->setChecked(m_vm.colorReversal); + + // 恢复信号 + ui->boldSpinBox->blockSignals(blockBold); + ui->txtSpanSpinBox->blockSignals(blockSpan); + ui->invertCheckBox->blockSignals(blockInvert); + + // 字间距可见性由item的类型决定 + switch(m_vm.sourceType) { + case SourceType::TEXT: + case SourceType::DATETIME: + case SourceType::SCHEDULE_SHIFT: + ui->letterSpacePanel->setVisible(true); + break; + case SourceType::UNKNOWN: + default: + ui->letterSpacePanel->setVisible(false); + break; + } + + updatePreview(); +} + +void ItemGeneralSettings::applyToItem(PicTextItem *item) +{ + if (!item) { + return; + } + + // VM的属性被逐一应用到item + item->setDirection(m_vm.direction); + item->setBoldMultiple(m_vm.boldMultiple); + item->setLetterSpace(m_vm.letterSpace); + item->setColorReversal(m_vm.colorReversal); + item->applyModify(); +} + +void ItemGeneralSettings::ondirectionChanged(int dir) +{ + // 只更新VM,不直接修改item + m_vm.direction = ItemDirectionType(dir); + updatePreview(); +} + +void ItemGeneralSettings::onBoldSpinBoxValueChanged(int multiple) +{ + // 只更新VM + m_vm.boldMultiple = multiple; + updatePreview(); +} + +void ItemGeneralSettings::onLetterSpaceSpinBoxChanged(int space) +{ + // 只更新VM + m_vm.letterSpace = space; + updatePreview(); +} + +void ItemGeneralSettings::onColorReversalCheckBoxChecked(bool b) +{ + // 只更新VM + m_vm.colorReversal = b; + updatePreview(); +} + +void ItemGeneralSettings::updatePreview() +{ + // 预览需要基于item的source和m_vm的属性组合渲染 + // 如果m_currItem为空,显示空图像 + if (!m_currItem) { + if(m_vm.imageGenerator) { + ui->previewWidget->setImg(m_vm.imageGenerator()); + } + else { + ui->previewWidget->setImg(QImage()); + } + return; + } + + // 临时应用VM到item以获取预览,随后还原 + auto backupDir = m_currItem->direction(); + auto backupBold = m_currItem->boldMultiple(); + auto backupSpace = m_currItem->letterSpace(); + auto backupReverse = m_currItem->colorReversal(); + + m_currItem->setDirection(m_vm.direction); + m_currItem->setBoldMultiple(m_vm.boldMultiple); + m_currItem->setLetterSpace(m_vm.letterSpace); + m_currItem->setColorReversal(m_vm.colorReversal); + m_currItem->applyModify(); + + ui->previewWidget->setImg(m_currItem->preview()); + + // 还原原始状态(preview()后item的属性不应该被留下改动) + m_currItem->setDirection(backupDir); + m_currItem->setBoldMultiple(backupBold); + m_currItem->setLetterSpace(backupSpace); + m_currItem->setColorReversal(backupReverse); + m_currItem->applyModify(); } \ No newline at end of file diff --git a/scene/ItemGeneralSettings.h b/scene/ItemGeneralSettings.h index af98234..6449931 100644 --- a/scene/ItemGeneralSettings.h +++ b/scene/ItemGeneralSettings.h @@ -1,88 +1,88 @@ -#ifndef ITEMGENERALSETTINGS_H -#define ITEMGENERALSETTINGS_H - -#include -#include -#include "pictextitem.h" -#include -#include - -namespace Ui { -class ItemGeneralSettings; -} - -class ItemGeneralSettings : public QWidget -{ - Q_OBJECT - -public: - explicit ItemGeneralSettings(QWidget *parent = nullptr); - ~ItemGeneralSettings(); - - /** - * @brief 加载PicTextItem的属性到ViewModel,初始化UI - * - * 原因:UI应该显示item的状态,但不应该直接持有指针长期修改。 - * edit()后,用户对UI的编辑会更新m_vm,而不是直接改item。 - */ - void edit(PicTextItem* item); - - /** - * @brief 设置当前ViewModel - * - * @param vm - */ - void setViewModel(const TextItemModel& vm); - - /** - * @brief 获取当前ViewModel - * - * 调用者可以检查是否有改动,并决定是否应用 - */ - TextItemModel viewModel() const { return m_vm; } - - /** - * @brief 将ViewModel的属性应用到指定的PicTextItem - * - * 解耦的核心:UI不再直接修改item,而是通过VM进行间接修改。 - * 这支持撤销/重做、批量编辑等高级功能。 - */ - void applyToItem(PicTextItem* item); - - /** - * @brief 当前编辑的item源引用(可能为空) - * - * 主要用于获取preview()时作为示例源,不用于直接修改 - */ - PicTextItem* currentItem() { return m_currItem; } - - void initUI(); - -private slots: - void ondirectionChanged(int dir); - void onBoldSpinBoxValueChanged(int multiple); - void onLetterSpaceSpinBoxChanged(int space); - void onColorReversalCheckBoxChecked(bool b); - -private: - /** - * @brief 刷新预览,基于当前VM和item的source渲染 - */ - void updatePreview(); - - Ui::ItemGeneralSettings *ui; - QButtonGroup m_directionButtonGroup; - - // 原始item的快照,用于preview()和后续应用 - PicTextItem* m_currItem = nullptr; - - // UI编辑的状态,独立于m_currItem - TextItemModel m_vm; - - // 初始加载时的VM状态,用于检测改动 - TextItemModel m_vmSnapshot; - - QPainter m_painter; -}; - -#endif // ITEMGENERALSETTINGS_H +#ifndef ITEMGENERALSETTINGS_H +#define ITEMGENERALSETTINGS_H + +#include +#include +#include "pictextitem.h" +#include +#include + +namespace Ui { +class ItemGeneralSettings; +} + +class ItemGeneralSettings : public QWidget +{ + Q_OBJECT + +public: + explicit ItemGeneralSettings(QWidget *parent = nullptr); + ~ItemGeneralSettings(); + + /** + * @brief 加载PicTextItem的属性到ViewModel,初始化UI + * + * 原因:UI应该显示item的状态,但不应该直接持有指针长期修改。 + * edit()后,用户对UI的编辑会更新m_vm,而不是直接改item。 + */ + void edit(PicTextItem* item); + + /** + * @brief 设置当前ViewModel + * + * @param vm + */ + void setViewModel(const TextItemModel& vm); + + /** + * @brief 获取当前ViewModel + * + * 调用者可以检查是否有改动,并决定是否应用 + */ + TextItemModel viewModel() const { return m_vm; } + + /** + * @brief 将ViewModel的属性应用到指定的PicTextItem + * + * 解耦的核心:UI不再直接修改item,而是通过VM进行间接修改。 + * 这支持撤销/重做、批量编辑等高级功能。 + */ + void applyToItem(PicTextItem* item); + + /** + * @brief 当前编辑的item源引用(可能为空) + * + * 主要用于获取preview()时作为示例源,不用于直接修改 + */ + PicTextItem* currentItem() { return m_currItem; } + + void initUI(); + +private slots: + void ondirectionChanged(int dir); + void onBoldSpinBoxValueChanged(int multiple); + void onLetterSpaceSpinBoxChanged(int space); + void onColorReversalCheckBoxChecked(bool b); + +private: + /** + * @brief 刷新预览,基于当前VM和item的source渲染 + */ + void updatePreview(); + + Ui::ItemGeneralSettings *ui; + QButtonGroup m_directionButtonGroup; + + // 原始item的快照,用于preview()和后续应用 + PicTextItem* m_currItem = nullptr; + + // UI编辑的状态,独立于m_currItem + TextItemModel m_vm; + + // 初始加载时的VM状态,用于检测改动 + TextItemModel m_vmSnapshot; + + QPainter m_painter; +}; + +#endif // ITEMGENERALSETTINGS_H diff --git a/scene/ItemGeneralSettings.ui b/scene/ItemGeneralSettings.ui index bdbc6b6..b64c9cb 100644 --- a/scene/ItemGeneralSettings.ui +++ b/scene/ItemGeneralSettings.ui @@ -1,703 +1,703 @@ - - - ItemGeneralSettings - - - - 0 - 0 - 794 - 472 - - - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - - - - - 30 - 20 - 71 - 21 - - - - 反差 - - - densitySpinBox - - - - - - 320 - 390 - 48 - 26 - - - - QAbstractSpinBox::NoButtons - - - - - - 370 - 390 - 40 - 26 - - - - ← - - - - - - 410 - 390 - 40 - 26 - - - - → - - - - - - 320 - 30 - 71 - 21 - - - - 粗体 - - - boldSpinBox - - - - - - 340 - 50 - 48 - 26 - - - - QAbstractSpinBox::NoButtons - - - 1 - - - 8 - - - - - - 390 - 50 - 40 - 26 - - - - ← - - - - - - 430 - 50 - 40 - 26 - - - - → - - - - - - 40 - 100 - 92 - 23 - - - - 颠倒 - - - - - - 40 - 150 - 92 - 23 - - - - 交替 - - - - - - 320 - 90 - 67 - 17 - - - - 定向 - - - - - - 320 - 120 - 101 - 23 - - - - - - - - :/image/itemEditor/normal.png:/image/itemEditor/normal.png - - - - 48 - 48 - - - - - - - 430 - 120 - 101 - 23 - - - - - - - - :/image/itemEditor/verMirror.png:/image/itemEditor/verMirror.png - - - - 48 - 48 - - - - - - - 540 - 120 - 101 - 23 - - - - - - - - :/image/itemEditor/horMirror.png:/image/itemEditor/horMirror.png - - - - 48 - 48 - - - - - - - 320 - 160 - 61 - 81 - - - - - - - - :/image/itemEditor/m90_hor.png:/image/itemEditor/m90_hor.png - - - - 48 - 48 - - - - - - - 640 - 120 - 101 - 23 - - - - - - - - :/image/itemEditor/mirror.png:/image/itemEditor/mirror.png - - - - 48 - 48 - - - - - - - 430 - 160 - 61 - 81 - - - - - - - - :/image/itemEditor/a90.png:/image/itemEditor/a90.png - - - - 48 - 48 - - - - - - - 540 - 160 - 61 - 81 - - - - - - - - :/image/itemEditor/m90.png:/image/itemEditor/m90.png - - - - 48 - 48 - - - - - - - 640 - 160 - 61 - 81 - - - - - - - - :/image/itemEditor/m90_ver.png:/image/itemEditor/m90_ver.png - - - - 48 - 48 - - - - - - - 50 - 240 - 661 - 111 - - - - - - - 300 - 360 - 161 - 23 - - - - Print, when counter - - - - - - 460 - 390 - 101 - 21 - - - - 计数器ID - - - counterIDSpinBox - - - - - - 50 - 50 - 48 - 26 - - - - QAbstractSpinBox::NoButtons - - - - - - 100 - 50 - 40 - 26 - - - - ← - - - - - - 140 - 50 - 40 - 26 - - - - → - - - - - - 530 - 30 - 181 - 61 - - - - - - 0 - 0 - 91 - 21 - - - - 字符间距 - - - txtSpanSpinBox - - - - - - 0 - 20 - 48 - 26 - - - - QAbstractSpinBox::NoButtons - - - - - - 50 - 20 - 40 - 26 - - - - ← - - - - - - 90 - 20 - 40 - 26 - - - - → - - - - - - - ImagePreviewer - QWidget -
imagepreviewer.h
- 1 -
-
- - invertCheckBox - densitySpinBox - densityDownBtn - densityUpBtn - boldSpinBox - boldDownBtn - boldUpBtn - txtSpanSpinBox - txtSpanDownBtn - txtSpanUpBtn - alternateCheckBox - normalRBtn - verMirrorRBtn - horMirrorRBtn - mirrorRBtn - m90NHorRBtn - a90RBtn - m90RBtn - m90NVerRBtn - applyCounterCheckBox - counterIDSpinBox - counterIdDownBtn - counterIdUpBtn - - - - - boldDownBtn - clicked() - boldSpinBox - stepDown() - - - 404 - 67 - - - 350 - 62 - - - - - boldUpBtn - clicked() - boldSpinBox - stepUp() - - - 456 - 67 - - - 352 - 68 - - - - - txtSpanDownBtn - clicked() - txtSpanSpinBox - stepDown() - - - 595 - 65 - - - 551 - 67 - - - - - txtSpanUpBtn - clicked() - txtSpanSpinBox - stepUp() - - - 633 - 69 - - - 553 - 66 - - - - - densityDownBtn - clicked() - densitySpinBox - stepDown() - - - 126 - 64 - - - 84 - 62 - - - - - densityUpBtn - clicked() - densitySpinBox - stepUp() - - - 170 - 67 - - - 76 - 67 - - - - - boldSpinBox - valueChanged(int) - ItemGeneralSettings - onBoldSpinBoxValueChanged(int) - - - 352 - 70 - - - 344 - -33 - - - - - invertCheckBox - clicked(bool) - ItemGeneralSettings - onColorReversalCheckBoxChecked(bool) - - - 49 - 139 - - - -38 - 143 - - - - - txtSpanSpinBox - valueChanged(int) - ItemGeneralSettings - onLetterSpaceSpinBoxChanged(int) - - - 568 - 51 - - - 570 - -17 - - - - - - onBoldSpinBoxValueChanged(int) - onLetterSpaceSpinBoxChanged(int) - onColorReversalCheckBoxChecked(bool) - -
+ + + ItemGeneralSettings + + + + 0 + 0 + 794 + 472 + + + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + + + + + 30 + 20 + 71 + 21 + + + + 反差 + + + densitySpinBox + + + + + + 320 + 390 + 48 + 26 + + + + QAbstractSpinBox::NoButtons + + + + + + 370 + 390 + 40 + 26 + + + + ← + + + + + + 410 + 390 + 40 + 26 + + + + → + + + + + + 320 + 30 + 71 + 21 + + + + 粗体 + + + boldSpinBox + + + + + + 340 + 50 + 48 + 26 + + + + QAbstractSpinBox::NoButtons + + + 1 + + + 8 + + + + + + 390 + 50 + 40 + 26 + + + + ← + + + + + + 430 + 50 + 40 + 26 + + + + → + + + + + + 40 + 100 + 92 + 23 + + + + 颠倒 + + + + + + 40 + 150 + 92 + 23 + + + + 交替 + + + + + + 320 + 90 + 67 + 17 + + + + 定向 + + + + + + 320 + 120 + 101 + 23 + + + + + + + + :/image/itemEditor/normal.png:/image/itemEditor/normal.png + + + + 48 + 48 + + + + + + + 430 + 120 + 101 + 23 + + + + + + + + :/image/itemEditor/verMirror.png:/image/itemEditor/verMirror.png + + + + 48 + 48 + + + + + + + 540 + 120 + 101 + 23 + + + + + + + + :/image/itemEditor/horMirror.png:/image/itemEditor/horMirror.png + + + + 48 + 48 + + + + + + + 320 + 160 + 61 + 81 + + + + + + + + :/image/itemEditor/m90_hor.png:/image/itemEditor/m90_hor.png + + + + 48 + 48 + + + + + + + 640 + 120 + 101 + 23 + + + + + + + + :/image/itemEditor/mirror.png:/image/itemEditor/mirror.png + + + + 48 + 48 + + + + + + + 430 + 160 + 61 + 81 + + + + + + + + :/image/itemEditor/a90.png:/image/itemEditor/a90.png + + + + 48 + 48 + + + + + + + 540 + 160 + 61 + 81 + + + + + + + + :/image/itemEditor/m90.png:/image/itemEditor/m90.png + + + + 48 + 48 + + + + + + + 640 + 160 + 61 + 81 + + + + + + + + :/image/itemEditor/m90_ver.png:/image/itemEditor/m90_ver.png + + + + 48 + 48 + + + + + + + 50 + 240 + 661 + 111 + + + + + + + 300 + 360 + 161 + 23 + + + + Print, when counter + + + + + + 460 + 390 + 101 + 21 + + + + 计数器ID + + + counterIDSpinBox + + + + + + 50 + 50 + 48 + 26 + + + + QAbstractSpinBox::NoButtons + + + + + + 100 + 50 + 40 + 26 + + + + ← + + + + + + 140 + 50 + 40 + 26 + + + + → + + + + + + 530 + 30 + 181 + 61 + + + + + + 0 + 0 + 91 + 21 + + + + 字符间距 + + + txtSpanSpinBox + + + + + + 0 + 20 + 48 + 26 + + + + QAbstractSpinBox::NoButtons + + + + + + 50 + 20 + 40 + 26 + + + + ← + + + + + + 90 + 20 + 40 + 26 + + + + → + + + + + + + ImagePreviewer + QWidget +
imagepreviewer.h
+ 1 +
+
+ + invertCheckBox + densitySpinBox + densityDownBtn + densityUpBtn + boldSpinBox + boldDownBtn + boldUpBtn + txtSpanSpinBox + txtSpanDownBtn + txtSpanUpBtn + alternateCheckBox + normalRBtn + verMirrorRBtn + horMirrorRBtn + mirrorRBtn + m90NHorRBtn + a90RBtn + m90RBtn + m90NVerRBtn + applyCounterCheckBox + counterIDSpinBox + counterIdDownBtn + counterIdUpBtn + + + + + boldDownBtn + clicked() + boldSpinBox + stepDown() + + + 404 + 67 + + + 350 + 62 + + + + + boldUpBtn + clicked() + boldSpinBox + stepUp() + + + 456 + 67 + + + 352 + 68 + + + + + txtSpanDownBtn + clicked() + txtSpanSpinBox + stepDown() + + + 595 + 65 + + + 551 + 67 + + + + + txtSpanUpBtn + clicked() + txtSpanSpinBox + stepUp() + + + 633 + 69 + + + 553 + 66 + + + + + densityDownBtn + clicked() + densitySpinBox + stepDown() + + + 126 + 64 + + + 84 + 62 + + + + + densityUpBtn + clicked() + densitySpinBox + stepUp() + + + 170 + 67 + + + 76 + 67 + + + + + boldSpinBox + valueChanged(int) + ItemGeneralSettings + onBoldSpinBoxValueChanged(int) + + + 352 + 70 + + + 344 + -33 + + + + + invertCheckBox + clicked(bool) + ItemGeneralSettings + onColorReversalCheckBoxChecked(bool) + + + 49 + 139 + + + -38 + 143 + + + + + txtSpanSpinBox + valueChanged(int) + ItemGeneralSettings + onLetterSpaceSpinBoxChanged(int) + + + 568 + 51 + + + 570 + -17 + + + + + + onBoldSpinBoxValueChanged(int) + onLetterSpaceSpinBoxChanged(int) + onColorReversalCheckBoxChecked(bool) + +
diff --git a/scene/PicDateItem.cpp b/scene/PicDateItem.cpp index 3a3a5d4..9fc1ad3 100644 --- a/scene/PicDateItem.cpp +++ b/scene/PicDateItem.cpp @@ -97,6 +97,15 @@ void PicDateItem::setSource(QVariant var) if(m_model.datetimePattern.isEmpty()) return; + // 重新计算最长显示尺寸(以防 font()/letterSpace 改变时未重算) + m_maxDateTimeStr = generateMaxDateTimeString(m_model, font()); + if (m_maxDateTimeStr.isEmpty()) { + m_maxSize = QSize(); + } else { + QFontMetrics fm(font()); + m_maxSize = QSize(fm.horizontalAdvance(m_maxDateTimeStr), fm.height()); + } + m_currDateTimeStr = ItemUtils::generateTxtFromDateItemModel(m_model, QDateTime::currentDateTime()); applyModify(); } diff --git a/scene/PicScheduleShiftItem.cpp b/scene/PicScheduleShiftItem.cpp index adcdf29..76ca3a3 100644 --- a/scene/PicScheduleShiftItem.cpp +++ b/scene/PicScheduleShiftItem.cpp @@ -1,6 +1,8 @@ #include "PicScheduleShiftItem.h" #include #include "LogInfo.h" +#include +#include PicScheduleShiftItem::PicScheduleShiftItem(QGraphicsItem *parent, QGraphicsScene *scene, const SourceType type) :PicTextItem(parent, scene, type) @@ -19,6 +21,9 @@ QVariant PicScheduleShiftItem::source() void PicScheduleShiftItem::setSource(QVariant var) { + // 重新计算基于当前字体的最大名称像素宽度 + m_maxSize = calcMaxSize(); + m_currScheduleName = findScheduleName(QTime::currentTime()); applyModify(); } @@ -31,6 +36,8 @@ const QVector& PicScheduleShiftItem::schedules() const void PicScheduleShiftItem::setSchedules(QVector schedules) { m_schedules = std::move(schedules); + m_maxSize = calcMaxSize(); + m_currScheduleName = findScheduleName(QTime::currentTime()); applyModify(); } @@ -95,11 +102,40 @@ QImage PicScheduleShiftItem::itemImage() auto str = m_currScheduleName; if(str.isEmpty()) { - QImage(); + return QImage(); } return strToImage(str); } +QSize PicScheduleShiftItem::calcMaxSize() +{ + if (m_schedules.isEmpty()) + return QSize(); + + QFontMetrics fm(font()); + int bestW = 0; + for (const auto &mdl : m_schedules) { + int w = fm.horizontalAdvance(mdl.name); + if (w > bestW) bestW = w; + } + return QSize(bestW, fm.height()); +} + +QRectF PicScheduleShiftItem::boundingRect() const +{ + if (!m_itemImage.isNull()) { + return QRectF(0, 0, m_itemImage.width(), m_itemImage.height()); + } + + int w = m_maxSize.width(); + int h = m_maxSize.height(); + if (w <= 0 || h <= 0) + return QGraphicsTextItem::boundingRect(); + + qreal bw = qreal(w) * qMax(1, m_boldMultiple); + return QRectF(0, 0, bw, qreal(h)); +} + QString PicScheduleShiftItem::findScheduleName(const QTime &time) { if(m_schedules.isEmpty()) diff --git a/scene/PicScheduleShiftItem.h b/scene/PicScheduleShiftItem.h index a553dea..9e188f0 100644 --- a/scene/PicScheduleShiftItem.h +++ b/scene/PicScheduleShiftItem.h @@ -5,6 +5,7 @@ #include #include #include +#include struct ScheduleModel { @@ -45,6 +46,11 @@ private: QVector m_schedules; QTimer m_updateTimer; QString m_currScheduleName; + QSize m_maxSize; // 缓存最长名称的像素宽高 + + virtual QRectF boundingRect() const override; + + QSize calcMaxSize(); }; #endif // PICSCHEDULESHIFTITEM_H diff --git a/scene/ScheduleShiftsEditor.cpp b/scene/ScheduleShiftsEditor.cpp index 00b0159..96c00b2 100644 --- a/scene/ScheduleShiftsEditor.cpp +++ b/scene/ScheduleShiftsEditor.cpp @@ -1,288 +1,288 @@ -#include "ScheduleShiftsEditor.h" -#include "ui_ScheduleShiftsEditor.h" -#include -#include -#include -#include "PicScheduleShiftItem.h" -#include -#include -#include -#include -#include - -ScheduleShiftsEditor::ScheduleShiftsEditor(QWidget *parent) : - QWidget(parent), - ui(new Ui::ScheduleShiftsEditor) -{ - ui->setupUi(this); - - m_generalSettings = new ItemGeneralSettings(); - QGridLayout* layout = new QGridLayout(); - layout->setContentsMargins(0, 0, 0, 0); - layout->setMargin(0); - layout->addWidget(m_generalSettings); - ui->generalSettingsTab->setLayout(layout); - - // 禁用编辑 - ui->tableSchedules->setEditTriggers(QTableWidget::NoEditTriggers); - - ui->tableSchedules->setColumnWidth(0, 50); - ui->tableSchedules->setColumnWidth(1, 100); - ui->tableSchedules->setColumnWidth(2, 340); - ui->tableSchedules->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); - ui->tableSchedules->horizontalHeader()->setVisible(true); - ui->tableSchedules->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - ui->tableSchedules->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - ui->tableSchedules->verticalScrollBar()->scroll(0, 0); - // ui->tableSchedules->setModel(m_viewModel); - - connect(ui->tableSchedules, &QTableWidget::itemSelectionChanged, this, &ScheduleShiftsEditor::onTableSelectionChanged); - connect(ui->tableSchedules, &QTableWidget::currentItemChanged, this, [this](QTableWidgetItem*, QTableWidgetItem*){onTableSelectionChanged();}); - connect(ui->tableSchedules, &QTableWidget::currentCellChanged, this, [this](int, int, int, int){onTableSelectionChanged();}); - connect(ui->LineEditScheduleName, &QLineEdit::textChanged, this, &ScheduleShiftsEditor::btnAddEnbCheck); - connect(ui->timeEdit, &QTimeEdit::timeChanged, this, [this](const QTime&) {btnAddEnbCheck("");}); - - ui->btnAdd->setEnabled(false); - ui->btnRemove->setEnabled(false); - applyStyleSheet(); -} - -ScheduleShiftsEditor::~ScheduleShiftsEditor() -{ - delete ui; -} - -void ScheduleShiftsEditor::setItemModel(QVector schedulesModel, TextItemModel txtModel) -{ - m_generalSettings->setViewModel(txtModel); - m_dataModel = schedulesModel; - - applyDataModel(); - - ui->timeEdit->setTime(QTime(0, 0)); -} - -TextItemModel ScheduleShiftsEditor::textItemModel() -{ - return m_generalSettings->viewModel(); -} - -const QVector& ScheduleShiftsEditor::scheduleModel() const -{ - return m_dataModel; -} - -void ScheduleShiftsEditor::onBtnCloseClicked() -{ - emit rejected(); -} - -void ScheduleShiftsEditor::onBtnAddClicked() -{ - if(m_dataModel.size() >= 24) { - qWarning() << "The schedule shift has already reached the maximum number of 24 schedules."; - return; - } - - auto t = ui->timeEdit->time(); - auto b = std::binary_search(m_dataModel.begin(), m_dataModel.end(), ScheduleModel{t, QString()}); - if(b) { - qWarning() << "The timestamp has already exist. " << t.toString("hh:mm"); - return; - } - - if(ui->LineEditScheduleName->text().isEmpty()) { - qWarning() << "The schedule name is empty."; - return; - } - - ScheduleModel model; - model.startTime = t; - model.name = ui->LineEditScheduleName->text(); - - auto it = std::upper_bound(m_dataModel.begin(), m_dataModel.end(), model); - m_dataModel.insert(it, model); - qDebug() << "Schedule time: " << model.startTime.toString("hh:mm") << ", name: " << model.name << ", has added."; - - applyDataModel(); - ui->LineEditScheduleName->clear(); - ui->btnRemove->setEnabled(false); -} - -void ScheduleShiftsEditor::onBtnRemoveClicked() -{ - if(ui->tableSchedules->currentRow() >= 0 && ui->tableSchedules->currentRow() < m_dataModel.size()) { - m_dataModel.remove(ui->tableSchedules->currentRow()); - applyDataModel(); - } -} - -void ScheduleShiftsEditor::onTableSelectionChanged() -{ - ui->btnRemove->setEnabled(ui->tableSchedules->currentRow() != -1); -} - -void ScheduleShiftsEditor::btnAddEnbCheck(const QString &txt) -{ - Q_UNUSED(txt); - ScheduleModel model {ui->timeEdit->time(), ""}; - ui->btnAdd->setEnabled(!std::binary_search(m_dataModel.begin(), m_dataModel.end(), model) && !ui->LineEditScheduleName->text().isEmpty()); -} - -void ScheduleShiftsEditor::onBtnOkClicked() -{ - emit accepted(); -} - -void ScheduleShiftsEditor::applyDataModel() -{ - auto b = ui->tableSchedules->blockSignals(true); - ui->tableSchedules->clearContents(); - ui->tableSchedules->setRowCount(m_dataModel.size()); - for(int i = 0; i < m_dataModel.size(); ++i) { - QString time = m_dataModel[i].startTime.toString("hh:mm"); - ui->tableSchedules->setItem(i, 0, new QTableWidgetItem(QString::number(i + 1))); - ui->tableSchedules->setItem(i, 1, new QTableWidgetItem(time)); - ui->tableSchedules->setItem(i, 2, new QTableWidgetItem(m_dataModel[i].name)); - } - - ui->tableSchedules->blockSignals(b); - - auto txt = QString::number(24 - m_dataModel.size()); - ui->LabNbRemains->setText(QString::number(24 - m_dataModel.size())); -} - -void ScheduleShiftsEditor::applyStyleSheet() -{ - QString styleSheet = - R"( - /* - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 180px; - height: 90px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - */ - - QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 100px; - height: 50px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - - QTabWidget::pane { - border: 1px solid #dddddd; - background-color: #ffffff; - } - - QTabBar::tab:focus { - outline: none; - } - - QTabBar::tab { - min-width: 90px; - min-height: 45px; - padding: 4px 10px; - margin-right: 4px; - border: 1px solid #dddddd; - border-bottom: none; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - background-color: #5396C1; - color: #ffffff; - } - - QTabWidget::tab-bar { - top: -3px; - left: 10px; - } - - QTabBar::tab:selected { - background-color: #6bb1e0; - color: #ffffff; - box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); - } - )"; - - - // QFile stylesFile(":/styles.qss"); - // QTextStream ts(&stylesFile); - // auto str = ts.readAll(); - // setStyleSheet(str); - // ui->tabWidget->setStyleSheet(str); - // // this->setStyleSheet(styleSheet); -} - -SelectedStyleTimeEdit::SelectedStyleTimeEdit(QWidget *parent) - :QTimeEdit(parent) -{ - lineEdit()->installEventFilter(this); -} - -SelectedStyleTimeEdit::~SelectedStyleTimeEdit() -{ - lineEdit()->removeEventFilter(this); -} - -bool SelectedStyleTimeEdit::eventFilter(QObject *obj, QEvent *event) -{ - if (obj == lineEdit() && event->type() == QEvent::MouseButtonPress) { - // 先让父类处理(这会让内部状态更新) - bool result = QTimeEdit::eventFilter(obj, event); - - // 延迟执行选中,确保currentSection已经更新 - QTimer::singleShot(0, this, [this]() { - QDateTimeEdit::Section section = currentSection(); - setSelectedSection(section); - }); - - return result; - } - - return QTimeEdit::eventFilter(obj, event); -} +#include "ScheduleShiftsEditor.h" +#include "ui_ScheduleShiftsEditor.h" +#include +#include +#include +#include "PicScheduleShiftItem.h" +#include +#include +#include +#include +#include + +ScheduleShiftsEditor::ScheduleShiftsEditor(QWidget *parent) : + QWidget(parent), + ui(new Ui::ScheduleShiftsEditor) +{ + ui->setupUi(this); + + m_generalSettings = new ItemGeneralSettings(); + QGridLayout* layout = new QGridLayout(); + layout->setContentsMargins(0, 0, 0, 0); + layout->setMargin(0); + layout->addWidget(m_generalSettings); + ui->generalSettingsTab->setLayout(layout); + + // 禁用编辑 + ui->tableSchedules->setEditTriggers(QTableWidget::NoEditTriggers); + + ui->tableSchedules->setColumnWidth(0, 50); + ui->tableSchedules->setColumnWidth(1, 100); + ui->tableSchedules->setColumnWidth(2, 340); + ui->tableSchedules->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); + ui->tableSchedules->horizontalHeader()->setVisible(true); + ui->tableSchedules->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->tableSchedules->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->tableSchedules->verticalScrollBar()->scroll(0, 0); + // ui->tableSchedules->setModel(m_viewModel); + + connect(ui->tableSchedules, &QTableWidget::itemSelectionChanged, this, &ScheduleShiftsEditor::onTableSelectionChanged); + connect(ui->tableSchedules, &QTableWidget::currentItemChanged, this, [this](QTableWidgetItem*, QTableWidgetItem*){onTableSelectionChanged();}); + connect(ui->tableSchedules, &QTableWidget::currentCellChanged, this, [this](int, int, int, int){onTableSelectionChanged();}); + connect(ui->LineEditScheduleName, &QLineEdit::textChanged, this, &ScheduleShiftsEditor::btnAddEnbCheck); + connect(ui->timeEdit, &QTimeEdit::timeChanged, this, [this](const QTime&) {btnAddEnbCheck("");}); + + ui->btnAdd->setEnabled(false); + ui->btnRemove->setEnabled(false); + applyStyleSheet(); +} + +ScheduleShiftsEditor::~ScheduleShiftsEditor() +{ + delete ui; +} + +void ScheduleShiftsEditor::setItemModel(QVector schedulesModel, TextItemModel txtModel) +{ + m_generalSettings->setViewModel(txtModel); + m_dataModel = schedulesModel; + + applyDataModel(); + + ui->timeEdit->setTime(QTime(0, 0)); +} + +TextItemModel ScheduleShiftsEditor::textItemModel() +{ + return m_generalSettings->viewModel(); +} + +const QVector& ScheduleShiftsEditor::scheduleModel() const +{ + return m_dataModel; +} + +void ScheduleShiftsEditor::onBtnCloseClicked() +{ + emit rejected(); +} + +void ScheduleShiftsEditor::onBtnAddClicked() +{ + if(m_dataModel.size() >= 24) { + qWarning() << "The schedule shift has already reached the maximum number of 24 schedules."; + return; + } + + auto t = ui->timeEdit->time(); + auto b = std::binary_search(m_dataModel.begin(), m_dataModel.end(), ScheduleModel{t, QString()}); + if(b) { + qWarning() << "The timestamp has already exist. " << t.toString("hh:mm"); + return; + } + + if(ui->LineEditScheduleName->text().isEmpty()) { + qWarning() << "The schedule name is empty."; + return; + } + + ScheduleModel model; + model.startTime = t; + model.name = ui->LineEditScheduleName->text(); + + auto it = std::upper_bound(m_dataModel.begin(), m_dataModel.end(), model); + m_dataModel.insert(it, model); + qDebug() << "Schedule time: " << model.startTime.toString("hh:mm") << ", name: " << model.name << ", has added."; + + applyDataModel(); + ui->LineEditScheduleName->clear(); + ui->btnRemove->setEnabled(false); +} + +void ScheduleShiftsEditor::onBtnRemoveClicked() +{ + if(ui->tableSchedules->currentRow() >= 0 && ui->tableSchedules->currentRow() < m_dataModel.size()) { + m_dataModel.remove(ui->tableSchedules->currentRow()); + applyDataModel(); + } +} + +void ScheduleShiftsEditor::onTableSelectionChanged() +{ + ui->btnRemove->setEnabled(ui->tableSchedules->currentRow() != -1); +} + +void ScheduleShiftsEditor::btnAddEnbCheck(const QString &txt) +{ + Q_UNUSED(txt); + ScheduleModel model {ui->timeEdit->time(), ""}; + ui->btnAdd->setEnabled(!std::binary_search(m_dataModel.begin(), m_dataModel.end(), model) && !ui->LineEditScheduleName->text().isEmpty()); +} + +void ScheduleShiftsEditor::onBtnOkClicked() +{ + emit accepted(); +} + +void ScheduleShiftsEditor::applyDataModel() +{ + auto b = ui->tableSchedules->blockSignals(true); + ui->tableSchedules->clearContents(); + ui->tableSchedules->setRowCount(m_dataModel.size()); + for(int i = 0; i < m_dataModel.size(); ++i) { + QString time = m_dataModel[i].startTime.toString("hh:mm"); + ui->tableSchedules->setItem(i, 0, new QTableWidgetItem(QString::number(i + 1))); + ui->tableSchedules->setItem(i, 1, new QTableWidgetItem(time)); + ui->tableSchedules->setItem(i, 2, new QTableWidgetItem(m_dataModel[i].name)); + } + + ui->tableSchedules->blockSignals(b); + + auto txt = QString::number(24 - m_dataModel.size()); + ui->LabNbRemains->setText(QString::number(24 - m_dataModel.size())); +} + +void ScheduleShiftsEditor::applyStyleSheet() +{ + QString styleSheet = + R"( + /* + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 180px; + height: 90px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + */ + + QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 100px; + height: 50px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + + QTabWidget::pane { + border: 1px solid #dddddd; + background-color: #ffffff; + } + + QTabBar::tab:focus { + outline: none; + } + + QTabBar::tab { + min-width: 90px; + min-height: 45px; + padding: 4px 10px; + margin-right: 4px; + border: 1px solid #dddddd; + border-bottom: none; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + background-color: #5396C1; + color: #ffffff; + } + + QTabWidget::tab-bar { + top: -3px; + left: 10px; + } + + QTabBar::tab:selected { + background-color: #6bb1e0; + color: #ffffff; + box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); + } + )"; + + + // QFile stylesFile(":/styles.qss"); + // QTextStream ts(&stylesFile); + // auto str = ts.readAll(); + // setStyleSheet(str); + // ui->tabWidget->setStyleSheet(str); + // // this->setStyleSheet(styleSheet); +} + +SelectedStyleTimeEdit::SelectedStyleTimeEdit(QWidget *parent) + :QTimeEdit(parent) +{ + lineEdit()->installEventFilter(this); +} + +SelectedStyleTimeEdit::~SelectedStyleTimeEdit() +{ + lineEdit()->removeEventFilter(this); +} + +bool SelectedStyleTimeEdit::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == lineEdit() && event->type() == QEvent::MouseButtonPress) { + // 先让父类处理(这会让内部状态更新) + bool result = QTimeEdit::eventFilter(obj, event); + + // 延迟执行选中,确保currentSection已经更新 + QTimer::singleShot(0, this, [this]() { + QDateTimeEdit::Section section = currentSection(); + setSelectedSection(section); + }); + + return result; + } + + return QTimeEdit::eventFilter(obj, event); +} diff --git a/scene/ScheduleShiftsEditor.h b/scene/ScheduleShiftsEditor.h index d1cadc8..8f2f75c 100644 --- a/scene/ScheduleShiftsEditor.h +++ b/scene/ScheduleShiftsEditor.h @@ -1,64 +1,64 @@ -#ifndef SCHEDULESHIFTSEDITOR_H -#define SCHEDULESHIFTSEDITOR_H - -#include -#include -#include -#include -#include "PicScheduleShiftItem.h" -#include "ItemGeneralSettings.h" - -namespace Ui { -class ScheduleShiftsEditor; -} - -/** - * @brief 重写实现以实现一个自定义的QTimeEdit组件,用于选择时间时,点击时间选择器的部分时,能够选中所选的部分,而不仅仅是移动光标 - */ -class SelectedStyleTimeEdit : public QTimeEdit -{ - Q_OBJECT -public: - SelectedStyleTimeEdit(QWidget *parent = nullptr); - virtual ~SelectedStyleTimeEdit(); -protected: - bool eventFilter(QObject *obj, QEvent *event) override; -}; - -class ScheduleShiftsEditor : public QWidget -{ - Q_OBJECT - -public: - explicit ScheduleShiftsEditor(QWidget *parent = nullptr); - ~ScheduleShiftsEditor(); - - void setItemModel(QVector schedulesModel, TextItemModel txtModel); - - TextItemModel textItemModel(); - - const QVector& scheduleModel() const; - -signals: - void accepted(); - void rejected(); - -private slots: - void onBtnOkClicked(); - void onBtnCloseClicked(); - void onBtnAddClicked(); - void onBtnRemoveClicked(); - void onTableSelectionChanged(); - void btnAddEnbCheck(const QString& txt); - -private: - - void applyDataModel(); - void applyStyleSheet(); - - Ui::ScheduleShiftsEditor *ui; - QVector m_dataModel; - ItemGeneralSettings* m_generalSettings = nullptr; -}; - -#endif // SCHEDULESHIFTSEDITOR_H +#ifndef SCHEDULESHIFTSEDITOR_H +#define SCHEDULESHIFTSEDITOR_H + +#include +#include +#include +#include +#include "PicScheduleShiftItem.h" +#include "ItemGeneralSettings.h" + +namespace Ui { +class ScheduleShiftsEditor; +} + +/** + * @brief 重写实现以实现一个自定义的QTimeEdit组件,用于选择时间时,点击时间选择器的部分时,能够选中所选的部分,而不仅仅是移动光标 + */ +class SelectedStyleTimeEdit : public QTimeEdit +{ + Q_OBJECT +public: + SelectedStyleTimeEdit(QWidget *parent = nullptr); + virtual ~SelectedStyleTimeEdit(); +protected: + bool eventFilter(QObject *obj, QEvent *event) override; +}; + +class ScheduleShiftsEditor : public QWidget +{ + Q_OBJECT + +public: + explicit ScheduleShiftsEditor(QWidget *parent = nullptr); + ~ScheduleShiftsEditor(); + + void setItemModel(QVector schedulesModel, TextItemModel txtModel); + + TextItemModel textItemModel(); + + const QVector& scheduleModel() const; + +signals: + void accepted(); + void rejected(); + +private slots: + void onBtnOkClicked(); + void onBtnCloseClicked(); + void onBtnAddClicked(); + void onBtnRemoveClicked(); + void onTableSelectionChanged(); + void btnAddEnbCheck(const QString& txt); + +private: + + void applyDataModel(); + void applyStyleSheet(); + + Ui::ScheduleShiftsEditor *ui; + QVector m_dataModel; + ItemGeneralSettings* m_generalSettings = nullptr; +}; + +#endif // SCHEDULESHIFTSEDITOR_H diff --git a/scene/ScheduleShiftsEditor.ui b/scene/ScheduleShiftsEditor.ui index 2820f3c..90e6dd6 100644 --- a/scene/ScheduleShiftsEditor.ui +++ b/scene/ScheduleShiftsEditor.ui @@ -1,664 +1,664 @@ - - - ScheduleShiftsEditor - - - - 0 - 0 - 800 - 550 - - - - - 800 - 16777215 - - - - Form - - - - QPushButton#closeBtn, QPushButton#checkBtn{ - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - font-size: 24px; - color: #228B22; - } - QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ - background-color: #D1E9FF; - } - - QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ - background-color: #BAE7FF; - } - - QPushButton { - background-color: #5396C1; - color: #ffffff; - border: 1px solid #000000; - border-radius: 3px; - font-size: 18px; - font-weight:500; - width: 100px; - height: 50px; - } - - QPushButton:hover { - background-color: #5396C1; - } - - QPushButton:disabled { - background-color: #7C828E; - color: #606060; - border-color: #808080; - } - - QTabWidget { - border: 1px solid #dddddd; - background-color: #ffffff; - } - - QTabBar::tab:focus { - outline: none; - } - - QTabBar::tab { - min-width: 90px; - min-height: 45px; - padding: 4px 10px; - margin-right: 4px; - border: 1px solid #dddddd; - border-bottom: none; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - background-color: #5396C1; - color: #ffffff; - } - - QTabWidget::tab-bar { - top: -3px; - left: 10px; - } - - QTabBar::tab:selected { - background-color: #6bb1e0; - color: #ffffff; - box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); - } - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 22 - - - 6 - - - - - - 0 - 0 - - - - - 102 - 52 - - - - - 100 - 40 - - - - QPushButton { - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - min-width: 60px; - min-height: 40px; - font-size: 36px; - font-family: "Ubuntu"; - color: #228B22; - } - QPushButton:hover { - background-color: #D1E9FF; - } - QPushButton:pressed { - background-color: #BAE7FF; - } - - - ✓ - - - - - - - - 0 - 0 - - - - - 102 - 52 - - - - - 100 - 40 - - - - QPushButton { - background-color: #E6F7FF; - border: 1px solid #87CEEB; - border-radius: 4px; - min-width: 60px; - min-height: 40px; - font-size: 36px; - font-family: "Ubuntu"; - color: #228B22; - } - QPushButton:hover { - background-color: #D1E9FF; - } - QPushButton:pressed { - background-color: #BAE7FF; - } - - - ✕ - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - 1 - - - - 整体设置 - - - - - - - - 班时编号 - - - - - 83 - 11 - 91 - 21 - - - - 班时时间 - - - - - - 370 - 11 - 81 - 21 - - - - 班时编号 - - - - - - 370 - 40 - 221 - 31 - - - - - - - 20 - 90 - 491 - 351 - - - - Qt::ScrollBarAlwaysOff - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - 3 - - - false - - - false - - - false - - - 25 - - - - 新建行 - - - - - 新建行 - - - - - - 标号 - - - AlignCenter - - - - - 班时时间 - - - - - 班时编号 - - - - - 1 - - - AlignCenter - - - - - 00:00 - - - - - A - - - - - 2 - - - AlignCenter - - - - - 08:09 - - - - - B - - - - - 3 - - - AlignCenter - - - - - 12:00 - - - - - C - - - - - - - 523 - 91 - 191 - 31 - - - - 可选用的班次时间: - - - - - - 603 - 131 - 61 - 31 - - - - - 15 - - - - background-color: rgb(0, 193, 0); - - - 23 - - - Qt::AlignCenter - - - - - - 530 - 210 - 51 - 31 - - - - ← - - - - - - 530 - 260 - 54 - 31 - - - - → - - - - - - 600 - 210 - 101 - 41 - - - - 添加 - - - - - - 600 - 260 - 101 - 41 - - - - 移除 - - - - - - 80 - 40 - 91 - 31 - - - - QAbstractSpinBox::NoButtons - - - false - - - - 2001 - 1 - 1 - - - - - - - hh:mm - - - true - - - 0 - - - - - - 170 - 40 - 31 - 31 - - - - ← - - - - - - 200 - 40 - 31 - 31 - - - - → - - - - - - - - - - - - - SelectedStyleTimeEdit - QTimeEdit -
scene/ScheduleShiftsEditor.h
-
-
- - - - btnOk - clicked() - ScheduleShiftsEditor - onBtnOkClicked() - - - 642 - 523 - - - 637 - 685 - - - - - btnClose - clicked() - ScheduleShiftsEditor - onBtnCloseClicked() - - - 726 - 518 - - - 743 - 627 - - - - - pushButton - clicked() - timeEdit - stepDown() - - - 196 - 82 - - - 140 - 80 - - - - - pushButton_2 - clicked() - timeEdit - stepUp() - - - 231 - 82 - - - 143 - 81 - - - - - btnAdd - clicked() - ScheduleShiftsEditor - onBtnAddClicked() - - - 652 - 255 - - - 866 - 267 - - - - - btnRemove - clicked() - ScheduleShiftsEditor - onBtnRemoveClicked() - - - 667 - 306 - - - 864 - 297 - - - - - - onBtnOkClicked() - onBtnCloseClicked() - onBtnAddClicked() - onBtnRemoveClicked() - -
+ + + ScheduleShiftsEditor + + + + 0 + 0 + 800 + 550 + + + + + 800 + 16777215 + + + + Form + + + + QPushButton#closeBtn, QPushButton#checkBtn{ + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + QPushButton#closeBtn:hover,QPushButton#checkBtn:hover{ + background-color: #D1E9FF; + } + + QPushButton#closeBtn:pressed,QPushButton#checkBtn:pressed{ + background-color: #BAE7FF; + } + + QPushButton { + background-color: #5396C1; + color: #ffffff; + border: 1px solid #000000; + border-radius: 3px; + font-size: 18px; + font-weight:500; + width: 100px; + height: 50px; + } + + QPushButton:hover { + background-color: #5396C1; + } + + QPushButton:disabled { + background-color: #7C828E; + color: #606060; + border-color: #808080; + } + + QTabWidget { + border: 1px solid #dddddd; + background-color: #ffffff; + } + + QTabBar::tab:focus { + outline: none; + } + + QTabBar::tab { + min-width: 90px; + min-height: 45px; + padding: 4px 10px; + margin-right: 4px; + border: 1px solid #dddddd; + border-bottom: none; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + background-color: #5396C1; + color: #ffffff; + } + + QTabWidget::tab-bar { + top: -3px; + left: 10px; + } + + QTabBar::tab:selected { + background-color: #6bb1e0; + color: #ffffff; + box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); + } + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 22 + + + 6 + + + + + + 0 + 0 + + + + + 102 + 52 + + + + + 100 + 40 + + + + QPushButton { + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + min-width: 60px; + min-height: 40px; + font-size: 36px; + font-family: "Ubuntu"; + color: #228B22; + } + QPushButton:hover { + background-color: #D1E9FF; + } + QPushButton:pressed { + background-color: #BAE7FF; + } + + + ✓ + + + + + + + + 0 + 0 + + + + + 102 + 52 + + + + + 100 + 40 + + + + QPushButton { + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + min-width: 60px; + min-height: 40px; + font-size: 36px; + font-family: "Ubuntu"; + color: #228B22; + } + QPushButton:hover { + background-color: #D1E9FF; + } + QPushButton:pressed { + background-color: #BAE7FF; + } + + + ✕ + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 1 + + + + 整体设置 + + + + + + + + 班时编号 + + + + + 83 + 11 + 91 + 21 + + + + 班时时间 + + + + + + 370 + 11 + 81 + 21 + + + + 班时编号 + + + + + + 370 + 40 + 221 + 31 + + + + + + + 20 + 90 + 491 + 351 + + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + 3 + + + false + + + false + + + false + + + 25 + + + + 新建行 + + + + + 新建行 + + + + + + 标号 + + + AlignCenter + + + + + 班时时间 + + + + + 班时编号 + + + + + 1 + + + AlignCenter + + + + + 00:00 + + + + + A + + + + + 2 + + + AlignCenter + + + + + 08:09 + + + + + B + + + + + 3 + + + AlignCenter + + + + + 12:00 + + + + + C + + + + + + + 523 + 91 + 191 + 31 + + + + 可选用的班次时间: + + + + + + 603 + 131 + 61 + 31 + + + + + 15 + + + + background-color: rgb(0, 193, 0); + + + 23 + + + Qt::AlignCenter + + + + + + 530 + 210 + 51 + 31 + + + + ← + + + + + + 530 + 260 + 54 + 31 + + + + → + + + + + + 600 + 210 + 101 + 41 + + + + 添加 + + + + + + 600 + 260 + 101 + 41 + + + + 移除 + + + + + + 80 + 40 + 91 + 31 + + + + QAbstractSpinBox::NoButtons + + + false + + + + 2001 + 1 + 1 + + + + + + + hh:mm + + + true + + + 0 + + + + + + 170 + 40 + 31 + 31 + + + + ← + + + + + + 200 + 40 + 31 + 31 + + + + → + + + + + + + + + + + + + SelectedStyleTimeEdit + QTimeEdit +
scene/ScheduleShiftsEditor.h
+
+
+ + + + btnOk + clicked() + ScheduleShiftsEditor + onBtnOkClicked() + + + 642 + 523 + + + 637 + 685 + + + + + btnClose + clicked() + ScheduleShiftsEditor + onBtnCloseClicked() + + + 726 + 518 + + + 743 + 627 + + + + + pushButton + clicked() + timeEdit + stepDown() + + + 196 + 82 + + + 140 + 80 + + + + + pushButton_2 + clicked() + timeEdit + stepUp() + + + 231 + 82 + + + 143 + 81 + + + + + btnAdd + clicked() + ScheduleShiftsEditor + onBtnAddClicked() + + + 652 + 255 + + + 866 + 267 + + + + + btnRemove + clicked() + ScheduleShiftsEditor + onBtnRemoveClicked() + + + 667 + 306 + + + 864 + 297 + + + + + + onBtnOkClicked() + onBtnCloseClicked() + onBtnAddClicked() + onBtnRemoveClicked() + +
diff --git a/testprintwidget.cpp b/testprintwidget.cpp index 52d9e70..bc89783 100644 --- a/testprintwidget.cpp +++ b/testprintwidget.cpp @@ -1,1132 +1,1132 @@ -#include "testprintwidget.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "LogInfo.h" -#include "MyInputMethod.h" -#include -#include -#include "scene/PicScheduleShiftItem.h" -#include "scene/PicCounterItem.h" -#include "scene/PicSceneLoader.h" -#include "Printsetting.h" - -#pragma execution_character_set("utf-8") - - -TestPrintWidget::TestPrintWidget(QWidget* parent) - : QWidget(parent) -{ - // 加载UI文件 - ui.setupUi(this); - - // 关联成员变量到UI控件 -// m_TextEdit = ui.m_TextEdit; - m_LineEdit = ui.m_LineEdit; - pViewer = ui.graphicsView; - // 初始化按钮组(互斥) - m_ButtonGroup = new QButtonGroup(this); - m_ButtonGroup->setExclusive(true); - // 添加左侧工具栏按钮到按钮组 - m_ButtonGroup->addButton(ui.btnA, 1); - m_ButtonGroup->addButton(ui.btnBarcode, 2); - m_ButtonGroup->addButton(ui.btn3D, 3); - m_ButtonGroup->addButton(ui.btnDate, 4); - m_ButtonGroup->addButton(ui.btnNum, 5); - m_ButtonGroup->addButton(ui.btnArrow, 6); - // m_ButtonGroup->addButton(ui.btnList, 7); - - dialogSaveFile =new DialogSaveFile(0); - // connect(dialogSaveFile,SIGNAL(returnMainWidget(int)),this,SIGNAL(sendButtonClickedSignal(int))); - - editMode = SCENE; - - m_TextEdit = new QTextEdit(0); - m_TextEdit->setLineWrapMode(QTextEdit::NoWrap); - - // 获取文档并设置边距为0 - m_TextEdit->document()->setDocumentMargin(0); - QFont font; - font.setFamily("Dinkie9"); - font.setPointSizeF(6.75); - m_TextEdit->setFont(font); - - pPicScene = new PicScene(this); - - //edit@12-09 - pPicScene->setSceneRect(QRectF(0,0, 3999, SCENE_MAX_HEIGHT)); - ui.graphicsView->setScene(pPicScene); - ui.graphicsView->centerOn(0,0); - // ui->senceEditOption->bindScene(pPicScene, ui->graphicsView, ui->textEdit); - this->pPicScene->setIsdrawBackground(true); - - connect(pPicScene,&PicScene::selectionChanged,this,[=]() { - getShowSelectItemText(); - }); - - // ========== 连接所有信号槽 ========== - // 左侧工具栏按钮组 - connect(m_ButtonGroup, QOverload::of(&QButtonGroup::buttonClicked), - this, [=](QAbstractButton* btn) { - // 该功能会先弹出子界面 - if (btn == ui.btnBarcode) return; - emit sendButtonClickedSignal(m_ButtonGroup->id(btn)); - }); - - connect(ui.btn3D, &QPushButton::clicked, this, &TestPrintWidget::onBtn3DClicked); - - // 顶部工具栏按钮 - connect(ui.btnSave, &QPushButton::clicked, this, &TestPrintWidget::on_saveButton_pressed); - - connect(ui.btnListConfig, &QPushButton::clicked, [this]() { - - if(m_printSetting) { - m_printSetting->setModel(m_printSettingModel); - } - - emit sendButtonClickedSignal(9); - }); - - connect(ui.btnItemConfig, &QPushButton::clicked, this, &TestPrintWidget::onBtnItemConfigClicked); - - // 顶部工具按钮 - connect(ui.btnCancel, &QPushButton::clicked, [this]() { -// emit sendButtonClickedSignal(13); - on_delButton_pressed(); - }); - - // 控制区第一行按钮 - connect(ui.m_btnLeft_Control1, &QPushButton::clicked, this, &TestPrintWidget::selectPreviousItem); - connect(ui.m_btnRight_Control1, &QPushButton::clicked, this, &TestPrintWidget::selectNextItem); - - // 方向箭头按钮 - connect(ui.m_btnUp, &QPushButton::clicked, [this]() { - // emit sendButtonClickedSignal(16); - on_KeyUp_clicked(); - }); - connect(ui.m_btnLeft_Arrow, &QPushButton::clicked, [this]() { -// emit sendButtonClickedSignal(17); - on_KeyLeft_clicked(); - }); - connect(ui.m_btnRight_Arrow, &QPushButton::clicked, [this]() { -// emit sendButtonClickedSignal(18); - on_KeyRight_clicked(); - }); - connect(ui.m_btnDown, &QPushButton::clicked, [this]() { -// emit sendButtonClickedSignal(19); - on_KeyDown_clicked(); - }); - - connect(ui.btnA,&QPushButton::clicked,[this](){ - on_addButton_pressed(SourceType::TEXT); - m_LineEdit->setFocus(); - }); - - connect(ui.btnDate,&QPushButton::clicked, this, &TestPrintWidget::addDateItem); - - - connect(ui.btnArrow, &QPushButton::clicked, this, &TestPrintWidget::onBtnArrowClicked); - - connect(ui.btnNum,&QPushButton::clicked,[this](){ - // on_addButton_pressed(); - // m_TextEdit->clear(); - // emit sendButtonClickedSignal(17); - - pPicScene->clearSelection(); - - QFont font("Dinkie9"); - int ls = (int)(font.letterSpacing()); - - CounterViewModel vm; - vm.charWidth = 0; - vm.enbCustomCharWidth = false; - vm.counterType = COUNTER_TYPE_1; - vm.digitalNum = 2; - vm.letterSpace = ls; - vm.cnt1Settings = m_printSettingModel.cnt1Settings; - vm.cnt2Settings = m_printSettingModel.cnt2Settings; - emit sig_showEditCounter(vm); - }); - - connect(ui.btnBarcode, &QPushButton::clicked, [this](){ - pPicScene->clearSelection(); - BarcodeViewModel vm; - vm.generalSettingsVM = TextItemModel(); - vm.contentPattern = ""; - vm.counterViewModel = CounterViewModel(); - vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); - vm.type = BARCODE_TYPE_BARCODE; - vm.format.setValue(DlgBarcodeFormatVM()); - vm.counterViewModel.cnt1Settings = m_printSettingModel.cnt1Settings; - vm.counterViewModel.cnt2Settings = m_printSettingModel.cnt2Settings; - showBarcodeEditor(vm); - }); - - // X,Y label connection - connect(pPicScene, &PicScene::focusedItemPosChanged, this, &TestPrintWidget::onSceneFocusedItemPosChanged); - - // 勾选按钮 - connect(ui.m_btnCheck, &QPushButton::clicked, [this]() { - QMessageBox::StandardButton ret = QMessageBox::Ok; - ret = QMessageBox::warning(this, tr("提示"), - tr("是否保存文件?"), - QMessageBox::Ok | QMessageBox::Cancel); - - if (ret == QMessageBox::Ok){ - if(xmlfileName.isEmpty()) { - on_saveButton_pressed(); - } else { - saveFile(); - } - - emit sig_switchWorkFileRequested(xmlfileName); - } - - emit sendButtonClickedSignal(20); - }); - - - imageLoader = new ImageLoader(); - connect(imageLoader, &ImageLoader::accepted, this, &TestPrintWidget::onImageLoaderAccepted); - - itemEditor = new ItemEditor(); - connect(itemEditor, &ItemEditor::accepted, this, &TestPrintWidget::onItemEditorAccepted); - - connect(&m_barcodeEditor, &BarcodeEditor::accepted, this, &TestPrintWidget::slt_BarCodeItemDone); - - m_LineEdit->setProperty("Enter replace enter", true); - - m_LineEdit->installEventFilter(this); - - // 网络通信,暂时屏蔽 - // ui.btnList->hide(); -} - -void TestPrintWidget::bindSysPara(SysPara *sysPara) -{ - this->sysPara = sysPara; -} - -TestPrintWidget::~TestPrintWidget() -{ - m_LineEdit->removeEventFilter(this); - - if(m_TextEdit){ - delete m_TextEdit; - m_TextEdit = nullptr; - } - - if (imageLoader) { - delete imageLoader; - imageLoader = nullptr; -} - -} - -void TestPrintWidget::addDateItem() -{ - pPicScene->clearSelection(); - emit sig_showEditDateTime(DateItemModel::createDefaultReplaceModel(), TextItemModel{}); -} - -QTextEdit* TestPrintWidget::getQTextEdit(){ - return m_TextEdit; -} - -PicScene* TestPrintWidget::getPicScene(){ - return pPicScene; -} - -void TestPrintWidget::on_enlargeButton_pressed() -{ -// qreal sceneHeight = pPicScene->sceneRect().height(); -// qreal viewHeight = 172.0; -// qreal scaleFactor = viewHeight / sceneHeight; -// qDebug() << pViewer->devicePixelRatioFScale(); -// qDebug() << pViewer->devicePixelRatioF(); -// pViewer->scale(scaleFactor, scaleFactor); - - // TODO:: 保留,以后真的要用到放大缩小 -// ((MyView*)pViewer)->ZoomOut(); - auto myView = dynamic_cast(pViewer); - if (myView) myView->ZoomOut(); -} - -void TestPrintWidget::on_addButton_pressed(const SourceType type) -{ - m_LineEdit->setEnabled(true); - m_LineEdit->setText(""); - pPicScene->clearSelection(); - textItem = new PicTextItem(0, 0, type); - pPicScene->addItem(textItem); - textItem->setSource(QString("")); - - QList items = pPicScene->items(); - if(pPicScene->items().count()>1){ - QRectF itemRect= items.at(1)->boundingRect(); - textItem->setPos( items.at(1)->scenePos().x()+itemRect.width()+20, items.at(1)->scenePos().y()); - } - else textItem->setPos(this->pViewer->mapToScene(0,0));//edit@12-07 - -// textItem->setPlainText("Vernon Bach Printer"); -// ui->saveButton->setEnabled(true); - textItem->setPlainText(""); - textItem->setSelected(true); -} - -void TestPrintWidget::onEditItemDone() -{ - const QString content = m_LineEdit->text(); - auto selectedItems = pPicScene->selectedItems(); - foreach (QGraphicsItem *item, selectedItems) - { - PicTextItem* pTextItem = dynamic_cast(item); - if (pTextItem == nullptr) continue; - - if(pTextItem->sourceType() == SourceType::TEXT) { - if(content.isEmpty()) { - pPicScene->removeItem(pTextItem); - delete pTextItem; - continue; - } - - pTextItem->setSource(content); - - if(pPicScene->items().count() == 1) { - pTextItem->setPos(pTextItem->clampItemPos(pTextItem->scenePos())); - qDebug() << "Text item pos: " << pTextItem->pos(); - } - } - } -} - -void TestPrintWidget::getShowSelectItemText() -{ - ui.m_LineEdit->setEnabled(false); - ui.m_LineEdit->setText(""); - - // 选择最后一个被选中的 item,防一手而已,事实上不应允许多选 - // 直接选第一个被选中的 item,也是可以的 - auto selectedItems = pPicScene->selectedItems(); - - PicTextItem* lastSelectedTxtItem = nullptr; - for(auto item : selectedItems) { - PicTextItem* txtItem = dynamic_cast(item); - if (txtItem == nullptr) continue; - - if(txtItem->sourceType() != SourceType::IMAGE && txtItem->sourceType() != SourceType::CODE && txtItem->sourceType() != SourceType::UNKNOWN) { - lastSelectedTxtItem = txtItem; - } - } - - if(!lastSelectedTxtItem) { - return; - } - - // 对于文本item,将它的文本显示到编辑框 - if(lastSelectedTxtItem->sourceType() == SourceType::TEXT) { - ui.m_LineEdit->setEnabled(true); - m_LineEdit->setText(lastSelectedTxtItem->source().toString()); - } - - // pViewer->centerOn(lastSelectedTxtItem); - - QString currItemFontFamily = lastSelectedTxtItem->font().family(); - - QHash fontNameToIndex; - fontNameToIndex["WenQuanYi5"] = 0; - fontNameToIndex["WenQuanYi7"] = 1; - fontNameToIndex["Dinkie9"] = 2; - fontNameToIndex["WenQuanYi12"] = 3; - fontNameToIndex["WenQuanYi16"] = 4; - fontNameToIndex["WenQuanYi24"] = 5; - fontNameToIndex["WenQuanYi32"] = 6; - - if(fontNameToIndex.count(currItemFontFamily) == 0) { - return; - } - - // 锁住信号再设置,避免设置后触发 cbResolution 的信号 - auto b = ui.cbResolution->blockSignals(true); - ui.cbResolution->setCurrentIndex(fontNameToIndex[currItemFontFamily]); - ui.cbResolution->blockSignals(b); - - return; -} - -void TestPrintWidget::on_saveButton_pressed() -{ - pPicScene->clearSelection(); - if(xmlfileName.isEmpty()) - { - qDebug()<<"xml file null"; -#ifdef MYSAVEFILEDLG - dialogSaveFile->refreshListView(SCENE); - dialogSaveFile->setEnterFileName(""); - auto ret = dialogSaveFile->exec(); - - if(ret == QDialog::Accepted) { - auto filename = dialogSaveFile->filename(); - if(!filename.endsWith(".xml",Qt::CaseInsensitive)) - filename += ".xml"; - - saveFile(filename); - xmlfileName = filename; - } -#endif - } - else - { - pPicScene->update(); - saveFile(); - } -} - -void TestPrintWidget::saveFile(const QString& filename) -{ - auto fn = filename.isEmpty() ? xmlfileName : filename; - PicSceneLoader::saveSceneToXmlFile(fn, pPicScene, &m_printSettingModel); -} - -void TestPrintWidget::onSaveASFile(QString filename,bool Flag) -{// use for dialogSaveFile class - qDebug()<viewport()->update(); - unsigned char SpecialVarEnable = 0; - if (sysPara) { - sysPara->devOp->fpgaWr(0xa4b0,(unsigned char *)&SpecialVarEnable,1); - } - - bool ok = PicSceneLoader::loadSceneFromFile(filePath, pPicScene, &m_printSettingModel); - if(!ok) { - qWarning() << "Failed to load file:" << filePath; - return; - } - - xmlfileName = filePath; - - // 将场景中所有项移动,使 pPicScene->itemsBoundingRect() 的左上角对齐到 scene 的 (0,0) - // 计算当前边界并做平移(仅在有偏移时执行) - QRectF bounds = pPicScene->itemsBoundingRect(); - if (!bounds.isNull()) { - qreal dx = -bounds.x(); - qreal dy = -bounds.y(); - if (!qFuzzyIsNull(dx) || !qFuzzyIsNull(dy)) { - const auto items = pPicScene->items(); - for (QGraphicsItem* it : items) { - // 仅移动属于场景根的项,避免重复移动子项 - if (!it) continue; - QPointF oldPos = it->pos(); - it->setPos(oldPos + QPointF(dx, dy)); - } - } - } - - pViewer->centerOn(0, 0); - - if(m_printSetting) { - m_printSetting->setModel(m_printSettingModel); - } - - qDebug() << "xmlfileName:" << xmlfileName; -} - -int TestPrintWidget::checkSelectScene() -{ - QList items=pPicScene->items(); - int index=-1; - //寻找当前选中的图层,没有选中的就不继续处理 - for(int i=0;iisSelected()){ - index=i; - break; - } - } - return index; -} - -PicTextItem *TestPrintWidget::checkSelectItem(PicTextItem* srcItem) -{ - PicTextItem* newItem = nullptr; - switch (srcItem->sourceType()) { - case IMAGE: - newItem = new PicImageItem(0, 0, SourceType::IMAGE); - break; - case DATETIME: - newItem = new PicDateItem(); - break; - case SCHEDULE_SHIFT: - newItem = new PicScheduleShiftItem(); - break; - case CODE: - newItem = new PicCodeItem(0, 0, SourceType::CODE); - break; - case COUNTER: - newItem = new PicCounterItem(); - break; - case TEXT: - case UNKNOWN: - default: - newItem = new PicTextItem(0, 0, srcItem->sourceType()); - break; - } - - return newItem; -} - -bool TestPrintWidget::cacheSelectedLayerForPaste(PicTextItem *srcItem) -{ - if (!srcItem) return false; - - m_copiedSourceType = srcItem->sourceType(); - m_copiedSourceValue = srcItem->source(); - m_copiedHtml = srcItem->toHtml(); - m_copiedSpecialConditions = srcItem->SpecialConditions; - m_copiedCatchCnt1StartValue = srcItem->CatchCnt1StartValue; - m_copiedCatchCnt1CurrValue = srcItem->CatchCnt1CurrValue; - m_copiedPos = srcItem->pos(); - - m_copiedAttrs.clear(); - m_copiedAttrs.append("sourceType", QString::number(srcItem->sourceType())); - if (srcItem->sourceType() != SourceType::UNKNOWN) { - srcItem->saveAttrs(m_copiedAttrs); - } - - if (srcItem->sourceType() == SourceType::COUNTER) { - auto srcCounter = dynamic_cast(srcItem); - if (srcCounter) { - m_copiedCounterType = int(srcCounter->counterType()); - m_copiedCounterDigitalNum = srcCounter->digitalNum(); - m_copiedCounterLetterSpace = srcCounter->letterSpace(); - m_copiedCounterFontFamily = srcCounter->font().family(); - } - } - - pasteTime = 1; - - return true; -} - -void TestPrintWidget::pasteCopiedLayer() -{ - PicTextItem tempSrc(nullptr, nullptr, m_copiedSourceType); - PicTextItem* newItem = checkSelectItem(&tempSrc); - if (!newItem) return; - - pPicScene->clearSelection(); - pPicScene->addItem(newItem); - - if (m_copiedSourceType != SourceType::UNKNOWN) { - newItem->setAttrs(m_copiedAttrs); - } - newItem->setHtml(m_copiedHtml); - - // 某些类型需要显式恢复 source 才会正确重绘(如条码/二维码、图片、文本) - if (m_copiedSourceType == SourceType::TEXT || - m_copiedSourceType == SourceType::IMAGE || - m_copiedSourceType == SourceType::CODE) { - newItem->setSource(m_copiedSourceValue); - } - - // 计数器单独恢复类型和位数,避免仅靠 attrs 导致内容不完整 - if (m_copiedSourceType == SourceType::COUNTER) { - auto dstCounter = dynamic_cast(newItem); - if (dstCounter) { - dstCounter->setCustomFont(m_copiedCounterFontFamily); - dstCounter->setLetterSpace(m_copiedCounterLetterSpace); - dstCounter->setCounter(static_cast(m_copiedCounterType), m_copiedCounterDigitalNum); - } - } - - newItem->SpecialConditions = m_copiedSpecialConditions; - newItem->CatchCnt1StartValue = m_copiedCatchCnt1StartValue; - newItem->CatchCnt1CurrValue = m_copiedCatchCnt1CurrValue; - - auto rect = newItem->boundingRect(); - // 每次粘贴会往右偏移一次 - newItem->setPos(m_copiedPos.x() + rect.width()*pasteTime + 2.0, m_copiedPos.y()); - newItem->setSelected(true); - pasteTime++; -} - -void TestPrintWidget::on_KeyUp_clicked() -{ - moveSelectedItem(Qt::Key_Up); -} - -void TestPrintWidget::on_KeyLeft_clicked() -{ - moveSelectedItem(Qt::Key_Left); -} - -void TestPrintWidget::on_KeyRight_clicked() -{ - moveSelectedItem(Qt::Key_Right); -} - -void TestPrintWidget::on_KeyDown_clicked() -{ - moveSelectedItem(Qt::Key_Down); -} - -void TestPrintWidget::moveSelectedItem(Qt::Key key) -{ - pViewer->setFocus(); - auto selectedItems = pPicScene->selectedItems(); - QGraphicsItem* lastItem = nullptr; - if(selectedItems.size() >= 1) { - lastItem = selectedItems.last(); - } - - if(lastItem) { - lastItem->setFocus(); - } - -#ifndef Q_OS_WIN32 - //QWSServer::sendKeyEvent(0,Qt::Key_Up,Qt::NoModifier,true,false); //向系统发送键盘事件 - MyInputMethod::sendEvent(key, Qt::NoModifier); -#endif -} - -void TestPrintWidget::on_delButton_pressed() -{ - //Scene Test - int index = checkSelectScene(); - if (index < 0) return; - - auto selectedItems = pPicScene->selectedItems(); - foreach (QGraphicsItem *item, selectedItems) { - pPicScene->removeItem(item); - delete item; - break; - } -} - -void TestPrintWidget::setPrintSettingWidget(PrintSetting *wid) -{ - if(!wid) { - qWarning() << "Empty PrintSetting object pointer"; - return; - } - - if(m_printSetting) { - m_printSetting->disconnect(this); - m_printSetting = nullptr; - } - - m_printSetting = wid; - connect(m_printSetting, &PrintSetting::sendButtonClickedSignal, this, [this](int i) { - if(i == 2 && !m_printSetting->isDefaultSettingMode()) { - m_printSettingModel = m_printSetting->model(); - } - }); -} - -bool TestPrintWidget::eventFilter(QObject *watched, QEvent *event) -{ - if(watched == m_LineEdit) { - if(event->type() == QEvent::FocusOut) { - onEditItemDone(); - } - } - - // 其他事件交给父类处理 - return QWidget::eventFilter(watched, event); -} - -void TestPrintWidget::showEvent(QShowEvent *event) -{ - QWidget::showEvent(event); - - pPicScene->update(); - auto sceneRect = pPicScene->sceneRect(); - // qreal sceneHeight = boundingRect.height() > (qreal)(sysPara->para.canvasHeight) ? SCENE_MAX_HEIGHT : (qreal)(sysPara->para.canvasHeight); - int sceneHeight = qMin(int(SCENE_MAX_HEIGHT), (int)(sysPara->para.canvasHeight)); - sceneRect.setHeight((qreal)(sceneHeight)); - pPicScene->setSceneRect(sceneRect); - - // TODO:: 添加代码,只在sceneHeight高度为32时,才显示 字体大小选择框中的 32 dot选项 - - // 以高度为基准 最大化显示场景到 视口 - auto viewportHeight = pViewer->viewport()->height(); - QTransform transform = pViewer->transform(); - auto targetScale = viewportHeight / sceneRect.height(); - double currentScale = transform.m11(); - double relativeScale = targetScale / currentScale; - pViewer->scale(relativeScale, relativeScale); -} - -void TestPrintWidget::onBtn3DClicked() -{ -#if defined(ARCH_AARCH64) - imageLoader->initAndShow(true); -#else - imageLoader->initAndShow(); -#endif -} - -void TestPrintWidget::onImageLoaderAccepted() -{ - QString imgPath = imageLoader->imgPath(); - QString htmlImg = QString("").arg(imgPath); - - pPicScene->clearSelection(); - PicTextItem* item = new PicImageItem(0, 0, SourceType::IMAGE); - item->setHtml(htmlImg); - pPicScene->addItem(item); - auto boundingRect = pPicScene->itemsBoundingRect(); - item->setPos(boundingRect.right(), 0.0); - item->setSelected(true); - item->setSource(imgPath); -} - -void TestPrintWidget::onBtnItemConfigClicked() -{ - auto selectedItems = pPicScene->selectedItems(); - if(selectedItems.size() != 1) { - // TODO:: 事实上不应允许多选 - return; - } - - PicTextItem* item = dynamic_cast(selectedItems[0]); - if (item == nullptr) return; - - if(item->sourceType() == SourceType::COUNTER) { - auto counterItem = dynamic_cast(item); - if (counterItem) { - CounterViewModel vm; - vm.counterType = counterItem->counterType(); - vm.digitalNum = counterItem->digitalNum(); - vm.letterSpace = counterItem->letterSpace(); - vm.enbCustomCharWidth = false; - vm.charWidth = counterItem->charWidth(); - vm.cnt1Settings = m_printSettingModel.cnt1Settings; - vm.cnt2Settings = m_printSettingModel.cnt2Settings; - emit sig_showEditCounter(vm); - } - return; - } - - // 如果是日期类型,则唤醒DateVarSet - if(item->data(0).toString() == "datetime") { - // @see TestPrintWidget::addDateItem - emit sendButtonClickedSignal(16); - return; - } - - // TODO:: 先给文字提供配置功能 - if(item->sourceType() == SourceType::UNKNOWN) - return; - - if(item->sourceType() == SourceType::DATETIME) { - // @see TestPrintWidget::addDateTimeItem - auto dateTimeItem = dynamic_cast(item); - if (dateTimeItem) - emit sig_showEditDateTime(dateTimeItem->model(), dateTimeItem->textItemModel()); - return; - } - - if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { - auto scheduleItem = dynamic_cast(item); - if (scheduleItem) - emit sig_showScheduleShiftsEditor(scheduleItem->schedules(), scheduleItem->textItemModel()); - return; - } - - if (item->sourceType() == SourceType::CODE) { - auto codeItem = dynamic_cast(item); - if(!codeItem) - return; - - auto vm = codeItem->barcodeViewModel(); - vm.counterViewModel.cnt1Settings = m_printSettingModel.cnt1Settings; - vm.counterViewModel.cnt2Settings = m_printSettingModel.cnt2Settings; - showBarcodeEditor(vm); - return; - } - - itemEditor->edit(item); -#if defined(ARCH_AARCH64) - itemEditor->showFullScreen(); -#else - itemEditor->setWindowModality(Qt::WindowModal); - itemEditor->show(); -#endif; -} - -void TestPrintWidget::onItemEditorAccepted() -{ - if(!itemEditor || !itemEditor->currentItem()) return; - - if(itemEditor->currentItem()->source() == SourceType::UNKNOWN) { - // Nothing.... - } - else { - PicTextItem* textItem = itemEditor->currentItem(); - textItem->applyModify(); - } -} - -void TestPrintWidget::onSceneFocusedItemPosChanged(QPoint p) -{ - ui.m_lblX->setText(QString::asprintf("X:%d", p.x())); - ui.m_lblY->setText(QString::asprintf("Y:%d", p.y())); -} - -void TestPrintWidget::on_newfileButton_pressed() -{ -// if (maybeSave()) { - pPicScene->clear(); - pViewer->viewport()->update(); - xmlfileName = ""; - - if (sysPara) { - m_printSettingModel = PrintSettingModel::defPrintSettingModel(); - if(m_printSetting) - m_printSetting->setModel(m_printSettingModel); - } - - emit sig_currentFileChanged(); -} - -void TestPrintWidget::slt_BarCodeItemDone() -{ - auto vm = m_barcodeEditor.viewModel(); - - if(vm.contentPattern.isEmpty()) { - qInfo() << "Empty content pattern, the barcode will not be generated."; - return; - } - - PicCodeItem* codeItem = nullptr; - - // 如果当前选中了一个条形码或二维码,则更新其内容,然后直接返回 - bool flag = false; - auto selectedItem = pPicScene->selectedItems(); - for(auto item : selectedItem) { - codeItem = dynamic_cast(item); - if(codeItem) - break; - } - - if(!codeItem) { - // 添加条形码或二维码 - pPicScene->clearSelection(); - codeItem = new PicCodeItem(0, 0, SourceType::CODE); - auto boundingRect = pPicScene->itemsBoundingRect(); - pPicScene->addItem(codeItem); - codeItem->setPos(boundingRect.right(), 0.0); - } - - codeItem->setBarcodeViewModel(vm); - codeItem->setSelected(true); - - m_printSettingModel.cnt1Settings = vm.counterViewModel.cnt1Settings; - m_printSettingModel.cnt2Settings = vm.counterViewModel.cnt2Settings; - - if(m_printSetting) - m_printSetting->setModel(m_printSettingModel); -} - -QGraphicsItem* findClosestItemToViewCenter(QGraphicsView* view) -{ - if (!view || !view->scene()) - return nullptr; - - // 1. 获取视口中心点(视口坐标)并映射到场景坐标 - QPoint viewCenter = view->viewport()->rect().center(); - QPointF sceneCenter = view->mapToScene(viewCenter); - - // 2. 获取场景中所有项 - QList items = view->scene()->items(); - - // 3. 寻找最近项 - QGraphicsItem* closestItem = nullptr; - qreal minDistSq = std::numeric_limits::max(); - - for (QGraphicsItem* item : items) { - // 可选项:跳过不可见项(根据需求决定) - if (!item->isVisible()) continue; - - // 计算项的场景位置到中心点的平方距离(避免开方,性能更好) - QPointF itemPos = item->scenePos(); - qreal dx = itemPos.x() - sceneCenter.x(); - qreal dy = itemPos.y() - sceneCenter.y(); - qreal distSq = dx * dx + dy * dy; - - if (distSq < minDistSq) { - minDistSq = distSq; - closestItem = item; - } - } - - return closestItem; -} - -void TestPrintWidget::selectItemByDirection(bool forward) -{ - auto selectedItems = pPicScene->selectedItems(); - - // 如果当前没有选中项,且场景中存在项,则选择距离当前视图中心的项 - if(selectedItems.isEmpty() && !pPicScene->items().isEmpty()) { - auto closestItem = findClosestItemToViewCenter(pViewer); - if(closestItem) { - closestItem->setSelected(true); - return; - } - } - - if(selectedItems.isEmpty()) - return; - - auto currItem = selectedItems.last(); - if(!currItem) - return; - - auto items = pPicScene->items(); - if(items.size() <= 1) - return; - - std::sort(items.begin(), items.end(), [](QGraphicsItem* a, QGraphicsItem* b) { - return a->pos().x() < b->pos().x(); - }); - - auto it = std::find(items.begin(), items.end(), currItem); - if(it == items.end()) - it = items.begin(); - - QGraphicsItem* nextItem = nullptr; - if(forward) { - nextItem = (it + 1 == items.end()) ? items.first() : *(it + 1); - } else { - nextItem = (it == items.begin()) ? items.last() : *(it - 1); - } - - if(nextItem) { - pPicScene->clearSelection(); - nextItem->setSelected(true); - pViewer->centerOn(nextItem); - } -} - -void TestPrintWidget::selectNextItem() -{ - selectItemByDirection(true); -} - -void TestPrintWidget::selectPreviousItem() -{ - selectItemByDirection(false); -} - -void TestPrintWidget::on_cbResolution_currentIndexChanged(int index) -{ - constexpr char* IdxToFontFamily[] = {"WenQuanYi5", - "WenQuanYi7", - "Dinkie9", - "WenQuanYi12", - "WenQuanYi16", - "WenQuanYi24", - "WenQuanYi32"}; - if(index < 0 || int(ARRAY_SIZE(IdxToFontFamily)) <= index) { - - qWarning() << "Invalied cbResolution index: " << index; - - index = std::max(std::min(int(ARRAY_SIZE(IdxToFontFamily) - 1), index), 0); - auto b = ui.cbResolution->blockSignals(true); - ui.cbResolution->setCurrentIndex(index); - ui.cbResolution->blockSignals(b); - } - - auto selectedItems = pPicScene->selectedItems(); - qInfo() << "Selected font family: " << IdxToFontFamily[index]; - qInfo() << "Selected items count: " << selectedItems.size(); - - for(auto i : selectedItems) { - PicTextItem* item = dynamic_cast(i); -// if(item->sourceType() == SourceType::COUNTER && IdxToFontFamily[index] == QString("Dinkie9")) { -// item->setCustomFont("WenQuanYi12"); -// continue; -// } - - if(item) { - item->setCustomFont(IdxToFontFamily[index]); - qInfo() << "Item " << item->sourceType() << " set font to " << IdxToFontFamily[index]; - } - } -} - -void TestPrintWidget::addDateTimeItem(const DateItemModel &model, const TextItemModel& textModel) -{ - // 如果当前选中了一个日期时间item,则直接设置模型 - auto selectItems = pPicScene->selectedItems(); - if(selectItems.size() == 1) { - auto item = dynamic_cast(selectItems[0]); - if(item->sourceType() == SourceType::DATETIME) { - auto dateTimeItem = dynamic_cast(item); - dateTimeItem->setTextItemModel(textModel); - dateTimeItem->setModel(model); - return; - } - } - - QString htmlStr = QString("

"); - pPicScene->clearSelection(); - PicDateItem* item = new PicDateItem(); - item->setHtml(htmlStr); - pPicScene->addItem(item); - auto boundingRect = pPicScene->itemsBoundingRect(); - item->setPos(boundingRect.right(), 0.0); - item->setSelected(true); - item->setModel(model); -} - -void TestPrintWidget::addScheduleShiftsItem(QVector schedules, TextItemModel txtModel) -{ - // 如果当前选中了一个日期时间item,则直接设置模型 - auto selectItems = pPicScene->selectedItems(); - if(selectItems.size() == 1) { - auto item = dynamic_cast(selectItems[0]); - if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { - auto scheduleItem = dynamic_cast(item); - scheduleItem->setSchedules(schedules); - scheduleItem->setTextItemModel(txtModel); - return; - } - } - - QString htmlStr = QString("

"); - - pPicScene->clearSelection(); - PicScheduleShiftItem* item = new PicScheduleShiftItem(); - item->setHtml(htmlStr); - pPicScene->addItem(item); - auto boundingRect = pPicScene->itemsBoundingRect(); - item->setPos(boundingRect.right(), 0.0); - item->setSelected(true); - item->setSchedules(std::move(schedules)); - item->setTextItemModel(txtModel); -} - -void TestPrintWidget::addCounterItem(CounterViewModel vm, QSharedPointer f) -{ - int letterSpace = vm.letterSpace; - - // 查找当前被选中的 item, 如果存在且类型为计数器,则修改这个计数器而不是新建 - QList items=pPicScene->items(); - int index=0; - bool flag = false; - for(int i=0;iisSelected()){ - flag = true; - break; - } - } - - QFont font; - - if(flag) { - auto item = dynamic_cast(items[index]); - - font = f ? *f : item->font(); - font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpace); - - if(item->sourceType() == SourceType::COUNTER) { - auto counterItem = dynamic_cast(item); - counterItem->setCounter(static_cast(vm.counterType), vm.digitalNum); - counterItem->setLetterSpace(int(font.letterSpacing())); - if(vm.enbCustomCharWidth) { - counterItem->setCharWidth(vm.charWidth); - } - - m_printSettingModel.cnt1Settings = vm.cnt1Settings; - m_printSettingModel.cnt2Settings = vm.cnt2Settings; - } - return; - } - - font = f ? *f : QFont("WenQuanYi12"); - font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpace); - - // 创建新的计数器item - pPicScene->clearSelection(); - PicCounterItem* item = new PicCounterItem(); - pPicScene->addItem(item); - auto boundingRect = pPicScene->itemsBoundingRect(); - item->setPos(boundingRect.right(), 0.0); - item->setSelected(true); - item->setLetterSpace(static_cast(font.letterSpacing())); - // item->setCustomFont(font.family()); - item->setCounter(static_cast(vm.counterType), vm.digitalNum); - if(vm.enbCustomCharWidth) { - item->setCharWidth(vm.charWidth); - } - - m_printSettingModel.cnt1Settings = vm.cnt1Settings; - m_printSettingModel.cnt2Settings = vm.cnt2Settings; -} - -QString TestPrintWidget::currentFile() -{ - return xmlfileName; -} - -void TestPrintWidget::showBarcodeEditor(const BarcodeViewModel& vm) -{ -#if defined(ARCH_AARCH64) - m_barcodeEditor.setWindowState(Qt::WindowFullScreen); -#endif - - m_barcodeEditor.bindViewModel(vm); - m_barcodeEditor.setWindowModality(Qt::WindowModal); - m_barcodeEditor.show(); -} - -void TestPrintWidget::onBtnArrowClicked() -{ - pPicScene->clearSelection(); - emit sig_showScheduleShiftsEditor(QVector(), TextItemModel()); -} - -void TestPrintWidget::on_btn_copy_clicked() -{ - int index = checkSelectScene(); - if (index < 0) { - qInfo() << "Not selected any item."; - return; - } - - PicTextItem* srcItem = dynamic_cast(pPicScene->items().at(index)); - if (!srcItem) { - qWarning() << "Cannot cast item type to correct type"; - return; - } - - cacheSelectedLayerForPaste(srcItem); -} - -void TestPrintWidget::on_btn_paste_clicked() -{ - pasteCopiedLayer(); +#include "testprintwidget.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "LogInfo.h" +#include "MyInputMethod.h" +#include +#include +#include "scene/PicScheduleShiftItem.h" +#include "scene/PicCounterItem.h" +#include "scene/PicSceneLoader.h" +#include "Printsetting.h" + +#pragma execution_character_set("utf-8") + + +TestPrintWidget::TestPrintWidget(QWidget* parent) + : QWidget(parent) +{ + // 加载UI文件 + ui.setupUi(this); + + // 关联成员变量到UI控件 +// m_TextEdit = ui.m_TextEdit; + m_LineEdit = ui.m_LineEdit; + pViewer = ui.graphicsView; + // 初始化按钮组(互斥) + m_ButtonGroup = new QButtonGroup(this); + m_ButtonGroup->setExclusive(true); + // 添加左侧工具栏按钮到按钮组 + m_ButtonGroup->addButton(ui.btnA, 1); + m_ButtonGroup->addButton(ui.btnBarcode, 2); + m_ButtonGroup->addButton(ui.btn3D, 3); + m_ButtonGroup->addButton(ui.btnDate, 4); + m_ButtonGroup->addButton(ui.btnNum, 5); + m_ButtonGroup->addButton(ui.btnArrow, 6); + // m_ButtonGroup->addButton(ui.btnList, 7); + + dialogSaveFile =new DialogSaveFile(0); + // connect(dialogSaveFile,SIGNAL(returnMainWidget(int)),this,SIGNAL(sendButtonClickedSignal(int))); + + editMode = SCENE; + + m_TextEdit = new QTextEdit(0); + m_TextEdit->setLineWrapMode(QTextEdit::NoWrap); + + // 获取文档并设置边距为0 + m_TextEdit->document()->setDocumentMargin(0); + QFont font; + font.setFamily("Dinkie9"); + font.setPointSizeF(6.75); + m_TextEdit->setFont(font); + + pPicScene = new PicScene(this); + + //edit@12-09 + pPicScene->setSceneRect(QRectF(0,0, 3999, SCENE_MAX_HEIGHT)); + ui.graphicsView->setScene(pPicScene); + ui.graphicsView->centerOn(0,0); + // ui->senceEditOption->bindScene(pPicScene, ui->graphicsView, ui->textEdit); + this->pPicScene->setIsdrawBackground(true); + + connect(pPicScene,&PicScene::selectionChanged,this,[=]() { + getShowSelectItemText(); + }); + + // ========== 连接所有信号槽 ========== + // 左侧工具栏按钮组 + connect(m_ButtonGroup, QOverload::of(&QButtonGroup::buttonClicked), + this, [=](QAbstractButton* btn) { + // 该功能会先弹出子界面 + if (btn == ui.btnBarcode) return; + emit sendButtonClickedSignal(m_ButtonGroup->id(btn)); + }); + + connect(ui.btn3D, &QPushButton::clicked, this, &TestPrintWidget::onBtn3DClicked); + + // 顶部工具栏按钮 + connect(ui.btnSave, &QPushButton::clicked, this, &TestPrintWidget::on_saveButton_pressed); + + connect(ui.btnListConfig, &QPushButton::clicked, [this]() { + + if(m_printSetting) { + m_printSetting->setModel(m_printSettingModel); + } + + emit sendButtonClickedSignal(9); + }); + + connect(ui.btnItemConfig, &QPushButton::clicked, this, &TestPrintWidget::onBtnItemConfigClicked); + + // 顶部工具按钮 + connect(ui.btnCancel, &QPushButton::clicked, [this]() { +// emit sendButtonClickedSignal(13); + on_delButton_pressed(); + }); + + // 控制区第一行按钮 + connect(ui.m_btnLeft_Control1, &QPushButton::clicked, this, &TestPrintWidget::selectPreviousItem); + connect(ui.m_btnRight_Control1, &QPushButton::clicked, this, &TestPrintWidget::selectNextItem); + + // 方向箭头按钮 + connect(ui.m_btnUp, &QPushButton::clicked, [this]() { + // emit sendButtonClickedSignal(16); + on_KeyUp_clicked(); + }); + connect(ui.m_btnLeft_Arrow, &QPushButton::clicked, [this]() { +// emit sendButtonClickedSignal(17); + on_KeyLeft_clicked(); + }); + connect(ui.m_btnRight_Arrow, &QPushButton::clicked, [this]() { +// emit sendButtonClickedSignal(18); + on_KeyRight_clicked(); + }); + connect(ui.m_btnDown, &QPushButton::clicked, [this]() { +// emit sendButtonClickedSignal(19); + on_KeyDown_clicked(); + }); + + connect(ui.btnA,&QPushButton::clicked,[this](){ + on_addButton_pressed(SourceType::TEXT); + m_LineEdit->setFocus(); + }); + + connect(ui.btnDate,&QPushButton::clicked, this, &TestPrintWidget::addDateItem); + + + connect(ui.btnArrow, &QPushButton::clicked, this, &TestPrintWidget::onBtnArrowClicked); + + connect(ui.btnNum,&QPushButton::clicked,[this](){ + // on_addButton_pressed(); + // m_TextEdit->clear(); + // emit sendButtonClickedSignal(17); + + pPicScene->clearSelection(); + + QFont font("Dinkie9"); + int ls = (int)(font.letterSpacing()); + + CounterViewModel vm; + vm.charWidth = 0; + vm.enbCustomCharWidth = false; + vm.counterType = COUNTER_TYPE_1; + vm.digitalNum = 2; + vm.letterSpace = ls; + vm.cnt1Settings = m_printSettingModel.cnt1Settings; + vm.cnt2Settings = m_printSettingModel.cnt2Settings; + emit sig_showEditCounter(vm); + }); + + connect(ui.btnBarcode, &QPushButton::clicked, [this](){ + pPicScene->clearSelection(); + BarcodeViewModel vm; + vm.generalSettingsVM = TextItemModel(); + vm.contentPattern = ""; + vm.counterViewModel = CounterViewModel(); + vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); + vm.type = BARCODE_TYPE_BARCODE; + vm.format.setValue(DlgBarcodeFormatVM()); + vm.counterViewModel.cnt1Settings = m_printSettingModel.cnt1Settings; + vm.counterViewModel.cnt2Settings = m_printSettingModel.cnt2Settings; + showBarcodeEditor(vm); + }); + + // X,Y label connection + connect(pPicScene, &PicScene::focusedItemPosChanged, this, &TestPrintWidget::onSceneFocusedItemPosChanged); + + // 勾选按钮 + connect(ui.m_btnCheck, &QPushButton::clicked, [this]() { + QMessageBox::StandardButton ret = QMessageBox::Ok; + ret = QMessageBox::warning(this, tr("提示"), + tr("是否保存文件?"), + QMessageBox::Ok | QMessageBox::Cancel); + + if (ret == QMessageBox::Ok){ + if(xmlfileName.isEmpty()) { + on_saveButton_pressed(); + } else { + saveFile(); + } + + emit sig_switchWorkFileRequested(xmlfileName); + } + + emit sendButtonClickedSignal(20); + }); + + + imageLoader = new ImageLoader(); + connect(imageLoader, &ImageLoader::accepted, this, &TestPrintWidget::onImageLoaderAccepted); + + itemEditor = new ItemEditor(); + connect(itemEditor, &ItemEditor::accepted, this, &TestPrintWidget::onItemEditorAccepted); + + connect(&m_barcodeEditor, &BarcodeEditor::accepted, this, &TestPrintWidget::slt_BarCodeItemDone); + + m_LineEdit->setProperty("Enter replace enter", true); + + m_LineEdit->installEventFilter(this); + + // 网络通信,暂时屏蔽 + // ui.btnList->hide(); +} + +void TestPrintWidget::bindSysPara(SysPara *sysPara) +{ + this->sysPara = sysPara; +} + +TestPrintWidget::~TestPrintWidget() +{ + m_LineEdit->removeEventFilter(this); + + if(m_TextEdit){ + delete m_TextEdit; + m_TextEdit = nullptr; + } + + if (imageLoader) { + delete imageLoader; + imageLoader = nullptr; +} + +} + +void TestPrintWidget::addDateItem() +{ + pPicScene->clearSelection(); + emit sig_showEditDateTime(DateItemModel::createDefaultReplaceModel(), TextItemModel{}); +} + +QTextEdit* TestPrintWidget::getQTextEdit(){ + return m_TextEdit; +} + +PicScene* TestPrintWidget::getPicScene(){ + return pPicScene; +} + +void TestPrintWidget::on_enlargeButton_pressed() +{ +// qreal sceneHeight = pPicScene->sceneRect().height(); +// qreal viewHeight = 172.0; +// qreal scaleFactor = viewHeight / sceneHeight; +// qDebug() << pViewer->devicePixelRatioFScale(); +// qDebug() << pViewer->devicePixelRatioF(); +// pViewer->scale(scaleFactor, scaleFactor); + + // TODO:: 保留,以后真的要用到放大缩小 +// ((MyView*)pViewer)->ZoomOut(); + auto myView = dynamic_cast(pViewer); + if (myView) myView->ZoomOut(); +} + +void TestPrintWidget::on_addButton_pressed(const SourceType type) +{ + m_LineEdit->setEnabled(true); + m_LineEdit->setText(""); + pPicScene->clearSelection(); + textItem = new PicTextItem(0, 0, type); + pPicScene->addItem(textItem); + textItem->setSource(QString("")); + + QList items = pPicScene->items(); + if(pPicScene->items().count()>1){ + QRectF itemRect= items.at(1)->boundingRect(); + textItem->setPos( items.at(1)->scenePos().x()+itemRect.width()+20, items.at(1)->scenePos().y()); + } + else textItem->setPos(this->pViewer->mapToScene(0,0));//edit@12-07 + +// textItem->setPlainText("Vernon Bach Printer"); +// ui->saveButton->setEnabled(true); + textItem->setPlainText(""); + textItem->setSelected(true); +} + +void TestPrintWidget::onEditItemDone() +{ + const QString content = m_LineEdit->text(); + auto selectedItems = pPicScene->selectedItems(); + foreach (QGraphicsItem *item, selectedItems) + { + PicTextItem* pTextItem = dynamic_cast(item); + if (pTextItem == nullptr) continue; + + if(pTextItem->sourceType() == SourceType::TEXT) { + if(content.isEmpty()) { + pPicScene->removeItem(pTextItem); + delete pTextItem; + continue; + } + + pTextItem->setSource(content); + + if(pPicScene->items().count() == 1) { + pTextItem->setPos(pTextItem->clampItemPos(pTextItem->scenePos())); + qDebug() << "Text item pos: " << pTextItem->pos(); + } + } + } +} + +void TestPrintWidget::getShowSelectItemText() +{ + ui.m_LineEdit->setEnabled(false); + ui.m_LineEdit->setText(""); + + // 选择最后一个被选中的 item,防一手而已,事实上不应允许多选 + // 直接选第一个被选中的 item,也是可以的 + auto selectedItems = pPicScene->selectedItems(); + + PicTextItem* lastSelectedTxtItem = nullptr; + for(auto item : selectedItems) { + PicTextItem* txtItem = dynamic_cast(item); + if (txtItem == nullptr) continue; + + if(txtItem->sourceType() != SourceType::IMAGE && txtItem->sourceType() != SourceType::CODE && txtItem->sourceType() != SourceType::UNKNOWN) { + lastSelectedTxtItem = txtItem; + } + } + + if(!lastSelectedTxtItem) { + return; + } + + // 对于文本item,将它的文本显示到编辑框 + if(lastSelectedTxtItem->sourceType() == SourceType::TEXT) { + ui.m_LineEdit->setEnabled(true); + m_LineEdit->setText(lastSelectedTxtItem->source().toString()); + } + + // pViewer->centerOn(lastSelectedTxtItem); + + QString currItemFontFamily = lastSelectedTxtItem->font().family(); + + QHash fontNameToIndex; + fontNameToIndex["WenQuanYi5"] = 0; + fontNameToIndex["WenQuanYi7"] = 1; + fontNameToIndex["Dinkie9"] = 2; + fontNameToIndex["WenQuanYi12"] = 3; + fontNameToIndex["WenQuanYi16"] = 4; + fontNameToIndex["WenQuanYi24"] = 5; + fontNameToIndex["WenQuanYi32"] = 6; + + if(fontNameToIndex.count(currItemFontFamily) == 0) { + return; + } + + // 锁住信号再设置,避免设置后触发 cbResolution 的信号 + auto b = ui.cbResolution->blockSignals(true); + ui.cbResolution->setCurrentIndex(fontNameToIndex[currItemFontFamily]); + ui.cbResolution->blockSignals(b); + + return; +} + +void TestPrintWidget::on_saveButton_pressed() +{ + pPicScene->clearSelection(); + if(xmlfileName.isEmpty()) + { + qDebug()<<"xml file null"; +#ifdef MYSAVEFILEDLG + dialogSaveFile->refreshListView(SCENE); + dialogSaveFile->setEnterFileName(""); + auto ret = dialogSaveFile->exec(); + + if(ret == QDialog::Accepted) { + auto filename = dialogSaveFile->filename(); + if(!filename.endsWith(".xml",Qt::CaseInsensitive)) + filename += ".xml"; + + saveFile(filename); + xmlfileName = filename; + } +#endif + } + else + { + pPicScene->update(); + saveFile(); + } +} + +void TestPrintWidget::saveFile(const QString& filename) +{ + auto fn = filename.isEmpty() ? xmlfileName : filename; + PicSceneLoader::saveSceneToXmlFile(fn, pPicScene, &m_printSettingModel); +} + +void TestPrintWidget::onSaveASFile(QString filename,bool Flag) +{// use for dialogSaveFile class + qDebug()<viewport()->update(); + unsigned char SpecialVarEnable = 0; + if (sysPara) { + sysPara->devOp->fpgaWr(0xa4b0,(unsigned char *)&SpecialVarEnable,1); + } + + bool ok = PicSceneLoader::loadSceneFromFile(filePath, pPicScene, &m_printSettingModel); + if(!ok) { + qWarning() << "Failed to load file:" << filePath; + return; + } + + xmlfileName = filePath; + + // 将场景中所有项移动,使 pPicScene->itemsBoundingRect() 的左上角对齐到 scene 的 (0,0) + // 计算当前边界并做平移(仅在有偏移时执行) + QRectF bounds = pPicScene->itemsBoundingRect(); + if (!bounds.isNull()) { + qreal dx = -bounds.x(); + qreal dy = -bounds.y(); + if (!qFuzzyIsNull(dx) || !qFuzzyIsNull(dy)) { + const auto items = pPicScene->items(); + for (QGraphicsItem* it : items) { + // 仅移动属于场景根的项,避免重复移动子项 + if (!it) continue; + QPointF oldPos = it->pos(); + it->setPos(oldPos + QPointF(dx, dy)); + } + } + } + + pViewer->centerOn(0, 0); + + if(m_printSetting) { + m_printSetting->setModel(m_printSettingModel); + } + + qDebug() << "xmlfileName:" << xmlfileName; +} + +int TestPrintWidget::checkSelectScene() +{ + QList items=pPicScene->items(); + int index=-1; + //寻找当前选中的图层,没有选中的就不继续处理 + for(int i=0;iisSelected()){ + index=i; + break; + } + } + return index; +} + +PicTextItem *TestPrintWidget::checkSelectItem(PicTextItem* srcItem) +{ + PicTextItem* newItem = nullptr; + switch (srcItem->sourceType()) { + case IMAGE: + newItem = new PicImageItem(0, 0, SourceType::IMAGE); + break; + case DATETIME: + newItem = new PicDateItem(); + break; + case SCHEDULE_SHIFT: + newItem = new PicScheduleShiftItem(); + break; + case CODE: + newItem = new PicCodeItem(0, 0, SourceType::CODE); + break; + case COUNTER: + newItem = new PicCounterItem(); + break; + case TEXT: + case UNKNOWN: + default: + newItem = new PicTextItem(0, 0, srcItem->sourceType()); + break; + } + + return newItem; +} + +bool TestPrintWidget::cacheSelectedLayerForPaste(PicTextItem *srcItem) +{ + if (!srcItem) return false; + + m_copiedSourceType = srcItem->sourceType(); + m_copiedSourceValue = srcItem->source(); + m_copiedHtml = srcItem->toHtml(); + m_copiedSpecialConditions = srcItem->SpecialConditions; + m_copiedCatchCnt1StartValue = srcItem->CatchCnt1StartValue; + m_copiedCatchCnt1CurrValue = srcItem->CatchCnt1CurrValue; + m_copiedPos = srcItem->pos(); + + m_copiedAttrs.clear(); + m_copiedAttrs.append("sourceType", QString::number(srcItem->sourceType())); + if (srcItem->sourceType() != SourceType::UNKNOWN) { + srcItem->saveAttrs(m_copiedAttrs); + } + + if (srcItem->sourceType() == SourceType::COUNTER) { + auto srcCounter = dynamic_cast(srcItem); + if (srcCounter) { + m_copiedCounterType = int(srcCounter->counterType()); + m_copiedCounterDigitalNum = srcCounter->digitalNum(); + m_copiedCounterLetterSpace = srcCounter->letterSpace(); + m_copiedCounterFontFamily = srcCounter->font().family(); + } + } + + pasteTime = 1; + + return true; +} + +void TestPrintWidget::pasteCopiedLayer() +{ + PicTextItem tempSrc(nullptr, nullptr, m_copiedSourceType); + PicTextItem* newItem = checkSelectItem(&tempSrc); + if (!newItem) return; + + pPicScene->clearSelection(); + pPicScene->addItem(newItem); + + if (m_copiedSourceType != SourceType::UNKNOWN) { + newItem->setAttrs(m_copiedAttrs); + } + newItem->setHtml(m_copiedHtml); + + // 某些类型需要显式恢复 source 才会正确重绘(如条码/二维码、图片、文本) + if (m_copiedSourceType == SourceType::TEXT || + m_copiedSourceType == SourceType::IMAGE || + m_copiedSourceType == SourceType::CODE) { + newItem->setSource(m_copiedSourceValue); + } + + // 计数器单独恢复类型和位数,避免仅靠 attrs 导致内容不完整 + if (m_copiedSourceType == SourceType::COUNTER) { + auto dstCounter = dynamic_cast(newItem); + if (dstCounter) { + dstCounter->setCustomFont(m_copiedCounterFontFamily); + dstCounter->setLetterSpace(m_copiedCounterLetterSpace); + dstCounter->setCounter(static_cast(m_copiedCounterType), m_copiedCounterDigitalNum); + } + } + + newItem->SpecialConditions = m_copiedSpecialConditions; + newItem->CatchCnt1StartValue = m_copiedCatchCnt1StartValue; + newItem->CatchCnt1CurrValue = m_copiedCatchCnt1CurrValue; + + auto rect = newItem->boundingRect(); + // 每次粘贴会往右偏移一次 + newItem->setPos(m_copiedPos.x() + rect.width()*pasteTime + 2.0, m_copiedPos.y()); + newItem->setSelected(true); + pasteTime++; +} + +void TestPrintWidget::on_KeyUp_clicked() +{ + moveSelectedItem(Qt::Key_Up); +} + +void TestPrintWidget::on_KeyLeft_clicked() +{ + moveSelectedItem(Qt::Key_Left); +} + +void TestPrintWidget::on_KeyRight_clicked() +{ + moveSelectedItem(Qt::Key_Right); +} + +void TestPrintWidget::on_KeyDown_clicked() +{ + moveSelectedItem(Qt::Key_Down); +} + +void TestPrintWidget::moveSelectedItem(Qt::Key key) +{ + pViewer->setFocus(); + auto selectedItems = pPicScene->selectedItems(); + QGraphicsItem* lastItem = nullptr; + if(selectedItems.size() >= 1) { + lastItem = selectedItems.last(); + } + + if(lastItem) { + lastItem->setFocus(); + } + +#ifndef Q_OS_WIN32 + //QWSServer::sendKeyEvent(0,Qt::Key_Up,Qt::NoModifier,true,false); //向系统发送键盘事件 + MyInputMethod::sendEvent(key, Qt::NoModifier); +#endif +} + +void TestPrintWidget::on_delButton_pressed() +{ + //Scene Test + int index = checkSelectScene(); + if (index < 0) return; + + auto selectedItems = pPicScene->selectedItems(); + foreach (QGraphicsItem *item, selectedItems) { + pPicScene->removeItem(item); + delete item; + break; + } +} + +void TestPrintWidget::setPrintSettingWidget(PrintSetting *wid) +{ + if(!wid) { + qWarning() << "Empty PrintSetting object pointer"; + return; + } + + if(m_printSetting) { + m_printSetting->disconnect(this); + m_printSetting = nullptr; + } + + m_printSetting = wid; + connect(m_printSetting, &PrintSetting::sendButtonClickedSignal, this, [this](int i) { + if(i == 2 && !m_printSetting->isDefaultSettingMode()) { + m_printSettingModel = m_printSetting->model(); + } + }); +} + +bool TestPrintWidget::eventFilter(QObject *watched, QEvent *event) +{ + if(watched == m_LineEdit) { + if(event->type() == QEvent::FocusOut) { + onEditItemDone(); + } + } + + // 其他事件交给父类处理 + return QWidget::eventFilter(watched, event); +} + +void TestPrintWidget::showEvent(QShowEvent *event) +{ + QWidget::showEvent(event); + + pPicScene->update(); + auto sceneRect = pPicScene->sceneRect(); + // qreal sceneHeight = boundingRect.height() > (qreal)(sysPara->para.canvasHeight) ? SCENE_MAX_HEIGHT : (qreal)(sysPara->para.canvasHeight); + int sceneHeight = qMin(int(SCENE_MAX_HEIGHT), (int)(sysPara->para.canvasHeight)); + sceneRect.setHeight((qreal)(sceneHeight)); + pPicScene->setSceneRect(sceneRect); + + // TODO:: 添加代码,只在sceneHeight高度为32时,才显示 字体大小选择框中的 32 dot选项 + + // 以高度为基准 最大化显示场景到 视口 + auto viewportHeight = pViewer->viewport()->height(); + QTransform transform = pViewer->transform(); + auto targetScale = viewportHeight / sceneRect.height(); + double currentScale = transform.m11(); + double relativeScale = targetScale / currentScale; + pViewer->scale(relativeScale, relativeScale); +} + +void TestPrintWidget::onBtn3DClicked() +{ +#if defined(ARCH_AARCH64) + imageLoader->initAndShow(true); +#else + imageLoader->initAndShow(); +#endif +} + +void TestPrintWidget::onImageLoaderAccepted() +{ + QString imgPath = imageLoader->imgPath(); + QString htmlImg = QString("").arg(imgPath); + + pPicScene->clearSelection(); + PicTextItem* item = new PicImageItem(0, 0, SourceType::IMAGE); + item->setHtml(htmlImg); + pPicScene->addItem(item); + auto boundingRect = pPicScene->itemsBoundingRect(); + item->setPos(boundingRect.right(), 0.0); + item->setSelected(true); + item->setSource(imgPath); +} + +void TestPrintWidget::onBtnItemConfigClicked() +{ + auto selectedItems = pPicScene->selectedItems(); + if(selectedItems.size() != 1) { + // TODO:: 事实上不应允许多选 + return; + } + + PicTextItem* item = dynamic_cast(selectedItems[0]); + if (item == nullptr) return; + + if(item->sourceType() == SourceType::COUNTER) { + auto counterItem = dynamic_cast(item); + if (counterItem) { + CounterViewModel vm; + vm.counterType = counterItem->counterType(); + vm.digitalNum = counterItem->digitalNum(); + vm.letterSpace = counterItem->letterSpace(); + vm.enbCustomCharWidth = false; + vm.charWidth = counterItem->charWidth(); + vm.cnt1Settings = m_printSettingModel.cnt1Settings; + vm.cnt2Settings = m_printSettingModel.cnt2Settings; + emit sig_showEditCounter(vm); + } + return; + } + + // 如果是日期类型,则唤醒DateVarSet + if(item->data(0).toString() == "datetime") { + // @see TestPrintWidget::addDateItem + emit sendButtonClickedSignal(16); + return; + } + + // TODO:: 先给文字提供配置功能 + if(item->sourceType() == SourceType::UNKNOWN) + return; + + if(item->sourceType() == SourceType::DATETIME) { + // @see TestPrintWidget::addDateTimeItem + auto dateTimeItem = dynamic_cast(item); + if (dateTimeItem) + emit sig_showEditDateTime(dateTimeItem->model(), dateTimeItem->textItemModel()); + return; + } + + if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { + auto scheduleItem = dynamic_cast(item); + if (scheduleItem) + emit sig_showScheduleShiftsEditor(scheduleItem->schedules(), scheduleItem->textItemModel()); + return; + } + + if (item->sourceType() == SourceType::CODE) { + auto codeItem = dynamic_cast(item); + if(!codeItem) + return; + + auto vm = codeItem->barcodeViewModel(); + vm.counterViewModel.cnt1Settings = m_printSettingModel.cnt1Settings; + vm.counterViewModel.cnt2Settings = m_printSettingModel.cnt2Settings; + showBarcodeEditor(vm); + return; + } + + itemEditor->edit(item); +#if defined(ARCH_AARCH64) + itemEditor->showFullScreen(); +#else + itemEditor->setWindowModality(Qt::WindowModal); + itemEditor->show(); +#endif; +} + +void TestPrintWidget::onItemEditorAccepted() +{ + if(!itemEditor || !itemEditor->currentItem()) return; + + if(itemEditor->currentItem()->source() == SourceType::UNKNOWN) { + // Nothing.... + } + else { + PicTextItem* textItem = itemEditor->currentItem(); + textItem->applyModify(); + } +} + +void TestPrintWidget::onSceneFocusedItemPosChanged(QPoint p) +{ + ui.m_lblX->setText(QString::asprintf("X:%d", p.x())); + ui.m_lblY->setText(QString::asprintf("Y:%d", p.y())); +} + +void TestPrintWidget::on_newfileButton_pressed() +{ +// if (maybeSave()) { + pPicScene->clear(); + pViewer->viewport()->update(); + xmlfileName = ""; + + if (sysPara) { + m_printSettingModel = PrintSettingModel::defPrintSettingModel(); + if(m_printSetting) + m_printSetting->setModel(m_printSettingModel); + } + + emit sig_currentFileChanged(); +} + +void TestPrintWidget::slt_BarCodeItemDone() +{ + auto vm = m_barcodeEditor.viewModel(); + + if(vm.contentPattern.isEmpty()) { + qInfo() << "Empty content pattern, the barcode will not be generated."; + return; + } + + PicCodeItem* codeItem = nullptr; + + // 如果当前选中了一个条形码或二维码,则更新其内容,然后直接返回 + bool flag = false; + auto selectedItem = pPicScene->selectedItems(); + for(auto item : selectedItem) { + codeItem = dynamic_cast(item); + if(codeItem) + break; + } + + if(!codeItem) { + // 添加条形码或二维码 + pPicScene->clearSelection(); + codeItem = new PicCodeItem(0, 0, SourceType::CODE); + auto boundingRect = pPicScene->itemsBoundingRect(); + pPicScene->addItem(codeItem); + codeItem->setPos(boundingRect.right(), 0.0); + } + + codeItem->setBarcodeViewModel(vm); + codeItem->setSelected(true); + + m_printSettingModel.cnt1Settings = vm.counterViewModel.cnt1Settings; + m_printSettingModel.cnt2Settings = vm.counterViewModel.cnt2Settings; + + if(m_printSetting) + m_printSetting->setModel(m_printSettingModel); +} + +QGraphicsItem* findClosestItemToViewCenter(QGraphicsView* view) +{ + if (!view || !view->scene()) + return nullptr; + + // 1. 获取视口中心点(视口坐标)并映射到场景坐标 + QPoint viewCenter = view->viewport()->rect().center(); + QPointF sceneCenter = view->mapToScene(viewCenter); + + // 2. 获取场景中所有项 + QList items = view->scene()->items(); + + // 3. 寻找最近项 + QGraphicsItem* closestItem = nullptr; + qreal minDistSq = std::numeric_limits::max(); + + for (QGraphicsItem* item : items) { + // 可选项:跳过不可见项(根据需求决定) + if (!item->isVisible()) continue; + + // 计算项的场景位置到中心点的平方距离(避免开方,性能更好) + QPointF itemPos = item->scenePos(); + qreal dx = itemPos.x() - sceneCenter.x(); + qreal dy = itemPos.y() - sceneCenter.y(); + qreal distSq = dx * dx + dy * dy; + + if (distSq < minDistSq) { + minDistSq = distSq; + closestItem = item; + } + } + + return closestItem; +} + +void TestPrintWidget::selectItemByDirection(bool forward) +{ + auto selectedItems = pPicScene->selectedItems(); + + // 如果当前没有选中项,且场景中存在项,则选择距离当前视图中心的项 + if(selectedItems.isEmpty() && !pPicScene->items().isEmpty()) { + auto closestItem = findClosestItemToViewCenter(pViewer); + if(closestItem) { + closestItem->setSelected(true); + return; + } + } + + if(selectedItems.isEmpty()) + return; + + auto currItem = selectedItems.last(); + if(!currItem) + return; + + auto items = pPicScene->items(); + if(items.size() <= 1) + return; + + std::sort(items.begin(), items.end(), [](QGraphicsItem* a, QGraphicsItem* b) { + return a->pos().x() < b->pos().x(); + }); + + auto it = std::find(items.begin(), items.end(), currItem); + if(it == items.end()) + it = items.begin(); + + QGraphicsItem* nextItem = nullptr; + if(forward) { + nextItem = (it + 1 == items.end()) ? items.first() : *(it + 1); + } else { + nextItem = (it == items.begin()) ? items.last() : *(it - 1); + } + + if(nextItem) { + pPicScene->clearSelection(); + nextItem->setSelected(true); + pViewer->centerOn(nextItem); + } +} + +void TestPrintWidget::selectNextItem() +{ + selectItemByDirection(true); +} + +void TestPrintWidget::selectPreviousItem() +{ + selectItemByDirection(false); +} + +void TestPrintWidget::on_cbResolution_currentIndexChanged(int index) +{ + constexpr char* IdxToFontFamily[] = {"WenQuanYi5", + "WenQuanYi7", + "Dinkie9", + "WenQuanYi12", + "WenQuanYi16", + "WenQuanYi24", + "WenQuanYi32"}; + if(index < 0 || int(ARRAY_SIZE(IdxToFontFamily)) <= index) { + + qWarning() << "Invalied cbResolution index: " << index; + + index = std::max(std::min(int(ARRAY_SIZE(IdxToFontFamily) - 1), index), 0); + auto b = ui.cbResolution->blockSignals(true); + ui.cbResolution->setCurrentIndex(index); + ui.cbResolution->blockSignals(b); + } + + auto selectedItems = pPicScene->selectedItems(); + qInfo() << "Selected font family: " << IdxToFontFamily[index]; + qInfo() << "Selected items count: " << selectedItems.size(); + + for(auto i : selectedItems) { + PicTextItem* item = dynamic_cast(i); +// if(item->sourceType() == SourceType::COUNTER && IdxToFontFamily[index] == QString("Dinkie9")) { +// item->setCustomFont("WenQuanYi12"); +// continue; +// } + + if(item) { + item->setCustomFont(IdxToFontFamily[index]); + qInfo() << "Item " << item->sourceType() << " set font to " << IdxToFontFamily[index]; + } + } +} + +void TestPrintWidget::addDateTimeItem(const DateItemModel &model, const TextItemModel& textModel) +{ + // 如果当前选中了一个日期时间item,则直接设置模型 + auto selectItems = pPicScene->selectedItems(); + if(selectItems.size() == 1) { + auto item = dynamic_cast(selectItems[0]); + if(item->sourceType() == SourceType::DATETIME) { + auto dateTimeItem = dynamic_cast(item); + dateTimeItem->setTextItemModel(textModel); + dateTimeItem->setModel(model); + return; + } + } + + QString htmlStr = QString("

"); + pPicScene->clearSelection(); + PicDateItem* item = new PicDateItem(); + item->setHtml(htmlStr); + pPicScene->addItem(item); + auto boundingRect = pPicScene->itemsBoundingRect(); + item->setPos(boundingRect.right(), 0.0); + item->setSelected(true); + item->setModel(model); +} + +void TestPrintWidget::addScheduleShiftsItem(QVector schedules, TextItemModel txtModel) +{ + // 如果当前选中了一个日期时间item,则直接设置模型 + auto selectItems = pPicScene->selectedItems(); + if(selectItems.size() == 1) { + auto item = dynamic_cast(selectItems[0]); + if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { + auto scheduleItem = dynamic_cast(item); + scheduleItem->setSchedules(schedules); + scheduleItem->setTextItemModel(txtModel); + return; + } + } + + QString htmlStr = QString("

"); + + pPicScene->clearSelection(); + PicScheduleShiftItem* item = new PicScheduleShiftItem(); + item->setHtml(htmlStr); + pPicScene->addItem(item); + auto boundingRect = pPicScene->itemsBoundingRect(); + item->setPos(boundingRect.right(), 0.0); + item->setSelected(true); + item->setSchedules(std::move(schedules)); + item->setTextItemModel(txtModel); +} + +void TestPrintWidget::addCounterItem(CounterViewModel vm, QSharedPointer f) +{ + int letterSpace = vm.letterSpace; + + // 查找当前被选中的 item, 如果存在且类型为计数器,则修改这个计数器而不是新建 + QList items=pPicScene->items(); + int index=0; + bool flag = false; + for(int i=0;iisSelected()){ + flag = true; + break; + } + } + + QFont font; + + if(flag) { + auto item = dynamic_cast(items[index]); + + font = f ? *f : item->font(); + font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpace); + + if(item->sourceType() == SourceType::COUNTER) { + auto counterItem = dynamic_cast(item); + counterItem->setCounter(static_cast(vm.counterType), vm.digitalNum); + counterItem->setLetterSpace(int(font.letterSpacing())); + if(vm.enbCustomCharWidth) { + counterItem->setCharWidth(vm.charWidth); + } + + m_printSettingModel.cnt1Settings = vm.cnt1Settings; + m_printSettingModel.cnt2Settings = vm.cnt2Settings; + } + return; + } + + font = f ? *f : QFont("WenQuanYi12"); + font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpace); + + // 创建新的计数器item + pPicScene->clearSelection(); + PicCounterItem* item = new PicCounterItem(); + pPicScene->addItem(item); + auto boundingRect = pPicScene->itemsBoundingRect(); + item->setPos(boundingRect.right(), 0.0); + item->setSelected(true); + item->setLetterSpace(static_cast(font.letterSpacing())); + // item->setCustomFont(font.family()); + item->setCounter(static_cast(vm.counterType), vm.digitalNum); + if(vm.enbCustomCharWidth) { + item->setCharWidth(vm.charWidth); + } + + m_printSettingModel.cnt1Settings = vm.cnt1Settings; + m_printSettingModel.cnt2Settings = vm.cnt2Settings; +} + +QString TestPrintWidget::currentFile() +{ + return xmlfileName; +} + +void TestPrintWidget::showBarcodeEditor(const BarcodeViewModel& vm) +{ +#if defined(ARCH_AARCH64) + m_barcodeEditor.setWindowState(Qt::WindowFullScreen); +#endif + + m_barcodeEditor.bindViewModel(vm); + m_barcodeEditor.setWindowModality(Qt::WindowModal); + m_barcodeEditor.show(); +} + +void TestPrintWidget::onBtnArrowClicked() +{ + pPicScene->clearSelection(); + emit sig_showScheduleShiftsEditor(QVector(), TextItemModel()); +} + +void TestPrintWidget::on_btn_copy_clicked() +{ + int index = checkSelectScene(); + if (index < 0) { + qInfo() << "Not selected any item."; + return; + } + + PicTextItem* srcItem = dynamic_cast(pPicScene->items().at(index)); + if (!srcItem) { + qWarning() << "Cannot cast item type to correct type"; + return; + } + + cacheSelectedLayerForPaste(srcItem); +} + +void TestPrintWidget::on_btn_paste_clicked() +{ + pasteCopiedLayer(); } \ No newline at end of file diff --git a/testprintwidget.h b/testprintwidget.h index fa9f4f9..5d05b2c 100644 --- a/testprintwidget.h +++ b/testprintwidget.h @@ -1,187 +1,187 @@ -#ifndef TESTPRINTWIDGET_H -#define TESTPRINTWIDGET_H - -#include -#include -#include -#include -#include -#include "DialogSaveFile.h" -#include -// 包含UI自动生成的头文件 -#include "ui_TestPrintWidget.h" - -#include "scene/picscene.h" - -#include "ImageLoader.h" -#include "ItemEditor.h" -#include "scene/PicDateItem.h" -#include "scene/PicImageItem.h" -#include "scene/ScheduleShiftsEditor.h" -#include "scene/PicCounterItem.h" -#include - -#include "selectcodedlg.h" -#include -#include "CounterVarSet.h" -#include "scene/BarcodeEditor.h" -#include "Printsetting.h" - -class TestPrintWidget : public QWidget -{ - Q_OBJECT - -public: - TestPrintWidget(QWidget* parent = nullptr); - ~TestPrintWidget(); - - QTextEdit* getQTextEdit(); - PicScene* getPicScene(); - - void getShowSelectItemText(); - void bindSysPara(SysPara *sysPara); - - void saveFile(const QString& filename = nullptr); - - void on_KeyUp_clicked(); - void on_KeyLeft_clicked(); - void on_KeyRight_clicked(); - void on_KeyDown_clicked(); - - void on_delButton_pressed(); - - void setPrintSettingWidget(PrintSetting* wid); - - void addDateTimeItem(const DateItemModel& model, const TextItemModel& textModel); - - void addScheduleShiftsItem(QVector schedules, TextItemModel txtModel); - - void addCounterItem(CounterViewModel vm, QSharedPointer font = nullptr); - - QString currentFile(); - -public slots: - void on_enlargeButton_pressed(); - void on_addButton_pressed(const SourceType type = SourceType::UNKNOWN); - void onEditItemDone(); - - void on_saveButton_pressed(); - void onSaveASFile(QString filename,bool Flag); - - void openWorkFile(QString filePath); - - void on_newfileButton_pressed(); - - void slt_BarCodeItemDone(); - - void selectNextItem(); - - void selectPreviousItem(); - - void showBarcodeEditor(const BarcodeViewModel& vm); - -protected: - // 重写事件过滤器 - bool eventFilter(QObject *watched, QEvent *event) override; - - void showEvent(QShowEvent* event) override; - -private slots: - void onSceneFocusedItemPosChanged(QPoint p); - void onBtn3DClicked(); - void onImageLoaderAccepted(); - void onBtnItemConfigClicked(); - void onItemEditorAccepted(); - - void on_cbResolution_currentIndexChanged(int index); - - void addDateItem(); - - void onBtnArrowClicked(); - - // 复制 - void on_btn_copy_clicked(); - - // 粘贴 - void on_btn_paste_clicked(); - -private: - // UI对象 - Ui::TestPrintWidget ui; - SysPara* sysPara = nullptr; - - // 控件成员变量(关联UI控件) - QButtonGroup* m_ButtonGroup; - QTextEdit* m_TextEdit = nullptr; - QLineEdit* m_LineEdit; - - /** - * @brief 对 on_KeyUp_clicked 等按键事件的简便包装 - * - * @param key - */ - void moveSelectedItem(Qt::Key key); - - PicScene *pPicScene = nullptr; //保存Item的Html - // PicScene *pPicScene2; // 保存Item的Html对应的图片 解决场景模式文本无法放大的问题 - QGraphicsView *pViewer = nullptr; - PicTextItem *textItem = nullptr; - - PrintSetting* m_printSetting = nullptr; - - PrintSettingModel m_printSettingModel; - - QString xmlfileName; - DialogSaveFile *dialogSaveFile; - - ImageLoader *imageLoader = nullptr; - ItemEditor * itemEditor = nullptr; - BarcodeEditor m_barcodeEditor; - - int editMode; - //寻找当前选中的图层,没有选中的就不继续处理 - int checkSelectScene(); - - // 复制 - int pasteTime = 1; - SourceType m_copiedSourceType = SourceType::UNKNOWN; - QVariant m_copiedSourceValue; - QXmlStreamAttributes m_copiedAttrs; - QString m_copiedHtml; - bool m_copiedSpecialConditions = false; - int m_copiedCatchCnt1StartValue = -1; - int m_copiedCatchCnt1CurrValue = -1; - int m_copiedCounterType = COUNTER_TYPE_1; - int m_copiedCounterDigitalNum = 1; - int m_copiedCounterLetterSpace = 1; - QString m_copiedCounterFontFamily = "Dinkie9"; - QPointF m_copiedPos; - //判断要复制什么图层,添加该图层 - PicTextItem* checkSelectItem(PicTextItem* srcItem); - - //保存复制内容 - bool cacheSelectedLayerForPaste(PicTextItem* srcItem); - - //粘贴 - void pasteCopiedLayer(); - - void selectItemByDirection(bool forward); - -signals: - - void sendButtonClickedSignal(int index); - - void sig_showEditCounter(CounterViewModel viewModel); - - // 用户请求打开日期类型图元编辑窗口时发送此信号 - void sig_showEditDateTime(DateItemModel dateModel, TextItemModel textModel); - - void sig_showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel); - - // 点击确定后,更新打印内容 - void sig_switchWorkFileRequested(const QString& filename); - - void sig_currentFileChanged(); -}; - -#endif // TESTPRINTWIDGET_H +#ifndef TESTPRINTWIDGET_H +#define TESTPRINTWIDGET_H + +#include +#include +#include +#include +#include +#include "DialogSaveFile.h" +#include +// 包含UI自动生成的头文件 +#include "ui_TestPrintWidget.h" + +#include "scene/picscene.h" + +#include "ImageLoader.h" +#include "ItemEditor.h" +#include "scene/PicDateItem.h" +#include "scene/PicImageItem.h" +#include "scene/ScheduleShiftsEditor.h" +#include "scene/PicCounterItem.h" +#include + +#include "selectcodedlg.h" +#include +#include "CounterVarSet.h" +#include "scene/BarcodeEditor.h" +#include "Printsetting.h" + +class TestPrintWidget : public QWidget +{ + Q_OBJECT + +public: + TestPrintWidget(QWidget* parent = nullptr); + ~TestPrintWidget(); + + QTextEdit* getQTextEdit(); + PicScene* getPicScene(); + + void getShowSelectItemText(); + void bindSysPara(SysPara *sysPara); + + void saveFile(const QString& filename = nullptr); + + void on_KeyUp_clicked(); + void on_KeyLeft_clicked(); + void on_KeyRight_clicked(); + void on_KeyDown_clicked(); + + void on_delButton_pressed(); + + void setPrintSettingWidget(PrintSetting* wid); + + void addDateTimeItem(const DateItemModel& model, const TextItemModel& textModel); + + void addScheduleShiftsItem(QVector schedules, TextItemModel txtModel); + + void addCounterItem(CounterViewModel vm, QSharedPointer font = nullptr); + + QString currentFile(); + +public slots: + void on_enlargeButton_pressed(); + void on_addButton_pressed(const SourceType type = SourceType::UNKNOWN); + void onEditItemDone(); + + void on_saveButton_pressed(); + void onSaveASFile(QString filename,bool Flag); + + void openWorkFile(QString filePath); + + void on_newfileButton_pressed(); + + void slt_BarCodeItemDone(); + + void selectNextItem(); + + void selectPreviousItem(); + + void showBarcodeEditor(const BarcodeViewModel& vm); + +protected: + // 重写事件过滤器 + bool eventFilter(QObject *watched, QEvent *event) override; + + void showEvent(QShowEvent* event) override; + +private slots: + void onSceneFocusedItemPosChanged(QPoint p); + void onBtn3DClicked(); + void onImageLoaderAccepted(); + void onBtnItemConfigClicked(); + void onItemEditorAccepted(); + + void on_cbResolution_currentIndexChanged(int index); + + void addDateItem(); + + void onBtnArrowClicked(); + + // 复制 + void on_btn_copy_clicked(); + + // 粘贴 + void on_btn_paste_clicked(); + +private: + // UI对象 + Ui::TestPrintWidget ui; + SysPara* sysPara = nullptr; + + // 控件成员变量(关联UI控件) + QButtonGroup* m_ButtonGroup; + QTextEdit* m_TextEdit = nullptr; + QLineEdit* m_LineEdit; + + /** + * @brief 对 on_KeyUp_clicked 等按键事件的简便包装 + * + * @param key + */ + void moveSelectedItem(Qt::Key key); + + PicScene *pPicScene = nullptr; //保存Item的Html + // PicScene *pPicScene2; // 保存Item的Html对应的图片 解决场景模式文本无法放大的问题 + QGraphicsView *pViewer = nullptr; + PicTextItem *textItem = nullptr; + + PrintSetting* m_printSetting = nullptr; + + PrintSettingModel m_printSettingModel; + + QString xmlfileName; + DialogSaveFile *dialogSaveFile; + + ImageLoader *imageLoader = nullptr; + ItemEditor * itemEditor = nullptr; + BarcodeEditor m_barcodeEditor; + + int editMode; + //寻找当前选中的图层,没有选中的就不继续处理 + int checkSelectScene(); + + // 复制 + int pasteTime = 1; + SourceType m_copiedSourceType = SourceType::UNKNOWN; + QVariant m_copiedSourceValue; + QXmlStreamAttributes m_copiedAttrs; + QString m_copiedHtml; + bool m_copiedSpecialConditions = false; + int m_copiedCatchCnt1StartValue = -1; + int m_copiedCatchCnt1CurrValue = -1; + int m_copiedCounterType = COUNTER_TYPE_1; + int m_copiedCounterDigitalNum = 1; + int m_copiedCounterLetterSpace = 1; + QString m_copiedCounterFontFamily = "Dinkie9"; + QPointF m_copiedPos; + //判断要复制什么图层,添加该图层 + PicTextItem* checkSelectItem(PicTextItem* srcItem); + + //保存复制内容 + bool cacheSelectedLayerForPaste(PicTextItem* srcItem); + + //粘贴 + void pasteCopiedLayer(); + + void selectItemByDirection(bool forward); + +signals: + + void sendButtonClickedSignal(int index); + + void sig_showEditCounter(CounterViewModel viewModel); + + // 用户请求打开日期类型图元编辑窗口时发送此信号 + void sig_showEditDateTime(DateItemModel dateModel, TextItemModel textModel); + + void sig_showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel); + + // 点击确定后,更新打印内容 + void sig_switchWorkFileRequested(const QString& filename); + + void sig_currentFileChanged(); +}; + +#endif // TESTPRINTWIDGET_H