embedded smtf7 based scope
Dependencies: BSP_DISCO_F746NG_patch_fixed mbed
main.cpp
- Committer:
- the_sz
- Date:
- 2015-11-18
- Revision:
- 0:0babd18ae684
File content as of revision 0:0babd18ae684:
#include "mbed.h" #include "stm32746g_discovery_lcd.h" #include "Interface.h" DigitalOut led(LED1); Serial serial(PA_9,PB_7); // serial 1 AnalogIn analogIn1(A0); AnalogIn analogIn2(A1); VALUES_STRUCT buffer[BUFFER_SIZE]; uint8_t commandBuffer[100]; uint32_t commandLength; void sendBuffer(uint8_t *buffer,uint32_t length) { while (length>0) { serial.putc(*buffer); buffer++; length--; } } void sendCommand(HEADER_TYPE_ENUM type,uint8_t *buffer,uint32_t length) { HEADER_STRUCT header; header.magic=HEADER_MAGIC; header.type=type; header.length=length; sendBuffer((uint8_t *)&header,sizeof(header)); sendBuffer(buffer,length); } bool readWithTimeout(uint8_t *buffer) { uint32_t counter; counter=0; while (counter<10000) { if (serial.readable()) { (*buffer)=serial.getc(); return true; } wait_us(50); counter++; } // re-init serial port serial.baud(115200); return false; } HEADER_TYPE_ENUM readCommand(void) { HEADER_STRUCT *header; uint32_t index; HEADER_TYPE_ENUM type; for (index=0;index<sizeof(HEADER_STRUCT);index++) { if (readWithTimeout(&commandBuffer[index])==false) return HT_NONE; } header=(HEADER_STRUCT *)commandBuffer; if (header->magic!=HEADER_MAGIC) return HT_NONE; type=(HEADER_TYPE_ENUM)header->type; if (header->length>0) { commandLength=header->length; for (index=0;index<commandLength;index++) { if (readWithTimeout(&commandBuffer[index])==false) return HT_NONE; } } return type; } int main() { int32_t index; int32_t indexPrevious; int32_t stop; HEADER_TYPE_ENUM type; bool capture; float triggerLevel; uint8_t triggerMode; uint16_t delay; bool triggered; serial.baud(115200); BSP_LCD_Init(); BSP_LCD_DisplayOff(); capture=false; triggerLevel=0.0; triggerMode=TM_NONE; delay=0; for (;;) { if (serial.readable()) { type=readCommand(); switch (type) { case HT_INFO_REQUEST: { INTERFACE_INFO_RESPONSE_STRUCT InfoResponse; memset(&InfoResponse,0,sizeof(InfoResponse)); InfoResponse.versionMajor=1; InfoResponse.versionMinor=0; snprintf(InfoResponse.name,sizeof(InfoResponse.name),"Scope"); sendCommand(HT_INFO_RESPONSE,(uint8_t *)&InfoResponse,sizeof(InfoResponse)); } break; case HT_CAPTURE_START: { INTERFACE_CAPTURE_START_STRUCT *captuerStart; if (commandLength==sizeof(INTERFACE_CAPTURE_START_STRUCT)) { captuerStart=(INTERFACE_CAPTURE_START_STRUCT *)commandBuffer; triggerLevel=captuerStart->triggerLevel; triggerMode=captuerStart->triggerMode; delay=captuerStart->delay; // seems our measurement loop needs 5 µs per loop if (delay>5) delay-=5; capture=true; } } break; } } if (capture==true) { led=1; // dummy read for nicer results for (index=0;index<5;index++) { analogIn1.read(); analogIn2.read(); } stop=0; index=0; indexPrevious=0; triggered=false; for (;;) { buffer[index].values[0]=analogIn1.read(); buffer[index].values[1]=analogIn2.read(); // check for trigger if ((triggered==false) && (index>(BUFFER_SIZE/2))) { // we trigger only on channel 1 if ((triggerMode & TM_RAISING)!=0) if (buffer[indexPrevious].values[0]<triggerLevel) if (buffer[index].values[0]>=triggerLevel) triggered=true; if ((triggerMode & TM_FALLING)!=0) if (buffer[indexPrevious].values[0]>triggerLevel) if (buffer[index].values[0]<=triggerLevel) triggered=true; if (triggered==true) stop=(index + (BUFFER_SIZE / 2)) % BUFFER_SIZE; } indexPrevious=index; index++; if (index>=BUFFER_SIZE) index=0; if (index==stop) break; wait_us(delay); } led=0; capture=false; if ((triggered==true) || ((triggerMode & TM_AUTO)!=0)) { HEADER_STRUCT header; header.magic=HEADER_MAGIC; header.type=HT_DATA; header.length=sizeof(buffer); // send header sendBuffer((uint8_t *)&header,sizeof(header)); // send part 1 sendBuffer((uint8_t *)&buffer[stop],((BUFFER_SIZE-stop)*sizeof(VALUES_STRUCT))); // send part 2 if (stop>0) sendBuffer((uint8_t *)&buffer[0],(stop*sizeof(VALUES_STRUCT))); } else sendCommand(HT_DATA,(uint8_t *)&buffer,0); } } }