-
Notifications
You must be signed in to change notification settings - Fork 0
/
can_drive_parser.go
101 lines (86 loc) · 2.9 KB
/
can_drive_parser.go
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
/**
* Copyright © 2023, Staufi Tech - Switzerland
* All rights reserved.
*
* ________________________ ___ _ ________________ _ ____
* / _____ _ ____________/ / __|_| /_______________ | | ___/
* ( (____ _| |_ _____ _ _ _| |__ _ | |_____ ____| |_|_
* \____ (_ _|____ | | | (_ __) | | | ___ |/ ___) _ \
* _____) )| |_/ ___ | |_| | | | | | | | ____( (___| | | |
* (______/ \__)_____|____/ |_| |_| |_|_____)\____)_| |_|
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package utils
import (
"encoding/hex"
"fmt"
"strconv"
"strings"
log "github.com/ChrIgiSta/go-utils/logger"
"github.com/angelodlfrtr/go-can"
)
type CanDriveParser struct {
}
// can drive frame: [ID],[RTR],[IDE],[DATABYTES 0..8B]\n
func NewCanDriveParser() *CanDriveParser {
return &CanDriveParser{}
}
func (p *CanDriveParser) Unmarshal(in []byte) *can.Frame {
if len(in) > 0 && in[0] == 0x00 {
in = in[1:]
}
split := strings.Split(string(in), ",")
if len(split) != 4 {
log.Error("custom parser",
"canDrive Pck don't seem to formated properly. rx: %s", string(in))
return nil
}
arbitrationID, err := strconv.ParseUint(split[0], 16, 32)
if err != nil {
log.Error("custom parser",
"cannot parse canDrive Formated arbitration id [%s]: %v", split[0], err)
return nil
}
data, err := hex.DecodeString(split[3])
if err != nil {
log.Error("custom parser",
"cannot parse canDrive Formated data: %v", err)
return nil
}
if len(data) > 8 {
log.Error("custom parser",
"data length higher than 8 bytes. %d", len(data))
return nil
}
var dataFinal [8]byte
copy(dataFinal[:], data)
return &can.Frame{
ArbitrationID: uint32(arbitrationID),
DLC: uint8(len(data)),
Data: dataFinal,
}
}
func (p *CanDriveParser) Marshal(in *can.Frame) []byte {
RTR := 0 // Remote Trasmission request
IDE := 0 // Identifier Extended falg
arbId := []byte{
byte((in.ArbitrationID >> 24) & 0xff),
byte((in.ArbitrationID >> 16) & 0xff),
byte((in.ArbitrationID >> 8) & 0xff),
byte(in.ArbitrationID & 0xff),
}
canDriveFormat := []byte(fmt.Sprintf("%x,%d,%d,%x\n", arbId, RTR, IDE, in.GetData()))
return canDriveFormat
}