func updateBarsWin(msg currentBars, barsWin *gc.Window, colors colorsDefined, scale int64) { whiteOnBlack := colors.whiteOnBlack redOnBlack := colors.redOnBlack greenOnBlack := colors.greenOnBlack barsWin.Erase() barsWin.Box(0, 0) edibleCopy := make([]int64, len(msg.cols)) copy(edibleCopy, msg.cols) barsHeight, barsWidth := barsWin.MaxYX() startI := len(edibleCopy) - barsWidth if startI < 0 { startI = 0 } currentSec := time.Now().Second() prevSec := currentSec - 1 if prevSec < 0 { prevSec = 59 } for row := 0; row < barsHeight-2; row++ { for col := range edibleCopy[startI:len(edibleCopy)] { if edibleCopy[col]/scale > 0 { turnOffColor := int16(0) currChar := "=" // row is an int--32-bit, right? if shouldShowFail(msg.failCols[col], scale, row) { barsWin.ColorOff(whiteOnBlack) barsWin.ColorOn(redOnBlack) currChar = "x" turnOffColor = redOnBlack } else if col == currentSec || col == currentSec-1 { // current second is still in progress, so make the previous second // green too--not precisely correct, but close enough here barsWin.ColorOff(whiteOnBlack) barsWin.ColorOn(greenOnBlack) turnOffColor = greenOnBlack } barsWin.MovePrint(barsHeight-2-row, col+1, currChar) if turnOffColor != 0 { barsWin.ColorOff(turnOffColor) barsWin.ColorOn(whiteOnBlack) } edibleCopy[col] = edibleCopy[col] - scale } } } barsWin.NoutRefresh() }
func updateMsgWin(msg ncursesMsg, msgWin *gc.Window, workerCountWin *gc.Window) { var row int if msg.msgType == MSG_TYPE_RESULT { row = 1 } else if msg.msgType == MSG_TYPE_INFO { row = 2 } else { row = 3 } msgWin.MovePrint(row, 1, fmt.Sprintf("%-40s", msg.msgStr)) msgWin.Box(0, 0) msgWin.NoutRefresh() if msg.currentCount >= 0 { workerCountWin.MovePrint(1, 1, fmt.Sprintf("%5d", msg.currentCount)) workerCountWin.NoutRefresh() } }
func drawDisplay( stdscr *gc.Window, ) ( msgWin *gc.Window, workerCountWin *gc.Window, durWin *gc.Window, reqSecWin *gc.Window, barsWin *gc.Window, scaleWin *gc.Window, maxWin *gc.Window, ) { // print startup message stdscr.Print("Press 'q' to exit") stdscr.NoutRefresh() // Create message window // and enable the use of the // keypad on it so the arrow keys are available msgHeight, msgWidth := 5, 40 msgY, msgX := 1, 0 msgWin = createWindow(msgHeight, msgWidth, msgY, msgX) msgWin.Keypad(true) msgWin.Box(0, 0) msgWin.NoutRefresh() // Create the counter window, showing how many goroutines are active ctrHeight, ctrWidth := 3, 7 ctrY := 2 ctrX := msgWidth + 1 stdscr.MovePrint(1, ctrX+1, "thrds") stdscr.NoutRefresh() workerCountWin = createWindow(ctrHeight, ctrWidth, ctrY, ctrX) workerCountWin.Box(0, 0) workerCountWin.NoutRefresh() // Create the avg duration window, showing 5 second moving average durHeight, durWidth := 4, 14 durY := 2 durX := ctrX + ctrWidth + 1 stdscr.MovePrint(1, durX+1, "duration ms") stdscr.NoutRefresh() durWin = createWindow(durHeight, durWidth, durY, durX) durWin.Box(0, 0) durWin.NoutRefresh() // Create the requests/sec window, reqSecHeight, reqSecWidth := 3, 16 reqSecY := 2 reqSecX := durX + durWidth + 1 stdscr.MovePrint(1, reqSecX+1, "req/s 1/5/60") stdscr.NoutRefresh() reqSecWin = createWindow(reqSecHeight, reqSecWidth, reqSecY, reqSecX) reqSecWin.Box(0, 0) reqSecWin.NoutRefresh() // Create the bars window, showing the moving display of bars secondsPerMinute := 60 barsWidth := secondsPerMinute + 3 // we wrap after a minute barsHeight := 25 // need to size this dynamically, TBD barsY := msgHeight + 1 barsX := 9 // leave space for scale window barsWin = createWindow(barsHeight, barsWidth, barsY, barsX) barsWin.Box(0, 0) barsWin.NoutRefresh() // Max window, showing the max seen over the last 60 seconds maxWidth := 7 maxHeight := 3 maxY := barsY + barsHeight - 8 maxX := 1 stdscr.MovePrint(maxY, 1, "max:") stdscr.NoutRefresh() maxY += 1 maxWin = createWindow(maxHeight, maxWidth, maxY, maxX) maxWin.Box(0, 0) maxWin.NoutRefresh() // Scale window, showing our current scaling factor for the bars display scaleWidth := 7 scaleHeight := 3 scaleY := barsY + barsHeight - 4 scaleX := 1 stdscr.MovePrint(scaleY, 1, "scale:") stdscr.NoutRefresh() scaleY += 1 scaleWin = createWindow(scaleHeight, scaleWidth, scaleY, scaleX) scaleWin.Box(0, 0) scaleWin.MovePrint(1, 1, fmt.Sprintf("%5s", "1")) scaleWin.NoutRefresh() // Update will flush only the characters which have changed between the // physical screen and the virtual screen, minimizing the number of // characters which must be sent gc.Update() return }