iot-firebase/IoT-iOS/Firebase test/HomeViewController.swift
2020-10-05 10:08:16 +01:00

175 lines
5.8 KiB
Swift

//
// HomeViewController.swift
// Firebase test
//
// Created by Max Hunt on 06/05/2020.
// Copyright © 2020 smt. All rights reserved.
//
import UIKit
import FirebaseAuth
import SwiftyJSON
class HomeViewController: UIViewController {
@IBOutlet weak var welcomeLbl: UILabel!
@IBOutlet weak var onSwitch: UISwitch!
@IBOutlet weak var bSlider: UISlider!
@IBOutlet weak var errorLbl: UILabel!
@IBOutlet weak var colourOutput: UIView!
@IBOutlet weak var colorWheel: ColorWheel!
@IBOutlet weak var cSlider: UISlider!
var pColour = "000000"
var continousReq = false
var timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
welcomeLbl.text = "Welcome, " + (Auth.auth().currentUser?.email)!
// Do any additional setup after loading the view.
}
func apiCall(endpoint: String, data: [String : Any]){
let parameters = data
let url = URL(string: endpoint)! //change the url
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST" //set http method as POST
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
} catch let error {
print(error.localizedDescription)
}
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
//create dataTask using the session object to send data to the server
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
return
}
guard let data = data else {
return
}
do {
let responseJSON = try? JSON(data: data)
let status = responseJSON?["success"].stringValue
if status != "true"{
let err = responseJSON?["error"].stringValue
DispatchQueue.main.async {
self.errorLbl.isHidden = false
self.errorLbl.text = err
}
}
}
})
task.resume()
}
func sendUpdate() {
let state = String(self.onSwitch.isOn)
let brightness = Int(self.bSlider.value)
let colour = Int(self.cSlider.value)
Auth.auth().currentUser?.getIDToken(completion: { (idToken, err) in
if err == nil, let token = idToken {
let parameters = ["state": state, "brightness":brightness, "color":colour, "authToken":token] as [String : Any]
let endpoint = "http://192.168.1.65:5050/zlight"
self.apiCall(endpoint: endpoint, data: parameters)
}else{
self.errorLbl.text = err?.localizedDescription
self.errorLbl.isHidden = false
}
})
}
func u2h(colour:UIColor) -> String {
guard let components = colour.cgColor.components, components.count >= 3 else {
return "XERROR"
}
let r = Float(components[0])
let g = Float(components[1])
let b = Float(components[2])
return String(format: "%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255))
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
@IBAction func switchToggled(_ sender: Any) {
print("editing ended, state: ", onSwitch.isOn)
sendUpdate()
}
@IBAction func bChanged1(_ sender: Any) {
print("editing ended, value: ", bSlider.value)
sendUpdate()
}
@IBAction func bChanged2(_ sender: Any) {
print("editing ended, value: ", bSlider.value)
sendUpdate()
}
@IBAction func bChanged3(_ sender: Any) {
if (self.continousReq) {
sendUpdate()
}
}
@IBAction func cC1(_ sender: Any) {
sendUpdate()
}
@IBAction func cC2(_ sender: Any) {
sendUpdate()
}
@IBAction func handleTapGesture(_ sender: UITapGestureRecognizer) {
let point = sender.location(in: colorWheel)
let colour = colorWheel.colorAtPoint(point: point)
colourOutput.backgroundColor = colour
self.pColour = u2h(colour: colour)
}
@IBAction func handleDragGesture(_ sender: UIPanGestureRecognizer) {
let point = sender.location(in: colorWheel)
let colour = colorWheel.colorAtPoint(point: point)
colourOutput.backgroundColor = colour
self.pColour = u2h(colour: colour)
if (self.continousReq) {
sendUpdate()
}
}
@IBAction func cPreviewTap(_ sender: Any) {
sendUpdate()
}
@IBAction func throttleToggled(_ sender: UISwitch) {
self.continousReq = sender.isOn
}
}
extension UIColor {
convenience init(hexString: String, alpha: CGFloat = 1.0) {
let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
let scanner = Scanner(string: hexString)
var color: UInt64 = 0
scanner.scanHexInt64(&color)
let mask = 0x000000FF
let r = Int(color >> 16) & mask
let g = Int(color >> 8) & mask
let b = Int(color) & mask
let red = CGFloat(r) / 255.0
let green = CGFloat(g) / 255.0
let blue = CGFloat(b) / 255.0
self.init(red:red, green:green, blue:blue, alpha:alpha)
}
}