{"record":{"id":"272d3f33386a13d2","repo":"JanDeDobbeleer/oh-my-posh","slug":"unable-to-parse-charge-full","errorCode":null,"errorMessage":"unable to parse charge_full","messagePattern":"unable to parse charge_full","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/runtime/battery/battery_linux.go","lineNumber":117,"sourceCode":"\tb := &battery{}\n\tvar err error\n\n\tif b.Current, err = readFloat(path, \"energy_now\"); err == nil {\n\t\tif b.Full, err = readFloat(path, \"energy_full\"); err != nil {\n\t\t\treturn nil, errors.New(\"unable to parse energy_full\")\n\t\t}\n\t} else {\n\t\tcurrentDoesNotExist := os.IsNotExist(err)\n\t\tif b.Voltage, err = readFloat(path, \"voltage_now\"); err != nil {\n\t\t\treturn nil, errors.New(\"unable to parse voltage_now\")\n\t\t}\n\t\tb.Voltage /= 1000\n\t\tif currentDoesNotExist {\n\t\t\tif b.Current, err = readAmp(path, \"charge_now\", b.Voltage); err != nil {\n\t\t\t\treturn nil, errors.New(\"unable to parse charge_now\")\n\t\t\t}\n\t\t\tif b.Full, err = readAmp(path, \"charge_full\", b.Voltage); err != nil {\n\t\t\t\treturn nil, errors.New(\"unable to parse charge_full\")\n\t\t\t}\n\t\t} else {\n\t\t\tif b.Full, err = readFloat(path, \"energy_full\"); err != nil {\n\t\t\t\treturn nil, errors.New(\"unable to parse energy_full\")\n\t\t\t}\n\t\t}\n\t}\n\n\tstate, err := os.ReadFile(filepath.Join(path, \"status\"))\n\tif err != nil || len(state) == 0 {\n\t\treturn nil, errors.New(\"unable to parse or invalid status\")\n\t}\n\tif b.State, err = newState(string(state[:len(state)-1])); err != nil {\n\t\treturn nil, errors.New(\"unable to map to new state\")\n\t}\n\n\treturn b, nil\n}","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/JanDeDobbeleer/oh-my-posh/blob/0976794618c5ed95de0985dded50de1b4dc914cb/src/runtime/battery/battery_linux.go#L99-L135","documentation":"In the charge-based fallback path, charge_full supplies the Full capacity, read via readAmp. If charge_full is missing, empty, or non-numeric, getByPath returns 'unable to parse charge_full'.","triggerScenarios":"battery.Get()/systemGetAll -> getByPath on a Linux battery where energy_now is absent and charge_now parsed OK but charge_full is missing/unparseable.","commonSituations":"Drivers exposing only charge_now but not charge_full; firmware quirks on some laptops; battery firmware reporting errors making charge_full read empty.","solutions":["Verify: cat /sys/class/power_supply/BAT0/charge_full; it must contain an integer in µAh","Prefer the energy path by making energy_now/energy_full readable so charge_* is not used","Update kernel/driver/firmware so charge_full is exposed","Skip the battery: systemGetAll collects per-battery errors and still returns others"],"exampleFix":"// before\n$ cat /sys/class/power_supply/BAT0/charge_full\n(empty)\n// after\n$ cat /sys/class/power_supply/BAT0/charge_full\n3800000","handlingStrategy":"fallback","validationCode":"test -s /sys/class/power_supply/BAT0/charge_full || echo \"charge_full missing - Full capacity unavailable\"","typeGuard":"func hasChargeFull(dir string) bool {\n  b, err := os.ReadFile(filepath.Join(dir, \"charge_full\"))\n  return err == nil && len(strings.TrimSpace(string(b))) > 0\n}","tryCatchPattern":"bat, err := battery.Get()\nif err != nil {\n  log.Printf(\"battery unavailable: %v\", err)\n  return nil\n}","preventionTips":["Verify charge_full is populated on affected laptops; consider firmware/kernel updates","Use energy_full path when the driver supports it","Collect per-battery errors and continue with healthy batteries"],"tags":["linux","sysfs","battery","parse-error"],"backgroundTag":"sysfs-battery-file-missing","analyzedSha":"0976794618c5ed95de0985dded50de1b4dc914cb","analyzedAt":"2026-08-31T23:41:19.708Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}