Nesenin писал(а):покопался я. тут есть все. и схема программатора (с использованием ИК) и все детали. даже отдельные файлы для станков (металлизация, маски, отверстия).хоть сейчас в производство отправляй.
Я тоже покопался. Скорее всего, с точки зрения железячника всё сделано на высшем уровне, это я не могу оценить, полагаюсь на ваше мнение. Но с точки зрения программиста...
Есть куча *.dll, *.lib, есть "KiloBot Controller.exe". А исходников на всё это добро нет.
Есть куча *.hex файлов - это же тоже что-то откомпилированное. Исходников тоже нет.
Я как-то уже сильно сомневаюсь, что проект полностью открытый. В этом архиве должны быть или исходники на всё вышеперечисленное, или ссылка на открытый репозиторий кода, типа github. Может на сайте есть? Но по-моему такие вещи прямо в Readme надо писать, этих Readme в архиве много. А в них ссылки только на лицензию (ну открытая, ну и что? - это как валяющийся на дороге ключ от замка, который хрен знает где) и на сайт. На сайте исходников тоже пока не нашёл. Там кстати полно приватных страниц. Может если зарегиться, то дадут доступ. Но как-то это не очень на open sources похоже.
Единственный исходник, который откопал в архиве - KilobotSkeleton.c, вот фрагмент:
- Код: Выделить всё • Развернуть
if(special_mode_message==0x01)
{
//stop motors and ir led
OCR2B = 0x00;
OCR2A = 0x00;
PORTD &= ~(1<<4);
enable_tx=0;
TCCR0B=0x00;//turn off timer0
asm("jmp 0x7000");//jump to bootloader
}
if(special_mode_message==0x02)
{
enable_tx=0;
wakeup=0;
enter_sleep();//will not return from enter_sleep() untill a special mode message 0x03 is received
}
if((special_mode_message==0x03)||(special_mode_message==0x04))
{
//wakeup already set to 1 in timer1 interrupt
//special_mode=0;
set_color(0,0,0);
OCR2B = 0x00;
OCR2A = 0x00;
PORTD &= ~(1<<4);
enable_tx=0;
while(special_mode==0)//loop untill another special mode message is received
{
set_color(7,7,0);
_delay_ms(10);
set_color(0,0,0);
_delay_ms(1000);
}
enable_tx=1;
}
Ассемблерные вставки, магические константы... Это же кошмар программиста.
Причём всё это в main(). Прямо иллюстрация "как не надо писать программы".
Описание API - смех один. Как передать int или string ещё понятно, но как получить...
- Код: Выделить всё • Развернуть
//get_message();
//take oldest message off of rx buffer
//message is only new if message_rx[5]==1 !
//if so, message is in message_rx[0],message_rx[1]
//distance to transmitting robot (in mm) is in message_rx[3]
//Example:
get_message();
if(message_rx[5]==1)
{
data=message_rx[0];
distance=message_rx[3];
}
Ну что, всё понятно? Получили int, получили string, ага. А теперь попробуйте угадать, data это int, или первый символ string, или размер string.
Это не API, а какая-то нелепая заготовка API, над которой ещё работать и работать, дописывать и переписывать.
Поясняю - если есть функции kprinti (пишущая int) и kprints (пишущая string), то должны быть kreadi, kreads (читающие int и string). И всё равно это ещё промежуточный слой. На верхнему уровне должна быть отправка пакетов с какой-то внутренней структурой, состоящей из нескольких string и int. Я говорю о пакетах прикладного уровня. А здесь пакет самого низкого уровня, уровня передачи - он из 6 int состоит. Даже значение каждого из этих 6 int не расписано нормально - это просто массив int[6]. Ну нельзя же так. По сути, отсутствует описание протокола передачи, и нет функций-обёрток. И как с этим работать?
Самое печальное - это скелет программы, а не готовая программа.
Вот купили вы этот рой, откалибровали, настроили, загрузили все *.hex - а хрен, ничего не работает. Т.е. рой не ведёт себя как рой. По командам контроллера всё работает - агенты дружно вертятся на месте, дружно мигают светодиодом. Но ничего умного они сделать не могут, никакого роевого интеллекта в них не заложено. Пустышки.
Поэтому я сейчас не могу сказать, каким "языком взаимодействия" они пользуются, чтобы вести себя так по-умному, как показано на видеоролике.