/** @file StationName.java
*
* @author marco corvi
* @date nov 2011
*
* @brief TopoDroid station naming
* --------------------------------------------------------
* Copyright This sowftare is distributed under GPL-3.0 or later
* See the file COPYING.
* --------------------------------------------------------
*/
package com.topodroid.DistoX;
import android.util.Log;
import java.util.List;
class StationName
{
// ----------------------------------------------------------------
// current station(s)
private String mCurrentStationName = null;
void setCurrentStationName( String name )
{
if ( name == null || name.equals(mCurrentStationName) ) {
mCurrentStationName = null; // clear
} else {
mCurrentStationName = name;
}
}
String getCurrentStationName() { return mCurrentStationName; }
boolean isCurrentStationName( String name ) { return name.equals(mCurrentStationName); }
// FIXME
// not efficient: use a better select with reverse order and test on FROM
private String getLastStationName( DataHelper data_helper, long sid )
{
DistoXDBlock last = null;
List<DistoXDBlock> list = data_helper.selectAllShots( sid, TopoDroidApp.STATUS_NORMAL );
for ( DistoXDBlock blk : list ) {
if ( blk.mFrom != null && blk.mFrom.length() > 0 ) { last = blk; }
}
if ( last == null ) return "0";
if ( last.mTo == null || last.mTo.length() == 0 ) return last.mFrom;
if ( TDSetting.mSurveyStations == 1 ) return last.mTo; // forward-shot
return last.mFrom;
}
String getCurrentOrLastStation( DataHelper data_helper, long sid )
{
if ( mCurrentStationName != null ) return mCurrentStationName;
return getLastStationName( data_helper, sid );
}
void clearCurrentStations()
{
mCurrentStationName = null;
}
private void setLegExtend( DataHelper data_helper, long sid, DistoXDBlock prev )
{
// FIXME what has "splay extend" to do with "leg extend" ???
// if ( ! TDSetting.mSplayExtend )
{
long extend = TDAzimuth.computeLegExtend( prev.mBearing );
data_helper.updateShotExtend( prev.mId, sid, extend, true );
}
}
void assignStationsAfter_Tripod( DataHelper data_helper, long sid, DistoXDBlock blk0, List<DistoXDBlock> list )
{
// Log.v("DistoX", "assign stations after. size " + list.size() );
boolean increment = true;
boolean flip = false; // whether to swap leg-stations (backsight backward shot)
// TDLog.Log( TDLog.LOG_DATA, "assign Stations() policy " + survey_stations + "/" + shot_after_splay + " nr. shots " + list.size() );
DistoXDBlock prev = null;
String from = blk0.mFrom;
String back = blk0.mTo;
if ( DistoXStationName.isLessOrEqual( blk0.mFrom, blk0.mTo ) ) { // forward
flip = true;
// move next
// back = blk0.mTo;
from = DistoXStationName.increment( blk0.mTo );
} else { // backward
// increment = false;
flip = false;
}
String next = DistoXStationName.increment( from );
String station = from;
// Log.v("DistoX", "* " + oldFrom + " " + from + "-" + back + "-" + next + ":" + station + " flip=" + (flip?"y":"n") );
for ( DistoXDBlock blk : list ) {
if ( blk.mType == DistoXDBlock.BLOCK_SPLAY ) {
if ( flip ) {
flip = false;
}
// blk.mFrom = station;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v("DistoX", "S:"+ station + " " + oldFrom + " " + from + "-" + back + "-" + next + ":" + station + " flip=" + (flip?"y":"n") );
} else if ( blk.mType == DistoXDBlock.BLOCK_MAIN_LEG ) {
if ( blk.mId != blk0.mId ) {
String p_from = from;
String p_to = next;
if ( flip ) { // backward
flip = false;
p_to = back;
} else { // forward
flip = true;
if ( increment ) {
// move for
back = next;
from = DistoXStationName.increment( next );
next = DistoXStationName.increment( from );
station = from;
} else {
increment = true;
}
}
blk.setName( p_from, p_to );
data_helper.updateShotName( blk.mId, sid, p_from, p_to, true ); // LEG
// Log.v("DistoX", "L:"+from+"-"+ p_to + " " + oldFrom + " " + from + "-" + back + "-" + next + ":" + station + " flip=" + (flip?"y":"n") );
}
}
}
}
void assignStations_Tripod( DataHelper data_helper, long sid, List<DistoXDBlock> list )
{
DistoXDBlock prev = null;
String from = DistoXStationName.mSecondStation; // 1
String back = DistoXStationName.mInitialStation; // 0
String next = DistoXStationName.increment( from ); // 2
boolean flip = true; // whether to swap leg-stations (backsight backward shot)
String station = ( mCurrentStationName != null )? mCurrentStationName : from;
int nrLegShots = 1;
for ( DistoXDBlock blk : list ) {
// Log.v("DistoX", blk.mId + " <" + blk.mFrom + ">-<" + blk.mTo + "> F " + from + " T " + back + " N " + next );
if ( blk.mFrom.length() == 0 ) // this implies blk.mTo.length() == 0
{
// Log.v( "DistoX", blk.mId + " EMPTY FROM. prev " + ( (prev==null)? "null" : prev.mId ) );
if ( prev == null ) {
prev = blk;
// blk.mFrom = station;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v( "DistoX", blk.mId + " FROM " + blk.mFrom + " PREV null" );
} else {
if ( prev.isRelativeDistance( blk ) ) {
if ( nrLegShots == 0 ) {
// checkCurrentStationName
if ( mCurrentStationName != null ) {
// if ( forward_shots ) {
from = mCurrentStationName;
// } else if ( survey_stations == 2 ) {
// back = mCurrentStationName;
// }
}
nrLegShots = 2; // prev and this shot
} else {
nrLegShots ++; // one more centerline shot
}
if ( nrLegShots == TDSetting.mMinNrLegShots ) {
mCurrentStationName = null;
// Log.v("DistoX", "P " + prev.mId + " " + from + "-" + back + "-" + next + " " + station + " flip=" + (flip?"y":"n") );
String prev_from = from;
String prev_to = back;
if ( flip ) {
flip = false;
} else {
flip = true;
prev_to = next;
// move forward
back = next;
from = DistoXStationName.increment( next, list );
next = DistoXStationName.increment( from );
}
station = from;
// Log.v("DistoX", "P: (" + prev_from + "-" + prev_to + ") " + from + "-" + back + "-" + next + " " + station + " flip=" + (flip?"y":"n") );
prev.setName( prev_from, prev_to );
data_helper.updateShotName( prev.mId, sid, prev_from, prev_to, true ); // LEG
setLegExtend( data_helper, sid, prev );
}
} else { // distance from prev > "closeness" setting
if ( nrLegShots == 0 ) {
if ( flip ) {
flip = false;
if ( prev != null && prev.mTo.length() == 0 ) {
if ( ! prev.mFrom.equals( station ) ) {
prev.setName( station, "" );
data_helper.updateShotName( prev.mId, sid, station, "", true ); // SPLAY
}
}
}
} else { // only when coming from a LEG
// if ( mCurrentStationName == null ) {
// station = from;
// }
}
nrLegShots = 0;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v( "DistoX", "non-close: b " + blk.mId + " <" + blk.mFrom + "> " + from + "-" + back + "-" + next + " " + station + " flip=" + (flip?"y":"n") );
prev = blk;
}
}
}
else // blk.mFrom.length > 0
{
if ( blk.mTo.length() > 0 ) // FROM non-empty, TO non-empty --> LEG
{
// Log.v("DistoX", blk.mId + " [" + blk.mFrom + "-" + blk.mTo + "] " + from + "-" + back + "-" + next + " " + station );
if ( DistoXStationName.isLessOrEqual( blk.mFrom, blk.mTo ) ) { // forward shot
flip = true;
back = blk.mTo;
from = DistoXStationName.increment( back, list );
next = DistoXStationName.increment( from );
} else { // backward shot
flip = false;
from = blk.mFrom;
back = blk.mTo;
next = DistoXStationName.increment( from, list );
}
if ( mCurrentStationName == null ) station = from;
// Log.v("DistoX", " " + from + "-" + back + "-" + next + " " + station + " flip=" + (flip? "y":"n") );
nrLegShots = TDSetting.mMinNrLegShots;
}
else // FROM non-empty, TO empty --> SPLAY
{
if ( nrLegShots == 0 ) {
flip = false;
}
nrLegShots = 0;
}
prev = blk;
}
}
}
void assignStationsAfter_Backsight( DataHelper data_helper, long sid, DistoXDBlock blk0, List<DistoXDBlock> list )
{
// Log.v("DistoX", "assign stations after. size " + list.size() );
boolean shot_after_splays = TDSetting.mShotAfterSplays;
boolean increment = true;
boolean flip = false; // whether to swap leg-stations (backsight backward shot)
// TDLog.Log( TDLog.LOG_DATA, "assign Stations() policy " + survey_stations + "/" + shot_after_splay + " nr. shots " + list.size() );
DistoXDBlock prev = null;
String from = blk0.mFrom;
String to = blk0.mTo;
String next;
String station;
if ( DistoXStationName.isLessOrEqual( blk0.mFrom, blk0.mTo ) ) { // forward
flip = true;
station = to;
next = DistoXStationName.increment( station );
} else { // backward
increment = false;
flip = false;
station = from;
to = DistoXStationName.increment( from );
next = DistoXStationName.increment( to );
}
String oldFrom = blk0.mFrom;
// int nrLegShots = 0;
// Log.v("DistoX", "* " + oldFrom + " " + from + "-" + to + "-" + next + ":" + station + " flip=" + (flip?"y":"n") );
for ( DistoXDBlock blk : list ) {
if ( blk.mType == DistoXDBlock.BLOCK_SPLAY ) {
if ( flip ) {
flip = false;
}
// blk.mFrom = station;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v("DistoX", "S:"+ station + " " + oldFrom + " " + from + "-" + to + "-" + next + ":" + station + " flip=" + (flip?"y":"n") );
} else if ( blk.mType == DistoXDBlock.BLOCK_MAIN_LEG ) {
if ( blk.mId != blk0.mId ) {
String p_to;
if ( flip ) { // backward
flip = false;
p_to = oldFrom;
from = to;
station = from;
} else { // forward
flip = true;
if ( increment ) {
from = to;
to = next;
next = DistoXStationName.increment( to );
} else {
increment = true;
}
p_to = to;
oldFrom = from;
station = to;
}
blk.setName( from, p_to );
data_helper.updateShotName( blk.mId, sid, from, p_to, true ); // LEG
// Log.v("DistoX", "L:"+from+"-"+ p_to + " " + oldFrom + " " + from + "-" + to + "-" + next + ":" + station + " flip=" + (flip?"y":"n") );
}
}
}
}
void assignStations_Backsight( DataHelper data_helper, long sid, List<DistoXDBlock> list )
{
// mSecondLastShotId = lastShotId(); // FIXME this probably not needed
// Log.v("DistoX", "assign stations. size " + list.size() );
DistoXDBlock prev = null;
String from = DistoXStationName.mInitialStation;
String to = DistoXStationName.mSecondStation;
String oldFrom = "empty"; // FIXME
boolean flip = false; // whether to swap leg-stations (backsight backward shot)
String station = ( mCurrentStationName != null )? mCurrentStationName : from;
// Log.v("DistoX", "assign stations: F <" + from + "> T <" + to + "> st. <" + station + "> Blk size " + list.size() );
// Log.v("DistoX", "Current St. " + ( (mCurrentStationName==null)? "null" : mCurrentStationName ) );
int nrLegShots = 0;
for ( DistoXDBlock blk : list ) {
// Log.v("DistoX", blk.mId + " <" + blk.mFrom + ">-<" + blk.mTo + "> F " + from + " T " + to + " OF " + oldFrom );
if ( blk.mFrom.length() == 0 ) // this implies blk.mTo.length() == 0
{
// Log.v( "DistoX", blk.mId + " EMPTY FROM. prev " + ( (prev==null)? "null" : prev.mId ) );
if ( prev == null ) {
prev = blk;
// blk.mFrom = station;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v( "DistoX", blk.mId + " FROM " + blk.mFrom + " PREV null" );
} else {
if ( prev.isRelativeDistance( blk ) ) {
if ( nrLegShots == 0 ) {
// checkCurrentStationName
if ( mCurrentStationName != null ) {
// if ( forward_shots ) {
from = mCurrentStationName;
// } else if ( survey_stations == 2 ) {
// to = mCurrentStationName;
// }
}
nrLegShots = 2; // prev and this shot
} else {
nrLegShots ++; // one more centerline shot
}
if ( nrLegShots == TDSetting.mMinNrLegShots ) {
mCurrentStationName = null;
// Log.v("DistoX", "P " + prev.mId + " " + oldFrom + "-" + from + "-" + to + "-" + station + " flip=" + (flip?"y":"n") );
String prev_from = from;
String prev_to = to;
if ( flip ) { // 2 backsight backward shot from--old_from
prev_to = oldFrom; // 1
station = from;
flip = false;
} else { // 2 backsight forward shot from--to
// prev_to = to; // 3
oldFrom = from; // 2
from = to; // 3
station = to;
to = DistoXStationName.increment( to,list ); // next-shot-to = increment next-shot-from
flip = true;
}
// Log.v("DistoX", "P: (" + prev_from + "-" + prev_to + ") " + oldFrom + "-" + from + "-" + to + "-" + station + " flip=" + (flip?"y":"n") );
prev.setName( prev_from, prev_to );
data_helper.updateShotName( prev.mId, sid, prev_from, prev_to, true ); // LEG
setLegExtend( data_helper, sid, prev );
}
} else { // distance from prev > "closeness" setting
if ( nrLegShots == 0 ) {
flip = false;
} else { // only when coming from a LEG
if ( mCurrentStationName == null ) {
station = from;
// } else {
// station = mCurrentStationName;
}
}
nrLegShots = 0;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v( "DistoX", "non-close: b " + blk.mId + " <" + blk.mFrom + "> " + oldFrom + "-" + from + "-" + to + "-" + station + " flip=" + (flip?"y":"n") );
prev = blk;
}
}
}
else // blk.mFrom.length > 0
{
if ( blk.mTo.length() > 0 ) // FROM non-empty, TO non-empty --> LEG
{
// Log.v("DistoX", blk.mId + " [" + blk.mFrom + "-" + blk.mTo + "] " + oldFrom + "-" + from + "-" + to + "-" + station );
if ( blk.mTo.equals( oldFrom ) ) {
flip = false;
} else {
flip = true;
oldFrom = blk.mFrom;
from = blk.mTo;
to = DistoXStationName.increment( from, list );
if ( mCurrentStationName == null ) {
station = blk.mTo;
} // otherwise station = mCurrentStationName
}
// Log.v("DistoX", " " + oldFrom + "-" + from + "-" + to + "-" + station + " flip=" + (flip? "y":"n") );
nrLegShots = TDSetting.mMinNrLegShots;
}
else // FROM non-empty, TO empty --> SPLAY
{
if ( nrLegShots == 0 ) flip = false;
nrLegShots = 0;
}
prev = blk;
}
}
}
void assignStationsAfter_Default( DataHelper data_helper, long sid, DistoXDBlock blk0, List<DistoXDBlock> list )
{
// Log.v("DistoX", "assign stations after. size " + list.size() );
int survey_stations = TDSetting.mSurveyStations;
if ( survey_stations <= 0 ) return;
boolean forward_shots = ( survey_stations == 1 );
boolean shot_after_splays = TDSetting.mShotAfterSplays;
boolean increment = true;
boolean flip = false; // whether to swap leg-stations (backsight backward shot)
// TDLog.Log( TDLog.LOG_DATA, "assign Stations() policy " + survey_stations + "/" + shot_after_splay + " nr. shots " + list.size() );
DistoXDBlock prev = null;
String from = blk0.mFrom;
String to = blk0.mTo;
String next;
String station;
if ( forward_shots ) {
next = DistoXStationName.increment( to );
station = shot_after_splays ? to : from;
} else {
next = DistoXStationName.increment( from );
station = shot_after_splays ? next : from;
}
// int nrLegShots = 0;
for ( DistoXDBlock blk : list ) {
if ( blk.mType == DistoXDBlock.BLOCK_SPLAY ) {
// blk.mFrom = station;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
} else if ( blk.mType == DistoXDBlock.BLOCK_MAIN_LEG ) {
if ( blk.mId != blk0.mId ) {
if ( forward_shots ) {
from = to;
to = next;
next = DistoXStationName.increment( to );
station = shot_after_splays ? to : from;
} else {
to = from;
from = next;
next = DistoXStationName.increment( from );
station = shot_after_splays ? next : from;
}
// blk.mFrom = from;
// blk.mTo = to;
blk.setName( from, to );
data_helper.updateShotName( blk.mId, sid, from, to, true ); // SPLAY
}
}
}
}
void assignStations_Default( DataHelper data_helper, long sid, List<DistoXDBlock> list )
{
// mSecondLastShotId = lastShotId(); // FIXME this probably not needed
// Log.v("DistoX", "assign stations. size " + list.size() );
int survey_stations = TDSetting.mSurveyStations;
if ( survey_stations <= 0 ) return;
boolean forward_shots = ( survey_stations == 1 );
boolean shot_after_splay = TDSetting.mShotAfterSplays;
// TDLog.Log( TDLog.LOG_DATA, "assign Stations() policy " + survey_stations + "/" + shot_after_splay + " nr. shots " + list.size() );
DistoXDBlock prev = null;
String from = ( forward_shots )? DistoXStationName.mInitialStation // next FROM station
: DistoXStationName.mSecondStation;
String to = ( forward_shots )? DistoXStationName.mSecondStation // nect TO station
: DistoXStationName.mInitialStation;
String station = ( mCurrentStationName != null )? mCurrentStationName
: (shot_after_splay ? from : ""); // splays station
// Log.v("DistoX", "assign stations: F <" + from + "> T <" + to + "> st. <" + station + "> Blk size " + list.size() );
// Log.v("DistoX", "Current St. " + ( (mCurrentStationName==null)? "null" : mCurrentStationName ) );
int nrLegShots = 0;
for ( DistoXDBlock blk : list ) {
if ( blk.mFrom.length() == 0 ) // this implies blk.mTo.length() == 0
{
// Log.v( "DistoX", blk.mId + " EMPTY FROM. prev " + ( (prev==null)? "null" : prev.mId ) );
if ( prev == null ) {
prev = blk;
// blk.mFrom = station;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
// Log.v( "DistoX", blk.mId + " FROM " + blk.mFrom + " PREV null" );
} else {
if ( prev.isRelativeDistance( blk ) ) {
if ( nrLegShots == 0 ) {
// checkCurrentStationName
if ( mCurrentStationName != null ) {
if ( forward_shots ) {
from = mCurrentStationName;
} else if ( survey_stations == 2 ) {
to = mCurrentStationName;
}
}
nrLegShots = 2; // prev and this shot
} else {
nrLegShots ++; // one more centerline shot
}
if ( nrLegShots == TDSetting.mMinNrLegShots ) {
mCurrentStationName = null;
// Log.v( "DistoX", "PREV " + prev.mId + " nrLegShots " + nrLegShots + " set PREV " + from + "-" + to );
prev.setName( from, to );
data_helper.updateShotName( prev.mId, sid, from, to, true ); // LEG
setLegExtend( data_helper, sid, prev );
if ( forward_shots ) {
station = shot_after_splay ? to : from; // splay-station = this-shot-to if splays before shot
// this-shot-from if splays after shot
from = to; // next-shot-from = this-shot-to
to = DistoXStationName.increment( to, list ); // next-shot-to = increment next-shot-from
// Log.v("DistoX", "station [1] " + station + " FROM " + from + " TO " + to );
} else { // backward_shots
to = from; // next-shot-to = this-shot-from
from = DistoXStationName.increment( from,list ); // next-shot-from = increment this-shot-from
station = shot_after_splay ? from : to; // splay-station = next-shot-from if splay before shot
// = this-shot-from if splay after shot
// Log.v("DistoX", "station [2] " + station + " FROM " + from + " TO " + to );
}
}
} else { // distance from prev > "closeness" setting
nrLegShots = 0;
blk.setName( station, "" );
data_helper.updateShotName( blk.mId, sid, blk.mFrom, "", true ); // SPLAY
prev = blk;
}
}
}
else // blk.mFrom.length > 0
{
if ( blk.mTo.length() > 0 ) // FROM non-empty, TO non-empty --> LEG
{
if ( forward_shots ) { // : ..., 0-1, 1-2 ==> from=(2) to=Next(2)=3 ie 2-3
from = blk.mTo;
to = DistoXStationName.increment( from, list );
if ( mCurrentStationName == null ) {
station = shot_after_splay ? blk.mTo // 1, 1, 1-2, [ 2, 2, ..., 2-3 ] ...
: blk.mFrom; // 1-2, 1, 1, [ 2-3, 2, 2, ... ] ...
} // otherwise station = mCurrentStationName
} else { // backward shots: ..., 1-0, 2-1 ==> from=Next(2)=3 to=2 ie 3-2
to = blk.mFrom;
from = DistoXStationName.increment( to, list ); // FIXME it was from
if ( mCurrentStationName == null ) {
station = shot_after_splay ? from // 2, 2, 2, 2-1, [ 3, 3, ..., 3-2 ] ...
: blk.mFrom; // 2-1, 2, 2, 2, [ 3-2, 3, 3, ... 3 ] ...
} // otherwise station = mCurrentStationName
}
nrLegShots = TDSetting.mMinNrLegShots;
}
else // FROM non-empty, TO empty --> SPLAY
{
nrLegShots = 0;
}
prev = blk;
}
}
}
}