//----------------------------------------------------------------------------------- // // Distributed under MIT Licence // See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. // //----------------------------------------------------------------------------------- // // GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely // tested on a Venu 2 device. The source code is provided at: // https://github.com/house-of-abbey/GarminHomeAssistant. // // J D Abbey & P A Abbey, 28 December 2022 // //----------------------------------------------------------------------------------- using Toybox.Communications; using Toybox.Lang; using Toybox.System; //! WebLog provides a logging and hence debugging aid for when the application is //! deployed to the watch. This is only used for development and use of it must not //! persist into a deployed version. It uses a string buffer to group log entries into //! larger submissions in order to prevent overflow of the Bluetooth stack. //! //! Usage: //!
//!   wl = new WebLog();
//!   wl.clear();
//!   wl.println("Debug Message");
//!   wl.flush();
//! 
//! //! File: https://domain.name/path/log.php //! //!
//! <?php
//!   $myfile = fopen("log", "a");
//!   $queries = array();
//!   parse_str($_SERVER['QUERY_STRING'], $queries);
//!   fwrite($myfile, $queries['log']);
//!   print "Success";
//! ?>
//! 
//! //! Logs published to https://domain.name/path/log. //! //! File: https://domain.name/path/log_clear.php //! //!
//! <?php
//!   $myfile = fopen("log", "w");
//!   fwrite($myfile, "");
//!   print "Success";
//! ?>
//! 
// (:glance, :background) class WebLog { private var callsBuffer = 4 as Lang.Number; private var numCalls = 0 as Lang.Number; private var buffer = "" as Lang.String; //! Set the number of calls to print() before sending the buffer to the online //! logger. //! //! @param l The number of log calls to buffer before writing to the online service. // function setCallsBuffer(l as Lang.Number) { callsBuffer = l; } //! Get the number of calls to print() before sending the buffer to the online //! logger. //! //! @return The number of log calls to buffer before writing to the online service. // function getCallsBuffer() as Lang.Number { return callsBuffer; } //! Create a debug log over the Internet to keep track of the watch's runtime //! execution. //! //! @param str The string to log. // function print(str as Lang.String) { var myTime = System.getClockTime(); buffer += myTime.hour.format("%02d") + ":" + myTime.min.format("%02d") + ":" + myTime.sec.format("%02d") + " " + str; numCalls++; // System.println("WebLog print() str = " + str); if (numCalls >= callsBuffer) { doPrint(); } } //! Create a debug log over the Internet to keep track of the watch's runtime //! execution. Add a new line character to the end. //! //! @param str The string to log. // function println(str as Lang.String) { print(str + "\n"); } //! Flush the current buffer to the online logger even if it has not reach the //! submission level set by 'callsBuffer'. // function flush() { // System.println("WebLog flush()"); if (numCalls > 0) { doPrint(); } } //! Perform the submission to the online logger. // function doPrint() { // System.println("WebLog doPrint()"); // System.println(buffer); Communications.makeWebRequest( ClientId.webLogUrl, { "log" => buffer }, { :method => Communications.HTTP_REQUEST_METHOD_GET, :headers => { "Content-Type" => Communications.REQUEST_CONTENT_TYPE_URL_ENCODED }, :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN }, method(:onLog) ); numCalls = 0; buffer = ""; } //! Clear the debug log over the Internet to start a new track of the watch's runtime //! execution. // function clear() { // System.println("WebLog clear()"); Communications.makeWebRequest( ClientId.webLogClearUrl, {}, { :method => Communications.HTTP_REQUEST_METHOD_GET, :headers => { "Content-Type" => Communications.REQUEST_CONTENT_TYPE_URL_ENCODED }, :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN }, method(:onClear) ); numCalls = 0; buffer = ""; } //! Callback function to print the outcome of a doPrint() method. Typically used for debugging this class. //! //! @param responseCode Response code. //! @param data Response data. // function onLog(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { // if (responseCode != 200) { // System.println("WebLog onLog() Failed"); // System.println("WebLog onLog() Response Code: " + responseCode); // System.println("WebLog onLog() Response Data: " + data); // } } // Callback function to print the outcome of a clear() method. Typically used for debugging this class. //! //! @param responseCode Response code. //! @param data Response data. // function onClear(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { // if (responseCode != 200) { // System.println("WebLog onClear() Failed"); // System.println("WebLog onClear() Response Code: " + responseCode); // System.println("WebLog onClear() Response Data: " + data); // } } }