/*****************************************************************************\ * cpanel - Kontrollprogramm für die Serielle Fernsteuerung * * Copyright (C) 2000 bei Mirko Dölle, DG2FER * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software Foundation, * * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * \*****************************************************************************/ #include #include #include #include #include #include #include #include #include #define CDROM_DEV "/dev/cdrom" int fd = 0; typedef enum { ROT = 0, GRUEN, GELB, GRUENGELB } Farbe; /* Signal-Handler: Panel rot setzen dann exit */ void SetRed(int code) { int status = 0; ioctl(fd, TIOCMSET, &status); exit(0); } int SetPanelLED(Farbe LEDs, int fd, int currstat) { if((LEDs & GELB) != 0) currstat |= TIOCM_RTS; else currstat &= ~TIOCM_RTS; if((LEDs & GRUEN) != 0) currstat |= TIOCM_DTR; else currstat &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &currstat); return currstat; } int BlinkError(int fd, int currstat) { int i; for(i=0; i<3; i++) { usleep(300000); SetPanelLED(ROT | GELB, fd, currstat); usleep(300000); SetPanelLED(GRUEN | GELB, fd, currstat); } return currstat; } /* CDROM-Ansteuerung */ void CdControl(int fd, int currstat) { static int trayopen = 0; int cdrom; if((cdrom = open(CDROM_DEV, O_RDONLY | O_NONBLOCK)) < 0) { /* CD-ROM kann nicht geöffnet werden, Fehlermeldung */ BlinkError(fd, currstat); return; } if (ioctl(cdrom, CDROMSTART) != 0) { /* keine CD im Laufwerk, oder Laufwerk offen */ if (trayopen == 1) { /* Lade offen, einziehen und versuchen zu mounten */ if(ioctl(cdrom, CDROMCLOSETRAY) == 0) { trayopen = 0; sleep(1); if (system("/bin/mount -t iso9660 /dev/cdrom /cdrom -o ro >/dev/null 2>/dev/null") != 0) { /* Mounten fehlgeschlagen */ BlinkError(fd, currstat); } } else { /* Einziehen fehlgeschlagen */ BlinkError(fd, currstat); } } else { /* Keine CD im Laufwerk, aufmachen */ if (ioctl(cdrom, CDROMEJECT) == 0) { trayopen = 1; } else { /* Auswerfen fehlgeschlagen */ BlinkError(fd, currstat); } } } else { /* CD im Laufwerk, unmounten und auswerfen */ system("/bin/umount /cdrom >/dev/null 2>/dev/null"); if(ioctl(cdrom, CDROMEJECT) == 0) { trayopen = 1; } else { /* Auswerfen fehlgeschlagen */ BlinkError(fd, currstat); } } close(cdrom); return; } /* Panel-Ansteuerung */ void PanelControl(int fd, int currstat) { int laststat = currstat; int changed = 1; int i = 0; while(1) { usleep(75000); /* 75ms Delay */ ioctl(fd, TIOCMGET, &currstat); /* Schnittstellenstatus lesen */ currstat &= ~(TIOCM_DTR | TIOCM_RTS); /* LED-Status abschneiden */ if(currstat != laststat) { laststat = currstat ; i = 0; changed = 0; } else { if(i < 3) { i++; } else if(changed == 0) { /* 3 * Delay: Taste ist gedrückt, Aktion auslösen. */ /* DTR und RTS (Anzeige-LED) bleiben hierbei */ /* unbeachtet, werden also hier gelöscht. */ changed = 1; switch(currstat) { case TIOCM_RNG: /* Beide rote Tasten gedrückt, Shutdown */ SetPanelLED(ROT | GELB, fd, currstat); system("/sbin/halt >/dev/null 2>/dev/null"); /* Endlosschleife bis Reboot */ while (1) sleep(1); case TIOCM_CAR: /* Linke weiße Taste gedrückt, CD-Mount/Unmount */ case (TIOCM_DSR | TIOCM_CAR): /* Mittlere und linke weiße Taste gedrückt */ case TIOCM_DSR: /* Mittlere weiße Taste gedrückt */ case (TIOCM_CTS | TIOCM_DSR): /* Rechte und mittlere weiße Taste gedrückt */ case TIOCM_CTS: /* Rechte weiße Taste gedrückt */ SetPanelLED(GRUEN | GELB, fd, currstat); CdControl(fd, currstat); break; default: SetPanelLED(GRUEN, fd, currstat); } } } } } int main(int argc, char** argv) { /* int oldstat = 0; */ int currstat = 0; /* Parameterprüfung: Das zu verwendende Device muß als erster Parameter */ /* angegeben werden. */ if(argc != 2) { printf("Fehler: Ungültige Parameter-Anzahl.\n"); printf("Aufruf:\n"); printf(" cpanel \n"); return 1; } /* Das Device öffnen */ if((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) { printf("Fehler: Device \"%s\" kann nicht geöffnet werden.\n", argv[1]); return 2; } /* Signale INT und TERM abfangen, erst Panel auf rot setzen dann exit */ signal (SIGINT, SetRed); signal (SIGTERM, SetRed); /* Panel initialisieren: Grün */ currstat = TIOCM_DTR; ioctl(fd, TIOCMSET, &currstat); /* Panelsteuerung aufrufen */ PanelControl(fd, currstat); return 0; }