#define ERR_STRING_ZU_LANG 1
#define ERR_UNGUELTIGES_ZEICHEN 2
#define ERR_STELLENANZ_H_M_S 3
#define ERR_STELLENANZ_MS 4
#define ERR_H_M_S_NICHT_VOLLST 5
#define ERR_MS_NICHT_VOLLST 6
#define ERR_WERTUEBERSCHR_H 7
#define ERR_WERTUEBERSCHR_M 8
#define ERR_WERTUEBERSCHR_S 9
#define ERR_WERTUEBERSCHR_MS 10
// Rückgabe TRUE wenn ohne Fehler, FALSE wenn ein Fehler aufgetreten ist
BOOL SetTagDWordTimeOfDay(Tag Tag_Name, char *value)
{
int error;
unsigned long time_of_day;
int i, j;
int h = 0, m = 0, s = 0, ms = 0;
char sVal[4][4];
int stage;
sVal[0][0] = '\0';
sVal[1][0] = '\0';
sVal[2][0] = '\0';
sVal[3][0] = '\0';
if (value == NULL) {
return FALSE;
}
if (strlen(value) > 12) {
error = ERR_STRING_ZU_LANG;
return FALSE;
}
stage = 0;
j = 0;
for (i = 0; i < strlen(value); i++) {
if (value[i] >= '0' && value[i] <= '9') {
sVal[stage][j] = value[i];
if (stage < 3 && j >= 2) {
error = ERR_STELLENANZ_H_M_S;
return FALSE;
} else if (j >= 3) {
error = ERR_STELLENANZ_MS;
return FALSE;
}
j++;
} else if (value[i] == ':') {
sVal[stage][j] = '\0';
stage++;
j = 0;
// Millisekunden sind nur erlaubt nach allen drei vorherigen Stufen
} else if (stage == 2 && value[i] == '.') {
sVal[stage][j] = '\0';
stage = 3;
j = 0;
} else {
error = ERR_UNGUELTIGES_ZEICHEN;
return FALSE;
}
}
// Wurde ein Punkt angegeben, so muss auch ein Wert für Millisekunden folgen
if (stage == 3 && strlen(sVal[3]) == 0) {
error = ERR_MS_NICHT_VOLLST;
return FALSE;
}
// Auf Gültigkeit prüfen. Es müssen Stunden, Minuten und Sekunden angegeben sein.
for (i = 0; i <= 2; i++) {
if (strlen(sVal[i]) < 1) {
error = ERR_H_M_S_NICHT_VOLLST;
return FALSE;
}
switch (i){
case 0:
h = atoi(sVal[i]);
if (h > 23) {
error = ERR_WERTUEBERSCHR_H;
return FALSE;
}
break;
case 1:
m = atoi(sVal[i]);
if (m > 59) {
error = ERR_WERTUEBERSCHR_M;
return FALSE;
}
break;
case 2:
s = atoi(sVal[i]);
if (s > 59) {
error = ERR_WERTUEBERSCHR_S;
return FALSE;
}
break;
}
}
if (strlen(sVal[3]) > 0) {
ms = atoi(sVal[3]);
if (ms > 999) {
error = ERR_WERTUEBERSCHR_MS;
return FALSE;
}
}
time_of_day = (h * 3600000u + m * 60000u + s * 1000u + ms);
SetTagDWord(Tag_Name, time_of_day);
return TRUE;
}