[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [DDL-ML] rcsh und FB
Ich bin im erddcd/maerklin_s88.c über etwas gestolpert:
In s88waitfor werden portnr von 0 bis S88_MAXPORTS verwendet
int s88waitfor(int portnr, int wval, int timeout) {
time_t endtime = 0;
if (portnr < 0 || portnr > S88_MAXPORTS) return -1; /* HIER */
if (wval < 0 || wval > 1) return -1;
if (timeout < 0 || timeout > 999) return -1;
endtime=time(NULL)+timeout;
while (1) {
s88load();
if(wval) {
if(s88data[portnr/8]&BIT_VALUES[portnr%8]) return 1; /* HIER STEHT portnr */
}
else {
if(!(s88data[portnr/8]&BIT_VALUES[portnr%8])) return 0; /* HIER STEHT portnr */
}
if ((timeout)&&(time(NULL)>=endtime)) return -1;
usleep(S88REFRESH*1000);
}
}
In s88getport werden portnr von 1 bis S88_MAXPORTS verwendet, und mit
portnr-1 indexiert. Achtung! Es steht --portnr mittendrin, das ist
leicht zu übersehen und nicht besonders leserlich.
int s88getport(int portnr) {
if (portnr <= 0 || portnr > S88_MAXPORTS) return -1; /* HIER */
s88load(); //ensure, the data are valid
if (s88data[--portnr/8]&BIT_VALUES[portnr%8]) return 1; /* HIER STEHT --portnr */
return 0;
}
Vom Rest des maerklin_s88.c sieht es so aus, daß die arrays 0 bis
S88_MAXPORTS-1 groß sind aber die Portnummer auf dem SRCP von 1 bis
S88_MAXPORTS gehen. Also könnte s88waitfor so aussehen (ich habe
dann auch gleich etwas umgeschrieben, kann ich ja nicht lassen :-).
int s88waitfor(int portnr, int wval, int timeout) {
time_t endtime = 0;
int index = portnr-1;
char data;
if (portnr <= 0 || portnr > S88_MAXPORTS) return -1; /* ! */
if (wval < 0 || wval > 1) return -1;
if (timeout < 0 || timeout > 999) return -1;
endtime=time(NULL)+timeout;
while (1) {
s88load();
data = s88data[index/8]&BIT_VALUES[index%8];
if(wval) {
if(data)
return 1;
} else {
if(!data)
return 0;
}
if ((timeout)&&(time(NULL)>=endtime)) return -1;
usleep(S88REFRESH*1000);
}
}
Ob es funktioniert? Das sollen mir mal ein S88 Besitzer erzählen.
Harald.