diff --git a/3P/CMakeLists.txt b/3P/CMakeLists.txt index 63f3bf4d..7c1b8521 100644 --- a/3P/CMakeLists.txt +++ b/3P/CMakeLists.txt @@ -3,12 +3,12 @@ # to the root binary directory of the project as ${HELLO_BINARY_DIR}. cmake_minimum_required (VERSION 2.8.11) -#add_subdirectory (wolfssl/builders/cmake) +add_subdirectory (wolfssl/builders/cmake) add_subdirectory (json/builders/cmake) add_subdirectory (jsoncpp/builders/cmake) add_subdirectory (libubox/builders/cmake) add_subdirectory (ubus/libubus/builders/cmake) add_subdirectory (ubus/ubus/builders/cmake) add_subdirectory (ubus/ubusd/builders/cmake) -#add_subdirectory (civetweb/builders/cmake) +add_subdirectory (civetweb/builders/cmake) #add_subdirectory (wiringPi/) diff --git a/CMakeLists.txt b/CMakeLists.txt index b559c748..612e811d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/build/lib") set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules/") add_subdirectory (3P) -#add_subdirectory (lib) -#add_subdirectory (src) +add_subdirectory (lib) +add_subdirectory (src) add_custom_target (deploy diff --git a/firmware/board/raspberrypi/ovl/etc/profile.d/custom.sh b/firmware/board/raspberrypi/ovl/etc/profile.d/custom.sh index 210e9226..dd2917e6 100644 --- a/firmware/board/raspberrypi/ovl/etc/profile.d/custom.sh +++ b/firmware/board/raspberrypi/ovl/etc/profile.d/custom.sh @@ -1,5 +1,6 @@ # Acces aux scripts personnels et code metier. PATH=$PATH:/usr/local/bin +LD_LIBRARY_PATH=/opt/Domo/lib # Prompt indiquant nom d'hote et repertoire courant. PS1='\h[\W]\$ ' diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 732a99bc..2451ceb8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required (VERSION 2.8.11) #add_subdirectory (alarmd/builders/cmake) add_subdirectory (domod/builders/cmake) #add_subdirectory (chacond/builders/cmake) -#add_subdirectory (sprinklersd/builders/cmake) +add_subdirectory (sprinklersd/builders/cmake) #add_subdirectory (rf_listenerd/builders/cmake) #add_subdirectory (restd/builders/cmake) #add_subdirectory (ui/builders/cmake) diff --git a/src/sprinklersd/Readme.md b/src/sprinklersd/Readme.md new file mode 100644 index 00000000..4c077dbd --- /dev/null +++ b/src/sprinklersd/Readme.md @@ -0,0 +1,11 @@ + + +exemple de commande du opensprinker PI + +https://github.com/rayshobby/opensprinkler + + +Bonne appli on peut s'en inspirer + +https://opensprinkler.com/forums/topic/sprinklers_pi-an-alternative-sprinkler-control-program/ +https://github.com/rszimm/sprinklers_pi/ diff --git a/src/sprinklersd/builders/cmake/CMakeLists.txt b/src/sprinklersd/builders/cmake/CMakeLists.txt new file mode 100644 index 00000000..63a132e0 --- /dev/null +++ b/src/sprinklersd/builders/cmake/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 2.8.11) + +project(sprinklersd) + +include (libubus) +include (libubox) +include (libubuscpp) +include (libjsoncpp) + +include_directories(../../src) + +set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra -pedantic -Werror=strict-aliasing") + +file( + GLOB_RECURSE + source_files + ../../src/main.cpp + ../../src/UbusSprinklerModel.cpp + ../../src/sprinklers.cpp +) + +add_executable ( + sprinklersd + ${source_files} +) + +target_link_libraries (sprinklersd + LINK_PUBLIC + jsoncpp + ubuscpp + rt + ) diff --git a/src/sprinklersd/src/UbusSprinklerModel.cpp b/src/sprinklersd/src/UbusSprinklerModel.cpp new file mode 100644 index 00000000..c18fb9b0 --- /dev/null +++ b/src/sprinklersd/src/UbusSprinklerModel.cpp @@ -0,0 +1,172 @@ +/*! + * UBusModel.c + * + * Copyright (c) 2015, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 30/04/2015 + * + */ + + +/*-------------------------------- INCLUDES ---------------------------------*/ + +#include +#include +#include + +#include + +extern "C" { +#include +} + +#include "sprinklers.h" + +#include "UbusSprinklerModel.h" + +namespace { + +using namespace UBus; + +static ObjectType gSprinklerModelUbus_types( + "sprinklers", + Method("get", UBUS_CPP(SprinkerModel, Get)), + Method("set", UBUS_CPP(SprinkerModel, Set)) +); + +} + +/*! ---------------------------------------------------------------------------- + * @fn SprinkerModel + * + * @brief Constructor of the UBus Mixer Volume. + */ +SprinkerModel::SprinkerModel (void) : + UBusObject (gSprinklerModelUbus_types, "sprinkers") +{ +} + + +/*! ---------------------------------------------------------------------------- + * @fn ~SprinkerModel + * + * @brief Destructor of the UBus Mixer Volume. + */ +SprinkerModel::~SprinkerModel (void) +{ + +} + + +/*! ---------------------------------------------------------------------------- + * @fn Get + * + * @brief Get the State of a Sprinkler Station. + */ +int SprinkerModel::Get (struct ubus_context *aCtx, struct ubus_request_data *aReq, + struct blob_attr *aMsg) +{ + int theResult = 0; + struct blob_buf theBuf = {0}; + char *theString = blobmsg_format_json (aMsg, true); + Json::Reader theReader; + Json::StyledWriter theWriter; + Json::Value theRoot; + Json::Value theOutput; + uint32_t theStation = 0; + bool theState = false; + + if (!theReader.parse (theString, theRoot)) { + + fprintf (stderr, "Failed parse the parameters.\n"); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + theStation = theRoot["station"].asInt(); + + if (theStation == 0) { + + fprintf (stderr, "Station ID is missing.\n"); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + theResult = sprinklers_get_station (theStation, theState); + + if (theResult != 0) { + + fprintf (stderr, "Wrong Station ID (%d).\n", theStation); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + printf ("aState: %d\n", theState); + theOutput ["station"] = theStation; + theOutput ["state"] = theState; + + blob_buf_init (&theBuf, 0); + + blobmsg_add_json_from_string (&theBuf, theWriter.write (theOutput).c_str()); + + theResult = ubus_send_reply (aCtx, aReq, theBuf.head); + + blob_buf_free (&theBuf); + + return theResult; +} + + +/*! ---------------------------------------------------------------------------- + * @fn Set + * + * @brief Set a new State for a Sprinkler Station. + */ +int SprinkerModel::Set (struct ubus_context *aCtx, struct ubus_request_data *aReq, + struct blob_attr *aMsg) +{ + int theResult; + char *theString = blobmsg_format_json (aMsg, true); + Json::Reader theReader; + Json::Value theRoot; + uint32_t theStation = 0; + bool theState = false; + + if (!theReader.parse (theString, theRoot)) { + + fprintf (stderr, "Failed parse the parameters.\n"); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + theStation = theRoot["station"].asInt(); + theState = theRoot["state"].asBool(); + + if (theStation == 0) { + + fprintf (stderr, "Station ID is missing.\n"); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + theResult = sprinklers_set_station (theStation, theState); + + if (theResult != 0) { + + fprintf (stderr, "Wrong Station ID (%d).\n", theStation); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + return theResult; +} diff --git a/src/sprinklersd/src/UbusSprinklerModel.h b/src/sprinklersd/src/UbusSprinklerModel.h new file mode 100644 index 00000000..bcb6cef2 --- /dev/null +++ b/src/sprinklersd/src/UbusSprinklerModel.h @@ -0,0 +1,49 @@ +/*! + * UBusModel.h + * + * Copyright (c) 2015, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 30/04/2015 + * + */ + +#ifndef _UBUS_SPRINKLER_MODEL_H +#define _UBUS_SPRINKLER_MODEL_H + +/*------------------------------- INCLUDES ----------------------------------*/ + +#include + +#include + +/*--------------------------------- Define ----------------------------------*/ + +/*--------------------------------- CLASS ----------------------------------*/ + +class SprinkerModel : public UBusObject { + +public: + SprinkerModel (void); + ~SprinkerModel (void); + + int Get (struct ubus_context*, struct ubus_request_data*, struct blob_attr*); + int Set (struct ubus_context*, struct ubus_request_data*, struct blob_attr*); +}; + +#endif /* _UBUS_SPRINKLER_MODEL_H */ diff --git a/src/sprinklersd/src/main.cpp b/src/sprinklersd/src/main.cpp new file mode 100644 index 00000000..6a114d60 --- /dev/null +++ b/src/sprinklersd/src/main.cpp @@ -0,0 +1,120 @@ +/*! + * main.c + * + * Copyright (c) 2015, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 30/04/2015 + * + */ + +/*-------------------------------- INCLUDES ---------------------------------*/ + +#include +#include + +extern "C" { +#include +} + +#include "UbusSprinklerModel.h" + +#include "sprinklers.h" + +/*--------------------------------- GLOBALS ---------------------------------*/ + + + +/*! ---------------------------------------------------------------------------- + * @fn setupUbus + * + * @brief Setup the UBus Mechanism. + */ +extern "C" { +static struct ubus_context *setupUbus (void) +{ + ubus_context *theCtx; + + if (uloop_init () !=0) { + + fprintf (stderr, "Failed to init Uloop.\n"); + return NULL; + } + + signal (SIGPIPE, SIG_IGN); + + theCtx = ubus_connect (NULL); + + if (!theCtx) { + + fprintf (stderr, "Failed to connect to ubus\n"); + return NULL; + } + + ubus_add_uloop (theCtx); + + return theCtx; +} +} // SetupUbus. + + +/*! ---------------------------------------------------------------------------- + * @fn main + * + * @brief Main function of Domo Daemon. + */ +int main (void) +{ + int theRet = 0; + SprinkerModel theSprinklersModel; + + struct ubus_context *theCtx = NULL; + + if (setuid (0)) { + + perror ("setuid"); + return 1; + } + + /* Setup the Ubus context. */ + theCtx = setupUbus (); + if (theCtx == NULL) { + + return -1; + } + + /* Setup the sprinklers. */ + theRet = sprinklers_setup (); + if (theRet != 0) { + + fprintf (stderr, "Impossible to Setup the Sprinkers.\n"); + return theRet; + } + + /* Add the UBus to the model exposed. */ + ubus_add_object (theCtx, &theSprinklersModel); + + /* Main Event Loop. */ + uloop_run (); + + ubus_free (theCtx); + + uloop_done (); + + return theRet; +} diff --git a/src/sprinklersd/src/sprinklers.cpp b/src/sprinklersd/src/sprinklers.cpp new file mode 100644 index 00000000..356de25d --- /dev/null +++ b/src/sprinklersd/src/sprinklers.cpp @@ -0,0 +1,180 @@ +/*! + * sprinklers.c + * + * Copyright (c) 2015, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 30/04/2015 + * + */ + +/*-------------------------------- INCLUDES ---------------------------------*/ + +#include +#include +#include + +#include +#include + +#include + +#include "sprinklers.h" + +/*-------------------------------- GLOBALES ---------------------------------*/ + + +/*! ---------------------------------------------------------------------------- + * @fn sprinklers_setup + * + * @brief this function setup the OSPI environement. + */ +int sprinklers_setup (void) +{ + UBusCall theCmd; + std::string theResult; + int theIDVal; + + fprintf (stderr, "Setup the Gpios used by the Sprinklers.\n"); + + if (theCmd.Exec ("domo.capabilities.sprinklers", "get", "", theResult) == 0){ + + // We get the the sprinklers. Get the IDs. + Json::Reader theReader; + Json::Value theRoot; + Json::Value theElement; + + if (!theReader.parse (theResult, theRoot)) { + + fprintf (stderr, "Failed parse the List of Sprinklers.\n"); + return -1; + } + + for (const Json::Value& theElement : theRoot["Sprinkers"]) { + + theIDVal = theElement["id"].asInt(); + sprinkler_setup_station (theIDVal); + } + } + + return 0; +} + + +/*! ---------------------------------------------------------------------------- + * @fn sprinkler_setup_station + * + * @brief This function change the State of an Ospi Station. + */ +int sprinkler_setup_station (int aStation) +{ + char theCommand[255]; + + printf (" Setup the Station: %d\n", aStation); + + // Activate the Gpio + sprintf (theCommand, "echo %d > /sys/class/gpio/export", aStation); + system (theCommand); + + // Select the Direction of the Gpio + sprintf (theCommand, "echo out > /sys/class/gpio/gpio%d/direction", aStation); + system (theCommand); + + // Select the Direction of the Gpio + sprintf (theCommand, "echo 1 > /sys/class/gpio/gpio%d/value", aStation); + system (theCommand); + + return 0; +} + + +/*! ---------------------------------------------------------------------------- + * @fn sprinkler_set_station + * + * @brief This function change the State of an Ospi Station. + */ +int sprinklers_set_station (uint32_t aStation, bool aState) +{ + FILE *theFp; + char theGpioPath[255]; + + sprintf (theGpioPath, "/sys/class/gpio/gpio%d/value", aStation); + + theFp = fopen (theGpioPath, "w"); + + if (theFp == NULL) { + + fprintf (stderr, "Impossible to open: <%s>\n", theGpioPath); + return -1; + } + + if (aState) { + + fwrite ("0", 1, 1, theFp); + } + else { + + fwrite ("1", 1, 1, theFp); + } + + fclose (theFp); + + return 0; +} + + +/*! ---------------------------------------------------------------------------- + * @fn sprinkler_get_station + * + * @brief This function change the State of an Ospi Station. + */ +int sprinklers_get_station (uint32_t aStation, bool &aState) +{ + FILE *theFp; + char theGpioPath[255]; + char theData[5]; + + fprintf (stdout, "get station state (%d)\n", aStation); + + sprintf (theGpioPath, "/sys/class/gpio/gpio%d/value", aStation); + + theFp = fopen (theGpioPath, "r"); + + if (theFp == NULL) { + + fprintf (stderr, "Impossible to open: <%s>\n", theGpioPath); + return -1; + } + + fread (theData, 1, 1, theFp); + + //printf ("theData: %s\n", theData); + + if (theData[0] == '0') { + aState = true; + } + else { + aState = false; + } + + fclose (theFp); + + return 0; +} + + diff --git a/src/sprinklersd/src/sprinklers.h b/src/sprinklersd/src/sprinklers.h new file mode 100644 index 00000000..7c5c715f --- /dev/null +++ b/src/sprinklersd/src/sprinklers.h @@ -0,0 +1,42 @@ +/*! + * sprinklers.h + * + * Copyright (c) 2015, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 30/04/2015 + * + */ + +#ifndef __SPRINKLERS_H +#define __SPRINKLERS_H + +/*-------------------------------- INCLUDES ---------------------------------*/ + +#include + +/*-------------------------------- METHODS ---------------------------------*/ + +int sprinklers_setup (void); + +int sprinkler_setup_station (int aStation); + +int sprinklers_set_station (uint32_t aStation, bool aState); +int sprinklers_get_station (uint32_t aStation, bool &aState); + +#endif /* __SPRINKLERS_H */