# Atocha SDK — Начало работы

## Что такое Atocha SDK

Atocha SDK — это кросс-компиляционная среда для разработки приложений под устройства
**AQSI Cube** на базе SoC **Allwinner** (ARM Cortex-A7, архитектура `cortexa7t2hf-neon-vfpv4`).

SDK поставляется как Yocto-сгенерированный sysroot и включает:
- кросс-компилятор GCC для ARM (toolchain `arm-poky-linux-gnueabi`);
- заголовки и библиотеки целевой системы (Qt5, Boost, OpenCV, GStreamer, OpenSSL, и др.);
- проприетарные библиотеки AQSI — оборудование платёжного терминала (GPIO, EMV, MSR, HSM);
- скрипт активации окружения (`environment-setup-*`).

Полный список библиотек: [`doc/sdk-libraries.md`](sdk-libraries.md).  
Заголовочные файлы проприетарных библиотек: [`doc/headers/`](headers/).

---

## Структура SDK

```
<sdk-root>/
├── environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi   # скрипт активации
├── sysroots/
│   ├── cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/                 # target sysroot
│   │   ├── usr/include/     # заголовки
│   │   ├── usr/lib/         # библиотеки (.so)
│   │   └── usr/bin/         # утилиты для target (qmake, pkg-config target)
│   └── x86_64-atochasdk-linux/                                      # host sysroot
│       └── usr/bin/         # кросс-компилятор, cmake, ninja
└── doc/                     # документация (этот каталог)
    ├── getting-started.md
    ├── sdk-libraries.md
    └── headers/             # заголовки проприетарных библиотек
```

---

## Активация окружения

Перед сборкой **в каждой новой сессии терминала** нужно активировать окружение:

```bash
source <sdk-root>/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi
```

После этого становятся доступны:
- `$CC`, `$CXX` — кросс-компилятор с нужными флагами;
- `$PKG_CONFIG_PATH`, `$PKG_CONFIG_SYSROOT_DIR` — pkg-config настроен на target sysroot;
- `cmake`, `qmake` — сконфигурированы для кросс-компиляции;
- `$SDKTARGETSYSROOT` — путь к sysroot.

Проверить активацию:

```bash
echo $CC
# arm-poky-linux-gnueabi-gcc -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard ...
arm-poky-linux-gnueabi-gcc --version
```

---

## Флаги компилятора

После активации `$CC` и `$CXX` уже содержат все нужные флаги. Для справки:

| Категория  | Флаги                                                        |
|-----------|--------------------------------------------------------------|
| Архитектура | `-mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7` |
| Безопасность | `-fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security` |
| Оптимизация | `-Os -pipe -g -feliminate-unused-debug-types -fno-omit-frame-pointer` |
| Линковщик  | `-Wl,-O1 --hash-style=gnu --as-needed -z relro -z now`       |

---

## Сборка проекта — CMake

### Минимальный CMakeLists.txt

```cmake
cmake_minimum_required(VERSION 3.16)
project(my_app CXX)
set(CMAKE_CXX_STANDARD 17)

add_executable(my_app main.cpp)
```

### Запуск сборки

```bash
source <sdk-root>/environment-setup-*      # активировать окружение

mkdir build && cd build

cmake .. \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake

cmake --build . -j$(nproc)
```

> `OEToolchainConfig.cmake` автоматически настраивает CMake на кросс-компиляцию.
> Путь к нему задаётся переменной `$OECORE_NATIVE_SYSROOT`, которая появляется
> после активации `environment-setup-*`.

### Пример с Qt5 и проприетарными библиотеками

```cmake
cmake_minimum_required(VERSION 3.16)
project(my_app CXX)
set(CMAKE_CXX_STANDARD 17)

find_package(Qt5 COMPONENTS Core Network DBus REQUIRED)
find_package(Boost COMPONENTS filesystem system thread REQUIRED)

add_executable(my_app main.cpp)

target_link_libraries(my_app
    Qt5::Core
    Qt5::Network
    Qt5::DBus
    Boost::filesystem
    Boost::thread
    hwhelper           # GPIO / TTY
    sdbus-c++          # D-Bus (sdbus-c++)
    aqc_emv_ctls_l1    # EMV бесконтактный L1
    aqc_sec_serv_client # HSM / PIN
)
```

### Поиск библиотек через pkg-config в CMake

```cmake
find_package(PkgConfig REQUIRED)
pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0)
pkg_check_modules(SDBUS REQUIRED sdbus-c++)

target_include_directories(my_app PRIVATE ${GSTREAMER_INCLUDE_DIRS})
target_link_libraries(my_app ${GSTREAMER_LIBRARIES} ${SDBUS_LIBRARIES})
```

---

## Сборка проекта — qmake

```bash
source <sdk-root>/environment-setup-*

mkdir build && cd build
qmake ../my_app.pro
make -j$(nproc)
```

Пример `my_app.pro`:

```qmake
QT += core network dbus serialport

TEMPLATE = app
TARGET   = my_app
CONFIG  += c++17

SOURCES += main.cpp

LIBS += -lhwhelper -lsdbus-c++ -laqc_emv_ctls_l1
```

---

## Сборка одним файлом (без системы сборки)

```bash
source <sdk-root>/environment-setup-*

$CXX -std=c++17 main.cpp \
  -lhwhelper \
  $(pkg-config --cflags --libs Qt5Core Qt5DBus) \
  -lsdbus-c++ \
  -o my_app
```

---

## Деплой и запуск на устройстве

```bash
# Копировать бинарник на устройство
scp my_app vend@<device-ip>:/tmp/

# Запустить
ssh vend@<device-ip> /tmp/my_app

# Или с правами root (если нужен прямой доступ к GPIO)
ssh vend@<device-ip> "sudo /tmp/my_app"
```

> Для работы с GPIO из приложения, запущенного от пользователя без `root`,
> используйте D-Bus сервис `org.hwkeeper` — см. [`sdk-libraries.md`](sdk-libraries.md#3-d-bus).

---

## pkg-config — полезные команды

```bash
# Список доступных библиотек
pkg-config --list-all | sort

# Флаги для конкретной библиотеки
pkg-config --cflags --libs Qt5Core
pkg-config --cflags --libs gstreamer-1.0
pkg-config --cflags --libs sdbus-c++
pkg-config --cflags --libs openssl
pkg-config --cflags --libs libcurl
```

---

## Проверка доступных библиотек

```bash
# Все .so в sysroot
ls $SDKTARGETSYSROOT/usr/lib/*.so | sort

# Заголовки конкретной библиотеки
ls $SDKTARGETSYSROOT/usr/include/aqsi/

# Версия библиотеки
pkg-config --modversion Qt5Core
pkg-config --modversion openssl
```

---

## Типичные проблемы

### "cannot find -lXXX"
Убедитесь, что активировано окружение (`source environment-setup-*`).
Проверьте, что `--sysroot` прописан в `$CC`/`$CXX`.

### "No package 'XXX' found" при pkg-config
```bash
echo $PKG_CONFIG_PATH
# Должен содержать $SDKTARGETSYSROOT/usr/lib/pkgconfig
```

### GPIO: Permission denied
Приложение запущено не от `root` или `vend`. Используйте D-Bus HwKeeper API
(`org.hwkeeper`) вместо прямого вызова `hwhelper`.

### Бинарник не запускается на устройстве
Проверьте, что версия libc на устройстве соответствует sysroot:
```bash
ssh <device> "ldd --version"
$CC -v 2>&1 | grep 'Target:'
```
