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

    0

    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
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    /* IOCTL calls for E-Ink paper update */
    #define EPAPER_UPDATE_LOCAL 0x101         /** Update localarea */
    #define EPAPER_UPDATE_PART  0x102         /** ???              */
    #define EPAPER_UPDATE_FULL  0x103         /** Fully update     */
    #define EPAPER_UPDATE_DISPLAY_QT  0x120d  /** Update all display
    
    /* Helper FB update function */
    int epaper_update_helper(int fb, unsigned long int ioctl_call, void *mode)
    {
      if (framebuffer_descriptor >= 0)
      {
        errno=0;
        ioctl(fb, ioctl_call, mode);
    //    sleep_timer=sleep_timeout; // Reset sleep timer on every display refresh = we are not have any constantly refreshing display parts now!
        return errno;
      }
      return TRUE;
    }
    
    void epaperUpdate(__attribute__((unused)) unsigned long int ioctl_call, __attribute__((unused)) void *mode)
    {
      #ifndef __amd64
      int ioctl_result;
      #endif //__amd64
      TRACE("Called void epaperUpdate()\n");
      if (enable_refresh == FALSE)
      {
        TRACE("Display refresh was locked, IGNORED!\n");
        (void) ioctl_call;
        (void) mode;
        return;
      }
      #ifndef __amd64
      /* Иначе запись в видеопамять не успевает завершиться и получаем верхний левый угол новой картинки и нижний правый - прежней. */
    //  if (hw_platform != HW_PLATFORM_SIBRARY_GTK) {
    //    const struct timespec delay = {0, QT_REFRESH_DELAY};
    //    nanosleep(&delay, NULL);
    //  }
      ioctl_result=epaper_update_helper(framebuffer_descriptor, ioctl_call, mode);
      #ifdef debug
      if (ioctl_result != 0)
      {
        TRACE("Display refresh ioctl call FAILED %d (%s)\n", ioctl_result, strerror(ioctl_result));
        // GTK прошивка, обновление от Qt: 1 (Операция не позволяется)
        // Qt прошивка, обновление от GTK: 22 (Недопустимый аргумент)
      }
      #else
      (void) ioctl_result;
      #endif
      #endif
      return;
    }
    
    
    int detect_refresh_type (void)
    {
      int mode=3;
    #if 0
      struct mxcfb_update_data data = {
        .update_region =
        { .top = 0,
          .left = 0,
          .width = 1,
          .height = 1
        },
        .update_mode = UPDATE_MODE_FULL,
        .update_marker = 0,
        .waveform_mode = WAVEFORM_MODE_AUTO,
        .temp = TEMP_USE_AMBIENT,
        .flags = 0
      };
    #endif
      if (epaper_update_helper(framebuffer_descriptor, EPAPER_UPDATE_DISPLAY_QT, &mode) == 0)
      {
        refresh_type=REFRESH_NEW;
        TRACE("Display refresh was successed, new\n");
      }
      else if (epaper_update_helper(framebuffer_descriptor, EPAPER_UPDATE_FULL, &mode) == 0)
      {
        refresh_type=REFRESH_LEGACY;
        TRACE("Display refresh was successed, legacy\n");
      }
    //  else if (epaper_update_helper(framebuffer_descriptor, MXCFB_SEND_UPDATE_ORG, &data) == 0)
    //  {
    //    refresh_type=REFRESH_KOBO;
    //    TRACE("Display refresh was successed, kobo\n");
    //  }
      else
      {
        TRACE("Display refresh was not detected!\n");
      }
      return (refresh_type);
    }

    Источник:
    https://github.com/gheorghe-crihan/digma-e605-qt-apps-framework/blob/master/firstapp/digma_hw.c

    Не то, чтобы говно, просто код испещрён #if 0 и комментариями.

    Запостил: HoBorogHuu_nemyx, 25 Января 2026

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

    • Что это и для чего?

      Есть читалки на электронных чернилах типа Sibrary G5/G6/G10/G51, Digma e500/e600/q1000, Boeye и Ergo Book с теми же цифрами, что у Дигмы, Qumo Libro/Colibri, G-mini M6, Ritmix RBK700 и даже некий EvroMedia E-підручник. Все они на одном железе и с похожей прошивкой (Линукс с библиотеками GTK). Зроблены на процессоре Слмсунг S3C2416 рахит-тинктуры ARMv5TEJ (да, как у бабушкофона Philips Xenium, только у него вроде Медиатек, а не Гнусмас).

      Так вот, поскольку лепестрические чернила — птица гордая, пока не пнёшь, не полетит, прямо из прикладной программы нужно отправлять ioctl на обновление экрана (посреди кода для GTK или Qt, гы), причём есть варианты, обновить весь экран (медленно, но результат чистый) или только заданную область (быстро, но может появиться «грязь» на границе зоны обновления).
      Ответить
      • наколенное говно какое ))

        во-первых, экспортировать ioctl неприлично: надо делать SDK нормальный.
        во-вторых, эта задача решается же во всех оконных фреймворках: ты помечаешь область как "грязную", и тред в фоне ее обновляет. Я уверен, что `markDirty()` в Qt или `gdk_window_invalidate_region` в GTK что-то такое должны делать, не?
        Ответить
        • >Иначе запись в видеопамять не успевает завершиться и получаем верхний левый угол новой картинки и нижний правый

          какая синхронизация с обратным кодом луча ))
          Ответить
        • > надо делать SDK нормальный.

          Всё, что есть на данный момент, это sibrary-toolchain.tbz2 и «SZBOEYE SDK USER GUIDE-en.docx», которые лежали на китайском FTP, который уже не работает. Как я их нашёл и скачал, это отдельная история. Там в основном компилятор для armv5, а специальных библиотек для е-инка я не заметил, только рекомендацию в docx-файле делать всё через ioctl.

          Раскопки начал с этого бложика:
          https://omlin.blogspot.com/2011/02/qumo-libro.html?m=1

          Китайский фтп сдох, как я уже сказал, paccbet.ru тоже, свои файлы @omlin проебал после того, как разбил экран у читалки и потерял к читалкам интерес.
          Ответить
        • У этих читалок есть аудиокодек, только не у всех моделей есть динамик, надо наушники подключать. Из «SDK»:

          7.4 Audio driver
          7.4.1 Open driver
          fd = open("/dev/audio_sw", O_RDWR);

          7.4.2 Audio channel switch
          7.4.2.1 Playback from speaker
          ioctl (fd, 2, 0);
          7.4.2.2 Playback from headphone
          ioctl (fd, 3, 0);
          7.4.2.3 FM radio from headphone
          ioctl (fd, 5, 0);
          7.4.2.4 Capture from mic
          ioctl (fd, 4, 0);
          7.4.2.5 Capture from FM radio
          ioctl (fd, 11,0);
          7.4.2.6 Close all channel
          ioctl (fd, 6, 0);


          Бывает датчик ускорения (вероятно, чтобы автоматически менять ориентацию изображения при наклоне экрана). Из «SDK»:

          7.7 Gsensor driver

          #define AXIS_ACCEL_ON 1
          #define AXIS_ACCEL_OFF 2
          #define AXIS_ACCEL_READ 3

          Open gsensor:
          fd=Open(“/dev/axis_accel”,O_RDWR);

          Turn on the gsensor:
          ioctl(fd,AXIS_ACCEL_ON);

          Turn off the gsensor:
          ioctl(fd,AXIS_ACCEL_OFF);

          Get the state of ereader:
          ret = Ioctl(fd,AXIS_ACCEL_READ);

          the value of ret bits[4:2] dir_status:

          identify direction:
          dir_status = 0,unknow
          dir_status = 1, up
          dir_status = 2, down
          dir_status = 3, left
          dir_status = 4, right


          Часики:

          Open RTC driver:
          fd = open(“/dev/rtc0”, O_RDWR)
          RTC read :
          ioctl(fd, RTC_RD_TIME, &tm);

          RTC write :
          ioctl(fd, RTC_SET_TIME, &tm);

          Set alarm time :
          ioctl(fd, RTC_ALM_SET, &tm);

          Close RTC device:
          close(fd);
          Ответить
          • Светодиодик:

            7.11 LED driver

            #define GREEN_LED_ON 0x3
            #define GREEN_LED_OFF 0x4
            #define GREEN_LED_FLASH 0x5

            Open led:
            fd=open(“/dev/boeye_leds”,O_RDWR);

            Turn on the green led:
            ioctl(fd, GREEN_LED_ON);

            Turn off the green led:
            ioctl(fd, GREEN_LED_OFF);

            Flash the green led:
            ioctl(fd, GREEN_LED_FLASH);


            У некоторых моделей есть симка и вайфай. Надо ли говорить, что включение/выключение модема производится тоже через ioctl.
            Ответить
            • а не надо таймаут после ioctl кстати?
              Ответить
              • Судя по этому участку, иногда надо:

                /* Иначе запись в видеопамять не успевает завершиться и получаем верхний левый угол новой картинки и нижний правый - прежней. */
                //  if (hw_platform != HW_PLATFORM_SIBRARY_GTK) {
                //    const struct timespec delay = {0, QT_REFRESH_DELAY};
                //    nanosleep(&delay, NULL);
                //  }
                Ответить
                • Оцени, кстати:
                  HW_PLATFORM_SIBRARY_GTK
                  QT_REFRESH_DELAY

                  В одном участке кода! Что вижу, о том пою.
                  Ответить
                  • > SIBRARY
                    Меблятека
                    Ответить
                    • Тоже поржал. Я не знал о бренде Sibrary, пока не начал искать ПО для Дигмы, так я узнал, что Дигма и всё перечисленное (Qumo, Ergo, Ritmix и прочие суньхуньвчаи) — клоны Sibrary.
                      Ответить
                    • ЖЫРНАЯ как СЕБАРЕЯ

                      also

                      >RIBRARY

                      Am: We have elections every four years
                      Jap: I have erlection everly morlning
                      Ответить
                      • sjiba rarinu
                        Ответить
                      • Да, у нихонцев одноударное «р» вместо раскатистого, поэтому японцы путают «р» и «л». Нету у них отдельного «л» в качестве фонемы.

                        А китайцы «р» и «ж» не различают.
                        Ответить
    • Что ещё посмотреть? eView, например:

      https://github.com/S-trace/eView
      Ответить
    • Можно ещё делать
      #ifdef ___20260125T075043Z
      Получится такая-то цвс
      Ответить
    • Если вас тоже бесит «ИИ-обзор» во время поиска в гугле, который обычно не выдаёт ничего полезного, то есть простое решение.

      Оказывается, если в конце запроса добавить -nigger, то блок с ИИ пропадает.

      ГОЛОГУБ!!!
      Ответить
      • Есть два способа:
        1. Написать знак минуса и слово, которое нужно исключить (нужно подобрать слово, которого точно не будет в ответе). «ИИ» не умеет обрабатывать такие сложные запросы.

        2. Добавить любое стоп-слово, например, f-word или n-word. Есть риск, что оно появится в ответе.

        Метод «-nigger» же объединяет оба перечисленных выше метода для надёжности. Причём обычно даже без побочных эффектов, если только ты не ищешь ниггеров специально.
        Ответить
        • Обяхательно обзыватся? Можно же по человечески спросить
          https://i.postimg.cc/W1mqbrX3/how-to-disable-ai-in-google-search-Poisk-v-Google.png
          Ответить

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