273 lines
7.2 KiB
C
273 lines
7.2 KiB
C
/**
|
||
******************************************************************************
|
||
* @file pch_sensors.c
|
||
* @brief Работа с датчиками температуры DS18B20 в ПЧ
|
||
*****************************************************************************/
|
||
|
||
|
||
/* Includes ----------------------------------------------------------------*/
|
||
|
||
#include "pch_sensors.h"
|
||
#include "modbus_data.h"
|
||
|
||
/* Declarations and definitions --------------------------------------------*/
|
||
|
||
/* 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->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;
|
||
|
||
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_ModuleReadTemperature(PCHSens_ModuleTypeDef* module)
|
||
{
|
||
HAL_StatusTypeDef result;
|
||
|
||
if(module == NULL)
|
||
return HAL_ERROR;
|
||
|
||
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens1);
|
||
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens2);
|
||
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens3);
|
||
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens4);
|
||
|
||
return result;
|
||
}
|
||
HAL_StatusTypeDef PCHSens_SensorReadTemperature(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef *sensor)
|
||
{
|
||
HAL_StatusTypeDef result;
|
||
if(hdallas == NULL)
|
||
return HAL_ERROR;
|
||
if(sensor == NULL)
|
||
return HAL_ERROR;
|
||
|
||
result = PCHSens_ReadTemperature(sensor);
|
||
if(result != HAL_OK)
|
||
PCHSens_CheckSensor(hdallas, sensor);
|
||
|
||
return result;
|
||
}
|
||
HAL_StatusTypeDef PCHSens_StartCovert(PCHSens_DallasBusHandle *hbus)
|
||
{
|
||
return Dallas_StartConvertTAll(hbus->hdallas, DALLAS_WAIT_NONE, 0);
|
||
}
|
||
HAL_StatusTypeDef PCHSens_ReadTemperature(PCHSens_SensorTypeDef* sensor)
|
||
{
|
||
HAL_StatusTypeDef result;
|
||
|
||
if(sensor == NULL)
|
||
return HAL_ERROR;
|
||
if(sensor->sens.isInitialized == 0)
|
||
return HAL_ERROR;
|
||
|
||
result = Dallas_ReadTemperature(&sensor->sens);
|
||
|
||
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.isLost == 1) || (sensor->sens.isInitialized == 0))
|
||
{
|
||
if(Dallas_ReplaceLostedSensor(&sensor->sens) == HAL_ERROR)
|
||
{
|
||
sensor->not_found = 1;
|
||
}
|
||
else
|
||
{
|
||
sensor->not_found = 0;
|
||
}
|
||
}
|
||
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_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_GetSensorByLocation(PCHSens_TypeDef *pchsens, PCHSens_LocationTypeDef Location, PCHSens_SensorTypeDef **sensor)
|
||
{
|
||
PCHSens_ModuleTypeDef *module;
|
||
uint8_t pch_numb = (Location.param.PCHdig1 - 1)*3 + (Location.param.PCHdig2 - 1);
|
||
|
||
switch(pch_numb)
|
||
{
|
||
case 0:
|
||
module = &pchsens->module1; break;
|
||
case 1:
|
||
module = &pchsens->module2; break;
|
||
case 2:
|
||
module = &pchsens->module3; break;
|
||
case 3:
|
||
module = &pchsens->module4; break;
|
||
case 4:
|
||
module = &pchsens->module5; break;
|
||
case 5:
|
||
module = &pchsens->module6; break;
|
||
default:
|
||
return HAL_ERROR;
|
||
}
|
||
|
||
switch(Location.param.Location)
|
||
{
|
||
case 0:
|
||
*sensor = &module->sens1; break;
|
||
case 1:
|
||
*sensor = &module->sens2; break;
|
||
case 2:
|
||
*sensor = &module->sens3; break;
|
||
case 3:
|
||
*sensor = &module->sens4; break;
|
||
}
|
||
|
||
return HAL_OK;
|
||
}
|