rte.cpp
来自「提取各种NEMA0183格式数据的类编程。」· C++ 代码 · 共 210 行
CPP
210 行
/*
** Author: Samuel R. Blackburn
** Internet: wfc@pobox.com
**
** Copyright, 1996-2005, Samuel R. Blackburn
**
** "You can get credit for something or get it done, but not both."
** Dr. Richard Garwin
**
** BSD License follows.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
**
** Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer. 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. Neither the name of
** the WFC nor the names of its contributors may be used to endorse or
** promote products derived from this software without specific prior
** written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "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 COPYRIGHT
** OWNER OR CONTRIBUTORS 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.
**
** $Workfile: rte.cpp $
** $Revision: 5 $
** $Modtime: 10/10/98 4:21p $
*/
#include "nmea0183.h"
#pragma hdrstop
#if defined( _DEBUG ) && defined( _INC_CRTDBG )
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif // _DEBUG
RTE::RTE()
{
Mnemonic = TEXT( "RTE" );
Empty();
}
RTE::~RTE()
{
Mnemonic.Empty();
Empty();
}
void RTE::Empty( void )
{
m_TotalNumberOfMessages = 0.0;
m_LastMessageNumberReceived = 0.0;
m_MessageNumber = 0.0;
m_LastWaypointNumberWritten = 0;
TypeOfRoute = RouteUnknown;
RouteName.Empty();
m_DeleteAllEntries();
}
BOOL RTE::Parse( const SENTENCE& sentence )
{
/*
** RTE - Routes
**
** 1 2 3 4 5 x n
** | | | | | | |
** $--RTE,x.x,x.x,a,c--c,c--c, ..... c--c*hh<CR><LF>
**
** Field Number:
** 1) Total number of messages being transmitted
** 2) Message Number
** 3) Message mode
** c = complete route, all waypoints
** w = working route, the waypoint you just left, the waypoint you're heading to then all the rest
** 4) Waypoint ID
** x) More Waypoints
** n) Checksum
*/
m_DeleteAllEntries();
int field_number = 1;
m_TotalNumberOfMessages = sentence.Double( 1 );
double this_message_number = sentence.Double( 2 );
if ( this_message_number == 1.0 )
{
/*
** Make sure we've got a clean list
*/
m_DeleteAllEntries();
}
CString field_data = sentence.Field( 3 );
if ( field_data == TEXT( "c" ) )
{
TypeOfRoute = CompleteRoute;
}
else if ( field_data == TEXT( "w" ) )
{
TypeOfRoute = WorkingRoute;
}
else
{
TypeOfRoute = RouteUnknown;
}
RouteName = sentence.Field( 4 );
int number_of_data_fields = sentence.GetNumberOfDataFields();
field_number = 5;
CString * string_to_add_p = (CString *) NULL;
while( field_number < number_of_data_fields )
{
string_to_add_p = new CString;
*string_to_add_p = sentence.Field( field_number );
Waypoints.Add( string_to_add_p );
string_to_add_p = (CString *) NULL;
field_number++;
}
return( TRUE );
}
BOOL RTE::Write( SENTENCE& sentence )
{
/*
** Let the parent do its thing
*/
RESPONSE::Write( sentence );
sentence += m_TotalNumberOfMessages;
sentence += m_MessageNumber;
switch( TypeOfRoute )
{
case CompleteRoute:
sentence += TEXT( "c" );
break;
case WorkingRoute:
sentence += TEXT( "w" );
break;
default:
sentence += TEXT( "" );
break;
}
sentence += RouteName;
/*
** To Be done
** Take the number of entries in the list and write them out until we're done
*/
sentence.Finish();
return( TRUE );
}
void RTE::m_DeleteAllEntries( void )
{
int loop_index = 0;
int number_of_entries = Waypoints.GetSize();
CString * entry_p = (CString *) NULL;
while( loop_index < number_of_entries )
{
entry_p = (CString *) Waypoints[ loop_index ];
Waypoints[ loop_index ] = NULL;
delete entry_p;
entry_p = (CString *) NULL;
loop_index++;
}
Waypoints.RemoveAll();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?