Есть новая версия, но схема сильно изменилась, практически это новая версия оборудования несовместимая по железу с первым вариантом. Соответственно и прошивка не подойдёт. К сожалению пока не могу выложить код полностью. Есть ли желание у кого-нибудь паять схему для закрытых исходников ?
Архитектура программы довольно простая - приведённый кусок кода полностью описывает поведение прошивки для выстрела.
Код:
#include "fire.h"
void setup_fire(void) {
StateFire = 0;
ots_cnt = 0;
make_bullet(); // подготовить пулю по cfg параметрам
}
// Логическое поведения оборудования для выстрелов 100Гц
void LogicFire(void)
{
switch (StateFire)
{
case WantPula:
// флаг BtFire кнопка Огонь отфильтованная от дребезга
if (( btFire > 0) || (btMIC > 0 )) {
StateFire = NeedPula; // запрос на выстрел обработан
}
break;
case NeedPula:
// Проверить наличие патронов в обойме и состояние жизни игрока
if ((0 == ammo_clip_in_game)||(1 == flOutGame)) {
// Вне игры или нет патронов
StateFire = OneFire; // отпусти курок :)
need_sound(SND_OSECHKA);
} else {
// есть патроны и в игре
StateFire = OutPula;
// между этими состояниями можно вставить
// паузу накачки лазера, определить тип выстрела
// (дольше держим сильнее выстрел и тд)
// или ещё какое нибудь расширение игры
};
break;
case OutPula:
// вычесть патрон из магазина
ammo_clip_in_game--;
// запуск пули только здесь
// и сюда можем попасть только с 0 == flFire
// биты пули выгружаются
// из remote_tx_data с мл разрядов
remote_tx_data = bullet_data;
// инициировать ИК выстрел
// передача в прерывании
remote_tx_state = TX_NEED;
flFire = 1;
// need_sound(SND_FIRE); // запускаем звук
// Звук и пуля могут мешать друг другу flFire = 1;
// на время выстрела работу со звуком останавливать
// неменять состояние подключения вЫходов таймеров
StateFire = EndPula;
break;
case EndPula:
// Пуля должна улететь полностью,
// чтобы начать следующую ИК посылку
if (1 == flFire) {
StateFire = EndPula;
} else {
// Пуля улетела, проверяем нет ли поражений
need_sound(SND_FIRE); // запускаем звук пули
if (1 == flEnemyFire) { // Да Получена Чужая пуля
// отработать паузу невозможности стрельбы
shok_time_cnt = 0;
StateFire = EnemyFireShok;
} else {
// Пуля улетела, и нет поражений
// отрабатываем темп стрельбы
temp_fire_cnt = 0;
StateFire = TempFire;
}
}
break;
case TempFire:
temp_fire_cnt++;
if (temp_fire_cnt > temp_fire)
{ // пауза кончилась, определяем режим стрельбы
// автомат, полуавтомат, кнопка внешняя
if ( rifle == RIFLE_AVTO){
StateFire = SequFire;
} else {
}
}
break;
case EnemyFireShok:
shok_time_cnt++;
if (shok_time_cnt > shok_time) {
// пауза кончилась
flEnemyFire = 0; // сбросить флаг
// Нужно обязательно отпустить курок, после шока
StateFire = OneFire;
}
break;
case OneFire:
if ( btFire > 0 ) {
StateFire = OneFire; // Нужно обязательно отпустить курок
} else {
StateFire = WantPula; // Ожидание
btMIC = 0; // сбрасываем флаг микрофона
};
ots_cnt = 0; // сбросить счётчик отсечки
break;
case SequFire:
if ( btFire > 0 ) {
if (ots_cnt > otsechka) { // отсечка кончилась
StateFire = OneFire;
} else {
StateFire = NeedPula;
ots_cnt ++;
#if DEBUG_TX == 1
putchar_(' '); // в начало строки
putchar_('o');putchar_(ots_cnt);putchar_(' ');
#endif
};
} else {
StateFire = WantPula; // отпустили курок
ots_cnt = 0; // сбросить счётчик отсечки
btMIC = 0; // сбрасываем флаг микрофона
};
break;
}; // case end
} // конец автомата выстрела