Simple radar simulator. Example of 2D graphics on DISCO-F746NG display.

Dependencies:   BSP_DISCO_F746NG Graphics mbed TS_DISCO_F746NG

RadarDemo/RadarDemo.cpp

Committer:
karpent
Date:
2016-11-04
Revision:
0:d8b9955d2b36
Child:
1:5e49b46de1b0

File content as of revision 0:d8b9955d2b36:

//
// RadarDemo.cpp - example of graphic commands usage to create 2D graphics.
//

#include "RadarDemo.h"
#include "RK043FN48H.h"

RadarDemo::RadarDemo(Display* display) : Radar(display)
{
}


RadarDemo::~RadarDemo()
{
#ifndef _SDL_timer_h
    t.stop();
#endif
    Radar::~Radar();
}


void RadarDemo::Initialize()
{
    _needsRedraw = true;

    scanPeriod = 6000;
    demoTime = 0;   //2 * scanPeriod;

    AddSampleTargets(100);

    SetRange(1);
    //SetCenter(0, 0);

    // Remark : Data member initializer is not allowed for ARM compiler,
    //          initialize data in class constructor.   
    runningTime = 0;
    lastScanTime = runningTime;
    currentBeamAngle = 0;
    lastBeamAngle = currentBeamAngle;

#ifndef _SDL_timer_h
    t.start();
#endif
}


void RadarDemo::Render()
{
    // Reset scan time after one full turn
    if (runningTime >= (lastScanTime + scanPeriod)) {
        lastScanTime = runningTime;
    }

    // Calculate actual beam position
    lastBeamAngle = currentBeamAngle;

#ifdef _SDL_timer_h
    uint32_t msTime = SDL_GetTicks();
#else
    int msTime = t.read_ms();
#endif
    currentBeamAngle = 2 * M_PI * (msTime - lastScanTime) / (float)scanPeriod;
    if(currentBeamAngle >= (2 * M_PI)) {
        currentBeamAngle -= 2 * M_PI;
    }

    //pc.printf("Sector :%3.1f, %3.1f\r\n", lastBeamAngle*180.f/M_PI, currentBeamAngle*180.f / M_PI) ;
    //pc.printf("Time : ms=%dms, r=%dms, l=%dms\r\n", msTime, runningTime, lastScanTime) ;

    RK043FN48H* display = (RK043FN48H*)GetDisplay();

    if(NeedsRedraw()) {

        display->SetActiveLayer(Background);
        display->Clear();

        // Set color for markers
        display->SetDrawColor(0x40, 0x40, 0x40, 0xFF);
        DrawMarkers();

        display->SetDrawColor(0x80, 0x80, 0x80, 0xFF);
        DrawBorder();

        display->SetActiveLayer(Foreground);
        _needsRedraw = false;

    }
   
#ifdef _SDL_timer_h
    runningTime = SDL_GetTicks();
#else
    runningTime = t.read_ms();
#endif
    UpdateTargetsLocation(lastBeamAngle, currentBeamAngle, runningTime);
    
    display->Clear();
    DrawTracks();
    DrawRadarBeam(currentBeamAngle);
}


bool RadarDemo::IsRunning()
{
#ifdef _SDL_timer_h
    runningTime = SDL_GetTicks();
#else
    runningTime = t.read_ms();
#endif

    return demoTime > 0 ? runningTime <= demoTime : true;
}


void RadarDemo::AddSampleTargets(int count)
{
    const float minSpeed = 200; // [km/h]
    const float maxSpeed = 800; // [km/h]
    Target *target;

#ifdef _SDL_timer_h
    srand(SDL_GetTicks());
#else
    srand(t.read_us());
#endif

    for (int i = 0; i<count; i++) {
        // Generate target parameters
        float angle = 2 * M_PI * rand() / (float)RAND_MAX;
        float range = GetMaxRange() * rand() / (float)RAND_MAX;
        float speed = minSpeed + (maxSpeed - minSpeed) * rand() / (float)RAND_MAX;
        float direction = 2 * M_PI * rand() / (float)RAND_MAX;

        // Create a new target
        target = new Target(i + 100, speed, direction);
        target->SetLocationAngular(range, angle);

        // Put target on the list
        targetsList.push_back(*target);
    }
}


void RadarDemo::UnvalidateBackground()
{
    _needsRedraw = false;
}


bool RadarDemo::NeedsRedraw()
{
    return _needsRedraw;
}