[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.