mirror of
https://github.com/dimoniche/solarium.git
synced 2026-01-30 01:43:30 +03:00
358 lines
9.1 KiB
C
358 lines
9.1 KiB
C
#include <includes.h>
|
|
#include "data.h"
|
|
#include "datadesc.h"
|
|
#include "fram.h"
|
|
#include "time.h"
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
|
|
|
|
// ïîëó÷åíèå äàííûõ
|
|
int GetData(const TDataDescStruct* desc, void* buf, CPU_INT32U index, CPU_INT08U flags)
|
|
{
|
|
TVariant32 Val;
|
|
CPU_INT32U ofst = 0;
|
|
|
|
// îïðåäåëèì äîï. ñìåùåíèå äëÿ ìàññèâà
|
|
if (desc->IsArray)
|
|
{
|
|
if (flags == DATA_FLAG_DIRECT_INDEX)
|
|
{
|
|
ofst = (index >= desc->ArraySize) ? desc->ArrayOffset*(desc->ArraySize-1) : desc->ArrayOffset*index;
|
|
}
|
|
else
|
|
{
|
|
GetData((TDataDescStruct*)desc->ArrayIndex, &ofst, 0, DATA_FLAG_SYSTEM_INDEX);
|
|
ofst *= desc->ArrayOffset;
|
|
}
|
|
}
|
|
|
|
// ñ÷èòàåì çíà÷åíèå ïàðàìåòðà
|
|
if (desc->Location == DATA_LOC_RAM)
|
|
{
|
|
#if OS_CRITICAL_METHOD == 3
|
|
OS_CPU_SR cpu_sr = 0;
|
|
#endif
|
|
OS_ENTER_CRITICAL();
|
|
memcpy(&Val, (CPU_INT08U*)desc->Data+ofst, sizeof(CPU_INT32U));
|
|
OS_EXIT_CRITICAL();
|
|
}
|
|
else if (desc->Location == DATA_LOC_FRAM)
|
|
{
|
|
ReadArrayFram((CPU_INT32U)desc->Data+ofst, sizeof(CPU_INT32U), (CPU_INT08U*)&Val);
|
|
}
|
|
else return DATA_ERR;
|
|
|
|
// âñ¸ ÎÊ
|
|
memcpy(buf, &Val, sizeof(CPU_INT32U));
|
|
|
|
return DATA_OK;
|
|
}
|
|
|
|
// çàïèñü äàííûõ
|
|
int SetData(const TDataDescStruct* desc, void* buf, CPU_INT32U index, CPU_INT08U flags)
|
|
{
|
|
TVariant32 Val;
|
|
CPU_INT32U ofst = 0;
|
|
|
|
if (desc->Desc == DATA_DESC_VIEW) return DATA_ERR;
|
|
|
|
// ïðîâåðèì äîïóñòèìîñòü çíà÷åíèé
|
|
if (desc->RangeValue)
|
|
{
|
|
TVariant32 ValMin, ValMax;
|
|
TRangeValueULONG* RVal = desc->RangeValue;
|
|
|
|
memcpy(&ValMin, &RVal->Min, sizeof(CPU_INT32U));
|
|
memcpy(&ValMax, &RVal->Max, sizeof(CPU_INT32U));
|
|
memcpy(&Val, buf, sizeof(CPU_INT32U));
|
|
|
|
if (desc->Type == DATA_TYPE_ULONG)
|
|
{
|
|
if ((Val.Val32U > ValMax.Val32U) || (Val.Val32U < ValMin.Val32U)) return DATA_ERR;
|
|
}
|
|
else if (desc->Type == DATA_TYPE_SLONG)
|
|
{
|
|
if ((Val.Val32S > ValMax.Val32S) || (Val.Val32S < ValMin.Val32S)) return DATA_ERR;
|
|
}
|
|
else if (desc->Type == DATA_TYPE_FLOAT)
|
|
{
|
|
if ((Val.ValFloat > ValMax.ValFloat) || (Val.ValFloat < ValMin.ValFloat)) return DATA_ERR;
|
|
}
|
|
else if (desc->Type == DATA_TYPE_TIME)
|
|
{
|
|
|
|
}
|
|
else if (desc->Type == DATA_TYPE_HOUR_MIN)
|
|
{
|
|
if (Val.Val32U >= 24*60) return DATA_ERR;
|
|
}
|
|
else return DATA_ERR;
|
|
}
|
|
else
|
|
{
|
|
memcpy(&Val, buf, sizeof(CPU_INT32U));
|
|
}
|
|
// îïðåäåëèì äîï. ñìåùåíèå äëÿ ìàññèâà
|
|
if (desc->IsArray)
|
|
{
|
|
if (flags == DATA_FLAG_DIRECT_INDEX)
|
|
{
|
|
ofst = (index >= desc->ArraySize) ? desc->ArrayOffset*(desc->ArraySize-1) : desc->ArrayOffset*index;
|
|
}
|
|
else
|
|
{
|
|
GetData((TDataDescStruct*)desc->ArrayIndex, &ofst, 0, DATA_FLAG_SYSTEM_INDEX);
|
|
ofst *= desc->ArrayOffset;
|
|
}
|
|
}
|
|
|
|
// çàïèøåì çíà÷åíèå
|
|
if (desc->Location == DATA_LOC_RAM)
|
|
{
|
|
#if OS_CRITICAL_METHOD == 3
|
|
OS_CPU_SR cpu_sr = 0;
|
|
#endif
|
|
OS_ENTER_CRITICAL();
|
|
memcpy((CPU_INT08U*)desc->Data+ofst, &Val, sizeof(CPU_INT32U));
|
|
OS_EXIT_CRITICAL();
|
|
}
|
|
else if (desc->Location == DATA_LOC_FRAM)
|
|
{
|
|
WriteArrayFram((CPU_INT32U)desc->Data+ofst, sizeof(CPU_INT32U), (CPU_INT08U*)&Val);
|
|
}
|
|
else return DATA_ERR;
|
|
|
|
// ôóíêöèÿ ïî èçìåíåíèþ
|
|
if (desc->OnchangeFunc) desc->OnchangeFunc();
|
|
|
|
// âñ¸ ÎÊ
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïîëó÷åíèå ìàêñèìóìà ïàðàìåòðà äåñêðèïòîðà
|
|
int GetDataMax(const TDataDescStruct* desc, void* buf)
|
|
{
|
|
if (desc->RangeValue)
|
|
{
|
|
TRangeValueULONG* RVal = desc->RangeValue;
|
|
memcpy(buf, &RVal->Max, sizeof(CPU_INT32U));
|
|
}
|
|
else
|
|
{
|
|
*(CPU_INT32U*)&buf = 0;
|
|
}
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïîëó÷åíèå ìèíèìóìà ïàðàìåòðà äåñêðèïòîðà
|
|
int GetDataMin(const TDataDescStruct* desc, void* buf)
|
|
{
|
|
if (desc->RangeValue)
|
|
{
|
|
TRangeValueULONG* RVal = desc->RangeValue;
|
|
memcpy(buf, &RVal->Min, sizeof(CPU_INT32U));
|
|
}
|
|
else
|
|
{
|
|
*(CPU_INT32U*)&buf = 0;
|
|
}
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïîëó÷åíèå ñòðîêè ñ îòôîðìàòèðîâàííûì çíà÷åíèåì
|
|
int GetDataStr(const TDataDescStruct* desc, CPU_INT08U* buf, CPU_INT32U index, CPU_INT08U flags)
|
|
{
|
|
TVariant32 Val;
|
|
GetData(desc, &Val, index, flags);
|
|
|
|
if (desc->Type == DATA_TYPE_ULONG)
|
|
{
|
|
if (desc->IsIndex)
|
|
{ // èíäåêñíûé ïàðàìåòð
|
|
if (desc->RangeValue)
|
|
{
|
|
TRangeValueULONG* range = (TRangeValueULONG*)desc->RangeValue;
|
|
if ((Val.Val32U >= range->Min) && (Val.Val32U <= range->Max)) strcpy((char*)buf, (char const*)desc->Items[Val.Val32U]);
|
|
else {strcpy((char*)buf, ""); return DATA_ERR;}
|
|
}
|
|
else if (desc->Desc == DATA_DESC_VIEW)
|
|
{
|
|
strcpy((char*)buf, (char const*)desc->Items[Val.Val32U]);
|
|
}
|
|
else
|
|
{
|
|
strcpy((char*)buf, "");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sprintf((char*)buf, "%d", Val.Val32U);
|
|
}
|
|
}
|
|
else if (desc->Type == DATA_TYPE_SLONG)
|
|
{
|
|
sprintf((char*)buf, "%d", Val.Val32S);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_FLOAT)
|
|
{
|
|
sprintf((char*)buf, "%0.3f", Val.ValFloat);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_TIME)
|
|
{
|
|
PrintTimeString((char*)buf, Val.Val32U);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_TIME_COUNT)
|
|
{
|
|
PrintSecToBigHourMinSec((char*)buf, Val.Val32U);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_HOUR_MIN)
|
|
{
|
|
int min_ = Val.Val32U % 60;
|
|
int hour_ = Val.Val32U / 60;
|
|
sprintf((char*)buf, "%02d:%02d", hour_, min_);
|
|
}
|
|
else return DATA_ERR;
|
|
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïîëó÷åíèå ïîëíîé ñòðîêè ñ íàçâàíèåì è çíà÷åíèåì
|
|
int GetDataFullStr(const TDataDescStruct* desc, CPU_INT08U* buf, CPU_INT32U index, CPU_INT08U flags)
|
|
{
|
|
GetDataNameStr(desc, buf);
|
|
if (desc->Name)
|
|
{
|
|
if (desc->IsIndex) strcat((char*)&buf[strlen((char*)buf)], " ");
|
|
else strcat((char*)&buf[strlen((char*)buf)], "=");
|
|
}
|
|
GetDataStr(desc, &buf[strlen((char*)buf)], index, flags);
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïîëó÷åíèå ñòðîêè ñ èìåíåì
|
|
int GetDataNameStr(const TDataDescStruct* desc, CPU_INT08U* buf)
|
|
{
|
|
if (desc->Name) strcpy((char*)buf, (char const*)desc->Name);
|
|
else strcpy((char*)buf, "");
|
|
return DATA_OK;
|
|
}
|
|
|
|
|
|
// ïîëó÷åíèå ñòðîêè ñî çíà÷åíèåì íäåêñíîé ñòðîêè ïî èíäåêñó
|
|
int GetDataItem(const TDataDescStruct* desc, CPU_INT08U* buf, CPU_INT32U itemindex)
|
|
{
|
|
if (!desc->IsIndex) {buf[0]=0;return DATA_ERR;}
|
|
|
|
if (desc->Type != DATA_TYPE_ULONG) {buf[0]=0;return DATA_ERR;}
|
|
|
|
// èíäåêñíûé ïàðàìåòð
|
|
if (desc->RangeValue)
|
|
{
|
|
TRangeValueULONG* range = (TRangeValueULONG*)desc->RangeValue;
|
|
if ((itemindex >= range->Min) && (itemindex <= range->Max)) strcpy((char*)buf, (char const*)desc->Items[itemindex]);
|
|
else return DATA_ERR;
|
|
}
|
|
else
|
|
{
|
|
strcpy((char*)buf, "");
|
|
}
|
|
|
|
return DATA_OK;
|
|
}
|
|
|
|
// èíèöèàëèçàöèÿ ïî óìîë÷àíèþ
|
|
int InitDataByDefault(const TDataDescStruct* desc, CPU_INT32U index)
|
|
{
|
|
SetData(desc, (void*)&desc->DefaultValue, index, DATA_FLAG_DIRECT_INDEX);
|
|
return DATA_OK;
|
|
}
|
|
|
|
// èíèöèàëèçàöèÿ ïðè ñòàðòå
|
|
int InitData(const TDataDescStruct* desc)
|
|
{
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïðîâåðêà ãðàíèö
|
|
int CheckDataRange(const TDataDescStruct* desc)
|
|
{
|
|
TVariant32 ValMin, ValMax, Val;
|
|
TRangeValueULONG* RVal = desc->RangeValue;
|
|
|
|
if (!desc->RangeValue) return DATA_OK;
|
|
|
|
memcpy(&ValMin, &RVal->Min, sizeof(CPU_INT32U));
|
|
memcpy(&ValMax, &RVal->Max, sizeof(CPU_INT32U));
|
|
|
|
if (desc->IsArray)
|
|
{
|
|
for (int i = 0; i < desc->ArraySize; i++)
|
|
{
|
|
GetData(desc, &Val, i, DATA_FLAG_DIRECT_INDEX);
|
|
if (desc->Type == DATA_TYPE_ULONG)
|
|
{
|
|
if ((Val.Val32U > ValMax.Val32U) || (Val.Val32U < ValMin.Val32U)) InitDataByDefault(desc, i);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_SLONG)
|
|
{
|
|
if ((Val.Val32S > ValMax.Val32S) || (Val.Val32S < ValMin.Val32S)) InitDataByDefault(desc, i);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_FLOAT)
|
|
{
|
|
if ((Val.ValFloat > ValMax.ValFloat) || (Val.ValFloat < ValMin.ValFloat)) InitDataByDefault(desc, i);
|
|
}
|
|
else return DATA_ERR;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GetData(desc, &Val, 0, DATA_FLAG_DIRECT_INDEX);
|
|
if (desc->Type == DATA_TYPE_ULONG)
|
|
{
|
|
if ((Val.Val32U > ValMax.Val32U) || (Val.Val32U < ValMin.Val32U)) InitDataByDefault(desc, 0);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_SLONG)
|
|
{
|
|
if ((Val.Val32S > ValMax.Val32S) || (Val.Val32S < ValMin.Val32S)) InitDataByDefault(desc, 0);
|
|
}
|
|
else if (desc->Type == DATA_TYPE_FLOAT)
|
|
{
|
|
if ((Val.ValFloat > ValMax.ValFloat) || (Val.ValFloat < ValMin.ValFloat)) InitDataByDefault(desc, 0);
|
|
}
|
|
else return DATA_ERR;
|
|
|
|
}
|
|
|
|
|
|
return DATA_OK;
|
|
}
|
|
|
|
// èíèöèàëèçàöèÿ ïî óìîë÷àíèþ, âêëþ÷àÿ ìàññèâû
|
|
int InitDescByDefault(const TDataDescStruct* desc)
|
|
{
|
|
if (desc->IsArray)
|
|
{
|
|
for (int i = 0; i < desc->ArraySize; i++) InitDataByDefault(desc, i);
|
|
}
|
|
else
|
|
{
|
|
InitDataByDefault(desc, 0);
|
|
}
|
|
|
|
return DATA_OK;
|
|
}
|
|
|
|
// ïðîâåðêà âñåõ äåñòðèïòîðîâ
|
|
int CheckAllData(void)
|
|
{
|
|
int i = 0;
|
|
while (AllDataArray[i].ptr != NULL)
|
|
{
|
|
CheckDataRange(AllDataArray[i].ptr);
|
|
i++;
|
|
}
|
|
|
|
return DATA_OK;
|
|
}
|