2022-01-26 04:24:06 -05:00
|
|
|
|
|
|
|
[![Arduino CI](https://github.com/RobTillaart/FLETCHER/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
|
|
|
|
[![Arduino-lint](https://github.com/RobTillaart/FLETCHER/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/FLETCHER/actions/workflows/arduino-lint.yml)
|
|
|
|
[![JSON check](https://github.com/RobTillaart/FLETCHER/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/FLETCHER/actions/workflows/jsoncheck.yml)
|
|
|
|
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/FLETCHER/blob/master/LICENSE)
|
|
|
|
[![GitHub release](https://img.shields.io/github/release/RobTillaart/FLETCHER.svg?maxAge=3600)](https://github.com/RobTillaart/FLETCHER/releases)
|
|
|
|
|
|
|
|
|
|
|
|
# FLETCHER
|
|
|
|
|
|
|
|
Arduino Library for Fletcher's checksum
|
|
|
|
|
|
|
|
|
|
|
|
## Description
|
|
|
|
|
|
|
|
This library provides a Fletcher checksum of a data array.
|
|
|
|
|
|
|
|
Fletcher's checksum is in general faster than CRC but possibly not as
|
|
|
|
good in detecting errors.
|
|
|
|
See https://en.wikipedia.org/wiki/Fletcher%27s_checksum for details.
|
|
|
|
|
|
|
|
Relates to https://github.com/RobTillaart/CRC
|
|
|
|
|
|
|
|
Use https://github.com/RobTillaart/printHelpers to print the Fletcher64().
|
|
|
|
|
2022-09-08 07:31:39 -04:00
|
|
|
Tested on Arduino UNO + ESP32 + SAMD (See PR #7).
|
2022-01-26 04:24:06 -05:00
|
|
|
|
|
|
|
|
|
|
|
## Interface
|
|
|
|
|
2022-01-27 04:11:25 -05:00
|
|
|
|
|
|
|
## Fletcher16
|
|
|
|
|
|
|
|
These interfaces are very similar for Fletcher16, Fletcher32 and Fletcher64 class.
|
|
|
|
|
|
|
|
Use **\#include "Fletcher16.h"**
|
|
|
|
|
|
|
|
- **Fletcher16()** Constructor, initializes internals.
|
|
|
|
- **void begin(uint8_t s1 = 0, uint8_t s2 = 0)** resets the internals.
|
|
|
|
optional setting start values for s1 and s2. Note this is not part of the standard.
|
|
|
|
- **void add(uint8_t value)** add a single value to the checksum.
|
|
|
|
- **void add(const uint8_t \* array, uint8_t length)** add an array of values to the checksum.
|
|
|
|
- **uint16_t getFletcher()** get the current checksum.
|
|
|
|
- **uint32_t count()** get the number of items added. Merely a debugging feature, can overflow without affecting checksum.
|
|
|
|
|
|
|
|
The checksum from **getFletcher()** can be split into a high and a low part
|
|
|
|
to be used to "feed" **begin()** again. See restart example.
|
|
|
|
|
|
|
|
|
|
|
|
## Interface static functions
|
|
|
|
|
2022-01-26 04:24:06 -05:00
|
|
|
The functions are straightforward, however one should define **length**
|
|
|
|
in terms of the data type and optional pad it with zeros.
|
|
|
|
|
2022-01-26 10:34:57 -05:00
|
|
|
A string "abcdef" has length 2 for **fletcher64()** as it needs 2x4 bytes.
|
2022-01-26 04:24:06 -05:00
|
|
|
|
2022-01-27 04:11:25 -05:00
|
|
|
Use **\#include "Fletcher.h"**
|
|
|
|
|
2022-01-26 10:34:57 -05:00
|
|
|
- **uint16_t fletcher16(uint8_t \*data, uint16_t length)** length in units of 1 byte = 8 bits.
|
|
|
|
- **uint32_t fletcher32(uint16_t \*data, uint16_t length)** length in units of 2 bytes = 16 bits.
|
|
|
|
- **uint64_t fletcher64(uint32_t \*data, uint16_t length)** length in units of 4 bytes = 32 bits.
|
2022-01-26 04:24:06 -05:00
|
|
|
|
2022-01-27 04:11:25 -05:00
|
|
|
|
2022-09-08 07:31:39 -04:00
|
|
|
#### Performance I
|
|
|
|
|
|
|
|
Not tested ESP32 (and many other platforms) yet.
|
|
|
|
First numbers of **.add(value)** measured with test sketch shows the following timing.
|
2022-01-27 04:11:25 -05:00
|
|
|
|
2022-09-08 07:31:39 -04:00
|
|
|
| Checksum | UNO 16 MHz | ESP32 240 MHz |
|
|
|
|
|:------------|:-----------:|:-------------:|
|
|
|
|
| Fletcher16 | 3.8 us | 0.22 us |
|
|
|
|
| Fletcher32 | 5.6 us | 0.23 us |
|
|
|
|
| Fletcher64 | 10.1 us | 0.26 us |
|
|
|
|
| Average | 6.5 us | 0.24 us |
|
|
|
|
|
|
|
|
|
|
|
|
#### Performance II
|
2022-01-27 04:11:25 -05:00
|
|
|
|
|
|
|
Not tested extensively, first numbers of **.add(array, length)**
|
|
|
|
measured with **Fletcher_performance.ino** sketch shows the following timing.
|
|
|
|
|
|
|
|
Lorem Ipsum text = 868 bytes.
|
|
|
|
|
2022-09-08 07:31:39 -04:00
|
|
|
Version 0.1.3.
|
|
|
|
|
2022-04-15 11:36:01 -04:00
|
|
|
| Checksum | UNO 16 MHz | ESP32 240 MHz | Notes |
|
|
|
|
|:------------|:-----------:|:-------------:|:-------------------|
|
|
|
|
| Fletcher16 | 1120 us | 62 us | first run slower ? |
|
|
|
|
| Fletcher32 | 728 us | 33 us | |
|
|
|
|
| Fletcher64 | 1952 us | 35 us | |
|
|
|
|
| Average | 1267 us | 43 us | |
|
|
|
|
| Avg / char | 1.46 us | 0.0495 us | 868 bytes |
|
2022-01-26 04:24:06 -05:00
|
|
|
|
|
|
|
|
2022-09-08 07:31:39 -04:00
|
|
|
Note 0.1.4 has improved the performance. See PR #7 for some numbers.
|
|
|
|
|
|
|
|
|
2022-01-26 04:24:06 -05:00
|
|
|
## Operation
|
|
|
|
|
|
|
|
See examples.
|
|
|
|
|
|
|
|
|
|
|
|
## Future ideas
|
|
|
|
|
2022-11-07 08:21:36 -05:00
|
|
|
#### must
|
2022-01-26 04:24:06 -05:00
|
|
|
- improve documentation
|
2022-09-08 07:31:39 -04:00
|
|
|
- update performance figures.
|
2022-11-07 08:21:36 -05:00
|
|
|
|
|
|
|
#### should
|
2022-01-26 04:24:06 -05:00
|
|
|
- test other platforms
|
2022-11-07 08:21:36 -05:00
|
|
|
- add parameter for start values for F in static functions
|
|
|
|
- would allow to use them in a stream too.
|
|
|
|
|
|
|
|
#### could
|
2022-01-27 04:11:25 -05:00
|
|
|
- others e.g. Fletcher24?
|
2022-01-26 04:24:06 -05:00
|
|
|
- generic FletcherN(). for N = 1..32
|
2022-01-27 04:11:25 -05:00
|
|
|
- add Print interface
|
|
|
|
- or Printable() ?
|
|
|
|
- Stream ??
|
|
|
|
- add getters for S1 and S2 in the classes
|
2022-11-07 08:21:36 -05:00
|
|
|
|
|
|
|
#### wont
|
2022-01-27 04:11:25 -05:00
|
|
|
|
2022-01-26 04:24:06 -05:00
|
|
|
|