Няшная / Говнокод #9363 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
#define COMMAND_MARKER		'\x1B'
#define COMMAND_SET			'='
#define COMMAND_XOR			'^'
#define COMMAND_OR			'|'
#define COMMAND_AND			'&'

void usbWriteOut(uchar *data, int len)
{
	while(len--) {
		uchar c = *data;
		buf[0] = buf[1];
		buf[1] = buf[2];
		buf[2] = buf[3];
		buf[3] = c;
		
		if(buf[0] == COMMAND_MARKER) {
			uint8_t val = (hex2u(buf[2]) << 4) | hex2u(buf[3]);
			if(buf[1] == COMMAND_SET) {
				colorData = val;
			}
			else if(buf[1] == COMMAND_XOR) {
				colorData ^= val;
			}
			else if(buf[1] == COMMAND_OR) {
				colorData |= val;
			}
			else if(buf[1] == COMMAND_AND) {
				colorData &= ~val;
			}
		}
	}
}

Простой баг оказался крайне подлым!
При тестировании девайса терминалкой и чепятании команды ручками, каждый символ уходил в отдельном пакете и создавалось впечатление, что всё работает.
После чего девайс был собран с применением большого количества термоклея, так что исправление бага оказалось совершенно непростым занятием >_<

Запостил: odmin odmin, (Updated )

Комментарии (2) RSS

  • какой то странный код
    ну, data не инкрементируется, это понятно
    но buf - нечто циклическое, где [0] - tag, [1] - opcode, [2],[3] - типа аргументы, аргументы при следующих итерациях могут стать опкодами или маркерами? точно len -= 4 не подразумевалось?

    ну и да, ваш компилятор не поддерживает конструкцию switch (buf[1])?
    Ответить
    • Не, len -= 4 не катит, т.к. в пакете может прийти от 1 до 8 байт, что не обязательно кратно размеру команды, поэтому данные и буферизуются. Если в потоке есть маркер, то следующие 3 байта железно команда.
      Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8