/*
* Copyright (C) 2010-2011 Dmitry Petuhov
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.pvoid.apteryxaustralis.storage.osmp;
import android.content.Context;
import android.os.AsyncTask;
import org.pvoid.apteryxaustralis.TextFormat;
import org.pvoid.apteryxaustralis.R;
import org.pvoid.apteryxaustralis.storage.ICommandResult;
import org.pvoid.apteryxaustralis.storage.IStorage;
import org.pvoid.apteryxaustralis.types.ITerminal;
import org.pvoid.apteryxaustralis.types.InfoLine;
import org.pvoid.apteryxaustralis.types.StatusLine;
import org.pvoid.apteryxaustralis.types.TerminalAction;
import java.util.List;
public class Terminal implements ITerminal
{
protected final static int OSMP_STATE_OK = 0;
protected final static int OSMP_STATE_WARRNING = 2;
protected final static int OSMP_STATE_ERROR = 1;
private final static int ACTION_REBOOT = 0;
private final static int ACTION_POWER_OFF = 1;
private final static int STATE_PRINTER_STACKER_ERROR = 1;// Автомат остановлен из-за ошибок купюроприемника или принтера
private final static int STATE_INTERFACE_ERROR = 2; //Автомат остановлен из-за ошибки в конфигурации интерфейса.
// Новый интерфейс загружается с сервера
private final static int STATE_UPLOADING_UPDATES = 4; // Автомат загружает с сервера обновление приложения
private final static int STATE_DEVICES_ABSENT = 8; // Автомат остановлен из-за того, что при старте не обнаружено
// оборудование (купюроприемник или принтер)
private final static int STATE_WATCHDOG_TIMER = 0x10; // Работает сторожевой таймер
private final static int STATE_PAPER_COMING_TO_END = 0x20; // В принтере скоро закончится бумага
private final static int STATE_STACKER_REMOVED = 0x40; // C автомата был снят купюроприемник
private final static int STATE_ESSENTIAL_ELEMENTS_ERROR = 0x80; // Отсутствуют или неверно заполнены один или
// несколько реквизитов для терминала
private final static int STATE_HARDDRIVE_PROBLEMS = 0x100; //256 Проблемы с жестким диском
private final static int STATE_STOPPED_DUE_BALANCE = 0x200; // Остановлен по сигналу сервера или из-за отсутствия денег на счету агента
private final static int STATE_HARDWARE_OR_SOFTWARE_PROBLEM = 0x400; // Остановлен из-за проблем с железом или интерфейса
private final static int STATE_HAS_SECOND_MONITOR = 0x800; // Автомат оснащен вторым монитором.
private final static int STATE_ALTERNATE_NETWORK_USED = 0x1000; // Автомат использует альтернативную сеть
private final static int STATE_UNAUTHORIZED_SOFTWARE = 0x2000; // Используется ПО, вызывающее сбои в работе автомата
private final static int STATE_PROXY_SERVER = 0x4000; // Автомат работает через прокси
private final static int STATE_UPDATING_CONFIGURATION = 0x10000; // Терминал обновляет конфигурацию
private final static int STATE_UPDATING_NUMBERS = 0x20000; // Терминал обновляет номерные емкости.
private final static int STATE_UPDATING_PROVIDERS = 0x40000; // Терминал обновляет список провайдеров.
private final static int STATE_UPDATING_ADVERT = 0x80000; // Терминал проверяет и обновляет рекламный плэйлист.
private final static int STATE_UPDATING_FILES = 0x100000; // Терминал проверяет и обновляет файлы.
private final static int STATE_FAIR_FTP_IP = 0x200000; // Подменен IP-адрес FTP сервера
private final static int STATE_ASO_MODIFIED = 0x400000; // Модифицировано приложение АСО.
private final static int STATE_INTERFACE_MODIFIED = 0x800000; // Модифицирован интерфейс
private final static int STATE_ASO_ENABLED = 0x1000000; // Монитор АСО выключен.
private int _mState;
public String printer_state;
public String cashbin_state;
public int cash;
public long lastActivity;
public long lastPayment;
public int bondsCount;
public String balance;
public int signalLevel;
public String softVersion;
public String printerModel;
public String cashbinModel;
public int bonds10count;
public int bonds50count;
public int bonds100count;
public int bonds500count;
public int bonds1000count;
public int bonds5000count;
public int bonds10000count;
public String paysPerHour;
public long agentId;
public String agentName;
public int ms;
protected String address;
protected long tid;
public Terminal(long id, String address)
{
this.tid = id;
this.address = address;
}
public String Address()
{
return address;
}
public long id()
{
return(tid);
}
public void State(int state)
{
this._mState = state;
}
public int State()
{
return(_mState);
}
public void update(Terminal terminal)
{
_mState = terminal.State();
printer_state = terminal.printer_state;
cashbin_state = terminal.cashbin_state;
cash = terminal.cash;
lastActivity = terminal.lastActivity;
lastPayment = terminal.lastPayment;
bondsCount = terminal.bondsCount;
balance = terminal.balance;
signalLevel = terminal.signalLevel;
softVersion = terminal.softVersion;
printerModel = terminal.printerModel;
cashbinModel = terminal.cashbinModel;
bonds10count = terminal.bonds10count;
bonds50count = terminal.bonds50count;
bonds100count = terminal.bonds100count;
bonds500count = terminal.bonds500count;
bonds1000count = terminal.bonds1000count;
bonds5000count = terminal.bonds5000count;
bonds10000count = terminal.bonds10000count;
paysPerHour = terminal.paysPerHour;
agentId = terminal.agentId;
agentName = terminal.agentName;
address = terminal.address;
ms = terminal.ms;
}
@Override
public String toString()
{
return address;
}
@Override
public long getId()
{
return tid;
}
@Override
public int getState()
{
switch(_mState)
{
case OSMP_STATE_OK:
return ITerminal.STATE_OK;
case OSMP_STATE_WARRNING:
return ITerminal.STATE_WARNING;
default:
if("OK".equals(printer_state) || System.currentTimeMillis() - lastActivity>60*60*1000)
return ITerminal.STATE_ERROR_CRITICAL;
return ITerminal.STATE_ERROR;
}
}
@Override
public String getTitle()
{
return address;
}
@Override
public String getStatus(Context context)
{
////////// Ошибки принтера или купюроприемника вперед
if(!"OK".equals(cashbin_state))
return context.getString(R.string.cachebin) + ": " + cashbin_state;
if(!"OK".equals(printer_state))
return context.getString(R.string.printer) + ": " + printer_state;
////////// Потом проверим флаги. Сначала ошибки железа
if((ms & STATE_PRINTER_STACKER_ERROR) !=0)
return context.getString(R.string.STATE_PRINTER_STACKER_ERROR);
if((ms & STATE_STACKER_REMOVED) !=0)
return context.getString(R.string.STATE_STACKER_REMOVED);
if((ms & STATE_HARDDRIVE_PROBLEMS) !=0)
return context.getString(R.string.STATE_HARDDRIVE_PROBLEMS);
if((ms & STATE_DEVICES_ABSENT) !=0)
return context.getString(R.string.STATE_DEVICES_ABSENT);
if((ms & STATE_HARDWARE_OR_SOFTWARE_PROBLEM) !=0)
return context.getString(R.string.STATE_HARDWARE_OR_SOFTWARE_PROBLEM);
////////// Потом вероятные угрозы
if((ms & STATE_ASO_MODIFIED) !=0)
return context.getString(R.string.STATE_ASO_MODIFIED);
if((ms & STATE_INTERFACE_MODIFIED) !=0)
return context.getString(R.string.STATE_INTERFACE_MODIFIED);
/*if((ms & STATE_FAIR_FTP_IP) !=0)
return context.getString(R.string.STATE_FAIR_FTP_IP);*/
if((ms & STATE_UNAUTHORIZED_SOFTWARE) !=0)
return context.getString(R.string.STATE_UNAUTHORIZED_SOFTWARE);
////////// Ошибки настройки
if((ms & STATE_INTERFACE_ERROR) !=0)
return context.getString(R.string.STATE_INTERFACE_ERROR);
if((ms & STATE_STOPPED_DUE_BALANCE) !=0)
return context.getString(R.string.STATE_STOPPED_DUE_BALANCE);
///////// Ну и прочее
if((ms & STATE_PAPER_COMING_TO_END) !=0)
return context.getString(R.string.STATE_PAPER_COMING_TO_END);
StringBuilder status = new StringBuilder();
switch(_mState)
{
case OSMP_STATE_OK:
status.append(context.getString(R.string.fullinfo_cash)).append(' ').append(cash);
break;
case OSMP_STATE_WARRNING:
status.append(context.getString(R.string.last_payment))
.append(' ')
.append(TextFormat.formatDateSmart(context, lastPayment));
break;
case OSMP_STATE_ERROR:
status.append(context.getString(R.string.last_activity))
.append(' ')
.append(TextFormat.formatDateSmart(context, lastActivity));
break;
}
return status.toString();
}
@Override
public void getStatuses(Context context, List<StatusLine> statuses)
{
if(!"OK".equals(printer_state))
statuses.add(new StatusLine(printer_state,StatusLine.STATE_ERROR));
if(!"OK".equals(cashbin_state))
statuses.add(new StatusLine(cashbin_state,StatusLine.STATE_ERROR));
/*if(ms & STATE_PRINTER_STACKER_ERROR != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_PRINTER_STACKER_ERROR)));*/
if((ms & STATE_INTERFACE_ERROR) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_INTERFACE_ERROR),StatusLine.STATE_ERROR));
if((ms & STATE_UPLOADING_UPDATES) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UPLOADING_UPDATES),StatusLine.STATE_OK));
if((ms & STATE_DEVICES_ABSENT) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_DEVICES_ABSENT),StatusLine.STATE_ERROR));
if((ms & STATE_WATCHDOG_TIMER) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_WATCHDOG_TIMER),StatusLine.STATE_OK));
if((ms & STATE_PAPER_COMING_TO_END) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_PAPER_COMING_TO_END),StatusLine.STATE_ERROR));
if((ms & STATE_STACKER_REMOVED) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_STACKER_REMOVED),StatusLine.STATE_ERROR));
if((ms & STATE_ESSENTIAL_ELEMENTS_ERROR) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_ESSENTIAL_ELEMENTS_ERROR),StatusLine.STATE_ERROR));
if((ms & STATE_HARDDRIVE_PROBLEMS) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_HARDDRIVE_PROBLEMS),StatusLine.STATE_ERROR));
if((ms & STATE_STOPPED_DUE_BALANCE) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_STOPPED_DUE_BALANCE),StatusLine.STATE_ERROR));
if((ms & STATE_HARDWARE_OR_SOFTWARE_PROBLEM) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_HARDWARE_OR_SOFTWARE_PROBLEM),StatusLine.STATE_ERROR));
if((ms & STATE_HAS_SECOND_MONITOR) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_HAS_SECOND_MONITOR),StatusLine.STATE_OK));
if((ms & STATE_ALTERNATE_NETWORK_USED) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_ALTERNATE_NETWORK_USED),StatusLine.STATE_ERROR));
if((ms & STATE_UNAUTHORIZED_SOFTWARE) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UNAUTHORIZED_SOFTWARE),StatusLine.STATE_ERROR));
if((ms & STATE_PROXY_SERVER) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_PROXY_SERVER),StatusLine.STATE_OK));
if((ms & STATE_UPDATING_CONFIGURATION) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UPDATING_CONFIGURATION),StatusLine.STATE_OK));
if((ms & STATE_UPDATING_NUMBERS) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UPDATING_NUMBERS),StatusLine.STATE_OK));
if((ms & STATE_UPDATING_PROVIDERS) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UPDATING_PROVIDERS),StatusLine.STATE_OK));
if((ms & STATE_UPDATING_ADVERT) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UPDATING_ADVERT),StatusLine.STATE_OK));
if((ms & STATE_UPDATING_FILES) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_UPDATING_FILES),StatusLine.STATE_OK));
if((ms & STATE_FAIR_FTP_IP) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_FAIR_FTP_IP),StatusLine.STATE_ERROR));
if((ms & STATE_ASO_MODIFIED) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_ASO_MODIFIED),StatusLine.STATE_ERROR));
if((ms & STATE_INTERFACE_MODIFIED) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_INTERFACE_MODIFIED),StatusLine.STATE_ERROR));
if((ms & STATE_ASO_ENABLED) != 0)
statuses.add(new StatusLine(context.getString(R.string.STATE_ASO_ENABLED),StatusLine.STATE_ERROR));
}
@Override
public void getInfo(Context context, List<InfoLine> statuses)
{
statuses.add(new InfoLine(context.getString(R.string.fullinfo_cash),TextFormat.formatMoney(cash,true)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_last_payment), TextFormat.formatDateSmart(context, lastPayment)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_last_activity), TextFormat.formatDateSmart(context, lastActivity)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_pays_per_hour),paysPerHour));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_balance),balance));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_signal_level),Integer.toString(signalLevel)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_soft_version),softVersion));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds),Integer.toString(bondsCount)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds10),Integer.toString(bonds10count)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds50),Integer.toString(bonds50count)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds100),Integer.toString(bonds100count)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds500),Integer.toString(bonds500count)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds1000),Integer.toString(bonds1000count)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_bonds5000),Integer.toString(bonds5000count)));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_printer),printerModel));
statuses.add(new InfoLine(context.getString(R.string.fullinfo_cashbin),cashbinModel));
}
@Override
public void getActions(Context context, List<TerminalAction> actions)
{
actions.add(new TerminalAction(ACTION_REBOOT,context.getString(R.string.reboot)));
//actions.add(new TerminalAction(ACTION_POWER_OFF,context.getString(R.string.switchoff)));
}
@Override
public void runAction(IStorage storage, int action, ICommandResult resultHandler)
{
OsmpStorage strg;
//////////
try
{
strg = (OsmpStorage) storage;
}
catch(ClassCastException e)
{
e.printStackTrace();
resultHandler.onCommandResult(false,R.string.cant_obtain_storage,address);
return;
}
//////////
switch(action)
{
case ACTION_REBOOT:
(new RebootTerminalTask(address,strg,resultHandler)).execute(tid, agentId);
break;
case ACTION_POWER_OFF:
//result = strg.switchOffTerminal(tid,agentId);
break;
}
}
@Override
public int getCash()
{
return cash;
}
private static class RebootTerminalTask extends AsyncTask<Long,Void,Integer>
{
private final String _mName;
private final ICommandResult _mHandler;
private final OsmpStorage _mStorage;
public RebootTerminalTask(String name, OsmpStorage storage, ICommandResult handler)
{
_mName = name;
_mHandler = handler;
_mStorage = storage;
}
@Override
protected Integer doInBackground(Long... longs)
{
return _mStorage.rebootTerminal(longs[0],longs[1]);
}
@Override
protected void onPostExecute(Integer result)
{
if(result == IStorage.RES_OK)
_mHandler.onCommandResult(true,R.string.reboot_command_sended,_mName);
else
_mHandler.onCommandResult(false,R.string.network_error,_mName);
}
}
}