i3KAo

0. Ни о чем
-----------

Моя работа после университета была связана с электроникой. Первый рабочий день (1980) выглядел примерно так -- вот твое рабочее место -- стол с ящиками + полка, обживайся. Интернета не было, на полку поставил книги из заводской библиотеки и несколько толстых тетрадей (96 листов) для заметок. На складе разжился радиодеталями, из измерительных приборов поставил осциллограф, генератор. Блок питания и макетную плату пришлось делать самому.

Прошло около тридцати лет, и популярными стали простые и дешевые компьютеры на чипе. По инерции захотелось осваивать "проторенной дорожкой": беру, скажем, Arduino Uno, строю к ней простенький дисплей и клавиатуру из двух-трех кнопок ( `два' -- в истории про мышей победила мышь с третьей кнопкой, правда в виде колеса прокрутки с возможностью на него нажать. Для двухкнопочных устройств ввода, есть возможность симуляции `middle click' с помощью одновременного нажатия обеих кнопок. На симуляторе все же `три' сильно удобнее).. Но подсказка лежит в архитектуре исследуемого объекта -- это Гарвард а не фон Нейман, т. е. удобнее использовать шаблонные решения master-slave, document-view, голова-тело ( я о <head>..<body>)). Например, последовательный порт в упаковке USB, bluetooth, и так далее. Или без упаковки, если еще не выбросили (кто не помнит своего прошлого, обречен пережить его вновь.*)

------
*) George Santayana,
The Life of Reason: Five Volumes in One,
v1. ch. XII. Flux and constancy in human nature.
https://www.gutenberg.org/files/15000/15000-h/15000-h.htm
------

i. C или C++?
-------------

           На Windows компьютерах установите stawberry Perl [3],
           git for Windows [4]. На панели задач (task bar)
           создайте ланчер Powershell.

Для первого языка весь C++ слишком сложен. Даже после `Ladder Logic' :) Нужно как-нибудь себя сдерживать, оставаясь в подмножестве языка.

  1. Усеченная версия в Arduino безусловно удобна, но.. это не стандарт языка программирования.

    ./Arduino/hardware/arduino/avr/cores/arduino

  2. От выхода за границы сленга в `большой язык' нас сдерживает только то, что построенный код слишком большой и в память не помещается.

  3. Англичане учат школьников на микропитоне (BBC:microbit), где так удобно усекать возможности, написав:

  from эллочка-людоедка import \
      баян, вау, в_бобруйск_животное, в_теме, в_топку, выпей_яду, \
      жесть, kek, lol, круто, лузер, офигеть, прикинь, прикол, \
      рулит, типа_умер, фиолетово

  4. `Руки чешутся' ( иди на Астру*). Но из Си++ сразу и очень хочу named args, const, function signatures..

------
*) `Через тернии к звёздам', 1980
------

В случае с языком Си, можно запретить писать #include <whatever> (и, разумеется, запретить таскать систему в папку проекта:).

Размочить счет 00 поможет:

  // g++ pr.cpp -o pr

  #include "Print.h"
  extern "C" long write( int, const char *, unsigned long);

  void pr( char ac) {
    // stdout, string, size
    (void) write( 1, &ac, 1);
  }

  long strl( const char* as) {
    long c=0;
    while( *as++) c++;
    return c;
  }

  void pr( const char* as) {
    (void) write( 1, as, strl( as));
  }

  void pr( long an, int abase=DEC) {
    char buf[ 8 * sizeof(long) + 1];
    char *str = &buf[ sizeof(buf) - 1];
    char c;
    *str = '\0';
    if ( abase < 2) abase = 10;
    do {
      c = an % abase;
      an /= abase;
      *--str = c < 10 ? c + '0' : c + 'A' - 10;
    } while( an);

    (void) write( 1, str, strl( str));
  }

  // Test functions
  int main() {
    pr( 'A'); pr( ':');
    pr( 5); pr( ':');
    pr( 66, HEX); pr( ':');
    pr( "Hi"); pr( '\n');
    return 0;
  }

------
Замечание: typedef unsigned short size_t;

size_t это тип значения, возвращаемого оператором sizeof. Обязан быть достаточной длины, чтобы не вынуждать sizeof ко `лжи через переполнение'. В случае с Arduino sizeof( size_t) равно 2.
------

ii. Защита от Хаоса
-------------------

Файл cw.c  Здесь, пользуясь всеми доступными сложностями языка C (хедеры, внешние библиотеки), специалист создает простой интерфейс для начинающего)

  /* gcc -c cw.c */
  #include <stdio.h>

  void chaoswall(int an) {
    printf("CHAOS WALL\n");
  }

Файл my_api.h  Разрешенное API (application program interface).

  extern "C" void chaoswall(int );

Файл test.cpp  Здесь начинающий может пользоваться только разрешенным API.

  #include "my_api.h"

  // g++ test.cpp cw.o -o test.exe

  int main()
      {
      chaoswall(0);
      return 0;
      }

iii. Arduino and XOD
--------------------

  https://xod.io/
  https://github.com/xodio/xod

Найдено как реклама-разогрев на youtube: `katyusha new chinese version':

  https://www.youtube.com/watch?v=hGPFENxuoSk
  https://www.youtube.com/watch?v=KyPSk4HAjGY

Установка IDE в Windows 10 "только для меня\". Первый вопрос -- "куда поставил?\".

решение: start, all programs, X, XOD IDE, RClick more, Open file location:

  C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

XOD IDE Shotrcut, Properties.

  "C:\Users\alien\AppData\Local\Programs\XOD IDE\XOD IDE.exe"

Первый урок. Включить светодиод.

  Main Menu -> Deploy -> Show code for Arduino

Скопируйте этот большой код в Arduino IDE. Теперь выберите пункт меню Sketch, Export compiled binary. Цена -- 2-килобайта кода ради 8-байтов ассемблера (ldi r16, 0xFF; out DDRB, R16; ldi R16, 0h; out PORTB, r16). Симулировать или запустить:

  <projectname>ino.standard.hex

(в папке вашего скетча).

Ссылки:
.......

  1. XOD IDE

       https://xod.io/

  2. Federico Ponzi. Example of NamedPipe in c Windows. based on:

       https://stackoverflow.com/questions/2640642
         /c-implementing-named-pipes-using-the-win32-api

  3. Perl и С в одной упаковке

      http://strawberryperl.com/

  4. Git --everything-is-local

       https://git-scm.com/download/win


Annex A. Create Named Pipe C++ Windows
......................................

  https://gist.github.com/FedericoPonzi/6c8e765f7ef12782add9

Federico Ponzi. Example of NamedPipe in c Windows. based on:

  https://stackoverflow.com/questions/2640642
    /c-implementing-named-pipes-using-the-win32-api

server.c

  // strawberry perl / git for windows installed
  // ^c to stop listening pipe
  // gcc server.c -o server.exe

  #include <windows.h>
  #include <stdio.h>
  #include <tchar.h>
  #define BUFSIZE 512

  #define pipename "\\\\.\\pipe\\LogPipe"

  int main(int argc, TCHAR *argv[])
    {
    HANDLE pipe = CreateNamedPipe
                      (
                      pipename,
                      PIPE_ACCESS_INBOUND |
                      PIPE_ACCESS_OUTBOUND,
                      PIPE_WAIT,
                      1,
                      1024,
                      1024,
                      120 * 1000,
                      NULL
                      );

    while (TRUE)
      {
      if (pipe == INVALID_HANDLE_VALUE)
        {
        printf("Error: %d", GetLastError());
        }

      char data[1024];
      DWORD numRead;

      ConnectNamedPipe(pipe, NULL);
      ReadFile(pipe, data, 1024, &numRead, NULL);

      if (numRead > 0) printf("%s\n", data);
      }

    CloseHandle(pipe);
    return 0;
    }

client.c

  // strawberry perl / git for windows installed
  // gcc client.c -o client.exe

  #include <windows.h>
  #include <stdio.h>
  #include <tchar.h>
  #define MAX_BUF 1024
  #define pipename "\\\\.\\pipe\\LogPipe"

  int main()
    {
    HANDLE pipe = CreateFile
                      (
                      pipename,
                      GENERIC_READ | GENERIC_WRITE,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      0,
                      NULL
                      );

    if (pipe == INVALID_HANDLE_VALUE)
      {
      printf("Error: %d", GetLastError());
      }

    char message [] = "Hi";
    DWORD numWritten;

    WriteFile(pipe, message, 3, &numWritten, NULL);

    return 0;
    }
