void FlightSimClass::update(void) { uint8_t len, maxlen, type, buf[64], *p; uint16_t id; while (recv(buf)) { p = buf; maxlen = 64; do { len = p[0]; if (len < 2 || len > maxlen) break; switch (p[1]) { case 0x02: // write data if (len < 10) break; id = p[2] | (p[3] << 8); type = p[4]; if (type == 1) { FlightSimInteger *item = FlightSimInteger::find(id); if (!item) break; item->update(*(long *)(p + 6)); } else if (type == 2) { FlightSimFloat *item = FlightSimFloat::find(id); if (!item) break; item->update(*(float *)(p + 6)); } break; case 0x03: // enable/disable if (len < 4) break; switch (p[2]) { case 1: request_id_messages = 1; case 2: enable(); frameCount++; break; case 3: disable(); } } p += len; maxlen -= len; } while (p < buf + 64); } if (enabled && request_id_messages) { request_id_messages = 0; for (FlightSimCommand *p = FlightSimCommand::first; p; p = p->next) { p->identify(); } for (FlightSimInteger *p = FlightSimInteger::first; p; p = p->next) { p->identify(); // TODO: send any dirty data } for (FlightSimFloat *p = FlightSimFloat::first; p; p = p->next) { p->identify(); // TODO: send any dirty data } } }
void FlightSimClass::update(void) { uint8_t len, maxlen, type, *p, *end; union { uint8_t b[4]; long l; float f; } data; usb_packet_t *rx_packet; uint16_t id; while (1) { if (!usb_configuration) break; rx_packet = usb_rx(FLIGHTSIM_RX_ENDPOINT); if (!rx_packet) break; p = rx_packet->buf; end = p + 64; maxlen = 64; do { len = p[0]; if (len < 2 || len > maxlen) break; switch (p[1]) { case 0x02: // write data if (len < 10) break; id = p[2] | (p[3] << 8); type = p[4]; if (type == 1) { FlightSimInteger *item = FlightSimInteger::find(id); if (!item) break; #ifdef KINETISK data.l = *(long *)(p + 6); #else data.b[0] = p[6]; data.b[1] = p[7]; data.b[2] = p[8]; data.b[3] = p[9]; #endif item->update(data.l); } else if (type == 2) { FlightSimFloat *item = FlightSimFloat::find(id); if (!item) break; #ifdef KINETISK data.f = *(float *)(p + 6); #else data.b[0] = p[6]; data.b[1] = p[7]; data.b[2] = p[8]; data.b[3] = p[9]; #endif item->update(data.f); /// JB } else if (type == 3) { FlightSimEvent *item = FlightSimEvent::find(id); if (!item) break; #ifdef KINETISK data.l = *(long *)(p + 6); #else data.b[0] = p[6]; data.b[1] = p[7]; data.b[2] = p[8]; data.b[3] = p[9]; #endif item->update(data.f); } else if (type == 4) { FlightSimData *item = FlightSimData::find(id); if (!item) break; item->update(((char*)p)+6,len-6); /// JB End } break; case 0x03: // enable/disable if (len < 4) break; switch (p[2]) { case 1: request_id_messages = 1; /* no break */ case 2: enable(); frameCount++; break; case 3: disable(); } } p += len; maxlen -= len; } while (p < end); usb_free(rx_packet); } if (enabled && request_id_messages) { request_id_messages = 0; for (FlightSimCommand *p = FlightSimCommand::first; p; p = p->next) { p->identify(); } /// JB for (FlightSimEvent *p = FlightSimEvent::first; p; p = p->next) { p->identify(); } for (FlightSimData *p = FlightSimData::first; p; p=p->next) { p->identify(); } /// JB End for (FlightSimInteger *p = FlightSimInteger::first; p; p = p->next) { p->identify(); // TODO: send any dirty data } for (FlightSimFloat *p = FlightSimFloat::first; p; p = p->next) { p->identify(); // TODO: send any dirty data } } }