1. Си / Говнокод #9363

    +132

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 09 Февраля 2012

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

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

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

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