Skip to content

Commit c51256b

Browse files
committed
power configuration
1 parent a887f02 commit c51256b

File tree

1 file changed

+169
-20
lines changed

1 file changed

+169
-20
lines changed

meshtastic.c

Lines changed: 169 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,18 @@ int mt_set_security_config(MeshtasticAccount *mta, uint32_t dest, meshtastic_Con
482482
return mt_send_admin(mta, admin_message, dest, true);
483483
}
484484

485+
int mt_set_power_config(MeshtasticAccount *mta, uint32_t dest, meshtastic_Config_PowerConfig power)
486+
{
487+
meshtastic_AdminMessage admin_message = meshtastic_AdminMessage_init_default;
488+
meshtastic_Config config = meshtastic_Config_init_default;
489+
admin_message.which_payload_variant = meshtastic_AdminMessage_set_config_tag;
490+
admin_message.session_passkey = *mta->session_passkey;
491+
config.which_payload_variant = meshtastic_Config_power_tag;
492+
config.payload_variant.power = power;
493+
admin_message.set_config = config;
494+
return mt_send_admin(mta, admin_message, dest, true);
495+
}
496+
485497
int mt_set_mqtt_module_config(MeshtasticAccount *mta, uint32_t dest, meshtastic_ModuleConfig_MQTTConfig mqtt)
486498
{
487499
meshtastic_AdminMessage admin_message = meshtastic_AdminMessage_init_default;
@@ -2289,6 +2301,120 @@ void mt_request_security_config(MeshtasticAccount *mta, PurpleBuddy *buddy, mesh
22892301
);
22902302
}
22912303

2304+
// Power Config
2305+
void mt_save_power_config(MeshtasticConfigFields *cf)
2306+
{
2307+
meshtastic_Config *config = cf->config;
2308+
MeshtasticBuddy *mb;
2309+
2310+
float tempf;
2311+
unsigned int tempi;
2312+
char buffer[100];
2313+
2314+
// Is Power Saving
2315+
config->payload_variant.power.is_power_saving = purple_request_fields_get_bool(cf->fields, "is_power_saving");
2316+
2317+
// On Battery Shutdown After Secs
2318+
config->payload_variant.power.on_battery_shutdown_after_secs = purple_request_fields_get_integer(cf->fields, "on_battery_shutdown_after_secs");
2319+
2320+
// ADC Multiplier Override
2321+
strcpy(buffer, purple_request_fields_get_string(cf->fields, "adc_multiplier_override"));
2322+
sscanf(buffer, " %f ", &tempf);
2323+
config->payload_variant.power.adc_multiplier_override = tempf;
2324+
2325+
// Wait Bluetooth Secs
2326+
config->payload_variant.power.wait_bluetooth_secs = purple_request_fields_get_integer(cf->fields, "wait_bluetooth_secs");
2327+
2328+
// Light Sleep Interval
2329+
config->payload_variant.power.ls_secs = purple_request_fields_get_integer(cf->fields, "ls_secs");
2330+
2331+
// Minimum Wake Interval
2332+
config->payload_variant.power.min_wake_secs = purple_request_fields_get_integer(cf->fields, "min_wake_secs");
2333+
2334+
// Device Battery INA2xx Address
2335+
strcpy(buffer, purple_request_fields_get_string(cf->fields, "device_battery_ina_address"));
2336+
sscanf(buffer, " %x ", &tempi);
2337+
config->payload_variant.power.device_battery_ina_address = tempi;
2338+
2339+
mb = cf->buddy->proto_data;
2340+
cf->mta->cb_routing = &mt_acknowledge_cb;
2341+
mt_set_power_config(cf->mta, mb->id, config->payload_variant.power);
2342+
g_free(cf->config);
2343+
g_free(cf);
2344+
}
2345+
2346+
void mt_request_power_config(MeshtasticAccount *mta, PurpleBuddy *buddy, meshtastic_Config config)
2347+
{
2348+
PurpleRequestFields *fields = purple_request_fields_new();
2349+
PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL);
2350+
PurpleRequestField *is_power_saving;
2351+
PurpleRequestField *on_battery_shutdown_after_secs;
2352+
PurpleRequestField *adc_multiplier_override;
2353+
PurpleRequestField *wait_bluetooth_secs;
2354+
PurpleRequestField *ls_secs;
2355+
PurpleRequestField *min_wake_secs;
2356+
PurpleRequestField *device_battery_ina_address;
2357+
MeshtasticConfigFields *conf;
2358+
meshtastic_Config *con;
2359+
char buffer[100];
2360+
2361+
// Is Power Saving
2362+
is_power_saving = purple_request_field_bool_new("is_power_saving", g_strdup("Power saving enabled"), config.payload_variant.power.is_power_saving);
2363+
purple_request_field_group_add_field(group, is_power_saving);
2364+
2365+
// On Battery Shutdown After Secs
2366+
on_battery_shutdown_after_secs = purple_request_field_int_new("on_battery_shutdown_after_secs", g_strdup("Shutdown after how many seconds on battery power"), config.payload_variant.power.on_battery_shutdown_after_secs);
2367+
purple_request_field_group_add_field(group, on_battery_shutdown_after_secs);
2368+
2369+
// ADC Multiplier Override
2370+
sprintf(buffer, "%.2f", config.payload_variant.power.adc_multiplier_override);
2371+
adc_multiplier_override = purple_request_field_string_new("adc_multiplier_override", g_strdup("ADC multiplier override"), buffer, FALSE);
2372+
purple_request_field_group_add_field(group, adc_multiplier_override);
2373+
2374+
// Wait Bluetooth Secs
2375+
wait_bluetooth_secs = purple_request_field_int_new("wait_bluetooth_secs", g_strdup("How long before turning off bluetooth (seconds)"), config.payload_variant.power.wait_bluetooth_secs);
2376+
purple_request_field_group_add_field(group, wait_bluetooth_secs);
2377+
2378+
// Light Sleep Interval
2379+
ls_secs = purple_request_field_int_new("ls_secs", g_strdup("How long before light sleep (seconds)"), config.payload_variant.power.ls_secs);
2380+
purple_request_field_group_add_field(group, ls_secs);
2381+
2382+
// Minimum Wake Interval
2383+
min_wake_secs = purple_request_field_int_new("min_wake_secs", g_strdup("How long to stay awake after activity (seconds)"), config.payload_variant.power.min_wake_secs);
2384+
purple_request_field_group_add_field(group, min_wake_secs);
2385+
2386+
// Device Battery INA2xx Address
2387+
sprintf(buffer, "%x", config.payload_variant.power.device_battery_ina_address);
2388+
device_battery_ina_address = purple_request_field_string_new("device_battery_ina_address", g_strdup("INA-2XX I2C address"), buffer, FALSE);
2389+
purple_request_field_group_add_field(group, device_battery_ina_address);
2390+
2391+
purple_request_fields_add_group(fields, group);
2392+
2393+
conf = g_new0(MeshtasticConfigFields, 1);
2394+
con = g_new0(meshtastic_Config, 1);
2395+
memcpy(con, &config, sizeof(meshtastic_Config));
2396+
conf->mta = mta;
2397+
conf->fields = fields;
2398+
conf->buddy = buddy;
2399+
conf->config = con;
2400+
2401+
purple_request_fields(
2402+
mta->gc, // void *handle,
2403+
buddy->alias, // const char *title,
2404+
g_strdup("Power Configuration"), // const char *primary,
2405+
buddy->alias,
2406+
fields, // PurpleRequestFields *fields,
2407+
g_strdup("Save"), // const char *ok_text,
2408+
G_CALLBACK(mt_save_power_config), // GCallback ok_cb,
2409+
g_strdup("Cancel"), // const char *cancel_text,
2410+
G_CALLBACK(mt_cancel_cb), // GCallback cancel_cb,
2411+
mta->account, // PurpleAccount *account,
2412+
NULL, // const char *who,
2413+
NULL, // PurpleConversation *conv,
2414+
conf // void *user_data
2415+
);
2416+
}
2417+
22922418
// Fixed Position
22932419
void mt_save_fixed_position(MeshtasticConfigFields *cf)
22942420
{
@@ -2798,6 +2924,19 @@ static void mt_security_config_received(MeshtasticAccount *mta, meshtastic_MeshP
27982924
mta->cb_data = NULL;
27992925
}
28002926

2927+
static void mt_power_config_received(MeshtasticAccount *mta, meshtastic_MeshPacket *packet)
2928+
{
2929+
PurpleBuddy *buddy;
2930+
pb_istream_t stream;
2931+
meshtastic_AdminMessage admin = meshtastic_AdminMessage_init_default;
2932+
stream = pb_istream_from_buffer(packet->decoded.payload.bytes, packet->decoded.payload.size);
2933+
pb_decode(&stream, meshtastic_AdminMessage_fields, &admin);
2934+
buddy = (PurpleBuddy *)mta->cb_data;
2935+
mt_request_power_config(mta, buddy, admin.get_config_response);
2936+
mta->cb_config = NULL;
2937+
mta->cb_data = NULL;
2938+
}
2939+
28012940
static void mt_mqtt_module_received(MeshtasticAccount *mta, meshtastic_MeshPacket *packet)
28022941
{
28032942
PurpleBuddy *buddy;
@@ -3043,6 +3182,15 @@ static void mt_security_config_menu_item(PurpleBlistNode *node, gpointer userdat
30433182
mt_security_config_received);
30443183
}
30453184

3185+
static void mt_power_config_menu_item(PurpleBlistNode *node, gpointer userdata)
3186+
{
3187+
mt_config_menu_item(
3188+
node,
3189+
userdata,
3190+
meshtastic_AdminMessage_ConfigType_POWER_CONFIG,
3191+
mt_power_config_received);
3192+
}
3193+
30463194
static void mt_mqtt_module_menu_item(PurpleBlistNode *node, gpointer userdata)
30473195
{
30483196
mt_module_menu_item(
@@ -3278,6 +3426,7 @@ static GList *mt_blist_node_menu(PurpleBlistNode *node)
32783426
config_items = g_list_append(config_items, purple_menu_action_new("Networking", PURPLE_CALLBACK(mt_network_config_menu_item), NULL, NULL));
32793427
config_items = g_list_append(config_items, purple_menu_action_new("Bluetooth", PURPLE_CALLBACK(mt_bluetooth_config_menu_item), NULL, NULL));
32803428
config_items = g_list_append(config_items, purple_menu_action_new("Security", PURPLE_CALLBACK(mt_security_config_menu_item), NULL, NULL));
3429+
config_items = g_list_append(config_items, purple_menu_action_new("Power", PURPLE_CALLBACK(mt_power_config_menu_item), NULL, NULL));
32813430
module_items = g_list_append(module_items, purple_menu_action_new("MQTT", PURPLE_CALLBACK(mt_mqtt_module_menu_item), NULL, NULL));
32823431
items = g_list_append(items, purple_menu_action_new("Channels", NULL, NULL, channel_items));
32833432
items = g_list_append(items, purple_menu_action_new("Config", NULL, NULL, config_items));
@@ -3818,26 +3967,26 @@ static PurplePluginInfo info = {
38183967
*/
38193968
2,
38203969
1,
3821-
PURPLE_PLUGIN_PROTOCOL, /* type */
3822-
NULL, /* ui_requirement */
3823-
0, /* flags */
3824-
NULL, /* dependencies */
3825-
PURPLE_PRIORITY_DEFAULT, /* priority */
3826-
"prpl-dadecoza-meshtastic", /* id */
3827-
"Meshtastic", /* name */
3828-
"1.0", /* version */
3829-
"Meshtastic Plugin", /* summary */
3830-
"Meshtastic Plugin", /* description */
3831-
"Johannes Le Roux <[email protected]>", /* author */
3832-
"", /* homepage */
3833-
plugin_load, /* load */
3834-
plugin_unload, /* unload */
3835-
NULL, /* destroy */
3836-
NULL, /* ui_info */
3837-
&prpl_info, /* extra_info */
3838-
NULL, /* prefs_info */
3839-
NULL /*plugin_actions*/, /* actions */
3840-
NULL, /* padding */
3970+
PURPLE_PLUGIN_PROTOCOL, /* type */
3971+
NULL, /* ui_requirement */
3972+
0, /* flags */
3973+
NULL, /* dependencies */
3974+
PURPLE_PRIORITY_DEFAULT, /* priority */
3975+
"prpl-dadecoza-meshtastic", /* id */
3976+
"Meshtastic", /* name */
3977+
"0.1.5-alpha", /* version */
3978+
"Meshtastic Plugin", /* summary */
3979+
"Meshtastic Plugin", /* description */
3980+
"Johannes Le Roux <[email protected]>", /* author */
3981+
"https://github.com/dadecoza/pidgin-meshtastic", /* homepage */
3982+
plugin_load, /* load */
3983+
plugin_unload, /* unload */
3984+
NULL, /* destroy */
3985+
NULL, /* ui_info */
3986+
&prpl_info, /* extra_info */
3987+
NULL, /* prefs_info */
3988+
NULL /*plugin_actions*/, /* actions */
3989+
NULL, /* padding */
38413990
NULL,
38423991
NULL,
38433992
NULL,

0 commit comments

Comments
 (0)