@@ -482,6 +482,18 @@ int mt_set_security_config(MeshtasticAccount *mta, uint32_t dest, meshtastic_Con
482
482
return mt_send_admin (mta , admin_message , dest , true);
483
483
}
484
484
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
+
485
497
int mt_set_mqtt_module_config (MeshtasticAccount * mta , uint32_t dest , meshtastic_ModuleConfig_MQTTConfig mqtt )
486
498
{
487
499
meshtastic_AdminMessage admin_message = meshtastic_AdminMessage_init_default ;
@@ -2289,6 +2301,120 @@ void mt_request_security_config(MeshtasticAccount *mta, PurpleBuddy *buddy, mesh
2289
2301
);
2290
2302
}
2291
2303
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
+
2292
2418
// Fixed Position
2293
2419
void mt_save_fixed_position (MeshtasticConfigFields * cf )
2294
2420
{
@@ -2798,6 +2924,19 @@ static void mt_security_config_received(MeshtasticAccount *mta, meshtastic_MeshP
2798
2924
mta -> cb_data = NULL ;
2799
2925
}
2800
2926
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
+
2801
2940
static void mt_mqtt_module_received (MeshtasticAccount * mta , meshtastic_MeshPacket * packet )
2802
2941
{
2803
2942
PurpleBuddy * buddy ;
@@ -3043,6 +3182,15 @@ static void mt_security_config_menu_item(PurpleBlistNode *node, gpointer userdat
3043
3182
mt_security_config_received );
3044
3183
}
3045
3184
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
+
3046
3194
static void mt_mqtt_module_menu_item (PurpleBlistNode * node , gpointer userdata )
3047
3195
{
3048
3196
mt_module_menu_item (
@@ -3278,6 +3426,7 @@ static GList *mt_blist_node_menu(PurpleBlistNode *node)
3278
3426
config_items = g_list_append (config_items , purple_menu_action_new ("Networking" , PURPLE_CALLBACK (mt_network_config_menu_item ), NULL , NULL ));
3279
3427
config_items = g_list_append (config_items , purple_menu_action_new ("Bluetooth" , PURPLE_CALLBACK (mt_bluetooth_config_menu_item ), NULL , NULL ));
3280
3428
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 ));
3281
3430
module_items = g_list_append (module_items , purple_menu_action_new ("MQTT" , PURPLE_CALLBACK (mt_mqtt_module_menu_item ), NULL , NULL ));
3282
3431
items = g_list_append (items , purple_menu_action_new ("Channels" , NULL , NULL , channel_items ));
3283
3432
items = g_list_append (items , purple_menu_action_new ("Config" , NULL , NULL , config_items ));
@@ -3818,26 +3967,26 @@ static PurplePluginInfo info = {
3818
3967
*/
3819
3968
2 ,
3820
3969
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 */
3841
3990
NULL ,
3842
3991
NULL ,
3843
3992
NULL ,
0 commit comments