- Software Timers
- pulseIn(pin, value) now available for all devices.
- WiFi.dnsServerIP() and WiFi.dhcpServerIP()
- serialEvent()
- GCC virtual device
- System.version() to retrieve the version of system firmware #688
- Firmware control of OTA updates can happen #375
- [multithreading] Application thread continues to run in listening mode
- [multithreading]
Particle.process()
called from the application thread pumps application messages #659 Particle.variable()
supportsString
s #657- Simplified Particle.variable() API - variable type parameter is optional, and variables are passed by reference so
&
's are not required. - I2C will generate STOP and SW Reset immediately if Slave Acknowledge failure is detected (must use pull-up resistors), instead of taking 100ms. commit
- TCPClient unstable #672
- Photon frequently SOS's immediately following cloud re-connect #663
String.toLower()
has no affect on string. #665- SOS due to WICED socket handlers being called when socket is disposed. #663 #672
- Application constructors executed after RTOS startup so that HAL_Delay_Milliseconds() can be called. This may mean that
STARTUP()
code executes just a little later than before, but can safely use all public APIs. - Ensure bootloader region is write protected.
- White breathing LED on exiting listening mode. #682
- WICED not resolving DNS names with 4 parts (it was trying to decode as an IP address.)
- SoftAP via HTTP would fail on Safari due to request sent as multiple TCP packets. Fixed WICED HTTP server. #680
- Retained variables are not persisting, even without reset or deep sleep. #661
- Backup RAM enabled for monolithic builds #667
- Pure virtual call on creation of low priority std::thread #652
- [photon] separate System Thread
- [core] Hooks to support FreeRTOS (optional library)
- Variables stored in Backup RAM
- printf/printlnf on
Print
classes -Serial
,Serial1
,TCP
,UDP
String.format
for printf-style formatting of to asString
.- Wire.end() to release the I2C pins. #597
- Wire.reset() to reset the I2C bus. Thanks @pomplesiegel #598
- System.ticks() to retrieve the current MCU cycle counter for precise timing.
- System.enterSafeMode() to restart the device in safe mode.
- [photon]
WiFi.selectAntenna()
setting is persistent, so the last selected antenna is used when the device is in safe mode. [#618] - Detect when the cloud hasn't been serviced for 15s and disconnect, so device LED state accurately reflects the connection state when the application loop has stalled. #626
- Compile-time checks for
Particle.variable()
#619 - [photon] Increased retry count when connecting to WiFi. #620
- Setup button events #611
UDP.receivePacket()
would fail ifUDP.setBuffer()
hadn't been called first. Thanks @r2jitu.- [photon] Default SS pin for SPI1 now set to D5. #623
- [photon] Long delay entering listening mode. #566
- [photon] Solid green LED when WiFi network cannot be connected to due to invalid key. (The LED now blinks.)
- [photon] Storing more than 2 Wi-Fi credentials would sometimes give unpredictable results.
- [photon] TX/RX pins did not work after entering listening mode. #632
- [photon] Improvements to I2C for MCP23017 / Adafruit RGBLCDShield. #626
SPI.setClockDividerReference
,SPI.setClockSpeed
to set clock speed in a more portable manner. #454WiFi.scan
function to retrieve details of local access points. #567UDP.sendPacket
/UDP.receivePacket
to send/receive a packet directly to an application-supplied buffer. #452- Static IP Support [photon] - #451
- [photon] UDP multicast support via
UDP.joinMulticast
/UDP.leaveMulticast
. Many thanks @stevie67! waitFor(WiFi.ready)
syntax to make it easier to wait for system events. #415- Flexible time output with
Time.format()
#572
- Recipes and Tips section in the build documentation.
Particle.function
,Particle.subscribe
andattachInterrupt
can take a C++ method and instance pointer. #534 Thanks to @monkbroc!UDP.setBuffer
to set the buffer a UDP instance uses forread
/write
. #224 and #452WiFi.setCredentials()
can take a Cipher type to allow full specification of an AP's credentials. #574- TCPClient (from TCPServer) reports remote IP address. #551
- Configurable format in
Time.timeStr()
, including ISO 8601. #455 Servo.trim(adjust)
to allow small adjustments to the stationary point. #120- Time set from the cloud accounts for network latency. #581
String(Printable)
constructor so anyPrintable
can be converted to a string. example- Fluent API on
String
- many methods return*this
so method calls can be chained. - Small values passed to
delay(1)
result in more accurate delays. #260 - Bootloader does not show factory reset modes if a factory reset image is not available. #557
- Listening mode re-enters listening mode after credentials are given. #558
- String function dtoa() has problems with larger numbers. #563
- System doesn't set color of RGB LED when
RGB.control(true)
is called. #362, #472 and #544 - WiFi.SSID() may not return previous network when switching. #560
- [photon] System.sleep(5) not turning Wi-Fi back on after 5 seconds. #480
- regression: floating point support in sprintf not compiled in. #576
- [photon] SPI1 default clock speed was 7.5MHz, changed to 15MHz, same as for
SPI
. - TCPClient::connected() doesn't detect when the socket is closed #542
- dfu-util: error during downlod get_status msg removed when using :leave option #599
- [Core] A0 could not be used as an output #595
- Reinstate CFOD handling on the Photon.
- logging output documentation
- pressing 'v' in SoftAP mode displays the system version. FIRM-128
- P1: API (compatible with Core) to access the 1MByte external flash. #498
- Arduino compatibility macros for PROGMEM and more.
RGB.onChange
handler receives notification of the current LED color when it changes. Can be used to match an external LED to the onboard led. #518 Thanks to @monkbroc!- Serial2 available on P1 and Photon (note: this also requires above RGB.onChange handler and two resistors would need to be removed on the Photon)
Spark.connected()
et al. is nowParticle.connected()
. The formerSpark
library is still available but is deprecated.System.freeMemory()
API to determine the amount of available RAM.STARTUP()
macro to define blocks of code that execute at startup.
- Retrieve the LED brightness via
RGB.brightness()
- More prominent color change on the RGB LED when there is a cloud connection error.
- System.sleep() - 2nd parameter changed to
InterruptMode
from uint16_t to ensure the correct types are used. #499 - Less aggressive exponential backoff when the re-establishing the cloud connection. [FIRM-177]
- I2C Wire.endTransmission() returns unique values and I2C docs updated
- Generate I2C STOP after slave addr NACK, I2C software reset all timeouts - commit
- Improved I2C Master receive method and implemented error handler - commit - commit
WiFi.selectAntenna()
default antenna is now INTERNAL. Can be called at startup (before WiFi is initialized to select the desired antenna.
- [Regression] System connects WiFi when Spark.connect() is called after WiFi.on() #484
- Debug build now working.
- PWM issue fixed - 500Hz output on all channels #492
- Tone issue fixed on D2,D3,RX,TX #483
- SOS when registering more than 2 subscription handlers, and allow 4 subscription handlers to be successfully registered. #531
- SOS on TCPClient.connect() when DNS resolution failed or when connection fails #490
TCPClient::stop()
does not work on first connection #536TCPClient::connect()
does not close an existing socket. #538- TX/RX PWM randomly inverted #545
- UDP.begin/write return values #552
- Half-duplex mode on Serial1 via
Serial1.halfdupliex()
. Thanks to @prices. WiFi.connect(WIFI_CONNECT_SKIP_LISTEN)
allows application firmware to skip listen mode when there is no credentials.- System events
- I2C methods now use
micros()
for timeouts rather thanmillis()
, so I2C functions can be used in an interrupt handler. #460 WiFi.listen(false)
to programmatically exit WiFi listening mode.- make is verbose by default. To silence, add
-s
to the command line. WiFi.connect(WIFI_CONNECT_SKIP_LISTEN)
starts connection but does not enter listening mode if no credentials are found.- Setup/Mode button now starts listening mode when WiFi is off.
WiFi.listen(false)
can be used to exit listening mode (from an interrupt.)- LED flashes high-speed green when requesting an IP address via DHCP.
- [Photon/TCPServer] -
TCPClient.connected()
was not returningfalse
when the socket was asynchronously disconnected. - Fix time being reset on wakeup. (removed WICED RTC init code that resets to default preset time in platform_mcu_powersave_init() within photon-wiced repo.) #440
TCPClient.connected()
was not returningfalse
when the socket was disconnected from the other end.strdup()
was returning garbage #457attachInterrupt()
should work on all interrupt pins now except D0 & A5. Please note there are shared lines as per the following issue comment : [#443] (https://github.com/spark/firmware/issues/443#issuecomment-114389744)- I2C bus lockup when no slave devices are present by issuing a STOP condition after sLave send address fails.
spark/
events not propagated to application handlers. #481sprintf
calls not linking correctly. #471- Photon/P1 sometimes did not start without hitting reset after a cold boot.
- Disable LTO compile for user firmware since it causes linking problems (see
sprintf
above.)
- EEPROM storage of custom data types via
EEPROM.put()
and `EEPROM.get()' - When the device is in safe mode, the LED breathes magenta
attachSystemInterrupt()
allows hooking key system interrupts in user code.- DMA-driven SPI master
UDP.sendPacket()
method avoids buffering data when the user can supply the entire buffer at once.- [Photon] SoftAP setup can be done over HTTP
- platform-neutral fast pin access 449
- [P1] Serial2 support
- [Photon] The system firmware updates the bootloader to latest version
- [Photon] The system write protects the bootloader region.
- UDP uses dynamically allocated buffers
PRODUCT_ID
andPRODUCT_VERSION
place these details at a known place in the firmware image- DFU mode and serial firmware update can be triggered by setting the line rate.
Serial1.end()
hangs the system- Malformed CoAP acknowledgement message in cloud protocol.
SPARK_WLAN_Loop()
was not linked. (Workaround was to useSpark.process()
)- UDP doesn't send anything to the device until
UDP.write()
#407 - Divide by zero now caught and causes a SOS.
- Floating-point support for
sprintf()
reinstated - Fixed WICED DCT becoming unmodifiable
- Fix UDP.parsePacket() not receiving any data on the Photon #468
- Signed Photon USB Driver for use with Windows 8.1
Spark.syncTime()
was not linked. #426- Wire.setSpeed(CLOCK_SPEED_100KHZ) was not linked. #432
- WiFi.selectAntenna() was not linked.
- PHOTON!!!!
loop()
iteration rate increased by 1000 times - from 200 Hz to over 200 kHz!- Compiler: Removed all warnings from the compile (and made warnings as errors) so compiler output is minimal.
- Debugging: SWD Support, thanks to Elco Jacobs. #337
Spark.publish()
returns a success value - #388Spark.process()
as the public API for running the system loop. #347- Sleep no longer resets (on the Photon) #283
- Support for application code outside of the firmware repo. #374
- MAC Address available in setup via 'm' key. #352
- SoftAP setup on the Photon
Spark.sleep()
changed toSystem.sleep()
and similarly fordeviceID()
#390- Listening mode uses existing serial connection if already opened. #384
Spark.publish("event", PRIVATE)
shorthand - #376- Improved integrity checks for firmware images
- Added additional safe/recovery mode in bootloader (> 6.5 sec : restore factory code without clearing wifi credentials)
- Enabled CRC verification in bootloader before restoring/copying the firmware image from factory reset, ota downloaded area etc.
- Added 'program-serial' to build target to enter serial ymodem protocol for flashing user firmware (Testing pending...)
- Cloud string variables can be re-defined #241
- Removed hard-coded limit on number of functions and variables #111
- Parameterized function callbacks, lambda support for functions #311
- C++ STL headers supported
- Can duplicate the onboard RGB LED color in firmware. #302
WiFi.selectAntenna()
- select between internal (chip) and external (u.FL) antenna on Photon: #394WiFi.resolve()
to look up an IP address from a domain name. #91System.dfu()
to reboot the core in dfu mode, until next reset or next DFU update is received.
- SOS calling
Spark.publish()
inSEMI_AUTOMATIC
/MANUAL
mode - Subscriptions maintained when cloud disconnected. #278
- Fix for events with composite names. #382
WiFi.ready()
returning true afterWiFi.off()
in manual mode. #378Serial.peek()
implemented. #387- Mode button not working in semi-automatic or manual mode. #343
Time.timeStr()
had a newline at the end. #336WiFi.RSSI()
caused panic in some cases. #377Spark.publish()
caused SOS when cloud disconnected. #322TCPClient.flush()
discards data in the socket layer also. #416
- Platform: hardware dependencies are factored out from wiring into a hardware abstraction layer
- Repo: all 3 spark repos (core-common-lib, core-communication-lib, core-firmware) are combined into this repo.
- Modularization: factored common-lib into
platform
,services
andhal
modules. - Modularization: factored core-firmware into
wiring
,system
, 'main' anduser
modules. - Modularization: user code compiled as a separate library in the 'user' module
- Build system: fancy new build system - build/readme.md
- Modularization: modules folder containing dynamically linked modules for the Photon
- Local Build: Specify custom toolchain with
GCC_PREFIX
environment variable (firmware, core-common-lib, core-communication-lib)
- Wiring: More efficient and reliable
print(String)
(fix issue #281) #305 - DFU: Add DFU suffix to .bin file #323
- I2C: Use I2C polling mode by default #322
- Listening Mode: Fix hard fault when Wi-Fi is off #320
- LED Interaction: Fix breathing blue that should be blinking green #315
- Cloud: Secure random seed. When the spark does a handshake with the cloud, it receives a random number that is set as a seed for
rand()
- Wiring: Arduino-compatible
random()
andrandomSeed()
functions. #289 - Wiring: Arduino-compatible functions like
isAlpha()
andtoLowerCase()
. #293
- Wire: added missing Slave mode using DMA/Interrupts and updated Master mode using DMA. New APIs
Wire.setSpeed()
andWire.strechClock()
. #284 - Sleep:
Spark.sleep()
supports wakeup on pin change. #265