/*--------------------------------------------------------------------------------
'Nom du projet : Oscilloscope
'Outil : Visual C++ 6
'Nom du fichier: MemoryFile.cpp
'Realisation:Mathieu Texier et Emmanuel Traineau
'Date: Juin 2003
'Responsable: Eric Meleiro
'--------------------------------------------------------------------------------
Explications : Ce fichier contient les fonctions membres permettant la manipulation des données mémoires
*/
#include "stdafx.h"
#include "Port.h"
#include "MemoryFile.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern BYTE* pbufferEntree;
extern bool Flg_action ;
// Constructeur de la classe: initialise le bloc mémoire
CMemoryFile::CMemoryFile()
{
hglobal = NULL;
}
// Destructeur : fige le bloc mémoire sur la rame
CMemoryFile::~CMemoryFile()
{
if (hglobal)
{
GlobalUnlock (hglobal);
GlobalFree (hglobal);
}
}
// lit les parties d'un fichier dans la mémoire
void *CMemoryFile::Read (UINT start, UINT end)
{
// Curseur
SetCursor (LoadCursor (NULL, IDC_WAIT));
// détermine sa longueur
size = end-start;
// Si le bloc mémoire a déjà été utilisé, - > libérer
if (hglobal)
{
GlobalUnlock (hglobal);
GlobalFree (hglobal);
}
// allocation du bloc mémoire ( +512 pour les entêtes wave )
hglobal = GlobalAlloc (GHND, size + 512);
memptr = GlobalLock (hglobal);
if (!memptr)
::MessageBox (NULL, "GlobalAlloc failed....",
"CMemoryFile::Read", MB_ICONSTOP | MB_OK);
// si on est en mode acquisition
if (Flg_action == 1)
{
// Ouverture du buffer
CMemFile m_memfile;
m_memfile.Attach( pbufferEntree, BUFFER_LENGHT, 0 );
m_memfile.Seek (start, CFile::begin);
m_memfile.Read(memptr, size );
}
else
{
CFile::Seek (start, CFile::begin);
CFile::Read (memptr, size);
}
// positionne le cuseur
SetCursor (LoadCursor (NULL, IDC_ARROW));
// retourne le pointeur sur la ram
return memptr;
}
// Dreht den Speicher um
void CMemoryFile::Reverse (void)
{
// Nix zum Umdrehen, dann 'raus
if (!hglobal)
return;
// Cursor auf EierUhr
SetCursor (LoadCursor (NULL, IDC_WAIT));
// Pointer und Schleifenzaehler anlegen
BYTE *tmp = new BYTE[size];
BYTE *mem = (BYTE*)memptr;
UINT s;
// Speicherinhalt umdrehen...
for (s=size; s>0; s--)
tmp[size-s] = mem[s];
// und zurueckschreiben
for (s=0; s<size; s++)
mem[s] = tmp[s];
// Temporaeres Array freigeben
delete[] tmp;
// Cursor wieder auf Pfeil
SetCursor (LoadCursor (NULL, IDC_ARROW));
}
// Addiert ein BYTE zu jedem Byte im Speicher
void CMemoryFile::AddByte (BYTE byte)
{
// Nix zum Umdrehen, dann 'raus
if (!hglobal)
return;
// Cursor auf EierUhr
SetCursor (LoadCursor (NULL, IDC_WAIT));
// BYTE aufaddieren
BYTE *mem = (BYTE*)memptr;
UINT s;
for (s=0; s<size; s++)
mem[s] += byte;
// Cursor wieder auf Pfeil
SetCursor (LoadCursor (NULL, IDC_ARROW));
}
// XOR'd alle Bytes im Speicher
void CMemoryFile::XorByte (BYTE byte)
{
// Nix zum Umdrehen, dann 'raus
if (!hglobal)
return;
// Cursor auf EierUhr
SetCursor (LoadCursor (NULL, IDC_WAIT));
// BYTE xorren
BYTE *mem = (BYTE*)memptr;
UINT s;
for (s=0; s<size; s++)
mem[s] ^= byte;
// Cursor wieder auf Pfeil
SetCursor (LoadCursor (NULL, IDC_ARROW));
}