OVMS3/OVMS.V3/components/ovms_script/srcduk/ovms_duk_util.cpp

194 lines
7 KiB
C++

/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "ovms-duk-util";
#include <string>
#include <fstream>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <esp_task_wdt.h>
#include "ovms_malloc.h"
#include "ovms_module.h"
#include "ovms_duktape.h"
#include "ovms_config.h"
#include "ovms_command.h"
#include "ovms_events.h"
#include "console_async.h"
#include "buffered_shell.h"
#include "ovms_netmanager.h"
#include "ovms_tls.h"
#ifdef CONFIG_OVMS_SC_JAVASCRIPT_DUKTAPE_HEAP_UMM
#include "umm_malloc_cfg.h"
#endif
////////////////////////////////////////////////////////////////////////////////
// DukOvmsPrint
static duk_ret_t DukOvmsPrint(duk_context *ctx)
{
const char *output = duk_safe_to_string(ctx,0);
OvmsWriter* duktapewriter = MyDuktape.GetDuktapeWriter();
if (output != NULL)
{
if (duktapewriter != NULL)
{
duktapewriter->printf("%s",output);
}
else
{
std::string filename, function;
int linenumber = 0;
MyDuktape.DukGetCallInfo(ctx, &filename, &linenumber, &function);
if (function == "eval")
ESP_LOGI(TAG, "[%s:%d] %s", filename.c_str(), linenumber, output);
else
ESP_LOGI(TAG, "[%s:%d:%s] %s", filename.c_str(), linenumber, function.c_str(), output);
}
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// DukOvmsWrite
static duk_ret_t DukOvmsWrite(duk_context *ctx)
{
OvmsWriter* duktapewriter = MyDuktape.GetDuktapeWriter();
if (!duktapewriter) return 0;
size_t size;
const void *data;
if (duk_is_buffer_data(ctx, 0))
data = duk_get_buffer_data(ctx, 0, &size);
else
data = duk_to_lstring(ctx, 0, &size);
if (data)
duktapewriter->write(data, size);
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// DukOvmsAssert
static duk_ret_t DukOvmsAssert(duk_context *ctx)
{
if (duk_to_boolean(ctx, 0))
{
return 0;
}
duk_error(ctx, DUK_ERR_ERROR, "assertion failed: %s", duk_safe_to_string(ctx, 1));
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// DukOvmsMemInfo
static duk_ret_t DukOvmsMemInfo(duk_context *ctx)
{
#ifdef CONFIG_OVMS_SC_JAVASCRIPT_DUKTAPE_HEAP_UMM
// Using umm_malloc:
umm_info(NULL, false);
DukContext dc(ctx);
duk_idx_t obj_idx = dc.PushObject();
// Standard info:
dc.Push(ummHeapInfo.totalBlocks * CONFIG_OVMS_SC_JAVASCRIPT_DUKTAPE_HEAP_UMM_BLOCKSIZE);
dc.PutProp(obj_idx, "totalBytes");
dc.Push(ummHeapInfo.usedBlocks * CONFIG_OVMS_SC_JAVASCRIPT_DUKTAPE_HEAP_UMM_BLOCKSIZE);
dc.PutProp(obj_idx, "usedBytes");
dc.Push(ummHeapInfo.freeBlocks * CONFIG_OVMS_SC_JAVASCRIPT_DUKTAPE_HEAP_UMM_BLOCKSIZE);
dc.PutProp(obj_idx, "freeBytes");
dc.Push(ummHeapInfo.maxFreeContiguousBlocks * CONFIG_OVMS_SC_JAVASCRIPT_DUKTAPE_HEAP_UMM_BLOCKSIZE);
dc.PutProp(obj_idx, "largestFreeBytes");
// Allocator specific info:
dc.Push("umm"); dc.PutProp(obj_idx, "memlib");
dc.Push(ummHeapInfo.totalEntries); dc.PutProp(obj_idx, "ummTotalEntries");
dc.Push(ummHeapInfo.usedEntries); dc.PutProp(obj_idx, "ummUsedEntries");
dc.Push(ummHeapInfo.freeEntries); dc.PutProp(obj_idx, "ummFreeEntries");
dc.Push(ummHeapInfo.totalBlocks); dc.PutProp(obj_idx, "ummTotalBlocks");
dc.Push(ummHeapInfo.usedBlocks); dc.PutProp(obj_idx, "ummUsedBlocks");
dc.Push(ummHeapInfo.freeBlocks); dc.PutProp(obj_idx, "ummFreeBlocks");
dc.Push(ummHeapInfo.maxFreeContiguousBlocks); dc.PutProp(obj_idx, "ummMaxFreeContiguousBlocks");
dc.Push(ummHeapInfo.usage_metric); dc.PutProp(obj_idx, "ummUsageMetric");
dc.Push(ummHeapInfo.fragmentation_metric); dc.PutProp(obj_idx, "ummFragmentationMetric");
#else
// Using system default allocator:
multi_heap_info_t heapinfo;
heap_caps_get_info(&heapinfo, MALLOC_CAP_SPIRAM);
DukContext dc(ctx);
duk_idx_t obj_idx = dc.PushObject();
// Standard info:
dc.Push(heapinfo.total_free_bytes + heapinfo.total_allocated_bytes);
dc.PutProp(obj_idx, "totalBytes");
dc.Push(heapinfo.total_allocated_bytes); dc.PutProp(obj_idx, "usedBytes");
dc.Push(heapinfo.total_free_bytes); dc.PutProp(obj_idx, "freeBytes");
dc.Push(heapinfo.largest_free_block); dc.PutProp(obj_idx, "largestFreeBytes");
// Allocator specific info:
dc.Push("sys"); dc.PutProp(obj_idx, "memlib");
dc.Push(heapinfo.minimum_free_bytes); dc.PutProp(obj_idx, "sysMinimumFreeBytes");
dc.Push(heapinfo.allocated_blocks); dc.PutProp(obj_idx, "sysAllocatedBlocks");
dc.Push(heapinfo.free_blocks); dc.PutProp(obj_idx, "sysFreeBlocks");
dc.Push(heapinfo.total_blocks); dc.PutProp(obj_idx, "sysTotalBlocks");
#endif
return 1;
}
////////////////////////////////////////////////////////////////////////////////
// DuktapeHTTPInit registration
class DuktapeUtilInit
{
public: DuktapeUtilInit();
} MyDuktapeUtilInit __attribute__ ((init_priority (1700)));
DuktapeUtilInit::DuktapeUtilInit()
{
ESP_LOGI(TAG, "Installing DUKTAPE Utilities (1710)");
MyDuktape.RegisterDuktapeFunction(DukOvmsPrint, 1, "print");
MyDuktape.RegisterDuktapeFunction(DukOvmsWrite, 1, "write");
MyDuktape.RegisterDuktapeFunction(DukOvmsAssert, 2, "assert");
MyDuktape.RegisterDuktapeFunction(DukOvmsMemInfo, 0, "meminfo");
}