### [ На русском ] ↔ [ English ]

- Переменные скетча
- Просмотр переменных
- Установка значений
- Преобразование чисел

## ⇮ПЕРЕМЕННЫЕ СКЕТЧА: РЕГИСТРАЦИЯ

ESPShell предоставляет API для регистрации и управления переменными скетча. Поддерживаются только простые типы C, такие как unsigned/signed int, char, short, float, а также указатели типа void*. Также поддерживаются массивы этих простых типов.

Чтобы переменная стала доступной в ESPShell, её необходимо зарегистрировать.

Для регистрации используется макрос convar_add(). Также существуют специализированные макросы, такие как convar_addp() для указателей и convar_adda() для массивов.

Пример использования в Arduino-скетче: допустим, у нас есть три переменные, которые мы хотим сделать доступными в командной строке shell:

      static int some_variable;
      unsigned char *pointer;
      char array[10];

      void setup() {
        ...
        convar_add(some_variable); ← Регистрация простой переменной
        convar_addp(pointer);      ← Регистрация указателя
        convar_adda(array);        ← Регистрация массива
        ...
      }

Другие доступные макросы: convar_addap(Name) — регистрация массива указателей, convar_addpp(Name) — регистрация указателя на указатель.

## ⇮ПРОСМОТР ПЕРЕМЕННЫХ И ИХ ЗНАЧЕНИЙ

В приведённом выше примере регистрируются три типа переменных: целочисленная, указатель и массив. После регистрации с помощью соответствующих макросов convar_addX(), эти переменные становятся доступными через shell с помощью команд var NAME и show memory ADDRESS.

Если команда var вызывается без аргументов, выводится список всех зарегистрированных переменных:

        esp32#>var
        % Sketch variables:
        % Variable X name | sizeof(X) |     typeof(X)    |     Value
        %-----------------+-----------+------------------+----------------
        %           table |         4 |            int * |       0x3ffbdb88
        %              a4 |         4 |          float * |       0x3ffbdbb4
        %              a3 |         4 |            float |        10.000000
        %              a2 |         4 |     unsigned int |                0
        %              a1 |         1 |    unsigned char |               99
        %              a0 |         4 |              int |              -99
        %     tbl_min_len |         2 |   unsigned short |               16
        %       bypass_qm |         4 |              int |                0
        %       pcnt_unit |         4 |              int |                0
        %    pcnt_channel |         4 |              int |                0
        %ls_show_dir_size |         4 |              int |                1
        esp32#>

Обрати внимание: для указателей и массивов отображается адрес, а не содержимое памяти. Чтобы разыменовать указатель или отобразить содержимое массива, используй var VAR_NAME:

        esp32#>var a4
        % float * a4 = 0x3ffbdbb4;  // Pointer to a 4-byte memory region
        % a4[1] = {
        %    10.000000, // a4[0]
        % };

Другой пример:

        esp32#>var table
        % int * table = 0x3ffbdb88;  // Array of 10 elements (4 bytes each)
        % int table[10] = {
        %    1, // table[0]
        %    2, // table[1]
        %    3, // table[2]
        %    4, // table[3]
        %    5, // table[4]
        %    6, // table[5]
        %    7, // table[6]
        %    8, // table[7]
        %    9, // table[8]
        %    0, // table[9]
        % };

Чтобы обратиться к конкретному элементу массива, укажи индекс, как в языке C:

        esp32#>var table[5]
        % int table[5] = 6;
        esp32#>

Такой синтаксис можно использовать и для указателей. Использование индекса к переменной-указателю означает смещение указателя перед разыменованием. В таком случае ESPShell выводит предупреждение, так как не может определить допустимые границы памяти.

Ещё один пример:

        esp32#>var a1
        % unsigned char a1 = 99;
        esp32#>

## ⇮УСТАНОВКА НОВОГО ЗНАЧЕНИЯ

Чтобы изменить значение переменной, используй команду var VARIABLE_NAME NEW_VALUE. Пример: изменим значение переменной `a1` на 88:

        esp32#>var a1 88
        esp32#>var a1
        % unsigned char a1 = 88;  // use "var 88" see this number in hex, oct, bin etc
        esp32#>

Выполняется базовая проверка типов: нельзя присвоить знаковое значение беззнаковой переменной, или значение с плавающей точкой — целочисленной. Также невозможно изменить адрес массива, так как он фиксируется компоновщиком и не может быть изменён во время выполнения. Впрочем, если выполнить команду по установке значения массива, новое значение установится. Но это лишь для ESPShell: для скетча адрес массива остается неизменным.

## ⇮ПРЕОБРАЗОВАНИЕ ЧИСЕЛ

Команда var также может использоваться для преобразования чисел между системами счисления. Если аргумент команды — число (десятичное, шестнадцатеричное, вещественное, восьмеричное или бинарное), ESPShell отображает таблицу с представлением числа в разных системах счисления, а также выполняет небезопасное C-подобное преобразование памяти. Это полезно для просмотра внутреннего представления отрицательных или вещественных чисел.

Пример:

        esp32#>var 666
        % "666" is a number, which can be written as:
        % C-style cast of a memory content:
        % unsigned : 666
        %   signed : 666
        % float    : 0.000000
        % Same number in different bases:
        % Hex      : 0x29a
        % Octal    : 01232
        % Binary   : 0b1010011010
        esp32#>

Или:

        esp32#>var 666.666
        % "666.666" is a number, which can be written as:
        % C-style cast of a memory content:
        % unsigned : 1143384736
        %   signed : 1143384736
        % float    : 666.666016
        % Same number in different bases:
        % Hex      : 0x4426aaa0
        % Octal    : 010411525240
        % Binary   : 0b1000100001001101010101010100000
        esp32#>

Или:

        esp32#>var 0b111
        % "0b111" is a number, which can be written as:
        % C-style cast of a memory content:
        % unsigned : 7
        %   signed : 7
        % float    : 0.000000
        % Same number in different bases:
        % Hex      : 0x7
        % Octal    : 07
        % Binary   : 0b111
        esp32#>