LoadCell_STM32_SDRAM_v1
Dependencies: BSP_DISCO_F746NG DISCO-F746NG_SDRAMBlockDevice LCD_DISCO_F746NG mbed
Fork of LoadCell_STM32 by
main.cpp
- Committer:
- tapiov
- Date:
- 2018-03-08
- Revision:
- 7:30df32ea2d03
- Parent:
- 6:641b171407c9
File content as of revision 7:30df32ea2d03:
// LoadCell_STM32_SDRAM main // (C) Tapio Valli 2018-02-24 #include "mbed.h" #include "mbed_stats.h" #include "LCD_DISCO_F746NG.h" #include "SDRAM_DISCO_F746NG_BlockDevice.h" #include "FATFileSystem.h" // Physical block device, can be any device that supports the BlockDevice API #define BLOCK_SIZE 512 // SDRAM Block Device SDRAM_DISCO_F746NG_BlockDevice bd; // File system declaration FATFileSystem fs("fs"); // define the Serial object Serial pc(USBTX, USBRX); LCD_DISCO_F746NG lcd; typedef struct { uint16_t *array; size_t used; size_t size; } Array; // Prototypes extern void initArray(Array *a, size_t initialSize); extern void insertArray(Array *a, uint32_t newsize); extern void freeArray(Array *a); extern size_t string_parser(char *input, char ***word_array); extern void PlotData(uint32_t XCoordinate,uint32_t YCoordinate); extern void InitScreen(uint32_t BackGroundColor,uint32_t ForeGroundColor); extern void LCDWrite(uint32_t Line,char Str[],Text_AlignModeTypdef AlingMode); extern void CountDown(uint32_t millisecs); extern void SamplePoints(Array *Data,uint32_t NoOfPoints,uint32_t Period_us); extern void AvgAndPlotPoints(Array *Data,uint32_t NoOfPoints, uint32_t AvgSize); extern void BlockDeviceErase(); extern void MountFS(); extern void WriteData2FS(Array *Data,uint32_t NoOfPoints,uint32_t FileNumber); extern void ReadFile2Data(Array *Data,uint32_t NoOfPoints,uint32_t FileNumber); extern void DirListing(void); int main() { FMC_SDRAM_CommandTypeDef SDRAMCommandStructure; // Initialize SDRAM bd.init(); // Issue self-refresh command to SDRAM device SDRAMCommandStructure.CommandMode = FMC_SDRAM_CMD_SELFREFRESH_MODE; SDRAMCommandStructure.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; SDRAMCommandStructure.AutoRefreshNumber = 1; SDRAMCommandStructure.ModeRegisterDefinition = 0; if (bd.Sendcmd(&SDRAMCommandStructure) != HAL_OK) { error("BSP_SDRAM_Sendcmd FAILED\n"); } // Erase in any case for start BlockDeviceErase(); // Try to mount the filesystem MountFS(); char CmdBuffer[30]; char Arg[30]=" "; char Cmd[30]=" "; size_t n=0; uint32_t NoOfPoints=19200; uint32_t AvgSize=10; uint32_t Period_us=100; uint32_t Count_ms=1000; uint32_t MeasNumber=1; int err; mbed_stats_heap_t heap_stats; // Clear screen, set it up InitScreen(LCD_COLOR_BLACK,LCD_COLOR_WHITE); //Initialize data storage Array Data; initArray(&Data,NoOfPoints); // initially 19200 elements InitScreen(LCD_COLOR_BLACK,LCD_COLOR_WHITE); LCDWrite(5,"Ready.",CENTER_MODE); while (!((strcmp(Cmd,"quit")==0)&&(n==1))) { // Print Ready and current settings pc.printf( "Ready. Settings are Points=%u, Avg=%u, Period_us=%u, " "Count_ms=%u. Sampling will take apprx. %.3f secs\r\n", NoOfPoints,AvgSize,Period_us,Count_ms, (float)(NoOfPoints*Period_us/1000000.0)); mbed_stats_heap_get(&heap_stats); pc.printf("Current heap = %lu Max heap = %lu\r\n", heap_stats.current_size,heap_stats.max_size); pc.gets(CmdBuffer,30); pc.printf("I got %s \r\n", CmdBuffer); strcpy(Cmd," "); strcpy(Arg," "); // Parse command and possible numeric arg char s[] = "Initial string"; char ** word_array=NULL; strcpy(s,CmdBuffer); n=string_parser(s,&word_array); for ( size_t i=0;i<n;i++) { if (i==0) {strcpy(Cmd,word_array[i]);} if (i==1) {strcpy(Arg,word_array[i]);} if (i>1) {pc.printf("Wrong number of arguments \r\n");} } pc.printf("Cmd = %s Arg = %s \r\n",Cmd,Arg); for ( size_t i=0;i<n;i++) free( word_array[i] ); free(word_array); // Branch based on command // meas: Sample and plot a data set if((strcmp(Cmd,"meas")==0)&&(n==1)) { // Countdown CountDown(Count_ms); // Sample & plot data one time SamplePoints(&Data,NoOfPoints,Period_us); AvgAndPlotPoints(&Data,NoOfPoints,AvgSize); WriteData2FS(&Data,NoOfPoints,MeasNumber); MeasNumber++; //-- implement http server with fs as storage //-- connect and pull data from there //-- implement disk init as functions & commands } // setpoints: Adjust sampled points else if((strcmp(Cmd,"setpoints")==0)&&(n==2)) { // Allocate more or less data space NoOfPoints=(uint32_t) strtol(Arg,NULL,10); pc.printf("Old Data size is %u New NoOfPOints = %u \r\n",Data.size,NoOfPoints); insertArray(&Data,NoOfPoints); pc.printf("New Array size is %u \r\n",Data.size); } // setavg: Adjust average amount in samples else if((strcmp(Cmd,"setavg")==0)&&(n==2)) { AvgSize=(uint32_t) strtol(Arg,NULL,10); } // setperiod: Adjust sample period in us else if((strcmp(Cmd,"setperiod")==0)&&(n==2)) { Period_us=(uint32_t) strtol(Arg,NULL,10); } // setcount: Adjust countdown period in ms else if((strcmp(Cmd,"setcount")==0)&&(n==2)) { Count_ms=(uint32_t) strtol(Arg,NULL,10); } // dir: List files else if((strcmp(Cmd,"dir")==0)&&(n==1)) { DirListing(); } // quit: Exit on next while else if((strcmp(Cmd,"quit")==0)&&(n==1)) { // Do nothing yet } else { pc.printf("Wrong command or argument \r\n"); } } // Free memory after quit freeArray(&Data); // Tidy up filesystem pc.printf("Unmounting filesystem."); fflush(stdout); err = fs.unmount(); pc.printf("%s\n", (err < 0 ? "Fail :(" : "OK")); if (err < 0) { error("error: %s (%d)\n", strerror(-err), err); } // Print informative messages InitScreen(LCD_COLOR_BLACK,LCD_COLOR_WHITE); LCDWrite(5,"Stop.",CENTER_MODE); pc.printf("Exit. Data freed. Stop. \r\n"); // Infinite loop while(1) { // Do nothing } }