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