Mobirise

SnowFlake IoT 
C++ Framework

A new way to program connected and embedded platforms

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. 

Modular and Configurable

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.

Connected

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.

Efficient

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.

Modern C++

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. 

Multithreaded

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++.

Open Source

SnowFlake IoT is fully open-source, royalty-free platform. All our source code is available in GitHub.

Scriptable

Don't want to program your IoT system with C++?
No problem, you can just configure the hardware, and use Javascript-style Chaiscript to program all the business logic you need. You can even upload new scripts to be run via the network.

Portable

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.

Hardware aware

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. 

Examples

1. Define you hardware

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:

{ "name":"myIO", "driver":"IOPin", "params": { "pin":"11", "output":"false", "pullup":"true" } }

2. Get an instance of the pin and use it:
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); });