📄 j1939_al.c
字号:
/**************************************************************************************
*
* 北京航空航大学 706教研室
* All rights reserved. 2005
*
*======================================================================================
*
* 文件名: J1939_AL.c
* 大纲: J1939协议栈
* 文件标识:
* 摘 要:
*
*======================================================================================
*
* 描述: 应用层文档
*
* 控制器: Freescale MC9s12H256
*
* 编译器: Metrowerks CodeWarrior IDE v5.2.1149
*
*======================================================================================
*
* 当前版本: 1.0.0
* 编程人员: 孙进
* 完成日期: 2006年2月
*
*======================================================================================
*
* 更新历史记录:
*
***************************************************************************************/
#include "J1939_includes.h"
#include "\Ucos\includes.h"
#include <MC9S12H256.h>
#include "..\user.h"
extern void *EngSpeed_ptr;
extern void *VehSpeed_ptr;
extern void *WatTemp_ptr;
extern void *OilPres_ptr;
extern void *VehDistance_ptr;
#if MUTIPLE_PACKAGE_TRANSPORT
extern void *FaultCode_ptr;
#endif
extern OS_EVENT *EngSpeed_MBox;
extern OS_EVENT *VehSpeed_MBox;
extern OS_EVENT *WatTemp_MBox;
extern OS_EVENT *OilPres_MBox;
extern OS_EVENT *VehDistance_MBox;
#if MUTIPLE_PACKAGE_TRANSPORT
extern OS_EVENT *FaultCode_MBox;
#endif
//演示系统用
//extern void *TestEngSpeed_ptr; //转速指针
//extern void *TestVehSpeed_ptr; //车速指针
//extern void *TestWatTemp_ptr; //水温指针
//extern void *TestOilPres_ptr; //油压指针
extern void *GeneralSignal_ptr; //指示灯消息指针
extern void *EmergSignal_ptr;
/*
extern void *TestSignal_ptr[QueueSize]; //指示灯消息数组指针
extern void *TestSignal1_ptr; //指示灯1消息指针
extern void *TestSignal2_ptr; //指示灯2消息指针
extern void *TestSignal3_ptr; //指示灯3消息指针
extern void *TestSignal4_ptr; //指示灯4消息指针
extern void *TestSignal5_ptr; //指示灯5消息指针
extern void *TestSignal6_ptr; //指示灯6消息指针
extern void *TestSignal7_ptr; //指示灯7消息指针
extern void *TestSignal8_ptr; //指示灯8消息指针
extern void *TestSignal9_ptr; //指示灯9消息指针
extern void *TestSignal10_ptr; //指示灯10消息指针
extern void *TestSignal11_ptr; //指示灯11消息指针
extern void *TestSignal12_ptr; //指示灯12消息指针
*/
//extern OS_EVENT *TestEngSpeed_MBox; //转速消息邮箱
//extern OS_EVENT *TestVehSpeed_MBox; //车速消息邮箱
//extern OS_EVENT *TestWatTemp_MBox; //水温消息邮箱
//extern OS_EVENT *TestOilPres_MBox; //油压消息邮箱
extern OS_EVENT *GeneralSignal_MBox; //指示灯消息邮箱
extern OS_EVENT *EmergSignal_MBox;
extern OS_EVENT *EmergFlg_Sem;
//PGN过滤表
const PGN_T _pgn_table[PGN_NUM] =
{
61443,// F003 发动机负荷(当前速度下的负载百分比)
61444,// F004 发动机转速 ,发动机扭矩
65226,// FECA DM1当前诊断故障代码
65248,// FEE0 车辆里程
65257,// FEE9 燃料消耗量 / 每百公里油耗
65262,// FEEE 发动机冷却液温度,燃油温度,机油温度
65263,// FEEF 机油压力
65265,// FEF1 车辆速度(巡航控制速度)
65266,// FEF0 燃油消耗率
65271,// FEF7 电池电压
};
VEH_DISTANCE_T VehDistance; //里程
FAULT_CODE_T FaultCode; //故障码
U16 VehSpeed; //车速
U16 EngSpeed; //转速
U08 WatTemp; //水温
U08 OilPres; //油压
//演示系统用
U16 GeneralSignal;
U16 EmergSignal;
/*
U08 Signal1;
U08 Signal2;
U08 Signal3;
U08 Signal4;
U08 Signal5;
U08 Signal6;
U08 Signal7;
U08 Signal8;
U08 Signal9;
U08 Signal10;
U08 Signal11;
U08 Signal12;
*/
//extern INT8U SignalNum; //分辨哪个指示灯亮/灭
//========================================================================================
//Application Interface Functions
//========================================================================================
/****************************************************************************************
@函数名称 : void Rev_J1939msg(J1939_RX_MESSAGE_T *msg_ptr)
@参数 : None
@返回值 : J1939_RX_MESSAGE_T *msg_ptr
@描述 : 报文处理函数,根据实际需要编写
@作者 : 孙进
@最后编辑时间 : 2005-11-23
@版本 : V1.0.0
*****************************************************************************************/
void Rev_J1939msg(J1939_RX_MESSAGE_T *msg_ptr)
{
U08 i;
switch (msg_ptr->PGN)
{
case 61444: //发动机转速 / 发动机扭矩
{
//发动机转速
EngSpeed = msg_ptr->data[4];
EngSpeed = (EngSpeed<<8) + msg_ptr->data[3];
EngSpeed_ptr = &EngSpeed;
OSMboxPost(EngSpeed_MBox,EngSpeed_ptr);
//发动机扭矩
}
break;
case 65248: //车辆里程
{
//相对里程
VehDistance.trip_data = msg_ptr->data[3];
VehDistance.trip_data = (VehDistance.trip_data<<8) + msg_ptr->data[2];
VehDistance.trip_data = (VehDistance.trip_data<<8) + msg_ptr->data[1];
VehDistance.trip_data = (VehDistance.trip_data<<8) + msg_ptr->data[0];
//总里程
VehDistance.total_data = msg_ptr->data[7];
VehDistance.total_data = (VehDistance.total_data<<8) + msg_ptr->data[6];
VehDistance.total_data = (VehDistance.total_data<<8) + msg_ptr->data[5];
VehDistance.total_data = (VehDistance.total_data<<8) + msg_ptr->data[4];
VehDistance_ptr = &VehDistance;
OSMboxPost(VehDistance_MBox,VehDistance_ptr);
}
break;
case 65262: //发动机冷却液温度,燃油温度,机油温度
{
//发动机冷却液温度
WatTemp = msg_ptr->data[0];
WatTemp_ptr = &WatTemp;
OSMboxPost(WatTemp_MBox,WatTemp_ptr);
//燃油温度
//机油温度
}
break;
case 65263: //机油压力
{
OilPres = msg_ptr->data[3];
OilPres_ptr = &OilPres;
OSMboxPost(OilPres_MBox,OilPres_ptr);
}
break;
case 65265: //车辆速度
{
VehSpeed = msg_ptr->data[2];
VehSpeed = (VehSpeed<<8) + msg_ptr->data[1];
VehSpeed_ptr = &VehSpeed;
OSMboxPost(VehSpeed_MBox,VehSpeed_ptr);
}
break;
#if MUTIPLE_PACKAGE_TRANSPORT
case 65226: //DM1当前诊断故障代码
{
FaultCode.count = (U08)((msg_ptr->byte_count - 2) / 4);
if (FaultCode.count>J1939_FAULT_NUM)
{
for(i=0;i<J1939_FAULT_NUM;i++)
{
FaultCode.fault_code[i].spn = msg_ptr->data[4+i*4];
FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn & 0xE0) << 3;
FaultCode.fault_code[i].spn += msg_ptr->data[3+i*4];
FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn << 8) + msg_ptr->data[2+i*4];
FaultCode.fault_code[i].fmi = msg_ptr->data[4+i*4] & 0x1F;
FaultCode.fault_code[i].oc = msg_ptr->data[5+i*4] & 0xEF;
}
}
else
{
for(i=0;i<FaultCode.count;i++)
{
FaultCode.fault_code[i].spn = msg_ptr->data[4+i*4];
FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn & 0xE0) << 3;
FaultCode.fault_code[i].spn += msg_ptr->data[3+i*4];
FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn << 8) + msg_ptr->data[2+i*4];
FaultCode.fault_code[i].fmi = msg_ptr->data[4+i*4] & 0x1F;
FaultCode.fault_code[i].oc = msg_ptr->data[5+i*4] & 0xEF;
}
}
FaultCode_ptr = &FaultCode;
OSMboxPost(FaultCode_MBox,FaultCode_ptr);
}
break;
#endif
case 61443: //发动机负荷
{
}
break;
case 65257: //燃料消耗量 / 每百公里油耗
{
}
break;
case 65266: //燃油消耗率
{
}
break;
case 65271: //电池电压
{
}
break;
//演示系统用
/*
case TESTENGSPEED_PGN: //测试发动机转速
{
//发动机转速
EngSpeed = msg_ptr->data[4];
EngSpeed = (EngSpeed<<8) + msg_ptr->data[3];
TestEngSpeed_ptr = &EngSpeed;
OSMboxPost(TestEngSpeed_MBox,TestEngSpeed_ptr);
//发动机扭矩
}
break;
case TESTVEHSPEED_PGN: //车辆速度
{
VehSpeed = msg_ptr->data[2];
VehSpeed = (VehSpeed<<8) + msg_ptr->data[1];
TestVehSpeed_ptr = &VehSpeed;
OSMboxPost(TestVehSpeed_MBox,TestVehSpeed_ptr);
}
break;
case TESTOILPRES_PGN: //机油压力
{
OilPres = msg_ptr->data[3];
TestOilPres_ptr = &OilPres;
OSMboxPost(TestOilPres_MBox,TestOilPres_ptr);
}
break;
case TESTWATTEMP_PGN: //发动机冷却液温度,燃油温度,机油温度
{
//发动机冷却液温度
WatTemp = msg_ptr->data[0];
TestWatTemp_ptr = &WatTemp;
OSMboxPost(TestWatTemp_MBox,TestWatTemp_ptr);
//燃油温度
//机油温度
}
break;
*/
case GENERAL_SIGNAL_PGN:
{
GeneralSignal = msg_ptr->data[1];
GeneralSignal = (GeneralSignal<<8) + msg_ptr->data[0];
GeneralSignal_ptr = &GeneralSignal;
OSMboxPost(GeneralSignal_MBox,GeneralSignal_ptr);
}
break;
case EMERG_SIGNAL_PGN:
{
EmergSignal = msg_ptr->data[1];
EmergSignal = (EmergSignal<<8) + msg_ptr->data[0];
EmergSignal_ptr = &EmergSignal;
OSMboxPost(EmergSignal_MBox,EmergSignal_ptr);
OSSemPost(EmergFlg_Sem);
}
break;
default:
break;
}
}
/****************************************************************************************
@函数名称 : void AL_init(void)
@参数 : None
@返回值 : None
@描述 : 初始化函数
@作者 : 孙进
@最后编辑时间 : 2005-11-23
@版本 : V1.0.0
*****************************************************************************************/
void AL_init(void)
{
U08 i;
VehSpeed = 0;
EngSpeed = 0;
WatTemp = 0;
OilPres = 0;
FaultCode.count = 0;
for(i=0;i<J1939_FAULT_NUM;i++)
{
FaultCode.fault_code[i].spn = 0;
FaultCode.fault_code[i].fmi = 0;
FaultCode.fault_code[i].oc = 0;
}
}
/****************************************************************************************
@函数名称 : U08 PGN_filter(PGN_T pgn);
@参数 : PGN_T pgn 需要查表的PGN
@返回值 : 返回1查找成功,返回0无此PGN
@描述 : //报文滤波函数
@作者 : 孙进
@最后编辑时间 : 2005-11-23
@版本 : V1.0.0
*****************************************************************************************/
U08 PGN_filter(PGN_T pgn)
{
U08 left = 0;
U08 right = PGN_NUM - 1;
U08 middle = 0;
while(left<=right)
{
middle = (U08)((left + right) >> 1);
if(pgn==_pgn_table[middle])
{
return TRUE;
}
if(pgn>_pgn_table[middle])
{
left = middle + 1;
}
else
{
right = middle - 1;
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -