RSS
poniedziałek, 13 maja 2013
Aplikacja iPhone Eco Drive - śledzenie trasy

 

W ciągu ostatnich paru dni otrzymałem kila maili z prośbą o opisanie nowego ekranu aplikacji Eco Drive umożliwiającego śledzenie i rejestracji trasy, którą się obecnie poruszamy.

 

Opis wszystkich funkcji i opcji znajdziecie poniżej:


 

Aplikacja iPhone Eco Drive - śledzenie trasy

 

Uwaga dostępność pokazanych wyżej przycisków zleży zarówno od aktualnego trybu pracy jak i od wybranych opcji.

 

1.

Przycisk Start / Stop odpowiadający za rozpoczęcie i zakończenie śledzenia / rejestracji trasy.

2.

Blokowanie / odblokowanie przyciemniania, a następnie kompletnego wyłączenia ekranu iPhone w momencie, gdy nie używamy naszego urządzenia. Funkcja może być przydatna, gdy chcemy aby ekran naszego telefonu był stale widoczny.

Oczywiście z włączona blokadą czas pracy baterii naszego telefonu będzie krótszy.

Jeśli, po włączeniu blokady przełączamy się pomiędzy aplikacjami, a następnie wrócimy do ekranu śledzenia trasy Eco Drive, koniecznym okazać się może ponowne jej włączenie, ponieważ niektóre aplikacje mogą wyłączyć blokadę automatycznie w momencie, gdy są uruchamiane.

3.

Włączenie / wyłączenie rotacji wyświetlanej mapy zgodnie z kierunkiem poruszania się.

4.

Ustawienia funkcji „Route Tracking” (dokładny opis poniżej).

5.

Niebieską linią oznaczana jest trasa, po której się poruszamy (zobacz również ustawienia funkcji „Route Tracking” poniżej).

6.

Parametry poruszania się widoczne jedynie, gdy znajdujemy się w trybie śledzenia / rejestracji trasy. Aktualnie dostępne są dwa widoki parametrów poruszania się: jeden wyświetlający jedynie prędkość i drugi wyświetlający dodatkowo współrzędne geograficzne, kierunek poruszania się, przebyty dystans, oraz wysokość nad poziomem morza. Podwójne tapnięcie na aktualnie wyświetlanym widoku powoduje zmianę na drugi. Domyślny widok parametrów poruszania się można wybrać w opcjach funkcji „Route Tracking” - opcja: „Miscellaneous/Show speed only".

Znany bug: W momencie, gdy opcja „Show speed only" nie jest włączona przełączenie na nią trybie śledzenia / rejestracji trasy spowoduje ze prędkość nie będzie wyświetlana poprawnie. Bug zostanie usunięty w kolejnej wersji.


7.

Eksport zarejestrowanych danych przez email (zobacz również ustawienia funkcji „Route Tracking” poniżej).

8.

Zmiana typu mapy. Dostępne są następujące typy map: normalna - Map View (jak na ekranie powyżej), mapa satelitarna oraz hybrydowa.

9.

Rejestracja punku POI (point of interest).

10.

Przejście do ekranu zarządzania zarejestrowanymi trasami i punktami POI.

 

11.

Zresetowanie wyświetlanej trasy.

12.

Pauza. Tymczasowo zatrzymuje śledzenie / rejestrację trasy do momentu ponownego wciśnięcia.

 

Ustawienia funkcji „Route Tracking”

 

Route

1. Store route points [ON|OFF]. Włączenie / wyłączenie zapisywania trasy w bazie danych aplikacji. Zapisane dane mogą być następnie wyeksportowane z wykorzystaniem emaila.
2. Draw on map (BETA) [ON|OFF]. Włączenie / wyłączenie rysowania trasy, po której się poruszamy na mapie (funkcjonalność w wersji beta).

 

Export Route/POI(s)

1. CSV Format. Eksport zapisanych danych w formacje CSV. W trybie tym eksportowane są następujące informacje:

- identyfikator punktu (wewnętrzny),
- typ punktu (P - POI, R - punkt na trasie),
- identyfikator trasy (wewnętrzny),
- współrzędne geograficzne (długość i szerokość) punktu,
- dystans w metrach,
- prędkość w m/s,
- wysokość nad poziomem morza w metrach,
- kierunek poruszania się,
- data rejestracji w dwóch formatach,
- nazwa,
- notka,

Oraz obecnie niewykorzystywane:

- Speed Alert (POI),
- Speed Alert Note (POI)

2. Garmin’s POI format. Eksport danych w formacje CSV zgodnym z formatem POI nawigacji Garmin. Przykładowe dane poniżej:

8.218265,47.182376,["][@]["],["]POI's Comment["]
14.183534,52.350950,["][@]["],["]POI's Comment["]
18.628316,53.429343,["][@]["],["]POI's Comment["]

 3.

Export POIs only [ON|OFF]. W przypadku, gdy opcja ta jest ustawiona - ON - eksportowane będą jedynie zarejestrowane punkty POI.

 

Miscellaneous

1. Show speed only. Ustawia domyślny widok parametrów poruszania się na “wyświetlaj jedynie prędkość” widok ten można w każdej chwili zmienić za pomocą podwójnego tapnięcia.

2. Track in background. Włącza śledzenie / rejestrację trasy również, gdy aplikacja nie jest aktywna, znajduje się w tak zwanym „background mode”. Aktywacja tego trybu zwiększa zużycie baterii. 

3. Immediate POI edit. Włącza ekran podglądu / edycji parametrów POI niezwłocznie po dodaniu nowego punktu.

4. Immediate Route edit. Włącza ekran podglądu / edycji parametrów trasy niezwłocznie po zakończeniu jej rejestracji (Stop).

5. Delete all stored points. Usuwa z bazy danych aplikacji wszystkie uprzednio zarejestrowane trasy i punkty POI. Operacja ta jest operacją nieodwracalną.

 

GPS Accuracy

W sekcji tej możemy zmienić dokładność, z jaka będą rejestrowane punkty. Dostępne jest 6 następujących ustawień (od najdokładniejszego do najmniej dokładnego). Im większa dokładność śledzenia GPS tym większe zużycie baterii.

1. For Navigation
2. Best
3. Nearest Ten Meters 
4. Hundred Meters 
5. Kilometer 
6. Three Kilometers 
środa, 01 maja 2013
Programowanie iPhone - jak sprawdzić, czy data wypada między dwiema innymi datami

 

Objective-c nie dostarcza bezpośredniego mechanizmu, prostej metody, sprawdzenia czy data znajduje się / wypada pomiędzy dwiema innymi datami:


data początkowa <= data <= data końcowa

Do sprawdzenia powyższego warunku wykorzystamy metodę compare:

[date - (NSComparisonResult)compare:(NSDate *)anotherDate]


Przyjmując że:

    data początkowa = dateFrom
    data końcowa = dateTo
    data = date

odpowiedni kod mógłby wyglądać następująco:


if (([dateFrom compare:date] == NSOrderedAscending 
      || [dateFrom compare:date] == NSOrderedSame)
     && ([dateTo compare:date] == NSOrderedDescending 
      || [dateTo compare:date] == NSOrderedSame)) 
{
      NSLog(@"Date in range...");
} else {
      NSLog(@"Date not in range...");
}

 

Oczywiście powielanie tego kodu za każdym razem, gdy chcemy sprawdzić naszą datę nie wydaje się być najlepszym rozwiązaniem. Aby sprawę uprościć możemy utworzyć odpowiednią funkcję, bądź tez, co wydaje się być jeszcze lepszym rozwiązaniem, odpowiednią kategorię klasy NSDate. Poniższy kod pokazuje moją wersję kategorii „between”:

//
//  NSDate+between.h
//
//  Created by Damian on 29/04/2013.
//  Copyright (c) 2013 notatkiprogramisty.blox.pl. All rights reserved.
//
#import <Foundation/Foundation.h>

@interface NSDate (between)

   -(BOOL)isBetween:(NSDate *)startDate :(NSDate *)endDate;

@end

 

//
//  NSDate+between.m
//
//  Created by Damian on 29/04/2013.
//  Copyright (c) 2013 notatkiprogramisty.blox.pl. All rights reserved.
//
#import "NSDate+between.h"

@implementation NSDate (between)

   -(BOOL)isBetween:(NSDate *)startDate :(NSDate *)endDate {
      return ([startDate compare:self] == NSOrderedAscending || [startDate compare:self] == NSOrderedSame)
               && ([endDate compare:self] == NSOrderedDescending || [endDate compare:self] == NSOrderedSame);
   }

@end

 

A oto jak może być ona wykorzystana.

[date isBetween:dateFrom :dateTo] ? NSLog(@"[Category] Date in range...") : NSLog(@"[Category] Date not in range...");

 

Kod poniższy jest kompletnym przykładem aplikacji konsolowej Mac OS. Pokazuje on podejście wyjściowe, oparte na kilku warunkach „if”, jak i to oparte o utworzoną kategorie.

//
//  main.m
//
//  Created by Damian on 28/04/2013.
//  Copyright (c) 2013 notatkiprogramisty.blox.pl. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NSDate+between.h"

int main(int argc, const char * argv[])
{   
   @autoreleasepool {
      
      NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
      dateFormatter.timeStyle = NSDateFormatterNoStyle;
      dateFormatter.dateFormat = @"MM/dd/yyyy";
      NSDate *date, *dateFrom, *dateTo;
      
      date = [[NSDate alloc] init];
      NSLog(@"date = %@", [dateFormatter stringFromDate:date]);
      
      dateFrom = [dateFormatter dateFromString:@"12/01/2013"];
      dateTo = [dateFormatter dateFromString:@"12/31/2013"];
      
      if (([dateFrom compare:date] == NSOrderedAscending || [dateFrom compare:date] == NSOrderedSame)
          && ([dateTo compare:date] == NSOrderedDescending || [dateTo compare:date] == NSOrderedSame)) {
          NSLog(@"Date in range...");
       } else {
          NSLog(@"Date not in range...");
       }
      
      [date isBetween:dateFrom :dateTo] ? NSLog(@"[Category] Date in range...") : NSLog(@"[Category] Date not in range...");
      
      dateFrom = [dateFormatter dateFromString:@"01/01/2013"];

      if (([dateFrom compare:date] == NSOrderedAscending || [dateFrom compare:date] == NSOrderedSame)
          && ([dateTo compare:date] == NSOrderedDescending || [dateTo compare:date] == NSOrderedSame)) {
         NSLog(@"Date in range...");
      } else {
         NSLog(@"Date not in range...");
      }
      
      [date isBetween:dateFrom :dateTo] ? NSLog(@"[Category] Date in range...") : NSLog(@"[Category] Date not in range...");

    }

    return 0;
}

 

Po uruchomieniu programu powinniśmy zobaczyć informacje podobne do poniższych:

2013-04-29 00:14:20.045 [1577:303] date = 04/29/2013
2013-04-29 00:14:20.046 [1577:303] Date not in range...
2013-04-29 00:14:20.047 [1577:303] [Category] Date not in range...
2013-04-29 00:14:20.048 [1577:303] Date in range...
2013-04-29 00:14:20.048 [1577:303] [Category] Date in range...

Datą porównywaną powyżej jest 29 kwietnia 2013. Sprawdzane są następujące przedziały:

12/01/2013
01/01/2013


Linia:


date = [[NSDate alloc] init];

 

inicjalizuje nasza zmienna „date” datą dzisiejszą, co będzie oczywiście skutkowało nieco innym rezultatem w momencie, gdy program zostanie uruchomiony w innym dniu.


Dodatkowe informacje / linki:

NSDate Class Reference

Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time