H965j

EST:
====

          Seda, mida varem joodeti, nüüd programmeeritakse.
          Seda, mida varem programmeeriti, nüüd õpetatakse.
          Enam ei joodeta :)

Arutelu (debriefing)
--------------------

Neli tundi pingeliselt loome midagi keerulist. Igaüks ise, kuid ühte ja sama asja.

  -- Kas seda oleks vaja seivida?"
  -- Ei, koopiaid meil pole vaja..
  -- See kuidagi solvab..

Sellepärast pole see nii solvav, kui kõik teevad oma individuaalosa, siis keegi pärast paneb kokku (oleks vaja, et töötaks). Kuid siin on psühholoogiline tõke: üleslaadida Public domain'i. Oleks vaja kõigi projektiosaliste nõusolekut.

So far..
--------

I. Probleemid Simulide-0.1.5.Win32.RC1. Algkoodid leiad siit:

  https://sourceforge.net/p/simulide/svnrepo/HEAD/tree/branches/

Isegi pärast ArduinoIDE 1.8.4 taasinstallimist ei taastata algsete näidete algkoodid.

Lahenduste variandid.

1. Kustutada faile vahemälust (cache)

  C:\Users\opilane\AppData\Local\VirtualStore
    \Program Files (x86)\Arduino\examples\01.Basics\Blink\

2. Omada algteksti R/O (ainult lugemiseks juurdepääsuga) koopiat  (server, DVD, ..)

II. Koodrid

Pole küll liiga optimaalne, kuid (liiga) arusaadav.

  kooder 16x4

    f0 = x1 + x3 + x5 + x7 + x9 + x11 + x13 + x15
    f1 = x2 + x3 + x6 + x7 + x10 + x11 + x14 + x15
    f2 = x4 + x5 + x6 + x7 + x12 + x13 + x14 + x15
    f3 = x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15

  kooder 8x3

    f0 = x1 + x3 + x5 + x7
    f1 = x2 + x3 + x6 + x7
    f2 = x4 + x5 + x6 + x7

  kooder 4x2

    f0 = x1 + x3
    f1 = x2 + x3

  kooder 2x1

    f0 = x1

Koodrite kirjutamise ajal on kasulik, et teie silmade ees oleks binaararvude tabel 0..15. Või sulgege oma silmad ja dikteerige kellelegi (näiteks mobiiltelefonile :)

  0   0  0  0  0        8   1  0  0  0
  1   0  0  0  1        9   1  0  0  1
  2   0  0  1  0       10   1  0  1  0
  3   0  0  1  1       11   1  0  1  1
  4   0  1  0  0       12   1  1  0  0
  5   0  1  0  1       13   1  1  0  1
  6   0  1  1  0       14   1  1  1  0
  7   0  1  1  1       15   1  1  1  1

Tuduu (to do):

Integrate coders with radiobuttons (16), embed created subcircuits into simulators we use.

III. Kuidas tundmatut elektroonilist kasti ühendada?
....................................................

                     | üleval toide
                 ---------
                |         |
   sisendid  ---|         |--- väljundid
   vasakult  ---|         |--- paremalt
             ...
             ---|         |---
                |         |
                 ---------
                    | all maa

  + sisendite pinge peab olema väiksem kui toitepinge.
  + kasutada ainult soovitatavat toitepinget (3.3V, 5V)
  + Väljundid ei tohi olla omavahel ühendatud.

Igast reeglist on erandeid. Kuid.. erandite eest vastutate isiklikult.

IV. Üldlüliti
.............

Kui elektroonskeemi joonistatakse simulaatoris, tehke nii, et kõik elektriallikad oleks võimalik sisse/välja lülitada ühe lüliti abil. Uudishimu saab rahuldada lugedes diferentsiaalvõrranditest, algtingimustest ja Cauchy teoreemist. Kuid lisada lülitit oleks lihtsam.

V. Vaikimisreeglid (default). Pidevad ja muutuvad komponendid
.............................................................

Praeguseks väärib märkimist, et info esitamine sellisel viisil on ökonoomne ning sellel on mitmeid teisi eeliseid. Nendele, kes soovivad kaugele ette joosta, soovitan lugeda Grady Boochi esimest peatükki raamatust "Objektorienteeritud analüüs ja disain".

VI. Nupud fikseerimisega ja ilma
................................

Relee blokeerimise skeem (allalaadimine sektsioonist: Battery, Lamp, Switch, Relay", "lock.CKT"). "SPDT, Single pole, double throw" tüüpi nupud. Kontaktide värin (bouncing) ning selle tagajärgede välistamine -- riistvaraline (trigger) ning tarkvaraline ("pimealad", katkestuse mehhanismid).

VII. Flowgorithmist eksporditud programmeerimiskeelte loend
...........................................................

  Open      Save (as).

  FXML      C#
            C++
            Delphi / Pascal
            IBO Pseudocode
            JavaScript
            Lua
            Pen
            PHP
            Python
            QBasic
            Ruby
            Swift 2
            Swift 3
            VBA
            Visual Basic NET
            Gaddis Pseudocode
            FXML

Kuna originaal flowgorithm'i FXML keel ei ole otseselt loetletud keelte ekspordi loetelus, väga kaua ei tulnud pähe, et tuleb kirjutada mitte üks, vaid kaks konverterit: flolang -> FXML ja FXML -> flolang, kus flolang on lühem ja lihtsam lugeda (kuid mitte XML) variant FXMList -- vt näide lisast A.

VIII. Juba läks meelest ära, sest ise rikkusin "ülevaltalla" reeglit:
....................................................................

Ennem pealkirjad, siis alapealkirjad, .. siis sisu.

RUS:
====

          То, что раньше паяли, теперь программируют.
          То, что раньше программировали, теперь обучают.
          Больше не паяют:)..

Разбор полетов
--------------

Четыре часа напряженно создаем нечто сложное. Каждый сам, но одно и то же.

  -- Сохранять будем?
  -- Да нет, копии не нужны..
  -- Обидно, однако.

Вот почему не так обидно, когда каждый делает свою часть, потом кто-нибудь соединяет до кучи (надо, чтобы заработало). Но тут есть психологический барьер: отдать созданное в Public Domain. Необходимо согласие всех участников проекта.

So far..
--------

I. Проблемы с SimulIDE-0.1.5.Win32.RC1. Исходники на

  https://sourceforge.net/p/simulide/svnrepo/HEAD/tree/branches/

Даже после переустановки ArduinoIDE 1.8.4 не восстанавливаются исходники оригинальных примеров.

Варианты решения.

1. Стереть файлы в кэше (cache)

  C:\Users\opilane\AppData\Local\VirtualStore
    \Program Files (x86)\Arduino\examples\01.Basics\Blink\

2. Иметь текст примера в R/O (Read Only) доступе (сервер, DVD, ..)

II. Кодеры

Пусть не слишком оптимально, зато (слишком) понятно

  кодер 16x4

    f0 =  x1 +  x3 +  x5 +  x7 +  x9 + x11 + x13 + x15
    f1 =  x2 +  x3 +  x6 +  x7 + x10 + x11 + x14 + x15
    f2 =  x4 +  x5 +  x6 +  x7 + x12 + x13 + x14 + x15
    f3 =  x8 +  x9 + x10 + x11 + x12 + x13 + x14 + x15

  кодер 8x3

    f0 =  x1 +  x3 +  x5 +  x7
    f1 =  x2 +  x3 +  x6 +  x7
    f2 =  x4 +  x5 +  x6 +  x7

  кодер 4x2

    f0 =  x1 +  x3
    f1 =  x2 +  x3

  кодер 2x1

    f0 =  x1

Когда пишем кодеры, перед глазами полезно иметь таблицу двоичного счета 0..15 . Или закрыть глаза, и надиктовывать кому-нибудь (например, мобильнику:)

  0   0  0  0  0        8   1  0  0  0
  1   0  0  0  1        9   1  0  0  1
  2   0  0  1  0       10   1  0  1  0
  3   0  0  1  1       11   1  0  1  1
  4   0  1  0  0       12   1  1  0  0
  5   0  1  0  1       13   1  1  0  1
  6   0  1  1  0       14   1  1  1  0
  7   0  1  1  1       15   1  1  1  1

Туду (to do):

Integrate coders with radiobuttons (16), embed created subcircuits into simulators we use.

III. Как подключить неизвестную электронную коробку?
....................................................

                 | сверху питание
             ---------
            |         |
  слева  ---|         |--- справа выходы
  входы  ---|         |---
         ...
         ---|         |---
            |         |
             ---------
                | снизу земля

  + напряжение на входах должо быть меньше напряжения питания.
  + использовать только рекомендуемое напряжение питания (3.3V, 5V)
  + выходы вместе не соединять.

Из любых правил есть исключения. Но.. под личную ответственность.

IV.  Общий выключатель
......................

Если схему рисуем на симуляторе, ставьте общий выключатель всех источников электроэнергии. Любопытство можно удовлетворить почитав про дифференциальные уравнения, начальные условия и теорему Коши. Но проще просто добавить рубильник.

V. Default. Постоянная и переменная составляющие
................................................

Пока что, стоит отметить, что такой способ предоставления информации экономичен и имеет ряд других преимуществ. Желающим забежать далеко вперед рекомендую почитать первую главу Гради Буча "Объектно-ориентированный анализ и проектирование", напимер здесь:

  http://www.helloworld.ru/texts/comp/other/oop/index.htm

VI. Кнопки с фиксацией и без
............................

Схема с блокировкой реле (в разделе download: "Battery, Lamp, Switch, Relay" схема "lock.CKT"). Кнопки типа "Тумблер без фиксации". Дребезг контактов и методы борьбы с ним -- существуют аппартные (триггер) и программные ("слепые зоны", механизм прерываний).

VII. Список языков программирования экспортируемых из Flowgorithm
.................................................................

Open      Save (as).

FXML      C#
          C++
          Delphi / Pascal
          IBO Pseudocode
          JavaScript
          Lua
          Pen
          PHP
          Python
          QBasic
          Ruby
          Swift 2
          Swift 3
          VBA
          Visual Basic NET
          Gaddis Pseudocode
          FXML

Поскольку родной фловгоритмовский FXML явно не перечислен в списке экспорта языков, очень долго не приходило в голову, что надо сделать не один, а два конвертера: flolang -> FXML и FXML -> flolang, где flolang есть более короткая и удобочитаемая (но уже не XML) запись -- см пример в приложении А.

VIII. Уже забыл, потому что сам нарушил правило "сверхувниз":
...........................................................

Вначалe заголовки, затем подзаголовки,.. затем раскрывать их содержание.

Annex А
.......

Note: In XML \s* between <tags> can be safely removed:

  ^(.{36})\|\s  --> null     # only right column
  \s*<          --> <        # obfuscation

------------------------------------+-----------------------------------
flolang                             | FXML
------------------------------------+-----------------------------------
                                    | <?xml version="1.0"?>
                                    | <flowgorithm fileversion="2.6">
                                    |     <attributes>
                                    |         <attribute name="name" value=""/>
                                    |         <attribute name="authors" value=""/>
                                    |         <attribute name="about" value=""/>
                                    |         <attribute name="saved" value=""/>
                                    |         <attribute name="created" value=""/>
                                    |         <attribute name="edited" value=""/>
                                    |     </attributes>
void Main()                         |     <function name="Main" type="None" variable="">
                                    |         <parameters/>
                                    |         <body>
    # Commented                     |             <comment text="Commented"/>
    int i                           |             <declare name="i" type="Integer" array="False" size=""/>
    int j                           |             <declare name="j" type="Integer" array="False" size=""/>
    float r                         |             <declare name="r" type="Real" array="False" size=""/>
    bool b                          |             <declare name="b" type="Boolean" array="False" size=""/>
    string s[10]                    |             <declare name="s" type="String" array="True" size="10"/>
    in i                            |             <input variable="i"/>
    r = 1.2345                      |             <assign variable="r" expression="1.2345"/>
    j = 0                           |             <assign variable="j" expression="0"/>
    do j < 10                       |             <do expression="j &lt; 10">
        s[j] = "Zoo" & ToString( j) |                 <assign variable="s[j]" expression="&quot;Zoo&quot; &amp; ToString( j)"/>
        j++                         |                 <assign variable="j" expression="j + 1"/>
    crazy                           |             </do>
    if i > 5                        |             <if expression="i &gt; 5">
    then                            |                 <then>
         Big( s)                    |                     <call expression="Big( s)"/>
                                    |                 </then>
    else                            |                <else>
         i = Small( i)              |                     <assign variable="i" expression="Small( i)"/>
                                    |                 </else>
    end if                          |             </if>
    out "Fin: " & i                 |            <output expression="&quot;Fin: &quot; &amp; i"/>
end Main                            |         </body>
                                    |     </function>
void Big( str[] as)                 |     <function name="Big" type="None" variable="">
                                    |         <parameters>
                                    |            <parameter name="as" type="String" array="True"/>
                                    |         </parameters>
                                    |         <body>
     int n                          |             <declare name="n" type="Integer" array="False" size=""/>
     for n in 0 to 9                |             <for variable="n" start="0" end="9" direction="inc" step="1">
         out as[n]                  |                 <output expression="as[n]"/>
     end for                        |             </for>
end Big                             |         </body>
                                    |     </function>
int Small( int ax) returns sum      |   <function name="Small" type="Integer" variable="sum">
                                    |         <parameters>
                                    |             <parameter name="ax" type="Integer" array="False"/>
                                    |         </parameters>
                                    |         <body>
    # int sum                       |             <declare name="sum" type="Integer" array="False" size=""/>
    sum = 0                         |             <assign variable="sum" expression="0"/>
    while ax > 0                    |             <while expression="ax &gt; 0">
        sum += ax                   |                 <assign variable="sum" expression="sum + ax"/>
        ax--                        |                <assign variable="ax" expression="ax - 1"/>
    end while                       |             </while>
end Small                           |         </body>
                                    |     </function>
                                    | </flowgorithm>


