⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 morseparser.cpp

📁 Lakey这是一个免费的CW练习/收/发软件
💻 CPP
字号:
#include "StdAfx.h"
#include "morseparser.h"

CMorseParser::CMorseParser(const MORSECODE* pMorseList, int nCount, int nMaxShortCount, IParseEventListener* pListener)
{
	m_pMorseCodeTree = new MORSECODETREENODE;
	m_pMorseCodeTree->pMorseCode = NULL;
	m_pMorseCodeTree->pDi = m_pMorseCodeTree->pDa = NULL;

	for (int i = 0; i < nCount; ++i)
	{
		AddNode(m_pMorseCodeTree, pMorseList + i, ((pMorseList + i)->nMask + 1) >> 1);
	}

	m_pCurrNode = m_pMorseCodeTree;
	m_nLastState = 0;
	m_nStateCount = 0;

	m_nMaxShortCount = nMaxShortCount;
	m_pParseEventListener = pListener;
	m_nStep = 1;
}

CMorseParser::~CMorseParser(void)
{
	ReleaseAllNodes(m_pMorseCodeTree);
}

void CMorseParser::AddNode(MORSECODETREENODE* pCurrNode, const MORSECODE* pMorseCode, int nMcWin)
{
	if (!nMcWin)
	{
		// position it!
		pCurrNode->pMorseCode = pMorseCode;
	}
	else
	{
		if (pMorseCode->nMorseCode & nMcWin)
		{
			if (!pCurrNode->pDi)
			{
				pCurrNode->pDi = new MORSECODETREENODE;
				pCurrNode->pDi->pMorseCode = NULL;
				pCurrNode->pDi->pDi = pCurrNode->pDi->pDa = NULL;
			}

			AddNode(pCurrNode->pDi, pMorseCode, nMcWin >> 1);
		}
		else
		{
			if (!pCurrNode->pDa)
			{
				pCurrNode->pDa = new MORSECODETREENODE;
				pCurrNode->pDa->pMorseCode = NULL;
				pCurrNode->pDa->pDi = pCurrNode->pDa->pDa = NULL;
			}

			AddNode(pCurrNode->pDa, pMorseCode, nMcWin >> 1);
		}
	}
}

void CMorseParser::ReleaseAllNodes(MORSECODETREENODE* pRoot)
{
	if (!pRoot)
	{
		ReleaseAllNodes(pRoot->pDi);
		ReleaseAllNodes(pRoot->pDa);
		delete pRoot;
	}
}

void CMorseParser::Sample(int nState)
{
	switch(m_nStep)
	{
		case 1: // test start new letter
			if (1 == nState)
			{
				m_nStateCount = 1;
				m_pCurrNode = m_pMorseCodeTree;
				m_nStep = 2;
			}
			break;
		case 2:
			if (0 == nState)
			{
				m_nStep = 3;
				if (m_nStateCount > m_nMaxShortCount)
				{
					if (m_pCurrNode->pDa)
						m_pCurrNode = m_pCurrNode->pDa;
					else
					{
						m_pParseEventListener->OnWorkOut(m_pCurrNode->pMorseCode);
						m_nStep = 1;
					}
				}
				else
				{
					if (m_pCurrNode->pDi)
						m_pCurrNode = m_pCurrNode->pDi;
					else
					{
						m_pParseEventListener->OnWorkOut(m_pCurrNode->pMorseCode);
						m_nStep = 1;
					}
				}

				m_nStateCount = 0;
			}
			else
				++m_nStateCount;
			break;
		case 3:
			if (1 == nState)
			{
				if (m_nStateCount > m_nMaxShortCount)
				{
					if (m_pCurrNode->pMorseCode)
					{
						m_pParseEventListener->OnWorkOut(m_pCurrNode->pMorseCode);
						m_pCurrNode = m_pMorseCodeTree;
					}
				}
				m_nStateCount = 1;
				m_nStep = 2;
			}
			else
			{
				if (++m_nStateCount > m_nMaxShortCount)
				{
					if (m_pCurrNode->pMorseCode)
					{
						m_pParseEventListener->OnWorkOut(m_pCurrNode->pMorseCode);
						m_nStep = 1;
					}
					else if (!m_pCurrNode->pDi && !m_pCurrNode->pDa || m_nStateCount > 1.5 * m_nMaxShortCount)
					{
						m_pParseEventListener->OnWorkOut(NULL);
						m_nStep = 1;
					}
				}
			}
			break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -