В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод на платформе Maixduino.
Что нужно знать
Существует 3 фреймворка для разработки приложений для процессора К210:
- Standalone SDK для Kendryte K210;
- Kendryte FreeRTOS SDK — Этот SDK предназначен для Kendryte K210, который содержит поддержку FreeRTOS;
- Arduino (на основе Standalone SDK).
Для работы с периферийными устройствами на Maixduino существует 3 основных компонента: GPIO, GPIOHS и FPIOA.
- GPIO (General Purpose Input Output / Интерфейс ввода/вывода общего назначения) — чип имеет 8 GPIO общего назначения.
- GPIOHS (General Purpose Input Output High Speed / Высокоскоростной интерфейс ввода/вывода общего назначения) – чип имеет 32 высокоскоростных GPIO. Похоже на обычный GPIO, но быстрее.
- FPIOA (Field Programmable I/O Array / Программируемый массив ввода/вывода) позволяет пользователю соотносить 256 внутренних функций с 48 физическими входами / выходами на чипе.
Из этого следует, что Maixduino более гибок, чем простой Arduino на базе микроконтроллеров AVR. Мы можем сопоставить любое устройство с любым физическим контактом (контактами), например, кнопки, светодиоды, устройства I2C и SPI, и т. д.
Создание нового проекта
- Открываем PlatformIO: Home и выбираем New Project, чтобы создать новый проект;
- Задаём название проекта в поле Name;
- В Boards ищем плату Sipeed MAIXDUINO;
- Выбираем Фреймворк Kendryte FreeRTOS SDK;
- В Location можно указать путь, где будет храниться проект, но можно оставить по умолчанию.
При создании первого проекта, все необходимые файлы и библиотеки будут загружены и установлены автоматически, и это может занять больше времени, чем обычно.
Настройка проекта
В папке src необходимо создать два файла: main.cpp и project_cfg.h. В первом файле мы напишем программу, а во втором мы определим макросы и настроим функции выводов.
В корневом каталоге есть файл platformio.ini — файл конфигурации проекта PlatformIO. По умолчанию PlatformIO автоматически определяет порт загрузки. Но Вы можете настроить собственный порт, используя параметр upload_port
. Список портов вы можете найти в Диспетчер Устройств или во вкладке Devices в PIO Home.
В platformio.ini вы также можете изменить скорость загрузки, используя параметр upload_speed
, порт монитора, параметр monitor_port
, и скорость монитора порта, параметр monitor_speed
. Порт загрузки и порт монитора должны совпадать.
Пример файла platformio.ini
; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library storages ; Advanced options: extra scripting ; ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html [env:sipeed-maixduino] platform = kendryte210 board = sipeed-maixduino framework = kendryte-freertos-sdk upload_port = COM3 upload_speed = 1500000 monitor_port = COM3 monitor_speed = 115200
Как работать с GPIO
Если мы хотим записывать или читать данные из GPIO, мы должны сначала его настроить. Как упоминалось выше, K210 имеет 48 контактов и 256 функций для них. Но поскольку на плате формфактора Arduino количество контактов ограничено, используются не все 48 контактов.
Сначала, чтобы определить, какие контакты и где они назначены, мы должны открыть схему платы — Maixduino-4.30(schematic).pdf. Тут нужно найти разъемы (Connector).
Все контакты разъема P3 (HEADER-1X6) подключены к ESP-32, поэтому его нельзя использовать с K210. Но разъемы P2 и P5 идут на K210, и их можно использовать в качестве контактов ввода-вывода общего назначения.
Настройка порта
Перед настройкой вывода на выход или на вход ему необходимо назначить одну функцию из 32 GPIOHS или 8 GPIO. Это можно сделать двумя способами:
- с использованием функции
int fpioa_set_function (int number, fpioa_function_t function)
; - с конфигурацией объекта
g_fpioa_cfg
.
Первый вариант можно использовать в небольших проектах с небольшим количеством конфигураций или в проектах, которые требуют изменения функции вывода во время работы программы (runtime).
Второй вариант более предпочтителен, поскольку за настройку всех выводов отвечает только один файл, таким образом проект становится более структурированным и читаемым.
В приведенных ниже примерах показано, как соотносить функцию GPIOHS0 на вывод под номером 3 (это вывод IO3 на разъеме P5). Обратите внимание, что перечисление выполняется относительно FUNC_GPIOHS0
. В дальнейшем будут использоваться только значения от 0 до 31. Поэтому желательно использовать макросы (#define
).
Пример 1:
fpioa_set_function(3, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + 0));
Пример 2:
#ifndef PROJECT_CFG_H #define PROJECT_CFG_H #include <pin_cfg.h> const fpioa_cfg_t g_fpioa_cfg = { /* Версия */ .version = PIN_CFG_VERSION, /* Число функций */ .functions_count = 1, /* Офисание функций */ .functions = { /* */ {3, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + 0)}, }, }; #endif
После этого необходимо открыть устройство gpio0
с помощью функции io_open
.
/* Открываем GPIO0 устройство */ gpio = io_open("/dev/gpio0");
И наконец настраиваем режим работы вывода (пина) – на вход или выход.
/* Устанавливаем режим работы пина 0 на вход. */ gpio_set_drive_mode(gpio, 0, GPIO_DM_INPUT);
/* Устанавливаем режим работы пина 0 на выход. */ gpio_set_drive_mode(gpio, 0, GPIO_DM_OUTPUT);
/* Устанавливаем режим работы пина 0 на вход с подтягивающим резистором (pull-up resistor). */ gpio_set_drive_mode(gpio, 0, GPIO_DM_INPUT_PULL_UP);
/* Устанавливаем режим работы пина 0 на вход с стягивающим резистором (pull-down resistor). */ gpio_set_drive_mode(gpio, 0, GPIO_DM_INPUT_PULL_DOWN);
Примеры программ
Чтобы лучше понять, как всё это работает, приведу два примера программ. Комментарии также будут добавлены в код для более подробного описания.
Пример 1 — мигаем светодиод
В первом примере будем мигать светодиодом, подключенным к одному из выводов платы. В файле project_cfg.h настроим функцию вывода, используемый для мигания светодиода. В файле main.cpp настроим вывод на выход и создадим задачу blinkLedTask
, которая будет вызываться с интервалом 100 мс, и при каждом вызове светодиод будет менять свое состояние с ВКЛ на ВЫКЛ и наоборот.
Схема подключения
Светодиод подключается на 13-й контакт Maixduino/Arduino через резистор, ограничивающий ток.
Файл project_cfg.h
#ifndef PROJECT_CFG_H #define PROJECT_CFG_H #include <pin_cfg.h> /** * Номер внутреннего пина */ #define LED_IO (0) /** * Номер физического пина */ #define LED_PIN (3) const fpioa_cfg_t g_fpioa_cfg = { /* Версия */ .version = PIN_CFG_VERSION, /* Число функций */ .functions_count = 1, /* Офисание функций */ .functions = { /* */ {LED_PIN, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + LED_IO)}, }, }; #endif
Файл main.cpp
#include "project_cfg.h" #include <FreeRTOS.h> #include <devices.h> #include <syslog.h> #include <task.h> /** * Указатель на устройство GPIO */ static handle_t gpio; /** * Текущее состояние светодиода */ static gpio_pin_value_t ledState; /** * Прототип задачи включения/выключения светодиода * * @param pvParameters Функции задач принимают параметр, имеющий тип указателя на void (т. е. void*). Значение, указанное в pvParameters, будет передано в задачу. */ static void blinkLedTask(void *pvParameters); /** * */ int main() { BaseType_t retCode; /* Открываем GPIO0 устройство */ gpio = io_open("/dev/gpio0"); /* Перехват ошибок в процессе разработки */ configASSERT(gpio); /* Устанавливаем режим работы LED_IO пина на выход. */ gpio_set_drive_mode(gpio, LED_IO, GPIO_DM_OUTPUT); /* Задаём начальное состояние светодиода (выключаем) */ ledState = GPIO_PV_LOW; /* Пишем состояние в пин */ gpio_set_pin_value(gpio, LED_IO, ledState); /* Создаём задачу с мигающим светодиодом */ retCode = xTaskCreateAtProcessor(1, &blinkLedTask, "Blink Led task", 512, nullptr, 3, nullptr); /* Проверяем, если задача была успешно создана */ if (retCode == pdPASS) { /* В случае успеха выводим информационное сообщение */ LOGI("MFRB", "Blink Led task is running"); } else { /* В случае неудачи выводим предупреждающее сообщение */ LOGW("MFRB", "Blink Led task start problems"); } for (;;) { } return 0; } static void blinkLedTask(void *pvParameters) { while (1) { /* Меняем состояние в 1/0 */ if (GPIO_PV_HIGH == ledState) { ledState = GPIO_PV_LOW; } else { ledState = GPIO_PV_HIGH; } /* Пишем новое состояние в пин */ gpio_set_pin_value(gpio, LED_IO, ledState); /* Помещаем задачу в состояние Blocked на фиксированное количество тиков прерываний. Находясь в состоянии Blocked, задача не использует процессорное время, поэтому процессор загружен только полезной работой. С помощью макроса pdMS_TO_TICKS мы конвертируем миллисекунды в тики */ vTaskDelay(pdMS_TO_TICKS(100)); } }
Пример 2 — кнопка и светодиод
Во втором примере помимо светодиода подключим еще и кнопку. Если кнопка не нажата, светодиод будет менять свое состояние (мигать) каждые 500 мс, а при нажатии — каждые 100 мс. Вывод, подключенный к кнопке, настроен на вход с подтягивающим резистором gpio_set_drive_mode(gpio, BTN_IO, GPIO_DM_INPUT_PULL_UP);
.
Схема подключения
Светодиод подключается на 13-й контакт Maixduino/Arduino через резистор, ограничивающий ток, а кнопка на 12-й контакт и GND.
Файл project_cfg.h
#ifndef PROJECT_CFG_H #define PROJECT_CFG_H #include <pin_cfg.h> /** * Номер внутреннего пина */ #define LED_IO (0) #define BTN_IO (1) /** * Номер физического пина */ #define LED_PIN (3) #define BTN_PIN (10) const fpioa_cfg_t g_fpioa_cfg = { /* Версия */ .version = PIN_CFG_VERSION, /* Число функций */ .functions_count = 2, /* Офисание функций */ .functions = { /* */ {LED_PIN, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + LED_IO)}, {BTN_PIN, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + BTN_IO)}, }, }; #endif
Файл main.cpp
#include "project_cfg.h" #include <FreeRTOS.h> #include <devices.h> #include <syslog.h> #include <task.h> /** * Указатель на устройство GPIO */ static handle_t gpio; /** * Текущее состояние светодиода */ static gpio_pin_value_t ledState; /** * Прототип задачи включения/выключения светодиода * * @param pvParameters Функции задач принимают параметр, имеющий тип указателя на void (т. е. void*). Значение, указанное в pvParameters, будет передано в задачу. */ static void blinkLedTask(void *pvParameters); /** * */ int main() { BaseType_t retCode; /* Открываем GPIO0 устройство */ gpio = io_open("/dev/gpio0"); /* Перехват ошибок в процессе разработки */ configASSERT(gpio); /* Устанавливаем режим работы LED_IO пина на выход. */ gpio_set_drive_mode(gpio, LED_IO, GPIO_DM_OUTPUT); /* Устанавливаем режим работы BTN_IO пина на вход с подтягивающим резистором. */ gpio_set_drive_mode(gpio, BTN_IO, GPIO_DM_INPUT_PULL_UP); /* Задаём начальное состояние светодиода (выключаем) */ ledState = GPIO_PV_LOW; /* Пишем состояние в пин */ gpio_set_pin_value(gpio, LED_IO, ledState); /* Создаём задачу с мигающим светодиодом */ retCode = xTaskCreateAtProcessor(1, &blinkLedTask, "Blink Led task", 512, nullptr, 3, nullptr); /* Проверяем, если задача была успешно создана */ if (retCode == pdPASS) { /* В случае успеха выводим информационное сообщение */ LOGI("MFRB", "Blink Led task is running"); } else { /* В случае неудачи выводим предупреждающее сообщение */ LOGW("MFRB", "Blink Led task start problems"); } for (;;) { } return 0; } static void blinkLedTask(void *pvParameters) { /* Состояние кнопки */ gpio_pin_value_t btnState; /* Время повторения */ unsigned int timeInMs; while (1) { /* Считываетм состояние кнопки. */ btnState = gpio_get_pin_value(gpio, BTN_IO); if (btnState == GPIO_PV_LOW) { /* Если кнопка нажата, мы меняем повторяемость задачи на 100 мс. */ timeInMs = 100; } else { /* Если нет - 500 мс. */ timeInMs = 500; } /* Меняем состояние в 1/0 */ if (GPIO_PV_HIGH == ledState) { ledState = GPIO_PV_LOW; } else { ledState = GPIO_PV_HIGH; } /* Пишем новое состояние в пин */ gpio_set_pin_value(gpio, LED_IO, ledState); /* Помещаем задачу в состояние Blocked на фиксированное количество тиков прерываний. Находясь в состоянии Blocked, задача не использует процессорное время, поэтому процессор загружен только полезной работой. С помощью макроса pdMS_TO_TICKS мы конвертируем миллисекунды в тики */ vTaskDelay(pdMS_TO_TICKS(timeInMs)); } }
Материалы
Kendryte · GitHub
Maixduino-4.30(schematic)
Maixduino — одноплатный компьютер с ускорителем AI, RISC-V AI, форм-фактор Arduino и беспроводной модуль ESP32
It’s very straightforward to find out any matter on web as
compared to books, as I found this paragraph at this web page.
%%
Feel free to visit my homepage; Gama казино
%%
my page; comment-93037
%%
Have a look at my website ktomilino.ru
%%
Feel free to surf to my blog comment-220709
%%
Here is my webpage; comment-39443
%%
My webpage … comment-162035
online prescription
I am regular reader, how are you everybody? This piece of writing posted at this site is genuinely pleasant.
licensed and approved canadian pharmacies
list of legitimate canadian pharmacies
The manufacturer warns diabetics that synthroid can have an effect on glucose levels,
but it surely fails to tell patients WHAT synthroid does.
Hey there, You’ve done a fantastic job. I will certainly
digg it and personally recommend to my friends.
I am confident they’ll be benefited from this web site.
Hmm it seems like your blog ate my first comment
(it was super long) so I guess I’ll just sum it up what I had written and say, I’m thoroughly enjoying your blog.
I too am an aspiring blog writer but I’m still new to
everything. Do you have any tips and hints for newbie blog writers?
I’d certainly appreciate it.
Feel free to visit my web-site — «http://tironelle.free.fr/wiki/index.php?title=Discussion_Utilisateur:HildegardeAlbino
Excellent way of telling, and good post to take facts regarding my presentation subject, which
i am going to convey in school.
I like the helpful information you provide in your articles.
I’ll bookmark your blog and check again here regularly.
I’m quite certain I will learn a lot of new stuff right
here! Good luck for the next!
Hurrah! In the end I got a web site from where I be able to truly get
valuable data concerning my study and knowledge.
%%
Feel free to surf to my site :: 37148
%%
Feel free to surf to my webpage; лечение алкоголиков
%%
Also visit my webpage :: https://cicloteixeirabike.com.br/2021/05/21/crash-kumar-oyunu-heyecan-verici-ve-heyecan-verici-bir-bahis-deneyimi/
%%
my blog post — https://qrius.com/comprehensive-guide-to-playing-and-winning-the-aviator-game/
This design is spectacular! You obviously know how to keep a reader amused.
Between your wit and your videos, I was almost moved to start
my own blog (well, almost…HaHa!) Excellent job. I really enjoyed what you had to say,
and more than that, how you presented it. Too cool!
Уход за Шубой: Сохраняем Красоту и
Люкс на Долгие Годы
Шубы из натурального меха всегда были
символом роскоши и элегантности.
Но чтобы они оставались в отличном состоянии на протяжении многих лет,
нужен правильный уход. В этой статье мы
рассмотрим основные аспекты ухода за шубой.
Хранение Шубы
Температура и Влажность: Храните шубу в прохладном и сухом месте.
Избегайте перепадов температуры
и высокой влажности.
Избегайте Солнечного Света: Прямые солнечные лучи могут выцветить мех, поэтому храните шубу в темном месте.
Используйте Подходящие Вешалки: Шуба не должна терять форму, поэтому
используйте вешалки, которые сохраняют форму плеч.
Чистка Шубы
Регулярная Профилактика: Проветривайте шубу и периодически стряхивайте
пыль.
Специализированная Чистка: Обратитесь
к профессионалам для глубокой чистки шубы.
Домашние средства могут повредить мех.
Защита от Вредителей
Мех может привлекать вредителей, таких как
моль. Используйте специализированные средства для защиты шубы, но избегайте агрессивных химикатов, которые могут повредить мех.
Использование Профессиональных Услуг
Если шуба требует ремонта или специализированного ухода, лучше обратиться к профессионалам.
Они знают, как обращаться с различными видами меха и смогут предложить оптимальный уход.
Заключение
Правильный уход за шубой не только сохранит
ее внешний вид, но и продлит срок службы, делая инвестицию
в роскошный элемент гардероба оправданной.
Следуя этим простым правилам, вы сможете наслаждаться своей шубой многие годы.
Эта статья может быть полезным руководством для тех, кто хочет сохранить свою
шубу в идеальном состоянии. Если у вас есть специфические вопросы или требования, я готов дополнить статью нужной информацией!
My blog post; «https://manchesterclopedia.win/wiki/Mexamoskvichka_Ru_-_16913437951
Hi there to every one, the contents present
at this site are actually amazing for people knowledge,
well, keep up the good work fellows.
I read this post completely regarding the comparison of hottest and preceding technologies, it’s remarkable article.
I am sure this post has touched all the internet people, its really really pleasant piece
of writing on building up new webpage.
Hurrah! Finally I got a webpage from where I be capable of genuinely take useful
data concerning my study and knowledge.
RTP Slot88 punya presentase unggul menggiurkan dalam memberikan keuntungan kepadamu. RTP ialah singkatan dari bahasa inggris yaitu return to gamer yang berarti kesuksesan kalian masing-masing. Kesuksesan ini dibilang dalam model persen serta senantiasa diupdate pada setiap saat. Makin tinggi persen itu maka semakin besar pula kesempatan memenangkan permainan https://www.dixva.com/user/EBSSterling/ online hari ini.
Do you mind if I quote a few of your posts
as long as I provide credit and sources back to your webpage?
My blog is in the very same niche as yours and
my users would certainly benefit from a lot of the
information you provide here. Please let
me know if this ok with you. Cheers!
Excellent website you have here but I was wondering if you knew of any community forums that cover the same topics discussed here?
I’d really love to be a part of online community
where I can get advice from other knowledgeable people that share the same interest.
If you have any suggestions, please let me know. Kudos!
The very initial thing you want to do is to obtain the data file to your smartphone or pill.
Here is my web page mostbet official website
Great article. I’m going through many of these issues as well..
I’m so glad to see your article. UFABET , the best website ever Includes a variety of gambling games Unlimited withdrawals Open every day 24 hours.
Hi just wanted to give you a quick heads up and let you know a few of the
pictures aren’t loading correctly. I’m not sure why but
I think its a linking issue. I’ve tried it in two different
web browsers and both show the same outcome.
whoah this weblog is wonderful i love studying your posts.
Stay up the great work! You know, lots of persons are looking round for this
information, you could aid them greatly.
canadian online pharmacy
Its like you read my mind! You appear to know so much about this,
like you wrote the book in it or something. I think that you could do with a few pics to
drive the message home a little bit, but instead of that, this is great blog.
A great read. I will certainly be back.
Hello terrific blog! Does running a blog similar to this require a great deal of work?
I’ve very little expertise in programming but I was hoping to start my own blog
soon. Anyways, should you have any recommendations or techniques for new blog owners please share.
I understand this is off topic but I just needed to ask.
Appreciate it!
I read this piece of writing completely about the difference of most up-to-date and
preceding technologies, it’s awesome article.
Also visit my web blog disposable vape
Статейное и ссылочное продвижение.
В наше время, фактически любой
человек пользуется интернетом.
С его помощью возможно отыскать
любую данные из различных интернет-источников и
поисковых систем.
Для кого-то личный сайт — это хобби.
Но, большая часть применяют созданные проекты для заработка и
привлечение прибыли.
У вас есть собственный сайт и вы желаете привлечь на него максимум посетителей, но не знаете с чего начать?
Обратитесь к нам! Мы поможем!
проверка обратных ссылок
digifinex
kwon illicit from luna to bitcoin
I was recommended this website by my cousin. I am not certain whether or not
this submit is written by way of him as no one else know such exact approximately my problem.
You’re incredible! Thanks!
Many thanks! Awesome information.
Have a look at my blog http://xn--ov7bp8e.kr/bbs/board.php?bo_table=free&wr_id=51
Thanks for sharing your thoughts about digital clock.
Regards
If some one needs to be updated with most recent technologies after that he must be visit this web site and be up
to date everyday.
Yesterday, while I was at work, my sister stole my
iphone and tested to see if it can survive a twenty five foot drop, just so
she can be a youtube sensation. My iPad is now broken and she has
83 views. I know this is entirely off topic but I had
to share it with someone!
whoah this blog is great i really like reading your posts.
Stay up the good work! You know, lots of persons are searching around for
this info, you could aid them greatly.
Thanks for sharing your thoughts on cara top up zeus.
Regards
whoah this blog is magnificent i really like reading
your posts. Stay up the great work! You understand, a lot of people are hunting round for this information, you can aid them
greatly.
Attractive section of content. I just stumbled upon your weblog and
in accession capital to assert that I acquire actually enjoyed account your
blog posts. Anyway I will be subscribing to your feeds and even I achievement you access consistently rapidly.
Thank you for sharing your thoughts. I truly appreciate your efforts and I am waiting for your next post thank
you once again.
This website was… how do I say it? Relevant!!
Finally I have found something that helped me. Kudos!
Link exchange is nothing else but it is
only placing the other person’s website link on your page at appropriate place and other person will also do similar
for you.
These are truly fantastic ideas in on the topic of blogging.
You have touched some good factors here. Any way keep up wrinting.
一二三四社区在线播放视频高卢3D美女被❌羞羞动漫视频oldman中老年自慰艹老熟妇逼肏欧美老女人小舞3d同人川村那月视频XXX老太老太COm日本全彩各地多种方式服务考生志愿填报国产免费一区二区三区网站免费国产麻豆性爱视频短剧少妇人妻偷人精品无码视频新浪火影忍者纲手污动画亚洲胖老女人的性爱频道沙特俄罗斯先后宣布石油减产波多野结衣女同性恋视频video❌❌❌free户外处女阴道有多紧色视频网站三d老师足交在线观看抠逼黄色视频明起华北高温卷土重来hv精品国漫3DMAXjapanese日本电影福利姬视频污在线观看沙奈朵被插AV超薄肉色丝袜交足视频播放性欧美老妇Z0Z另类裸体美女写真视频网站女人被狂C到高潮视频免费网站周五夜放克Chinese熟女av
https://xxxporno.win/ 银川31死爆炸事故原因公布天気予報㓜女BBwXXXX另类外户日本大巴强㢨thepro黄色三极小说日本变态挠脚心tickleing网站nnxnxnx强奸mature欺负tube搞B图片性欧美freevioe喷潮中韩欧美~中国字幕刑讯室电击尿口男生小说久久久久禁同人3D动漫斗罗japanese高潮内裤黑丝刻晴被艹中国公民记录坐军舰撤离苏丹欧美tickle网站hinata❌boruto污free性护士videos另类漂亮人妻熟睡中被公侵犯1残酷的性变态拳头交强制囗暴虐乳榨乳调教奶头电击小说玩偶姐姐《森林》GOGO专业大尺度人体国模吧337p冰恋窒息掐死白丝雨雨视频好大好深好爽想要国产乱码91国产免费传媒AV片生线les女女百合AV资源欧美一级性爱美女连续高潮大痉挛videosanime日本动漫tubefree娇小性HD男男受爱Gay同性xX动漫3D
Hi there, yes this piece of writing is actually fastidious and I have
learned lot of things from it on the topic of blogging.
thanks.
Quality posts is the crucial to invite the visitors to go to
see the web site, that’s what this site is providing.