Forum: Compiler & IDEs USB GenericHID mit LUFA -?Datenempfang verarbeiten??


von delicious_cake (Gast)


Lesenswert?

Hallo

Ich arbeite an einem kleinen Projekt mit dem AT90USB162 das vom PC per 
USB-Verbindung einige Aufgaben/Daten geschickt bekommt und diese in den 
internen Flash speichern soll um spaeter ohne aktive USB verbindung die 
Daten zu verarbeiten. Als USB Stack verwende ich LUFA. Meinen bisherigen 
Programmcode habe ich schon mit LUFA ClassDriver Demo Code GenericHID 
(ClassDriver steht für die HighLevel Variante)zusammengeführt. Bis jetzt 
laesst sich auch alles ohne Fehler und Warnungen compilieren.

Meine Fragen:
1.Wie setzte ich den Datenempfang geschickt um? Mit Zugriffen auf den 
Flash habe ich schon gearbeitet. Die Speicherung selbst stellt also kein 
Problem dar.
2.Wie kann ich Daten senden? (z.B. Messergebnisse, ...)



Hier zwei Ausschnitt aus dem LUFA Demo Code:

1.Das Hauptprogramm (unveraendert)
1
int main(void)
2
{
3
  SetupHardware();
4
  
5
  LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
6
  sei();
7
  
8
  for (;;)
9
  {
10
    HID_Device_USBTask(&Generic_HID_Interface);
11
    USB_USBTask(); //ist das zur USB Funktionalitaet?
12
  }
13
}


2.Der Datenempfangstask: (unveraendert)
1
void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
2
{
3
  if (USB_DeviceState != DEVICE_STATE_Configured)
4
    return;
5
6
  Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
7
  
8
  if (Endpoint_IsReadWriteAllowed())
9
  {
10
    uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
11
    uint8_t  ReportID     = 0;
12
    uint16_t ReportINSize = 0; //Standardmaeßig = 8
13
14
15
/* diese Zeile hat etwas mit dem Datensenden zu tun. Soweit ich verstanden
16
habe, wird hier aber nur 0 in jedes Byte von ReportINData geschrieben.*/
17
    memset(ReportINData, 0, sizeof(ReportINData)); 
18
19
20
// Diese Zeile verstehe ich überhaupt nicht
21
    bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, REPORT_ITEM_TYPE_In, ReportINData, &ReportINSize);
22
// Das ist klar.
23
    bool StatesChanged     = false;
24
// Das verstehe ich auch nicht.
25
    bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));
26
    
27
28
/*wenn ich das richtig verstanden habe, dann wird hier überprüft, ob Daten
29
zum abholen bereit stehen. wenn ja, wird StatesChanged = 1 und die neuen
30
Daten werden in ReportINData geschrieben.*/
31
    if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
32
    {
33
      StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
34
      memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
35
    }
36
37
38
/*hier dürfte dann, wenn einmal daten empfangen wurden, immer wieder diese
39
Daten wieder zurück geschickt werden, bis Neue kommen. Dann werden die neuen gesendet*/
40
    if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed))
41
    {
42
      HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount;
43
44
      Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
45
46
      if (ReportID)
47
        Endpoint_Write_Byte(ReportID);
48
49
      Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NO_STREAM_CALLBACK);
50
      
51
      Endpoint_ClearIN();
52
    }
53
  }
54
}

: Verschoben durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.