1package onelead
2
3import (
4 "image/color"
5 "math"
6 "odoki-firmware/constants"
7 "odoki-firmware/ecg"
8 "odoki-firmware/utils"
9
10 "tinygo.org/x/drivers/st7789"
11 "tinygo.org/x/tinyfont"
12 "tinygo.org/x/tinyfont/freemono"
13)
14
15var SelectedLead = 1
16var LeadNames = []string{"I", "II", "III"}
17var LastDrawnIndex int16
18
19var DisplayBufferMinMaxes [constants.ChannelCount][2]int32
20
21const PlotHeight = (constants.DisplayHeight - constants.LineHeight*2 - constants.Padding*2)
22
23func DrawPair(display st7789.Device, x, start, end int16) {
24 min := min(start, end)
25 max := max(start, end)
26 display.FillRectangle(constants.Padding+x, constants.Padding+constants.LineHeight*2, 1, PlotHeight, color.RGBA{0, 0, 0, 255})
27 display.FillRectangle(constants.Padding+x, constants.Padding+constants.LineHeight*2+PlotHeight-max, 1, max-min+1, color.RGBA{255, 255, 255, 255})
28}
29
30func IndexToY(index int16) int16 {
31 if DisplayBufferMinMaxes[SelectedLead][0] == DisplayBufferMinMaxes[SelectedLead][1] {
32 return int16(math.Round(0.5 * float64(PlotHeight-1)))
33 }
34 return int16(float64(PlotHeight-1) * utils.RemapInt32FromRange(int(DisplayBufferMinMaxes[SelectedLead][0]), int(DisplayBufferMinMaxes[SelectedLead][1]), ecg.DisplayBuffers[SelectedLead][index]))
35}
36
37func Draw(VoidDisplayed bool, display st7789.Device) bool {
38 if VoidDisplayed {
39 display.FillScreen(color.RGBA{0, 0, 0, 255})
40 tinyfont.WriteLine(&display, &freemono.Bold9pt7b, constants.Padding, constants.Padding+constants.LineHeight, "ECG "+LeadNames[SelectedLead], color.RGBA{255, 255, 255, 255})
41 display.FillRectangle(constants.Padding, constants.Padding+constants.LineHeight*2, constants.DisplayECGBufferSize, PlotHeight, color.RGBA{0, 0, 0, 255})
42 DrawPair(display, constants.Padding, IndexToY(constants.DisplayECGBufferSize-2), IndexToY(constants.DisplayECGBufferSize-1))
43 DrawPair(display, constants.Padding+1, IndexToY(constants.DisplayECGBufferSize-1), IndexToY(0))
44 for i := 2; i < int(constants.DisplayECGBufferSize); i++ {
45 DrawPair(display, int16(i)+constants.Padding, IndexToY(int16(i)-2), IndexToY(int16(i)-1))
46 }
47 }
48 if LastDrawnIndex != ecg.DisplayBufferIndex {
49 DisplayBufferMinMaxes[SelectedLead][0], DisplayBufferMinMaxes[SelectedLead][1] = utils.MinMaxInt32(ecg.DisplayBuffers[SelectedLead][:])
50 lastDisplayBufferIndex := (ecg.DisplayBufferIndex - 1)
51 if lastDisplayBufferIndex == -1 {
52 lastDisplayBufferIndex = constants.DisplayECGBufferSize - 1
53 }
54 beforeLastDisplayBufferIndex := (ecg.DisplayBufferIndex - 2)
55 if beforeLastDisplayBufferIndex < 0 {
56 beforeLastDisplayBufferIndex = constants.DisplayECGBufferSize + beforeLastDisplayBufferIndex
57 }
58 DrawPair(display, ecg.DisplayBufferIndex, IndexToY(beforeLastDisplayBufferIndex), IndexToY(lastDisplayBufferIndex))
59 LastDrawnIndex = ecg.DisplayBufferIndex
60 }
61
62 return false
63}