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
}
}
