# ESP-IDF Notecard Component
An ESP-IDF component for integrating Espressif devices with the Blues [Notecard](https://blues.com/products/notecard/).
This component provides a thread-safe interface to the Notecard using the [note-c](https://github.com/blues/note-c) library.
## Installation
```bash
idf.py add-dependency "blues/notecard"
```
## Usage
The component can be used to communicate with the Notecard using I2C or UART.
The GPIO pins can either be set within application code or via `menuconfig`.
### Basic Example
```c
#include "notecard.h"
void app_main(void) {
// Initialize with default I2C configuration
notecard_config_t config = NOTECARD_I2C_CONFIG_DEFAULT();
// or with UART
// notecard_config_t config = NOTECARD_UART_CONFIG_DEFAULT();
ESP_ERROR_CHECK(notecard_init(&config));
// Send a request using note-c API
J *req = NoteNewRequest("hub.set");
JAddStringToObject(req, "product", "com.your-company:your-product");
JAddStringToObject(req, "mode", "continuous");
if (!NoteRequest(req)) {
ESP_LOGE("app", "hub.set failed");
}
}
```
## Configuration
The component can be further configured with `menuconfig`.
```bash
idf.py menuconfig
Component config ---> Notecard Configuration
```
## Thread Safety
The component automatically provides thread-safe access to the Notecard in multi-threaded FreeRTOS applications.
The underlying [note-c](https://github.com/blues/note-c) library protects the Notecard from concurrent access using internal mutexes, so no additional locking is required for normal use.
### I2C Bus Sharing
If you have other I2C peripherals on the same bus as the Notecard, register your I2C mutex with `note-c` using `NoteSetFnI2CMutex()` to minimize the time spent under lock.
For your convenience, we have provided a default implementation of I2C mutex APIs to coordinate access (example shown below):
```c
#include "notecard.h"
// Access your I2C peripherals
notecard_i2c_lock();
i2c_master_transmit(my_peripheral_handle, data, len, timeout);
notecard_i2c_unlock();
```
This ensures the `note-c` won't attempt I2C communication while you're accessing your other peripherals.
In order to enable/disable the provided I2C bus mutex (e.g. when using your own mutex), use `menuconfig`:
```
Component config ---> Notecard Configuration ---> Default I2C Configuration ---> [ ] Enable I2C mutex
```
> Note: The I2C mutex is enabled by default.
## Examples
For examples, see the [examples](examples) directory.
Examples are designed to run on:
- [Adafruit ESP32 Feather V2](https://learn.adafruit.com/adafruit-esp32-feather-v2?view=all)
- [Notecard](https://blues.com/products/notecard/)
- [Notecarrier F](https://blues.com/products/notecarrier/notecarrier-f/)
If you wish to use a different ESP32 board (or different ESP32 chip), you will need to adjust the GPIO pins used for the Notecard.
See the [Kconfig](Kconfig) file for the default I2C and UART GPIO pins.
## Documentation
For more information, visit [Blues Developer Documentation](https://dev.blues.io/).
e5ede35b47b5f859c53cf97f0f48c1f2df8127f8
idf.py add-dependency "blues/notecard^0.2.2"