[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [DDL-ML] DDL und LocoNet
Ich habe keine offiziellen LocoNet-Devices, nur einen FRED der jetzt mit
BFxxyycc nach einem Slot schreit. Wenn ich also jetzt das Access-Protokoll
zusammenschraube, kann es sein, daß das nicht so ganz multi device access
kompatibel wird. Wer getestete Code-Schnipsel hierzu hat (DOSe, WinDoof
o.ä., Hauptsache C/C++), her damit!
Hier schon mal was zum Anwärmen:
// locotest.c LocoNet Test
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
int locoFD;
int main(int argc, char **argv)
{
char *locoDev=argv[1];
struct termios tios;
unsigned int cm=0, len;
long cnt=0;
int rc;
if (argc < 2)
{
puts("usage: loconet <device>");
return(1);
}
locoFD=open(locoDev, O_RDWR | O_NOCTTY, 0);
if (locoFD < 0)
{
puts("open error");
return(1);
}
tcflush(locoFD, TCOFLUSH);
tcflush(locoFD, TCIFLUSH);
tcflow(locoFD, TCOOFF);
tcflow(locoFD, TCIOFF);
tcgetattr(locoFD, &tios);
tios.c_iflag = IGNBRK;
tios.c_oflag = 0;
tios.c_cflag = CS8 | CSTOP | CREAD;
tios.c_lflag = 0;
cfsetospeed(&tios, B38400);
tcsetattr(locoFD, TCSANOW, &tios);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// hier fehlt das Setzen des Custom-Divisors,
// wer weiß wie das geht?
ioctl(locoFD, TIOCMGET, &cm);
cm &= ~TIOCM_DTR;
cm |= TIOCM_RTS;
ioctl(locoFD, TIOCMSET, &cm);
printf("running on %s.\n", locoDev);
while (1)
{
unsigned char portbyte[20], cc, i;
memset(portbyte, 0, 20);
do
rc=read(locoFD, portbyte, 1);
while (!(portbyte[0] & 0x80));
cnt++;
len=0;
printf("%8ld - ", cnt);
switch (portbyte[0] & 0x60)
{
case 0x00:
len=2; read(locoFD, portbyte+1, len-1);
break;
case 0x20:
len=4; read(locoFD, portbyte+1, len-1);
break;
case 0x40:
len=6; read(locoFD, portbyte+1, len-1);
break;
case 0x60:
read(locoFD, portbyte+1, 1);
len=portbyte[1];
read(locoFD, portbyte+2, len-2);
break;
}
switch (portbyte[0])
{
case 0xa8:
{
if (portbyte[1] == 0x2a)
printf("CD Timing %d\n", portbyte[2]);
else if (portbyte[1] == 0x2b)
printf("Button flags %02x\n", portbyte[2]);
else
printf("unknown %02x %02x\n", portbyte[1], portbyte[2]);
break;
}
case 0xaf:
{
printf("Poti %02x %02x = %d\n", portbyte[2], portbyte[1],
portbyte[1]+127*portbyte[2]);
break;
}
default:
{
printf("read %d:", len);
for (i=0 ; i < len ; i++)
printf(" %02x", portbyte[i]);
printf("\n");
break;
}
}
}
return(0);
}
Kompilieren, "setserial spd_cust divisor 7", ./locotest aufrufen, aufrufen
und mitlauschen.