This repository has been archived on 2026-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
hero/PTZ/Core/Src/CToC.c
2025-11-27 20:08:38 +08:00

144 lines
4.5 KiB
C

#include "main.h"
#include "CToC.h"
#include "can.h"
#include "dma.h"
#include "gpio.h"
#include "Remote.h"
#include "RefereeSystem.h"
#include "Parameter.h"
static CAN_TxHeaderTypeDef TxMessage;
static uint8_t TxMessage_Data[8];
uint8_t CToC_MasterSendData(void)
{
uint32_t send_mail_box;
TxMessage.StdId=CToC_SlaveID1;
TxMessage.IDE = CAN_ID_STD;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.DLC=0x08;
if((PC_Go==0 && PC_Back==0 && PC_Left==0 && PC_Right==0 && PC_Spin==0 && PC_Pitch==0) && RefereeSystem_Status==0)//?????
{
TxMessage_Data[0]=(uint8_t)((uint16_t)Remote_RxData.Remote_R_RL>>8);//????????
TxMessage_Data[1]=(uint8_t)((uint16_t)Remote_RxData.Remote_R_RL & 0x00FF);//????????
TxMessage_Data[2]=(uint8_t)((uint16_t)Remote_RxData.Remote_R_UD>>8);//????????
TxMessage_Data[3]=(uint8_t)((uint16_t)Remote_RxData.Remote_R_UD & 0x00FF);//????????
TxMessage_Data[4]=(uint8_t)(Remote_RxData.Remote_L_RL>>8);//????????
TxMessage_Data[5]=(uint8_t)(Remote_RxData.Remote_L_RL & 0x00FF);//????????
TxMessage_Data[6]=(uint8_t)(Remote_RxData.Remote_L_UD>>8);//????????
TxMessage_Data[7]=(uint8_t)(Remote_RxData.Remote_L_UD & 0x00FF);//????????
}
else//????
{
TxMessage_Data[0]=(uint8_t)((1024+(PC_Right-PC_Left)*660)>>8);//??AD,????????(???)
TxMessage_Data[1]=(uint8_t)((1024+(PC_Right-PC_Left)*660) & 0x00FF);//??AD,????????(???)
TxMessage_Data[2]=(uint8_t)((1024+(PC_Go-PC_Back)*660)>>8);//??WS,????????(???)
TxMessage_Data[3]=(uint8_t)((1024+(PC_Go-PC_Back)*660) & 0x00FF);//??WS,????????(???)
TxMessage_Data[4]=(uint8_t)((uint16_t)(1024+PC_Spin*PC_Mouse_RLSensitivity)>>8);//????,????????(???)
TxMessage_Data[5]=(uint8_t)((uint16_t)(1024+PC_Spin*PC_Mouse_RLSensitivity) & 0x00FF);//????,????????(???)
TxMessage_Data[6]=(uint8_t)((uint16_t)(1024+PC_Pitch*PC_Mouse_DUSensitivity)>>8);//????,????????(???)
TxMessage_Data[7]=(uint8_t)((uint16_t)(1024+PC_Pitch*PC_Mouse_DUSensitivity) & 0x00FF);//????,????????(???)
}
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(&hcan2, &TxMessage,TxMessage_Data, &send_mail_box);
if (status != HAL_OK) {
return 0;
}
uint16_t i = 0;
while ((HAL_CAN_IsTxMessagePending(&hcan2, send_mail_box)) && (i < 0xFFF)) {
i++;
}
if (i >= 0xFFF) {
return 0;
}
return 1;
}
//can 2 rx
void can_filter_init(void)
{
CAN_FilterTypeDef can_filter_st;
can_filter_st.FilterActivation = ENABLE;
can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK;
can_filter_st.FilterScale = CAN_FILTERSCALE_32BIT;
can_filter_st.FilterIdHigh = (CToC_MasterID1<<5);
can_filter_st.FilterIdLow =(CToC_MasterID1<<5);
can_filter_st.FilterMaskIdHigh = 0xFFE3;
can_filter_st.FilterMaskIdLow = 0xFFE3;
can_filter_st.FilterBank = 0;
can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
can_filter_st.SlaveStartFilterBank = 14;
can_filter_st.FilterBank = 14;
HAL_CAN_ConfigFilter(&hcan2, &can_filter_st);
HAL_CAN_Start(&hcan2);
HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
}
static CAN_TxHeaderTypeDef TxMessage1;
static uint8_t TxMessage_Data1[8];
uint8_t CToC_MasterSendControl(void)
{
uint32_t send_mail_box;
TxMessage1.StdId=CToC_SlaveID2;
TxMessage1.IDE = CAN_ID_STD;
TxMessage1.RTR = CAN_RTR_DATA;
TxMessage1.DLC=0x08;
TxMessage_Data1[0]=Remote_Status;
TxMessage_Data1[1]=Remote_RxData.Remote_RS;
TxMessage_Data1[2]=Remote_RxData.Remote_KeyPush_Ctrl;
TxMessage_Data1[3]=Remote_RxData.Remote_KeyPush_Shift;
TxMessage_Data1[4]=Remote_StartFlag;
TxMessage_Data1[5]=Remote_RxData.Remote_LS;
TxMessage_Data1[6]=Remote_RxData.Remote_Key_Alpha1;
TxMessage_Data1[7]=Remote_RxData.Remote_Key_Alpha2;
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(&hcan2, &TxMessage1,TxMessage_Data1, &send_mail_box);
if (status != HAL_OK) {
return 0;
}
uint16_t i = 0;
while ((HAL_CAN_IsTxMessagePending(&hcan2, send_mail_box)) && (i < 0xFFF)) {
i++;
}
if (i >= 0xFFF) {
return 0;
}
return 1;
}
void CToC_CANDataProcess(uint32_t ID,uint8_t *Data)
{
static uint8_t Last_ShooterStatus=0;
if(ID==CToC_MasterID1)
{
Last_ShooterStatus=RefereeSystem_ShooterStatus;
RefereeSystem_ShooterStatus=Data[0];
if(Last_ShooterStatus==0 && RefereeSystem_ShooterStatus==1)RefereeSystem_ShooterOpenFlag=1;
}
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[8];
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data);
if (hcan->Instance == CAN2) {
CToC_CANDataProcess(rx_header.StdId, rx_data);
}
}