Added read.
This commit is contained in:
		| @@ -6,6 +6,8 @@ import ( | |||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/CGSG-2021-AE4/modem-test/api/modem/at" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type GpsData struct { | type GpsData struct { | ||||||
| @@ -75,3 +77,61 @@ func (gps *GpsData) decode(str string) error { | |||||||
| 	*gps = newGpsInfo | 	*gps = newGpsInfo | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (gps *GpsData) Update(port at.Port) error { | ||||||
|  | 	if err := switchGpsMode(port, true); err != nil { | ||||||
|  | 		return fmt.Errorf("try to GPS mode: %w", err) | ||||||
|  | 	} | ||||||
|  | 	defer switchGpsMode(port, false) | ||||||
|  |  | ||||||
|  | 	resp, err := port.Send("AT+CGPSINFO") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("receive GPS data: %w", err) | ||||||
|  | 	} | ||||||
|  | 	if !resp.Check() { | ||||||
|  | 		return fmt.Errorf("error response") | ||||||
|  | 	} | ||||||
|  | 	if err := gps.decode(strings.Split(strings.Replace(resp.RmFront("+CGPSINFO:").String(), "\r", "", -1), "\n")[0]); err != nil { | ||||||
|  | 		return fmt.Errorf("decode: %w", err) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func switchGpsMode(port at.Port, on bool) error { | ||||||
|  | 	onStr := "0" | ||||||
|  | 	if on { | ||||||
|  | 		onStr = "1" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Reset input | ||||||
|  | 	if err := port.GetSerialPort().ResetInputBuffer(); err != nil { | ||||||
|  | 		return fmt.Errorf("reset input buffer: %w", err) | ||||||
|  | 	} | ||||||
|  | 	// Reset output | ||||||
|  | 	if err := port.GetSerialPort().ResetOutputBuffer(); err != nil { | ||||||
|  | 		return fmt.Errorf("reset output buffer: %w", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Check gps mode status | ||||||
|  | 	resp, err := port.Send("AT+CGPS?") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("make at ask: %w", err) | ||||||
|  | 	} | ||||||
|  | 	if !resp.Check() { | ||||||
|  | 		return fmt.Errorf("error response") | ||||||
|  | 	} | ||||||
|  | 	ans := strings.Replace(strings.Split(strings.Split(resp.RmFront("+CGPS:").String(), "\n")[0], ",")[0], " ", "", -1) | ||||||
|  | 	if ans == onStr { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Modem is not in GPS mode | ||||||
|  | 	resp, err = port.Send("AT+CGPS=" + onStr) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("try to switch to gps: %w", err) | ||||||
|  | 	} | ||||||
|  | 	if !resp.Check() { | ||||||
|  | 		return fmt.Errorf("switch tp GPS failed") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|   | |||||||
| @@ -52,8 +52,9 @@ type Modem interface { | |||||||
| 	Update() error | 	Update() error | ||||||
| 	GetInfo() ModemData | 	GetInfo() ModemData | ||||||
|  |  | ||||||
| 	// Temp access to sms interface | 	// Temp access to SMS and AT interface | ||||||
| 	Sms() sms.Dialer | 	Sms() sms.Dialer | ||||||
|  | 	At() at.Port | ||||||
|  |  | ||||||
| 	io.Closer | 	io.Closer | ||||||
| } | } | ||||||
| @@ -173,6 +174,10 @@ func (m *modem) Sms() sms.Dialer { | |||||||
| 	return m.sms | 	return m.sms | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (m *modem) At() at.Port { | ||||||
|  | 	return m.port | ||||||
|  | } | ||||||
|  |  | ||||||
| func (m *modem) Close() error { | func (m *modem) Close() error { | ||||||
| 	if err := m.sms.Close(); err != nil { | 	if err := m.sms.Close(); err != nil { | ||||||
| 		return fmt.Errorf("sms: %w", err) | 		return fmt.Errorf("sms: %w", err) | ||||||
| @@ -216,10 +221,6 @@ func (m *modem) isConnected() bool { | |||||||
| func (m *modem) testGPS() error { | func (m *modem) testGPS() error { | ||||||
| 	m.logger.Println("Testing GPS") | 	m.logger.Println("Testing GPS") | ||||||
|  |  | ||||||
| 	if err := m.switchToGpsMode(); err != nil { |  | ||||||
| 		return fmt.Errorf("switch to GPS: %w", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err := m.Update(); err != nil { | 	if err := m.Update(); err != nil { | ||||||
| 		return fmt.Errorf("update: %w", err) | 		return fmt.Errorf("update: %w", err) | ||||||
| 	} | 	} | ||||||
| @@ -238,7 +239,6 @@ func (m *modem) saveGPS(path string) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("open file: %w", err) | 		return fmt.Errorf("open file: %w", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	defer f.Close() | 	defer f.Close() | ||||||
|  |  | ||||||
| 	if _, err = f.WriteString(m.getShortInfo()); err != nil { | 	if _, err = f.WriteString(m.getShortInfo()); err != nil { | ||||||
| @@ -246,6 +246,7 @@ func (m *modem) saveGPS(path string) error { | |||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (m *modem) testConsole() { | func (m *modem) testConsole() { | ||||||
| 	for { | 	for { | ||||||
| 		var inStr string | 		var inStr string | ||||||
| @@ -361,44 +362,6 @@ func (m *modem) ping() error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (m *modem) switchToGpsMode() error { |  | ||||||
| 	m.logger.Println("Enabling GPS mode...") |  | ||||||
| 	// Reset input |  | ||||||
| 	if err := m.port.GetSerialPort().ResetInputBuffer(); err != nil { |  | ||||||
| 		return fmt.Errorf("reset input buffer: %w", err) |  | ||||||
| 	} |  | ||||||
| 	// Reset output |  | ||||||
| 	if err := m.port.GetSerialPort().ResetOutputBuffer(); err != nil { |  | ||||||
| 		return fmt.Errorf("reset output buffer: %w", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Check gps mode status |  | ||||||
| 	resp, err := m.port.Send("AT+CGPS?") |  | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("make at ask: %w", err) |  | ||||||
| 	} |  | ||||||
| 	if !resp.Check() { |  | ||||||
| 		return fmt.Errorf("error response") |  | ||||||
| 	} |  | ||||||
| 	ans := strings.Replace(strings.Split(strings.Split(resp.RmFront("+CGPS:").String(), "\n")[0], ",")[0], " ", "", -1) |  | ||||||
| 	if ans == "1" { |  | ||||||
| 		m.logger.Println("GPS already enabled") |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 	m.logger.Println(ans) |  | ||||||
|  |  | ||||||
| 	// Modem is not in GPS mode |  | ||||||
| 	resp, err = m.port.Send("AT+CGPS=1") |  | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("try to switch to gps: %w", err) |  | ||||||
| 	} |  | ||||||
| 	if !resp.Check() { |  | ||||||
| 		return fmt.Errorf("switch tp GPS failed") |  | ||||||
| 	} |  | ||||||
| 	m.logger.Println("GPS mode enabled") |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func getTtyDevices() ([]string, error) { | func getTtyDevices() ([]string, error) { | ||||||
| 	// Get ports | 	// Get ports | ||||||
| 	/**/ | 	/**/ | ||||||
|   | |||||||
| @@ -44,8 +44,8 @@ func (d *dialer) Init() error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (d *dialer) Send(number, msg string) error { | func (d *dialer) Send(number, msg string) error { | ||||||
| 	d.port.Send(fmt.Sprintf("AT+CMGS=\"%s\"", number)) // Because it will throw error | 	d.port.Send(fmt.Sprintf("AT+CMGS=\"%s\"", number))      // Because it will throw error | ||||||
| 	resp, err := d.port.RawSend(fmt.Sprintf("%s\x1A", msg)); // Add additional \r\n because there is not supposed to be | 	resp, err := d.port.RawSend(fmt.Sprintf("%s\x1A", msg)) // Add additional \r\n because there is not supposed to be | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("message request: %w", err) | 		return fmt.Errorf("message request: %w", err) | ||||||
| 	} | 	} | ||||||
| @@ -66,7 +66,18 @@ func (d *dialer) ReadNew() ([]string, error) { | |||||||
| 		return nil, fmt.Errorf("AT+CMGL request: %w", err) | 		return nil, fmt.Errorf("AT+CMGL request: %w", err) | ||||||
| 	} | 	} | ||||||
| 	msgs := strings.Split(strings.Replace(string(resp), "\r", "", -1), "\n") | 	msgs := strings.Split(strings.Replace(string(resp), "\r", "", -1), "\n") | ||||||
| 	return msgs, nil // TODO |  | ||||||
|  | 	outMsgs := make([]string, 0) | ||||||
|  | 	for _, s := range msgs { | ||||||
|  | 		if len(s) >= len("+CMGL:") && s[:len("+CMGL:")] == "+CMGL:" { | ||||||
|  | 			params := strings.Split(s[len("+CMGL:"):], ",") | ||||||
|  | 			d.logger.Println("GET MSG:", params) | ||||||
|  | 		} else { | ||||||
|  | 			outMsgs = append(outMsgs, s) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return outMsgs, nil // TODO | ||||||
| } | } | ||||||
|  |  | ||||||
| func (d *dialer) Close() error { | func (d *dialer) Close() error { | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								main.go
									
									
									
									
									
								
							| @@ -29,8 +29,15 @@ func mainE() error { | |||||||
| 	log.Println(m.GetInfo()) | 	log.Println(m.GetInfo()) | ||||||
|  |  | ||||||
| 	log.Println("||||||||||||||||| SEND SMS |||||||||||||||||") | 	log.Println("||||||||||||||||| SEND SMS |||||||||||||||||") | ||||||
| 	if err := m.Sms().Send("+79218937173", "CGSG forever"); err != nil { | 	log.Println(m.At().Send("AT+CNUM")) | ||||||
|  | 	// if err := m.Sms().Send("+79218937173", "CGSG forever"); err != nil { | ||||||
|  | 	// 	return err | ||||||
|  | 	// } | ||||||
|  | 	if ms, err := m.Sms().ReadNew(); err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | 	} else { | ||||||
|  | 		log.Println("NEW:", ms) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user