Source file: /~heha/ewa/Logger/powerbutton.zip/powerbutton.cpp

#include <stdint.h>
#include <unistd.h>	// usleep(), execlp()
#include <fcntl.h>
#include <sys/mman.h>
/*
 Einschaltknopf an GPIO3 = Pin 5 = I²C SCL auch zum Herunterfahren nutzen.
 Datenblatt BCM2835: Auch während GPIO3 auf I²C umprogrammiert ist,
 lässt sich der Pinzustand abfragen.
 Aber nicht in Python.

 Mit den eingebauten Pausen (usleep()) ist die CPU-Last akzeptabel
 und der Prozess ist mit ^C abbrechbar.

 Nebeneffekt: I²C-Slaves mit Fehlverhalten (zu langes Clock-Stretch)
 können den Raspberry herunterfahren. Kann aber auch zweckmäßig sein.

 180910	erstellt
-230425	Abhängigkeit von libbcm2835.a entfernt, alles Marke Eigenbau
*230510	umbenannt
*/

int main() {
 int f=open("/dev/gpiomem",O_RDWR|O_SYNC);
 if (f<0) return 1;
 volatile uint32_t*regs=(volatile uint32_t*)mmap(0,0xB4,PROT_READ|PROT_WRITE,MAP_SHARED,f,0);
 if (!regs) return -2;
 for(;;) {
  if (!(regs[13]&1<<3)) {	// wenn LOW
   for (int i=0;i<1000;i++) {	// 300 ms permanent LOW abfragen
    usleep(300);
    if (regs[13]&1<<3) goto skip;	// wenn HIGH
   }
// system("shutdown -h now");
   execlp("systemctl","systemctl","poweroff",0);
// erspart das Duplizieren des Prozesses
skip:;
  }
  usleep(100000);	// alle 100 ms abfragen
 }
}
Detected encoding: UTF-80