From f3c110e8c370c8e64ac767b912fceaff97d66e7d Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 31 Mar 2018 17:08:42 +0100 Subject: closer to what I want * setting the temperature just prints it out * asking for the next time to sample returns a constant (later, it will read from stdin) with this, I can wrap this program with `IPC::Run` or similar, and write all the logic in Perl! the esp32 will send its own device id with the temperature, and we can safely assume that the request for "next time" will come from the same device --- src/Server.cpp | 25 +++++++++---------------- src/standalone.cpp | 39 +++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/Server.cpp b/src/Server.cpp index 7e7e0f8..932f1ec 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -295,20 +295,20 @@ Server::Server(const std::string &serviceName, const std::string &advertisingNam .gattServiceBegin("thermo", "11111111-2222-3333-4444-000000000000") // Characteristic: String value - .gattCharacteristicBegin("room1", "11111111-2222-3333-4444-000000000001", {"read", "write"}) + .gattCharacteristicBegin("temperature", "11111111-2222-3333-4444-000000000001", {"read","write"}) // Standard characteristic "ReadValue" method call .onReadValue(CHARACTERISTIC_METHOD_CALLBACK_LAMBDA { - const char *temperature = self.getDataPointer("room-1", ""); - self.methodReturnValue(pInvocation, temperature, true); + const char *fake_temp = "0"; + self.methodReturnValue(pInvocation, fake_temp, true); }) // Standard characteristic "WriteValue" method call .onWriteValue(CHARACTERISTIC_METHOD_CALLBACK_LAMBDA { GVariant *pValue = g_variant_get_child_value(pParameters, 0); - self.setDataPointer("room-1", Utils::stringFromGVariantByteArray(pValue).c_str()); + self.setDataPointer("temperature", Utils::stringFromGVariantByteArray(pValue).c_str()); }) // GATT Descriptor: Characteristic User Description (0x2901) @@ -319,7 +319,7 @@ Server::Server(const std::string &serviceName, const std::string &advertisingNam // Standard descriptor "ReadValue" method call .onReadValue(DESCRIPTOR_METHOD_CALLBACK_LAMBDA { - const char *pDescription = "temperature in room 1"; + const char *pDescription = "temperature in a room"; self.methodReturnValue(pInvocation, pDescription, true); }) @@ -328,20 +328,13 @@ Server::Server(const std::string &serviceName, const std::string &advertisingNam .gattCharacteristicEnd() // Characteristic: String value - .gattCharacteristicBegin("room2", "11111111-2222-3333-4444-000000000002", {"read", "write"}) + .gattCharacteristicBegin("time_to_next_reading", "11111111-2222-3333-4444-000000000002", {"read"}) // Standard characteristic "ReadValue" method call .onReadValue(CHARACTERISTIC_METHOD_CALLBACK_LAMBDA { - const char *temperature = self.getDataPointer("room-2", ""); - self.methodReturnValue(pInvocation, temperature, true); - }) - - // Standard characteristic "WriteValue" method call - .onWriteValue(CHARACTERISTIC_METHOD_CALLBACK_LAMBDA - { - GVariant *pValue = g_variant_get_child_value(pParameters, 0); - self.setDataPointer("room-2", Utils::stringFromGVariantByteArray(pValue).c_str()); + const char *time = self.getDataPointer("time-to-next-sample", ""); + self.methodReturnValue(pInvocation, time, true); }) // GATT Descriptor: Characteristic User Description (0x2901) @@ -352,7 +345,7 @@ Server::Server(const std::string &serviceName, const std::string &advertisingNam // Standard descriptor "ReadValue" method call .onReadValue(DESCRIPTOR_METHOD_CALLBACK_LAMBDA { - const char *pDescription = "temperature in room 2"; + const char *pDescription = "time (in seconds) to wait before sending the next temperature reading"; self.methodReturnValue(pInvocation, pDescription, true); }) diff --git a/src/standalone.cpp b/src/standalone.cpp index b86e64e..19b2f51 100644 --- a/src/standalone.cpp +++ b/src/standalone.cpp @@ -117,12 +117,6 @@ // Maximum time to wait for any single async process to timeout during initialization static const int kMaxAsyncInitTimeoutMS = 30 * 1000; -// -// Server data values -// - -static std::vector temperatures(5); - // // Logging // @@ -141,14 +135,14 @@ LogLevel logLevel = Normal; // Our full set of logging methods (we just log to stdout) // // NOTE: Some methods will only log if the appropriate `logLevel` is set -void LogDebug(const char *pText) { if (logLevel <= Debug) { std::cout << " DEBUG: " << pText << std::endl; } } -void LogInfo(const char *pText) { if (logLevel <= Verbose) { std::cout << " INFO: " << pText << std::endl; } } -void LogStatus(const char *pText) { if (logLevel <= Normal) { std::cout << " STATUS: " << pText << std::endl; } } -void LogWarn(const char *pText) { std::cout << "WARNING: " << pText << std::endl; } -void LogError(const char *pText) { std::cout << "!!ERROR: " << pText << std::endl; } -void LogFatal(const char *pText) { std::cout << "**FATAL: " << pText << std::endl; } -void LogAlways(const char *pText) { std::cout << "..Log..: " << pText << std::endl; } -void LogTrace(const char *pText) { std::cout << "-Trace-: " << pText << std::endl; } +void LogDebug(const char *pText) { if (logLevel <= Debug) { std::cerr << " DEBUG: " << pText << std::endl; } } +void LogInfo(const char *pText) { if (logLevel <= Verbose) { std::cerr << " INFO: " << pText << std::endl; } } +void LogStatus(const char *pText) { if (logLevel <= Normal) { std::cerr << " STATUS: " << pText << std::endl; } } +void LogWarn(const char *pText) { std::cerr << "WARNING: " << pText << std::endl; } +void LogError(const char *pText) { std::cerr << "!!ERROR: " << pText << std::endl; } +void LogFatal(const char *pText) { std::cerr << "**FATAL: " << pText << std::endl; } +void LogAlways(const char *pText) { std::cerr << "..Log..: " << pText << std::endl; } +void LogTrace(const char *pText) { std::cerr << "-Trace-: " << pText << std::endl; } // // Signal handling @@ -190,9 +184,11 @@ const void *dataGetter(const char *pName) std::string strName = pName; LogInfo((std::string("reading: ")+strName).c_str()); - - char idx = strName.back(); - return temperatures[idx-'0'].c_str(); + // the only value the server can ask for is the "time to next + // sample"; this should be read from stdin, when we integrate + // with the rest of the thermostat + static const char *next_time = "30"; + return next_time; } // Called by the server when it wants to update a named value @@ -215,12 +211,11 @@ int dataSetter(const char *pName, const void *pData) } std::string strName = pName; + LogDebug((std::string("Server data: setting ")+strName).c_str()); + // the server can only receive a temperature reading, let's print it + const char* strData = static_cast(pData); + std::cout << strData << std::endl; - const char* temp = static_cast(pData); - char idx = strName.back(); - temperatures[idx-'0']=temp; - - LogDebug((std::string("Server data: temperature of ")+strName+" set to " + temp).c_str()); return 1; } -- cgit v1.2.3