Refactoring, cleanup, removing debugging prints.

This commit is contained in:
2018-04-12 10:59:07 +02:00
parent fb759c481d
commit d969255227
29 changed files with 86 additions and 412 deletions

View File

@@ -5,13 +5,13 @@
This is about a device that can be called by WLAN / TCP/IP and prints on a cheap thermo printer using paper rolls.
Hardware used:
- ESP-CPU:
-- Wemos ESP32 LoLin (any ESP32 should work), we are using UART1 (GPIO26=Tx)
-- Wemos ESP8266 (any should work), we are using UART1 Tx only (GPIO2=Tx)
- GOOJPRT QR204 Micro Embedded Printer with RS232/TTL and USB-Interface
-- TX, RX, GND connected to ESP32
-- POWER connected to seperate power supply (+5V/GND)
- ESP-CPU:
- Wemos ESP32 LoLin (any ESP32 should work), we are using UART1 (GPIO26=Tx)
- Wemos ESP8266 (any should work), we are using UART1 Tx only (GPIO2=Tx)
- GOOJPRT QR204 Micro Embedded Printer with RS232/TTL and USB-Interface
- TX, RX, GND connected to ESP32
- POWER connected to seperate power supply (+5V/GND)
## How to install this app
@@ -21,3 +21,33 @@ Hardware used:
<p align="center">
<img src="https://mongoose-os.com/images/app1.gif" width="75%">
</p>
## Interface description / API usage
As Mongoose-OS is used as platform for this software, all Mongoose-OS supported RPC-Mechanisms are supported, which are:
- USB: Easiest is to start browser based UI ("> mos ui") or by following command line:<br />
*mos --port /dev/ttyUSB0 call TP.Print '{"text": "Text to be printed"}'*
- MQTT: *mos --port mqtt://my.mqtt.server:1883/esp32_6732ac call TP.Print '{"text": "Text to be printed"}'*
- WS (WebSocket): *mos --port ws://192.168.0.206/rpc call TP.Print '{"text": "Text to be printed"}'*
- RESTful HTTP call: *curl -d '{"text": "Text to be printed"}' 192.168.0.206/rpc/TP.Print*
## Printed Text Formatting
The text to be printed is formatted using markdown notation (not fully supported, just "like markdown"). You may use following formattings:
- lines starting with # are used as headlines, printed with double width and height
- inline formattings used:
- "\*" character is used to mark begin and end of emphasized strings, which are printed bold. Example: *Text to be \*emphasized**
- "\_" underline character is used to mark begin and end of underlined text. Example: *Text to be \_underlined_*
- Characters can be escaped using the "\\" character. This might be changed by configuration (config parameter tp.escapeCharacter, see Config-RPC service)
## Configuration
You may use the Mongoose-OS configuration service to change the behaviour and interface of this module. E.g. use *"> mos --port /dev/USB0 config-get"* to get the current configuration and *"> mos --port /dev/USB0 config-set key=value"* to set a configuration value.
The only specific configuration is everything that is defined under the "tp" key. MQTT, Wifi, debugging and other settings may be changed and are available from Mongoose-OS anyway. A shortcut to set the Wifi settings is: *"> mos --port /dev/USB0 wifi WIFI_NAME WIFI_PASSWORD"*.
## OTA
The firmware may be updated using OTA services offered by Mongoose-OS (see https://mongoose-os.com/docs/book/ota.html).

1
deps/ca-bundle vendored Submodule

Submodule deps/ca-bundle added at 22b41ef50b

1
deps/cron vendored Submodule

Submodule deps/cron added at fd6a6853d2

1
deps/crontab vendored Submodule

Submodule deps/crontab added at c10d62042d

1
deps/dash vendored Submodule

Submodule deps/dash added at fd2fc406df

1
deps/http-server vendored Submodule

Submodule deps/http-server added at f489eabc4f

1
deps/i2c vendored Submodule

Submodule deps/i2c added at 2189718e63

1
deps/jstore vendored Submodule

Submodule deps/jstore added at b2067da60b

1
deps/location vendored Submodule

Submodule deps/location added at 5e8644bbd6

1
deps/mongoose vendored Submodule

Submodule deps/mongoose added at 7d696f6bba

1
deps/mongoose-os vendored Submodule

Submodule deps/mongoose-os added at bac8bbfa56

1
deps/mqtt vendored Submodule

Submodule deps/mqtt added at 0ff92f39f1

1
deps/ota-http-client vendored Submodule

Submodule deps/ota-http-client added at 544c8a7f13

1
deps/ota-shadow vendored Submodule

Submodule deps/ota-shadow added at af98060620

1
deps/rpc-common vendored Submodule

Submodule deps/rpc-common added at ab63fe41f2

1
deps/rpc-loopback vendored Submodule

Submodule deps/rpc-loopback added at a9adcc32ab

1
deps/rpc-mqtt vendored Submodule

Submodule deps/rpc-mqtt added at 7376383231

1
deps/rpc-service-config vendored Submodule

Submodule deps/rpc-service-config added at 354f394ea6

1
deps/rpc-service-cron vendored Submodule

Submodule deps/rpc-service-cron added at 346e701e7e

1
deps/rpc-service-fs vendored Submodule

Submodule deps/rpc-service-fs added at fec1c77df6

1
deps/rpc-service-ota vendored Submodule

Submodule deps/rpc-service-ota added at 257799cc35

1
deps/rpc-uart vendored Submodule

Submodule deps/rpc-uart added at 1d4c01f193

1
deps/shadow vendored Submodule

Submodule deps/shadow added at a01a100eeb

1
deps/sntp vendored Submodule

Submodule deps/sntp added at 2df8902be6

1
deps/spi vendored Submodule

Submodule deps/spi added at d956323bca

1
deps/wifi vendored Submodule

Submodule deps/wifi added at 2444a4268b

View File

@@ -35,6 +35,7 @@ config_schema:
# - ["i2c.scl_gpio", 5] # D1
- ["tp", "o", {title: "Thermo printer controller settings"}]
- ["tp.escapeCharacter", "i", 27, {title: "ASCII code of character, that is to be used as escape character in text interpretation"}]
- ["tp.printSystemInfoOnStartup", "b", false, {title: "Prints some technical info about CPU/System resources after boot"}]
# - ["mqtt.enable", true]
# - ["mqtt.server", "mqtt.pmpark.de:1883"]
# - ["mqtt.user", "default"]

View File

@@ -1,6 +1,6 @@
#ifndef __QR204_H
#define __QR204_H
#ifndef QR204_H_included
#define QR204_H_included
#include "mgos.h"
#include "mgos_system.h"
@@ -22,5 +22,5 @@ extern void tp_reset_mode(uint8_t removeModes);
extern void tp_reverse_feed(uint8_t numLines);
extern void tp_linefeed(uint8_t numLines);
extern void tp_print_text(char *text);
#endif
#endif

View File

@@ -23,7 +23,7 @@
#include "QR204.h"
static bool doPrint = false;
static bool doPrintInTimer = false;
#if CS_PLATFORM == CS_P_ESP32
#define UART_NO 1
@@ -42,34 +42,27 @@ static void timer_cb(void *arg) {
* Note: do not use mgos_uart_write to output to console UART (0 in our case).
* It will work, but output may be scrambled by console debug output.
*/
printf("Timer loop!\n");
// printf("Timer loop!\n");
if (doPrint) {
if (doPrintInTimer) {
tp_reset_mode(TP_MODE_ALL);
tp_print(UART_NO, "Timer loop!\n");
tp_set_mode(TP_MODE_UNDERLINED);
tp_print(UART_NO, "0,123456789\n");
}
/* tp_print(UART_NO, "- -\n");
tp_print(UART_NO, " - - \n");
tp_reverse_feed(2);
tp_print(UART_NO, " - - \n");
tp_print(UART_NO, "- -\n");*/
#if CS_PLATFORM == CS_P_ESP32
#if CS_PLATFORM == CS_P_ESP32
uint32_t hall = hall_sens_read();
uint8_t temp = temprature_sens_read();
esp_chip_info_t ci;
esp_chip_info(&ci);
tp_print(UART_NO, "t=%.1f C, h=%ld mH, tasks=%d\n", (float) (temp-32)/1.8 - tempOffset, hall, uxTaskGetNumberOfTasks());
#elif CS_PLATFORM == CS_P_ESP8266
#elif CS_PLATFORM == CS_P_ESP8266
tp_print(UART_NO,
"mem=%d kB, free=%d kB, fs=%d kB\n",
(int) mgos_get_heap_size()/1024,
(int) mgos_get_free_heap_size()/1024,
(int) mgos_get_fs_size()/1024);
#endif
#endif
}
(void) arg;
}
@@ -147,389 +140,14 @@ enum mgos_app_init_result mgos_app_init(void) {
mg_rpc_add_handler(c, "TP.Print", "{text: %Q}", rpc_tpPrint, NULL);
tp_reset_mode(TP_MODE_ALL);
/*
tp_print(UART_NO, "TEST Print\r");
tp_print(UART_NO, "----------\n");
*/
if (mgos_sys_config_get_tp_printSystemInfoOnStartup()) {
printSystemInfo();
}
return MGOS_APP_INIT_SUCCESS;
}
/* -------------------------------------------------------------------- */
/* =======================================
static void recalcTimings() {
flashLightRampUp_deltaSpeed = (flashLightSpeed * motorUpdateTime_msec) / motorRampUpTime_msec;
flashLightRampDown_deltaSpeed = (flashLightSpeed * motorUpdateTime_msec) / motorRampDownTime_msec;
}
static void pubStatus(const char *statusString, double percentage) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
if (!mqttConnected) return;
mbuf_init(&fb, 30);
if (mgos_mqtt_global_connect()) {
json_printf(&out, "{statusString: %Q, speed: %f}", statusString, percentage);
mgos_mqtt_pub(pubStatusTopic, fb.buf, fb.len, 0, true);
}
}
static void motor_timer_cb(void *arg) {
static bool stopped = false;
switch (motorStatus) {
case MotorStatus_Off:
wemos_motor_stop(M1);
break;
case MotorStatus_On:
wemos_motor_setmotor(M1, motorDirection, pwm);
break;
case MotorStatus_RampUp:
pwm += flashLightRampUp_deltaSpeed;
if (pwm >= flashLightSpeed) {
LOG(LL_INFO, ("MotorStatus_RampUp: Speed target reached"));
pwm = flashLightSpeed;
motorStatus = MotorStatus_On;
}
wemos_motor_setmotor(M1, motorDirection, pwm);
// LOG(LL_INFO, ("M1, dir=%d, pwm=%f", motorDirection, pwm));
break;
case MotorStatus_RampDown:
pwm -= flashLightRampDown_deltaSpeed;
if (pwm <= flashLightTargetSpeed) {
if (pwm <= 0.0) {
motorStatus = MotorStatus_Off;
pwm = 0.0;
wemos_motor_stop(M1);
// change direction for next time, when motor turns on again
if (motorDirection == _CW) {
motorDirection = _CCW;
} else {
motorDirection = _CW;
}
} else {
pwm = flashLightTargetSpeed;
LOG(LL_INFO, ("MotorStatus_RampDown: Speed target reached"));
motorStatus = MotorStatus_On;
wemos_motor_setmotor(M1, motorDirection, pwm);
}
} else {
wemos_motor_setmotor(M1, motorDirection, pwm);
// LOG(LL_INFO, ("M1, dir=%d, pwm=%f", motorDirection, pwm));
}
break;
case MotorStatus_DemoMode:
default:
if (pwm > flashLightSpeed + 5.0) {
pwm = 0.0; // start again
stopped = false;
} else {
pwm += 0.1;
if (!stopped) {
wemos_motor_setmotor(M1, motorDirection, pwm);
LOG(LL_INFO, ("M1, dir=%d, pwm=%f", motorDirection, pwm));
pubStatus("on", pwm);
if (pwm > flashLightSpeed) {
// wemos_motor_setmotor(M1, _STOP, 0.0);
wemos_motor_setmotor(M1, _STANDBY, pwm);
stopped = true;
LOG(LL_INFO, ("Stopped/Standby"));
pubStatus("off", 0);
}
}
}
break;
}
(void) arg;
}
static void flashLightOn() {
LOG(LL_INFO, ("FlashLight ON\n"));
flashLightTargetSpeed = flashLightSpeed;
motorStatus = MotorStatus_RampUp; // this starts the motor on next timer callback
pubStatus("on", flashLightSpeed);
}
static void rpc_flashLightOn(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
flashLightOn();
mbuf_init(&fb, 100);
json_printf(&out, "{result: 0, resultString: %Q}", "OK");
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
(void) cb_arg;
(void) fi;
(void) args;
}
static void cron_flashLightOn(struct mg_str action, struct mg_str payload, void *userdata) {
LOG(LL_INFO, ("Crontab flashLightOn fired"));
flashLightOn();
(void) action;
(void) payload;
(void) userdata;
}
static void flashLightOff() {
LOG(LL_INFO, ("FlashLight OFF\n"));
flashLightTargetSpeed = 0.0;
motorStatus = MotorStatus_RampDown; // this stops the motor on next timer callback
pubStatus("off", 0);
}
static void rpc_flashLightOff(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
flashLightOff();
mbuf_init(&fb, 100);
json_printf(&out, "{result: 0, resultString: %Q}", "OK");
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
(void) cb_arg;
(void) fi;
(void) args;
}
static void cron_flashLightOff(struct mg_str action, struct mg_str payload, void *userdata) {
LOG(LL_INFO, ("Crontab flashLightOff fired"));
flashLightOff();
(void) action;
(void) payload;
(void) userdata;
}
static void cron_init() {
mgos_crontab_register_handler(mg_mk_str("FlashLightOn"), cron_flashLightOn, NULL);
mgos_crontab_register_handler(mg_mk_str("FlashLightOff"), cron_flashLightOff, NULL);
}
static void flashLightSetSpeed(uint16_t newSpeed) {
flashLightTargetSpeed = (double) newSpeed;
flashLightSpeed = flashLightTargetSpeed;
if (pwm < flashLightTargetSpeed) {
motorStatus = MotorStatus_RampUp;
} else if (pwm > flashLightTargetSpeed) {
motorStatus = MotorStatus_RampDown;
}
}
static void rpc_flashLightSetSpeed(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
mbuf_init(&fb, 100);
int speed = 0;
if (json_scanf(args.p, args.len, ri->args_fmt, &speed) == 1) {
printf("FlashLight set speed to %d\n", speed);
json_printf(&out, "{result: 0, resultString: %Q, speed: %d}", "OK", speed);
flashLightSetSpeed(speed);
} else {
json_printf(&out, "{error: %Q}", "speed is required");
}
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
recalcTimings();
(void) cb_arg;
(void) fi;
(void) args;
}
static void flashLightSetRampupTime(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
mbuf_init(&fb, 100);
uint16_t rampUpTime_msec = 0;
if (json_scanf(args.p, args.len, ri->args_fmt, &rampUpTime_msec) == 1) {
motorRampUpTime_msec = rampUpTime_msec;
printf("FlashLight set motor ramp up time to %d\n", rampUpTime_msec);
json_printf(&out, "{result: 0, resultString: %Q, rampUpTime_ms: %d}", "OK", rampUpTime_msec);
} else {
json_printf(&out, "{error: %Q}", "rampUpTime_msec is required");
}
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
recalcTimings();
(void) cb_arg;
(void) fi;
(void) args;
}
static void flashLightSetRampdownTime(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
mbuf_init(&fb, 100);
uint16_t rampDownTime_msec = 0;
if (json_scanf(args.p, args.len, ri->args_fmt, &rampDownTime_msec) == 1) {
motorRampDownTime_msec = rampDownTime_msec;
printf("FlashLight set motor ramp up time to %d\n", rampDownTime_msec);
json_printf(&out, "{result: 0, resultString: %Q, rampDownTime_ms: %d}", "OK", rampDownTime_msec);
} else {
json_printf(&out, "{error: %Q}", "rampDownTime_msec is required");
}
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
recalcTimings();
(void) cb_arg;
(void) fi;
(void) args;
}
static void flashLightSetMotorUpdateTime(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
mbuf_init(&fb, 100);
uint16_t updateTime = 0;
if (json_scanf(args.p, args.len, ri->args_fmt, &updateTime) == 1) {
motorUpdateTime_msec = updateTime;
printf("FlashLight set updateTime_msec tp %d\n", updateTime);
json_printf(&out, "{result: 0, resultString: %Q, udateTime_ms: %d}", "OK", updateTime);
} else {
json_printf(&out, "{error: %Q}", "motorUpdateTime_msec is required");
}
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
recalcTimings();
(void) cb_arg;
(void) fi;
(void) args;
}
static void flashLightGetSettings(struct mg_rpc_request_info *ri, void *cb_arg,
struct mg_rpc_frame_info *fi, struct mg_str args) {
struct mbuf fb;
struct json_out out = JSON_OUT_MBUF(&fb);
mbuf_init(&fb, 1024);
json_printf(&out, "{pwm: %f, speed: %f, rampupTime_ms: %d, rampdownTime_ms: %d, updateTime_ms: %d, rampupDeltaSpeed: %f, rampdownDeltaSpeed: %f, motorDirection: %d, clientId: %Q, commandTopic: %Q, statusTopic: %Q, mqttConnected: %Q, motorStatus: %d}",
pwm, flashLightSpeed, motorRampUpTime_msec, motorRampDownTime_msec, motorUpdateTime_msec, flashLightRampUp_deltaSpeed, flashLightRampDown_deltaSpeed,
motorDirection, clientId, commandTopic, pubStatusTopic, mqttConnected ? "true" : "false", motorStatus);
mg_rpc_send_responsef(ri, "%.*s", fb.len, fb.buf);
ri = NULL;
mbuf_free(&fb);
(void) cb_arg;
(void) fi;
(void) args;
}
void net_changed(int ev, void *evd, void *arg) {
if (ev != MGOS_NET_EV_IP_ACQUIRED) return;
// call_peer();
(void) evd;
(void) arg;
}
static void mqttCommandHandler(struct mg_connection *c, const char *topic, int topic_len,
const char *msg, int msg_len, void *userdata) {
LOG(LL_INFO, ("Got message on topic %.*s", topic_len, topic));
(void) c;
(void) topic;
(void) topic_len;
(void) msg;
(void) msg_len;
(void) userdata;
}
// void onMqttConnection(struct mg_connection *c, const char *client_id, struct mg_send_mqtt_handshake_opts *opts, void *fn_arg) {
void onMqttConnection(struct mg_connection *c, const char *client_id, struct mg_send_mqtt_handshake_opts *opts, void *fn_arg) {
// add MQTT cmd subscription
LOG(LL_INFO, ("onMqttConnection handler called with clientId=%s", client_id));
#if 0
#endif
mgos_mqtt_sub(commandTopic, mqttCommandHandler, NULL);
mqttConnected = true;
(void) c;
(void) client_id;
(void) opts;
(void) fn_arg;
}
enum mgos_app_init_result mgos_app_init(void) {
struct mg_rpc *c = mgos_rpc_get_global();
mg_rpc_add_handler(c, "FlashLight.On", NULL, rpc_flashLightOn, NULL);
mg_rpc_add_handler(c, "FlashLight.Off", NULL, rpc_flashLightOff, NULL);
mg_rpc_add_handler(c, "FlashLight.Speed", "{speed: %d}", rpc_flashLightSetSpeed, NULL);
mg_rpc_add_handler(c, "FlashLight.RampUpTime_msec", "{rampUpTime_ms: %d}", flashLightSetRampupTime, NULL);
mg_rpc_add_handler(c, "FlashLight.RampDownTime_msec", "{rampDownTime_ms: %d}", flashLightSetRampdownTime, NULL);
mg_rpc_add_handler(c, "FlashLight.MotorUpdateTime_msec", "{uptdateTime_ms: %d}", flashLightSetMotorUpdateTime, NULL);
mg_rpc_add_handler(c, "FlashLight.GetSettings", NULL, flashLightGetSettings, NULL);
mgos_event_add_group_handler(MGOS_EVENT_GRP_NET, net_changed, NULL);
// enable crontab
cron_init();
// add MQTT cmd subscription
LOG(LL_INFO, ("Initializing MQTT"));
clientId = mgos_sys_config_get_mqtt_client_id();
clientId = clientId ? clientId : mgos_sys_config_get_device_id();
LOG(LL_INFO, ("clientId=%s", clientId));
LOG(LL_INFO, ("cmdTopic=%s", mgos_sys_config_get_flashLight_mqttCtrlTopic()));
LOG(LL_INFO, ("pubStatusTopic=%s", mgos_sys_config_get_flashLight_mqttStatusTopic()));
c_snprintf(commandTopic, sizeof(commandTopic), mgos_sys_config_get_flashLight_mqttCtrlTopic(), clientId);
c_snprintf(pubStatusTopic, sizeof(pubStatusTopic), mgos_sys_config_get_flashLight_mqttStatusTopic(), clientId);
LOG(LL_INFO, ("cmdTopic=%s", commandTopic));
LOG(LL_INFO, ("pubStatusTopic=%s", pubStatusTopic));
mgos_mqtt_set_connect_fn(onMqttConnection, NULL);
motorFrequency = mgos_sys_config_get_flashLight_motorFrequency();
LOG(LL_INFO, ("motorFrequency=%d Hz", motorFrequency));
motorAddress = mgos_sys_config_get_flashLight_address();
LOG(LL_INFO, ("motorAddress=%d", motorAddress));
LOG(LL_INFO, ("Initializing motor controller"));
recalcTimings();
wemos_motor_init();
LOG(LL_INFO, ("Initializing motor M1"));
wemos_motor_initMotor(M1, motorAddress, motorFrequency);
LOG(LL_INFO, ("Setting up timer"));
motorUpdateTime_msec = mgos_sys_config_get_flashLight_motorUpdateTime();
mgos_set_timer(motorUpdateTime_msec, MGOS_TIMER_REPEAT, motor_timer_cb, NULL);
LOG(LL_INFO, ("Initialization done"));
return MGOS_APP_INIT_SUCCESS;
}
======================================= */