File: linux.go

package info (click to toggle)
golang-github-muka-go-bluetooth 5.60-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,688 kB
  • sloc: makefile: 92; sh: 2
file content (137 lines) | stat: -rw-r--r-- 2,493 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package linux

import (
	"fmt"
	"strconv"

	"github.com/muka/go-bluetooth/hw/linux/btmgmt"
	"github.com/muka/go-bluetooth/hw/linux/hci"
	"github.com/muka/go-bluetooth/hw/linux/hciconfig"
	log "github.com/sirupsen/logrus"
)

type BackendType string

const (
	BackendBtmgmt    BackendType = "btmgmt"
	BackendHCI       BackendType = "hci"
	BackendHCIConfig BackendType = "hciconfig"
)

var Backend BackendType = BackendHCIConfig

type AdapterInfo struct {
	AdapterID string
	Address   string
	Type      string
	Enabled   bool
}

// GetAdapter return status information for a controller
func GetAdapter(adapterID string) (a AdapterInfo, err error) {

	list, err := GetAdapters()
	if err != nil {
		return a, err
	}

	for _, a := range list {
		if a.AdapterID == adapterID {
			return a, err
		}
	}

	return a, fmt.Errorf("Adapter %s not found", adapterID)
}

// GetAdapters return a list of status information of available controllers
func GetAdapters() ([]AdapterInfo, error) {

	list, err := hciconfig.GetAdapters()
	if err != nil {
		return nil, err
	}

	list1 := []AdapterInfo{}
	for _, info := range list {
		list1 = append(list1, AdapterInfo{
			AdapterID: info.AdapterID,
			Enabled:   info.Enabled,
			Type:      info.Type,
			Address:   info.Address,
		})
	}

	return list1, err
}

func Up(adapterID string) error {

	status, err := GetAdapter(adapterID)
	if err != nil {
		return err
	}

	if status.Enabled {
		return nil
	}

	if Backend == BackendHCIConfig {
		_, err := hciconfig.NewHCIConfig(adapterID).Up()
		return err
	}

	if Backend == BackendBtmgmt {
		return btmgmt.NewBtMgmt(adapterID).SetPowered(true)
	}

	if Backend == BackendHCI {

		id, err := strconv.Atoi(adapterID[3:])
		if err != nil {
			return err
		}
		return hci.Up(id)
	}

	return fmt.Errorf("Unsupported backend type: %s", Backend)
}

func Down(adapterID string) error {

	status, err := GetAdapter(adapterID)
	if err != nil {
		return err
	}

	if !status.Enabled {
		return nil
	}

	if Backend == BackendHCIConfig {
		_, err := hciconfig.NewHCIConfig(adapterID).Down()
		return err
	}

	if Backend == BackendBtmgmt {
		return btmgmt.NewBtMgmt(adapterID).SetPowered(false)
	}

	if Backend == BackendHCI {
		id, err := strconv.Atoi(adapterID[3:])
		if err != nil {
			return err
		}
		return hci.Down(id)
	}

	return fmt.Errorf("Unsupported backend type: %s", Backend)
}

func Reset(adapterID string) error {
	err := Down(adapterID)
	if err != nil {
		log.Warnf("Down failed: %s", err)
	}
	return Up(adapterID)
}