Алгоритм чтения регистрации РПДП
ModalResult = Application→MessageBoxW (L" Файл с таким именем уже существует. Заменить его?", L" Сохранение", MB_OKCANCEL|MB_ICONWARNING); Cmd. addr_hi += page_count;// увеличиваем адрес начальной страницы. Выделяем буфер для хранения страниц FLASH-памяти. Int last_cycle = cycles — 1; // номер последнего запроса. EthFileName = «Запись» + Time ().FormatString («hh_mm_ss»)+ «.rpdp… Читать ещё >
Алгоритм чтения регистрации РПДП (реферат, курсовая, диплом, контрольная)
После вывода списка регистраций вStrGridRPDP, можно произвести считывание конкретной регистрации. Для выбора регистрации необходимо кликнуть на нее мышкой в StrGridRPDP. Считывание производится по нажатию кнопки «Принять» BtnReсeiveFromEthernet. При нажатии в параметр row записывается номер выделенной строки в StrGridRPDP для дальнейшего поиска информацииоб этой регистрации в буфере (адреса в памяти РПДП и количества страниц). Помимо этого в директории usgDirectoryNсоздается файл расширения .rpdp для дальнейшей записи считанной регистрации. Имя файла в программе EthFileName. Далее производится вызов функции чтения Download_fast (), параметрами которой является имя созданного файла для записи и номер регистрации для считывания.
Листинг 3.4.1.
void __fastcall TForm1: BtnReceiveClick (TObject *Sender).
{.
TDateTime dtTemp;
row = Form1->StrGridRPDP->Row-1;
dtTemp = FileNameReg (row);
SaveDialog1->InitialDir = usgDirectoryN;
SaveDialog1->Filter = L" (*.rpdp)|*.rpdp" ;
EthFileName = «Запись» + Time ().FormatString («hh_mm_ss»)+ «.rpdp» ;
SaveDialog1->FileName = EthFileName;
if (SaveDialog1->Execute ()).
{.
if (FileExists (SaveDialog1->FileName)).
{.
ModalResult = Application->MessageBoxW (L" Файл с таким именем уже существует. Заменить его?", L" Сохранение", MB_OKCANCEL|MB_ICONWARNING);
if (ModalResult == 2) { return; }.
}.
Download_fast (EthFileName, row);
}.
BtnCompare->Enabled = true;
}.
Следующая функция производит считывание выбранной в оглавлении РПДП регистрации и запись этой регистрации в файл. По умолчанию количество считываемых за раз страниц pages_per_req регистрации выбирается равным 50. Как и при чтении оглавления, для считывания регистрации необходимо отправить команду РПДП. Название команды — RPDP_GET_RAW_PAGE, адрес считываемой регистрации можно получить изглобального массива всех страниц оглавления g_sys_page[40 960] заполненного ранее. Далее необходимо определить количество запросов на скачивание для открытия цикла скачивания cycles. В цикле определяется количество страниц на текущий запрос, отправляется команда с указанным количеством страниц для скачивания cmd. len = page_count и производится считывание в tmp_buf. Далее производится декодирование считанного буфера с помощью библиотечной функции rscodec_decode_page4k (), вызванной из файла rscodec_dll. Декодированная информация записывается в ранее созданный файл.
Листинг 3.4.2.
bool _fastcall TForm1: Download_fast (UnicodeString asFileName, int row).
{.
int pages_per_req = 50;
char cTemp[2];
reg_info_t *info;
info = (reg_info_t *) g_sys_page;
iFileName = FileCreate (asFileName);
// подготавливаем команду.
rpdp_cmd_t cmd;
cmd.pack_type = PKT_CMD;
cmd.cmd = RPDP_GET_RAW_PAGE;//.
cmd.addr_lo = 0;
cmd.addr_hi = info[row]. faddr. addr_hi;
cmd.len = pages_per_req;
// определяем кол-во запросов на скачивание.
int cycles = info[row]. pages / pages_per_req;
int last_pages = info[row]. pages % pages_per_req;
if (last_pages).
cycles++;
// выделяем буфер для хранения страниц FLASH-памяти.
char *tmp_buf = (char*)malloc (pages_per_req * sizeof (nand_page4k_t));
// сам цикл скачки.
int last_cycle = cycles — 1; // номер последнего запроса.
for (int i=0; i.
{.
// опред. кол-во страниц на текущий запрос.
int page_count;
if (i == last_cycle).
{.
if (last_pages).
page_count = last_pages;
else.
page_count = pages_per_req;
} else.
{.
page_count = pages_per_req;
}.
cmd.len = page_count;
dev->send_cmd (&cmd);
dev->read_raw_pages (tmp_buf, page_count, 5000);
cmd.addr_hi += page_count;// увеличиваем адрес начальной страницы.
nand_page4k_t *page_buf = (nand_page4k_t *)tmp_buf;
// декодируем страницы из буфера и.
// записываем их в файл.
for (int j=0; j < page_count; j++).
{.
rscodec_decode_page4k (&page_buf[j]);
if (i == 0 && j == 0).
{.
FileWrite (iFileName, page_buf[j]. data, 4082);
} else.
{.
FileWrite (iFileName, page_buf[j]. data, 4080);
}.
}.
}.
cTemp[0] = 0xFA; // записываем версию регистрации.
cTemp[1] = 0xFA;
FileSeek (iFileName, 0, 0);
FileWrite (iFileName, cTemp, 2);
StatusBar->Panels->operator [](3)->Text = «Чтение произведено «;
free (tmp_buf);
return true;
}.