Raspberrypi.led-md: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Root (Diskussion | Beiträge) |
Root (Diskussion | Beiträge) (→Raspi) |
||
Zeile 100: | Zeile 100: | ||
https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c | https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c | ||
== PC == | |||
=== Supermicro COM 2 === | |||
// rs232_to_led.c | |||
// e.boelen 5 Mar 2002 | |||
// a small c program that will turn pin 4 on a rs232 port 'high' | |||
#include <stdio.h> | |||
#include <unistd.h> | |||
#include <stdlib.h> | |||
#include <sys/stat.h> | |||
#include <sys/ioctl.h> | |||
int main(int) | |||
{ | |||
int fd,dtr,i; | |||
char device[255] = "/dev/ttyS1"; // this is serial port 2 | |||
fd = open(device, O_RDWR); | |||
if (fd == -1) { | |||
char s[255]; | |||
sprintf(s, "statserial: can't open device `%s'", device); | |||
perror(s); | |||
exit(1); | |||
} | |||
dtr=TIOCM_RTS; | |||
// Set RTS (pin 4) | |||
ioctl(fd, TIOCMBIS,&dtr); // low level io function | |||
sleep(60); // pause for 60 seconds | |||
} | |||
== Aufgaben == | == Aufgaben == |
Version vom 4. November 2020, 16:58 Uhr
Ziel
- In einem Server-Gehäuse (NAS mit vielen Festplatten) werden 10 RGB LED plaziert
- Sie werden so plaziert dass klar wird welche LED für welche Festplatte zuständig ist
- Hintergund: Im Service-Fall muss man wissen WELCHE Festplatte zu tauschen ist, das soll optisch angezeigt werden (FAIL-Farbe)
- Die Steuerung der LEDs erfolgt durch einen Raspberry Pi (Zero oder normaler)
- Der Raspberry Pi ist durch Dauer 5v+ des ATX-Netzteils dauerversorgt
- ev. auch durch eine 5 V USB Schnittstelle, das ist noch fraglich
- Auf dem Server ist ein RAID 6 Array in Betrieb mit 4 bis 10 Platten
- Die LED spiegeln die Festplatten-Aktivität des RAID Verbundes wieder
Server Software
- der Server betreibt ein OpenSuse 15.1
- Ein kleines Programm auf dem Server gibt die Festplattenaktivität und md-Status an den Rasp weiter (über UART)
- njmon: https://www.youtube.com/watch?v=wN5GNc9HH7Y
- njmon -> JSON -> rasp.py -> UART
Disk Stats
- https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats
- https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/iostats.rst
- im Prinzip:
cat /proc/diskstats
- ev. auch
cat /proc/partitions
- im Prinzip:
# zentrale Berechnungen # aus nmon (c) Nigel Griffiths # # # "xfers" Begriff # p->dk[i].dk_xfers = p->dk[i].dk_reads + p->dk[i].dk_writes; # # "busy" Begriff # /* assume a disk does 200 op per second */ fudged_busy = (p->dk[i].dk_reads + p->dk[i].dk_writes) / 2; if (fudged_busy > 100 * elapsed) p->dk[i].dk_time += 100 * elapsed; p->dk[i].dk_time = fudged_busy; # # Disk Write per Time # if (NEWDISKGROUP(i)) { fprintf(fp, "\nDISKWRITES%s,%s", dskgrp(i), LOOP); } disk_write = DKDELTA(dk_writes); fprintf(fp, ",%.1f", disk_write / elapsed);
- "So" ähnlich könnte es aussehen:
Server Gehäuse
- Es ist ein weißes Fractal Define 7 für den B-Server
- Es ist ein schwarzes Fractal Define 7 für den A-Server
- 20 HDD Trays wurden angeschafft (nur 2 lieferbar!)
- https://www.youtube.com/watch?v=orRp-B2u-4o
Raspi Software
- Der Rasp empfängt über UART einen Datenstrom mit Festplatteninfo
- Dies setzt er in die Steuersignale für die bunten LED um
- kommt es zum Abbruch der Datenverbindung wird dieser "Status" auch angezeigt
UART Hardware
UART Setup
Server
- USB Stecker wird automatisch erkannt
- Unter /dev gibt es dann plotzlich einen neuen Device
minicom -b 115200 -D /dev/ttyUSB0 -o
Raspi
- "serielle Console" muss mit raspi-config aktiviert werden, wenn man sich darüber einloggen will, wir wollen aber damit programmieren
- https://asciich.ch/wordpress/uart-mit-minicom-auf-dem-raspberrypi-nutzen/
UART Programmierung
Server
Raspi
https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c
PC
Supermicro COM 2
// rs232_to_led.c // e.boelen 5 Mar 2002 // a small c program that will turn pin 4 on a rs232 port 'high' #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/ioctl.h> int main(int) { int fd,dtr,i; char device[255] = "/dev/ttyS1"; // this is serial port 2
fd = open(device, O_RDWR); if (fd == -1) { char s[255]; sprintf(s, "statserial: can't open device `%s'", device); perror(s); exit(1); } dtr=TIOCM_RTS; // Set RTS (pin 4) ioctl(fd, TIOCMBIS,&dtr); // low level io function sleep(60); // pause for 60 seconds }
Aufgaben
(1)
- schreibe ein Python Programm das 10 LEDs symbolisiert
- In ein Eingabefeld kann man einen Wert eingeben, je nach Wert werden dann die LEDs entsprechend eingefärbt
- "1G" bedeutet: 1. LED wird grün
- "5R" schaltet die 5. LED auf rot
- usw.
- mit einem "Start" Button wird ein Datei gelesen und interprätiert, dabei sind 10 Bytes immer für 250 ms gültig
Meilensteine
10.03.2020
- Gehäuse beschafft, HDD Tray bestückt