Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • 17:43
    mikee47 synchronize #2472
  • 17:35
    mikee47 edited #2472
  • 16:00
    mikee47 synchronize #2472
  • 14:45
    mikee47 synchronize #2472
  • 14:27
    mikee47 synchronize #2472
  • Jan 24 10:02
    slaff labeled #2472
  • Jan 24 10:02
    slaff milestoned #2472
  • Jan 24 09:32
    mikee47 opened #2472
  • Jan 24 09:08
    slaff unlabeled #2471
  • Jan 24 09:08
    slaff closed #2471
  • Jan 24 09:03
    slaff labeled #2471
  • Jan 24 09:03
    slaff milestoned #2471
  • Jan 21 16:10
    mikee47 synchronize #2471
  • Jan 21 16:03
    mikee47 synchronize #2471
  • Jan 21 16:02
    mikee47 opened #2471
  • Jan 21 14:55
    slaff unlabeled #2470
  • Jan 21 14:55
    slaff closed #2470
  • Jan 21 09:03
    slaff unlabeled #2470
  • Jan 21 09:03
    slaff labeled #2470
  • Jan 20 16:39
    mikee47 synchronize #2470
Mike
@mikee47
Just imagine what the ESP32 could do with the brakes off :-)
vesley
@vesley
O yeah :). Is the Sming code for the ESP8266 compatible with the ESP32? Is it enough just to change the host and flash the ESP32?
Mike
@mikee47
It's work in progress but the Basic_IFS sample will run on it.
Mike
@mikee47
Just checked: For the ESP32 you'll need to reduce the app. partition to 960K. (Edit basic_ifs.hw and insert "factory": { "size": "960K" }, into partitions.
slaff
@slaff

Is it enough just to change the host and flash the ESP32?

@vesley This is the final goal. You should compile change only the architecture using SMING_ARCH=Esp32 instead of SMING_ARCH=Esp8266 or Host

Mateusz Zakarczemny
@Matzz

Hi @slaff @mikee47 ,
In AP and Station classes there is a guard before running setIP code which protects us from setting IP outside of init method. Is that needed?
https://github.com/SmingHub/Sming/blob/develop/Sming/Components/Network/Arch/Esp8266/Platform/AccessPointImpl.cpp#L130
https://github.com/SmingHub/Sming/blob/develop/Sming/Components/Network/Arch/Esp8266/Platform/StationImpl.cpp#L203

I did not found any requirement for that in
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf Page 68
or https://www.mikrocontroller.net/attachment/263828/The-ESP8266-Book-August-2015.pdf Page 157

From the other hand there is a note in wifi_get_ip_info to not call it in user_init. But nothing about wifi_set_ip_info

Mike
@mikee47
@Matzz I think you're correct. There's an example in the SDK reference for wifi_softap_set_dhcps_lease (page 65) which actually calls wifi_set_ip_info in user_init(). What happens if you remove the guard? Does anything break? Note: This guard has been present since the original Sming commit!
Mateusz Zakarczemny
@Matzz
Hi,
I'm trying to upgrade my firmware using OTA + sming otaserver. However, while upgrading I'm getting following errors:
0x402593fa: std::function<void (Ssl::Session&, HttpRequest&)>::~function() at /opt/esp-quick-toolchain/xtensa-lx106-elf/xtensa-lx106-elf/include/c++/10.2.0/bits/std_function.h:303
 (inlined by) Delegate<void (Ssl::Session&, HttpRequest&)>::~Delegate() at /data/Sming/Sming/Core/Delegate.h:25
 (inlined by) HttpRequest::~HttpRequest() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpRequest.h:78
0x4025effc: HttpClientConnection::~HttpClientConnection() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpClientConnection.h:41 (discriminator 1)
0x4025f02c: HttpClientConnection::~HttpClientConnection() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpClientConnection.h:43
0x4025e33b: String::~String() at /data/Sming/Sming/Wiring/WString.h:207
 (inlined by) ObjectMap<String, HttpClientConnection>::Entry::~Entry() at /data/Sming/Sming/Core/Data/ObjectMap.h:333
0x4025e3a7: Vector<ObjectMap<String, HttpClientConnection>::Entry>::removeElementAt(unsigned int) at /data/Sming/Sming/Wiring/WVector.h:425
 (inlined by) Vector<ObjectMap<String, HttpClientConnection>::Entry>::remove(unsigned int) at /data/Sming/Sming/Wiring/WVector.h:394
 (inlined by) ObjectMap<String, HttpClientConnection>::removeAt(unsigned int) at /data/Sming/Sming/Core/Data/ObjectMap.h:262
 (inlined by) HttpClient::cleanInactive() at /data/Sming/Sming/Components/Network/src/Network/HttpClient.cpp:77
0x40215434: ets_timer_handler_isr at ??:?
0x40215441: ets_timer_handler_isr at ??:?
0x40215486: ets_timer_handler_isr at ??:?
0x40000f65: ?? ??:0
0x40000f49: ?? ??:0
0x40000f49: ?? ??:0


================================================================

And then

================================================================
0x40255849: HttpRequest::reset() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpRequest.cpp:62 (discriminator 1)
0x402593fa: std::function<void (Ssl::Session&, HttpRequest&)>::~function() at /opt/esp-quick-toolchain/xtensa-lx106-elf/xtensa-lx106-elf/include/c++/10.2.0/bits/std_function.h:303
 (inlined by) Delegate<void (Ssl::Session&, HttpRequest&)>::~Delegate() at /data/Sming/Sming/Core/Delegate.h:25
 (inlined by) HttpRequest::~HttpRequest() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpRequest.h:78
0x4020b38f: scan_parse_beacon at ??:?
0x4020b3fb: scan_parse_beacon at ??:?
0x4000050c: ?? ??:0
0x402074b5: ieee80211_parse_beacon at ??:?
0x40100ff3: ets_timer_arm_new at ??:?
0x40100ead: ets_timer_disarm at ??:?
0x4000050c: ?? ??:0
0x402470b0: String::invalidate() at /data/Sming/Sming/Wiring/WString.cpp:161
0x40000f68: ?? ??:0
0x40247623: String::operator=(char const*) at /data/Sming/Sming/Wiring/WString.cpp:352
0x40235442: mc_malloc at /data/Sming/Sming/Components/malloc_count/malloc_count.cpp:232
0x40259934: HttpConnection::resetHeaders() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpConnection.cpp:69
0x402593fa: std::function<void (Ssl::Session&, HttpRequest&)>::~function() at /opt/esp-quick-toolchain/xtensa-lx106-elf/xtensa-lx106-elf/include/c++/10.2.0/bits/std_function.h:303
 (inlined by) Delegate<void (Ssl::Session&, HttpRequest&)>::~Delegate() at /data/Sming/Sming/Core/Delegate.h:25
 (inlined by) HttpRequest::~HttpRequest() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpRequest.h:78
0x4025effc: HttpClientConnection::~HttpClientConnection() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpClientConnection.h:41 (discriminator 1)
0x4025f02c: HttpClientConnection::~HttpClientConnection() at /data/Sming/Sming/Components/Network/src/Network/Http/HttpClientConnection.h:43
0x4025e33b: String::~String() at /data/Sming/Sming/Wiring/WString.h:207
 (inlined by) ObjectMap<String, HttpClientConnection>::Entry::~Entry() at /data/Sming/Sming/Core/Data/ObjectMap.h:333
0x4025e3a7: Vector<ObjectMap<String, HttpClientConnection>::Entry>::removeElementAt(unsigned int) at /data/Sming/Sming/Wiring/WVector.h:425
 (inlined by) Vector<ObjectMap<String, HttpClientConnection>::Entry>::remove(unsigned int) at /data/Sming/Sming/Wiring/WVector.h:394
 (inlined by) ObjectMap<String, HttpClientConnection>::removeAt(unsigned int) at /data/Sming/Sming/Core/Data/ObjectMap.h:262
 (inlined by) HttpClient::cleanInactive() at /data/Sming/Sming/Components/Network/src/Network/HttpClient.cpp:77
0x40215434: ets_timer_handler_isr at ??:?
0x40215441: ets_timer_handler_isr at ??:?
0x40215486: ets_timer_handler_isr at ??:?
0x40000f65: ?? ??:0
0x40000f49: ?? ??:0
0x40000f49: ?? ??:0

My OTA upgrader code is here - https://github.com/Matzz/Wifire/blob/master/app/Services/OtaUpdater.cpp
Could I ask for help? Is that wachdog interrupt or sth else?

slaff
@slaff
@Matzz Try the following - compile your application for Host make SMING_ARCH=Host DEBUG_VERBOSE_LEVEL=3 ENABLE_GDB=1. After that enable the networking: https://sming.readthedocs.io/en/latest/arch/host/index.html?highlight=setup-network-linux.sh#networking and run the application: make flash run. You should get a segfault at some point. If you run the same application with valgrind: make valgrind you will get more hints what is the problem and running the application under the debugger https://sming.readthedocs.io/en/latest/arch/host/debugging/index.html will point you exactly where is that happening.
Mateusz Zakarczemny
@Matzz
@slaff Thank you. The main problem was that I tried to delete ota updater after start() method. However, its still not working. After calling start() chip is not doing anything related to update (but its still operational). Does OTA update suppose to work on Host arch? I just trying to figure out where it will be easier to debug.
Mateusz Zakarczemny
@Matzz
After enabling debug on Sming framework level I get:
Updating...
52180257 Download file:
    (0) http://192.168.1.15:9999/rom1.bin -> 108000
52181242 Creating new HttpClientConnection
52181633 HCC::connect: TCP state: -1, isStarted: 0, isActive: 0
52185898 HCC::connect: connecting ...
52189412 TCP 3fff1300 +connection
52192317 TCP 3fff1300 connect to "192.168.1.15:9999"
52198223 TCP connect result: 0
52199810 Download file:
    (0) http://192.168.1.15:9999/spiff_rom.bin -> 300000
52207548 HCC::connect: TCP state: 2, isStarted: 1, isActive: 1
pm open,type:2 0
58684127 TCP 3fff1300 connection error: -8
112181566 Total connections: 1
112181933 Removing stale connection: State: 4, Active: 0, Finished: 0
112182519 TCP 3fff1300 ~connection
172181562 Total connections: 0
232181554 Total connections: 0
slaff
@slaff
@/all Guys, check out the latest addition in Sming: Asynchronous Graphics Library #2357
from @mikee47 ! It is a great way to start adding graphical interface to your Sming applications.It comes also with Async SPI operations and a lot of other improvements.
kmihaylov
@kmihaylov
Hello. With the latest develop branch I'm trying to build Basic_Blink, w/o luck and with the following error:
Copying generated SDK libraries
touch /home/opt/Sming/Sming/out/Esp32/debug/build/esp32/sdk/.complete
/opt/Sming/Sming/Arch/Esp32/Components/esp32/src/startup.cpp:13:10: fatal error: esp_netif.h: No such file or directory
 #include <esp_netif.h>
          ^~~~~~~~~~~~~
slaff
@slaff
I have tried to compile Basic_Blinc for ESP32 a minute ago and all was fine. I guess your ESP-IDF variables need to be set correctly.
Paste here the output from: echo $IDF_PATH and env
kmihaylov
@kmihaylov

@slaff I did a fresh install and now I successfully compile the Basic_Blink example. I did the following:

rm -rf /opt/esp32
rm -rf /opt/esp-idf

With fresh develop branch I ran the install.sh script.

kmihaylov
@kmihaylov
What is the status of SPI with Esp32?
kmihaylov
@kmihaylov
OK I just made it with the standard SPIClass with the SpiPins struct and it works. :)
kmihaylov
@kmihaylov

Hello. I'm using SPI with two ICs. With each of them I do different beginTransaction (they use different SPI modes). In my app I use Serial.systemDebugOutput(true) and my config variable is DEBUG_VERBOSE_LEVEL = 1.

However my app rapidly switches between the two ICs and my debug output is full of Sming/Arch/Esp32/Core/SPI.cpp's

debug_i("[SPI] APB freq = %u, pre = %u, div = %u, target freq = %u, actual = %u", apbFreq, prediv.prescale,
            prediv.divisor, speed.frequency, prediv.freq);

Do I misunderstand how DEBUG_VERBOSE_LEVEL is used (in combination with Serial.setDebugOutput() or there is some other reason that debug_i() is always printed?

Mike
@mikee47
By default, libraries don't get recompiled when DEBUG_VERBOSE_LEVEL changes (to provide a little more control over behaviour). Try make Sming-build all
kmihaylov
@kmihaylov

@mikee47 thanks, I supposed it works the way you told me, but I thought that with some magic it obeys the project's variables.

Wondering if I can change the global SPI instance default pins. I play with ESP32-WROVER and there's some mismatch with the default pins in SPIClass::BusInfo.

If I create another instance, it works well, but for compliance with some external libraries I would like to preserve the use of the global "SPI" object so I wouldn't modify the library to pass a reference to a custom SPI object.

Mike
@mikee47
@kmihaylov I've created a PR #2360, so you should be able to call SPI.setup() to achieve what you need.
kmihaylov
@kmihaylov
Thank you, I'll give it a try.
kmihaylov
@kmihaylov

Hello. With ESP32 I use sensor_vp, sensor_vn and other input only pins. I do not have any issues with these pins, however some error messages are printed on the Serial output:

entry 0x40080618
E (506) gpio: gpio_set_level(215): GPIO output gpio_num error
E (636) gpio: gpio_set_level(215): GPIO output gpio_num error
E (636) gpio: gpio_set_level(215): GPIO output gpio_num error

I also did

    gpio_config_t config;
    config.pin_bit_mask = (1ULL << encoderLeft);
    config.mode = GPIO_MODE_INPUT;
    config.pull_up_en = GPIO_PULLUP_DISABLE;
    config.pull_down_en = GPIO_PULLDOWN_DISABLE;
    config.intr_type = GPIO_INTR_NEGEDGE;
    gpio_config(&config);

which has the same effect.

Mike
@mikee47
Can you be more explicit? Are you calling pinMode, analogRead, etc...
slaff
@slaff
@/all we will release at the end of the month Sming v4.4. Help us find bugs by testing the latest develop version on your devices and report any issues. You can read more about the new features from here: SmingHub/Sming#2298
slaff
@slaff
@/all we have a new release 4.4.0 - https://github.com/SmingHub/Sming/releases/tag/4.4.0 Enjoy.

This release is code-named "M32". Where "M" and "32" stand for high-quality contributions and improved ESP32 support.
Thanks to @mikee47's and his fantastic work.

Some of the highlights in this release:

  • Improved ESP32 support with support for different ESP32 variants.
  • Moved from IDF v.4.1 to IDF v.4.3.
  • Asynchronous Graphics Library.
  • Support for LittleFS.
  • Sming Host Emulator: Enabled Host access to physical COM ports.
  • Sming Host Emulator: allows running the main logic in the Host emulator while running parts of the hardware dependent code directly on a real micro-controller

And a lot more.

vesley
@vesley
Hello @mikee47, could you please explain how the SectionTemplate is working? How has a template to look like? How to replace content in the template with dynamic content? I looked into the Basic_IFS example, but this one is using IFS as file system. How can I use the SectionTemplate with SPIFFS? I'm testing on a WeMos D1 mini. Thanks in advance.
Mike
@mikee47

Hi @vesley.

IFS is a virtual filesystem and the initFileSystem() function demonstrates mounting a SPIFFS volume in a spiffs subdirectory, with a LittleLFS volume in littlefs. It uses a read-only FWFS root filesystem so that critical files are protected from corruption.

To mount a simple SPIFFS volume requires just a spiffs_mount() call. In the sample, edit the fstest() function and comment out initFileSystem();, uncomment spiffs_mount();

If you want to create a default filesystem image, place the files in a project directory (e.g. 'files') and run make SPIFF_FILES=files. This will get written to your device with a make flash. You can flash it separately with make flashpart PART=spiffs0.

The SectionTemplate is currently lacking proper documentation but here's a brief explanation.
The IFS::DirectoryTemplate class inherits from SectionTemplate and provides the data source for the output. It does this by implementing the nextRecord and getValue methods.

The Basic_IFS sample uses one of three template files depending on the requesteed listing format.
If you take a look in resource/listing.html you'll find three separate sections, marked {SECTION} {/SECTION}.
These are indexed starting at #0 and DirectoryTemplate expects this to contain the page header, section 1 the content and 2 the footer.

The nextRecord method is called before a new content record is about to be output. Here's the annotated DirectoryTemplate implementation:

// Return true if we have a new valid record, false if not
bool nextRecord() override
{
    // Content section we fetch the next directory record, if there is one
    if(sectionIndex() == 1) {
        return directory->next();
    }

    // This code emits the header and footer sections exactly once
    // Returning false suppresses their output completely
    return recordIndex() < 0;
}

This sets up the directory information record. The actual directory information is returned from the getValue implementation:

String getValue(const char* name);

Let me know if you have any other questions!

vesley
@vesley
Thanks for the help @mikee47 . It seems that everything that I need is in Sming, I just have to use it :). One more question. I have created a component/library, with some basic web server functionality, which I want to use in several ESP home projects. Is it possible to add the template (listing.html) in the component? So that when I use the component/library it will include the template without the need to add it in every project.
Mike
@mikee47

The Basic_IFS sample uses PROJECT_DIR to qualify file paths,
but for re-usable components useCOMPONENT_PATH instead:

IMPORT_FSTR(listing_html, COMPONENT_PATH "/resource/listing.html")

See https://sming.readthedocs.io/en/latest/_inc/Sming/Components/FlashString/utility.html?highlight=COMPONENT_PATH#c.IMPORT_FSTR_DATA.

vesley
@vesley
COMPONENT_PATH did the trick :).
I found a issue with the html template. In the header section I put a <style> tag with some simple CSS:
image.png
As the curly brackets {} are reserved as markers to replace content in the template, the CSS code is wrongly parsed in the template. The CSS code in the browser looks like this:
<style>td { padding_ 0 10px; }</style>
Mike
@mikee47
You could switch to double braces {{tag}} instead, just requires a call to tmpl->setDoubleBraces(true) but that's actually quite fiddly...
To do that, the {SECTION} and {/SECTION} tags should be left unchanged, but everything else replace { with {{ and } with }}. In addition, double braces do not apply inside conditional expressions so {!ifeq:{!count:1}} gets changed to {{!ifeq:{!count:1}}}.
If I added escaping support, such as \{ would that break HTML?
Mike
@mikee47
@vesley I've thought of a simpler solution and implemented in PR #2400: just add a space after the '{' character.
vesley
@vesley
Thanks @mikee47. As a workaround I added a marker in the template and set the value in the getValue() method. It is working too :).
vesley
@vesley
Hello @mikee47, hello @slaff, I'm trying to implement the file upload in the webserver. In the example HttpServer_FirmwareUpload I found how to setup the webserver to handle multipart/form-data data. But I'm not sure which Stream to use to read and store the file content on the file system. I also could not found how to retrieve the name of the uploaded file. Is it also possible to check the file size before storing the file on the file system, so that I can avoid uploads of bigger files?
slaff
@slaff

But I'm not sure which Stream to use to read and store the file content on the file system.

@vesley You can use FileStream and in the constructor specify the desired name as the first parameter and as flags the following should work: File::CreateNewAlways | File::WriteOnly.

slaff
@slaff

I also could not found ... the name of the uploaded file ... the file size

Not at the moment. But should be doable. The headers of every part in a multipart message are available and could be passed to a checker callback.

Vity
@Vity01
Hi, I would like to run Sming with CLion, but the documentation is not useful much especially for a beginner
https://sming.readthedocs.io/en/stable/tools/clion.html?highlight=clion
  • where are the Makefiles for copy&paste located?
  • where is the CMakeLists.txt located?
    Can somebody help please?
Mike
@mikee47
Hi @Vity01 unfortunately that information is totally out of date! The build is driven via makeso if it's possible to set up an external make project with CLion that's the way to go.
Vity
@Vity01
@mikee47 ok, thanks for the info
Mike
@mikee47
To get intelliense (or whatever the equivalent for CLion is) will require setting up a list of the correct #include paths. For vscode we have a tool to handle that (run make ide-vscode from a sample project directory and have a look in .vscode/c_cpp_properties.json. Something similar could be done for CLion perhaps?
Vity
@Vity01
I don't know , I am a Java developer so the CLion is more acceptable for me than Eclipse IDE which is very unfriendly to anyone :-)
Mike
@mikee47
I use vscode, very nice.
Vity
@Vity01
hmms, maybe I will give it a try