20230731_XiaoFuZi_emb/ZheDaXiaoFuZi/Src/Usr/Task/McuTaskInPara.c

350 lines
14 KiB
C
Raw Normal View History

#include "MCUTaskInPara.h"
#include "McuBspAdc.h"
#include "McuBspGpio.h"
#include "bme68x.h"
#include "bme68x_defs.h"
#include "McuBspI2c.h"
#include "McuTaskBlueTooth.h"
#include "ZthyToolDataTypeSwitch.h"
#include "BeiDouHtyDrv.h"
#include "McuTaskFlash.h"
#include "McuSelfDestructionDrv.h"
#include "McuBspTimer.h"
#include <string.h>
#include <stdio.h>
#define MCU_TASK_POWER_V_ADC MCU_ADC1
#define MCU_TASK_BME680_IIC_ADDR 0xEC // 已经进行了一位偏移
#define MCU_TASK_BME680_IIC_TYPE MCU_BSP_I2C_REG // 哪一种IIC通信(主从或者带寄存器)
#define MCU_TASK_BME680_IIC_ID MCU_BSP_I2C2_ID // 使用那一路IIC进行通信
/* 控制引脚配置 */
#define MCU_TASK_ADC_ONOFF_GPIO_PORT GPIOF
#define MCU_TASK_ADC_ONOFF_GPIO_PIN GPIO_PIN_15
#define MCU_TASK_ADC_ONOFF_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_ADC_ONOFF_GPIO_SPEED GPIO_SPEED_FREQ_HIGH
#define MCU_TASK_ADC_ONOFF_GPIO_PULL GPIO_PULLDOWN
static int McuTaskAdcInit(void);
/* ADC上电 */
static void McuTaskAdcUpPower(void);
static void McuTaskAdcDownPower(void);
/* 关于自毁信号的处理函数 */
static void McuTaskSelfStructionHandle(void);
/* 蓝牙发送标志位 */
static int gMcuTaskInParaBlueToothSendFlag = 0;
static unsigned short gMcuTaskInParaBlueToothSerial = 0;
static unsigned char gMcuTaskInParaBlueToothSendBuf[18] = {0};
/* 北斗发送标志位 */
static int gMcuTaskInParaBeiDouSendFlag = 0;
static unsigned char gMcuTaskInParaBeiDouSerial = 0;
/* 电压AD监测 */
static float gMcuTaskInParaPower = 0.0f;
static uint32_t gMcuTaskInParaPower32 = 0;
/* BME680 */
static uint8_t gNfields = 0; // 数据内容是否为最新内容
static struct bme68x_data gData = {0}; // BME680的采集数据
static struct bme68x_dev gMcuTaskBme680Dev = {0}; // 新建一个设备
static uint8_t gMcuTaskBme680DevId = MCU_TASK_BME680_IIC_ADDR; // 设备地址
static uint32_t gMcuTaskBme680Temp = 0; // 温度的4字节底层存储形式
static uint32_t gMcuTaskBme680Humi = 0; // 湿度的4字节底层存储形式
static uint32_t gMcuTaskBme680Press = 0; // 压力的4字节底层存储形式
/* 自毁模式 */
static int gMcuTaskSelfDestructionMode = 0;
static int gMcuTaskSelfDestructioTimer1Id = 0;
static MCU_BSP_TIMER_TASK gMcuTaskSelfDestructioTimer1;
static int gMcuTaskSelfDestructioTimer2Id = 0;
static MCU_BSP_TIMER_TASK gMcuTaskSelfDestructioTimer2;
static int8_t McuTaskBme680Init(void);
static int8_t McuTaskBme680Measure(void);
static BME68X_INTF_RET_TYPE McuTaskBme680Read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length,
void *intf_ptr);
static BME68X_INTF_RET_TYPE McuTaskBme680Write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length,
void *intf_ptr);
static void McuTaskBme680DelayUs(uint32_t period, void *intf_ptr);
/* 关于自毁定时器反馈 */
static void McuTaskSelfStructionTimer1Handle(void);
static void McuTaskSelfStructionTimer2Handle(void);
/* 内部参数初始化 */
int McuTaskInParaInit(void)
{
/* 初始化BME680 */
McuTaskBme680Init();
/* 初始化ADC采样 */
McuTaskAdcInit();
/* 初始化自毁信号 */
McuSelfDestructionDrvInit(McuTaskSelfStructionHandle);
gMcuTaskSelfDestructionMode = McuTaskFlashGetSelfDestruction(); // 获取保存的自毁模式状态
if (gMcuTaskSelfDestructionMode < 0) {
gMcuTaskSelfDestructionMode = 0;
}
McuSelfDestructionDrvSetMode(gMcuTaskSelfDestructionMode);
gMcuTaskSelfDestructioTimer1.TaskPeriod = 30;
gMcuTaskSelfDestructioTimer1.Callback = McuTaskSelfStructionTimer1Handle;
gMcuTaskSelfDestructioTimer2.TaskPeriod = 10;
gMcuTaskSelfDestructioTimer2.Callback = McuTaskSelfStructionTimer2Handle;
return 0;
}
int McuTaskInParaTask(void)
{
if (gMcuTaskInParaBlueToothSendFlag == 1 || gMcuTaskInParaBeiDouSendFlag == 1) {
McuTaskFlashWriteOpt("InPara Join\r\n", strlen("InPara Join\r\n"));
/* 获取数据 */
McuTaskAdcUpPower();
HAL_Delay(2000);
McuBspAdcGetData(MCU_TASK_POWER_V_ADC, &gMcuTaskInParaPower);
McuTaskAdcDownPower();
McuTaskBme680Measure();
if (gMcuTaskInParaBlueToothSendFlag == 1) {
ZthyToolFloatToUint32(gData.temperature, &gMcuTaskBme680Temp);
ZthyToolFloatToUint32(gData.humidity, &gMcuTaskBme680Humi);
ZthyToolFloatToUint32(gData.pressure, &gMcuTaskBme680Press);
ZthyToolFloatToUint32(gMcuTaskInParaPower, &gMcuTaskInParaPower32);
gMcuTaskInParaBlueToothSendBuf[0] = 1;
gMcuTaskInParaBlueToothSendBuf[1] = (uint8_t)((gMcuTaskBme680Temp & 0xff000000) >> 24);
gMcuTaskInParaBlueToothSendBuf[2] = (uint8_t)((gMcuTaskBme680Temp & 0x00ff0000) >> 16);
gMcuTaskInParaBlueToothSendBuf[3] = (uint8_t)((gMcuTaskBme680Temp & 0x0000ff00) >> 8);
gMcuTaskInParaBlueToothSendBuf[4] = (uint8_t)(gMcuTaskBme680Temp & 0x000000ff);
gMcuTaskInParaBlueToothSendBuf[5] = (uint8_t)((gMcuTaskBme680Humi & 0xff000000) >> 24);
gMcuTaskInParaBlueToothSendBuf[6] = (uint8_t)((gMcuTaskBme680Humi & 0x00ff0000) >> 16);
gMcuTaskInParaBlueToothSendBuf[7] = (uint8_t)((gMcuTaskBme680Humi & 0x0000ff00) >> 8);
gMcuTaskInParaBlueToothSendBuf[8] = (uint8_t)(gMcuTaskBme680Humi & 0x000000ff);
gMcuTaskInParaBlueToothSendBuf[9] = (uint8_t)((gMcuTaskBme680Press & 0xff000000) >> 24);
gMcuTaskInParaBlueToothSendBuf[10] = (uint8_t)((gMcuTaskBme680Press & 0x00ff0000) >> 16);
gMcuTaskInParaBlueToothSendBuf[11] = (uint8_t)((gMcuTaskBme680Press & 0x0000ff00) >> 8);
gMcuTaskInParaBlueToothSendBuf[12] = (uint8_t)(gMcuTaskBme680Press & 0x000000ff);
gMcuTaskInParaBlueToothSendBuf[13] = (uint8_t)((gMcuTaskInParaPower32 & 0xff000000) >> 24);
gMcuTaskInParaBlueToothSendBuf[14] = (uint8_t)((gMcuTaskInParaPower32 & 0x00ff0000) >> 16);
gMcuTaskInParaBlueToothSendBuf[15] = (uint8_t)((gMcuTaskInParaPower32 & 0x0000ff00) >> 8);
gMcuTaskInParaBlueToothSendBuf[16] = (uint8_t)(gMcuTaskInParaPower32 & 0x000000ff);
gMcuTaskInParaBlueToothSendBuf[17] = (uint8_t)gMcuTaskSelfDestructionMode;
McuTaskFlashWriteOpt("InPara BlueTh Send Data\r\n", strlen("InPara BlueTh Send Data\r\n"));
TaskBlueToothSendMessage(MCU_TASK_INPARA_SEND_MESSAGE_ID, &gMcuTaskInParaBlueToothSerial, gMcuTaskInParaBlueToothSendBuf, sizeof(gMcuTaskInParaBlueToothSendBuf));
gMcuTaskInParaBlueToothSerial++;
gMcuTaskInParaBlueToothSendFlag = 0;
}
if (gMcuTaskInParaBeiDouSendFlag == 1) {
unsigned char crc = 0;
int i = 0;
unsigned char BeiDouSend[70] = {0};
gMcuTaskInParaBeiDouSendFlag = 0;
crc = 0;
sprintf((char *)BeiDouSend, "InPara 01 %03d %0.2f %0.2f %0.2f %0.2f", gMcuTaskInParaBeiDouSerial, gData.temperature, gData.humidity, gData.pressure, gMcuTaskInParaPower);
for (i = 0; i < strlen((char *)BeiDouSend); i++) {
crc ^= BeiDouSend[i];
}
sprintf((char *)&BeiDouSend[strlen((char *)BeiDouSend)], "%x", crc);
McuDrvBeiDouHtySendPacket(BeiDouSend, strlen((char *)BeiDouSend));
gMcuTaskInParaBeiDouSerial++;
gMcuTaskInParaBeiDouSerial = gMcuTaskInParaBeiDouSerial % 1000;
McuTaskFlashWriteOpt("InPara BeiDou Send Data\r\n", strlen("InPara BeiDou Send Data\r\n"));
}
McuTaskFlashWriteInPara(gData.temperature, gData.humidity, gData.pressure, gMcuTaskInParaPower, gMcuTaskSelfDestructionMode);
}
return 0;
}
/* 蓝牙请求数据 */
void McuTaskInParaBlueToothAsk(void)
{
gMcuTaskInParaBlueToothSendFlag = 1;
}
/* 北斗请求数据 */
void McuTaskInParaBeiDouAsk(void)
{
gMcuTaskInParaBeiDouSendFlag = 1;
}
/* 获取数据请求状态 */
int McuTaskInParaAskStatus(void)
{
return ((gMcuTaskInParaBlueToothSendFlag * 2) | gMcuTaskInParaBeiDouSendFlag);
}
/* 设置自毁状态 */
void McuTaskSetSelfStructionMode(uint8_t mode)
{
if (gMcuTaskSelfDestructionMode != mode) {
gMcuTaskSelfDestructionMode = mode;
/* 保存自毁模式状态 */
McuTaskFlashSetSelfDestruction(gMcuTaskSelfDestructionMode);
/* 设置自毁模式状态 */
McuSelfDestructionDrvSetMode(gMcuTaskSelfDestructionMode);
if (gMcuTaskSelfDestructionMode == 0) {
if (gMcuTaskSelfDestructioTimer1Id >= 0) {
McuBspTimerDelTask(gMcuTaskSelfDestructioTimer1Id);;
}
if (gMcuTaskSelfDestructioTimer2Id >= 0) {
McuBspTimerDelTask(gMcuTaskSelfDestructioTimer2Id);;
}
}
}
}
/* 关于自毁信号的处理函数 */
static void McuTaskSelfStructionHandle(void)
{
/* 判断触发中断的引脚是不是被拉起 */
if (1 == McuSelfDestructionDrvGetSta()) {
if (gMcuTaskSelfDestructioTimer1Id < 0) {
gMcuTaskSelfDestructioTimer1Id = McuBspTimerAddTask(&gMcuTaskSelfDestructioTimer1);
}
if (gMcuTaskSelfDestructioTimer2Id >= 0) {
McuBspTimerTaskRefresh(gMcuTaskSelfDestructioTimer2Id);
}
} else {
if (gMcuTaskSelfDestructioTimer1Id >= 0) {
McuBspTimerTaskRefresh(gMcuTaskSelfDestructioTimer1Id);
}
if (gMcuTaskSelfDestructioTimer2Id < 0) {
gMcuTaskSelfDestructioTimer2Id = McuBspTimerAddTask(&gMcuTaskSelfDestructioTimer2);
}
}
}
/* 关于自毁倒计时定时器反馈 */
static void McuTaskSelfStructionTimer1Handle(void)
{
/* 输出自毁信号 */
McuSelfDestructionDrvOnOff(1); // 打开自毁信号
if (gMcuTaskSelfDestructioTimer2Id < 0) {
return;
}
McuBspTimerDelTask(gMcuTaskSelfDestructioTimer2Id);
gMcuTaskSelfDestructioTimer2Id = -1;
}
/* 关于关闭自毁倒计时定时器反馈 */
static void McuTaskSelfStructionTimer2Handle(void)
{
/* 删除自毁倒计时定时器 */
if (gMcuTaskSelfDestructioTimer1Id < 0) {
return;
}
McuBspTimerDelTask(gMcuTaskSelfDestructioTimer1Id);
gMcuTaskSelfDestructioTimer1Id = -1;
}
/* BME680初始化 */
static int8_t McuTaskBme680Init(void)
{
int8_t rslt;
struct bme68x_conf conf;
struct bme68x_heatr_conf heatr_conf;
McuBspI2cInit(MCU_TASK_BME680_IIC_ID);
gMcuTaskBme680Dev.amb_temp = 25;
gMcuTaskBme680Dev.read = McuTaskBme680Read;
gMcuTaskBme680Dev.write = McuTaskBme680Write;
gMcuTaskBme680Dev.intf = BME68X_I2C_INTF;
gMcuTaskBme680Dev.delay_us = McuTaskBme680DelayUs;
gMcuTaskBme680Dev.intf_ptr = &gMcuTaskBme680DevId;
rslt = bme68x_init(&gMcuTaskBme680Dev);
if (rslt == BME68X_OK) {
/* Set the temperature, pressure and humidity & filter settings */
conf.filter = BME68X_FILTER_SIZE_3;
conf.odr = BME68X_ODR_NONE;
conf.os_hum = BME68X_OS_4X;
conf.os_pres = BME68X_OS_4X;
conf.os_temp = BME68X_OS_4X;
/* Set the remaining gas sensor settings and link the heating profile */
heatr_conf.enable = BME68X_DISABLE;
heatr_conf.heatr_dur = 0;
heatr_conf.heatr_temp = 0;
rslt = bme68x_set_heatr_conf(BME68X_FORCED_MODE, &heatr_conf, &gMcuTaskBme680Dev);
if (rslt == BME68X_OK) {
rslt = bme68x_set_conf(&conf, &gMcuTaskBme680Dev);
if (rslt == BME68X_OK) {
return rslt;
}
}
}
return -1;
}
static int8_t McuTaskBme680Measure(void)
{
int8_t rslt;
gNfields = 0;
/* 只有在FORCED_MODE下才能进行数据采集 */
rslt = bme68x_set_op_mode(BME68X_FORCED_MODE, &gMcuTaskBme680Dev);
if (rslt != BME68X_OK) {
return -1;
}
rslt = bme68x_get_data(BME68X_FORCED_MODE, &gData, &gNfields, &gMcuTaskBme680Dev);
if (rslt != BME68X_OK) {
return -1;
}
rslt = bme68x_set_op_mode(BME68X_SLEEP_MODE, &gMcuTaskBme680Dev);
if (rslt != BME68X_OK) {
return -1;
}
return 0;
}
static BME68X_INTF_RET_TYPE McuTaskBme680Read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length,
void *intf_ptr)
{
return (BME68X_INTF_RET_TYPE)McuBspI2cRecvData(MCU_TASK_BME680_IIC_TYPE, MCU_TASK_BME680_IIC_ID,
*(uint8_t *)intf_ptr, reg_addr, I2C_MEMADD_SIZE_8BIT, reg_data, length);
}
static BME68X_INTF_RET_TYPE McuTaskBme680Write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length,
void *intf_ptr)
{
return (BME68X_INTF_RET_TYPE)McuBspI2cSendData(MCU_TASK_BME680_IIC_TYPE, MCU_TASK_BME680_IIC_ID,
*(uint8_t *)intf_ptr, reg_addr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)reg_data, length);
}
static void McuTaskBme680DelayUs(uint32_t period, void *intf_ptr)
{
if (intf_ptr != NULL) {
intf_ptr = NULL;
}
uint32_t i = 35; // 35 = 72 / 2 -1;
while (period) {
while (i) {
i--;
}
period--;
i = 35;
}
}
/********************************ADC*******************************/
static int McuTaskAdcInit(void)
{
McuBspGpioInit(MCU_TASK_ADC_ONOFF_GPIO_PORT, MCU_TASK_ADC_ONOFF_GPIO_PIN,
MCU_TASK_ADC_ONOFF_GPIO_MODE, MCU_TASK_ADC_ONOFF_GPIO_SPEED,
MCU_TASK_ADC_ONOFF_GPIO_PULL, 0, NULL);
McuBspAdcInit();
McuTaskAdcDownPower();
return 0;
}
/* ADC上电 */
static void McuTaskAdcUpPower(void)
{
McuBspGpioSetLevel(MCU_TASK_ADC_ONOFF_GPIO_PORT, MCU_TASK_ADC_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
}
/* ADC下电 */
static void McuTaskAdcDownPower(void)
{
McuBspGpioSetLevel(MCU_TASK_ADC_ONOFF_GPIO_PORT, MCU_TASK_ADC_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
}