Skip to content

Commit

Permalink
Version 1.1
Browse files Browse the repository at this point in the history
  • Loading branch information
sfeakes committed Sep 26, 2020
1 parent 9648433 commit 5c3f29e
Show file tree
Hide file tree
Showing 16 changed files with 1,868 additions and 52 deletions.
1,473 changes: 1,473 additions & 0 deletions GPIO_Pi.c

Large diffs are not rendered by default.

162 changes: 162 additions & 0 deletions GPIO_Pi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/*
* Copyright (c) 2017 Shaun Feakes - All rights reserved
*
* You may use redistribute and/or modify this code under the terms of
* the GNU General Public License version 2 as published by the
* Free Software Foundation. For the terms of this license,
* see <http://www.gnu.org/licenses/>.
*
* You are free to use this software under the terms of the GNU General
* Public License, 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.
*
* https://github.com/sfeakes/GPIO_pi
*/

/********************-> GPIO Pi v1.2 <-********************/



#define _GPIO_pi_NAME_ "GPIO Pi"
#define _GPIO_pi_VERSION_ "1.2"

#ifndef _GPIO_pi_H_
#define _GPIO_pi_H_

/* Use sysfs for ALL gpio activity?
comment out to use memory where we can
*/
//#define GPIO_SYSFS_MODE


#include <syslog.h>
#include <stdbool.h>

// check number is between 2 and 27
#ifndef USE_WIRINGPI
#define GPIO_MIN 2
#define GPIO_MAX 27
#else // WiringPI valid numbers
#define GPIO_MIN 0
#define GPIO_MAX 30
#endif

#define validGPIO(X) ((X) <= (GPIO_MAX) ? ( ((X) >= (GPIO_MIN) ? (1) : (0)) ) : (0))

#ifndef USE_WIRINGPI // Don't include anything below this line if using wiringpi.

#define INPUT 0
#define OUTPUT 1
#define IO_ALT5 2 // PWM Circuit
#define IO_ALT4 3 // SPI Circuit
#define IO_ALT0 4 // PCM Audio Circuit (Also I2C)
#define IO_ALT1 5 // SMI (Secondary Memory Interface)
#define IO_ALT2 6 // Nothing
#define IO_ALT3 7 // BSC - SPI Circuit


#define LOW 0
#define HIGH 1

#define INT_EDGE_SETUP 0
#define INT_EDGE_FALLING 1
#define INT_EDGE_RISING 2
#define INT_EDGE_BOTH 3

#define PUD_OFF 0
#define PUD_DOWN 1
#define PUD_UP 2

#define SYSFS_PATH_MAX 35
#define SYSFS_READ_MAX 3

#ifndef GPIO_SYSFS_MODE
#define GPIO_BASE_P4 0xFE000000 // Pi 4
#define GPIO_BASE_P2 0x3F000000 // Pi 2 & 3
#define GPIO_BASE_P1 0x20000000 // Pi 1 & Zero
#define GPIO_OFFSET 0x200000

//#define GPIO_BASE 0x20200000
#define GPIO_LEN 0xB4
#define GPIO_LEN_P4 0xF1 // Pi 4 has more registers BCM2711

#define GPSET0 7
#define GPSET1 8

#define GPCLR0 10
#define GPCLR1 11

#define GPLEV0 13
#define GPLEV1 14

#define GPPUD 37
#define GPPUDCLK0 38
#define GPPUDCLK1 39

/* Pi4 BCM2711 has different pulls */
#define GPPUPPDN0 57
#define GPPUPPDN1 58
#define GPPUPPDN2 59
#define GPPUPPDN3 60


#define PI_MODEL_UNKNOWN -1
#define PI_MODEL_A 0
#define PI_MODEL_B 1
#define PI_MODEL_AP 2
#define PI_MODEL_BP 3
#define PI_MODEL_2 4
#define PI_ALPHA 5
#define PI_MODEL_CM 6
#define PI_MODEL_07 7
#define PI_MODEL_3 8
#define PI_MODEL_ZERO 9
#define PI_MODEL_CM3 10
#define PI_MODEL_ZERO_W 12
#define PI_MODEL_3P 13
#define PI_MODEL_3AP 14
#define PI_MODEL_CM3P 16
#define PI_MODEL_4B 17

#endif

#define GPIO_ERR_GENERAL -7
#define GPIO_NOT_IO_MODE -6
#define GPIO_NOT_OUTPUT -5
#define GPIO_NOT_EXPORTED -4
#define GPIO_ERR_IO -3
#define GPIO_ERR_NOT_SETUP -2
#define GPIO_ERR_BAD_PIN -1
#define GPIO_OK 0

//#ifndef SYSFS_MODE
int pinExport(unsigned int gpio);
int pinUnexport(unsigned int gpio);
bool isExported(unsigned int gpio);
int pinMode(unsigned int gpio, unsigned int mode);
int getPinMode(unsigned int gpio);
int digitalRead(unsigned int gpio);
int digitalWrite(unsigned int gpio, unsigned int level);
int setPullUpDown(unsigned int gpio, unsigned int pud);
int edgeSetup (unsigned int pin, unsigned int value);
bool gpioSetup();
void gpioShutdown();
int registerGPIOinterrupt(unsigned int gpio, unsigned int mode, void (*function)(void *args), void *args );

#ifndef GPIO_SYSFS_INTERRUPT
int unregisterGPIOinterrupt(unsigned int gpio);
#endif

/*
#else
bool pinExport(int pin);
bool pinUnexport(int pin);
bool pinMode (int pin, int mode);
int digitalRead (int pin);
bool digitalWrite (int pin, int value);
#endif
*/

#endif /* WiringPI */
#endif /* _GPIO_pi_H_ */
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ CC = gcc
#USE_WIRINGPI := 1

ifeq ($(USE_WIRINGPI),)
sd_GPIO_C := sd_GPIO.c
sd_GPIO_C := GPIO_Pi.c
else
#WPI_LIB := -D USE_WIRINGPI -lwiringPi -lwiringPiDev
WPI_LIB := -D USE_WIRINGPI -lwiringPi
Expand Down Expand Up @@ -58,8 +58,8 @@ $(MAIN): $(OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

gpio_tools:
$(CC) -o $(GMON) sd_GPIO.c -lm -lpthread -D GPIO_MONITOR
$(CC) -o $(GPIO) sd_GPIO.c -lm -lpthread -D GPIO_RW
$(CC) -o $(GMON) GPIO_Pi.c -lm -lpthread -D GPIO_MONITOR
$(CC) -o $(GPIO) GPIO_Pi.c -lm -lpthread -D GPIO_TOOL

# this is a suffix replacement rule for building .o's from .c's
# it uses automatic variables $<: the name of the prerequisite of
Expand Down
2 changes: 1 addition & 1 deletion config.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#define PIN_CFG_NAME "GPIO_PIN"
#endif

#include "sd_GPIO.h"
#include "GPIO_Pi.h"
#include "minIni.h"
#include "utils.h"
#include "config.h"
Expand Down
2 changes: 1 addition & 1 deletion json_messages.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#ifdef USE_WIRINGPI
#include <wiringPi.h>
#else
#include "sd_GPIO.h"
#include "GPIO_Pi.h"
#endif

#include "json_messages.h"
Expand Down
2 changes: 1 addition & 1 deletion net_services.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#ifdef USE_WIRINGPI
#include <wiringPi.h>
#else
#include "sd_GPIO.h"
#include "GPIO_Pi.h"
#endif

#include "mongoose.h"
Expand Down
Binary file modified release/gpio
Binary file not shown.
Binary file modified release/gpio_monitor
Binary file not shown.
162 changes: 162 additions & 0 deletions release/install-new.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
#!/bin/bash
#
# ROOT=/nas/data/Development/Raspberry/gpiocrtl/test-install
#


BUILD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

SERVICE="sprinklerd"

BIN="sprinklerd"
CFG="sprinklerd.conf"
SRV="sprinklerd.service"
DEF="sprinklerd"
MDNS="sprinklerd.service"

BINLocation="/usr/local/bin"
CFGLocation="/etc"
SRVLocation="/etc/systemd/system"
DEFLocation="/etc/default"
WEBLocation="/var/www/sprinklerd/"
MDNSLocation="/etc/avahi/services/"

function check_cron() {

# Look for cron running with LSB name support
if [[ ! $(pgrep -af cron | grep '\-l') ]]; then
# look for cron running
if [[ ! $(pgrep -af cron) ]]; then
# look for cron installed
if [[ ! $(command -v cron) ]]; then
echo "Can't find cron, please install"
else
echo "cron is not running, please start cron"
fi
else
# Cron is running, but not with LSB name support
if [ ! -d "/etc/cron.d" ] || [ ! -f "/etc/default/cron" ]; then
echo "The version of Cron may not support chron.d, if so the calendar schedule will not work"
echo "Please check cron for LSB name support before using calendar schedule feature of $SERVICE"
else
# Check and see if we can add LSB support
#if [ -f "/etc/default/cron" ]; then
echo ...
fi
fi
fi
}

if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi

if [[ $(mount | grep " / " | grep "(ro,") ]]; then
echo "Root filesystem is readonly, can't install"
exit 1
fi

check_cron
exit 0

if [ ! -d "/etc/cron.d" ]; then
echo "The version of Cron may not support chron.d, if so the calendar schedule will not work"
echo "Please check before starting"
else
if [ -f "/etc/default/cron" ]; then
CD=$(cat /etc/default/cron | grep -v ^# | grep "\-l")
if [ -z "$CD" ]; then
echo "Please enabled cron.d support, if not the calendar will not work"
echo "Edit /etc/default/cron and look for the -l option"
fi
else
echo "Please make sure the version if Cron supports chron.d, if not the calendar schedule will not work"
fi
fi
exit 0
if [ "$1" == "uninstall" ] || [ "$1" == "-u" ] || [ "$1" == "remove" ]; then
systemctl stop $SERVICE > /dev/null 2>&1
systemctl disable $SERVICE > /dev/null 2>&1
rm -f $BINLocation/$BIN
rm -f $SRVLocation/$SRV
rm -f $DEFLocation/$DEF
rm -f $MDNSLocation/$MDNS
rm -rf $WEBLocation
if [ -f $CFGLocation/$CFG ]; then
cache=$(cat $CFGLocation/$CFG | grep CACHE | cut -d= -f2 | sed -e 's/^[ \t]*//' | sed -e 's/ *$//')
rm -f $cache
rm -f $CFGLocation/$CFG
fi
rm -f "/etc/cron.d/sprinklerd"
echo "SprinklerD & configuration removed from system"
exit
fi
# Check cron.d options
if [ ! -d "/etc/cron.d" ]; then
echo "The version of Cron may not support chron.d, if so the calendar will not work"
echo "Please check before starting"
else
if [ -f "/etc/default/cron" ]; then
CD=$(cat /etc/default/cron | grep -v ^# | grep "\-l")
if [ -z "$CD" ]; then
echo "Please enabled cron.d support, if not the calendar will not work"
echo "Edit /etc/default/cron and look for the -l option"
fi
else
echo "Please make sure the version if Cron supports chron.d, if not the calendar will not work"
fi
fi
# Exit if we can't find systemctl
command -v systemctl >/dev/null 2>&1 || { echo "This script needs systemd's systemctl manager, Please check path or install manually" >&2; exit 1; }
# stop service, hide any error, as the service may not be installed yet
systemctl stop $SERVICE > /dev/null 2>&1
SERVICE_EXISTS=$(echo $?)
# copy files to locations, but only copy cfg if it doesn;t already exist
cp $BUILD/$BIN $BINLocation/$BIN
cp $BUILD/$SRV $SRVLocation/$SRV
if [ -f $CFGLocation/$CFG ]; then
echo "Config exists, did not copy new config, you may need to edit existing! $CFGLocation/$CFG"
else
cp $BUILD/$CFG $CFGLocation/$CFG
fi
if [ -f $DEFLocation/$DEF ]; then
echo "Defaults exists, did not copy new defaults to $DEFLocation/$DEF"
else
cp $BUILD/$DEF.defaults $DEFLocation/$DEF
fi
if [ -f $MDNSLocation/$MDNS ]; then
echo "Avahi/mDNS defaults exists, did not copy new defaults to $MDNSLocation/$MDNS"
else
if [ -d "$MDNSLocation" ]; then
cp $BUILD/$MDNS.avahi $MDNSLocation/$MDNS
else
echo "Avahi/mDNS may not be installed, not copying $MDNSLocation/$MDNS"
fi
fi
if [ ! -d "$WEBLocation" ]; then
mkdir -p $WEBLocation
fi
cp -r $BUILD/../web/* $WEBLocation
systemctl enable $SERVICE
systemctl daemon-reload
if [ $SERVICE_EXISTS -eq 0 ]; then
echo "Starting daemon $SERVICE"
systemctl start $SERVICE
fi
Binary file modified release/sprinklerd
Binary file not shown.
Loading

0 comments on commit 5c3f29e

Please sign in to comment.