Browse Source

Fix endian DGUS WriteVariable (#18703)

yufanyufan 3 years ago
parent
commit
1c94033f7c
No account linked to committer's email address

+ 21
- 0
Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp View File

94
 }
94
 }
95
 
95
 
96
 void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) {
96
 void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) {
97
+  value = (value & 0xffU) << 8U | (value >> 8U);
97
   WriteVariable(adr, static_cast<const void*>(&value), sizeof(uint16_t));
98
   WriteVariable(adr, static_cast<const void*>(&value), sizeof(uint16_t));
98
 }
99
 }
99
 
100
 
101
+void DGUSDisplay::WriteVariable(uint16_t adr, int16_t value) {
102
+  value = (value & 0xffU) << 8U | (value >> 8U);
103
+  WriteVariable(adr, static_cast<const void*>(&value), sizeof(uint16_t));
104
+}
105
+
106
+void DGUSDisplay::WriteVariable(uint16_t adr, uint8_t value) {
107
+  WriteVariable(adr, static_cast<const void*>(&value), sizeof(uint8_t));
108
+}
109
+
110
+void DGUSDisplay::WriteVariable(uint16_t adr, long value) {
111
+    union { long l; char lb[4]; } endian;
112
+    char tmp[4];
113
+    endian.l = value;
114
+    tmp[0] = endian.lb[3];
115
+    tmp[1] = endian.lb[2];
116
+    tmp[2] = endian.lb[1];
117
+    tmp[3] = endian.lb[0];
118
+    WriteVariable(adr, static_cast<const void*>(&tmp), sizeof(long));
119
+}
120
+
100
 void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) {
121
 void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) {
101
   const char* myvalues = static_cast<const char*>(values);
122
   const char* myvalues = static_cast<const char*>(values);
102
   bool strend = !myvalues;
123
   bool strend = !myvalues;

+ 3
- 0
Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h View File

54
   // Variable access.
54
   // Variable access.
55
   static void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false);
55
   static void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false);
56
   static void WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false);
56
   static void WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false);
57
+  static void WriteVariable(uint16_t adr, int16_t value);
57
   static void WriteVariable(uint16_t adr, uint16_t value);
58
   static void WriteVariable(uint16_t adr, uint16_t value);
59
+  static void WriteVariable(uint16_t adr, uint8_t value);
60
+  static void WriteVariable(uint16_t adr, long value);
58
 
61
 
59
   // Until now I did not need to actively read from the display. That's why there is no ReadVariable
62
   // Until now I did not need to actively read from the display. That's why there is no ReadVariable
60
   // (I extensively use the auto upload of the display)
63
   // (I extensively use the auto upload of the display)

+ 7
- 11
Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp View File

118
   if (var.memadr) {
118
   if (var.memadr) {
119
     //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP);
119
     //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP);
120
     //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr);
120
     //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr);
121
-    uint8_t *tmp = (uint8_t *) var.memadr;
122
-    uint16_t data_to_send = (tmp[0] << 8);
123
-    if (var.size >= 1) data_to_send |= tmp[1];
124
-    dgusdisplay.WriteVariable(var.VP, data_to_send);
121
+    if (var.size > 1)
122
+      dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr);
123
+    else
124
+      dgusdisplay.WriteVariable(var.VP, *(int8_t*)var.memadr);
125
   }
125
   }
126
 }
126
 }
127
 
127
 
132
     //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr);
132
     //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr);
133
     uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display.
133
     uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display.
134
     tmp = map(tmp, 0, 255, 0, 100);
134
     tmp = map(tmp, 0, 255, 0, 100);
135
-    uint16_t data_to_send = swap16(tmp);
136
-    dgusdisplay.WriteVariable(var.VP, data_to_send);
135
+    dgusdisplay.WriteVariable(var.VP, tmp);
137
   }
136
   }
138
 }
137
 }
139
 
138
 
142
   //DEBUG_ECHOPAIR(" DGUSLCD_SendPrintProgressToDisplay ", var.VP);
141
   //DEBUG_ECHOPAIR(" DGUSLCD_SendPrintProgressToDisplay ", var.VP);
143
   uint16_t tmp = ExtUI::getProgress_percent();
142
   uint16_t tmp = ExtUI::getProgress_percent();
144
   //DEBUG_ECHOLNPAIR(" data ", tmp);
143
   //DEBUG_ECHOLNPAIR(" data ", tmp);
145
-  uint16_t data_to_send = swap16(tmp);
146
-  dgusdisplay.WriteVariable(var.VP, data_to_send);
144
+  dgusdisplay.WriteVariable(var.VP, tmp);
147
 }
145
 }
148
 
146
 
149
 // Send the current print time to the display.
147
 // Send the current print time to the display.
242
       DEBUG_ECHOLNPAIR(" data ", *(uint8_t *)var.memadr);
240
       DEBUG_ECHOLNPAIR(" data ", *(uint8_t *)var.memadr);
243
       uint16_t data_to_send = 0;
241
       uint16_t data_to_send = 0;
244
       if (*(uint8_t *) var.memadr) data_to_send = 1;
242
       if (*(uint8_t *) var.memadr) data_to_send = 1;
245
-      data_to_send = swap16(data_to_send);
246
       dgusdisplay.WriteVariable(var.VP, data_to_send);
243
       dgusdisplay.WriteVariable(var.VP, data_to_send);
247
     }
244
     }
248
   }
245
   }
255
     DEBUG_ECHOLNPAIR(" data ", *(int16_t *)var.memadr);
252
     DEBUG_ECHOLNPAIR(" data ", *(int16_t *)var.memadr);
256
     uint16_t data_to_send = 0;
253
     uint16_t data_to_send = 0;
257
     if (*(int16_t *) var.memadr) data_to_send = 1;
254
     if (*(int16_t *) var.memadr) data_to_send = 1;
258
-    data_to_send = swap16(data_to_send);
259
     dgusdisplay.WriteVariable(var.VP, data_to_send);
255
     dgusdisplay.WriteVariable(var.VP, data_to_send);
260
   }
256
   }
261
 }
257
 }
268
     //DEBUG_ECHOPAIR(" DGUSLCD_SendWaitingStatusToDisplay ", var.VP);
264
     //DEBUG_ECHOPAIR(" DGUSLCD_SendWaitingStatusToDisplay ", var.VP);
269
     //DEBUG_ECHOLNPAIR(" data ", swap16(index));
265
     //DEBUG_ECHOLNPAIR(" data ", swap16(index));
270
     if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) {
266
     if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) {
271
-      dgusdisplay.WriteVariable(var.VP, swap16(index));
267
+      dgusdisplay.WriteVariable(var.VP, index);
272
       //DEBUG_ECHOLNPAIR(" data ", swap16(index));
268
       //DEBUG_ECHOLNPAIR(" data ", swap16(index));
273
       if (++index >= DGUS_UI_WAITING_STATUS) index = 0;
269
       if (++index >= DGUS_UI_WAITING_STATUS) index = 0;
274
       period = 0;
270
       period = 0;

+ 2
- 16
Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h View File

184
     if (var.memadr) {
184
     if (var.memadr) {
185
       float f = *(float *)var.memadr;
185
       float f = *(float *)var.memadr;
186
       f *= cpow(10, decimals);
186
       f *= cpow(10, decimals);
187
-      union { long l; char lb[4]; } endian;
188
-
189
-      char tmp[4];
190
-      endian.l = f;
191
-      tmp[0] = endian.lb[3];
192
-      tmp[1] = endian.lb[2];
193
-      tmp[2] = endian.lb[1];
194
-      tmp[3] = endian.lb[0];
195
-      dgusdisplay.WriteVariable(var.VP, tmp, 4);
187
+      dgusdisplay.WriteVariable(var.VP, (long)f);
196
     }
188
     }
197
   }
189
   }
198
 
190
 
205
       float f = *(float *)var.memadr;
197
       float f = *(float *)var.memadr;
206
       DEBUG_ECHOLNPAIR_F(" >> ", f, 6);
198
       DEBUG_ECHOLNPAIR_F(" >> ", f, 6);
207
       f *= cpow(10, decimals);
199
       f *= cpow(10, decimals);
208
-      union { int16_t i; char lb[2]; } endian;
209
-
210
-      char tmp[2];
211
-      endian.i = f;
212
-      tmp[0] = endian.lb[1];
213
-      tmp[1] = endian.lb[0];
214
-      dgusdisplay.WriteVariable(var.VP, tmp, 2);
200
+      dgusdisplay.WriteVariable(var.VP, (int16_t)f);
215
     }
201
     }
216
   }
202
   }
217
 
203
 

Loading…
Cancel
Save