diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d74b3d5 --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +SRC:=$(shell find status -regex '.*\.cpp') +OBJ:=$(patsubst %,%.o,$(SRC)) +DEP:=$(patsubst %,%.d,$(SRC)) + +CC?=avr-gcc + +CFLAGS?= -O2 -ggdb -std=gnu++11 -fomit-frame-pointer -fmerge-all-constants\ +-faggressive-loop-optimizations -finline-functions -funsafe-loop-optimizations\ +-ffreestanding -Wlogical-op -Wdouble-promotion -Wformat -Winit-self\ +-Wmissing-include-dirs -Wswitch-default -Wpadded -Wswitch-enum -Wall\ +-Wunused -Winline -Wuninitialized -Wstrict-overflow\ +-Wfloat-equal -Wstack-protector -Wundef -Wvla\ +-Wshadow -Wcast-align -Wpedantic -Wextra\ +-Wpointer-arith -Wwrite-strings -Wtrampolines -Wpacked\ +-Wconversion -Wdate-time -Waggregate-return\ +-Wvector-operation-performance\ +-Wredundant-decls -Wlong-long -Wvariadic-macros\ +-Wdisabled-optimization -Wmissing-declarations -Wunsafe-loop-optimizations\ +-pipe -Werror -fno-exceptions -fno-rtti\ +-I/usr/share/arduino/hardware/arduino/cores/arduino\ +-I/usr/share/arduino/hardware/arduino/variants/micro\ +-I/usr/lib/avr/include/\ +-DF_CPU=16000000L -MMD -DUSB_VID=0x2341 -DUSB_PID=0x8037 -DARDUINO=105 -D__PROG_TYPES_COMPAT__ -mmcu=atmega32u4 + +ARDUINO?= +PROGRAMMER?= + +.PHONY: all clean check install build + +all: build + +# TODO : find a install commandline +#install: build +# avrdude + +clean: + rm $(OBJ) $(DEP) + +check: + $(CC) $(CFLAGS) -fsyntax-only $(SRC) + +build: $(SRC) + $(CC) $(CFLAGS) $(SRC) -MMD -MP -o hackspace-status.sys + +-include $(sort $(DEP)) \ No newline at end of file diff --git a/README.md b/README.md index 6293943..8f87533 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ hackerspace-status-arduino ========================== -see https://www.krautspace.de/hswiki:projekte:elektronikrunde:status_anzeige +see https://kraut.space/hswiki:projekte:2014:raumstatus_anzeige diff --git a/status/status.ino b/status/status.cpp similarity index 80% rename from status/status.ino rename to status/status.cpp index 0c902eb..5ef8e79 100644 --- a/status/status.ino +++ b/status/status.cpp @@ -1,12 +1,23 @@ +#include +#include +#include "Arduino.h" + +void setup(); +void testLeds(); +void loop(); +void changeStateTo(char state_new); +bool transition(); +void sendState(); +unsigned long calcStateTime(); /* * es gibt folgende Zustände: * 0 - Aus * 1 - An, aber auf dem weg zu aus * 2 - An */ -#define STATE_OFF 3 -#define STATE_HALF 1 -#define STATE_ON 2 +constexpr char STATE_OFF = 3; +constexpr char STATE_HALF = 1; +constexpr char STATE_ON = 2; /* * Zeit wie lange in einem Zustände verharrt werden soll @@ -14,22 +25,19 @@ * TIME_HALF - Zeitspanne von Zustand 2 bis Wechsel zu Zustand 1 * TIME_OFF - Zeitspanne von Zustand 2 bis Wechsel zu Zustand 0 */ -#define TIME_HALF 5400000 // 1,5h -#define TIME_OFF 7200000 // 2h - -// für Variablen Überlauf in calcStateTime -#define MAX_LONG 4294967295 +constexpr int TIME_HALF = 5400000; // 1,5h +constexpr int TIME_OFF = 7200000; // 2h // Ein-/Ausgänge Bezeichnen -const int BTN_ON = 2; // Einschalter -const int BTN_OFF = 3; // Ausschalter -const int LED_G = 9; // grüne LED -const int LED_Y = 8; // gelbe LED -const int LED_R = 7; // rote LED +constexpr int BTN_ON = 2; // Einschalter +constexpr int BTN_OFF = 3; // Ausschalter +constexpr int LED_G = 9; // grüne LED +constexpr int LED_Y = 8; // gelbe LED +constexpr int LED_R = 7; // rote LED // hier wird der aktuelle und vorherige Zustand gespeichert -byte state_current = NULL; -byte state_previous = NULL; +char state_current = STATE_OFF; +char state_previous = STATE_OFF; // hier wird der Beginn des aktuellen Zustand gespeichert in Millisekunden nach Uptime. unsigned long stateBegan; @@ -39,7 +47,7 @@ class Debounce { public: Debounce(int pin); - boolean update(); + bool update(); int read(); private: int _pin; @@ -72,14 +80,14 @@ void testLeds() { } // wechselt zu neuen Zustand -void changeStateTo(byte state_new) { +void changeStateTo(char state_new) { state_previous = state_current; state_current = state_new; transition(); } // behandelt die Zustandübergänge -boolean transition() { +bool transition() { if (state_previous == STATE_OFF && state_current == STATE_ON) { digitalWrite(LED_R, LOW); digitalWrite(LED_G, HIGH); @@ -131,11 +139,12 @@ void sendState() { unsigned long calcStateTime() { // Variablen überlauf von millis erkennen - if (millis() - stateBegan >= 0) { - return millis() - stateBegan; - } else { - return millis() + (MAX_LONG - stateBegan); + unsigned long current_uptime = millis(); + // kein überlauf + if (current_uptime > stateBegan) { + return current_uptime - stateBegan; } + return current_uptime + (ULONG_MAX - stateBegan); } // wird nach dem Starten dauerhaft ausgeführt @@ -173,7 +182,7 @@ Debounce::Debounce(int pin) this->_state = LOW; this->_delay = 50; } -boolean Debounce::update() +bool Debounce::update() { if (millis() - this->_time >= this->_delay) { int reading = digitalRead(this->_pin);