aboutsummaryrefslogtreecommitdiff
path: root/samples/terminal-stream/src/main/scala/akka/serial/samples/terminalstream/Main.scala
blob: de626a306b55baf6ab22c6eb366421a7b0cacad5 (plain) (blame)
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
package akka.serial
package samples.terminalstream

import scala.concurrent.Future
import scala.concurrent.duration._
import scala.io.StdIn

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Flow, Keep, Sink, Source}
import akka.util.ByteString

import stream.Serial

object Main {

  final val Delay = FiniteDuration(500, MILLISECONDS)

  implicit val system = ActorSystem("terminal-stream")
  implicit val materializer = ActorMaterializer()

  def ask(label: String, default: String) = {
    print(label + " [" + default.toString + "]: ")
    val in = StdIn.readLine()
    println("")
    if (in.isEmpty) default else in
  }

  def main(args: Array[String]): Unit = {
    import system.dispatcher

    val port = ask("Device", "/dev/ttyACM0")
    val baud = ask("Baud rate", "115200").toInt
    val cs = ask("Char size", "8").toInt
    val tsb = ask("Use two stop bits", "false").toBoolean
    val parity = Parity(ask("Parity (0=None, 1=Odd, 2=Even)", "0").toInt)
    val settings = SerialSettings(baud, cs, tsb, parity)

    val serial: Flow[ByteString, ByteString, Future[Serial.Connection]] =
      Serial().open(port, settings)

    val printer: Sink[ByteString, _] = Sink.foreach[ByteString]{data =>
      println("server says: " + data.decodeString("UTF-8"))
    }

    val ticker: Source[ByteString, _] = Source.tick(Delay, Delay, ()).scan(0){case (x, _) =>
      x + 1
    }.map{ x =>
      println(x)
      ByteString(x.toString)
    }

    val connection: Future[Serial.Connection] = ticker.viaMat(serial)(Keep.right).to(printer).run()

    connection map { conn =>
      println("Connected to " + conn.port)
      StdIn.readLine("Press enter to exit")
    } recover { case err =>
      println("Cannot connect: " + err)
    } andThen { case _ =>
      system.terminate()
    }

  }

}