Optimaze with new mbed os for study
Dependencies: TS_DISCO_F746NG BSP_DISCO_F746NG Graphics
Diff: RadarDemo/RadarDemo.cpp
- Revision:
- 0:d8b9955d2b36
- Child:
- 1:5e49b46de1b0
diff -r 000000000000 -r d8b9955d2b36 RadarDemo/RadarDemo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RadarDemo/RadarDemo.cpp Fri Nov 04 01:02:37 2016 +0000 @@ -0,0 +1,153 @@ +// +// 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; +} +