Fix interface somewhat

This commit is contained in:
Craig Everett 2025-05-14 21:46:29 +09:00
parent 5b93ebab93
commit f29389ded7
3 changed files with 130 additions and 45 deletions

View File

@ -9,7 +9,7 @@
-license("GPL-3.0-or-later").
-behavior(gen_server).
-export([start_stop/0]).
-export([start_stop/0, gajudesk/0]).
-export([unlock/1, make_key/2, load_key/3, end_setup/0, bin_dir/0]).
-export([network/0]).
-export([start_link/0, stop/0]).
@ -42,6 +42,12 @@ start_stop() ->
gen_server:cast(?MODULE, start_stop).
-spec gajudesk() -> ok.
gajudesk() ->
gen_server:cast(?MODULE, gajudesk).
-spec unlock(Phrase) -> ok
when Phrase :: string().
@ -203,6 +209,9 @@ handle_cast({load_key, Phrase, Mnemonic, Network}, State) ->
handle_cast(start_stop, State) ->
ok = do_start_stop(State),
{noreply, State};
handle_cast(gajudesk, State) ->
ok = do_gajudesk(),
{noreply, State};
handle_cast(stop, State) ->
ok = do_stop(),
ok = log(info, "Received a 'stop' message."),
@ -358,17 +367,50 @@ do_start_stop(#s{key = #key{id = PubKey}, network = Network}) ->
Miner = unicode:characters_to_binary([Fatness, Bits, "-", Type]),
Profile =
[{pubkey, PubKey},
{mining, [#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>}]},
{workers, [#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>},
#{<<"executable">> => Miner, <<"executable_group">> => <<"gajumine">>}]},
{pool_admin_url, Eureka}],
{ok, Apps} = gmmpc_app:start(Profile),
ok = log(info, "Apps started: ~p", [Apps]),
ok = gmc_gui:message({notice, "Starting..."}),
ok = gmc_gui:message({notice, ["Miner: ", Miner]}),
ok = gmc_gui:message(Profile),
{ok, Apps} = gmhc_app:start(Profile),
Started = io_lib:format("Apps started: ~p", [Apps]),
ok = log(info, Started),
ok = gmc_gui:message({notice, Started}),
Events =
[pool_notification,
{pool_notification, new_generation},
connected,
puzzle,
result,
error,
disconnected],
lists:foreach(fun gmmpc_events:ensure_subscribed/1, Events).
lists:foreach(fun gmhc_events:ensure_subscribed/1, Events).
do_gajudesk() ->
ok = tell(info, "Running gajudesk"),
PID = spawn(fun run_gajudesk/0),
tell(info, "GajuDesk launched at PID: ~p", [PID]).
run_gajudesk() ->
R = "otpr",
N = "gajudesk",
{ok, V} = zx:latest({R, N}),
{ok, PackageString} = zx_lib:package_string({R, N, V}),
try
case zx:run(PackageString, []) of
ok -> ok;
Error -> tell(error, "gajudesk died with: ~p", [Error])
end
catch
E:R -> tell(error, "gajudesk died with: ~p", [{E, R}])
end.
%%% Utils

View File

@ -30,13 +30,20 @@
id = none :: none | wx:wx_object(),
diff = none :: none | wx:wx_object(),
perf = none :: none | wx:wx_object(),
hist = {ts(), 0} :: {LastTS :: integer(), Average :: integer()},
candy = none :: none | wx:wx_object(),
height = none :: none | wx:wx_object(),
block = none :: none | wx:wx_object(),
mess = none :: none | wx:wx_object(),
buff = new_buff() :: buff(),
buttons = [] :: [#w{}]}).
ts() ->
erlang:system_time(microsecond).
new_buff() ->
{10, 0, 10, 0, []}.
{9, 0, 10, 0, []}.
-type buff() :: {OMax :: non_neg_integer(),
OCur :: non_neg_integer(),
@ -91,8 +98,8 @@ init(Prefs) ->
Left = wxBoxSizer:new(?wxVERTICAL),
Right = wxBoxSizer:new(?wxVERTICAL),
Labels = [J("ID"), J("Difficulty"), J("Maps/s"), J("Candidate")],
{Grid, [ID_C, DiffC, PerfC, CandyC]} = display_box(Frame, Labels),
Labels = [J("ID"), J("Target"), J("Maps/s"), J("Candidate"), J("Height"), J("BlockHash")],
{Grid, [ID_C, DiffC, PerfC, CandyC, HeightC, BlockC]} = display_box(Frame, Labels),
Style = ?wxDEFAULT bor ?wxTE_MULTILINE bor ?wxTE_READONLY,
MessSz = wxStaticBoxSizer:new(?wxVERTICAL, Frame, [{label, J("Messages")}]),
@ -126,13 +133,13 @@ init(Prefs) ->
ok = wxFrame:connect(Frame, command_button_clicked),
ok = wxFrame:connect(Frame, close_window),
ok = wxFrame:setSize(Frame, {650, 200}),
ok = wxFrame:setSize(Frame, {650, 300}),
ok = wxFrame:center(Frame),
true = wxFrame:show(Frame),
State =
#s{wx = WX, frame = Frame,
lang = Lang, j = J,
id = ID_C, diff = DiffC, perf = PerfC, candy = CandyC,
id = ID_C, diff = DiffC, perf = PerfC, candy = CandyC, height = HeightC, block = BlockC,
mess = MessC,
buttons = Buttons},
{Frame, State}.
@ -145,7 +152,7 @@ display_box(Parent, Labels) ->
fun(S) ->
L = [S, ":"],
T_L = wxStaticText:new(Parent, ?wxID_ANY, L),
T_C = wxStaticText:new(Parent, ?wxID_ANY, "", [{style, ?wxALIGN_RIGHT}]),
T_C = wxStaticText:new(Parent, ?wxID_ANY, "---", [{style, ?wxALIGN_LEFT}]),
_ = wxFlexGridSizer:add(Grid, T_L, zxw:flags(base)),
_ = wxFlexGridSizer:add(Grid, T_C, zxw:flags(wide)),
T_C
@ -259,23 +266,76 @@ candidate(Block, #s{candy = Widget}) ->
wxStaticText:setLabel(Widget, Block).
do_message(Terms, State = #s{mess = Mess, buff = Buff}) ->
Entry = io_lib:format("~tp~n", [Terms]),
NewBuff = add_message(Entry, Buff),
String = unicode:characters_to_list(element(5, NewBuff)),
ok = wxTextCtrl:changeValue(Mess, String),
do_message({notice, Notice}, State) ->
Entry = io_lib:format("~n~ts", [Notice]),
do_message2(Entry, State);
do_message({puzzle, #{info := {_, Diff, Nonce, _}}}, State = #s{diff = DiffT}) ->
DiffS = integer_to_list(Diff),
ok = wxStaticText:setLabel(DiffT, DiffS),
Entry = io_lib:format("~nTrying Nonce: ~p", [Nonce]),
do_message2(Entry, State);
do_message({result, #{info := Info}}, State = #s{perf = PerfT, hist = {LastTS, AvgDiff}}) ->
Now = ts(),
NewAvgDiff = avg20(Now, LastTS, AvgDiff),
PerfS = io_lib:format("~w", [1_000_000 / NewAvgDiff]),
ok = wxStaticText:setLabel(PerfT, PerfS),
NewState = State#s{hist = {Now, NewAvgDiff}},
case Info of
{error, no_solution} ->
NewState;
{ok, Cycles} ->
Entry = io_lib:format("~nFound! Reporting ~w cycles to leader.", [length(Cycles)]),
do_message2(Entry, NewState);
Other ->
Entry = io_lib:format("~nUnexpected: ~tp", [Other]),
do_message2(Entry, NewState)
end;
do_message({pool_notification, #{info := #{msg := MSG}}}, State = #s{height = HeightT, block = BlockT, candy = CandT}) ->
case MSG of
#{new_generation := #{height := Height, block_hash := BlockHash}} ->
ok = wxStaticText:setLabel(HeightT, integer_to_list(Height)),
ok = wxStaticText:setLabel(BlockT, BlockHash),
State;
#{candidate := #{candidate := Candidate}} ->
ok = wxStaticText:setLabel(CandT, Candidate),
State;
Other ->
Entry = io_lib:format("~nUnexpected: ~tp", [Other]),
do_message2(Entry, State)
end;
do_message(Terms, State) ->
tell(info, "~p", [Terms]),
Entry = io_lib:format("~n~tp", [Terms]),
do_message2(Entry, State).
avg20(Now, LastTS, AvgDiff) ->
Diff = Now - LastTS,
((AvgDiff * 19) + Diff) div 20.
do_message2(Entry, State = #s{mess = Mess, buff = Buff}) ->
NewBuff =
case add_message(Entry, Buff) of
{flush, Updated} ->
String = unicode:characters_to_list(lists:reverse(element(5, Updated))),
ok = wxTextCtrl:changeValue(Mess, String),
ok = wxTextCtrl:setInsertionPointEnd(Mess),
Updated;
{append, Updated} ->
ok = wxTextCtrl:appendText(Mess, Entry),
Updated
end,
State#s{buff = NewBuff}.
add_message(Entry, {OMax, OMax, IMax, IMax, Buff}) ->
{OMax, OMax, IMax, 1, [[Entry] | lists:droplast(Buff)]};
add_message(Entry, {OMax, OMax, IMax, IMax, [H | T]}) ->
{flush, {OMax, OMax, IMax, 1, [[Entry] , lists:reverse(H) | lists:droplast(T)]}};
add_message(Entry, {OMax, OMax, IMax, ICur, [H | Buff]}) ->
{OMax, OMax, IMax, ICur + 1, [[Entry | H] | Buff]};
add_message(Entry, {OMax, OCur, IMax, IMax, Buff}) ->
{OMax, OCur + 1, IMax, 1, [[Entry] | Buff]};
{append, {OMax, OMax, IMax, ICur + 1, [[Entry | H] | Buff]}};
add_message(Entry, {OMax, OCur, IMax, IMax, [H | T]}) ->
{append, {OMax, OCur + 1, IMax, 1, [[Entry], lists:reverse(H) | T]}};
add_message(Entry, {OMax, OCur, IMax, ICur, [H | Buff]}) ->
{OMax, OCur, IMax, ICur + 1, [[Entry | H] | Buff]};
{append, {OMax, OCur, IMax, ICur + 1, [[Entry | H] | Buff]}};
add_message(Entry, {OMax, 0, IMax, 0, []}) ->
{OMax, 1, IMax, 1, [[Entry]]}.
{append, {OMax, 1, IMax, 1, [[Entry]]}}.
start_stop(State) ->
@ -284,24 +344,7 @@ start_stop(State) ->
gajudesk(State) ->
ok = tell(info, "Running gajudesk"),
Launch =
fun() ->
R = "otpr",
N = "gajudesk",
{ok, V} = zx:latest({R, N}),
{ok, PackageString} = zx_lib:package_string({R, N, V}),
try
case zx:run(PackageString, []) of
ok -> ok;
Error -> tell(error, "gajudesk died with: ~p", [Error])
end
catch
E:R -> tell(error, "gajudesk died with: ~p", [{E, R}])
end
end,
PID = spawn(Launch),
ok = tell(info, "GajuDesk launched at PID: ~p", [PID]),
ok = gmc_con:gajudesk(),
State.

View File

@ -5,10 +5,10 @@
{desc,"Mining client for the Gajumaru Root"}.
{author,"Craig Everett"}.
{package_id,{"qpq","gajumine",{0,1,0}}}.
{deps,[{"uwiger","gmmp_client",{0,3,5}},
{"uwiger","gmminer",{1,1,0}},
{deps,[{"uwiger","gmhive_worker",{0,1,1}},
{"uwiger","gmhive_protocol",{0,1,1}},
{"uwiger","gmhive_client",{0,1,3}},
{"qpq","cuckoo_cpu",{0,1,0}},
{"uwiger","gm_mining_pool_protocol",{0,2,0}},
{"uwiger","gproc",{1,0,0}},
{"uwiger","enoise",{1,3,0}},
{"uwiger","gmcuckoo",{1,1,0}},