Проблема отображения времени в ZedGraph
#38511655
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
Добрый день!
All, нужна твоя помощь, сразу хочу предупредить, что я не программист а физик, поэтому сильно не пинайте, но любая критика и дельные предложения приветствуются...
Короче для регистрации данных с датчиков потребовался лабораторный стенд, мною было написана программа для опроса датчиков по протоколу I2C с последующей передачей данных на PC. Устройство представляет собой HID девайс (PSoC3) к которому подключены гироскоп, магнитометр, акселерометр, датчик температуры http://f-page.ru/fp/0f56fa5835a74c1e86b6fc5a47ccb213
Данные в реальном режиме времени отображаются на графиках (компанет ZedGraph) и тут у меня баттхед головного мозга, никак не могу сделать так чтобы по оси Х отображалось время в формате mm:ss
Помогите с кодом!
вот собственно быдлокод...
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. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389.
private void DrawGraph()
{
//RawData
long FreqValue = ((freq_1 << 24) + (freq_2 << 16) + (freq_3 << 8) + freq_4);
MagnetXRaw = (magnetX_1 << 8) + magnetX_2;
MagnetYRaw = (magnetY_1 << 8) + magnetY_2;
MagnetZRaw = (magnetZ_1 << 8) + magnetZ_2;
AccelXRaw = (accelX_1 << 8) + accelX_2;
AccelYRaw = (accelY_1 << 8) + accelY_2;
AccelZRaw = (accelZ_1 << 8) + accelZ_2;
GyroXRaw = (gyroX_1 << 8) + gyroX_2;
GyroYRaw = (gyroY_1 << 8) + gyroY_2;
GyroZRaw = (gyroZ_1 << 8) + gyroZ_2;
TempRaw = (temp_1 << 8) + temp_2;
tempScaled = UintToLsb(TempRaw) * 0.125d;
//ScaledData
magnetScaled.XAxis = UintToLsb(MagnetXRaw) * m_Scale;
magnetScaled.YAxis = UintToLsb(MagnetYRaw) * m_Scale;
magnetScaled.ZAxis = UintToLsb(MagnetZRaw) * m_Scale;
accelScaled.XAxis = UintToLsb(AccelXRaw) * a_Scale;
accelScaled.YAxis = UintToLsb(AccelYRaw) * a_Scale;
accelScaled.ZAxis = UintToLsb(AccelZRaw) * a_Scale;
gyroScaled.XDegreePerSec = UintToLsb(GyroXRaw) * g_Scale;
gyroScaled.YDegreePerSec = UintToLsb(GyroYRaw) * g_Scale;
gyroScaled.ZDegreePerSec = UintToLsb(GyroZRaw) * g_Scale;
//Update GUI
MagnetXScaledValueBox.Text = magnetScaled.XAxis.ToString();
MagnetYScaledValueBox.Text = magnetScaled.YAxis.ToString();
MagnetZScaledValueBox.Text = magnetScaled.ZAxis.ToString();
AccelXScaledValueBox.Text = String.Format("{0:0.##}", accelScaled.XAxis);
AccelYScaledValueBox.Text = String.Format("{0:0.##}", accelScaled.YAxis);
AccelZScaledValueBox.Text = String.Format("{0:0.##}", accelScaled.ZAxis);
GyroXScaledValueBox.Text = String.Format("{0:0.##}", gyroScaled.XDegreePerSec);
GyroYScaledValueBox.Text = String.Format("{0:0.##}", gyroScaled.YDegreePerSec);
GyroZScaledValueBox.Text = String.Format("{0:0.##}", gyroScaled.ZDegreePerSec);
FreqValueBox.Text = FreqValue.ToString();
TempValueBox.Text = String.Format("{0:0.####}", tempScaled);
// Добавим его в конец списка
_dataMagnetX.Add(magnetScaled.XAxis);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataMagnetX.Count > _capacity)
{
_dataMagnetX.RemoveAt(0);
}
// Добавим его в конец списка
_dataMagnetY.Add(magnetScaled.YAxis);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataMagnetY.Count > _capacity)
{
_dataMagnetY.RemoveAt(0);
}
// Добавим его в конец списка
_dataMagnetZ.Add(magnetScaled.ZAxis);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataMagnetZ.Count > _capacity)
{
_dataMagnetZ.RemoveAt(0);
}
// Добавим его в конец списка
_dataAccelX.Add(accelScaled.XAxis);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataAccelX.Count > _capacity)
{
_dataAccelX.RemoveAt(0);
}
// Добавим его в конец списка
_dataAccelY.Add(accelScaled.YAxis);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataAccelY.Count > _capacity)
{
_dataAccelY.RemoveAt(0);
}
// Добавим его в конец списка
_dataAccelZ.Add(accelScaled.ZAxis);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataAccelZ.Count > _capacity)
{
_dataAccelZ.RemoveAt(0);
}
// Добавим его в конец списка
_dataGyroX.Add(gyroScaled.XDegreePerSec);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataGyroX.Count > _capacity)
{
_dataGyroX.RemoveAt(0);
}
// Добавим его в конец списка
_dataGyroY.Add(gyroScaled.YDegreePerSec);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataGyroY.Count > _capacity)
{
_dataGyroY.RemoveAt(0);
}
// Добавим его в конец списка
_dataGyroZ.Add(gyroScaled.ZDegreePerSec);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataGyroZ.Count > _capacity)
{
_dataGyroZ.RemoveAt(0);
}
// Вычислим новое значение
long dha = FreqValue;
// Добавим его в конец списка
_dataDHA.Add(dha);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataDHA.Count > _capacity)
{
_dataDHA.RemoveAt(0);
}
// Вычислим новое значение
double dta = tempScaled;
// Добавим его в конец списка
_dataDTA.Add(dta);
// Удалим первый элемент в списке данных,
// если заполнили максимальную емкость
if (_dataDTA.Count > _capacity)
{
_dataDTA.RemoveAt(0);
}
// Получим панель для рисования
GraphPane paneM = MGraph.GraphPane;
GraphPane paneA = AGraph.GraphPane;
GraphPane paneG = GGraph.GraphPane;
GraphPane paneDHA = DHAGraph.GraphPane;
GraphPane paneDTA = DTAGraph.GraphPane;
// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
paneM.CurveList.Clear();
paneA.CurveList.Clear();
paneG.CurveList.Clear();
paneDHA.CurveList.Clear();
paneDTA.CurveList.Clear();
// Изменим текст заголовка графика
paneM.Title.Text = "Magnetometer (LSM303DLM)";
paneA.Title.Text = "Accelerometer (LSM303DLM)";
paneG.Title.Text = "Gyroscope (L3G4200D)";
paneDHA.Title.Text = "Chronal Sensor Anomalies";
paneDTA.Title.Text = "Temperature Sensor Anomalies (LM75)";
paneM.Legend.IsVisible = false;
paneA.Legend.IsVisible = false;
paneG.Legend.IsVisible = false;
paneDHA.Legend.IsVisible = false;
paneDTA.Legend.IsVisible = false;
// Списки точек для трех графиков
PointPairList m1 = new PointPairList();
PointPairList m2 = new PointPairList();
PointPairList m3 = new PointPairList();
PointPairList a1 = new PointPairList();
PointPairList a2 = new PointPairList();
PointPairList a3 = new PointPairList();
PointPairList g1 = new PointPairList();
PointPairList g2 = new PointPairList();
PointPairList g3 = new PointPairList();
PointPairList dha1 = new PointPairList();
PointPairList dta1 = new PointPairList();
// Расстояние между соседними точками по горизонтали
const double dx = 1.0;
double curr_x = 0;
double curr_y = 0;
double curr_z = 0;
// Заполняем список точек
foreach (double val in _dataMagnetX)
{
m1.Add(curr_x, val);
curr_x += dx;
}
foreach (double val in _dataMagnetY)
{
m2.Add(curr_y, val);
curr_y += dx;
}
foreach (double val in _dataMagnetZ)
{
m3.Add(curr_z, val);
curr_z += dx;
}
curr_x = 0;
curr_y = 0;
curr_z = 0;
// Заполняем список точек
foreach (double val in _dataAccelX)
{
a1.Add(curr_x, val);
curr_x += dx;
}
foreach (double val in _dataAccelY)
{
a2.Add(curr_y, val);
curr_y += dx;
}
foreach (double val in _dataAccelZ)
{
a3.Add(curr_z, val);
curr_z += dx;
}
curr_x = 0;
curr_y = 0;
curr_z = 0;
// Заполняем список точек
foreach (double val in _dataGyroX)
{
g1.Add(curr_x, val);
curr_x += dx;
}
foreach (double val in _dataGyroY)
{
g2.Add(curr_y, val);
curr_y += dx;
}
foreach (double val in _dataGyroZ)
{
g3.Add(curr_z, val);
curr_z += dx;
}
curr_x = 0;
// Заполняем список точек
foreach (long val in _dataDHA)
{
dha1.Add(curr_x, val);
curr_x += dx;
}
curr_x = 0;
foreach (long val in _dataDTA)
{
dta1.Add(curr_x, val);
curr_x += dx;
}
// Удалим существующие оси Y
paneM.YAxisList.Clear();
paneA.YAxisList.Clear();
paneG.YAxisList.Clear();
paneDHA.YAxisList.Clear();
paneDTA.YAxisList.Clear();
// Создадим три новых оси Y
// Метод AddYAxis() возвращает индекс новой оси в списке осей (YAxisList)
int mX = paneM.AddYAxis("X axis, mgauss");
int mY = paneM.AddYAxis("Y axis, mgauss");
int mZ = paneM.AddYAxis("Z axis, mgauss");
int aX = paneA.AddYAxis("X axis, g");
int aY = paneA.AddYAxis("Y axis, g");
int aZ = paneA.AddYAxis("Z axis, g");
int gX = paneG.AddYAxis("X axis, dps");
int gY = paneG.AddYAxis("Y axis, dps");
int gZ = paneG.AddYAxis("Z axis, dps");
int dhaAxis = paneDHA.AddYAxis("Δ f, Hz");
int dtaAxis = paneDTA.AddYAxis("Δ t, °C");
LineItem magnetX = paneM.AddCurve("X axis", m1, Color.LightBlue, SymbolType.None);
LineItem magnetY = paneM.AddCurve("Y axis", m2, Color.YellowGreen, SymbolType.None);
LineItem magnetZ = paneM.AddCurve("Z axis", m3, Color.LightCoral, SymbolType.None);
LineItem accelX = paneA.AddCurve("X axis", a1, Color.LightBlue, SymbolType.None);
LineItem accelY = paneA.AddCurve("Y axis", a2, Color.YellowGreen, SymbolType.None);
LineItem accelZ = paneA.AddCurve("Z axis", a3, Color.LightCoral, SymbolType.None);
LineItem gyroX = paneG.AddCurve("X axis", g1, Color.LightBlue, SymbolType.None);
LineItem gyroY = paneG.AddCurve("Y axis", g2, Color.YellowGreen, SymbolType.None);
LineItem gyroZ = paneG.AddCurve("Z axis", g3, Color.LightCoral, SymbolType.None);
LineItem DHA = paneDHA.AddCurve("Δ f", dha1, Color.LightBlue, SymbolType.None);
LineItem DTA = paneDTA.AddCurve("Δ t", dta1, Color.LightBlue, SymbolType.None);
magnetX.Line.IsSmooth = true;
//magnetX.Line.Width = 2.0f;
magnetY.Line.IsSmooth = true;
magnetZ.Line.IsSmooth = true;
accelX.Line.IsSmooth = true;
accelY.Line.IsSmooth = true;
accelZ.Line.IsSmooth = true;
gyroX.Line.IsSmooth = true;
gyroY.Line.IsSmooth = true;
gyroZ.Line.IsSmooth = true;
DHA.Line.IsSmooth = true;
DTA.Line.IsSmooth = true;
// Для каждой кривой установим свои оси
magnetX.YAxisIndex = mX;
magnetY.YAxisIndex = mY;
magnetZ.YAxisIndex = mZ;
accelX.YAxisIndex = aX;
accelY.YAxisIndex = aY;
accelZ.YAxisIndex = aZ;
gyroX.YAxisIndex = gX;
gyroY.YAxisIndex = gY;
gyroZ.YAxisIndex = gZ;
DHA.YAxisIndex = dhaAxis;
DTA.YAxisIndex = dtaAxis;
// Для наглядности раскрасим надписи на оси Y в цвета графика,
// который рисуется с этой осью
paneM.YAxisList[mX].Title.FontSpec.FontColor = Color.LightBlue;
paneM.YAxisList[mY].Title.FontSpec.FontColor = Color.YellowGreen;
paneM.YAxisList[mZ].Title.FontSpec.FontColor = Color.LightCoral;
paneA.YAxisList[aX].Title.FontSpec.FontColor = Color.LightBlue;
paneA.YAxisList[aY].Title.FontSpec.FontColor = Color.YellowGreen;
paneA.YAxisList[aZ].Title.FontSpec.FontColor = Color.LightCoral;
paneG.YAxisList[gX].Title.FontSpec.FontColor = Color.LightBlue;
paneG.YAxisList[gY].Title.FontSpec.FontColor = Color.YellowGreen;
paneG.YAxisList[gZ].Title.FontSpec.FontColor = Color.LightCoral;
paneDHA.YAxisList[dhaAxis].Title.FontSpec.FontColor = Color.LightBlue;
paneDTA.YAxisList[dtaAxis].Title.FontSpec.FontColor = Color.LightBlue;
// Вызываем метод AxisChange (), чтобы обновить данные об осях.
// В противном случае на рисунке будет показана только часть графика,
// которая умещается в интервалы по осям, установленные по умолчанию
MGraph.AxisChange();
AGraph.AxisChange();
GGraph.AxisChange();
DHAGraph.AxisChange();
DTAGraph.AxisChange();
// Обновляем график
MGraph.Invalidate();
AGraph.Invalidate();
GGraph.Invalidate();
DHAGraph.Invalidate();
DTAGraph.Invalidate();
}
}
|
|