00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "pent_include.h"
00020
00021 #include "InverterProcess.h"
00022 #include "Kernel.h"
00023 #include "GUIApp.h"
00024
00025 #include "IDataSource.h"
00026 #include "ODataSource.h"
00027
00028 static unsigned int states[] = { 0, 8, 63, 211, 493, 945, 1594, 2459, 3552,
00029 4870, 6406, 8139, 10042, 12078, 14207, 16384,
00030 18561, 20690, 22726, 24629, 26362, 27898,
00031 29216, 30308, 31174, 31823, 32274, 32556,
00032 32704, 32760, 32768,
00033 32775, 32831, 32979, 33261, 33713, 34362,
00034 35227, 36320, 37638, 39174, 40907, 42810,
00035 44846, 46975, 49152, 51328, 53457, 55494,
00036 57396, 59129, 60665, 61984, 63076, 63942,
00037 64591, 65042, 65324, 65472, 65528, 65536 };
00038
00039 InverterProcess *InverterProcess::inverter = 0;
00040
00041
00042 DEFINE_RUNTIME_CLASSTYPE_CODE(InverterProcess,Process)
00043
00044 InverterProcess::InverterProcess()
00045 : Process()
00046 {
00047
00048 }
00049
00050 InverterProcess::InverterProcess(unsigned int target)
00051 : Process()
00052 {
00053 targetstate = target;
00054 }
00055
00056 InverterProcess::~InverterProcess(void)
00057 {
00058 if (inverter == this)
00059 inverter = 0;
00060 }
00061
00062 bool InverterProcess::run(const uint32)
00063 {
00064 GUIApp* app = GUIApp::get_instance();
00065
00066 unsigned int state = app->getInversion();
00067 if (state == targetstate) {
00068 terminate();
00069 } else {
00070 unsigned int i = 0;
00071 while (states[i] <= state) i++;
00072 app->setInversion(states[i]);
00073 }
00074
00075 return false;
00076 }
00077
00078 void InverterProcess::saveData(ODataSource* ods)
00079 {
00080 Process::saveData(ods);
00081
00082 ods->write2(static_cast<uint16>(targetstate));
00083 }
00084
00085 bool InverterProcess::loadData(IDataSource* ids, uint32 version)
00086 {
00087 if (!Process::loadData(ids, version)) return false;
00088
00089 targetstate = ids->read2();
00090
00091 inverter = this;
00092 return true;
00093 }
00094
00095
00096 ProcId InverterProcess::invertScreen()
00097 {
00098 if (inverter) {
00099 if (inverter->targetstate == 0)
00100 inverter->setTarget(0x8000);
00101 else
00102 inverter->setTarget(0);
00103 return inverter->getPid();
00104 } else {
00105 unsigned int target = 0x8000;
00106 if (GUIApp::get_instance()->isInverted()) target = 0;
00107 inverter = new InverterProcess(target);
00108 return Kernel::get_instance()->addProcess(inverter);
00109 }
00110 }
00111
00112
00113 uint32 InverterProcess::I_invertScreen(const uint8* args,
00114 unsigned int )
00115 {
00116 return invertScreen();
00117 }
00118
00119 void InverterProcess::ConCmd_invertScreen(const Console::ArgvType &argv)
00120 {
00121 invertScreen();
00122 }