@@ -86,6 +86,48 @@ func (s *MergeSketchWithBootloader) Run(context map[string]interface{}) error {
8686 return err
8787}
8888
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+
89131func merge (builtSketchPath , bootloaderPath , mergedSketchPath string ) error {
90132 sketch , err := utils .ReadFileToRows (builtSketchPath )
91133 if err != nil {
@@ -98,7 +140,9 @@ func merge(builtSketchPath, bootloaderPath, mergedSketchPath string) error {
98140 return utils .WrapError (err )
99141 }
100142
101- for _ , row := range bootloader {
143+ realBootloader := extractActualBootloader (bootloader )
144+
145+ for _ , row := range realBootloader {
102146 sketch = append (sketch , row )
103147 }
104148
0 commit comments