Delta Battery, CAN_bus, DIO P2P, ROS
Dependencies: mbed mbed-rtos ros_lib_kinetic
main.cpp
- Committer:
- WeberYang
- Date:
- 2019-08-22
- Revision:
- 12:ed085acbbde5
- Parent:
- 11:6d5307ceb569
File content as of revision 12:ed085acbbde5:
/*
0412 combine the sevro motor encoder to publish
*/
#include "mbed.h"
#include "CAN.h"
#include "cmsis_os.h"
#include <ros.h>
#include <ros/time.h>
#include <std_msgs/Int16.h>
#include <std_msgs/String.h>
#include <std_msgs/Float32.h>
#include <sensor_msgs/BatteryState.h>
#include <sensor_msgs/LaserEcho.h>
#include <geometry_msgs/Twist.h> //set buffer larger than 50byte
#include <math.h>
#include <stdio.h>
#include <string>
#include <cstdlib>
#define CAN_DATA 0x470
#define CAN_STATUS 0x471
#define PC_BAUDRATE 115200
//Serial pc(USBTX,USBRX);
Timer t;
Serial RS232(PA_9, PA_10);
DigitalOut Receiver(D7); //RS485_E
DigitalOut CAN_T(D14);
DigitalOut CAN_R(D15);
DigitalOut DO_0(PC_3);
DigitalOut DO_1(PC_2);
//DigitalOut DO_2(PF_1);
//DigitalOut DO_3(PF_0);
DigitalOut DO_4(PC_15);
DigitalOut DO_5(PC_14);
DigitalOut DO_6(PC_13);
DigitalOut DO_7(PB_7);
DigitalOut DO_8(PA_14);
DigitalOut DO_9(PA_13);
//DigitalOut DO_10(PF_7);
//DigitalOut DO_11(PF_6);
DigitalOut DO_12(PC_12);
DigitalOut DO_13(PC_10);
DigitalOut DO_14(PD_2);
DigitalOut DO_15(PC_11);
DigitalOut led1(LED1);
//DigitalIn DI_0(PF_5);
DigitalIn DI_1(PC_4);
DigitalIn DI_2(PB_13);
DigitalIn DI_3(PB_14);
DigitalIn DI_4(PB_15);
DigitalIn DI_5(PB_1);
DigitalIn DI_6(PB_2);
DigitalIn DI_7(PB_11);
DigitalIn DI_8(PB_12);
DigitalIn DI_9(PA_11);
DigitalIn DI_10(PA_12);
//DigitalIn DI_11(PD_8);
DigitalIn DI_12(PC_5);
DigitalIn DI_13(PC_6);
DigitalIn DI_14(PC_8);
DigitalIn DI_15(PC_9);
//const unsigned int RX_ID = 0x792;
int id_count[15];
long Radial_range[15];
long Radial_speed[15];
long Radial_Acc[15];
long Angle[15];
long Power[15];
long tmp_dis;
long dis[7];
long ldata;
float fdata1,fdata2;
float fRange[15],fAngle[15];
//=========Battery varable================
uint32_t SOC;
uint32_t Tempert;
uint32_t RackVoltage = 0;
uint32_t Current = 0;
uint32_t MaxCellV = 0;
uint32_t MinCellV = 0;
uint32_t seq;
//========================================
void CAN_thread(const void *args);
void DIO_thread(const void *args);
//CAN can1(PB_8,PB_9); // CAN Rx pin name, CAN Tx pin name
CAN can1(D15,D14);//PB_8,PB_9); // CAN Rx pin name, CAN Tx pin name
//CANMsg rxMsg;
CANMessage rxMsg;
osThreadDef(CAN_thread, osPriorityNormal, DEFAULT_STACK_SIZE);
osThreadDef(DIO_thread, osPriorityNormal, DEFAULT_STACK_SIZE);
//======================================================================
ros::NodeHandle nh;
std_msgs::Int16 str_msg1;
std_msgs::Int16 str_msg2;
std_msgs::Int16 str_msg3;
std_msgs::Int16 DI_data;
std_msgs::Int16 ACT_state;
std_msgs::Int16 Error_state;
std_msgs::Int16 DO;
sensor_msgs::BatteryState BTState;
ros::Publisher sonar1("sonar1", &str_msg1);
ros::Publisher sonar2("sonar2", &str_msg2);
ros::Publisher sonar3("sonar3", &str_msg3);
ros::Publisher DI_data_pub("DI_data_pub", &DI_data);
ros::Publisher ACT_state_pub("ACT_state_pub", &ACT_state);
ros::Publisher Error_state_pub("Error_state_pub", &Error_state);
ros::Publisher BT_pub("BatteryState", &BTState);
void DO_ACT(const std_msgs::Int16 &msg){
DO_0 = (msg.data & 0x001);
DO_1 = (msg.data & 0x002);
// DO_2 = (msg.data & 0x004);
// DO_3 = (msg.data & 0x008);
DO_4 = (msg.data & 0x010);
DO_5 = (msg.data & 0x020);
DO_6 = (msg.data & 0x040);
DO_7 = (msg.data & 0x080);
DO_8 = (msg.data & 0x100);
DO_9 = (msg.data & 0x200);
// DO_10 = (msg.data & 0x0400);
DO_12 = (msg.data & 0x1000);
DO_13 = (msg.data & 0x2000);
DO_14 = (msg.data & 0x4000);
DO_15 = (msg.data & 0x8000);
led1 = !led1;
osDelay(1);
}
ros::Subscriber<std_msgs::Int16> DO_data_sub("DO_data_sub", &DO_ACT);
//======================================================================
void CAN_thread(const void *args){
while (true) {
if (can1.read(rxMsg)){
seq++;
SOC = rxMsg.data[0]>>1;
Tempert = rxMsg.data[1]-50;
RackVoltage = ((unsigned int)rxMsg.data[3] << 8) + (unsigned int)rxMsg.data[2];
Current = ((unsigned int)rxMsg.data[5] << 8) + (unsigned int)rxMsg.data[4];
MaxCellV = rxMsg.data[6];
MinCellV = rxMsg.data[7];
}
else{
BTState.voltage = 0;
BTState.current = 0;
BTState.design_capacity = 80;
BTState.percentage = 0;
}
BTState.header.stamp = nh.now();
BTState.header.frame_id = 0;
BTState.header.seq = seq;
BTState.voltage = RackVoltage*0.1;
BTState.current = Current;
BTState.design_capacity = 50;
BTState.percentage = SOC;
osDelay(10);
}
}
void DIO_thread(const void *args){
while (true) {
DI_data.data = 0xffff-0x0001-0x0800 - ((int)DI_1<<1) - (((int)DI_2)<<2) - (((int)DI_3)<<3) - (((int)DI_4)<<4);
DI_data.data -= (((int)DI_5)<<5);
DI_data.data -= (((int)DI_6)<<6);
DI_data.data -= (((int)DI_7)<<7);
DI_data.data -= (((int)DI_8)<<8);
DI_data.data -= (((int)DI_9)<<9);
DI_data.data -= (((int)DI_10)<<10);
// DI_data.data -= (((int)DI_11)<<11);
DI_data.data -= (((int)DI_12)<<12);
DI_data.data -= (((int)DI_13)<<13);
DI_data.data -= (((int)DI_14)<<14);
DI_data.data -= (((int)DI_15)<<15);
osDelay(10);
}
}
//======================================================================
int main() {
RS232.baud(PC_BAUDRATE);
nh.initNode();
// nh.advertise(sonar1);
// nh.advertise(sonar2);
// nh.advertise(ACT_state_pub);
nh.advertise(DI_data_pub);
nh.advertise(BT_pub);
nh.subscribe(DO_data_sub);
// DI_0.mode(PullUp);
DI_1.mode(PullUp);
DI_2.mode(PullUp);
DI_3.mode(PullUp);
DI_4.mode(PullUp);
DI_5.mode(PullUp);
DI_6.mode(PullUp);
DI_7.mode(PullUp);
DI_8.mode(PullUp);
DI_9.mode(PullUp);
DI_10.mode(PullUp);
// DI_11.mode(PullUp);
DI_12.mode(PullUp);
DI_13.mode(PullUp);
DI_14.mode(PullUp);
DI_15.mode(PullUp);
wait_ms(10);
osThreadCreate(osThread(CAN_thread), NULL);
osThreadCreate(osThread(DIO_thread), NULL);
// CANMessage rxMsg;
CAN_T = 0;
CAN_R = 0;
wait_ms(50);
// CAN can1(D15,D14);//PB_8,PB_9); // CAN Rx pin name, CAN Tx pin name
wait_ms(50);
can1.frequency(500000);
wait_ms(50);
while(1){
DI_data_pub.publish( &DI_data);
// sonar1.publish( &str_msg1);
// sonar2.publish( &str_msg2);
BT_pub.publish( &BTState );
nh.spinOnce();
osDelay(50);
}
}