Начало работы с STM32 в Keil MDK-ARM

Все картинки в этой статье кликабельны.

STM32 — это семейство 32-разрядных микроконтроллеров фирмы STMicroelectronics.

Микроконтроллеры содержат микропроцессорное ядро ARM, точнее ARM Cortex-M. Это ядро присуще не только микроконтроллерам STM32, оно существует само по себе, и на его основе выпускается множество микроконтроллеров от разных производителей.

Keil MDK-ARM (произносится «Кеил эм-ди-кей арм») — это среда разработки для микроконтроллеров с ядром ARM Cortex-M.

Читать далее Начало работы с STM32 в Keil MDK-ARM

Реклама

Получение пользовательского токена от eBay

В статье описывается:

  • Взаимодействие продавца с сайтом приложения и с сайтом eBay для предоставления приложению токена.
  • Получение токена приложением.
    1. Продавец заходит на сайт приложения и нажимает кнопку “Войти” или иным способом сообщает приложению, что намеревается им воспользоваться.
    2. Приложение отправляет к eBay запрос GetSessionID, в котором указывает URL для перенаправления. Приложение получает в ответ SessionID, который будет идентифицировать продавца, когда он войдет на eBay. Примеры запроса GetSessionID.
    3. Приложение перенаправляет пользователя на страницу входа eBay. URL этой страницы формируется с использованием SessionID и URL для перенаправления. Формат формируемого URL следующий:
    4. Продавец входит на eBay.
      Форма входа eBay
    5. eBay перенаправляет продавца на форму подтверждения, чтобы он дал согласие на предоставление доступа приложению. Вид формы определяется настройками.
    6. Когда продавец кликает кнопку “I agree”, eBay перенаправляет его по адресу, который указан в настройках в поле “Your auth accepted URL”.
    7. Когда продавец попадает по этому адресу, приложение посылает к eBay запрос FetchToken, содержащий SessionID, и в ответ получает токен. Примеры запроса FetchToken. Это один из немногих запросов, который требует учетные данные приложения. То есть, чтобы сделать запрос, приложение должно добавить в HTTP-заголовок следующие данные: App ID, Dev ID и Cert ID.
      Для большинства других запросов учетные данные не требуются. Вместо них приложение добавляет токен в RequesterCredentials. Если используется SOAP, то RequesterCredentials должен быть в заголовке SOAP. Если используется XML, то RequesterCredentials включается в тело запроса. Дополнительные сведения см. в разделе Security на странице Making a Trading API Call.
    8. Запрос FetchToken возвращает приложению пользовательский токен продавца и срок годности токена. Приложение сохраняет эти данные для дальнейшего использования.
    9. Приложение делает запрос GeteBayOfficialTime, чтобы проверить новый токен.

Ссылки

  1. Оригинальная статья Getting a Token for a User.

 

Special Folder Enum Values on Windows and Linux (Ubuntu 16.04) in .NET Core

For getting directory paths in .Net Core you can use Environment.SpecialFolder Enumeration.

There is an analog article for Windows and Mac.

For getting a table I used .NET Core SDK 2.1.105 and next code.

using System;

var values = Enum.GetValues(
    typeof(Environment.SpecialFolder)
);

foreach(Environment.SpecialFolder value in values)
{
    Console.WriteLine(
        "\"{0}\";\"{1}\"",
        value.ToString(),
        Environment.GetFolderPath(value)
    );
}
Enum Value Windows 10 Ubuntu 16.04
Desktop C:\Users\username\Desktop /home/username/Desktop
Programs C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Personal C:\Users\username\Documents /home/username
MyDocuments C:\Users\username\Documents /home/username
Favorites C:\Users\username\Favorites
Startup C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Recent C:\Users\username\AppData\Roaming\Microsoft\Windows\Recent
SendTo C:\Users\username\AppData\Roaming\Microsoft\Windows\SendTo
StartMenu C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu
MyMusic C:\Users\username\Music /home/username/Music
MyVideos C:\Users\username\Videos
DesktopDirectory C:\Users\username\Desktop /home/username/Desktop
MyComputer
NetworkShortcuts C:\Users\username\AppData\Roaming\Microsoft\Windows\Network Shortcuts
Fonts C:\WINDOWS\Fonts /home/username/.fonts
Templates C:\Users\username\AppData\Roaming\Microsoft\Windows\Templates /home/username/Templates
CommonStartMenu C:\ProgramData\Microsoft\Windows\Start Menu
CommonPrograms C:\ProgramData\Microsoft\Windows\Start Menu\Programs
CommonStartup C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
CommonDesktopDirectory C:\Users\Public\Desktop
ApplicationData C:\Users\username\AppData\Roaming /home/username/.config
PrinterShortcuts
LocalApplicationData C:\Users\username\AppData\Local /home/username/.local/share
InternetCache C:\Users\username\AppData\Local\Microsoft\Windows\INetCache
Cookies C:\Users\username\AppData\Local\Microsoft\Windows\INetCookies
History C:\Users\username\AppData\Local\Microsoft\Windows\History
CommonApplicationData C:\ProgramData /usr/share
Windows C:\WINDOWS
System C:\WINDOWS\system32
ProgramFiles C:\Program Files
MyPictures C:\Users\username\Pictures
UserProfile C:\Users\username /home/username
SystemX86 C:\WINDOWS\SysWOW64
ProgramFilesX86 C:\Program Files (x86)
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFilesX86 C:\Program Files (x86)\Common Files
CommonTemplates C:\ProgramData\Microsoft\Windows\Templates /usr/share/templates
CommonDocuments C:\Users\Public\Documents
CommonAdminTools C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
AdminTools C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
CommonMusic C:\Users\Public\Music
CommonPictures C:\Users\Public\Pictures
CommonVideos C:\Users\Public\Videos
Resources C:\WINDOWS\resources
LocalizedResources
CommonOemLinks
CDBurning C:\Users\username\AppData\Local\Microsoft\Windows\Burn\Burn

Минимальный проект «Hello, World!» с помощью Java и Gradle

Gradle — это набирающая популярность система автоматической сборки проектов на языке Java.

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

  • build.gradle — файл конфигурации сборки Gradle.
  • Файл с исходным кодом на языке Java, например Main.java.

Важна структура папок. build.gradle должен находиться в корневой папке проекта. Файл Main.java должен находиться в папке «src/main/java».

Структура проекта должна быть, как на следующей картинке.
Java Gradle Project Structure

Содержимое файла Main.java следующее.

public class Main {
    public static void main (String[] args) {
        System.out.println("Hello, world!");
    }
}

Содержимое файла build.gradle следующее.

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'Main'

jar {
    manifest {
        attributes 'Main-Class': mainClassName
    }
}

В этом файле подключаются плагины, которые предоставляет все необходимо для сборки. Кроме того, в файле указывается точка входа программы — это класс Main.

Проект собирается командой gradle build, которую нужно выполнить в папке проекта. После чего создается папка build/libs, в которой можно найти исполняемый jar-файл.

Запустить программу можно следующей командой.

java -jar build/libs/project_name.jar

Или с помощью Gradle следующей командой.

gradle run

Такой проект можно открыть в IDE NetBeans. Для этого в NetBeans должен быть установлен плагин Gradle Support. Чтобы установить плагин, нужно запустить меню Tools -> Plugins и в диалоговом окне найти Gradle Support.

Успехов.

Аргументы командной строки в разных языках программирования

C и C++

int  main(int argc, char* argv[])
{
    argc;    // количество аргументов + 1
    argv[0]; // имя программы
    argv[1]; // первый аргумент
    argv[2]; // второй аргумент
    // ...
}

Bash

#!/bin/bash

# $# — количество аргументов
#
# $* — аргументы одной строкой
# $@ — список аргументов

echo $0    # имя скрипта
echo $1    # первый аргумент
echo $2    # второй аргумент
# ...
echo $9    # девятый аргумент
echo $(10) # десятый аргумент
echo $(11) # одиннадцатый аргумент
# ...

Cmd.exe

echo %0 REM имя срипта
echo %1 REM первый аргумент
echo %2 REM первый аргумент
REM ...
echo %9 REM девятый аргумент

Python

import sys

sys.argv      # список аргументов
len(sys.argv) # количество аргументов + 1
sys.argv[0]   # имя скрипта
sys.argv[1]   # первый аргумент
sys.argv[2]   # второй аргумент
# ...

Java

public class CommandLine {
    static public void main(String args[]) {
        args.length; // количество аргументов
        args[0];     // первый аргумент
        args[1];     // второй аргумент
        // ...
    }
}

C Sharp

class MainClass
{
    static int Main(string[] args)
    {
        args.Length; // количество аргументов
        args[0];     // первый аргумент
        args[1];     // второй аргумент
        // ...
    }
}

Вывод функций ЛАЧХ и ЛФЧХ в программе Maxima

Maxima — это консольная математическая программа для аналитических расчетов. Программа имеет версию с графическим интерфейсом, которая называется wxMaxima, ее можно бесплатно скачать с официального сайта.

Допустим имеется передаточная функция W(s) . Нужно получить две функций:

  • L(\omega) — ЛАЧХ (логарифмическая амплитудная частотная характеристика),
  • \Phi(\omega) — ЛФЧХ (логарифмическая фазовая частотная характеритиска),

где: \omega — угловая частота, рад/с.

Пример расчет ЛАЧХ и ЛФЧХ для передаточной функции апериодического звена второго порядка.


/* Передаточная функция */
W(s) := k/((1 + T[3]*s)*(1+T[4]*s)) $

/* Функция десятичного логарифма */
log10(x) := log(x) / log(10) $

print("ЛАЧХ") $
L(%omega) = 20 * log(cabs(W(%i*%omega)));

print("ЛФЧХ") $
%Phi(%omega) = carg(W(%i*%omega));

Вывод программ следующий.

ЛАЧХ

\mathrm{L}\left( \omega\right) =20\cdot \mathrm{log}\left( \frac{\left| k\right| }{\sqrt{{{T}_{3}^{2}}\cdot {{\omega}^{2}}+1}\cdot \sqrt{{{T}_{4}^{2}}\cdot {{\omega}^{2}}+1}}\right)

ЛФЧХ

\Phi\left(\omega\right) =-\mathrm{atan}\left( {{T}_{4}}\cdot \omega\right) -\mathrm{atan}\left( {{T}_{3}}\cdot \omega\right) +\mathrm{atan2}\left( 0,k\right)

В окне программы расчет выглядит следующим образом.

Вывод функций ЛАЧХ и ЛФЧХ в программе Maxima

Для тех, кто никогда не пользовался программой, объясню, что тут происходит. С помощью /* */ можно оставлять комментарии.

Сначала задается передаточная функция W(s) . Затем задается функция десятичного логарифма, потому что, к сожалению, она отсутствует в программе.

  • %i — мнимая единица.
  • %Phi — греческая буква \Phi
  • %omega — греческая буква \omega
  • функция cabs() возвращает модуль комплексного числа.
  • функция carg() возвращает аргумент комплексного числа.

Раскрой коробки картонной четырехклапанной

Любая прямоугольная коробка имеет 3 размера, 2 из которых образуют сторону с клапанами. Возможно 3 варианта раскроя для одних и тех же размеров, в зависимости от стороны с клапанами. Разные варианты имеют разные габариты и разные площади раскроя. С помощью расчета нужно подобрать вариант для оптимального расходования листов картона.

Коробка

Картонная коробка с размерами

Размеры a и b образуют сторону с клапанами.

Размер d должен быть достаточным для надежного склеивания коробки, например 5 см. Картон надежно склеивается клеем ПВА.

Должно соблюдаться условие:

b \geq a

На изображениях в статье не учитывается толщина картона.

Раскрой на одном листе картона

Раскрой развертка картонной коробки

Обязательное условие:

b \geq a

Размеры минимального листа картона рассчитываются по следующим формулам.

E = 2 (a + b) +d

F = c + a

Раскрой на двух листах картона

Если нет достаточно большого листа картона, то коробку можно сделать из двух небольших листов картона. В этом случае будет два хвоста для склейки.

Раскрой развертка картонной коробки из двух половин

Обязательное условие:

b \geq a

Размеры минимального листа картона рассчитываются по следующим формулам.

G = a + b +d

F = c + a

Таблица для расчета раскроя

Пример расчета раскроя опубликован в Гугл Таблицах. Рассчитывается 3 варианта раскроя в зависимости от стороны расположения клапанов. Можете создать копию документа (Файл -> Создать копию) и подставить свои размеры коробки.

 

 

Ввод символа рубля с клавиатуры

В Линуксе можно настроить специальную клавишу Compose, которая упрощает ввод символов, которых нет на клавиатуре.

По умолчанию определен ввод многих символов, но пока среди них нет символа рубля ₽.

Чтобы вводить символ рубля комбинаций клавиш Compose дефис p (английская), запустите в терминале следующую команду.

echo -e 'include "%L"\n<Multi_key><minus><p>:"₽"' > ~/.XCompose

Эта команда создаст в домашней папке файл .XCompose с определенным содержимым. Ввод символа будет доступен только пользователю, которому принадлежит эта домашняя папка.

Если файл .XCompose уже существует, то следует использовать следующую команду.

echo -e '\n<Multi_key><minus><p>:"₽"' >> ~/.XCompose

Удачи!

Что происходит при выравнивании кода табуляцией

Среди программистов существует спор, что использовать для отступа: табуляцию или пробелы.

Проблема с табуляцией в том, что многие используют ее и для выравнивания.

Следует различать отступы и выравнивание. Отступ (indent) используется, чтобы сместить начало строки. Выравнивание (alignment) используется внутри строки, чтобы сместить одну часть строки относительно другой.

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

Допустим, программист сделал выравнивание табуляцией шириной 4 пробела, а потом решил поменять ширину.

Ширина: 4 пробела (эталонное выравнивание)

int variable                = 1;
int superVariable           = 2;
int anotherSuperVariable    = 3;

Ширина: 2 пробела

int variable        = 1;
int superVariable     = 2;
int anotherSuperVariable  = 3;

Ширина: 3 пробела

int variable            = 1;
int superVariable       = 2;
int anotherSuperVariable   = 3;

Ширина: 8 пробелов

int variable                            = 1;
int superVariable                       = 2;
int anotherSuperVariable        = 3;

Как видно, выравнивание разваливается.

Иллюстрация табуляция для выравнивания кода в программировании

Сборка Qt Virtual Keyboard и добавление русской раскладки

Qt Virtual Keyboard Русская раскладка

Qt Virtual Keyboard — это библиотека предоставляющая виртуальную экранную клавиатуру. Она входит в библиотеку Qt начиная с Qt 5.7. Точнее, она и раньше входила, но была доступна только в коммерческой версии.

По умолчанию клавиатура из официальной сборки Qt поддерживает только английскую раскладку. Если нужны раскладки на других языках, то проект Qt Virtual Keyboard нужно пересобрать.

Далее приводится инструкция по сборке Qt Virtual Keyboard и добавлению русской раскладки в Линукс. Все действия выполняются в консоле. Для Виндовс инструкция не приводится, но она похожа.

Библиотека Qt должна быть установлена вместе с исходным кодом. Для этого при установке нужно отменить пункт Sources.

Установка исходного кода Qt

Создадим папку для сборки и перейдем в нее.

mkdir /tmp/build-qtvirtkb
cd /tmp/build-qtvirtkb

Создадим переменную, содержащую путь к папке, в которой установлен Qt.

QTDIR=/opt/Qt5.9.1/5.9.1

Переменная нужна только для того, чтобы далее не прописывать полные пути.

Сконфигурируем проект Qt Virtual Keyboard с помощью qmake.

$QTDIR/gcc_64/bin/qmake "CONFIG += lang-en lang-ru" $QTDIR/Src/qtvirtualkeyboard
 

Языки раскладок задаются в строке "CONFIG += lang-en lang-ru". Таким образом клавиатура будет поддерживать английскую и русскую раскладки. Полный список языков приведен в официальной документации. Если указать"CONFIG += lang-all", то клавиатура будет поддерживать все возможные языки.

Соберем проект с помощью make.

make

Сборка занимает некоторое время.

Следующая команда установит новую сборку. Нужно учесть, что будут внесены изменения в официальную сборку Qt. Она заменит файлы клавиатуры на те, которые получены во время новой сборки. Предыдущие файлы невозможно будет восстановить.

sudo make install

Готово. Теперь в клавиатуре будет русская раскладка.

Если нужно изменить раскладки, то нужно пересобрать проект следующими командами.

make distclean
$QTDIR/gcc_64/bin/qmake "CONFIG += lang-all" $QTDIR/Src/qtvirtualkeyboard
make
sudo make install

Первая команда нужна, чтобы очистить сборку.

EUROCONTROL ASTERIX Protocol. Category 002 (CAT002). Encoding Rules Table

This table is compiled according to EUROCONTROL ASTERIX CAT002, Part 2b, Monoradar Service Messages, Edition 1.0, 1997.11.01.

  • M stands for mandatory,
  • O for optional,
  • X for never present.
Item Message Type
001
North marker
002
Sector crossing
003
South marker
008
Activation of blind zone filtering
009
Stop of blind zone filtering
I002/000
Message Type
M M M M M
I002/010
Data Source Identifier
M M M M M
I002/020
Sector Number
X M X X X
I002/030
Time of Day
O O O O O
I002/041
Antenna Rotation Period
O O X X X
I002/050
Station Configuration Status
O O O X X
I002/060
Station Processing Mode
O O O X X
I002/070
Plot Count Values
O O X X X
I002/080
Warning/Error Conditions
O O O X X
I002/090
Collimation Error
O O X X X
I002/100
Dynamic Window — Type 1
X X X M X