| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852 |
- #include "soft_can.h"
- #include "chipflash.h"
- #include "math.h"
- #include "weight_init.h"
- #include "string.h"
- #include "my_math.h"
- #include "soft_flow.h"
- #include "can_link.h"
- #define MAX_FLITER 2
- #define CAN_TX_FIFO_SIZE 4
- #define CAN_RX_FIFO_SIZE 4
- static ACK_STATUS ack_status = no_ack;
- static FDCAN_FilterTypeDef hCAN_Filter[MAX_FLITER] = {0};
- static Can_Tx can_tx_fifo_buff[CAN_TX_FIFO_SIZE] = {0};
- static Can_Rx can_rx_fifo_buff[CAN_RX_FIFO_SIZE] = {0};
- rkfifo_t can_tx_kfifo = {0};
- rkfifo_t can_rx_kfifo = {0};
- static Can_Tx _can_tx = {0};
- static Can_Rx _can_rx = {0};
- FORMAT_CAN2PMU *Get_Tx_Msg(void)
- {
- return (FORMAT_CAN2PMU *)&_can_tx.Txdata;
- }
- ACK_STATUS *Get_Ack_Status(void)
- {
- return &ack_status;
- }
- void Set_Ack_Status(ACK_STATUS status)
- {
- ack_status = status;
- }
- static void Can_Fifo_Init(void)
- {
- rkfifo_init(&can_tx_kfifo, can_tx_fifo_buff, sizeof(can_tx_fifo_buff), sizeof(Can_Tx));
- rkfifo_init(&can_rx_kfifo, can_rx_fifo_buff, sizeof(can_rx_fifo_buff), sizeof(Can_Rx));
- }
- void CAN_HEADER_Init()
- {
- FDCAN_TxHeaderTypeDef *p_txhead = &_can_tx.Txheader;
- p_txhead->Identifier = CANTX_ID;
- p_txhead->IdType = FDCAN_EXTENDED_ID;
- p_txhead->TxFrameType = FDCAN_DATA_FRAME;
- p_txhead->DataLength = 8;
- p_txhead->ErrorStateIndicator = FDCAN_ESI_ACTIVE;
- p_txhead->BitRateSwitch = FDCAN_BRS_OFF;
- p_txhead->FDFormat = FDCAN_CLASSIC_CAN;
- p_txhead->TxEventFifoControl = FDCAN_NO_TX_EVENTS;
- p_txhead->MessageMarker = 0;
- }
- void MY_CAN_INIT()
- {
- MYADD_FDCAN1_InitFilter();
- MYADD_FDCAN2_InitFilter();
- Can_Fifo_Init();
- CAN_HEADER_Init();
- }
- //static void Set_ExtId(uint32_t ExtId)
- //{
- // _can_tx.Txheader.ExtId = ExtId;
- //}
- //static void Filter_Init(uint8_t index, uint32_t FirstId, uint32_t SecondId)
- //{
- // CAN_FilterTypeDef *pfilter = &hCAN_Filter[index];
- // pfilter->FilterIdHigh = ((FirstId << 3) & HIGH_MASK) >> 16;
- // pfilter->FilterIdLow = ((FirstId << 3) | CAN_ID_EXT | CAN_RTR_DATA) & LOW_MASK;
- // pfilter->FilterMaskIdHigh = ((SecondId << 3) & HIGH_MASK) >> 16;
- // pfilter->FilterMaskIdLow = ((SecondId << 3) | CAN_ID_EXT | CAN_RTR_DATA) & LOW_MASK;
- // pfilter->FilterFIFOAssignment = CAN_FILTER_FIFO0;
- // pfilter->FilterBank = index;
- // pfilter->FilterMode = CAN_FILTERMODE_IDLIST;
- // pfilter->FilterScale = CAN_FILTERSCALE_32BIT;
- // pfilter->FilterActivation = ENABLE;
- // pfilter->SlaveStartFilterBank = index;
- // HAL_CAN_ConfigFilter(&hcan, pfilter);
- //}
- //void Can_Tx_Msg(Can_Tx *TxMsg)
- //{
- // uint32_t Tx_MailBox;
- // if (HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 0)
- // {
- // if (HAL_CAN_AddTxMessage(&hcan, &TxMsg->Txheader, TxMsg->Txdata, &Tx_MailBox) != HAL_OK)
- // {
- // rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
- // }
- // }
- // else
- // {
- // rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
- // }
- //}
- //void CAN1_SCE_IRQHandler()
- //{
- // if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_BOF) != RESET)
- // {
- // __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
- // }
- // if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_EPV) != RESET)
- // {
- // __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
- // }
- // if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_EWG) != RESET)
- // {
- // __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
- // }
- // __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
- //}
- void Write_To_Flash(uint32_t first_flash, uint32_t end_flash, uint8_t *data, uint8_t size)
- {
- flash_ops->Erase_Flash(first_flash, end_flash);
- flash_ops->Write_Flash(first_flash, data, size);
- }
- static void Write_Check(void)
- {
- uint32_t tmp = Value_Check;
- Write_To_Flash(VALUE_FLASH_Check_Addr, VALUE_FLASH_Check_End, (uint8_t *)&tmp, sizeof(tmp));
- }
- // 擦除配置
- static void Restore_Factory_Setting(void)
- {
- for (uint8_t i = 0; i < 12; i++)
- {
- flash_ops->Erase_Flash(CAN_FLASH_BASE + ONE_PARAM_SIZE * i, CAN_FLASH_BASE + ONE_PARAM_SIZE * (i + 1));
- }
- }
- static void Save_GrossWeight(WEIGHING_DEVICE *_device)
- {
- uint8_t sensor_num_c = 0;
- Write_Check();
- flash_ops->Erase_Flash(GROSSWEIGHT1_FLASH_BASE, GROSSWEIGHT1_FLASH_END + ONE_PARAM_SIZE);
- for (sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == _device->sensor_num_mask)
- {
- continue;
- }
- struct SENSOR *sensor = _device->sensor[sensor_num_c];
- flash_ops->Write_Flash(GROSSWEIGHT1_FLASH_BASE + sensor_num_c * ONE_WORD_SIZE, (uint8_t *)&sensor->GrossWeight, sizeof(sensor->GrossWeight));
- }
- }
- static float Get_Single_Weight(struct SENSOR *sensor, uint32_t buf)
- {
- return buf * sensor->Scale;
- }
- static bool Scale_Is_Nan(WEIGHING_DEVICE *_device)
- {
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == _device->sensor_num_mask)
- {
- continue;
- }
- if (isnan(_device->sensor[sensor_num_c]->Scale) == 1)
- {
- return true;
- }
- }
- return false;
- }
- static void K_Value_Init(WEIGHING_DEVICE *_device)
- {
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == _device->sensor_num_mask)
- {
- continue;
- }
- _device->sensor[sensor_num_c]->K.f = 112.0f;
- }
- }
- /*校准*/
- static bool Auto_Calib(WEIGHING_DEVICE *_device, uint32_t buf)
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
- //采样10次取平均
- uint32_t sum[4] = {0}, data[4] = {0}, err_count = 0;
- for(uint8_t i = 0; i < 10; i++)
- {
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- uint32_t temp = 0;
- if (sensor_num_c == device->sensor_num_mask)
- {
- continue;
- }
- temp = Read_Value(device->sensor[sensor_num_c]);
- while (temp== 0)
- {
- temp = Read_Value(device->sensor[sensor_num_c]);
- err_count++;
- if (err_count > 10 /*&& device->sensor_num_mask == 4*/)
- {
- device->sensor[sensor_num_c]->err_flag = true;
- device->sensor_num_mask = sensor_num_c;
- err_count = 0;
- //test 去皮失败
- return 0;
- }
- }
- sum[sensor_num_c] += temp;
- if(i == 9)
- data[sensor_num_c] = sum[sensor_num_c] / 10;
- HAL_Delay(13);
- }
- }
-
- Filter_Value(data);
- float allot = 0.f;
- float buff[SENSOR_NUM] = {0.f};
- //计算总重量
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == device->sensor_num_mask)
- {
- continue;
- }
- buff[sensor_num_c] = device->sensor[sensor_num_c]->Raw_Value;
- allot += buff[sensor_num_c];
- }
- //计算每个传感器重量占比
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == device->sensor_num_mask)
- {
- continue;
- }
- device->sensor[sensor_num_c]->Scale = buff[sensor_num_c] / allot;
- }
- float sum_baseK_weight = 0.0f;
- //计算测量K
- if (!Scale_Is_Nan(_device))
- {
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == _device->sensor_num_mask)
- {
- continue;
- }
- struct SENSOR *sensor = _device->sensor[sensor_num_c];
- //float tmpfloat = (sensor->Real_Variation / Get_Single_Weight(sensor, buf));
- if (sensor->Real_Variation < 0)
- {
- sensor->Real_Variation = fabsf(sensor->Real_Variation);
- }
- sum_baseK_weight += sensor->Real_Variation / sensor-> base_k ;
- //if (tmpfloat <= MAX_K && tmpfloat >= MIN_K)
- {
- //sensor->K.f = tmpfloat;
- }
- // else //test
- // {
- // return false;
- // }
-
- }
- _device->correct_k = sum_baseK_weight / buf;
- Write_To_Flash(K1_VALUE_FLASH_BASE, K1_VALUE_FLASH_END, (uint8_t *)&_device->correct_k, sizeof(_device->correct_k));
-
- return true;
- }
- return false;
- }
- /*获取E2指令的K值*/
- static float Get_K(FORMAT_RXMSG *msg)
- {
- uint16_t tmpshort = 0;
- float tmpfloat = 0.0f;
- memcpy(&tmpshort, &msg->Data, sizeof(tmpshort));
- tmpfloat = tmpshort;
- if(tmpshort > 1000)
- {
- tmpfloat = tmpfloat / 10.0f;
- }
- if (tmpfloat <= MAX_K && tmpfloat >= MIN_K)
- {
- return (float)tmpfloat;
- }
- return 112.0f;
- }
- /*设置E2指令的K值并写入FLASH默认配置,可用到F2指令*/
- static void Save_K(FORMAT_RXMSG *msg, uint8_t sensor)
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
- struct SENSOR *Sensor_tmp = device->sensor[sensor];
- uint32_t tmpint = 0;
- memcpy(&tmpint, msg->Data, sizeof(tmpint));
- Write_Check(); // 写入检验位
- /*E2指令才获取K值,F2自动校准使用校准后的K值*/
- if (msg->Code == 0xE2)
- {
- switch (tmpint)
- {
- case 0x1: //重量标定
- Sensor_tmp->base_k = Sensor_tmp->Real_Variation / 1000;
- if (Sensor_tmp->base_k >= MAX_K || Sensor_tmp->base_k < MIN_K)
- {
- Sensor_tmp->base_k = 75.0f;
- }
- Write_To_Flash(SENSOR1_INIT_VALUE_BASE + sensor * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + sensor * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
- break;
- case 0x3://指定抛弃第N个传感器
- /*指定弃置传感器的话不能改变传感器数量,使用mask作为标志位屏蔽某个传感器*/
- device->sensor_num_mask = sensor;
- flash_ops->Erase_Flash(SENSOR_NUM_RECORD_BASE, SENSOR_NUM_RECORD_END);
- Sensor_tmp->err_flag = false;
- flash_ops->Write_Flash(SENSOR_NUM_RECORD_BASE, (uint8_t *)&device->sensor_num_mask, sizeof(device->sensor_num_mask));
- return;
- case 0x4://恢复使用4个传感器·
- // param->sensor_num = SENSOR_NUM;
- flash_ops->Erase_Flash(SENSOR_NUM_RECORD_BASE, SENSOR_NUM_RECORD_END);
- device->sensor_num_mask = SENSOR_NUM;
- flash_ops->Write_Flash(SENSOR_NUM_RECORD_BASE, (uint8_t *)&device->sensor_num_mask, sizeof(device->sensor_num_mask));
- break;
- case 0x29A:
- if (sensor == 3)
- {
- Restore_Factory_Setting();
- NVIC_SystemReset();
- }
- break;
- default:
- Sensor_tmp->base_k = Get_K(msg);
- Write_To_Flash(SENSOR1_INIT_VALUE_BASE + sensor * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + sensor * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
- break;
- }
- }
- Write_To_Flash(SENSOR1_INIT_VALUE_BASE + sensor * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + sensor * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
- }
- /*去皮重,重设零点*/
- static bool Peeling_Calib(void)
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
- //采样10次取平均
- uint32_t sum[4] = {0}, data[4] = {0}, err_count = 0;
- for(uint8_t i = 0; i < 10; i++)
- {
-
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- uint32_t temp = 0;
- if (sensor_num_c == device->sensor_num_mask)
- {
- continue;
- }
- temp = Read_Value(device->sensor[sensor_num_c]);
- while (temp== 0)
- {
- temp = Read_Value(device->sensor[sensor_num_c]);
- err_count++;
- if (err_count > 10 /*&& device->sensor_num_mask == 4*/)
- {
- device->sensor[sensor_num_c]->err_flag = true;
- device->sensor_num_mask = sensor_num_c;
- err_count = 0;
- //test 去皮失败
- return 0;
- }
- }
- sum[sensor_num_c] += temp;
- if(i == 9)
- data[sensor_num_c] = sum[sensor_num_c] / 10;
- HAL_Delay(13);
- }
- }
-
- Filter_Value(data);
- for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == device->sensor_num_mask)
- {
- continue;
- }
- device->sensor[sensor_num_c]->GrossWeight = device->sensor[sensor_num_c]->Raw_Value;
- }
- Save_GrossWeight(device);
- return 1;
- }
- /*称重校准*/
- static void Weight_Calib(FORMAT_RXMSG *msg)
- {
- uint32_t tmpint;
- uint8_t sensor_num_c;
- WEIGHING_DEVICE *device = Get_Device_Handle();
- memcpy(&tmpint, msg->Data, sizeof(tmpint));
- if (false == Auto_Calib(device, tmpint))
- {
- K_Value_Init(device);
- }
- Write_Check();
- for (sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
- {
- if (sensor_num_c == device->sensor_num_mask)
- {
- continue;
- }
- Save_K(msg, sensor_num_c); // 写入FLASH 默认配置
- }
- }
- /*改变CAN通信波特率*/
- //static void Change_CAN_Baud(FORMAT_RXMSG *msg)
- //{
- // uint16_t baudflag;
- // memcpy(&baudflag, msg->Data, sizeof(baudflag));
- // if (baudflag != 0x1F4 && baudflag != 0x3E8)
- // {
- // return;
- // }
- // Write_To_Flash(CAN_FLASH_BASE, CAN_FLASH_END, (uint8_t *)&baudflag, sizeof(baudflag));
- // HAL_CAN_DeInit(&hcan);
- // if (baudflag == 0x1F4)
- // {
- // MX_CAN_Init(8); // 500K
- // CAN_Init(CANTX_ID);
- // }
- // else
- // {
- // MX_CAN_Init(4); // 1000K
- // CAN_Init(CANTX_ID);
- // }
- //}
- /*写完flag重启*/
- static void Soft_Reset(void)
- {
- uint8_t buf[8] = {0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7};
- Write_To_Flash(RESET_FLASH_BASE, RESET_FLASH_END, buf, sizeof(buf));
- __set_FAULTMASK(1); // 软重启,主函数做了读取RCC_FLAG_SFTRST发送应答报文
- NVIC_SystemReset(); // 加上bootloader后读取标志位方法不可用,改为读写片内flash();
- }
- static void Reset_Device_Param(void)
- {
- Restore_Factory_Setting();
- Soft_Reset();
- }
- uint8_t k_set_num_test = 0;
- bool factory_calibration = false;
- /*解析PMU消息*/
- void Can_Rx_Decode( void)
- {
- Can_Rx *parse = &_can_rx;
- while (rkfifo_out(&can_rx_kfifo, parse, 1) == 1)
- {
-
- //while (rkfifo_out(&can_rx_kfifo, parse, 1) == 1)
- //{
- FORMAT_RXMSG *msg = (FORMAT_RXMSG *)parse->Rxdata;
- // if (parse->Rxheader.ExtId == CAN_REQ_UPGRADE_ID && msg->Code == WS_ID) // 跳BOOTLOADER并将APP大小写入FLASH
- // {
- // buf2int((int *)&ws_info._app_bin_size, (unsigned char *)msg->Data);
- // Write_Upgrade_Flag();
- // __set_FAULTMASK(1);
- // NVIC_SystemReset();
- // }
- switch (parse->Rxdata[0])
- {
- case 0xF1: // 去皮校准
- if(Peeling_Calib() == 1)
- ack_status = ack_f1;
- else
- ack_status = no_ack;
- break;
- case 0xF2: // 重量校准
- Weight_Calib(msg);
- ack_status = ack_f2;
- break;
- case 0xF3: // 更改波特率
- //Change_CAN_Baud(msg);
- break;
- case 0xF4: // 恢复出厂设置
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
- //Reset_Device_Param();
- device->correct_k = 1;
- Write_To_Flash(K1_VALUE_FLASH_BASE, K1_VALUE_FLASH_END, (uint8_t *)&device->correct_k, sizeof(device->correct_k));
- ack_status = ack_f4;
- break;
- }
- case 0xF6: // 软件版本
- ack_status = ack_f6;
- break;
- case 0xE1: // 查询K值
- ack_status = ack_e1;
- break;
- case 0xE2: // 设置K值
- Save_K(msg, msg->Num);
- ack_status = ack_e2;
- k_set_num_test = msg->Num;
- Can_Ack_Pmu();
- ack_status = ack_e1;
- break;
- case 0xF5:
- break;
- case 0xF7:
- break;
- case 0xE3:
- break;
- case 0xE4:
- break;
- case 0xE5:
- break;
- case 0xE6:
- break;
- case 0xE7://出厂K标定
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
-
- for(uint8_t i = 0; i < SENSOR_NUM; i++)
- {
- struct SENSOR *Sensor_tmp = device->sensor[i];
- Sensor_tmp->base_k = Sensor_tmp->Real_Variation / 1000;
- if (Sensor_tmp->base_k >= MAX_K || Sensor_tmp->base_k < MIN_K)
- {
- Sensor_tmp->base_k = 76.0f;
- }
- Write_To_Flash(SENSOR1_INIT_VALUE_BASE + i * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + i * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
- }
- ack_status = ack_e7;
- factory_calibration = true;
- break;
- }
- default:
- break;
- }
- }
- Can_Ack_Pmu();
- }
- void Can_Txmsg_Init(void)
- {
- FORMAT_CAN2PMU *msg = (FORMAT_CAN2PMU *)_can_tx.Txdata;
- _can_tx.Txheader.Identifier = CANTX_ID;
- memset(msg, 0, sizeof(FORMAT_CAN2PMU));
- }
- void Can_Txmsg_Target_Init(uint32_t can_id, uint8_t *data)
- {
- _can_tx.Txheader.Identifier = can_id;
- memcpy(&_can_tx.Txdata, data, 8);
- }
- static void Can_Ackmsg_Init(FORMAT_ACKMSG *msg)
- {
- _can_tx.Txheader.Identifier = CAN_ACK_ID;
- msg->Code = ack_status;
- memset(msg->Data, 0, sizeof(msg->Data));
- msg->CRCH = 0xFE;
- msg->CRCL = 0xFE;
- msg->Num = 0;
- }
- bool can_send(FDCAN_HandleTypeDef *hfdcan)
- {
- uint8_t retry = 0;
- while (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &_can_tx.Txheader, (uint8_t *)_can_tx.Txdata) != HAL_OK)
- {
- if (++retry >= 20)
- return false;
- }
- return true;
- }
- void Can_Ack_Pmu(void)
- {
- FORMAT_ACKMSG *msg = (FORMAT_ACKMSG *)_can_tx.Txdata;
- if (ack_status == no_ack)
- {
- return;
- }
- WEIGHING_DEVICE *device = Get_Device_Handle();
- uint16_t tmpshort = 0;
- uint32_t tmpint = 0;
- Can_Ackmsg_Init(msg);
- switch (ack_status)
- {
- case ack_f1:
- case ack_f4:
- break;
- case ack_f2:
- tmpint = device->Weight_current;
- memcpy(&msg->Data, &tmpint, sizeof(tmpint));
-
- can_send(&hfdcan2);
- Can_Txmsg_Init();
- ack_status = ack_e1;
- return;
- case ack_f6:
- tmpint = SOFT_VER;
- msg->Num = HARD_VER;
- memcpy(msg->Data, &tmpint, sizeof(tmpint));
- break;
- case ack_e1:
- for(uint8_t i = 0; i < SENSOR_NUM;i++)
- {
- if( isnan(device->sensor[i]->base_k))
- {
- device->sensor[i]->base_k = 88;
- }
- }
- tmpshort = (uint16_t)device->sensor[0]->base_k;
- memcpy(msg->Data, &tmpshort, sizeof(tmpshort));
- tmpshort = (uint16_t)device->sensor[1]->base_k;
- memcpy(msg->Data + 2, &tmpshort, sizeof(tmpshort));
- msg->Num = 0x01;
- can_send(&hfdcan2);
- tmpshort = ((uint16_t)device->sensor[2]->base_k) & 0x00FF;
- memcpy(msg->Data, &tmpshort, sizeof(tmpshort));
-
- memset(msg->Data + 2, 0, sizeof(tmpshort));
- // tmpshort = ((uint16_t)device->sensor[3]->base_k) & 0xFF;
- // memcpy(msg->Data + 2, &tmpshort, sizeof(tmpshort));
- msg->Num = 0x02;
- break;
- case ack_e2:
- tmpshort = (uint16_t)device->sensor[0]->K.f;
- memcpy(msg->Data, &tmpshort, sizeof(tmpshort));
- msg->Num = _can_rx.Rxdata[7];
- break;
- default:
- break;
- }
- ack_status = no_ack;
- can_send(&hfdcan2);
- //Can_Txmsg_Init();
- }
- void can2Pmu_3hz_info(void)
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
- _can_tx.Txheader.Identifier = CANTX_ID2;
- memset(&_can_tx.Txdata[0], 0 ,8);
-
- uint16_t temp = 0;
- temp = device->sensor[0]->Real_Weight / 10 ;
- memcpy(&_can_tx.Txdata[0],(uint16_t*)&temp,2);
- temp = device->sensor[1]->Real_Weight / 10 ;
- memcpy(&_can_tx.Txdata[2],(int16_t*)&temp,2);
- temp = device->sensor[2]->Real_Weight / 10 ;
- memcpy(&_can_tx.Txdata[4],(int16_t*)&temp,2);
- // temp = device->sensor[3]->Real_Weight / 10 ;
- // memcpy(&Data[6],(int16_t*)&temp,2);
- // if(device->sensor_num_mask == 3)
- // {
- // Data[6] = 0;
- // Data[7] = 0;
- // }
- can_send(&hfdcan2);
- //Can_Txmsg_Init();
- }
- void CAN2PMU_Send(void)
- {
- WEIGHING_DEVICE *device = Get_Device_Handle();
-
- Can_Txmsg_Init();
-
- static FORMAT_CAN2PMU *msg = (FORMAT_CAN2PMU *)_can_tx.Txdata;
- uint32_t tmp = (uint32_t)(fabsf(device->Weight_current));
- device->Weight_last = device->Weight_current;
- memcpy(msg->Weight, &tmp, sizeof(tmp));
- can_send(&hfdcan2);
-
- }
- //void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
- //{
- // if (hcan->Instance == CAN1)
- // {
- // Can_Tx can_tx;
- // uint32_t mailbox = 0;
- // if (rkfifo_out(&can_tx_kfifo, &can_tx, 1) == 1)
- // {
- // HAL_CAN_AddTxMessage(hcan, &can_tx.Txheader, can_tx.Txdata, &mailbox);
- // }
- // }
- //}
- // void CAN_Tx_Empty_Callback(CAN_HandleTypeDef *hcan)
- // {
- // if (hcan->Instance == CAN1)
- // {
- // Can_Tx can_tx;
- // uint32_t mailbox = 0;
- // if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TME0) != RESET)
- // {
- // if (rkfifo_out(&can_tx_kfifo, &can_tx, 1) == 1)
- // {
- // HAL_CAN_AddTxMessage(hcan, &can_tx.Txheader, can_tx.Txdata, &mailbox);
- // }
- // }
- // hcan->Instance->TSR = CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2;
- // }
- // }
- //void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
- //{
- // if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF0) != RESET)
- // {
- // __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
- // }
- // else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0) != RESET)
- // {
- // __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
- // }
- // if (hcan->Instance == CAN1)
- // {
- // Can_Rx can_rx;
- // HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &can_rx.Rxheader, (uint8_t *)&can_rx.Rxdata);
- // rkfifo_in(&can_rx_kfifo, &can_rx, 1);
- // }
- //}
- #if 0
- if(fitted_data.Fitted_Count == 0)
- {
- Set_Fitted_Data(Param,buf);
- }
- if(fitted_data.Fitted_Count != 0 && fitted_data.Fitted_Count < 8)
- {
- Set_Fitted_Data(Param,buf);
- for(sensor_num_c = 0; sensor_num_c < SENSOR_NUM;sensor_num_c++)
- {
- Apply_Least_Squares(Param->sensor[sensor_num_c]);
- }
- }
- fitted_data.Fitted_Count++; //count + 1 作为样本数
-
- if(fitted_data.Fitted_Count >= 7)
- {
- fitted_data.Fitted_Count = 0;
- }
- #endif
- #if 0
- void Set_Fitted_Data(WEIGHING_PARAM* param ,uint32_t buf)
- {
- for(uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM;sensor_num_c++)
- {
- struct SENSOR* sensor = param->sensor[sensor_num_c];
- fitted_data.RealWeight[sensor_num_c][fitted_data.Fitted_Count] = Get_Single_Weight(sensor, buf);
- fitted_data.Real_Variation[sensor_num_c][fitted_data.Fitted_Count] = sensor->Real_Variation;
- }
- }
- void Apply_Least_Squares(struct SENSOR* sensor)
- {
- Least_Squares(fitted_data.Fitted_Count + 1, fitted_data.RealWeight[sensor->Num],fitted_data.Real_Variation[sensor->Num], &sensor->K.f, &sensor->intercept.f);
- }
- #endif
|