314 lines
8.5 KiB
C
314 lines
8.5 KiB
C
/**
|
|
******************************************************************************
|
|
* @file pch_sensors.c
|
|
* @brief Ðàáîòà ñ äàò÷èêàìè òåìïåðàòóðû DS18B20 â Ï×
|
|
*****************************************************************************/
|
|
|
|
|
|
/* Includes ----------------------------------------------------------------*/
|
|
|
|
#include "pch_sensors.h"
|
|
#include "modbus_data.h"
|
|
PCHSens_DallasBusHandle DallasBus;
|
|
PCHSens_SensorActionsTypeDef action;
|
|
|
|
/* Declarations and definitions --------------------------------------------*/
|
|
|
|
PCHSens_ModuleTypeDef module1;
|
|
PCHSens_ModuleTypeDef module2;
|
|
PCHSens_ModuleTypeDef module3;
|
|
PCHSens_ModuleTypeDef module4;
|
|
PCHSens_ModuleTypeDef module5;
|
|
PCHSens_ModuleTypeDef module6;
|
|
/* Functions ---------------------------------------------------------------*/
|
|
HAL_StatusTypeDef PCHSens_InitNewSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor, uint64_t ROM)
|
|
{
|
|
DALLAS_SensorHandleTypeDef tempsens;
|
|
HAL_StatusTypeDef result;
|
|
if(hdallas == NULL)
|
|
return HAL_ERROR;
|
|
if(sensor == NULL)
|
|
return HAL_ERROR;
|
|
|
|
// sensor->UserBytes = (PCHSens_LocationTypeDef *)&sensor->sens.scratchpad.tHighRegister;
|
|
|
|
sensor->sens.Init.InitParam = ROM;
|
|
sensor->sens.Init.init_func = &Dallas_SensorInitByROM;
|
|
|
|
result = Dallas_AddNewSensors(hdallas, &sensor->sens);
|
|
if(result != HAL_OK)
|
|
{
|
|
sensor->not_found = 1;
|
|
return result;
|
|
}
|
|
|
|
result = Dallas_WriteUserBytes(&sensor->sens, sensor->Location.all, sensor->Location.all, USED_USER_BYTES);
|
|
if(result != HAL_OK)
|
|
return result;
|
|
|
|
sensor->sens.Init.InitParam = sensor->Location.all;
|
|
sensor->sens.Init.init_func = &Dallas_SensorInitByUserBytes;
|
|
|
|
result = Dallas_AddNewSensors(hdallas, &sensor->sens);
|
|
if(result == HAL_OK)
|
|
{
|
|
sensor->not_found = 0;
|
|
}
|
|
else
|
|
{
|
|
sensor->not_found = 1;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
|
|
HAL_StatusTypeDef PCHSens_AddSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
if(hdallas == NULL)
|
|
return HAL_ERROR;
|
|
if(sensor == NULL)
|
|
return HAL_ERROR;
|
|
|
|
// sensor->UserBytes = (PCHSens_LocationTypeDef *)&sensor->sens.scratchpad.tHighRegister;
|
|
|
|
sensor->sens.Init.InitParam = sensor->Location.all;
|
|
|
|
sensor->sens.Init.init_func = &Dallas_SensorInitByUserBytes;
|
|
|
|
result = Dallas_AddNewSensors(hdallas, &sensor->sens);
|
|
|
|
if(result == HAL_OK)
|
|
{
|
|
sensor->not_found = 0;
|
|
}
|
|
else
|
|
{
|
|
sensor->not_found = 1;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
HAL_StatusTypeDef PCHSens_InitModule(DALLAS_HandleTypeDef *hdallas, PCHSens_ModuleTypeDef* module, uint16_t param)
|
|
{
|
|
if(hdallas == NULL)
|
|
return HAL_ERROR;
|
|
if(module == NULL)
|
|
return HAL_ERROR;
|
|
|
|
PCHSens_LocationTypeDef initlocation;
|
|
initlocation.all = param;
|
|
action.read = 1;
|
|
|
|
module->hdallas = hdallas;
|
|
module->refLocation = initlocation;
|
|
|
|
module->sens1.Location.all = module->refLocation.all;
|
|
module->sens1.Location.param.Location = 0;
|
|
PCHSens_AddSensor(hdallas, &module->sens1);
|
|
|
|
module->sens2.Location.all = module->refLocation.all;
|
|
module->sens2.Location.param.Location = 1;
|
|
PCHSens_AddSensor(hdallas, &module->sens2);
|
|
|
|
module->sens3.Location.all = module->refLocation.all;
|
|
module->sens3.Location.param.Location = 2;
|
|
PCHSens_AddSensor(hdallas, &module->sens3);
|
|
|
|
module->sens4.Location.all = module->refLocation.all;
|
|
module->sens4.Location.param.Location = 3;
|
|
PCHSens_AddSensor(hdallas, &module->sens4);
|
|
return HAL_OK;
|
|
}
|
|
|
|
|
|
HAL_StatusTypeDef PCHSens_ModuleHandleAction(PCHSens_ModuleTypeDef* module)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
|
|
if(module == NULL)
|
|
return HAL_ERROR;
|
|
|
|
result = PCHSens_SensorHandleActions(module->hdallas, &module->sens1);
|
|
result = PCHSens_SensorHandleActions(module->hdallas, &module->sens2);
|
|
result = PCHSens_SensorHandleActions(module->hdallas, &module->sens3);
|
|
result = PCHSens_SensorHandleActions(module->hdallas, &module->sens4);
|
|
|
|
return result;
|
|
}
|
|
HAL_StatusTypeDef PCHSens_Covert(PCHSens_DallasBusHandle *hbus)
|
|
{
|
|
return Dallas_StartConvertTAll(hbus->hdallas, DALLAS_WAIT_BUS, 0);
|
|
}
|
|
HAL_StatusTypeDef PCHSens_ReadTemperature(PCHSens_SensorTypeDef* sensor)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
|
|
if(sensor == NULL)
|
|
return HAL_ERROR;
|
|
|
|
result = Dallas_ReadTemperature(&sensor->sens);
|
|
PCHSens_StoreToModbus(sensor);
|
|
|
|
return result;
|
|
}
|
|
HAL_StatusTypeDef PCHSens_CheckSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
unsigned unknow_sensors_flag = 0;
|
|
|
|
if(sensor == NULL)
|
|
return HAL_ERROR;
|
|
if(sensor->sens.isInitialized == 0)
|
|
return HAL_ERROR;
|
|
|
|
if((sensor->sens.isLost == 1))
|
|
{
|
|
if(Dallas_ReplaceLostedSensor(&sensor->sens) != HAL_OK)
|
|
{
|
|
sensor->not_found = 1;
|
|
}
|
|
else
|
|
{
|
|
sensor->not_found = 0;
|
|
}
|
|
}
|
|
return HAL_OK;
|
|
}
|
|
|
|
|
|
HAL_StatusTypeDef PCHSens_FindUnknownSensors(PCHSens_DallasBusHandle *hbus)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
if(hbus == NULL)
|
|
return HAL_ERROR;
|
|
|
|
hbus->UnknownCnt = 0;
|
|
|
|
PCHSens_LocationTypeDef *param = (PCHSens_LocationTypeDef *)&hbus->hdallas->scratchpad.tHighRegister;
|
|
for(int i = 0; i < hbus->hdallas->onewire->RomCnt; i++)
|
|
{
|
|
/* Ïðîâåðêà ïðèñóòñòâóåò ëè âûáðàííûé äàò÷èê íà ëèíèè */
|
|
result = DS18B20_ReadScratchpad(hbus->hdallas->onewire, (uint8_t *)&DS.DevAddr[i], (uint8_t *)&hbus->hdallas->scratchpad);
|
|
if(result != HAL_OK)
|
|
__NOP();
|
|
|
|
if((IS_REG_SENS_LOCATION(param) == 0) ||
|
|
(IS_REG_PCH_LOCATION(param) == 0) ||
|
|
(IS_REG_PCH_NUMB(param) == 0) )
|
|
{
|
|
// unknowns->unknown_sensors[unknowns->UnknownCnt].Init.InitParam = i;
|
|
// unknowns->unknown_sensors[unknowns->UnknownCnt].Init.init_func = &Dallas_SensorInitByInd;
|
|
// result = Dallas_AddNewSensors(hbus, &unknowns->unknown_sensors[unknowns->UnknownCnt]);
|
|
hbus->UnknownCnt++;
|
|
if(result != HAL_OK)
|
|
__NOP();
|
|
}
|
|
}
|
|
return HAL_OK;
|
|
}
|
|
//HAL_StatusTypeDef PCHSens_DefineUnknownSensor(PCHSens_UnknownSensorsTypeDef *unknowns, PCHSens_SensorTypeDef *sensor)
|
|
//{
|
|
// HAL_StatusTypeDef result;
|
|
// if(sensor == NULL)
|
|
// return HAL_ERROR;
|
|
//
|
|
// if((unknowns->ROMtoDefine != NULL) && (unknowns->LocationtoDefine.all != NULL) && (unknowns->senstoDefine != NULL))
|
|
// {
|
|
// result = PCHSens_InitNewSensor(unknowns->onewire, unknowns->senstoDefine, unknowns->ROMtoDefine);
|
|
// unknowns->ROMtoDefine = 0;
|
|
// unknowns->LocationtoDefine.all = 0;
|
|
// unknowns->senstoDefine = 0;
|
|
// return result;
|
|
// }
|
|
// return HAL_OK;
|
|
//}
|
|
|
|
HAL_StatusTypeDef PCHSens_UndefineSensor(PCHSens_SensorTypeDef *sensor)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
if(sensor == NULL)
|
|
return HAL_ERROR;
|
|
|
|
result = Dallas_WriteUserBytes(&sensor->sens, 0, 0, USED_USER_BYTES);
|
|
if(result != HAL_OK)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
result = Dallas_SensorDeInit(&sensor->sens);
|
|
return result;
|
|
}
|
|
|
|
HAL_StatusTypeDef PCHSens_SensorHandleActions(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef *sensor)
|
|
{
|
|
HAL_StatusTypeDef result;
|
|
if(sensor == NULL)
|
|
return HAL_ERROR;
|
|
|
|
if(action.connectROM != NULL)
|
|
{
|
|
result = PCHSens_InitNewSensor(hdallas, sensor, action.connectROM);
|
|
action.connectROM = 0;
|
|
}
|
|
|
|
if(action.read != NULL)
|
|
{
|
|
result = PCHSens_ReadTemperature(sensor);
|
|
if(result != HAL_OK)
|
|
PCHSens_CheckSensor(hdallas, sensor);
|
|
}
|
|
|
|
if(action.deinit != NULL)
|
|
{
|
|
action.deinit = 0;
|
|
result = PCHSens_UndefineSensor(sensor);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void PCHSens_FirstInit(void)
|
|
{
|
|
int init_find = 0;
|
|
OW.DataPin = DS_Pin;
|
|
OW.DataPort = DS_GPIO_Port;
|
|
DS.Resolution = DS18B20_RESOLUTION_9BITS;
|
|
|
|
OneWire_Init(&OW);
|
|
DS18B20_Search(&DS, &OW);
|
|
|
|
DallasBus.hdallas = &hdallas1;
|
|
DallasBus.hdallas->onewire = &OW;
|
|
|
|
|
|
|
|
PCHSens_InitModule(&hdallas1, &module1, REG_PCH_NUMB_11|REG_PCH_DIODE_NUMB_1);
|
|
PCHSens_InitModule(&hdallas1, &module2, REG_PCH_NUMB_12|REG_PCH_DIODE_NUMB_1);
|
|
PCHSens_InitModule(&hdallas1, &module3, REG_PCH_NUMB_13|REG_PCH_DIODE_NUMB_1);
|
|
PCHSens_InitModule(&hdallas1, &module4, REG_PCH_NUMB_21|REG_PCH_DIODE_NUMB_1);
|
|
PCHSens_InitModule(&hdallas1, &module5, REG_PCH_NUMB_22|REG_PCH_DIODE_NUMB_1);
|
|
PCHSens_InitModule(&hdallas1, &module6, REG_PCH_NUMB_23|REG_PCH_DIODE_NUMB_1);
|
|
|
|
PCHSens_FindUnknownSensors(&DallasBus);
|
|
}
|
|
|
|
|
|
void PCHSens_StoreToModbus(PCHSens_SensorTypeDef *sensor)
|
|
{
|
|
uint8_t pch_numb = (sensor->Location.param.PCHdig1 - 1)*3 + (sensor->Location.param.PCHdig2 - 1);
|
|
uint8_t location = (sensor->Location.param.Location);
|
|
|
|
uint8_t mb_location = pch_numb*4 + location;
|
|
|
|
if (mb_location < DS18B20_DEVICE_AMOUNT)
|
|
MB_DATA.InRegs.SensTemperature[mb_location] = sensor->sens.temperature*100;
|
|
}
|
|
|
|
|
|
|