Traditionally, embedded systems are either difficult to program, or feature-poor. Not anymore! SnowFlake IoT platform enables developer to leverage modern software development paradigms like multithreading and promises, utilizing enchanced JSON-based hardware and control topology configuration.
Our simple JSON-based configuration system lets you use different sensors and other peripherals without changing a single line on code. Modularity enables simple generation of optimal firmware binaries.
We provide simple interfaces for connecting wirelessly via emerging IPv6 -based protocols like Thread and Bluetooth 5 6loWPAN. Also traditional Bluetooth Smart services can be easily provided and provisioned.
Power saving is a key element for any proper IoT platform. SnowFlake IoT is optimized out-of-the box for power consumption - all our device drivers are readily enabled for minimizing power consumption, thus giving best battery life and efficiency.
Unlike most other platforms, we don't limit our users to use C or a subset of the C++ language. We support full C++17 experience, including threads, exceptions and dynamic memory. We also have other advanced features, like chainable Promises and easy JSON support.
We provide full pre-emptive, multithreaded interface, 100% compatible with native C++ threads in desktop platforms. Our platform includes µOS++ IIIe, a POSIX-like open source multi-tasking real-time framework, written in C++.
SnowFlake IoT is fully open-source, royalty-free platform. All our source code is available in GitHub.
Don't want to program your IoT system with C++?
Although our initial target is in small IoT devices, the same APIs and programming framework can be run on full-sized servers as well. This means you can run your application logic in multitude of POSIX-style environments.
For supported platforms like Nordic nRF52, we provide novel and simple ways to leverage the advanced features of the hardware, like configuring the internal event system for CPU-less operation.
All hardware definitions are made with JSON, and are compiled to C++ during build. For example you can define a named input pin like this:
auto mIO = (sf::IOPin*)sf::p.get(sf::pmap::myIO); auto pinValue = mIO->get();
What this means in practise, is that a map of all peripherals is created in the sf namespace, and is instantiated in special sf::p device repository. sf::pmap consists handy enum for accessing the specific instances with strong typing.
3. What about interrupts? I want to run an event!
Interrupts and other events can be bound easily to simple code by leveraging modern C++'s lambda functionality:
mIO->setEvent(sf::IOPinEvent::IN_Rising,(auto pin, auto pol)
trace_printf("Hi, we got rising edge on pin=%d\!n",pin);