- // Store the last received command
- memcpy(¤t_response, UC, sizeof(UsbCommand));
- received_command = UC->cmd;
-/*
- // Maybe it's a response:
- switch(current_command) {
- case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:
- if (UC->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response;
- int i;
- for(i=0; i<48; i++) sample_buf[i] = UC->d.asBytes[i];
- received_command = UC->cmd;
- return;
- case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K:
- case CMD_DOWNLOADED_SIM_SAMPLES_125K:
- if (UC->cmd != CMD_ACK) goto unexpected_response;
- // got ACK
- received_command = UC->cmd;
- return;
- default:
- unexpected_response:
-
- if(UC->cmd != CMD_ACK)
- PrintAndLog("unrecognized command %08x \n", UC->cmd);
- else
- memcpy(¤t_response, UC, sizeof(UsbCommand));
- received_command = UC->cmd;
- }
+
+ storeCommand(UC);
+
+}
+/**
+ * @brief storeCommand stores a USB command in a circular buffer
+ * @param UC
+ */
+void storeCommand(UsbCommand *command)
+{
+ if(cmd_head == cmd_tail)
+ {
+ //If these two are equal, we're about to overwrite in the
+ // circular buffer.
+ PrintAndLog("WARNING: Command buffer about to overwrite command! This needs to be fixed!");
+ }
+ //Store the command at the 'head' location
+ UsbCommand* destination = &cmdBuffer[cmd_head];
+ memcpy(destination, command, sizeof(UsbCommand));
+
+ //Also, if cmd_tail is still -1 because the buffer was
+ // previously empty, set it to head
+ if(cmd_tail < 0) {
+ cmd_tail = cmd_head;
+ }
+
+ cmd_head++; //increment head
+ cmd_head %= CMD_BUFFER_SIZE;//wrap around
+
+}
+/**
+ * @brief getCommand gets a command from an internal circular buffer.
+ * @param response location to write command
+ * @return 1 if response was returned, 0 if nothing has been received