|
|
|
#' 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)),
|
|
|
|
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 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()
|
|
|
|
#
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
|
|
#' 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)
|
|
|
|
|
|
|
|
tmp <- get_status(con)
|
|
|
|
|
|
|
|
Sys.sleep(0.5)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
Sys.sleep(0.5)
|
|
|
|
|
|
|
|
writeBin(
|
|
|
|
object = c(as.raw(0x02), charToRaw('{"cmd":"get_wifi"}'), as.raw(0x03)),
|
|
|
|
con = con,
|
|
|
|
useBytes = TRUE
|
|
|
|
) -> res
|
|
|
|
|
|
|
|
Sys.sleep(0.5)
|
|
|
|
|
|
|
|
readBin(
|
|
|
|
con = con,
|
|
|
|
what = "raw",
|
|
|
|
n = 5120L
|
|
|
|
) %>%
|
|
|
|
rawToChar() %>%
|
|
|
|
stri_replace_all_regex("\002|\003", "") %>%
|
|
|
|
fparse()
|
|
|
|
|
|
|
|
}
|