Выплескивание эмоций

Тема в разделе "Флудилка", создана пользователем alp69, 15 окт 2016.

  1. Airbus

    Airbus Радиохулиган Модератор

    Денег нема?
     
  2. NikitOS

    NikitOS Король шутов Администратор

    были.....
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Али сегодня 11.11.17 пугал страшной распродажей но что то я ничего интересного и нужного не нашел. :mad:
     
  4. NikitOS

    NikitOS Король шутов Администратор

    я ж говорю...хотел заказать да .....ж@@а
     
  5. akl

    akl Гуру

    хочу сделать симулятор клавиатуры на v-usb. взял готовый пример, немного уменьшил его (там было сразу несколько устройств - оставил только мышь и клавиатуру), usbconfig.h подправил как надо - компилится, но выдает предупреждения - ругается на несоответствие типов

    ../hidA8.c: In function 'usbFunctionSetup':
    ../hidA8.c:173:15: warning: assignment from incompatible pointer type
    ../hidA8.c:178:15: warning: assignment from incompatible pointer type
    ../hidA8.c: In function 'main':
    ../hidA8.c:276:4: warning: passing argument 1 of 'usbSendHidReport' from incompatible pointer type
    ../hidA8.c:194:6: note: expected 'unsigned char *' but argument is of type 'struct keyboard_report_t *'
    ../hidA8.c:277:4: warning: passing argument 1 of 'usbSendHidReport' from incompatible pointer type
    ../hidA8.c:194:6: note: expected 'unsigned char *' but argument is of type 'struct mouse_report_t *'



    Код (C++):
    // please see http://frank.circleofcurrent.com/index.php?page=hid_tutorial_1
    // the "usb_hid_rpt_desc.hid" file needs to be viewed with the HID Descriptor Tool from USB.org

    // required headers
    #include <avr/io.h>
    #include <avr/wdt.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <string.h>

    // V-USB
    #include "usbdrv.h"



    PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { //101
      0x05, 0x01,  // USAGE_PAGE (Generic Desktop)
      0x09, 0x06,  // USAGE (Keyboard)
      0xa1, 0x01,  // COLLECTION (Application)
      0x85, 0x01,  //  REPORT_ID (1)
      0x05, 0x07,  //  USAGE_PAGE (Keyboard)
      0x19, 0xe0,  //  USAGE_MINIMUM (Keyboard LeftControl)
      0x29, 0xe7,  //  USAGE_MAXIMUM (Keyboard Right GUI)
      0x15, 0x00,  //  LOGICAL_MINIMUM (0)
      0x25, 0x01,  //  LOGICAL_MAXIMUM (1)
      0x75, 0x01,  //  REPORT_SIZE (1)
      0x95, 0x08,  //  REPORT_COUNT (8)
      0x81, 0x02,  //  INPUT (Data,Var,Abs)
      0x95, 0x01,  //  REPORT_COUNT (1)
      0x75, 0x08,  //  REPORT_SIZE (8)
      0x81, 0x03,  //  INPUT (Cnst,Var,Abs)
      0x95, 0x06,  //  REPORT_COUNT (6)
      0x75, 0x08,  //  REPORT_SIZE (8)
      0x15, 0x00,  //  LOGICAL_MINIMUM (0)
      0x25, 0x65,  //  LOGICAL_MAXIMUM (101)
      0x05, 0x07,  //  USAGE_PAGE (Keyboard)
      0x19, 0x00,  //  USAGE_MINIMUM (Reserved (no event indicated))
      0x29, 0x65,  //  USAGE_MAXIMUM (Keyboard Application)
      0x81, 0x00,  //  INPUT (Data,Ary,Abs)
      0xc0,  // END_COLLECTION
      0x05, 0x01,  // USAGE_PAGE (Generic Desktop)
      0x09, 0x02,  // USAGE (Mouse)
      0xa1, 0x01,  // COLLECTION (Application)
      0x09, 0x01,  //  USAGE (Pointer)
      0xa1, 0x00,  //  COLLECTION (Physical)
      0x85, 0x02,  //  REPORT_ID (2)
      0x05, 0x09,  //  USAGE_PAGE (Button)
      0x19, 0x01,  //  USAGE_MINIMUM (Button 1)
      0x29, 0x03,  //  USAGE_MAXIMUM (Button 3)
      0x15, 0x00,  //  LOGICAL_MINIMUM (0)
      0x25, 0x01,  //  LOGICAL_MAXIMUM (1)
      0x95, 0x03,  //  REPORT_COUNT (3)
      0x75, 0x01,  //  REPORT_SIZE (1)
      0x81, 0x02,  //  INPUT (Data,Var,Abs)
      0x95, 0x01,  //  REPORT_COUNT (1)
      0x75, 0x05,  //  REPORT_SIZE (5)
      0x81, 0x03,  //  INPUT (Cnst,Var,Abs)
      0x05, 0x01,  //  USAGE_PAGE (Generic Desktop)
      0x09, 0x30,  //  USAGE (X)
      0x09, 0x31,  //  USAGE (Y)
      0x09, 0x38,  //  USAGE (Wheel)
      0x15, 0x81,  //  LOGICAL_MINIMUM (-127)
      0x25, 0x7f,  //  LOGICAL_MAXIMUM (127)
      0x75, 0x08,  //  REPORT_SIZE (8)
      0x95, 0x03,  //  REPORT_COUNT (3)
      0x81, 0x06,  //  INPUT (Data,Var,Rel)
      0xc0,  //  END_COLLECTION
      0xc0,  // END_COLLECTION
    };

    typedef struct
    {
       uint8_t report_id;
       uint8_t modifier;
       uint8_t reserved;
       uint8_t keycodes[6];
    } keyboard_report_t;

    typedef struct
    {
       uint8_t report_id;
       uint8_t buttons;
       int8_t x;
       int8_t y;
       int8_t wheel;
    } mouse_report_t;



    static uint8_t idle_rate = 500 / 4; // see HID1_11.pdf sect 7.2.4
    static uint8_t protocol_version = 0; // see HID1_11.pdf sect 7.2.6

    static keyboard_report_t keyboard_report;
    static mouse_report_t mouse_report;

    static keyboard_report_t keyboard_report_old;
    static mouse_report_t mouse_report_old;


    usbMsgLen_t usbFunctionSetup(uint8_t data[8])
    {
       // see HID1_11.pdf sect 7.2 and http://vusb.wikidot.com/driver-api
       usbRequest_t *rq = (void *)data;

       if ((rq->bmRequestType & USBRQ_TYPE_MASK) != USBRQ_TYPE_CLASS)
         return 0; // ignore request if it's not a class specific request

       // see HID1_11.pdf sect 7.2
       switch (rq->bRequest)
       {
         case USBRQ_HID_GET_IDLE:
           usbMsgPtr = &idle_rate; // send data starting from this byte
           return 1; // send 1 byte
         case USBRQ_HID_SET_IDLE:
           idle_rate = rq->wValue.bytes[1]; // read in idle rate
           return 0; // send nothing
         case USBRQ_HID_GET_PROTOCOL:
           usbMsgPtr = &protocol_version; // send data starting from this byte
           return 1; // send 1 byte
         case USBRQ_HID_SET_PROTOCOL:
           protocol_version = rq->wValue.bytes[1];
           return 0; // send nothing
         case USBRQ_HID_GET_REPORT:
           // check for report ID then send back report
           if (rq->wValue.bytes[0] == 1)
           {
             usbMsgPtr = &keyboard_report;
             return sizeof(keyboard_report);
           }
           else if (rq->wValue.bytes[0] == 2)
           {
             usbMsgPtr = &mouse_report;
             return sizeof(mouse_report);
           }
       
           else
           {
             return 0; // no such report, send nothing
           }
         case USBRQ_HID_SET_REPORT: // no "output" or "feature" implemented, so ignore
           return 0; // send nothing
         default: // do not understand data, ignore
           return 0; // send nothing
       }
    }

    // this function is used to guarantee that the data is sent to the computer once
    void usbSendHidReport(uchar * data, uchar len)
    {
       while(1)
       {
         usbPoll();
         if (usbInterruptIsReady())
         {
           usbSetInterrupt(data, len);
           break;
         }
       }
    }

    int main()
    {
       TCCR0 = 0b00000011;
       TIMSK = 0b00000001;

       wdt_enable(WDTO_2S);

       TCCR1B = _BV(CS12) | _BV(CS11); // timer is initialized, used to keep track of idle period

       usbInit(); // start v-usb
      usbDeviceDisconnect(); // enforce USB re-enumeration, do this while interrupts are disabled!
       _delay_ms(250);
      usbDeviceConnect();

      sei(); // enable interrupts

       uint8_t to_send = 1; // boolean, true for first time

       while (1)
       {
        wdt_reset();
         usbPoll();
     
         // set the report IDs manually
         keyboard_report.report_id = 1;
         mouse_report.report_id = 2;
     
     
         /*
          * this area is where you should set the movement
          * and button values of the reports using the input
          * method of your choice
          *
         */


     
         // determine whether or not the report should be sent
         if ((TCNT1 > ((4 * (F_CPU / 1024000)) * idle_rate) || TCNT1 > 0x7FFF) && idle_rate != 0)
         {// using idle rate
           to_send = 1;
         }
         else
         {// or if data has changed
           if (memcmp(&keyboard_report, &keyboard_report_old, sizeof(keyboard_report_t)) != 0)
           {
             to_send = 1;
           }
           else if (memcmp(&mouse_report, &mouse_report_old, sizeof(mouse_report_t)) != 0)
           {
             to_send = 1;
           }
         }
     
         usbPoll();
         if (to_send != 0)
         {
           // send the data if needed
           usbSendHidReport(&keyboard_report, sizeof(keyboard_report_t));
           usbSendHidReport(&mouse_report, sizeof(mouse_report_t));
       
           TCNT1 = 0; // reset timer
         }
     
         usbPoll();
     
         memcpy(&mouse_report_old, &mouse_report, sizeof(mouse_report_t));
         memcpy(&keyboard_report_old, &keyboard_report, sizeof(keyboard_report_t));
     
         to_send = 0; // reset flag
       }

       return 0;
    }
    то есть usbSendHidReport() принимает учар, а тут ему подсовывают адрес keyboard_report_t из структуры. Это какая-то ошибка, или все равно будет работать? если ошибка, то как исправить?

    вот так заткнул варнинги
    (uchar*)&keyboard_report

    надеюсь будет работать.
     
    Последнее редактирование: 12 ноя 2017
  6. NikitOS

    NikitOS Король шутов Администратор

    Почему бы не сменить лого форума
     

    Вложения:

    • screen1.png
      screen1.png
      Размер файла:
      241 КБ
      Просмотров:
      463
  7. akl

    akl Гуру

    доделал короче.

    [​IMG]

    теперь могу зафлудить себе весь комп. ну хоть плату не зря делал
     
    NikitOS нравится это.
  8. akl

    akl Гуру

    вопрос назрел:
    скоро мне возможно (если мозгов хватит) понадобится нормальный com-порт монитор, такой чтобы в нем можно было отправлять 16-ричные цифры, а не только буквы асция. Скачал Advanced Serial Port Monitor - он вроде очень классный, и на русском к тому же, но нехороший человек стоит полторы тыщи (за 300 например может и купил бы даже) и угрожает через 15 дней перестать работать соответственно. кряков не нашел, поэтому посоветуйте нормальную программу чем сами пользуетесь. Ардуиновский монитор же не умеет цифры слать?
     
  9. akl

    akl Гуру

    блин что-то начал поверхностно читать про уарт и затупил - можно ли отправить на атмегу по уарту значение 0х00?
     
  10. AlexU

    AlexU Гуру

    То что в Linux выполняется простой командой типа (отправка 4-ёх байт в 16-тиричной форме):
    Код (Bash):
    echo -ne '\x00\x22\x00\x15' > /dev/ttyACM0
    в Windows стоит 1500 руб...
    Можно.
     
  11. akl

    akl Гуру

    так если в UDR будет лежать нуль, то как атмега поймет что ей что-то пришло? впрочем пофиг, я еще даже не начал разбираться в этом уарте и скорее всего туплю.

    да подобных программ вроде куча в том числе бесплатных. поэтому и хочу чтобы посоветовали что-то конкретное и проверенное, чтобы не выбирать из тысяч вариантов
     
  12. AlexU

    AlexU Гуру

    По стартовому и стоповому битам.
     
  13. akl

    akl Гуру

    да, понял уже, там же встанет галочка в UCSRA. значит основная проблема в том, что среди символов асция нету значка со значением 0x00, поэтому надо посылать непосредственно цифры. ну либо впихивать функцию преобразования символов и отправлять обычными символами, но это отожрет много памяти.
     
  14. AlexU

    AlexU Гуру

    Есть -- символ '\0'.
     
    akl нравится это.
  15. akl

    akl Гуру

    только вот непонятно - если я его буду писать в каком-то простейшем ком-терминале (ардуиновском например), то не отправит ли он вместо 0x00 два символа '\' и '0' соответственно. :oops:
    или он нормально понимает все эти \n \t и прочие?
     
  16. rkit

    rkit Гуру

    Такого символа нет. Но правильный терминал покажет какой-нибудь заменитель.
     
  17. akl

    akl Гуру

    ну это если атмега пришлет на терминал ноль, то терминал его может отобразит как-то, но мне то надо наоборот - написать в терминале что-то, что придет на атмегу как 0x00
     
  18. AlexU

    AlexU Гуру

    Как отправить байт со значением 0х00 на атмегу через последовательный порт уже показал в сообщении #569. Но это возможно на Unix системах, как сделать тоже самое на Windows не знаю.

    PS: Вообще Windows самая не дружелюбная система для программистов, постоянно какие-то трудности и проблемы.
     
  19. akl

    akl Гуру

    к линуксу я не готов - недостаточно программист для этого. так что остается использовать терминал который умеет отправлять НЕХ. их куча, надо только выбрать нормальный. Щас посмотрел, у меня даже в телефоне терминал умеет отправлять НЕХ, так что и через блютус можно будет подрубить.
     
  20. Airbus

    Airbus Радиохулиган Модератор

    В гугле поищите их там сотни.Сейчас не могу сказать какие именно я не дома все попробуйте.Есть которые все шлют и HEX в том числе и символ конца строки автоматом.