You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
6.1 KiB

3 years ago
#' Make a socket connection to a tCam device
#'
#' @param host,port IP/hostname + port; defaults to the device defaults
#' @export
tcam_connect <- function(host = "192.168.4.1", port = 5001) {
socketConnection(
host = host,
port = port,
open = "a+b"
)
}
#' Returns a packet with camera status.
#'
#' @param con open socket connection from [tcam_connect()]
#' @export
get_status <- function(con) {
writeBin(
object = c(as.raw(0x02), charToRaw('{"cmd":"get_status"}'), as.raw(0x03)),
con = con,
useBytes = TRUE
) -> res
Sys.sleep(0.5)
readBin(
con = con,
what = "raw",
n = 2048L
) %>%
rawToChar() %>%
stri_replace_all_regex("\002|\003", "") %>%
fparse()
}
#' Returns a packet with the camera's current settings.
#'
#' @param con open socket connection from [tcam_connect()]
#' @export
get_config <- function(con) {
writeBin(
object = c(as.raw(0x02), charToRaw('{"cmd":"get_config"}'), as.raw(0x03)),
con = con,
useBytes = TRUE
) -> res
Sys.sleep(0.5)
readBin(
con = con,
what = "raw",
n = 2048L
) %>%
rawToChar() %>%
stri_replace_all_regex("\002|\003", "") %>%
fparse()
}
#' Reads and returns specified data from the Lepton's CCI interface.
#'
#' @param con open socket connection from [tcam_connect()]
#' @param command decimal representation of the 16-bit Lepton `COMMAND` register
#' value. For example, the value `20172` above is `0x4ECC` (RAD Spotmeter
#' Region of Interest).
#' @param length decimal number of 16-bit words to read (`1-512`).
#' @references [FLIR LEPTON Software Interface Description Document (IDD)](https://www.flir.com/globalassets/imported-assets/document/flir-lepton-software-interface-description-document.pdf)
#' @export
get_lep_cci <- function(con, command, length) {
stopifnot(((length >= 1) && (length <= 512)))
list(
cmd = "get_lep_cci",
args = list(
command = as.integer(command),
length = as.integer(length)
)
) %>%
jsonlite::toJSON(auto_unbox = TRUE) -> cmd
Sys.sleep(0.5)
tmp <- get_status(con)
Sys.sleep(0.5)
writeBin(
object = c(as.raw(0x02), charToRaw(cmd), as.raw(0x03)),
3 years ago
con = con,
useBytes = TRUE
) -> res
Sys.sleep(0.5)
readBin(
con = con,
what = "raw",
n = 2048L
3 years ago
) %>%
rawToChar() %>%
3 years ago
stri_replace_all_regex("\002|\003", "") %>%
fparse()
}
#' Set the camera's clock.
#'
#' @param con open socket connection from [tcam_connect()]
#' @param time `Date` or `POSIXct` object or a character string that
#' can be coerced to one; defaults to "now".
#' @export
set_time <- function(con, time = Sys.time()) {
Sys.sleep(0.5)
tmp <- get_status(con)
Sys.sleep(0.5)
time <- as.POSIXlt(as.POSIXct(time[1]))
list(
cmd = "set_time",
args = list(
sec = as.integer(time$sec),
min = time$min,
hour = time$hour,
dow = time$wday + 1L,
day = time$mday,
mon = time$mon + 1L,
year = time$year + 1900L - 1970L
)
) %>%
jsonlite::toJSON(auto_unbox = TRUE) -> cmd
writeBin(
object = c(as.raw(0x02), charToRaw(cmd), as.raw(0x03)),
con = con,
useBytes = TRUE
) -> res
Sys.sleep(0.5)
readBin(
con = con,
what = "raw",
n = 2048L
) %>%
rawToChar() %>%
stri_replace_all_regex("\002|\003", "") %>%
fparse()
}
# #' Set the camera's Wi-Fi and network configuration.
# #'
# #' The Wi-Fi subsystem is immediately restarted. Which means
# #' `con` is no longer valid and will need to be re-opened. Leave paramaters
# #' as `NULL` if you do not want to change those settings on the tCam.
# #'
# #' @param con open socket connection from [tcam_connect()]
# #' @param ap_ssid Set the AP-mode SSID and also the camera name as reported in the metadata and status objects.
# #' @param ap_pw Set the AP-mode password.
# #' @param ap_ip_addr The camera's IP address when it is in AP mode.
# #' @param flags Set WiFi configuration (see below).
# #' @param sta_ssid Set the client-mode (STA) SSID.
# #' @param sta_pw Set the client-mode (STA) password.
# #' @param sta_ip_addr Set the static IP address to use when the camera as a client and configured to use a static IP.
# #' @param sta_netmask Set the netmask to use when the camera as a client and configured to use a static IP.
# #' @export
# set_wifi <- function(con, ap_ssid = NULL, ap_pw = NULL, ap_ip_addr = NULL,
# flags = NULL,
# sta_ssid = NULL, sta_pw = NULL, sta_ip_addr = NULL, sta_netmask = NULL) {
#
# list(
# ap_ssid = ap_ssid,
# ap_pw = ap_pw,
# ap_ip_addr = ap_ip_addr,
# flags = flags,
# sta_ssid = sta_ssid,
# sta_pw = sta_pw,
# sta_ip_addr = sta_ip_addr,
# sta_netmask = sta_netmask
# )
#
# writeBin(
# object = c(as.raw(0x02), charToRaw('{"cmd":"get_status"}'), as.raw(0x03)),
# con = con,
# useBytes = TRUE
# ) -> res
#
# Sys.sleep(0.5)
#
# readChar(
# con = con,
# nchars = 2048L,
# useBytes = TRUE
# ) %>%
# stri_replace_all_regex("\002|\003", "") %>%
# fparse()
#
# }
3 years ago
#' Returns a packet with metadata, radiometric (or AGC) image data and Lepton telemetry objects.
#'
#' @param con open socket connection from [tcam_connect()]
#' @export
get_image <- function(con) {
Sys.sleep(0.5)
3 years ago
tmp <- get_status(con)
Sys.sleep(0.5)
3 years ago
writeBin(
object = c(as.raw(0x02), charToRaw('{"cmd":"get_image"}'), as.raw(0x03)),
con = con,
useBytes = TRUE
) -> res
Sys.sleep(1)
readBin(
con = con,
what = "raw",
n = 65536L
) %>%
rawToChar() %>%
stri_replace_all_regex("\002|\003", "") %>%
fparse()
}
#' Returns a packet with the camera's current WiFi and Network configuration.
#'
#' @param con open socket connection from [tcam_connect()]
#' @export
get_wifi <- function(con) {
Sys.sleep(0.5)
tmp <- get_status(con)
3 years ago
Sys.sleep(0.5)
writeBin(
object = c(as.raw(0x02), charToRaw('{"cmd":"get_wifi"}'), as.raw(0x03)),
3 years ago
con = con,
useBytes = TRUE
) -> res
Sys.sleep(0.5)
readBin(
con = con,
what = "raw",
n = 5120L
3 years ago
) %>%
rawToChar() %>%
3 years ago
stri_replace_all_regex("\002|\003", "") %>%
fparse()
}