simple IR2 driver for sending captures from flipper zero

* test

* Update drv_ir2.c

* fx

* fx

* fx

* qq

* test3

* tok

* test duty

* fx

* hdr

* fx

* fx

* tr

* n header

* tr

* tr

* fx

* fx

* test

* tr

tr

* fx

* simpler

* fx

* test

* fx

* dbg

* tr

* tr

* fx

* fx

* fx

* tr

* fx

* pin select

* fx

* fx

* Update drv_ir2.c

* Update drv_ir2.c

* try

* Update drv_ir2.c

* Update drv_ir2.c

* fx

* Update drv_ir2.c

* args len

* http_fn_cmd_tool: len

* better buffer handling

* try lager buffer

* clear

* Update drv_ir2.c

* long packet self tests

* Update drv_ir2.c

* Update drv_ir2.c

* alternate alias

* Queue size

* fx

* fx

* disable

* sample
This commit is contained in:
openshwprojects 2024-07-06 00:42:25 +02:00 committed by GitHub
parent f7dbf2a1be
commit e1f8e59e13
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 565 additions and 9 deletions

7
lastEnumTemplate.txt Normal file
View File

@ -0,0 +1,7 @@
{ 17822728f value == '1' }
Ok
{ 2.121830e-304lif value == '0' }
Bad
{-9.255963e+61lse }
Unknown
{-9.255963e+61ndif }

View File

@ -503,7 +503,20 @@ static commandResult_t CMD_CreateAliasForCommand(const void* context, const char
}
alias = Tokenizer_GetArg(0);
#if 0
ocmd = Tokenizer_GetArgFrom(1);
#else
while (*args && isWhiteSpace(*args)) {
args++;
}
while (*args && !isWhiteSpace(*args)) {
args++;
}
while (*args && isWhiteSpace(*args)) {
args++;
}
ocmd = args;
#endif
return CMD_CreateAliasHelper(alias, ocmd);
}

View File

@ -245,8 +245,7 @@ typedef struct scriptInstance_s {
struct scriptInstance_s *next;
} scriptInstance_t;
#define MAX_SCRIPT_LINE 512
int g_scrBufferSize = 0;
char *g_scrBuffer = 0;
int svm_deltaMS;
scriptFile_t *g_scriptFiles = 0;
@ -399,8 +398,12 @@ void SVM_RunThread(scriptInstance_t *t) {
// skip empty lines and skip labels
if(len > 0 && start[len-1] != ':') {
if(len >= MAX_SCRIPT_LINE) {
len = MAX_SCRIPT_LINE-1;
if(len >= g_scrBufferSize) {
g_scrBufferSize = len + 256;
g_scrBuffer = (char*)realloc(g_scrBuffer, g_scrBufferSize+1);
}
if (g_scrBuffer == NULL) {
return;
}
memcpy(g_scrBuffer,start,len);
g_scrBuffer[len] = 0;
@ -426,7 +429,8 @@ void SVM_RunThreads(int deltaMS) {
svm_deltaMS = deltaMS;
if(g_scrBuffer == 0) {
g_scrBuffer = malloc(MAX_SCRIPT_LINE);
g_scrBufferSize = 256;
g_scrBuffer = malloc(g_scrBufferSize + 1);
}
g_activeThread = g_scriptThreads;

339
src/driver/drv_ir2.c Normal file
View File

@ -0,0 +1,339 @@
#ifndef PLATFORM_BL602
#include "drv_local.h"
#include "../new_common.h"
#if PLATFORM_BEKEN
#include "include.h"
#include "arm_arch.h"
#include "../new_pins.h"
#include "../new_cfg.h"
#include "../logging/logging.h"
#include "../obk_config.h"
#include "../cmnds/cmd_public.h"
#include "bk_timer_pub.h"
#include "drv_model_pub.h"
#include <gpio_pub.h>
//#include "pwm.h"
#include "pwm_pub.h"
#include "../../beken378/func/include/net_param_pub.h"
#include "../../beken378/func/user_driver/BkDriverPwm.h"
#include "../../beken378/func/user_driver/BkDriverI2c.h"
#include "../../beken378/driver/i2c/i2c1.h"
#include "../../beken378/driver/gpio/gpio.h"
#include "../../beken378/driver/pwm/pwm.h"
#if PLATFORM_BK7231N
#include "../../beken378/driver/pwm/pwm_new.h"
#define REG_PWM_BASE_ADDR (0x00802B00UL)
#define PWM_CHANNEL_NUMBER_ALL 6
#define PWM_CHANNEL_NUMBER_MAX (PWM_CHANNEL_NUMBER_ALL - 1)
#define PWM_CHANNEL_NUMBER_MIN 0
#define REG_PWM_GROUP_ADDR(x) (REG_PWM_BASE_ADDR + (0x40 * x))
#define REG_PWM_GROUP_CTRL_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x00 * 4)
#define REG_PWM_CTRL_MASK 0xFFFFFFFFUL
#define REG_PWM_GROUP_CTRL(x) (*((volatile unsigned long *) REG_PWM_GROUP_CTRL_ADDR(x)))
#define PWM_GROUP_MODE_SET_BIT(x) (8*x)
#define PWM_GROUP_PWM_ENABLE_BIT(x) (8*x + 3)
#define PWM_GROUP_PWM_ENABLE_MASK(x) (1 <<PWM_GROUP_PWM_ENABLE_BIT(x))
#define PWM_GROUP_PWM_INT_ENABLE_BIT(x) (8*x + 4)
#define PWM_GROUP_PWM_STOP_BIT(x) (8*x + 5)
#define PWM_GROUP_PWM_INT_LEVL_BIT(x) (8*x + 6)
#define PWM_GROUP_PWM_INT_LEVL_MASK(x) (1<< PWM_GROUP_PWM_INT_LEVL_BIT(x))
#define PWM_GROUP_PWM_CFG_UPDATA_BIT(x) (8*x + 7)
#define PWM_GROUP_PWM_CFG_UPDATA_MASK(x) (1<< PWM_GROUP_PWM_CFG_UPDATA_BIT(x))
#define PWM_GROUP_PWM_PRE_DIV_BIT 16
#define PWM_GROUP_PWM_PRE_DIV_MASK (0xFF << 16)
#define PWM_GROUP_PWM_GROUP_MODE_BIT 24
#define PWM_GROUP_PWM_GROUP_MODE_MASK 1 << 24
#define PWM_GROUP_PWM_GROUP_MODE_ENABLE_BIT 25
#define PWM_GROUP_PWM_GROUP_MODE_ENABLE_MASK 1 << 25
#define PWM_GROUP_PWM_INT_STAT_BIT(x) (x + 30)
#define PWM_GROUP_PWM_INT_STAT_CLEAR(x) (1 << PWM_GROUP_PWM_INT_STAT_BIT(x))
#define PWM_GROUP_PWM_INT_STAT_MASK(x) (1 << PWM_GROUP_PWM_INT_STAT_BIT(x))
#define REG_GROUP_PWM0_T1_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x01 * 4)
#define REG_GROUP_PWM0_T1(x) (*((volatile unsigned long *) REG_GROUP_PWM0_T1_ADDR(x) ))
#define REG_GROUP_PWM0_T2_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x02 * 4)
#define REG_GROUP_PWM0_T2(x) (*((volatile unsigned long *) REG_GROUP_PWM0_T2_ADDR(x) ))
#define REG_GROUP_PWM0_T3_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x03 * 4)
#define REG_GROUP_PWM0_T3(x) (*((volatile unsigned long *) REG_GROUP_PWM0_T3_ADDR(x) ))
#define REG_GROUP_PWM0_T4_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x04 * 4)
#define REG_GROUP_PWM0_T4(x) (*((volatile unsigned long *) REG_GROUP_PWM0_T4_ADDR(x) ))
#define REG_GROUP_PWM1_T1_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x05 * 4)
#define REG_GROUP_PWM1_T1(x) (*((volatile unsigned long *) REG_GROUP_PWM1_T1_ADDR(x) ))
#define REG_GROUP_PWM1_T2_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x06 * 4)
#define REG_GROUP_PWM1_T2(x) (*((volatile unsigned long *) REG_GROUP_PWM1_T2_ADDR(x) ))
#define REG_GROUP_PWM1_T3_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x07 * 4)
#define REG_GROUP_PWM1_T3(x) (*((volatile unsigned long *) REG_GROUP_PWM1_T3_ADDR(x) ))
#define REG_GROUP_PWM1_T4_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x08 * 4)
#define REG_GROUP_PWM1_T4(x) (*((volatile unsigned long *) REG_GROUP_PWM1_T4_ADDR(x) ))
#define REG_GROUP_PWM_CPU_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x09 * 4)
#define REG_GROUP_PWM_CPU(x) (*((volatile unsigned long *) REG_GROUP_PWM_CPU_ADDR(x) ))
#define PWM_CPU_RD0 1 << 0
#define PWM_CPU_RD1 1 << 1
#define REG_GROUP_PWM0_RD_DATA_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x0a * 4)
#define REG_GROUP_PWM0_RD_DATA_(x) (*((volatile unsigned long *) REG_GROUP_PWM0_RD_DATA_ADDR(x) ))
#define REG_GROUP_PWM1_RD_DATA_ADDR(x) (REG_PWM_GROUP_ADDR(x) + 0x0b * 4)
#define REG_GROUP_PWM1_RD_DATA_(x) (*((volatile unsigned long *) REG_GROUP_PWM1_RD_DATA_ADDR(x) ))
#define MY_SET_DUTY(duty) \
REG_WRITE(reg_duty, duty); \
UINT32 level; \
if (duty == 0) \
level = 0; \
else \
level = 1; \
UINT32 value = REG_READ(REG_PWM_GROUP_CTRL_ADDR(group)); \
value &= ~(PWM_GROUP_PWM_INT_LEVL_MASK(channel)); \
value |= PWM_GROUP_PWM_CFG_UPDATA_MASK(channel) \
| (level << PWM_GROUP_PWM_INT_LEVL_BIT(channel)); \
REG_WRITE(REG_PWM_GROUP_CTRL_ADDR(group), value); \
#else
#define MY_SET_DUTY(duty) bk_pwm_update_param((bk_pwm_t)pwmIndex, period, duty);
#endif
#elif WINDOWS
void bk_gpio_output(int x, int y) {
}
void bk_gpio_config_output(int x) {
}
#endif
static UINT32 ir_chan
#ifndef WINDOWS
= BKTIMER0
#endif
;
static UINT32 ir_div = 1;
static UINT32 ir_periodus = 50;
static UINT32 duty_on, duty_off;
static UINT32 reg_duty;
int txpin = 26;
int times[512];
int maxTimes = 512;
int *cur;
int *stop;
int myPeriodUs = 50;
int curTime = 0;
int state = 0;
int pwmIndex = -1;
unsigned int period;
UINT8 group, channel;
void SendIR2_ISR(UINT8 t) {
if (cur == 0)
return;
curTime += myPeriodUs;
int tg = *cur;
if (tg <= curTime) {
curTime -= tg;
state = !state;
if (state == 0) {
MY_SET_DUTY(duty_off);
}
else {
MY_SET_DUTY(duty_on);
}
cur++;
if (cur == stop) {
// done
cur = 0;
MY_SET_DUTY(duty_off);
}
}
}
/*
// start the driver
startDriver IR2
// start timer 50us
// arguments: duty_on_fraction, duty_off_fraction, pin for sending (optional)
SetupIR2 50 0.5 0 8
// send data
SendIR2 3200 1300 950 500 900 1300 900 550 900 650 900
//
*/
static commandResult_t CMD_IR2_SendIR2(const void* context, const char* cmd, const char* args, int cmdFlags) {
float frequency = 38000;
float duty_cycle = 0.330000f;
stop = times;
ADDLOG_INFO(LOG_FEATURE_IR, "SendIR2 args len: %i", strlen(args));
// parse string like 10 12 432 432 432 432 432
*stop = 500; // prepend 500us zero
stop++;
while (*args) {
while (*args && isWhiteSpace(*args)) {
args++;
}
if (stop - times < maxTimes) {
int x = atoi(args);
*stop = x;
ADDLOG_INFO(LOG_FEATURE_IR, "Value: %i",x);
stop++;
}
else {
break;
}
while (*args && !isWhiteSpace(*args)) {
args++;
}
}
state = 0;
ADDLOG_INFO(LOG_FEATURE_IR, "Queue size %i",(stop - times));
#if PLATFORM_BK7231N
bk_pwm_update_param((bk_pwm_t)pwmIndex, period, duty_off, 0, 0);
#else
bk_pwm_update_param((bk_pwm_t)pwmIndex, period, duty_off);
#endif
cur = times;
#if WINDOWS
while (cur) {
SendIR2_ISR(0);
}
#endif
return CMD_RES_OK;
}
static commandResult_t CMD_IR2_SetupIR2(const void* context, const char* cmd, const char* args, int cmdFlags) {
Tokenizer_TokenizeString(args, 0);
myPeriodUs = Tokenizer_GetArgIntegerDefault(0, 50);
float duty_on_frac = Tokenizer_GetArgFloatDefault(1, 0.5f);
float duty_off_frac = Tokenizer_GetArgFloatDefault(2, 0.0f);
txpin = Tokenizer_GetArgIntegerDefault(3, 26);
#if DEBUG_WAVE_WITH_GPIO
bk_gpio_config_output(txpin);
#else
pwmIndex = PIN_GetPWMIndexForPinIndex(txpin);
// is this pin capable of PWM?
if (pwmIndex != -1) {
#if PLATFORM_BK7231N
group = get_set_group(pwmIndex);
channel = get_set_channel(pwmIndex);
uint32_t pwmfrequency = 38000;
period = (26000000 / pwmfrequency);
duty_on = period * duty_on_frac;
duty_off = period * duty_off_frac;
if (channel == 0) {
reg_duty = REG_GROUP_PWM0_T1_ADDR(group);
}
else {
reg_duty = REG_GROUP_PWM1_T1_ADDR(group);
}
#endif
#ifndef WINDOWS
#if PLATFORM_BK7231N
// OSStatus bk_pwm_initialize(bk_pwm_t pwm, uint32_t frequency, uint32_t duty_cycle);
bk_pwm_initialize((bk_pwm_t)pwmIndex, period, period/2, 0, 0);
#else
bk_pwm_initialize((bk_pwm_t)pwmIndex, period, period / 2);
#endif
bk_pwm_start((bk_pwm_t)pwmIndex);
MY_SET_DUTY(duty_off);
#endif
}
#endif
#ifndef WINDOWS
timer_param_t params = {
(unsigned char)ir_chan,
(unsigned char)ir_div, // div
myPeriodUs, // us
SendIR2_ISR
};
//GLOBAL_INT_DECLARATION();
UINT32 res;
// test what error we get with an invalid command
res = sddev_control((char *)TIMER_DEV_NAME, -1, 0);
if (res == 1) {
ADDLOG_INFO(LOG_FEATURE_IR, (char *)"bk_timer already initialised");
}
else {
ADDLOG_ERROR(LOG_FEATURE_IR, (char *)"bk_timer driver not initialised?");
if ((int)res == -5) {
ADDLOG_INFO(LOG_FEATURE_IR, (char *)"bk_timer sddev not found - not initialised?");
return;
}
return;
}
//ADDLOG_INFO(LOG_FEATURE_IR, (char *)"ir timer init");
// do not need to do this
//bk_timer_init();
//ADDLOG_INFO(LOG_FEATURE_IR, (char *)"ir timer init done");
ADDLOG_INFO(LOG_FEATURE_IR, (char *)"will ir timer setup %u", res);
res = sddev_control((char *)TIMER_DEV_NAME, CMD_TIMER_INIT_PARAM_US, &params);
ADDLOG_INFO(LOG_FEATURE_IR, (char *)"ir timer setup %u", res);
res = sddev_control((char *)TIMER_DEV_NAME, CMD_TIMER_UNIT_ENABLE, &ir_chan);
ADDLOG_INFO(LOG_FEATURE_IR, (char *)"ir timer enabled %u", res);
#endif
return CMD_RES_OK;
}
void DRV_IR2_Init() {
CMD_RegisterCommand("SetupIR2", CMD_IR2_SetupIR2, NULL);
CMD_RegisterCommand("SendIR2", CMD_IR2_SendIR2, NULL);
}
#endif

View File

@ -70,6 +70,8 @@ void HT16K33_Init();
void HD2015_Init();
void DRV_IR2_Init();
void DRV_ADCSmoother_Init();
void DRV_ADCSmoother_RunFrame();

View File

@ -188,6 +188,10 @@ static driver_t g_drivers[] = {
//drvdetail:"requires":""}
{ "IR", DRV_IR_Init, NULL, NULL, DRV_IR_RunFrame, NULL, NULL, false },
#endif
#if ENABLE_DRIVER_IR2
{ "IR2", DRV_IR2_Init, NULL, NULL, NULL, NULL, NULL, false },
#endif
#if ENABLE_DRIVER_DDP
//drvdetail:{"name":"DDP",
//drvdetail:"title":"TODO",

View File

@ -1548,6 +1548,7 @@ int http_fn_cmd_tool(http_request_t* request) {
poststr(request, "Remember that some commands are added after a restart when a driver is activated... <br>");
commandLen = http_getArg(request->url, "cmd", tmpA, sizeof(tmpA));
addLogAdv(LOG_ERROR, LOG_FEATURE_HTTP, "http_fn_cmd_tool: len %i",commandLen);
if (commandLen) {
poststr(request, "<br>");
// all log printfs made by command will be sent also to request

View File

@ -91,7 +91,25 @@ static void tcp_client_thread(beken_thread_arg_t arg)
request.received = buf;
request.receivedLenmax = INCOMING_BUFFER_SIZE - 2;
request.responseCode = HTTP_RESPONSE_OK;
request.receivedLen = recv(fd, request.received, request.receivedLenmax, 0);
request.receivedLen = 0;
while (1) {
int remaining = request.receivedLenmax - request.receivedLen;
int received = recv(fd, request.received + request.receivedLen, remaining, 0);
if (received <= 0) {
break;
}
request.receivedLen += received;
if (received < remaining) {
break;
}
// grow by 1024
request.receivedLenmax += 1024;
request.received = (char*)realloc(request.received, request.receivedLenmax+2);
if (request.received == NULL) {
// no memory
return;
}
}
request.received[request.receivedLen] = 0;
request.reply = reply;

View File

@ -72,6 +72,7 @@
#define ENABLE_DRIVER_SSDP 1
#define ENABLE_DRIVER_ADCBUTTON 1
#define ENABLE_DRIVER_SM15155E 1
#define ENABLE_DRIVER_IR2 0
#elif PLATFORM_BL602
@ -139,6 +140,7 @@
//#define ENABLE_DRIVER_BMPI2C 1
#define ENABLE_DRIVER_DDP 1
#define ENABLE_DRIVER_SSDP 1
#define ENABLE_DRIVER_IR2 0
#elif PLATFORM_LN882H

View File

@ -3,6 +3,58 @@
#include "selftest_local.h"
#include "../httpserver/new_http.h"
char g_loremIpsum[] = "Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.";
char *g_savedArgs = 0;
char g_loremIpsum2[] = "Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.";
char g_loremIpsum3[] = "Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.""Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
"Lorem_ipsum_dolor_sit_amet,_consectetur_adipiscing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum.";
static commandResult_t CMD_SelfTest_SaveArgs(const void* context, const char* cmd, const char* args, int cmdFlags) {
if (g_savedArgs)
free(g_savedArgs);
g_savedArgs = strdup(args);
return CMD_RES_OK;
}
void Test_CFG_Via_HTTP() {
const char *mqtt_userName = "MyMQTTUser";
SIM_ClearOBK(0);
@ -47,6 +99,40 @@ void Test_CFG_Via_HTTP() {
SELFTEST_ASSERT_JSON_VALUE_STRING(0, "SSID1", "newApName");
// causes assert
//SELFTEST_ASSERT_JSON_VALUE_STRING(0, "SSID1", "newAcName");
CMD_RegisterCommand("SimSaveArgs", CMD_SelfTest_SaveArgs, 0);
Test_FakeHTTPClientPacket_JSON("cm?cmnd=SimSaveArgs%20123");
SELFTEST_ASSERT_STRING(g_savedArgs,"123");
Test_FakeHTTPClientPacket_JSON_VA("cm?cmnd=SimSaveArgs%%20%s", g_loremIpsum);
printf("Lorem len: %i", strlen(g_savedArgs));
SELFTEST_ASSERT_STRING(g_savedArgs, g_loremIpsum);
Test_FakeHTTPClientPacket_JSON_VA("cm?cmnd=SimSaveArgs%%20%s", g_loremIpsum2);
printf("Lorem2 len: %i", strlen(g_savedArgs));
SELFTEST_ASSERT_STRING(g_savedArgs, g_loremIpsum2);
Test_FakeHTTPClientPacket_JSON_VA("cm?cmnd=SimSaveArgs%%20%s", g_loremIpsum3);
printf("Lorem3 len: %i", strlen(g_savedArgs));
SELFTEST_ASSERT_STRING(g_savedArgs, g_loremIpsum3);
CMD_ExecuteCommand("SimSaveArgs ok tester", 0);
SELFTEST_ASSERT_STRING(g_savedArgs, "ok tester");
SELFTEST_ASSERT(strlen(g_savedArgs) == strlen("ok tester"));
char tmp[8192 * 8];
sprintf(tmp, "alias lorem SimSaveArgs %s", g_loremIpsum);
CMD_ExecuteCommand(tmp, 0);
CMD_ExecuteCommand("lorem", 0);
SELFTEST_ASSERT_STRING(g_savedArgs, g_loremIpsum);
SELFTEST_ASSERT(strlen(g_savedArgs) == strlen(g_loremIpsum));
sprintf(tmp, "alias lorem3 SimSaveArgs %s", g_loremIpsum3);
CMD_ExecuteCommand(tmp,0);
CMD_ExecuteCommand("lorem3", 0);
SELFTEST_ASSERT(strlen(g_savedArgs) == strlen(g_loremIpsum3));
SELFTEST_ASSERT_STRING(g_savedArgs, g_loremIpsum3);
}
#endif

View File

@ -117,6 +117,72 @@ void Test_Commands_Alias_Generic() {
CMD_ExecuteCommand("test8", 0);
SELFTEST_ASSERT_CHANNEL(4, 11 + 10 * (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 100));
SELFTEST_ASSERT_CHANNEL(5, 50);
CMD_ExecuteCommand("alias test9 backlog setChannel 4 11; setChannel 5 50; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100;\
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100; \
addChannel 4 9; addChannel 4 8; addChannel 4 7; addChannel 4 6; \
addChannel 4 5; addChannel 4 4; addChannel 4 3; \
addChannel 4 2; addChannel 4 1; addChannel 4 100;", 0);
CMD_ExecuteCommand("test9", 0);
SELFTEST_ASSERT_CHANNEL(4, 11 + 20 * (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 100));
SELFTEST_ASSERT_CHANNEL(5, 50);
// this check will fail obviously!
//SELFTEST_ASSERT_CHANNEL(5, 666);
}

View File

@ -56,8 +56,8 @@ const char *Helper_GetPastHTTPHeader(const char *s) {
return 0;
}
static char outbuf[8192];
static char buffer[8192];
static char outbuf[65536];
static char buffer[65536];
static const char *replyAt;
//static jsmntok_t tokens[256]; /* We expect no more than qq JSON tokens */
@ -119,6 +119,20 @@ void Test_GetJSONValue_Setup(const char *text) {
g_json = cJSON_Parse(text);
g_sec_power = cJSON_GetObjectItemCaseSensitive(g_json, "POWER");
}
void Test_FakeHTTPClientPacket_JSON_VA(const char *tg, ...) {
char bufferTemp[32768];
va_list argList;
va_start(argList, tg);
vsnprintf(bufferTemp, sizeof(bufferTemp), tg, argList);
va_end(argList);
int r;
Test_FakeHTTPClientPacket_GET(bufferTemp);
//jsmn_init(&parser);
//r = jsmn_parse(&parser, replyAt, strlen(replyAt), tokens, 256);
Test_GetJSONValue_Setup(replyAt);
}
void Test_FakeHTTPClientPacket_JSON(const char *tg) {
/*char bufferTemp[8192];
va_list argList;

View File

@ -139,7 +139,7 @@ void Test_GetJSONValue_Setup(const char *text);
void Test_FakeHTTPClientPacket_GET(const char *tg);
void Test_FakeHTTPClientPacket_POST(const char *tg, const char *data);
void Test_FakeHTTPClientPacket_POST_withJSONReply(const char *tg, const char *data);
void Test_FakeHTTPClientPacket_JSON(const char *tg);
void Test_FakeHTTPClientPacket_JSON(const char *tg, ...);
const char *Test_GetLastHTMLReply();
// TODO: move elsewhere?