@@ -86,6 +86,48 @@ func (s *MergeSketchWithBootloader) Run(context map[string]interface{}) error {
86
86
return err
87
87
}
88
88
89
+ func hexLineOnlyContainsFF (line string ) bool {
90
+ //:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
91
+ if len (line ) <= 11 {
92
+ return false
93
+ }
94
+ byteArray := []byte (line )
95
+ for _ , char := range byteArray [9 :(len (byteArray ) - 2 )] {
96
+ if char != 'F' {
97
+ return false
98
+ }
99
+ }
100
+ return true
101
+ }
102
+
103
+ func extractActualBootloader (bootloader []string ) []string {
104
+
105
+ var realBootloader []string
106
+
107
+ // skip until we find a line full of FFFFFF (except address and checksum)
108
+ for i , row := range bootloader {
109
+ if hexLineOnlyContainsFF (row ) {
110
+ realBootloader = bootloader [i :len (bootloader )]
111
+ break
112
+ }
113
+ }
114
+
115
+ // drop all "empty" lines
116
+ for i , row := range realBootloader {
117
+ if ! hexLineOnlyContainsFF (row ) {
118
+ realBootloader = realBootloader [i :len (realBootloader )]
119
+ break
120
+ }
121
+ }
122
+
123
+ if len (realBootloader ) == 0 {
124
+ // we didn't find any line full of FFFF, thus it's a standalone bootloader
125
+ realBootloader = bootloader
126
+ }
127
+
128
+ return realBootloader
129
+ }
130
+
89
131
func merge (builtSketchPath , bootloaderPath , mergedSketchPath string ) error {
90
132
sketch , err := utils .ReadFileToRows (builtSketchPath )
91
133
if err != nil {
@@ -98,7 +140,9 @@ func merge(builtSketchPath, bootloaderPath, mergedSketchPath string) error {
98
140
return utils .WrapError (err )
99
141
}
100
142
101
- for _ , row := range bootloader {
143
+ realBootloader := extractActualBootloader (bootloader )
144
+
145
+ for _ , row := range realBootloader {
102
146
sketch = append (sketch , row )
103
147
}
104
148
0 commit comments