You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.8 KiB

#include "IDIBUS_1Wire.h"
IdiBus_1Wire::IdiBus_1Wire (IdiBusSerialLine *SlaveLine, uint8_t SlaveAddress) : IdiBusSlave(SlaveLine, SlaveAddress)
{
for (uint8_t I=0; I<IDIBUS_1Wire_CH_COUNT; I++)
{
this->CH[I].MMES_Error = 0;
this->CH[I].Temperature = 0;
//this->CH[I].STATUS.Enable = 0;
}
}
IdiBus_1Wire::IdiBus_1Wire () : IdiBusSlave()
{
for (uint8_t I=0; I<IDIBUS_1Wire_CH_COUNT; I++)
{
this->CH[I].MMES_Error = 0;
this->CH[I].Temperature = 0;
//this->CH[I].STATUS.Enable = 0;
}
}
IDIBUS_1Wire_DATA_TYPE IdiBus_1Wire::getChData(uint8_t ChNum){
if ( ChNum < IDIBUS_1Wire_CH_COUNT ) { return this->CH[ChNum]; }
else { return this->CH[IDIBUS_1Wire_CH3_NUM]; }
}
void IdiBus_1Wire::changeAllAutomatiocConversionStates()
{
IdiBusMMES MMES(this->Address);
MMES.DEV.NUM = IDIBUS_1Wire_CNTRL_DEV;
MMES.DEV.ALLCH = 1;
MMES.ComFunc = 0x01;
uint8_t ChDataSize = 1;
uint8_t RequestError = this->SendRequestMMES(&MMES);
if ( RequestError != IDIER_NOPE ) { this->setAllChErr(RequestError); return; }
else if (MMES.RxDataLength < IDIBUS_1Wire_CH_COUNT) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); return; }
else {
uint8_t ExpDataLength = IDIBUS_1Wire_CH_COUNT; // Errors
for (uint8_t I=0; I<IDIBUS_1Wire_CH_COUNT; I++) { if ( MMES.RxData[I] == IDIER_NOPE ) { ExpDataLength = (uint16_t)(ExpDataLength + ChDataSize); } }
if ( ExpDataLength != MMES.RxDataLength ) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); return; }
}
uint8_t ErrorPos = 0;
uint8_t DataPos = ErrorPos + IDIBUS_1Wire_CH_COUNT;
for (uint8_t I = 0; I < IDIBUS_1Wire_CH_COUNT; I++)
{
this->CH[I].MMES_Error = MMES.RxData[ErrorPos];
ErrorPos = (uint8_t)(ErrorPos + 1);
}
}
void IdiBus_1Wire::startAllOneShotConversions()
{
IdiBusMMES MMES(this->Address);
MMES.DEV.NUM = IDIBUS_1Wire_CNTRL_DEV;
MMES.DEV.ALLCH = 1;
MMES.ComFunc = 0x02;
uint8_t ChDataSize = 0;
uint8_t RequestError = this->SendRequestMMES(&MMES);
if ( RequestError != IDIER_NOPE ) { this->setAllChErr(RequestError); return; }
else if (MMES.RxDataLength < IDIBUS_1Wire_CH_COUNT) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); return; }
else {
uint8_t ExpDataLength = IDIBUS_1Wire_CH_COUNT; // Errors
for (uint8_t I=0; I<IDIBUS_1Wire_CH_COUNT; I++) { if ( MMES.RxData[I] == IDIER_NOPE ) { ExpDataLength = (uint16_t)(ExpDataLength + ChDataSize); } }
if ( ExpDataLength != MMES.RxDataLength ) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); return; }
}
uint8_t ErrorPos = 0;
uint8_t DataPos = ErrorPos + IDIBUS_1Wire_CH_COUNT;
for (uint8_t I = 0; I < IDIBUS_1Wire_CH_COUNT; I++)
{
this->CH[I].MMES_Error = MMES.RxData[ErrorPos];
ErrorPos = (uint8_t)(ErrorPos + 1);
}
}
uint8_t IdiBus_1Wire::getTemperature(uint8_t ChNum)
{
if (ChNum >= IDIBUS_1Wire_CH_COUNT) { return IDIERMST_INVALID_CHN_NUM; }
IdiBusMMES MMES(this->Address);
MMES.DEV.NUM = IDIBUS_1Wire_CNTRL_DEV;
MMES.CHNL.NUM = ChNum;
MMES.ComFunc = 0x03; //Get Value
uint8_t ChDataSize = 2; //int16_t
uint8_t RequestError = this->SendRequestMMES(&MMES);
if ( RequestError != IDIER_NOPE ) { this->CH[ChNum].MMES_Error = RequestError; }
else if ( MMES.RxDataLength == 1 ) { this->CH[ChNum].MMES_Error = MMES.RxData[0]; }
else if ( MMES.RxDataLength != (ChDataSize + 1) ) { this->CH[ChNum].MMES_Error = IDIERMST_INVALID_RX_REQUEST_FORMAT; }
else {
this->CH[ChNum].MMES_Error = MMES.RxData[0];
if ( this->CH[ChNum].MMES_Error == IDIER_NOPE )
{
this->CH[ChNum].Temperature = (int16_t) ( ((int16_t)MMES.RxData[1]<<8) |
((int16_t)MMES.RxData[2]));
}
}
return this->CH[ChNum].MMES_Error;
}
void IdiBus_1Wire::getAllChTemperature(void)
{
IdiBusMMES MMES(this->Address);
MMES.DEV.NUM = IDIBUS_1Wire_CNTRL_DEV;
MMES.DEV.ALLCH = 1;
MMES.ComFunc = 0x03;
uint8_t ChDataSize = 2; //int16_t
uint8_t RequestError = this->SendRequestMMES(&MMES);
if ( RequestError != IDIER_NOPE ) { this->setAllChErr(RequestError); return; }
else if (MMES.RxDataLength < IDIBUS_1Wire_CH_COUNT) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); return; }
else {
uint8_t ExpDataLength = IDIBUS_1Wire_CH_COUNT; // Errors
for (uint8_t I=0; I<IDIBUS_1Wire_CH_COUNT; I++) { if ( MMES.RxData[I] == IDIER_NOPE ) { ExpDataLength = (uint16_t)(ExpDataLength + ChDataSize); } }
if ( ExpDataLength != MMES.RxDataLength ) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); return; }
}
uint8_t ErrorPos = 0;
uint8_t DataPos = ErrorPos + IDIBUS_1Wire_CH_COUNT;
for (uint8_t I = 0; I < IDIBUS_1Wire_CH_COUNT; I++)
{
this->CH[I].MMES_Error = MMES.RxData[ErrorPos];
ErrorPos = (uint8_t)(ErrorPos + 1);
if ( this->CH[I].MMES_Error == IDIER_NOPE )
{
this->CH[I].Temperature = (uint16_t) (
(uint16_t)((uint16_t)MMES.RxData[DataPos] << 8) |
(uint16_t)((uint16_t)MMES.RxData[DataPos+1]) );
DataPos = (uint8_t)(DataPos + ChDataSize);
}
}
}
void IdiBus_1Wire::setAllChErr(uint8_t ErrCode)
{
for (uint8_t I=0; I<IDIBUS_1Wire_CH_COUNT; I++) { this->CH[I].MMES_Error = ErrCode; }
}
/*
void IdiBus_1Wire::initAllChs(void)
{
//uint8_t TxData[2];
//TxData[0] = (uint8_t)(CurrentLimit >> 8);
//TxData[1] = (uint8_t)(CurrentLimit);
IdiBusMMES MMES(this->Address);
MMES.DEV.NUM = IDIBUS_1Wire_CNTRL_DEV;
MMES.DEV.ALLCH = 1;
MMES.ComFunc = 0x01;
uint8_t RequestError = this->SendRequestMMES(&MMES);
if ( RequestError != IDIER_NOPE ) { this->setAllChErr(RequestError); }
else if (MMES.RxDataLength != IDIBUS_1Wire_CH_COUNT) { this->setAllChErr(IDIERMST_INVALID_RX_REQUEST_FORMAT); }
else
{
for (uint8_t I = 0; I < IDIBUS_1Wire_CH_COUNT; I++)
{
this->CH[I].MMES_Error = MMES.RxData[I];
//if ( this->CH[I].MMES_Error == IDIER_NOPE )
}
}
}
*/