USB composite device example program, drag-and-drop flash writer.

Dependencies:   SWD USBDevice mbed BaseDAP

tests/RamDisk.cpp

Committer:
va009039
Date:
2013-09-28
Revision:
1:ea8e179320d7
Parent:
0:2385683c867a

File content as of revision 1:ea8e179320d7:

// RamDisk.cpp 2013/9/21
#include "mbed.h"
#include "RamDisk.h"
#include "mydebug.h"

RamDisk::RamDisk() : _head(NULL), use_size(0)
{
    _sectors = 128; // 64KB(512*128)
}

int RamDisk::read(uint8_t * data, uint32_t block)
{
    //DBG("block=%d", block);
    SectorData* p = find(block);
    if (p) {
        memcpy(data, p->data, 512);
        return 0;
    }
    memset(data, 0x00, 512);
    return 0;   
}

static bool is_blank(const uint8_t* data)
{
    for(int i = 0; i < 512; i++) {
        if (data[i]) {
            return false;
        }
    }
    return true;
}

int RamDisk::write(const uint8_t * data, uint32_t block)
{
    SectorData* p = find(block);
    if (p) {
        DBG("update block=%d", block);
        memcpy(p->data, data, 512);
        return 0;
    }
    if (is_blank(data)) {
        return 0;
    }   
    DBG("new block=%d", block);
    p = new SectorData;
    TEST_ASSERT(p);
    p->block = block;
    memcpy(p->data, data, 512);
    p->next = _head;
    _head = p;
    use_size += 512;
    //DBG("use_size: %d", use_size);
    TEST_ASSERT(use_size < (512*16));
    return 0;
}

uint32_t RamDisk::sectors()
{
    return _sectors;
}

SectorData* RamDisk::find(uint16_t block)
{
    SectorData* p = _head;
    while(p) {
        if (p->block == block) {
            break;
        }
        p = p->next;
    }
    return p;
}

void RamDisk::exportData(Stream* pc)
{
    pc->printf("\n\n\n\n\n");
    SectorData* p = _head;
    while(p) {
        pc->printf("const uint8_t sector_%d[] = {\n", p->block);
        for(int i = 0; i < 512; i++) {
            pc->printf("0x%02x,", p->data[i]);
            if (i%16 == 15) {
                pc->printf("\n");
            }
        }
        pc->printf("};\n");
        p = p->next;
    }

    pc->printf("const SectorIndex sector_index[] = {\n");
    p = _head;
    while(p) {
        pc->printf("{%d, sector_%d},\n", p->block, p->block); 
        p = p->next;
    }
    pc->printf("{-1, NULL},\n");
    pc->printf("};\n");
    pc->printf("\n\n\n\n\n");
}