📄 position.c
字号:
#include <math.h>
#include "string.h"
#include "global.h"
#include "gps.h"
#include "position.h"
#include "commoninterface.h"
#include <stdio.h>
#include "16c554.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define K1 18 /*赤道周长按4万公里计算,纬度1个基本单位(1分/1万)对应的弧长,即系数,单位为厘米*/
#define K2 16 /*地球的平均赤道半径按6738公里算,南京地区经度1个基本单位(1分/1万)对应弧长16.6厘米,
半径按6366公里(周长4万公里)计算,南京地区对应弧长15.7厘米*/
#define MANUAL 0 /*手动报站*/
#define IN_LINE 255 /*在线路上*/
#define DECLIVITY 130 /*下坡*/
#define SWERVE 131 /*转弯*/
#define REFERENCE_POINT 132 /*"参考点"属性*/
#define CHANGE_DIRECTION 133 /*改变方向返回值*/
#define INVALID_TIMES 60 /*GPS无效次数*/
#define BEYOND_DISTANCE 200 /*当前位置到相邻两站距离之和大于两站之间距离120米,认为进入unlock状态*/
#define UNLOCK_TO_LOCK_DIS 100 /*满足失锁状态到锁定转换的距离*///这两个值需要重新设置!!!!
#define LOCK 1 /*设置转换开关*/
#define UNLOCK 0 /*设置转换开关*/
struct VOICE_INFO_STRUCT voiceInfo;
static uchar k; /*第k个站点*/
POSITIONINFO positionInfo[204];
long length2point[204];
char positionMode[128];
unsigned char firstStation, lastStation;
char inFlag[64],outFlag[64];
extern xdata BUS_INFO busInfo;//线路当前信息
ulong get_two_station_distance(uchar m, uchar n);
/*****************线路位置数据点*************************/
#define MAX_STATIONID_SIZE 4//站台ID的空间
typedef struct _position_entry
{
long longitude;
long latitude;
}POSITION_ENTRY;
typedef struct _station_entry
{
POSITION_ENTRY position;
unsigned char attribute;//属性
unsigned char speed;//速度
char id[MAX_STATIONID_SIZE];//站台ID号
}STATION_ENTRY;
unsigned char get_cur_position(void)
{
return k;
}
void position_set(unsigned char value)
{
k = value;
voiceInfo.curState = value;
voiceInfo.arriveFlag = 0;
voiceInfo.pointChange = 1;
}
void clear_sound_flag(void)
{
voiceInfo.arriveFlag = 0;
memset(inFlag, 0, sizeof(inFlag));
memset(outFlag, 0, sizeof(outFlag));
//inFlag[firstStation-1] = 1;
outFlag[lastStation-1] = 1;
}
uchar position_sound_record(uchar value)
{
uchar tmp;
if( (value < 0x40) && (value!=0) )
{
tmp = value - 1;
if( inFlag[tmp] )
return IN_LINE;
else
{
inFlag[tmp] = 1;
busInfo.stationState = 1;
return value;
}
}
else if( value < 0x80 )
{
tmp = value - 0x40 - 1;
if( (outFlag[tmp]) || (tmp>0x7F) )
return IN_LINE;
else
{
outFlag[tmp] = 1;
busInfo.stationState = 2;
return value;
}
}
}
//设置当前模式下上下行的终点站
static void set_cur_laststation(char* pBuf)
{
*pBuf = busInfo.lastStation[busInfo.direction];
if (BUS_BACKWARD == busInfo.direction)
*pBuf -= 0x40;
/* unsigned char i;
if(busInfo.direction==0)
{
for (i=63; i>=0; i--)
{
if (1 == positionMode[i])
{
return(i+1);
}
}
}
else
{
for (i=127; i>=64; i--)
{
if (1 == positionMode[i])
{
return(i+1-0x40);
}
}
}*/
}
//设置当前模式下上下行的起点站
static void set_cur_firststation(char* pBuf)
{
*pBuf = busInfo.firstStation[busInfo.direction];
if (BUS_BACKWARD == busInfo.direction)
*pBuf -= 0x40;
/* unsigned char i;
if(busInfo.direction==0)
{
for (i=0; i<=63; i++)
{
if (1 == positionMode[i])
{
return(i+1);
}
}
}
else
{
for (i=64; i<=127; i++)
{
if (1 == positionMode[i])
{
return(i+1-0x40);
}
}
}*/
}
void position_setstation()
{
set_cur_laststation(&lastStation);
set_cur_firststation(&firstStation);
}
/************************************************************************
*
*状态:UNLOCK状态下
*输入:当前秒的位置、第j个站点
*输出:当前秒的位置到第j个站点位置的距离
*函数功能:求当前秒的位置到第j个站点位置的距离
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -