Объединение двоичных представление трех чисел

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

Здравствуйте!
Задача такая. Есть три числа:
char id[] = "89";
char team = '3';
char dmg[] = "100";(в таблице представлено как 1111)

Нужно перевест икаждое в двоичную систему, а после объединить в один 14-битный код.

89 - 1011001
3 - 11
100 - 1111

Нужно получить код:
01011001111111

Как того добиться на ардуине?

Есть библиотеки для перевод числа в другую систему счисления? вообщем-то если будет библиотека такая, то я сам дальше разберусь)
 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Во-первых, не парить себе мозг переводом чисел из одной системы в другую, потому что отображение таких чисел - это для удобства, для человека. Для МК пофиг в какой системе счисления задано число, он оперирует только двоичными данными и не знает, что эти означает. Самое главное, нужно точно знать позиционно, какой параметр куда нужно добавить. Например, это можно сделать так:

 

unsigned long code_value;

/* Номер команды занимает 2 бита */
#define TEAM_ID_BITS_COUNT (2)
/* Код повреждения занимает 4 бита */
#define DAMAGE_VALUE_BITS_COUNT (4)

unsigned long formCode(byte playerId, byte teamId, byte damageValue)
{
  unsigned long result = playerId;
  result <<= TEAM_ID_BITS_COUNT;      // Освобождаем место под teamId
  result |= teamId;
  result <<= DAMAGE_VALUE_BITS_COUNT; // Освобождаем место под damageValue
  result |= damageValue;
  return result;
}

void setup() {
  code_value = formCode(89, 3, 15);
}

void loop() {
}

Здесь нет проверки на правильность длины каждой составляющей, потому, например, если задать код команды больше 3, код получится на выходе некорректный.

Для контроля выводить в Serial в HEX виде и проверять правильность.

Кстати, 100 - 1111 это ни в какие ворота не лезет ;) Потому что 1111 - это 15 (десятичное).

 

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

О, спасибо! Я еще не освоился с битовыми операциями, не увидел такой возможности)
А по поводу урона и то что 100 - это 1111. Это правило протокола milesTag2.
http://www.lasertagparts.com/mtformat-2.htm
урон от 1 до 100 закодирован 4 битами.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Урон тогда можно закодировать (добавить массив) и оставить от 1 до 100 (для удобства и чтобы не ошибаться), хотя я слабо себе представляю, что будет, если задать, например, 80 (брать как 100 или как 75). В общем это уже совсем другая история, как реализовать.

По поводу 100 - 1111, в условиях задачи про это мутно написано, потому я про это и сказал. Это еще хорошо, что я в теме, а если бы не был, то ни за что бы не догадался ;)

 

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

=)))
Я сделал заголовочный файл. В него прописал через #define все вариации урона и соответствующий код.
Потом в зависимости от типа игры, можно будет выбирать урон для моего тагера.
Вообще тагер уже стреляет. Благодаря тебе) Сейчас нужно писать принятие сигналов. Эта задачка обширнее, чем стрельба)
 

#define      DMG1       B0000
#define      DMG2       B0001
#define      DMG4       B0010
#define      DMG5       B0011
#define      DMG7       B0100
#define      DMG10      B0101
#define      DMG15      B0110
#define      DMG17      B0111
#define      DMG20      B1000
#define      DMG25      B1001
#define      DMG30      B1010
#define      DMG35      B1011
#define      DMG40      B1100
#define      DMG50      B1101
#define      DMG75      B1110
#define      DMG100     B1111

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

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

 

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

Оружие стреляет кодом по протоколу MilesTag2. Скетч тут.