Jump to content

SD-Card read&write - HowTo - Solved


Phatline
 Share

Recommended Posts

lets start... since i dont get anywhere the last days, trial and error, youtube, try to understand file.c, hard stuff,

 

Now I start to document the newbe way to awarness... ok I will expect this all --- so no proof if this is true or false...

 

Problem:

the Blueprint for SD-Card - Filemanagement is: SEQV4(SVN) in all Variants,

too bad that that app is complex10 && because off its complexity the code is diffused as functions on different locations - and are referenced (#include) in the main-loop (app.c)

so take a look at the top of the app.c:

#include "file.h"
#include "seq_file.h"
#include "seq_file_b.h"
#include "seq_file_g.h"
#include "seq_file_c.h"
#include "seq_file_gc.h"
#include "seq_file_hw.h"
#include "seq_file_m.h"
#include "seq_file_s.h"
#include "seq_file_bm.h"

file.h is a hEADER-File, all what is in there will be copied from the compiler in the app.c

i found there: definitions, types, prototypes which are importend for the FUNCTION "file.c"

--without these head you can CALL but nobody will hear...nobody will do, nothing will happen exept a error message from the compiler "not declared difintion..."

 

file.c :is a Function that is specified under "Modules"

if i write in app.c "FILE_CheckSDCard" the Function File.c get called "CheckSDCard"

File.c do then with that something and returns it something to app.c... all this Commands begin with "FILE_"

 

file.mk: aka MakeFile, normally when you build an hex-file you ask your compiler to "make" it, in this file -as far as i understand - is describet how-2-make-it...

I assume that i dont have to change anything in file.c/h/mk

 

 

ok now whats that, take a look @

seq_file.h,   seq_file_b.h,   seq_file_bm.h...

seq_file.c,   seq_file_b.c,   seq_file_bm.c...

 

I found in different application similar files (mbcv_file.h), I assume these are User/app files.

by looking in the Header files, they differ a bit some store Banks, some System Variables, but they are almost identical (..._file_a/a/c/d/e.h)

except for the first one those ..._file.hÅ›

it define possible Error Codes that could come back if i call these _file_a/a/c/d/e.hÅ›

// used by seq_file_b.c
#define SEQ_FILE_B_ERR_INVALID_BANK    -128 // invalid bank number
#define SEQ_FILE_B_ERR_INVALID_GROUP   -129 // invalid group number

// used by seq_file_m.c
#define SEQ_FILE_M_ERR_INVALID_BANK    -144 // invalid bank number
#define SEQ_FILE_M_ERR_INVALID_MAP     -146 // invalid map number

// used by seq_file_bm.c
#define SEQ_FILE_BM_ERR_FORMAT         -156 // invalid config file format
#define SEQ_FILE_BM_ERR_READ           -157 // error while reading file (exact error status cannot be determined anymore)

---hm lets take a look @ app.c again, search for e.g.

SEQ_FILE_B_ERR_INVALID_BANK, SEQ_FILE_B_ERR_INVALID_GROUP, SEQ_FILE_BM_ERR_FORMAT

...nope nothing - am confuzed...

 

but results for:

SEQ_FILE_B_.... like this: (SEQ_FILE_B_ none error)

...u8 bank;
   for(bank=0; bank<4; ++bank)
	  str1[7+bank] = SEQ_FILE_B_NumPatterns(bank) ? ('1'+bank) : '-';

by searching the file.c module documentation i dont found any "NumPatterns"

I assume seq_file and file are more seperatet then i thougt (up to now i dont any clue anyway, trial and error)

.... ok then take a look @ the seq_file_b.c; search for that "NumPatterns"

/////////////////////////////////////////////////////////////////////////////
// Returns number of patterns in bank  // Returns 0 if bank not valid
s32 SEQ_FILE_B_NumPatterns(u8 bank){
  if( (bank < SEQ_FILE_B_NUM_BANKS) && seq_file_b_info[bank].valid )
    return seq_file_b_info[bank].header.num_patterns;
  return 0;}

ok i can see clear now,

the seq_file_b.h define that error messages, that are User/App coded in the seq_file_b.c - these messages are callback messeges, which must be specified...

 

let me proove this by searching the seq_file.c   yep here are those error messages:

/////////////////////////////////////////////////////////////////////////////
// create a complete bank file
// returns < 0 on errors (error codes are documented in seq_file.h)
s32 SEQ_FILE_B_Create(char *session, u8 bank){
    if( bank >= SEQ_FILE_B_NUM_BANKS )
    return SEQ_FILE_B_ERR_INVALID_BANK;

..._file_a/b/c/d.c are specific Memory Tasks, like SystemBank, PatternBank,SongBank, NameBank....... whatever...

..._file.c manage all Memory Tasks, after booting or loading a "Master Preset" it comunicate with all Banks,

             i expect this "manager" is needet to avoid multiple acces on the sdcard...

app.c then dont have to do much...

 

so now its time to code something stripped down, write a variable array on SD-Card & Recall it... & lets proove what is right and what not...

lets say if we need this triangle "dreifaltigkeit" or it can be done with app.c and _file_a/b/c/d.cÅ›

Edited by Phatline
Link to comment
Share on other sites

You are seeing the complexities of the build process for the MidiBox software.  When you start digging deeper into the other projects, you will find out that much of the code found in the trunk/modules directories is also shared between all of the projects in the trunk/apps and the trunk/sequencers directories.  The makefile system used here allows for this sharing because of how Thorsten has put #include files into the make system rules.  You don't need to know how it works, just be aware that if you reference a "#include "file.h"" in your app.c file, that it is reading the file in the trunk/modules/file directory. 

 

Thorsten has also used a standard for naming functions based on the file names where the code can be found.  As you found out if the function name starts with FILE_ then there is a pritty good chance you will find the function code in the trunk/modules/file/file.c file.  If the function name starts with SEQ_CHORD then look in trunk/apps/sequencers/midibox_seq_v4/core/seq_chord.c file.

 

You are having some problems understanding some of the basic "C" programming language being a beginner.  We programmers have all gone thru this at some point in our lives.  Your problem with getting the "declaration error" has to do with the compiler not knowing what variables are being passed and returned for the specific function that you called.  There are 2 ways you can keep the error from happening.  1)have the function code placed in the file before the call to the code is made or 2)declare the function at the top of your file by having it shown outside of a function and terminated with a ";" character.   When you include the file.h file in any .c file, these function declarations get defined for you because they are found in the .h file.

 

Respectfully, Pete

Edited by kpete
Link to comment
Share on other sites

hey pete thx 4 the clarification :happy:

 

lets step forward

with that little overview (studying this files) i came to the point that i have to think about "how my application" should work and not SEQV4...

like i did bevore, step by step function to function... (anyway that stripdown-trial and understand-trial was good to get a bit overview)

  

so first i have to find out what i need in the UserInterace (ui is in app.c)

app.c 1st Menu Page:

LoadBankNumber --- LoadBankName --- StoreBankNumber --- StoreBankName --- Store --- Load

 

Then How many Banks i will need: 511

 

What about the Systemconfig? - ok let say it is the first Bank (0).

 

turn on the device, proove SD-CARD... if there is no Data, it has to be made, (make files, fill with Defaults, 4 matrix e.g. a 1:1 routing)

For this case the SEQ app.c "void SEQ_TASK_Period1S(void){....   " is a good starting point, it formats the Card, and call seq_file_.... to make files... a really good point to start :excl:

 

so whats then on the SD-Card?

 

|CARD-FILES:_ | CONTENT_____________________________

| 0.b                     | u8 SysVariable[127]

|                           |

| 1.b                     | u8 MtxPart[8][8][8]

|                           | u8 SongName[8]

|                           | u8 UI-Variables[127]

|                           | u8 ChordSet[6][6]

|                           | u8 PCSet[16][16]

|                           |

| 2.b                     | u8 MtxPart[8][8][8]

|   .                       | u8 SongName[8]

|   .                       | u8 UI-Variables[127]

|   .                       | u8 ChordSet[6][6]

|   .                       | u8 PCSet[16][16]

|   .                       |

| 511.b                 | u8 MtxPart[8][8][8]

|                           | u8 SongName[8]

|                           | u8 UI-Variables[127]

|                           | u8ChordSet[6][6]

|                           | u8 PCSet[16][16]_________________________

So the Filename is a interger: that is good 4: to sort the songs better on Computer... to select them better in the LOAD/STORE MenuePage.

 

So i have to write/adapt following addition files

tm_file_bank.c

tm_file_bank.h

tm_file_system.c

tm_file_system.h

 

tm_file.c/h ...  keep the hirachy flat... i try to make that in app.c...

 

next is to define the file path stored on the the sd card, i decidet to put all files in a folder called "tm" locatet in root: root/tm/

Edited by Phatline
Link to comment
Share on other sites

horrible to isolate a code there... :huh: .. when i take the whole seq stuff (that i dont need, my program need those resoureces)...yes of course it work... but then to integrate in my code: , with taking the seq_file.c and file_g.c it is not done... in order to use it i have to delete or replace or // all that stuff that i dont have (all that referenced ui.s tasks functions and whatever)...by ending again and again that the compiler find this and this not because i have to delete or replece something else anywhare to, or a reference what is then again needed by other things...

change makefile, mios lokal config, overwrite  _file.c and _file_g.c and then all the headers... overwrite complete without testing it step by step, the whole networkt ... hardcore! but i dont give up!  of course i will lose a lot of hair on this!    or i take the whole sequ. dont change anything, add my code, and live with all that unwantet stuff. and hope that  the onchip memory is enough. this makes me feel stupid WHAT I AM NOT!

Link to comment
Share on other sites

Maybe it's not such a good idea to start with the Sequencer file access code in the first place...
 
There is a tutorial #019 that implements a simple MIDI file player - I am not saying it is straight forward to read, but you will most probably find it much easier to grasp than what you find in the SEQ code.
 
Also: try out basic things first! E.g. create a text file or a binary on the PC, save it to the card and try to read that file from your application. The steps necessary for this can be found in the fatfs documentation or in

$MIOS32_PATH/modules/file: access layer to FatFS which simplifies the file handling
 
Good luck with your project!

Link to comment
Share on other sites

stripped down:

app.c:

//app.c   for private non comercial use only! 
//make 512 identical Files on your SD-Card in a Folder named "t"
//this take 2 minutes! - it dont hang up!
//Filesize is 703bytes*512=~20kb. The File can be opened with an TextEditor: The Content starts with "TM01A" and ends with hundrets of "0"
//I Coment my code... but there is uncommented code from the Tutorial 19 Midi-file-Player > there it was already uncommented
#include <mios32.h>
#include "tasks.h"
#include "file.h"
#include "app.h"
#include <FreeRTOS.h>
#include <portmacro.h>
#include <task.h>
#include <queue.h>
#include <semphr.h>
#include <string.h>
#define PRIORITY_TASK_SEQ (tskIDLE_PRIORITY + 4) //higher priority than MIDI receive task!
xSemaphoreHandle xSDCardSemaphore;               //take and give access to SD-Card
static void TASK_SEQ(void *pvParameters);

//These are the Bank-files I want to save on SD-Card. Alltogehter in one File!!!! and i want to have 512 of this files.
s8 BankName[8] = {32}; 				//32 is asci Code 4 "space"   &   "[]" meant that this variable is an array of variables!
u8 UIVariable[127]={0};				//all ControllChange of your UI, not all are used >hold blocks free on SD-Card 4 future 
u8 ChordSet[6][6]={{0}}; 			//6x 6String-Chord-sets that are add to your played Melody (
u8 PCSet[16]={0}; 				//program Changes for 16 midichannels
u8 MtxPart[8][8][8]={{{1}}};		        //drive 8x (8x8) LED-Matrixes --- initalised with 1 all cells are filled with 1!

void APP_Init(void){xSDCardSemaphore = xSemaphoreCreateRecursiveMutex(); // create semaphores
  FILE_Init(0);   		                                         // initialize file functions
  xTaskCreate(TASK_SEQ, (signed portCHAR *)"SEQ", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_SEQ, NULL);}// install sequencer task

void APP_Background(void){}
void APP_Tick(void){}
void APP_MIDI_Tick(void){}
void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package){}
void APP_SRIO_ServicePrepare(void){}
void APP_SRIO_ServiceFinish(void){}
void APP_DIN_NotifyToggle(u32 pin, u32 pin_value){}
void APP_ENC_NotifyChange(u32 encoder, s32 incrementer){}
void APP_AIN_NotifyChange(u32 pin, u32 pin_value){}

static void TASK_SEQ(void *pvParameters){ //SD-Card-Initalize
  portTickType xLastExecutionTime;
  u16 sdcard_check_ctr = 0;
  xLastExecutionTime = xTaskGetTickCount(); 	// Initialise the xLastExecutionTime variable on task entry

  while( 1 ) { 					// CHECK THE SD-CARD --- GIVE STATUS
    vTaskDelayUntil(&xLastExecutionTime, 1 / portTICK_RATE_MS);
    if( ++sdcard_check_ctr >= 1000 ) {          // each second: check if SD Card (still) available
		sdcard_check_ctr = 0;	        // reset the 1000ms counter to 0
		MUTEX_SDCARD_TAKE;  	        // SD-Card is now only for the following LINES reserved:
			s32 status = FILE_CheckSDCard();//SDC-Connected?
				if		( status == 2 ) 			{MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString		("%s", "NO Card");}
				if		( status == 3 ) 			{
					if	( !FILE_SDCardAvailable() ) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString		("%s", "NO Cord");}
					if	( !FILE_VolumeAvailable() ) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString		("%s", "NO FAT");}}
				if		( status == 1 ) 			{// YES CARD!  >>> next: check Card-content
						s32 statusDir = FILE_DirExists("t");									//ask/call file.c: exist a folder "t/" on the CARD?
						if(statusDir == 1){MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString					("%s", "good, file structure exists");}
						if(statusDir == 0){MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString					("%s", "create filestructure...2 minutes!");
							FILE_MakeDir("t"); 		//make a folder "t" on the SD-Card (root/t/)
							const char file_type[4] = "TM01";//definie the Filetype which is later saved via "FILE_WriteBuffer" into the file header >>>means if you look on one of the 512 files with a Hex Editor, you will find somewhere @ top
							char filepath[8]; 		//Number of Pathsymbols t/512.tm >>> 8!
							sprintf(filepath, "t/0.tm"); 	//First Pattern --- will be later copied 511 times!	
							FILE_WriteOpen	(filepath, 1);
							FILE_WriteBuffer((u8 *)file_type, 4);	//"TM01" = 4 Positons
							BankName[0] = 65; 			//65 is ASCI means "A", the rest is "space"
							FILE_WriteBuffer((u8 *)BankName, 8);	//"A        " = 8 Positons
							FILE_WriteBuffer((u8 *)PCSet, 16);	//PCSet declared as PCSet[16] 
							FILE_WriteBuffer((u8 *)UIVariable, 127);//declared as UIVariable[127] >>> array that bundles 127 Variables: UIVariable[0] - > UIVariable[127]
							FILE_WriteBuffer((u8 *)ChordSet, 36);	//declared as ChordSet[6][6] 6x6 = 36
							FILE_WriteBuffer((u8 *)MtxPart, 512);	//declared as MtxPart[8][8][8]; 8x8x8=512
							FILE_WriteClose	();			//The First File named "0" is locatet @ SDCARD/t/0.tm, now its time to copy this 511 times, I want 511 Banks/files
							s16 BankCreateCounter = 0;		//declere and set the Bank Counter inital value to 0 
							for(BankCreateCounter=0; BankCreateCounter<512; BankCreateCounter++){ 	//countes 2 511 and do following commandos 511 times in a loop:
								char copyfilepath[8];	//Number of Pathsymbols t/512.tm >>> 8!
								sprintf(copyfilepath, "t/%d.tm", BankCreateCounter); //make a new filename depending on the counter value 1.tm...511.tm
								FILE_Copy ((char *)"t/0.tm", (char *)copyfilepath);  //copy the File 0.tm to all other 511 files...
								}//up to here it will be looped
					MUTEX_SDCARD_GIVE;	 //SD-Card is now free 4 access
					MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString											("%s", "done");
					}}}}}

 

app.h:

//Header file of application  - for private non comercial use only!
#ifndef _APP_H
#define _APP_H

extern void APP_Init(void);
extern void APP_Background(void);
extern void APP_Tick(void);
extern void APP_MIDI_Tick(void);
extern void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package);
extern void APP_SRIO_ServicePrepare(void);
extern void APP_SRIO_ServiceFinish(void);
extern void APP_DIN_NotifyToggle(u32 pin, u32 pin_value);
extern void APP_ENC_NotifyChange(u32 encoder, s32 incrementer);
extern void APP_AIN_NotifyChange(u32 pin, u32 pin_value);
#endif /* _APP_H */

 

 

makefile.h:

# MakeFile  - for private non comercial use only!
# following setup taken from environment variables
PROCESSOR =	$(MIOS32_PROCESSOR)
FAMILY    = 	$(MIOS32_FAMILY)
BOARD	  = 	$(MIOS32_BOARD)
LCD       =     $(MIOS32_LCD)

THUMB_SOURCE    = app.c 					# Source Files, include paths and libraries

# (following source stubs not relevant for Cortex M3 derivatives)
THUMB_AS_SOURCE =
ARM_SOURCE      =
ARM_AS_SOURCE   =
C_INCLUDE = 	-I .
A_INCLUDE = 	-I .
LIBS = 		

# Remaining variables
LD_FILE   = 	$(MIOS32_PATH)/etc/ld/$(FAMILY)/$(PROCESSOR).ld
PROJECT   = 	project
DEBUG     =	-g
OPTIMIZE  =	-Os
CFLAGS =	$(DEBUG) $(OPTIMIZE)

include $(MIOS32_PATH)/programming_models/traditional/programming_model.mk
include $(MIOS32_PATH)/modules/app_lcd/$(LCD)/app_lcd.mk 	# application specific LCD driver (selected via makefile variable)
include $(MIOS32_PATH)/modules/fatfs/fatfs.mk 			# FATFS Driver
include $(MIOS32_PATH)/modules/file/file.mk			# FILE Access Layer
include $(MIOS32_PATH)/include/makefile/common.mk		# Please keep this include statement at the end of this Makefile. Add new modules above.

 

 

mios32_config.h:

//Local MIOS32 configuration file - for private non comercial use only!
#ifndef _MIOS32_CONFIG_H
#define _MIOS32_CONFIG_H
#define MIOS32_LCD_BOOT_MSG_LINE1 "SD-CARD-HOW-TO"
#define MIOS32_LCD_BOOT_MSG_LINE2 "stripped by phatty"
#endif /* _MIOS32_CONFIG_H */

 

 

tasks.h:

//tasks.h - for private non comercial use only!
#ifndef _TASKS_H
#define _TASKS_H

#ifndef MIOS32_FAMILY_EMULATION
# include <FreeRTOS.h>
# include <portmacro.h>
# include <task.h>
# include <queue.h>
# include <semphr.h>
#endif

// Global definitions
#ifdef __cplusplus
extern "C" {
#endif

// this mutex should be used by all tasks which are accessing the SD Card
#ifdef MIOS32_FAMILY_EMULATION
  extern void TASKS_SDCardSemaphoreTake(void);
  extern void TASKS_SDCardSemaphoreGive(void);
# define MUTEX_SDCARD_TAKE { TASKS_SDCardSemaphoreTake(); }
# define MUTEX_SDCARD_GIVE { TASKS_SDCardSemaphoreGive(); }
#else
  extern xSemaphoreHandle xSDCardSemaphore;
# define MUTEX_SDCARD_TAKE { while( xSemaphoreTakeRecursive(xSDCardSemaphore, (portTickType)1) != pdTRUE ); }
# define MUTEX_SDCARD_GIVE { xSemaphoreGiveRecursive(xSDCardSemaphore); }
#endif

// Export global variables
#ifdef __cplusplus
}
#endif

#endif /* _TASKS_H */

next comes then the same but with store load, chane Pattername (internally not filename)

Edited by Phatline
Link to comment
Share on other sites

DONE - this is the working code with Menue - Load and Store and Rename.

//app.c      SD-Card-Format
//if your SD-Card is empty: make 512 identical Files on your SD-Card in a Folder named "t" >>> this take 2 minutes! - it dont hang up! > 703bytes*512=~20kb Diskspace is needet 
//The SD-Card-Files can be opened with an TextEditor or an HEX-Editor: The Content starts with "TM01A" and ends with hundrets of "0'"
//with 1 Menue Page Encoder, you could switch between different Menue Pages... but there is only one up to now - and for this tutoral and me - for ever.
//4 Meneu Encoder under a 2x40Char Display do this (from left to right):
   //1.select File 2 Load, 2.select File 2 Store&read the name, 3.select 1 of 8 caracter-positions 4.change the character on this position.
//the store button stores to the selectet File, the load loads the selected file, and dump the loaded name and Nr to Store Name and Number (to avoid to overwrite importent Banks!!!)
//Feel free to make a tutorial out of it, or use it in your code, no need to name me! 
//as TK whish: Private & NonComercial Use only!
#include <mios32.h>
#include "tasks.h"
#include "file.h"
#include "app.h"
#include <FreeRTOS.h>
#include <portmacro.h>
#include <task.h>
#include <queue.h>
#include <semphr.h>
#include <string.h>
static file_t midifile_fi;
#define NUM_ENCODERS 5 //5 Menue Encoders are connectet
const mios32_enc_config_t encoders[NUM_ENCODERS] = {//(SR begin with 1, ENC with 0) // setup the Pinout of that Encoders
	{ .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=2, .cfg.sr=1, .cfg.pos=0 },		//Menue Encoder 0 	- only virtual, since they are mapped to differnt Variables... 
	{ .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=2, .cfg.sr=1, .cfg.pos=2 },		//Menue Encoder 1	- ...if "Menue Page Encoder" has changed
	{ .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=2, .cfg.sr=5, .cfg.pos=0 },		//Menue Encoder 2
	{ .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=2, .cfg.sr=5, .cfg.pos=2 },		//Menue Encoder 3
	{ .cfg.type=DETENTED2, .cfg.speed=SLOW, .cfg.speed_par=4, .cfg.sr=4, .cfg.pos=0 },};	//Menue Page Encoder
#define PRIORITY_StoreLoad		( tskIDLE_PRIORITY + 4 ) // higher priority than MIDI receive task!

xSemaphoreHandle xSDCardSemaphore; 	// take and give access to SD-Card
xSemaphoreHandle xLCDSemaphore;		// take and give access to LCD

#define MUTEX_LCD_TAKE { while( xSemaphoreTakeRecursive(xLCDSemaphore, (portTickType)1) != pdTRUE ); }  //a Mutex reserve a Resoure (LCD or SD-Card) for a task, until it is given away...
#define MUTEX_LCD_GIVE { xSemaphoreGiveRecursive(xLCDSemaphore); }

//These are for Save-Store-UI - a 2x40Character Display - 5 Encoders 2 Buttons and much more virtual Encoders and buttons... (not Saved on CARD)
	s32 MenuPage = 0;				//All Other Encoders are Virtual and set the allocated Variables (locate via MenuPage)
	u16 SongNrLoad = 0;				//The Song Number to be loaded,,, 
	u16 SongNrStor = 0;				//TO DO!!! After Loading a Song Number (hit load) the S{onNrStor = SongNrLoad} --- to avoid endless Encoder scrolling....
	s8 SongNamePointerCount = 0;	//to navigate thru the 8 Character position of one Name
	s8 SongNameChar = 0;			//Change the Songname via Encoder you select the Characters
	s8 SongNamePointer[8] = {94,95,95,95,95,95,95,95}; //95= "_" 94=Indicator: indicate Edit Songname Character (looped via SongNamePointerCount)
	u8 MenueLoad = 0;				//in this tutorial LOAD FILES
	u8 MenueStore = 0;				//in this tutorial STORE FILES
	u8 SongNamecount;               //to transfair data from Load to Store Songnames...

//These are the Bank-files I want to save on SD-Card. Alltogehter in one File!!!! and i want to have 512 of this files.
	s8 SongNameLoad[8]  = {32}; 	//This is the load name only, once loadet we work with the STORE Variables --- by the way 32 is asci Code 4 "space"   &   "[]" meant that this variable is an array of variables!
	s8 SongNameStore[8] = {32};		//This is the Song Name that will be stored if you hit store
	u8 UIVariable[127]={0};			//all ControllChange Parameters you perform on your UI or Menue, of course not all are used, but we hold blocks free on the SD-Card, 4 future UI-Updates
	u8 ChordSet[6][6]={{0}};		//6 different 6String-Chord-sets that are add to your played Melody (your choise which is the root note...)
	u8 PCSet[16]={0};				//program Changes for 16 midichannels
	u8 MtxPart[8][8][8]={{{1}}};	//to drive 8x (8x8) LED-Matrixes --- initalised with 1 all cells are filled with 1!

//These are the UI-variables that are Saved to SD-Card.// You dont have to worry about what these are doing... i put them here to have somethingt to save ;)
	// Midi IO						
	u8 Mel0PortSwitch = 1; 			//1: Melody Input1 and Melody Input2 came booth from "ProtMeloI1" 0: they come from seperate Ports (MelPort0+MelPort1)
	u8 Mel1PortSwitch = 1; 			//--//-- the same but for Melody 1
	u8 Mel0ChSw = 0;				//Select 1 of 2 Preconfigured Input Midichannels (MelChI0 o MelChI1)
	u8 Mel1ChSw = 0;				//--//-- the same but for Melody 1
	u8 MelNotOffType0 = 0;			//MelodySynthesizer0--- Noteoffhandling --- react the connectet Synthesizer to 0:NoteOff Messages or 1:NoteON with Velo 0 Messages
	u8 MelNotOffType1 = 0;			//--//-- the same but for connectet Synthesizer 1
	//Melody Variables
	u8 Mel0hold = 0; 				//Hold NoteInputBuffer for Melody...
	u8 Mel1hold = 0; 				//--//-- ... so how matter what you play on sequencer or Keyboard or Guitar, the buffer will not change = HOLD = HALTE = HALT
	u8 Mel0Mono = 0; 				//switch between Mono and Poly Retrigger, how Mono act is switched by Mel0MonoLoHi
	u8 Mel1Mono = 0; 				//switch between Mono and Poly Retrigger, how Mono act is switched by Mel1MonoLoHi
	u8 Mel0MonoLoHi = 0; 			//if Mel0Mono - Mode is switched to Mono (1) this definies if you hear the lowest or highest note of the Poly-Note-Stack. (0:Lo, 1:Hi)
	u8 Mel1MonoLoHi = 0; 			//if Mel1Mono - Mode is switched to Mono (1) this definies if you hear the lowest or highest note of the Poly-Note-Stack. (0:Lo, 1:Hi)
	u8 Mel0OctShift = 1; 			//0-3 -Shift the Melody Output Notes 0:-12 1:+0 2:+12
	u8 Mel1OctShift = 1; 			//0-3 -Shift the Melody Output Notes 0:-12 1:+0 2:+12

//Thesa are for calculating only:
	u16 LCDcount = 0; //display update rate calculation
	char file_typeBank[4] = "TM01";	//should always be 4, and not longer then 4 chars!!! //definie the Filetype which is later saved via "FILE_WriteBuffer" into the file header (use Text/Hex-Editor to proove)
	char filepathS[8];				//STORE-path - Number of Pathsymbols t/512.tm >>> 8! >> again: dont change the length, or you will have to change the code	
	char filepathL[8];				//LOAD -path - Number of Pathsymbols t/512.tm >>> 8! >> again: dont change the length, or you will have to change the code	
	u8 i = 0;						//only to count some things...
	s32 statusSD;					//Status of the SDCard--connected? fat?
	s32 statusDir;					//Status "is" your direction "sdcard/t" there?
	u16 SDCardCount = 0;			//Counter used to dedect periodicly the SD-Card
	u16 MenueUpdateCount =	0;		//Counter used to update the menue 1time - in case to delete a message like "stored" or "loadet" after some time - to show the whole menue again.	
	u8 MenueUpdateFlag = 1;         //Flag to force the MenueUpdateCounter to count a periode of time, after the time "update the menue"

void StoreLoad(u8 tick, u16 order);

void APP_Init(void){
	xLCDSemaphore 		= xSemaphoreCreateRecursiveMutex();														// create Mutex for LCD access
	xSDCardSemaphore 	= xSemaphoreCreateRecursiveMutex();														// create semaphores
	FILE_Init(0);																								// initialize file functions
	s32 i;																										//initialize encoders   i = counter
	for(i=0; i<NUM_ENCODERS; ++i) MIOS32_ENC_ConfigSet(i, encoders[i]);}										//initialize encoders	

void APP_Background(void){}

void APP_Tick(void){  //1ms  Event Triggering
  SDCardCount = SDCardCount + 1; if(SDCardCount > 2000){SDCardCount = 0; StoreLoad(1, 3);} //2s Counter > send Check-SDCard-Commant to StoreLoad-Function
  if(MenueUpdateFlag==0){MenueUpdateCount = MenueUpdateCount + 1; if(MenueUpdateCount > 650){MenueUpdateCount = 0; StoreLoad(0, 0); MenueUpdateFlag=1;}} //update the Menue 0,5seconds after a message like "stored" (1.time!)

	}
void APP_MIDI_Tick(void){}
void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package){}
void APP_SRIO_ServicePrepare(void){}
void APP_SRIO_ServiceFinish(void){}
void APP_DIN_NotifyToggle(u32 pin, u32 pin_value){//Store & Load Buttons
		if(pin == 26 && pin_value == 0){StoreLoad(1, 1);}		//1: 1st Menue, 	1: STORE 	Bank command
		if(pin == 38 && pin_value == 0){StoreLoad(1, 2);}}		//1: 1st Menue, 	2: LOAD 	Bank command

void APP_ENC_NotifyChange(u32 encoder, s32 incrementer){  //ENCODER AND MENUE
	//set Menue Encoder (=Virtual Encoder-Bank Selector)
	if(encoder == 4){
	s32 value = MenuPage + incrementer;                   // increment to virtual position and ensure that the value is in range 0..127
	if(value < 0){value = 16;}
	if(value > 16){value = 0;}
	MenuPage = value;}
	
	//All those Virtual Encoders.	
	if(encoder <= 3){
			
		if(MenuPage == 0){
			if(encoder == 0){ 
				s32 value = SongNrLoad + incrementer;    // increment to virtual position and ensure that the value is in range 0..127
				if(value < 0){value = 511;}
				if(value > 511){value = 0;}
				SongNrLoad = value;
				//ReadName From File	
				MUTEX_SDCARD_GIVE;
		          sprintf(filepathL, "t/%d.tm", SongNrLoad);
                  FILE_ReadOpen	(&midifile_fi, filepathL);
                    FILE_ReadBuffer	((u8 *)file_typeBank,	4); 	
                    FILE_ReadBuffer	((u8 *)SongNameLoad,	8); 
                  FILE_ReadClose	(&midifile_fi);
                MUTEX_SDCARD_GIVE;}
			if(encoder == 1){ 
				s32 value = SongNrStor + incrementer;     // increment to virtual position and ensure that the value is in range 0..127
				if(value < 0){value = 511;}
				if(value > 511){value = 0;}
				SongNrStor= value;}
			if(encoder == 2){
				s32 value = SongNamePointerCount+ incrementer;  // increment to virtual position and ensure that the value is in range 0..127
				if(value < 0){value = 7;}
				if(value > 7){value = 0;}
				SongNamePointerCount = value;
				if(SongNamePointerCount == 0){
												SongNamePointer[0]=94;
												SongNamePointer[1]=95;
												SongNamePointer[2]=95;
												SongNamePointer[3]=95;
												SongNamePointer[4]=95;
												SongNamePointer[5]=95;
												SongNamePointer[6]=95;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 1){
												SongNamePointer[0]=95;
												SongNamePointer[1]=94;
												SongNamePointer[2]=95;
												SongNamePointer[3]=95;
												SongNamePointer[4]=95;
												SongNamePointer[5]=95;
												SongNamePointer[6]=95;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 2){
												SongNamePointer[0]=95;
												SongNamePointer[1]=95;
												SongNamePointer[2]=94;
												SongNamePointer[3]=95;
												SongNamePointer[4]=95;
												SongNamePointer[5]=95;
												SongNamePointer[6]=95;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 3){
												SongNamePointer[0]=95;
												SongNamePointer[1]=95;
												SongNamePointer[2]=95;
												SongNamePointer[3]=94;
												SongNamePointer[4]=95;
												SongNamePointer[5]=95;
												SongNamePointer[6]=95;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 4){
												SongNamePointer[0]=95;
												SongNamePointer[1]=95;
												SongNamePointer[2]=95;
												SongNamePointer[3]=95;
												SongNamePointer[4]=94;
												SongNamePointer[5]=95;
												SongNamePointer[6]=95;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 5){
												SongNamePointer[0]=95;
												SongNamePointer[1]=95;
												SongNamePointer[2]=95;
												SongNamePointer[3]=95;
												SongNamePointer[4]=95;
												SongNamePointer[5]=94;
												SongNamePointer[6]=95;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 6){
												SongNamePointer[0]=95;
												SongNamePointer[1]=95;
												SongNamePointer[2]=95;
												SongNamePointer[3]=95;
												SongNamePointer[4]=95;
												SongNamePointer[5]=95;
												SongNamePointer[6]=94;
												SongNamePointer[7]=95;}
				if(SongNamePointerCount == 7){
												SongNamePointer[0]=95;
												SongNamePointer[1]=95;
												SongNamePointer[2]=95;
												SongNamePointer[3]=95;
												SongNamePointer[4]=95;
												SongNamePointer[5]=95;
												SongNamePointer[6]=95;
												SongNamePointer[7]=94;}
				}
			if(encoder == 3){
				s32 value = SongNameChar + incrementer;            // increment to virtual position and ensure that the value is in range 0..127
				if(value < 32){value = 90;}
				if(value > 90){value = 32;}
				SongNameChar= value;
				SongNameStore[SongNamePointerCount] = SongNameChar;//write on the current Name-Position -the choosen ASCI-Caracter...
				}	
				
			if(SongNamePointerCount == 0) {SongNameChar = SongNameStore[SongNamePointerCount];}//when i surf thru the  8 letters of the name, i want to start from the already set Character...avoid jumps...
			if(SongNamePointerCount == 1) {SongNameChar = SongNameStore[SongNamePointerCount];}
			if(SongNamePointerCount == 2) {SongNameChar = SongNameStore[SongNamePointerCount];}
			if(SongNamePointerCount == 3) {SongNameChar = SongNameStore[SongNamePointerCount];}
			if(SongNamePointerCount == 4) {SongNameChar = SongNameStore[SongNamePointerCount];}
			if(SongNamePointerCount == 5) {SongNameChar = SongNameStore[SongNamePointerCount];}
			if(SongNamePointerCount == 6) {SongNameChar = SongNameStore[SongNamePointerCount];}
			if(SongNamePointerCount == 7) {SongNameChar = SongNameStore[SongNamePointerCount];}	
}
}
StoreLoad(0, 10);} //update Menue Page
void APP_AIN_NotifyChange(u32 pin, u32 pin_value){}

void StoreLoad(u8 tick, u16 order){//MENUE, Store+Load Bank & Sys-Config
    if(tick == 0){//Menue
      if (MenuPage == 0) {      //1stMenu
         MUTEX_LCD_TAKE;        //request LCD access
            MIOS32_LCD_Clear(); //clear screen
          //1st Line = Encoder Variables....change something!
            MIOS32_LCD_CursorSet(0, 0);  MIOS32_LCD_PrintFormattedString("%d", SongNrLoad);
            MIOS32_LCD_CursorSet(4, 0);  MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[0]);
            MIOS32_LCD_CursorSet(5, 0);  MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[1]);
            MIOS32_LCD_CursorSet(6, 0);  MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[2]);
            MIOS32_LCD_CursorSet(7, 0);  MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[3]);
            MIOS32_LCD_CursorSet(8, 0);  MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[4]);
            MIOS32_LCD_CursorSet(9, 0);  MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[5]);	
            MIOS32_LCD_CursorSet(10, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[6]);
            MIOS32_LCD_CursorSet(10, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameLoad[7]);
            MIOS32_LCD_CursorSet(13, 0); MIOS32_LCD_PrintFormattedString("%d", SongNrStor);
            MIOS32_LCD_CursorSet(17, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[0]);
            MIOS32_LCD_CursorSet(18, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[1]);
            MIOS32_LCD_CursorSet(19, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[2]);
            MIOS32_LCD_CursorSet(20, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[3]);
            MIOS32_LCD_CursorSet(21, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[4]);
            MIOS32_LCD_CursorSet(22, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[5]);
            MIOS32_LCD_CursorSet(23, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[6]);	
            MIOS32_LCD_CursorSet(24, 0); MIOS32_LCD_PrintFormattedString("%c", SongNameStore[7]);		
            MIOS32_LCD_CursorSet(26, 0); MIOS32_LCD_PrintFormattedString("%s", "<>       abc");
          //2nd Line = Menue Describtion
            MIOS32_LCD_CursorSet(0, 1); 	MIOS32_LCD_PrintFormattedString("%s%c%c%c%c%c%c%c%c", "Nr  NameLoad Stor", 
               SongNamePointer[0], SongNamePointer[1], SongNamePointer[2], SongNamePointer[3], SongNamePointer[4], SongNamePointer[5], SongNamePointer[6], SongNamePointer[7]);
            MIOS32_LCD_CursorSet(26, 1); 	MIOS32_LCD_PrintFormattedString("%s", "<>    PAGE>");	
            MIOS32_LCD_CursorSet(38, 1); 	MIOS32_LCD_PrintFormattedString("%d ", MenuPage);  
          MUTEX_LCD_GIVE;}					// release LCD access for other tasks    
		}									//more pages

	//STORE	     
    if(tick == 1 && order == 2){//Store Data & update the Load NR & Name													
      MUTEX_SDCARD_TAKE;  statusSD = FILE_CheckSDCard();   MUTEX_SDCARD_GIVE;      //SDC-Connected?
      if(statusSD != 0)  {MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString       ("%s %d", "CANT-SAVE-Status:", statusSD);}
      if(statusSD == 0) {                                                          // YES CARD!  >>> next: check Card-content 
          MUTEX_SDCARD_TAKE; statusDir = FILE_DirExists("t"); MUTEX_SDCARD_GIVE;   //ask/call file.c: exist a folder "t/" on the CARD?
           if(statusDir == 0) {MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString ("%s", "Invalid File Structure>Reconnect Card");}
           if(statusDir == 1) {
             UIVariable[0]  = Mel0PortSwitch; //copy Variables into a Bundle/Array!			
             UIVariable[1]  = Mel1PortSwitch;			
             UIVariable[2]  = Mel0ChSw;				
             UIVariable[3]  = Mel1ChSw;			
             UIVariable[4]  = MelNotOffType0;			
             UIVariable[5]  = MelNotOffType1;			
             UIVariable[6]  = Mel0hold; 				
             UIVariable[7]  = Mel1hold; 				
             UIVariable[8]  = Mel0Mono;				
             UIVariable[9]  = Mel1Mono; 				
             UIVariable[10] = Mel0MonoLoHi; 			
             UIVariable[11] = Mel1MonoLoHi;			
             UIVariable[12] = Mel0OctShift;		
             UIVariable[13] = Mel1OctShift;	
             MUTEX_SDCARD_TAKE;  
						sprintf(filepathS, "t/%d.tm", SongNrStor);       //First Pattern --- will be later copied 511 times!	
							FILE_WriteOpen	(filepathS, 1);              //WRITE!!!!
								FILE_WriteBuffer((u8 *)file_typeBank, 4);//"TM01" = 4 Positons
								FILE_WriteBuffer((u8 *)SongNameStore, 8);//"A        " = 8 Positons
								FILE_WriteBuffer(PCSet, 16);             //the Variable PCSet is declared as PCSet[16] (see @ top of the file) it has 16 Variables in it
								FILE_WriteBuffer(UIVariable, 127);       //declared as UIVariable[127] >>> array that bundles 127 Variables: UIVariable[0] - > UIVariable[127]
								FILE_WriteBuffer((u8 *)ChordSet, 36);    //declared as ChordSet[6][6] 6x6 = 36
								FILE_WriteBuffer((u8 *)MtxPart, 512);    //declared as MtxPart[8][8][8]; 8x8x8=512
							FILE_WriteClose	();                          //The First File named "0" is locatet @ SDCARD/t/0.tm, now its time to copy this 511 times, I want 511 Banks/files
					MUTEX_SDCARD_GIVE;                                   //SD-Card is now free 4 access
					MUTEX_LCD_TAKE; MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString	("%s", "stored!"); MUTEX_LCD_GIVE; MenueUpdateFlag = 0;}}}//menue Updateflag 2 restore after some time the menue

    //LOAD	
    if(tick == 1 && order == 1){                 //Load Data & update the Load NR & Name and also Store Nr & Store Name
      MUTEX_SDCARD_TAKE;  statusDir = FILE_DirExists("t"); MUTEX_SDCARD_GIVE;
      if(statusDir != 1) {MUTEX_LCD_TAKE; MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString	("%s %d", "CANT-LOAD-Status:", statusDir); MUTEX_LCD_GIVE;}
      if(statusDir == 1) {
		   sprintf(filepathL, "t/%d.tm", SongNrLoad);
           FILE_ReadOpen	(&midifile_fi, filepathL);
           FILE_ReadBuffer	((u8 *)file_typeBank,	4); 	
           FILE_ReadBuffer	((u8 *)SongNameLoad,	8); 
           FILE_ReadBuffer	((u8 *)PCSet,			16); 
           FILE_ReadBuffer	((u8 *)UIVariable,		127); 
           FILE_ReadBuffer	((u8 *)ChordSet,		36); 
           FILE_ReadBuffer	((u8 *)MtxPart,			512);
           FILE_ReadClose	(&midifile_fi);
       MUTEX_SDCARD_GIVE
       MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString	("%s", "loaded!"); 
       SongNrStor = SongNrLoad; //transfiar load nr 2 store nr.
       for(SongNamecount=0; SongNamecount<8; SongNamecount++){SongNameStore[SongNamecount]=SongNameLoad[SongNamecount];} //transfair loadet Filename 2 Storefilename
       if(MenuPage == 0){StoreLoad(0,0);}//Update Menue for SongNameLoad
       }}
       
       
  if(tick == 1 && order == 3){//CHECK SD-Card/Initalize Card
    MUTEX_SDCARD_TAKE;					//SD-Card is now only for the following LINES reserved:
      statusSD = FILE_CheckSDCard();
      if (statusSD == 2) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "NO Card");} 
      if (statusSD == 3) {
         if	(!FILE_SDCardAvailable() ) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "NO Cord");} 
         if	(!FILE_VolumeAvailable() ) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "NO FAT");}} 
      if (statusSD == 1) {// YES CARD!  >>> next: check Card-content
         statusDir = FILE_DirExists("t");																								//ask file.c: exist a folder "t/" on the CARD?
         if(statusDir == 1){MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "good file structure");} 
         if(statusDir == 0){MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "create filestructure...2 minutes!");
            FILE_MakeDir("t");                        //make a folder "t" on the SD-Card (root/t/)
            sprintf(filepathS, "t/0.tm");             //First Pattern --- will be later copied 511 times!	
            FILE_WriteOpen	(filepathS, 1);
              FILE_WriteBuffer((u8 *)file_typeBank, 4); //"TM01" = 4 Positons
              SongNameStore[0] = 65;                    //65 is ASCI means "A", the rest is "space" because i intitalised it with the value"32"
              FILE_WriteBuffer((u8 *)SongNameStore, 8); //"A        " = 8 Positons
              FILE_WriteBuffer((u8 *)PCSet, 16);        //the Variable PCSet is declared as PCSet[16] (see @ top of the file) it has 16 Variables in it
              FILE_WriteBuffer((u8 *)UIVariable, 127);  //declared as UIVariable[127] >>> array that bundles 127 Variables: UIVariable[0] - > UIVariable[127]
              FILE_WriteBuffer((u8 *)ChordSet, 36);     //declared as ChordSet[6][6] 6x6 = 36
              FILE_WriteBuffer((u8 *)MtxPart, 512);     //declared as MtxPart[8][8][8]; 8x8x8=512
            FILE_WriteClose	();                       //The First File named "0" is locatet @ SDCARD/t/0.tm, now its time to copy this 511 times, I want 511 Banks/files
            s16 BankCreateCounter = 0;                //declere and set the Bank Counter inital value to 0 
            for(BankCreateCounter=0; BankCreateCounter<512; BankCreateCounter++){  //countes 2 511 and do following commandos 511 times in a loop:
            char copyfilepath[8];
            sprintf(copyfilepath, "t/%d.tm", BankCreateCounter); //make a new filename depending on the counter value 1.tm, 2.tm, 3.tm...511.tm
            FILE_Copy ((char *)"t/0.tm", (char *)copyfilepath);} //copy the File 0.tm to all other 511 files...
    MUTEX_SDCARD_GIVE;												//SD-Card is now free 4 access
    MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "init SDCard > done");}}}}
				
Edited by Phatline
Link to comment
Share on other sites

STORE is DONE

if(tick == 1 && order == 2){//Store Data & update the Load NR & Name													
      MUTEX_SDCARD_TAKE;  statusSD = FILE_CheckSDCard();   MUTEX_SDCARD_GIVE;      //SDC-Connected?
      if(statusSD != 0)  {MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString       ("%s %d", "CANT-SAVE-Status:", statusSD);}
      if(statusSD == 0) {                                                          // YES CARD!  >>> next: check Card-content 
          MUTEX_SDCARD_TAKE; statusDir = FILE_DirExists("t"); MUTEX_SDCARD_GIVE;   //ask/call file.c: exist a folder "t/" on the CARD?
           if(statusDir == 0) {MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString ("%s", "Invalid File Structure>Reconnect Card");}
           if(statusDir == 1) {	
             MUTEX_SDCARD_TAKE;  
						sprintf(filepathS, "t/%d.tm", SongNrStor);       //First Pattern --- will be later copied 511 times!	
							FILE_WriteOpen	(filepathS, 1);              //WRITE!!!!
								FILE_WriteBuffer((u8 *)file_typeBank, 4);//"TM01" = 4 Positons
								FILE_WriteBuffer((u8 *)SongNameStore, 8);//"A        " = 8 Positons
								FILE_WriteBuffer(PCSet, 16);             //the Variable PCSet is declared as PCSet[16] (see @ top of the file) it has 16 Variables in it
								FILE_WriteBuffer(UIVariable, 127);       //declared as UIVariable[127] >>> array that bundles 127 Variables: UIVariable[0] - > UIVariable[127]
								FILE_WriteBuffer((u8 *)ChordSet, 36);    //declared as ChordSet[6][6] 6x6 = 36
								FILE_WriteBuffer((u8 *)MtxPart, 512);    //declared as MtxPart[8][8][8]; 8x8x8=512
							FILE_WriteClose	();                          //The First File named "0" is locatet @ SDCARD/t/0.tm, now its time to copy this 511 times, I want 511 Banks/files
					MUTEX_SDCARD_GIVE;                                   //SD-Card is now free 4 access
					MUTEX_LCD_TAKE; MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString	("%s", "stored!"); MUTEX_LCD_GIVE;}}}
Edited by Phatline
Link to comment
Share on other sites

i dont have a midifile "midifile_fi" - I have no clue BUT trial&Error Style - it WORKED FOR ME LOAD is done:

      MUTEX_SDCARD_TAKE;  statusDir = FILE_DirExists("t"); MUTEX_SDCARD_GIVE;
      if(statusDir != 1) {MUTEX_LCD_TAKE; MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString    ("%s %d", "CANT-LOAD-Status:", statusDir); MUTEX_LCD_GIVE;}
      if(statusDir == 1) {
           sprintf(filepathL, "t/%d.tm", SongNrLoad);
           FILE_ReadOpen    (&midifile_fi, filepathL);
           FILE_ReadBuffer    ((u8 *)file_typeBank,    4);     
           FILE_ReadBuffer    ((u8 *)SongNameLoad,    8);  
           FILE_ReadBuffer    ((u8 *)PCSet,            16);  
           FILE_ReadBuffer    ((u8 *)UIVariable,        127);  
           FILE_ReadBuffer    ((u8 *)ChordSet,        36);  
           FILE_ReadBuffer    ((u8 *)MtxPart,            512);
           FILE_ReadClose    (&midifile_fi);
       MUTEX_SDCARD_GIVE
       MIOS32_LCD_Clear(); MIOS32_LCD_PrintFormattedString    ("%s", "loaded!");

just to see the way i come to this:

haveing troubles with the LOAD-Code

s32 FILE_ReadOpen ( file_tfile,     char *  filepath     )    

file_t (whatever that is) is linked to this site: http://www.midibox.org/mios32/manual/structfile__t.html

aha csect, curr-clust, dir-ptr, dir sect,dsect, flag,fptr, fsize, & orgclust ? :getlost: ... and no further explainations... ok ask dr google:

cscect: control section

curr-clust: current state of cluster

dir-ptr:?

dir-sect:?

dsect: Drug Safety & Effectiveness Cross-Disciplinary Training :no:

flag: "fags variable is a integral type that I wish to treat as an array of bits, where each bit represents a flag or boolean value.."

fptr: function pointer

fsize: file size of buffered file

orgclust?

ok and that bring me what? ok ok i assume what i have: a sdcard, a dir "t/" a file "1" a filetype "tm" togehter as path: t/1.tm, tried that out

 "FILE_ReadOpen (0, filepathL);" >>> LCD says HARD FAULT (0 for zero idea, but compiler passt it)

ok lets try:

"FILE_ReadOpen(dir_ptr, filepathL);" compiler says dir_ptr undeclared

"FILE_ReadOpen(1, filepathL);" compiler says app.c:295:12: warning: passing argument 1 of 'FILE_ReadOpen' makes pointer from integer without a cast [enabled by default]

then file_t maybe means filetype? so:

"FILE_ReadOpen(tm, filepathL);" compiler says tm undeclared

(by the way: sprintf(filepathS, "t/1.tm");)

then --- hmm fsize= when i sum all writing buffersizes i get 703bythes...maybe this

"FILE_ReadOpen(703, filepathL);" compiler says mios32/trunk/modules/file/file.h:92:12: note: expected 'struct file_t *' but argument is of type 'int',

hm file.h: extern s32 FILE_ReadOpen(file_t* file, char *filepath); so then:

FILE_ReadOpen    (file_t* file, char *filepathL);  app.c:295:27: error: expected expression before 'file_t'

FILE_ReadOpen    (curr_clust, char *filepathL);    app.c:295:27: error: 'curr_clust' undeclared (first use in this function)       

 

Check the SDCard, make folders & files   --trigger that code every 2seconds:

    MUTEX_SDCARD_TAKE;	 //SD-Card is now only for the following LINES reserved:
      statusSD = FILE_CheckSDCard();
      if (statusSD == 2) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "NO Card");} 
      if (statusSD == 3) {
         if	(!FILE_SDCardAvailable() ) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "NO Cord");} 
         if	(!FILE_VolumeAvailable() ) {MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "NO FAT");}} 
      if (statusSD == 1) {// YES CARD!  >>> next: check Card-content
         statusDir = FILE_DirExists("t");																								//ask file.c: exist a folder "t/" on the CARD?
         if(statusDir == 1){MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "good file structure");} 
         if(statusDir == 0){MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "create filestructure...2 minutes!");
            FILE_MakeDir("t");                        //make a folder "t" on the SD-Card (root/t/)
            sprintf(filepathS, "t/0.tm");             //First Pattern --- will be later copied 511 times!	
            FILE_WriteOpen	(filepathS, 1);
              FILE_WriteBuffer((u8 *)file_typeBank, 4); //"TM01" = 4 Positons
              SongNameStore[0] = 65;                    //65 is ASCI means "A", the rest is "space" because i intitalised it with the value"32"
              FILE_WriteBuffer((u8 *)SongNameStore, 8); //"A        " = 8 Positons
              FILE_WriteBuffer((u8 *)PCSet, 16);        //the Variable PCSet is declared as PCSet[16] (see @ top of the file) it has 16 Variables in it
              FILE_WriteBuffer((u8 *)UIVariable, 127);  //declared as UIVariable[127] >>> array that bundles 127 Variables: UIVariable[0] - > UIVariable[127]
              FILE_WriteBuffer((u8 *)ChordSet, 36);     //declared as ChordSet[6][6] 6x6 = 36
              FILE_WriteBuffer((u8 *)MtxPart, 512);     //declared as MtxPart[8][8][8]; 8x8x8=512
            FILE_WriteClose	();                       //The First File named "0" is locatet @ SDCARD/t/0.tm, now its time to copy this 511 times, I want 511 Banks/files
            s16 BankCreateCounter = 0;                //declere and set the Bank Counter inital value to 0 
            for(BankCreateCounter=0; BankCreateCounter<512; BankCreateCounter++){  //countes 2 511 and do following commandos 511 times in a loop:
            char copyfilepath[8];
            sprintf(copyfilepath, "t/%d.tm", BankCreateCounter); //make a new filename depending on the counter value 1.tm, 2.tm, 3.tm...511.tm
            FILE_Copy ((char *)"t/0.tm", (char *)copyfilepath);} //copy the File 0.tm to all other 511 files...
    MUTEX_SDCARD_GIVE;                                           //SD-Card is now free 4 access
    MIOS32_LCD_Clear(); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString	("%s", "init SDCard > done");}}}}

 

Trial And Error > Feedback, resume:

this file ting was a real hang, a deep, a blues a down a stock a break a slow down....

as newbee I must say that the documentation dont helped that much i hoped, somewho wrote that programming midibox is high percentage of "reading" - but int his case and of my point off view it is high percentage of "trial and error"

What helped was the Midifileplayer Tutorial, the Sequencer App only for formatting things > it is way to big and complex and all that stuff extFunctiosn, C-tricks and high Syntax is confuzing a man hows new with that language and whos working in texteditors and not in an IDE (overview) (what is necessery what not - strip down).

 

it took me 4 days and 6 evenings-, i have made whole grooveboxes in such a time (synthesis, sequencing, sampling, mixing, osc, hardware UI mapping)

yes the syntax is new, but how a bout more detail  in the MIOS32 Documentation (functions, modules, structures)? ... yes its clear what every module or function does, but not how it does - or what the hell it wants from me... i always had to go in the *.c-file and seek for it to see what it really needs and givebacks and how... and not even in all cases that helped- specially in the file.c -

In this case i found the solution in this way 1 Know what i want program, 2 Look in a Tutorial that make that - finding the correct function/module - not understanding that function 3 going in the MIOS32 Documentation find all possible commands -write them in a order - 4 finding that commands in tutorials and apps and look how the used the commands  >>>> command(complex, synthax) >>> 5 going back to my code and Trial error ---

 

but normally it goes this way: 1 knowing what to program, 2 program, 3 cant go ahead, 4 look in the MIOS32 Documentation, 5 program...

 

anyhow I am happy that it work now, and i can write code that make sound - not bytes on a sdcare :ahappy: - also happy that i documented it here, in the future when i dont know that again i will look in here.

Edited by Phatline
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...